给定每个区域的边界和纬度/经度,以编程方式查找州/县

Posted

技术标签:

【中文标题】给定每个区域的边界和纬度/经度,以编程方式查找州/县【英文标题】:Finding a state/county programmatically, given the boundaries of each area and a latitude/longitude 【发布时间】:2016-04-13 05:43:55 【问题描述】:

假设您在文本文件中有任何国家/地区的州/县的边界,如下所示:

State \t State Name \t Lat/Long of entire State Boundary(comma separated).

我想将此信息存储在数据结构中**,然后给定一个经纬度,检索状态。

我不想使用 API,也不想使用蛮力方法(即为每个状态构建一个多边形,然后执行 point in polygon 算法直到命中)

以我有限的知识,我认为 KD-Trees 或 R-Trees 是怎么做的?虽然这两个似乎都是不错的选择,但我不确定该使用哪一个。如果您能提供详细的解释 - 从创建数据结构到执行搜索,那将非常有帮助。

我对县比对州更感兴趣,因为它们的粒度更细。可能值得以更大的粒度停止树的构建,然后对该粒度(最小边界区域)中的所有县进行多边形点方法。从概念上讲,这似乎是可行的,但我不确定如何实现。

【问题讨论】:

我搜索了 SO 并找到了相关问题,因此得到了关于 KD-Trees 和 R-Trees 的想法,但没有实现细节。 看看mysql空间数据库功能MBRContains() @davidstrachan 只是这样做,我想这将与蛮力方法相同。 查看任何 GeoSpatial 库(使用您选择的语言),它会在多边形中有一个空间索引点,这比您自己编写的任何东西都更快更好 【参考方案1】:

如果您尚未选择地理空间友好型数据库,请选择 Postgis。 Mysql 5.7 也可以,但 Postgis 更成熟,功能更丰富。2

下载world borders shapefile.

将 shapefile 导入 postgis 或 mysql

利用 mysql 和 postgis 中可用的ST_Within 函数来确定给定点是否在任何国家/地区内,并检索该国家/地区的名称或其他信息。

请注意,ST_within 查询速度很快,您不需要自己做很多努力。这是一条线。

设置数据库和导入数据库可能是一项艰巨的工作,但无论如何您都必须这样做,即使您想出了自制的解决方案。

【讨论】:

以上是关于给定每个区域的边界和纬度/经度,以编程方式查找州/县的主要内容,如果未能解决你的问题,请参考以下文章

将纬度/经度转换为美国州

检索给定区域 x 距离内的所有经纬度点

查找一个点(纬度,经度)是不是在 OpenStreetMaps“方式”(区域)内

从国家、州、城市和每个城市纬度/经度的数据库查询构建 JSON

如何找到给定纬度/经度以北 x 公里的纬度/经度?

如何检查(在 php 或 cakephp 中)郊区的特定纬度/经度位于特定州?