sql语句怎么写算坐标经纬度之间的距离?我是mysql数据库。 请详细点!谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句怎么写算坐标经纬度之间的距离?我是mysql数据库。 请详细点!谢谢!相关的知识,希望对你有一定的参考价值。

给大家一条语句能执行的地方
SELECT id, ( 6371* 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 id LIMIT 20 数据库中查找 距离 37,-122 距离 小于25公里的 经纬度
以前看GOOGLE 地图 API 开发时候的一篇文章里面有 给分 给分追问

大神啊,我要精确到50米以内啊,不过分还是给你好了。

参考资料:https://developers.google.com/maps/articles/phpsqlsearch?hl=zh-CN

参考技术A 你可以在系统中创建一个二维数组,把每个坐标作为一个二维数组存储起来,写一个方法,输入2个坐标的时候,自动计算两个坐标之间的距离。
比如我的坐标是:2,3;你的坐标是4,6
那么定义一个方法:
public double getDistance(double x1,double y1,double x2,double y2)
double a = Math.abs(x1-x2);//绝对值
double b = Math.abs(y1-y2);//绝对值
return Math.hypot(a,b);//返回两者的平方和的开根
追问

public double getDistance(double longt1, double lat1, double longt2,double lat2)
private final double PI = 3.14159265358979323; //圆周率
private final double R = 6371229; //地球的半径
double x,y,distance;
x=(longt2-longt1)*PI*R*Math.cos( ((lat1+lat2)/2) *PI/180)/180;
y=(lat2-lat1)*PI*R/180;
distance=Math.hypot(x,y);
return distance;

追答

你写的基本上没什么问题,但是PI和R的修饰符去掉private,因为定义在方法内部,它们的作用于只限制于方法内部,没必要加上private等范围修饰符,而且编译也没法通过。
其他的你注意你的计算公式吧,我看你好像用到了弧度计算公式,这个我不太记得了,你可以搜索一下,带入需要的值就行了。
我给你一个建议:你把两点放到一个切面上,计算出两点的直线距离,然后计算角度,最后在计算弧度,这样的结果更精确。没法给你具体的3D效果图。可以自己画图研究研究。。。

好吧,如果你是需要这个的话,下面的 链接可以帮助你;
http://blog.sina.com.cn/s/blog_73ca77220100qhn3.html

参考技术B 这单用SQL语句是办不到的吧
应该先把坐标从数据库中取出,再用三角函数计算。
或者在存入数据库之前,先把距离计算出来,一并存入。
参考技术C 这不是单独一个SQL语句能解决的问题追问

那我该怎么做啊?

追答

写在你的程序里 你开发用的什么语言 比如java 将从数据库获得的2点坐标传到客户端 然后在代码里计算就好了 单独用sql语句不行

追问

我之前是这么做的,功能都能实现
但是经理说这样效率低,要用sql

python 笔记 haversine (两个经纬度坐标之间的距离)

1 安装包

pip install haversine

2 haversine:计算两个点经纬度之间的距离

from haversine import haversine
lyon = (45.7597, 4.8422)
paris = (48.8567, 2.3508)

haversine(lyon, paris)
#392.2172595594006 默认是公里

haversine(lyon, paris, unit=Unit.MILES)
#单位设置为英里
#243.71250609539814

haversine(lyon, paris, unit='mi')
#243.71250609539814

3 Unit——支持的所有单位

from haversine import Unit

tuple(Unit)
'''
(<Unit.KILOMETERS: 'km'>,
 <Unit.METERS: 'm'>,
 <Unit.MILES: 'mi'>,
 <Unit.NAUTICAL_MILES: 'nmi'>,
 <Unit.FEET: 'ft'>,
 <Unit.INCHES: 'in'>,
 <Unit.RADIANS: 'rad'>,
 <Unit.DEGREES: 'deg'>)
'''

4 inverse haversine

        从给定的向量(距离和方向)和起点计算点。

        目前明确支持(北,东,南,西)和(东北,东南,西南,西北)方向。但也允许以弧度表示的角度。

from haversine import inverse_haversine, Direction
from math import pi
paris = (48.8567, 2.3508) # (lat, lon)

inverse_haversine(paris, 32, Direction.WEST)
#(48.85587279023947, 1.9134085092836945)

inverse_haversine(paris, 50, Direction.NORTH, unit=Unit.MILES)
#(49.58035791599536, 2.3508

inverse_haversine(paris, 32, pi * 1.25)
#(48.65279552300661, 2.0427666779658806)

5 haversine_vector

from haversine import haversine_vector, Unit

lyon = (45.7597, 4.8422) # (lat, lon)
paris = (48.8567, 2.3508)
new_york = (40.7033962, -74.2351462)

haversine_vector([lyon, lyon,lyon], [paris, new_york,lyon], Unit.KILOMETERS)
#array([ 392.21725956, 6163.43638211,    0.        ])
#分别是 lyon-paris,lyon-new_york,lyon-lyon的距离

5.1  comb=True

from haversine import haversine_vector, Unit

lyon = (45.7597, 4.8422) # (lat, lon)
london = (51.509865, -0.118092)
paris = (48.8567, 2.3508)
new_york = (40.7033962, -74.2351462)

haversine_vector([lyon, london], [paris, new_york], Unit.KILOMETERS, comb=True)
'''
array([[ 392.21725956,  343.37455271],
       [6163.43638211, 5586.48447423]])
'''

 

以上是关于sql语句怎么写算坐标经纬度之间的距离?我是mysql数据库。 请详细点!谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

mysql实现经纬度计算两个坐标之间的距离sql语句

一个纬度/经度坐标与使用 SQL 的固定坐标之间的近似距离

sql怎么将一系列点经纬度坐标匹配到某市

利用SQL计算两个地理坐标(经纬度)之间的地表距离

C# 在 Linq 查询 WHERE 语句中返回两个纬度/经度坐标之间的计算距离

怎么算经纬度和距离呢?