0

对于一个小项目,我允许用户向数据库添加区域。他们的查询被发送到http://nominatim.openstreetmap.org,我存储了纬度和经度。如果可用,我还会存储 geoJSON 多边形轮廓数据。

示例输出:http ://nominatim.openstreetmap.org/search?q=wyoming&format=xml&polygon_geojson=1&addressdetails=1

然后使用 Leaflet.js 在地图上显示这个轮廓区域。对于很多多边形来说,这很好,但似乎库可以处理的数据量是有限的。一些相当复杂的区域(需要长文本存储在 mysql 中)根本不会显示,不会引发错误。

我想我的问题有两个部分: 1 - 我是否正确假设大型数据集是问题的根源,或者 Leaflet.js 是否应该能够处理这些问题?2 - 简化此类数据集的最佳方法是什么?Leaflet 有这样一种显示区域的算法,但这似乎已经是失败点了。

当我们讨论这个话题时:现在我正在通过拆分数据并在 javascript 中将其修补在一起,将 Nominatim 的 lnglat 多边形转换为传单的 latlng。有没有更简单/更安全的方法来做到这一点?我是否应该将该任务移至服务器并使用一些 php 库/函数?

我感谢您的帮助!

编辑:忘了提:在多边形无法渲染的情况下,我的控制台给了我这个错误:TypeError:t is null

4

1 回答 1

1

大型数据集是问题的根源还是 Leaflet.js 应该能够处理这些问题?

Leaflet.js 会处理你扔给它的任何东西。但是,您的网络浏览器在不减慢速度的情况下可以处理的内容是有限制的。

请记住,每个现代 Web 浏览器都有性能分析工具,您可以使用这些工具来查看 Leaflet 代码(或浏览器内部)的哪些部分占用了您的大部分时间。

简化此类数据集的最佳方法是什么?

您可能想查看Douglas-Peucker 算法作为这些算法的起点。

请记住,Leaflet 在内部使用此算法来简化每个缩放级别上的多边形,最多一个像素。

对于一些大的复杂多边形,使用Leaflet.VectorGrid将它们切片可能会提高性能。

然而,简化数据集并没有灵丹妙药。最好的方法取决于您使用的具体数据。

在多边形无法渲染的情况下,我的控制台会给我这个错误:TypeError: t is null

这是另一回事,可能是数据格式错误的症状。

为了显示更漂亮的错误消息,请使用leaflet-src.js文件而不是leaflet.js文件。从 Leaflet 1.0.0-beta2 开始,leaflet-src.js有一个 sourcemap,可以指向各个原始文件,以便更好地调试。

于 2017-01-24T09:27:09.280 回答