Leaflet,Topojson和layergroup

时间:2016-03-03 13:13:32

标签: leaflet topojson

我有一个有三个级别的地理层:village>县>区域。

我的topojson由村庄的多边形组成,我有一个包含村庄的json>县>区域数据。

我这样加载:

L.TopoJSON = L.GeoJSON.extend({
  addData: function(jsonData) {    
    if (jsonData.type === "Topology") {
      for (key in jsonData.objects) {
        geojson = topojson.feature(jsonData, jsonData.objects[key]);
        L.GeoJSON.prototype.addData.call(this, geojson);
      }
    }    
    else {
      L.GeoJSON.prototype.addData.call(this, jsonData);
    }
  }  
});
var topoLayer = new L.TopoJSON();

var village =  {};

$.getJSON('data/villages_data.json', function(data) {
  village = data;
  $.getJSON('data/villages_geo.json').done(addTopoData);
});
function addTopoData(topoData){
  topoLayer.addData(topoData);
  topoLayer.addTo(map);
  topoLayer.eachLayer(handleLayer);
}

我想在地图上显示三个级别:村庄,县和地区。我之前设法使用了图层组,我正在考虑使用它来添加控件来切换每个管理级别。 我还希望以不同的方式设置每个管理级别的样式。

我本来希望直接在地图中这样做..否则我看到的唯一解决方案是制作三个shapefile,每个管理级别一个,然后为三个层制作一个topojson。然后我想这会更容易访问每个管理员级别;虽然我甚至不确定我会处理它。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

有点困惑,因为我不清楚你的设置/解释,但从我收集的内容,这里是我会做什么。您可以将shapefile导出为三个不同的GeoJSON文件,并将它们转换为一个TopoJSON文件:

topojson -o topo.json -- villages.json counties.json regions.json

然后在客户端,您可以这样做:

var overlays = {
    'villages': new L.GeoJSON(null, {
        'style': function () {
            return {
                'color': 'red'
            }
        }
    }),
    'counties': new L.GeoJSON(null, {
        'style': function () {
            return {
                'color': 'green'
            }
        }
    }),
    'regions': new L.GeoJSON(null, {
        'style': function () {
            return {
                'color': 'blue'
            }
        }
    })
};

var control = new L.Control.Layers(null, overlays).addTo(map);

$.getJSON('topo.json', function (topo) {
    for (key in topo.objects) {
        var geo = topojson.feature(topo, topo.objects[key]);
        overlays[key].addData(geo);
    }
});

沿着这些方向做了一些事情,但请注意:将它作为伪/未经测试的代码,因为我是徒手写的,并且没有手动获得正确的TopoJSON文件来实际测试它。