SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM cities ORDER BY distance LIMIT 1;
我想把它做成平衡二叉树的形式,包括平衡节点和映射。
比方说根/头部从伦敦开始(在地球水平常规地图中选择为中心,GMT): 右边:世界地图右半边的中心城市。 左边:世界地图左半边的中心城市。
现在以同样的方式传播以包含所有要包含的城市。 x,y 将成为数据的一部分。在遍历每个节点时,我们可以比较我们的城市 X 和我们的城市 Y 坐标。
我认为,这将是一种易于找到最近的左侧节点的方法,沿着树向下遍历左-右节点。 我还没有实现这个,但看起来是一个不错的解决方案。
London
/ \
New York Singapore / \ / \ Florida Cuba Mumbai Melborne
等等看...
它基于距离而不是纬度或经度的差异。 让我们看看是否有效。
[-90..90, -180, 180]
开始。(0, -179)
和(0, 179)
比它们的经度看起来更接近)我曾遇到过这个确切的问题,并通过使用 R-Tree 直接解决了它,即将纬度/经度视为笛卡尔坐标。
这种方法相当有效,因为国际日期变更线和极地附近缺乏城市,我的应用程序有时可以容忍不完全是最近的城市。
尽管如此,我仍然不喜欢这种不精确性,并在 SO 上询问。有人提出了一种可能有效的解决方案,尽管我还没有找到时间来实现它:
不使用纬度和经度特征,而是使用纬度、经度和距离0,0的距离怎么样?然后可以使用KD树吗?
当然,计算每个城市到原点的距离需要时间,但您只需要执行一次。