48

我想从以下数据库表中找到最近的位置

Address                            Latitude                longitude 

Kathmandu 44600, Nepal              27.7                   85.33333330000005
Los, Antoniterstraße                37.09024               -95.71289100000001
Sydney NSW, Australia               49.7480755             8.111794700000019
goa india                           15.2993265             74.12399600000003

我已经从谷歌地图中获取了所有数据。在这里,我必须找到离某个地方最近的位置。假设我在 Surkhet 的地方,它的纬度是 28.6,经度是 81.6,我怎样才能找到距离 Surkhet 最近的地方。

4

7 回答 7

97

使用 MySQL 查找附近的位置

下面的 SQL 语句将找到距离 37, -122 坐标 25 英里半径范围内最近的 20 个位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅询问距离值小于 25 的行,按距离对整个查询进行排序,并将其限制为 20 个结果。要按公里而不是英里搜索,请将 3959 替换为 6371。

表结构:

id,name,address,lat,lng

注意 - 这里纬度 = 37 & 经度 = -122。所以你只是通过你自己的。

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * 
sin( radians( lat ) ) ) ) AS distance FROM your_table_name HAVING
distance < 25 ORDER BY distance LIMIT 0 , 20;

您可以在此处找到详细信息。

于 2012-06-20T04:52:48.190 回答
28
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
于 2012-07-25T05:27:26.973 回答
3

要查找附近的位置,您可以使用地理编码器类。由于您有地理点(纬度和经度),因此可以使用反向地理编码。 反向地理编码是将(纬度、经度)坐标转换为(部分)地址的过程。查看以获取更多信息。

于 2012-06-20T06:42:39.493 回答
1
SELECT latitude, longitude, SQRT(
    POW(69.1 * (latitude - [startlat]), 2) +
    POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;

其中[starlat][startlng]是开始测量距离的位置,25 是以公里为单位的距离。

建议使用存储过程来使用查询,因为它会检查很多行来查找结果。

于 2017-07-14T11:17:59.377 回答
0

SQL有问题。在像这样的表中:

`ubicacion` (
  `id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT ,
  `latitud` DOUBLE NOT NULL ,
  `longitud` DOUBLE NOT NULL ,
  PRIMARY KEY (`id_ubicacion`) )

使用时的 id_ubicacion 变化:

SELECT  `id_ubicacion` , ( 3959 * ACOS( COS( RADIANS( 9.053933 ) ) * COS( RADIANS( latitud ) ) * COS( RADIANS( longitud ) - RADIANS( - 79.421215 ) ) + SIN( RADIANS( 9.053933 ) ) * SIN( RADIANS( latitud ) ) ) ) AS distance
FROM ubicacion
HAVING distance <25
ORDER BY distance
LIMIT 0 , 20
于 2013-03-07T15:02:28.207 回答
0

当该方法应该执行时,最好先过滤纬度和经度,然后计算平方距离近似值。对于北欧国家,1000 公里范围内会有 0.3% 的折扣。

因此,不要将距离计算为:

dist_Sphere = r_earth * acos ( sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1)

可以计算出近似值(假设 lat = lat 1 接近 lat 2)为

const cLat2 = cos lat ^ 2
const r_earth2 = r_earth ^ 2
dist_App ^2 = r_earth2 * ((lat 2 - lat 1) ^2 + clat2 *(lon 2 - lon 1) ^2)

按 Dist_App 2 排序,然后简单地从结果中取平方根。

于 2014-10-07T08:20:09.813 回答
0
sesach : ( 3959 * acos( cos( radians('.$_REQUEST['latitude'].') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$_REQUEST['longitude'].') ) + sin( radians('.$_REQUEST['latitude'].') ) * sin( radians( latitude ) ) ) ) <='.$_REQUEST['mile'];
于 2013-09-05T10:04:12.070 回答