微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Leaflet中使用VectorGrid的代码效率

如何解决在Leaflet中使用VectorGrid的代码效率

在使用VectorGrid的GeoJSON文件中,我有大约7000个多边形,使用一层就可以了,但是我需要将该层分成10个LayerGroups(10个具有自己多边形的区域)。不用重写10次代码怎么办?这似乎是很多浪费,必须有一种更聪明的方法,我无法弄清楚。这是我正在测试的代码,重点必须在所有11层上都可以使用...

var all_regions = new L.layerGroup();
var region_1 = new L.layerGroup();
var region_2 = new L.layerGroup();
var region_3 = new L.layerGroup();
/* snip */
var region_10 = new L.layerGroup();

var highlight_polygon;
var clearHighlight = function () {
  if (highlight_polygon) {
    vectorGrid.resetFeatureStyle(highlight_polygon);
  }
  highlight_polygon = null;
};

var vectorTileOptions_allRegions = {
  rendererFactory: L.canvas.tile,maxNativeZoom: 13,zIndex: 6,vectorTileLayerStyles: {
    sliced: {
      weight: 2,color: "gray",opacity: 1,fill: false,//fillColor: 'white',//stroke: true,fillOpacity: 0,},interactive: true,getFeatureId: function (f) {
    return f.properties.id;
  },};

var vectorTileOptions_region_1 = {
  rendererFactory: L.canvas.tile,vectorTileLayerStyles: {
    sliced: function (properties,zoom) {
      var region = properties.region;
      if (region === "region one") {
        return {
          weight: 2,};
      } else {
        return {
          weight: 0,opacity: 0,stroke: false,interactive: false,};
      }
    },};

// Next vectorTileOptions until all 11 of them....

$.getJSON("/data/regions.geojson",function (json) {
  //Not sure this is the correct way doing it...

  var vectorGrid = L.vectorGrid
    .slicer(json,vectorTileOptions_allRegions,vectorTileOptions_region_1)

    .on("click",function (e) {
      var properties = e.layer.properties;
      L.popup()
        .setContent(
          "<b>Name</b>: " +
            properties.region_name +
            "<br><b>Date</b>: " +
            "<i>" +
            properties.date +
            "</i>"
        )
        .setLatLng(e.latlng)
        .openOn(map);
      clearHighlight();
      highlight_polygon = e.layer.properties.id;

      vectorGrid.setFeatureStyle(highlight_polygon,{
        weight: 3,fillColor: "#ff9999",fill: true,radius: 6,fillOpacity: 0.3,});
      L.DomEvent.stop(e);
    });

  var clearHighlight = function () {
    if (highlight_polygon) {
      vectorGrid.resetFeatureStyle(highlight_polygon);
    }
    highlight_polygon = null;

    map.on("popupclose",clearHighlight);
  };
  //This will not work....
  vectorGrid.addTo(all_regions);
  vectorGrid.addTo(region_1);
});

解决方法

您可能想做类似...

FeatureCollection

关键点是:

  • 使用循环从1迭代到10
  • 将内容保留在编号数组中,而不要使用名称相似的变量
  • 过滤Object.assign,以便每个VectorGrid使用更少的数据。绘制不可见的多边形/折线将花费与绘制可见的多边形/折线相同的计算时间。
  • 尽可能地重构,然后建立具体的数据结构(Debug,如果需要的话可以克隆对象)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?