1

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

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

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

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

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

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

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

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

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

4

1 回答 1

1

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

UTM 会给你 1 和 2。

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

UTM 给你 4。

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

编辑

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

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

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

于 2012-05-14T13:50:29.987 回答