根据国家,州和地区在地图中绘制纬度经度的框架,具体取决于缩放级别

时间:2016-01-07 06:37:54

标签: leaflet mapbox markerclusterer highmaps

我需要一个框架,它在世界地图上采用一组纬度经度点和绘图,按国家/地区分组,每个国家/地区都有点数作为标记。这里的分组是一个国家的纬度经度点数。 当我深入到一个国家时,聚类应该变为基于状态的聚类。而下一个级别,到地区。

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是另一种解决方案,但在那里,每个国家都有代码应该被分配一个值[属于该国家的点坐标的数量]。 但我所拥有的只是纬度经度点,没有国家或州的信息。

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

1 个答案:

答案 0 :(得分:3)

您的问题中有两个不同的需求:

  1. 将您的lat / lng坐标映射到适当的管理区域。例如。通过您提到的反向地理编码。
  2. 显示"群集"在这些管理区域上取决于缩放级别。
  3. 对于第1点,您知道纬度/经度点不会自己说明它们属于哪个行政区域。所以" 对每个纬度经度进行反向地理编码"是必须的一步。是否耗时取决于您选择执行此操作的解决方案。

    如果我理解正确,你会想要一个"框架"这可以自动为你做。但框架通常是数据无关的,如果他们没有关于这些行政区域边界的数据,他们就无法帮助你。

    您可能更愿意寻找"服务" (就像你提到的Mapbox地理编码API)或已经有这些数据的软件。如果您可以对查找进行编程(或执行"批量"操作)并且不受请求率和要映射的点数(可能是Mapbox的情况)的限制,则不是非常耗时。

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

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

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

    即使使用标准的映射库(Leaflet,OpenLayers 3),您也只需构建"集群" (行政区域上的标记,其中有一个数字表示其中有多少点),例如,无论如何都要与Highmaps有关。

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

    所以关键是要先确定你的点所属的区域(第1点)。

    然后一个小问题会出现在 的位置,以便放置"群集"标记:

    • 关于行政区域的质心?你需要从你的数据源获得该质心的坐标,或者从边界计算它的好算法(祝你好运......)。
    • On" center"该地区的边界框? Leaflet可以很容易地计算:从您的区域矢量形状,您可以myShape.getBounds().getCenter()
    • 关于聚集点的重心/质心?这就是Leaflet.markercluster和RegionBound所做的事情(对于Highmaps不知道)。
    祝你好运!