距离纬度/经度距离内查询的结果很奇怪

时间:2011-01-15 23:03:09

标签: mysql geolocation

我在这里得到了一个查询帮助查找具有一定半径点(lat / lng)的记录。该查询非常适合查找与实际中心不太接近的记录。所以它可以在400英里内找到东西,但不能找到20。

我正在使用MySQL。这是查询:

select id , lat , lng , ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) *
cos( radians( lng ) - radians(-122.517349) ) + sin( radians(37.780182) ) * sin( radians( lat ) ) ) ) AS distance FROM my_table HAVING distance < 1000 ORDER BY distance LIMIT 0 , 50

这是一个小数据集:

    lat           lng
|  0.000000 |    0.000000 |
| 37.223465 | -122.090363 |
| 39.320980 | -111.093735 |
| 38.031715 |  -84.495132 |
| 37.787144 | -122.493263 |
| 52.975361 |   -1.458620 |
| 40.848557 | -111.906883 |
| 40.572498 | -111.859718 |

我的中心起点是旧金山,即la / lng为37.787144,-122.493263

所以没有找到附近的纬度/经度。

谢谢你, 亚历

3 个答案:

答案 0 :(得分:1)

您的select语句(37,-122.517349,37.780182)中有一些与您的中心点不对应的硬编码值。

答案 1 :(得分:0)

纬度是37还是37.780182可能有助于保持一致。

acos背后的理论基础是什么(cos(LAT0)* cos(LAT1)* cos(LNG1-LNG0)+ sin(LAT0)* sin(LAT1)))?如果你将地球建模为一个球体,那么你需要acos(三维嵌入的点积),它是acos(cos(LAT0)* cos(LAT1)+ sin(LAT0)* sin(LAT1)*(cos(LNG0) )* cos(LNG1)+ sin(LNG0)* sin(LNG1)))。

答案 2 :(得分:0)

使用完之后,我制作了一个教程和一个将地址转换为lat / lng的工具。也许它会有所帮助:http://www.comehike.com/utils/address_to_geolocation.php