我正在使用GEOJSON绘制带有传单的世界地图,并用虚线绘制了边界,如下图所示。
我遇到的问题是,如果两个州共享边界,则两个州不共享该线,而是针对不同的州分别绘制了两条线。因此,缩放时,足够多的线条彼此重叠,因此看起来很奇怪。如下图所示。
var GeoJsonLayer = L.geoJson();
var myStyle = {
"color": "#fff",
"weight": 0.8,
"opacity": 1,
"fillOpacity": "1",
"fillColor": "#243E54"
};
// here data.world contains GEOJson to draw whole map
if (data.world) {
GeoJsonLayer.options.className = "geojsonlayerpolygon";
GeoJsonLayer.on("dblclick", function (ev) {
map.fireEvent("dblclick", ev);
});
GeoJsonLayer.addData(data.world);
GeoJsonLayer.setStyle(myStyle);
}
为了使它成为虚线,我在CSS下方使用
.geojsonlayerpolygon{
stroke-dasharray: 6 4;
}
我正在使用的GEOJson是 https://jsonblob.com/826f1a94-c1a3-11e9-a004-354d7c27cab2
我如何确保边界共享时只有一条线?
答案 0 :(得分:3)
听起来像TopoJSON的工作。从其自述文件中:
TopoJSON是GeoJSON的扩展,对拓扑进行编码。 TopoJSON文件中的几何图形不是从离散的角度表示,而是从称为弧的共享线段缝合在一起的。此技术类似于Matt Bloch的MapShaper和Arc / Info Export格式.e00。
TopoJSON消除了冗余,从而允许将相关的几何有效地存储在同一文件中。例如,加利福尼亚和内华达州之间的共享边界仅代表一次,而不是为两个州重复。单个TopoJSON文件可以包含多个要素集合,而无需重复,例如州和县。或者,TopoJSON文件可以有效地将多边形(用于填充)和边界(用于描边)表示为共享同一弧形网格的两个要素集合。
因此,首先加载topojson库...
<script src="https://unpkg.com/topojson@3"></script>
...然后为您的GeoJSON数据创建一个拓扑对象;请注意,TopoJSON需要一系列GeoJSON功能,例如我将通过fetch
加载包含自然地球国家边界的GeoJSON FeatureCollection并创建拓扑:
fetch("ne_110m_admin_0_countries.geojson")
.then(res=>res.json())
.then(json=>{
var topo = topojson.topology([json]);
/* ...more stuff here soon */
});
...然后添加仅填充多边形的L.GeoJSON
层,设置stroke
选项以避免在多边形轮廓上绘制任何线(请记住path styling options can be passed to GeoJSON constructors)。 ..
var layerFill = L.geoJson(json, { stroke: false }).addTo(map);
...计算拓扑的mesh,它将是GeoJSON MultiLineString ...
topojson.mesh(topo);
...并创建另一个L.GeoJSON
实例以绘制所述MultiLineString。根据需要设置线条的样式(包括dashArray
),例如...
var layerLines = L.geoJson(topojson.mesh(topo), {
fill: false, dashArray:[3, 6], weight: 2
}).addTo(map);
按预期,最终结果which you can see here as a working example不包含重叠的虚线:
使用TopoJSON是一种可能的方法。还有其他可能的方法(例如,仅使用边界预先生成MultiLineString GeoJSON文件,使用其他工具等);但是在数据集上使用拓扑规则的想法是相同的。