不幸的是,数学从来都不是我的强项,我正在努力寻找最好的方法/公式来执行以下操作(然后我需要将其转换为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公里的弧度测量值远小于纬度变化的经度线性测量值,因此您可能可以用相同的角度测量值标记其他方块。