将一个地理区域分成一系列较小的区域(大小可控)并计算给定的经纬度点属于哪个区域

Posted

技术标签:

【中文标题】将一个地理区域分成一系列较小的区域(大小可控)并计算给定的经纬度点属于哪个区域【英文标题】:Break a geographical area in to a series of smaller areas (of controllable size) and calculate which area a given lat/long point falls within 【发布时间】:2012-05-22 00:14:03 【问题描述】:

不幸的是,数学从来都不是我的强项,我正在努力寻找最佳方法/公式来执行以下操作(然后我需要将其转换为 php 代码):

1)。从单个大区域开始(例如覆盖整个欧洲)

2)。将该区域分解为一系列较小的块(即,将其变成各种网格)

3)。每个网格块的宽度应大致对应于 75 公里的距离(考虑到地球的曲率)。

4)。计算每个网格块的中心纬度/经度点

5)。对于每个网格块的中心点,针对单独的纬度/经度点数据库(代表兴趣点)运行搜索,以找到每个网格块最多 5 个最近的兴趣点。最远的兴趣点距离网格块中心不得超过 150 公里。

完成上述所有操作后,我应该得到一个网格块数据库及其对应的 5 个最近的兴趣点。

我希望然后我应该能够获取任何随机的经纬度点并计算(使用有效的数学公式)它属于哪个预先计算的网格块,从而能够立即返回 5 个最近的兴趣点无需进行任何昂贵的计算。

[注意:为清楚起见根据下面高性能标记的有用回复进行了编辑]

【问题讨论】:

我认为你想根据球坐标(两个角度的范围)定义你的正方形,这样它们的大小都差不多,并找到一种在球坐标和纬度和经度之间转换的方法。谷歌应该能够告诉你如何做到这一点,它可以很容易地判断哪个点在哪个正方形等中并测量距离等。 感谢海伦。我将首先探索高性能标记的想法,因为它似乎在我的能力范围内更多(“球坐标”的***条目让我感到困惑......) 【参考方案1】:

我认为您最好的选择是使用或遵循现有方法对区域进行网格化,例如UTM。既然你承认你的数学很弱,那么在这个阶段使用可能是你更好的方法。

UTM 会给你 1 和 2。

在像欧洲这样大的区域内,没有什么能让您获得 3 分。您将无法定义总和为一个正方形的 75 公里正方形数组,地球在这么大的区域上还不够平坦。

UTM 为您提供 4。

一旦你明白了这一切,你就不应该对 5 有太多麻烦,但是当你到达那里并且遇到困难时再发布一个问题。

编辑

扩展第 3 点。我建议您找到您感兴趣的区域的中纬度,即您感兴趣的区域的北部和南部界限之间的中纬度(以角度测量)。然后谷歌搜索公式,将经度的长度转换为该纬度的公里。沿该中纬度 75 公里间距的垂直线将成为您的网格的基础。这些线将在角度测量中等间距。

接下来,计算出您感兴趣区域的北部和南部边界处这些垂直线之间的距离(以公里为单位) - 相同的公式。如果线性度量仍在您的灵活性范围内,则您已完成此步骤。如果他们不是(a)我很惊讶,并且(b)你将不得不解决一些棘手的数学和编程问题。

接下来,再次牢记您的中纬度,计算出与该纬度 75 公里(纬度)相符的角度测量值。这将为您提供 2 条水平(即平行于赤道)网格线。由于纬度 75 公里的弧度测量值的变化远小于经度随纬度变化的线性测量值,因此您可能可以用相同的角度测量值标出其他方格。

【讨论】:

感谢您的快速回复!除了我糟糕的数学能力之外,我还缺乏与地理相关的编程经验。例如,我不知道 UTM(我现在将继续阅读)。不幸的是,第 3 点(或类似的东西)对我来说至关重要,即我需要能够粗略地控制每个网格正方形的大小(它不必像 75 公里那样固定,但它确实需要适应边界,例如不少于超过 50 公里且不超过 100 公里)。 为了进一步详细说明第 3 点。是否有一个公式或一组公式我可以研究以获取球体的一部分并将其分解为更小的部分(理想可控的尺寸)? 好吧,只要你不期望每边都有正好 75 公里的正方形,但正如你所说,准备好灵活地适应地球是一个球体的事实(差不多)你不应该有任何问题。有一件事是肯定的,你必须保持灵活,地球表面将保持(大约)球形。 感谢您对此的所有想法。我现在感觉不那么迷失了:)

以上是关于将一个地理区域分成一系列较小的区域(大小可控)并计算给定的经纬度点属于哪个区域的主要内容,如果未能解决你的问题,请参考以下文章

合并两个不同大小的图像在较小的图像中留下黑色

JVM——Java内存区域相关3

HMS Core地理围栏能力助你实现指定范围人群的精准消息推送

将长坐标和纬度坐标划分为子坐标(较小的正方形)?

怎样将gps wgs-84坐标系转换为其他坐标系

将列表拆分为较小的列表(分成两半)