我创建了一段使用CSV文件的代码,该文件被导入到项目文件夹中,以便它可以显示每个数据点的标记,同时创建标记簇和层.

我的代码运行得很好,但我的老板希望我添加一个函数,这样他就可以自己在界面上添加CSV文件.

我想出了另一个代码,这样他就可以添加CSV文件并显示标记,但我不知道如何将其应用于我已经拥有的代码,以便层和标记子组仍然有效.

以下是我的原始代码,运行得很好,我想保留它,只是添加了CSV文件上传功能:

    var engineerLayers = {}; // Create an object to hold the engineer marker cluster groups

    //this retrieves the file
    $.get('\practice.csv', function (csvString) {
      var data = Papa.parse(csvString, {
        header: true,
        dynamicTyping: true
      }).data;
      var parentGroup = L.markerClusterGroup();

      for (var i in data) {
        var row = data[i];
        var engineer = row.Engineer;

        if (!(engineer in engineerLayers)) {
          // Each overlay that should actually be a part of MCG
          // should be made as a Subgroup, with the MCG as their parent
          engineerLayers[engineer] = L.featureGroup.subGroup(parentGroup, []);
          controlLayers.addOverlay(engineerLayers[engineer], engineer);
        }

        var marker = L.circleMarker([row.Latitude, row.Longitude], {
          radius: 10,
          stroke: true,
          color: getColor(engineer),
          opacity: 1,
          weight: 1,
          fill: true,
          fillColor: getColor(engineer),
          fillOpacity: 0.5
        }).bindPopup('Plan File: ' + row.PFN + '</br>' + 'Engineer: ' + row.Engineer + '</br>' + ' Date Received: ' + row.Date_Received + '</br>' + 'Status: ' + row.Status);

        // Add the marker only to its overlay
        marker.addTo(engineerLayers[engineer]);
      }

      map.addLayer(parentGroup);
      controlLayers.addTo(map);
    });

    // Must change these if engineers ever change
    function getColor(engineer) {
      switch (engineer) {
        case 'Mike':
          return 'green';
        case 'Salar':
          return 'blue';
        case 'Diego':
          return 'purple';
        case 'Saul':
          return 'orange';
        case 'Chan':
          return 'red';
        default:
          return 'black';
      }
    }

下面是我编写的代码,允许用户上传CSV文件,然后打印数据:

    // Listen for file upload changes
    $('#csvFileUpload').change(function (e) {
      var file = e.target.files[0];
      var reader = new FileReader();

      // Read file contents
      reader.onload = function (e) {
        var csv = e.target.result;
        var markers = parseCSV(csv);

        // Add markers to the map
        markers.forEach(function (marker) {
          L.marker([marker.Latitude, marker.Longitude]).addTo(map)
            .bindPopup(marker.title);
        });
      };

      reader.readAsText(file);
    });

    // Parse CSV data into an array of objects
    function parseCSV(csv) {
      var lines = csv.split("\n");
      var result = [];
      var headers = lines[0].split(",");

      // Iterate through each line (excluding header) and create marker objects
      for (var i = 1; i < lines.length; i++) {
        var obj = {};
        var currentLine = lines[i].split(",");

        // Populate marker object with latitude, longitude, and title
        for (var j = 0; j < headers.length; j++) {
          obj[headers[j]] = currentLine[j];
        }

        result.push(obj);
      }

      return result;
    }

以下是我练习的几句话.csv:

PFN,Latitude,Longitude,Date_Received,District,Engineer,Status
0001-23-765-3000W,34.04395483,-118.1481822,1/23/2023,LA,Mike,Active
0002-23-3000W,34.04447045,-118.1509931,5/28/2003,Pomona,Salar,Not Active
0003-23NC,34.04271911,-118.1468947,9/30/1983,LA,Saul,Active
004-23-404-406,34.04264799,-118.1487937,2/2/1964,Pomona,Diego,Not Active
406,34.04210569,-118.1501992,6/6/1944,LA,Mike,Active
1249-23NC,34.0901146,-118.1486999,10/9/1924,Pomona,Salar,Not Active
1250-23NC,34.08822204,-118.151189,2/11/1905,LA,Saul,Active

UPDATE: My code now works great thanks to Ghybs answer, but for whatever reason, my code keeps creating a layer called undefined. I noticed in my previous code that an undefined layer would be created if a file with extra line spaces were included. Is there anyway to get rid of this so that the code is only reading the file with words on it rather then the extra space at the end? Here's what it looks like: enter image description here

我只是在函数中添加了以下几行,它停止读取最后一行:

    // Read file contents
  reader.onload = function (e) {
    var csv = e.target.result;
    var lines = csv.split("\n");
    var csvWithoutLastLine = lines.slice(0,-1).join("\n");
    parseCsv(csvWithoutLastLine);
    // Parse, build Markers and populate Layer Groups
    //parseCsv(csv);
  };

  reader.readAsText(file);
});

推荐答案

您还可以重复使用初始回调$.get中的大部分来处理用户输入的CSV文件(特别是重新使用PapaParse而不是手动读取CSV).主要确保将层占位符变量放在外部共享作用域中,以便重新使用它们:

var engineerLayers = {}; // Create an object to hold the engineer subgroups
var parentGroup = L.markerClusterGroup();
map.addLayer(parentGroup);
controlLayers.addTo(map);

// Parse CSV string, build Markers and
// populate Layer Groups
function parseCsv(csvString) {
  var data = Papa.parse(csvString, {
    header: true,
    dynamicTyping: true
  }).data;
  
  for (var i in data) {
    var row = data[i];
    var engineer = row.Engineer;

    if (!(engineer in engineerLayers)) {
      // Each overlay that should actually be a part of MCG
      // should be made as a Subgroup, with the MCG as their parent
      engineerLayers[engineer] = L.featureGroup.subGroup(parentGroup, []);
      controlLayers.addOverlay(engineerLayers[engineer], engineer);
    }

    var marker = L.circleMarker([row.Latitude, row.Longitude], {
      radius: 10,
      stroke: true,
      color: getColor(engineer),
      opacity: 1,
      weight: 1,
      fill: true,
      fillColor: getColor(engineer),
      fillOpacity: 0.5
    }).bindPopup('Plan File: ' + row.PFN + '</br>' + 'Engineer: ' + row.Engineer + '</br>' + ' Date Received: ' + row.Date_Received + '</br>' + 'Status: ' + row.Status);

    // Add the marker only to its overlay
    marker.addTo(engineerLayers[engineer]);
  }
});

然后,您的初始文件加载变为:

$.get('\practice.csv', parseCsv);

和您的用户CSV输入处理:

// Listen for file upload changes
$('#csvFileUpload').change(function (e) {
  var file = e.target.files[0];
  var reader = new FileReader();

  // Read file contents
  reader.onload = function (e) {
    var csv = e.target.result;
    // Parse, build Markers and populate Layer Groups
    parseCsv(csv);
  };

  reader.readAsText(file);
});

Javascript相关问答推荐

为什么在react js中没有调用加载器函数?

RxJS setTimeout操作符等效

React:未调用useState变量在调试器的事件处理程序中不可用

将json数组项转换为js中的扁平

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

为什么我的includes声明需要整个字符串?

从mat—country—select获取整个Country数组

Exceljs:我们在file.xlsx(...)&#中发现了一个问题'"" 39人;

为什么这个JS模块在TypeScript中使用默认属性导入?""

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

当点击注册页面上的注册按钮时,邮箱重复

Chart.js-显示值应该在其中的引用区域

如何在ASP.NET中使用Google Charts API JavaScript将条形图标签显示为绝对值而不是负值

将核心模块导入另一个组件模块时存在多个主题

当id匹配时对属性值求和并使用JavaScript返回结果

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

AJAX POST在控制器中返回空(ASP.NET MVC)

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

用于测试其方法和构造函数的导出/导入类

有没有办法通过使用不同数组中的值进行排序