Mysql 选择附近有东西的城镇
我有两个类似下面例子的表格,Mysql 选择附近有东西的城镇,mysql,distance,Mysql,Distance,我有两个类似下面例子的表格,towns和things,需要获得一个城镇列表,其中城镇附近的东西与该城镇记录的距离在x以内。纬度和经度将用于距离计算 我已经研究了一些其他问题,并设法从单个指定城镇的事物中获取记录,但我不知道如何获取所有城镇的列表,这些城镇附近的事物距离小于x距离 能够根据x距离内附近事物的数量对结果城镇进行排序将是一个额外的好处 TOWNS +--------+----------+---------+---------+ | townId | townName | townLa
towns
和things
,需要获得一个城镇列表,其中城镇附近的东西与该城镇记录的距离在x
以内。纬度和经度将用于距离计算
我已经研究了一些其他问题,并设法从单个指定城镇的事物
中获取记录,但我不知道如何获取所有城镇的列表,这些城镇附近的事物
距离小于x
距离
能够根据x
距离内附近事物的数量对结果城镇进行排序将是一个额外的好处
TOWNS
+--------+----------+---------+---------+
| townId | townName | townLat | townLng |
+--------+----------+---------+---------+
| 1 | town a | 1.5 | 1.9 |
| 2 | town b | 1.4 | 3.8 |
| 3 | town c | 2.3 | 2.7 |
| 4 | town d | 3.2 | 1.6 |
| ... | ... | ... | ... |
+--------+----------+---------+---------+
THINGS
+---------+-----------+----------+----------+
| thingId | thingName | thingLat | thingLng |
+---------+-----------+----------+----------+
| 1 | thing a | 2.1 | 3.1 |
| 2 | thing b | 1.1 | 2.3 |
| 3 | thing c | 3.2 | 0.2 |
| 4 | thing d | 1.3 | 1.1 |
| ... | ... | ... | ... |
+---------+-----------+----------+----------+
提前感谢您可以进行
交叉连接
以获得所有可能的城镇和事物组合,然后计算每个城镇和事物之间的哈弗斯线距离。我使用选择DISTINCT
来确保一个城镇在结果集中只列出一次
SELECT DISTINCT TOWNS.townName FROM
TOWNS CROSS JOIN THINGS
WHERE 3959 * acos(
cos(radians( TOWNS.townLat ))
* cos(radians( THINGS.thingLat ))
* cos(radians( TOWNS.townLng ) - radians( THINGS.thingLng ))
+ sin(radians( TOWNS.townLat ))
* sin(radians( THINGS.thingLat ))
) < x
从中选择DISTINCT TOWNS.townName
城镇交叉连接事物
其中3959*acos(
cos(弧度(TOWNS.townLat))
*cos(弧度(THINGS.thingLat))
*cos(弧度(TOWNS.townLng)-弧度(THINGS.thingLng))
+罪恶(弧度(城镇)
*罪恶(弧度)
)
我使用的公式是以英里为单位的
x
(地球的平均半径是3959英里)。这里的大问题是使用哈弗森公式来确定两组纬度/经度对之间的距离。您在这方面做过任何工作吗?使用该模式,任何解决方案都会在数千行以上变得非常缓慢。你基本上要计算从每个城镇到每件事物的距离。还没有-我不知道从哪里开始。我似乎无法理解如何在一个查询中将公式应用于两个表的坐标。@Vatev-有什么建议吗?mysql中已经没有关于距离计算的主题了,这正是我现在需要的。谢谢