【问题标题】:Leaflet, Topojson and layergroupLeaflet、Topojson 和 layergroup
【发布时间】:2016-03-04 01:56:51
【问题描述】:

我有一个包含三个级别的地理层:村庄 > 县 > 地区。

我的 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。然后我想访问每个管理员级别会更容易;虽然我什至不确定我会处理它。

有什么建议吗?

【问题讨论】:

    标签: leaflet topojson


    【解决方案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 文件来实际测试它。

    【讨论】:

    • 仅作记录:style选项可以直接为对象。 L.geoJson 会将其转换为始终返回该对象的函数。
    • 感谢您的澄清和发现突出显示错误,没有正确自动检测并监督它。至于工厂方法,我总是在我的所有代码/示例中使用带有new 关键字的普通方法,所以我把它改回来了。这不是我第一次必须帮助那些在实例化方面遇到问题的人,当他们理所当然地认为工厂不存在时(比如一些插件等)
    • 当然,Leaflet 足够好,构造函数和工厂是等效的。但不是你说的一些插件......
    • 感谢代码,这正是我在说的!这就是我一直认为的备用计划。所以它是这样工作的,但这意味着我必须添加三倍相同的边框,而我认为 topojson 的重点是不要重复边框。我试图重现的是 Mike Bostock 的示例:bl.ocks.org/mbostock/4090848:他只有一层并使用 d3 对其进行样式设置。由于我的数据集很大,我宁愿尽量减少重复。我们可以用小册子做迈克用 d3 做的事情吗?样式和控制图层:)
    • 没有重复边界不是 TopoJSON 的重点,它可以做到这一点。您忽略了他使用topojson.mesh 而不是topojson.feature 这正是您正在寻找的事实:'返回表示给定拓扑中指定对象的网格的 GeoJSON MultiLineString 几何对象。这对于有效地在复杂对象中渲染笔触很有用,因为由多个特征共享的边缘只被描边一次。 github.com/mbostock/topojson/wiki/API-Reference#mesh 是的,这也可以在 Leaflet 中使用,为什么不呢? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多