将地理区域分解为一系列较小的区域(大小可控),并计算给定经纬度/经纬度点所在的区域


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

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

1(. 从单个大面积开始(例如覆盖整个欧洲(

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

3(.每个网格块的宽度应大致相当于75km的距离(考虑到地球的曲率(。

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

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

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

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

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

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

UTM会给你1和2。

没有什么能给你 3 在欧洲这么大的地区。 你将无法定义一个75公里的正方形数组,这些正方形加起来就是一个正方形,地球在这么大的区域内不够平坦。

UTM给你4。

一旦你明白了这一切,你

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

编辑

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

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

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