Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择附近有东西的城镇_Mysql_Distance - Fatal编程技术网

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中已经没有关于距离计算的主题了,这正是我现在需要的。谢谢