soso 地图 两个坐标的距离是如何计算出来的?还有 mysql 数据存储了 X,Y 坐标,如何让最近距离排列呢

2014-11-06 20:29:55 +08:00
 kstsca
3561 次点击
所在节点    问与答
8 条回复
fangzhzh
2014-11-06 20:43:16 +08:00
stackoverfkow
查 geo distance
fangzhzh
2014-11-06 20:46:14 +08:00
事实上 如果是MySQL 很简单 数据库公式直接套 数据库拿数据时直接排序 如果是SQLite 它不支持有些数学函数 所以需要你拿完 代码再排一次
kstsca
2014-11-06 20:59:09 +08:00
找到这个 #lat为纬度, lng为经度, 一定不要弄错
declare @lon1 float;
declare @lat1 float;
declare @lon2 float;
declare @lat2 float;
set @lon1=116.3899;
set @lat1=39.91578;
set @lon2=116.3904;
set @lat2=39.91576;
select (2*ATAN2(SQRT(SIN((@lat1-@lat2)*PI()/180/2)
*SIN((@lat1-@lat2)*PI()/180/2)+
COS(@lat2*PI()/180)*COS(@lat1*PI()/180)
*SIN((@lon1-@lon2)*PI()/180/2)
*SIN((@lon1-@lon2)*PI()/180/2)),
SQRT(1-SIN((@lat1-@lat2)*PI()/180/2)
*SIN((@lat1-@lat2)*PI()/180/2)
+COS(@lat2*PI()/180)*COS(@lat1*PI()/180)
*SIN((@lon1-@lon2)*PI()/180/2)
*SIN((@lon1-@lon2)*PI()/180/2))))*6378140;
@fangzhzh
fengchang
2014-11-06 21:38:05 +08:00
我做过一个附近的人,入库的时候用经纬度计算geohash,取的时候用geohash做字符串匹配,然后再用经纬度对取出的点计算精确距离。
013231
2014-11-06 22:53:14 +08:00
已知两点坐标求距离:
不要求十分精确的情况下, 可用大圆距离计算: https://en.wikipedia.org/wiki/Great-circle_distance 但地球并非球形, 此算法可能产生0.5%的误差.
如果需要精确计算距离, 可使用Vincenty公式: https://en.wikipedia.org/wiki/Vincenty's_formulae 误差 < 0.5mm.

在MySQL中查找距离最近的点:
http://stackoverflow.com/questions/2234204/latitude-longitude-find-nearest-latitude-longitude-complex-sql-or-complex-calc

顺便一提, MongoDB处理地理信息非常方便: http://docs.mongodb.org/manual/applications/geospatial-indexes/
Jaylee
2014-11-06 22:54:58 +08:00
geohash
husinhu
2014-11-06 22:59:33 +08:00
haversine vincenty 等等
sneezry
2014-11-07 00:14:37 +08:00
学渣第一眼想到的居然是勾股定理……我面壁去了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/144495

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX