消除多边形州/国家/地区共享边界的重复数据 [英] Deduplicate polygon state/country shared boundaries

查看:22
本文介绍了消除多边形州/国家/地区共享边界的重复数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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

如何确保共享边界时只有一条线?

推荐答案

听起来像是TopoJSON的工作。来自其自述文件:

Topo JSON是对拓扑进行编码的GeoJSON的扩展。Topo JSON文件中的几何图形由称为圆弧的共享线段缝合在一起,而不是离散表示几何图形。此技术类似于Matt Bloch的MapShaper和Arc/Info导出格式.e00。

Topo JSON消除了冗余,允许将相关几何图形高效存储在同一文件中。例如,加利福尼亚州和内华达州之间的共享边界只表示一次,而不是为两个州重复表示。单个Topo JSON文件可以包含多个无重复的要素集合,例如州和县。或者,Topo JSON文件可以有效地将多边形(用于填充)和边界(用于笔划)表示为共享同一圆弧网格的两个要素集合。

因此,首先加载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多线串...

topojson.mesh(topo);
...并创建另一个L.GeoJSON实例来绘制所述多行字符串。根据您的喜好设置线条样式(包括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如预期的那样,不包含重叠的虚线:


使用Topo JSON是一种可能的方法。还有其他可能的方法(例如,预先生成仅具有边界的多线串GeoJSON文件,使用不同的工具等);但在数据集上使用拓扑规则的想法是相同的。

这篇关于消除多边形州/国家/地区共享边界的重复数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆