【问题标题】:Framework for plotting latitude longitude in a map based on country, state and district depending on the zoom level根据缩放级别在基于国家、州和地区的地图中绘制纬度经度的框架
【发布时间】:2016-01-07 06:37:54
【问题描述】:

我需要一个框架,它采用一组经纬度点并在世界地图上绘制,按国家分组,并以点数作为每个国家的标记。这里的分组是一个国家的经纬度点的计数。 当我深入到一个国家/地区时,集群应该更改为基于州的集群。下一级,到地区。

Leaflet marker cluster 与我所要求的非常相似,但分组是基于邻近度的,它不考虑国家或州边界。也就是说,他们不知道区域。

Regionbound.com 调整了传单代码中的一些代码,以使其具有区域意识,

Sample marker definition:

var marker1 = new L.marker([-37.8, 145], {regions: ["Asia-Pac", "Australia", "VIC", "Melbourne"]} );

但是示例代码说,必须定义每个纬度经度以及一些包含地点信息的额外参数。 我可以使用reverse geocoding 获取地点信息,但是对每个纬度经度进行反向地理编码非常耗时。

Highcharts 提供的Highmaps 是另一种解决方案,但在那里,每个国家都有代码,应该分配一个值[属于该国家的点坐标计数]。 但我只有经纬度点,没有国家或州信息。

因此,我需要一些只需要一组纬度经度并根据缩放级别根据国家、州、地区进行聚类的东西。

【问题讨论】:

    标签: leaflet mapbox markerclusterer highmaps


    【解决方案1】:

    您的问题有 2 个不同的需求:

    1. 将您的纬度/经度坐标映射到适当的行政区域。例如。通过您提到的反向地理编码。
    2. 根据缩放级别在这些行政区域上显示“集群”。

    至于第 1 点,您知道 lat/lng 点本身并不能说明它们属于哪个行政区域。因此,“对每个纬度经度进行反向地理编码”是一个强制性步骤。是否耗时取决于您选择执行此操作的解决方案。

    如果我理解正确,您会想要一个可以自动为您完成此任务的“框架”。但是框架通常与数据无关,如果它们没有关于这些行政区域边界的数据,它们就无法为您提供帮助。

    您可能更愿意寻找“服务”(例如您提到的 Mapbox Geocoding API)或已经拥有此类数据的软件。如果您可以对查找进行编程(或执行“批量”操作)并且不受请求率和要映射的点数的限制(Mapbox 可能就是这种情况),则不会耗费时间。

    您可以很好地设置自己的应用程序来执行此映射:

    • 关于行政区域边界的数据集,您可能会对这篇文章中的链接感兴趣:Are there any free administrative boundaries available as shapefiles? 如果您的积分仅限于几个国家,您将更容易找到合适的数据源(s )。
    • 一旦您有了这些数据,许多 GIS 软件应该能够将您的 lat/lng 点映射到它们所属的区域。如果您的点集没有太大变化,这将主要用于“一次性”操作。
    • “网络兼容”替代方案是例如使用带有point in polygon for Leaflet plugin 的 Leaflet。您需要先将边界数据转换为 GeoJSON 格式。同样,GIS 软件应该能够做到这一点,或者许多在线服务也应该能够做到这一点(例如搜索“convert geojson”)。
    • 服务器端解决方案将避免必须通过网络和客户端浏览器管理整个边界数据(如果您需要动态执行映射)。我相信许多 GIS 服务器一旦获得边界数据,就能够执行此操作。

    对于第 2 点,一旦你完成了上述步骤,我想你会有很多选择,包括你提到的那些(RegionBound、Highmaps)。

    即使使用标准映射库(Leaflet、OpenLayers 3),您也只需要构建“集群”(行政区域上的标记,用数字表示那里有多少点),就像您必须使用 Highmaps 一样例如。

    计算“聚集”点的数量就像过滤每个区域名称/代码的点一样简单。然后在地图缩放更改时将集群切换到所需的管理级别。

    所以关键是首先确定您的点属于哪些区域(第 1 点)。

    然后会出现一个关于在哪里放置“集群”标记的小问题:

    • 在行政区域的中心?您需要数据源中该质心的坐标,或者需要一种从边界计算它的好算法(祝您好运……)。
    • 在区域边界框的“中心”? Leaflet 可以很容易地计算出:从你的区域矢量形状,你会做myShape.getBounds().getCenter()
    • 在聚集点的重心/质心上?这就是 Leaflet.markercluster 和 RegionBound 所做的(不知道 Highmaps)。

    祝你好运!

    【讨论】:

    • 非常感谢您的回复。数据会不断变化,因此拥有 GIS 软件并将每个纬度经度反向地理编码为区域信息并不好。您能否提出建议,通过增强现有的leaflet marker cluster project 来完成这项工作,该leaflet marker cluster project 基于邻近度进行聚类?
    • 至于将点 2 应用于 Leaflet.markercluster,您将“简单地”为每个行政区域创建一个标记群集组,以便点只能与来自同一区域的其他点进行群集。然后根据地图缩放级别显示/隐藏您的组。同样,您需要以某种方式对您的坐标进行反向地理编码,以便能够将您的点分配给适当的组。您无法避免这一强制性步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2011-04-30
    • 1970-01-01
    • 2017-10-17
    • 2014-06-01
    相关资源
    最近更新 更多