我在这里得到了一个查询帮助查找具有一定半径点(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
所以没有找到附近的纬度/经度。
谢谢你, 亚历
答案 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