【问题标题】:Filter Json and Add Custom Markers过滤 Json 并添加自定义标记
【发布时间】:2019-04-19 00:24:10
【问题描述】:

我正在尝试从我的数据库中导入一个 json 文件并添加具有不同标记样式的自定义图层。当我导入 json 并执行 json.map 时,它作为包含所有 lat/lng 数据的一层。当我执行 json.filter 时,如果 category == "what i want",添加标记...它会提取数据,将其放入变量中,但不会将其用作图层。

注意: 我正在使用 Javascript 和 Sequelize。我的传单地图是从 mapbox 导入的。该程序功能齐全,但我正在尝试添加额外的功能来排序数据和查看乐趣。

  fetch('https://agile-mesa-12521.herokuapp.com/api')
    .then(function(response) {
      return response.json();
    }).then(function(complaintJson){
      let lMarkerArray = complaintJson.filter((complaint) => {
        if(complaint.category == "pothole"){
        return L.marker([complaint.lat, complaint.long])
      }
    })
    console.log(lMarkerArray)
      let overlayMaps = { "Complaints": L.layerGroup(lMarkerArray)}
      let streetView = {"Street View": L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
          attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
          minZoom: 10,
          id: 'mapbox.streets',
          accessToken: 'pk.eyJ1IjoicmxvcmVuemluaSIsImEiOiJjanR5Z3R2bjQxNjlxM3lvNTV4ZnMxOXAyIn0.xxNzHRkLduHYsYIMoCvGCA'
      }).addTo(mymap)}
      L.control.layers(streetView, overlayMaps).addTo(mymap)
    })
})

取出 if(complaint...) 并将complaintJson.filter 更改为 .map ,它适用于所有传入的数据。

关于如何创建多个变量、将它们分配到我的投诉Json 文件中的不同类别、然后给它们自定义标记的任何建议?

  fetch('https://agile-mesa-12521.herokuapp.com/api')
    .then(function(response) {
      return response.json();
    }).then(function(complaintJson){
      let lMarkerArray = complaintJson
  .filter(complaint => complaint.category == "pothole")
  .map(complaint => L.marker([complaint.lat, complaint.long]));
        // return L.marker([complaint.lat, complaint.long])
    // })
    console.log(lMarkerArray)
      let overlayMaps = { "Complaints": L.layerGroup(lMarkerArray)}
      let streetView = {"Street View": L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
          attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
          minZoom: 10,
          id: 'mapbox.streets',
          accessToken: 'pk.eyJ1IjoicmxvcmVuemluaSIsImEiOiJjanR5Z3R2bjQxNjlxM3lvNTV4ZnMxOXAyIn0.xxNzHRkLduHYsYIMoCvGCA'
      }).addTo(mymap)}
      L.control.layers(streetView, overlayMaps).addTo(mymap)
    })
})

更新了代码,建议过滤然后映射。

Oxnoob 解决了我的问题。谢谢!

【问题讨论】:

  • 你也必须删除另一个}),否则console.log(); ...语句不在promise的回调函数中。
  • 哎呀。不错的收获。奇迹般有效。感谢您的帮助。

标签: javascript json leaflet


【解决方案1】:

因为 filter 返回原始数组的子集(只有函数返回真值的元素),所以您不能像使用 map 那样更改元素本身。

我想你想做的是:

let lMarkerArray = complaintJson
  .filter(complaint => complaint.category == "pothole")
  .map(complaint => L.marker([complaint.lat, complaint.long]));

【讨论】:

  • 当我这样尝试时,我收到一条错误消息,指出未定义 lMarkerArray。我明白你的建议。
  • 你能给出你的代码的更新版本吗? @r-lorenzini
猜你喜欢
  • 2020-12-26
  • 2020-03-18
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多