Mysql SQL查找属于圆的坐标

Mysql SQL查找属于圆的坐标,mysql,sql,jpa,math,spring-boot,Mysql,Sql,Jpa,Math,Spring Boot,我有一个SQL数据库,其中有一组我被分配的坐标(lat,long)。我想问一下距离我的点5公里半径范围内的点。我想知道如何以不收集不必要记录的方式构造查询?我会选择Euklid距离=sqrt(功率(x1-x2,2)+功率(y1-y2,2))。它无处不在。如果度数不能很容易地转换为km,那么可能需要添加x/y坐标的转换 然后你可以去选择你喜欢的一切,其中x介于(x-5)和(x+5)之间,y介于(y-5)和(y+5)。现在您可以使用Euklid检查结果 通过优化结果顺序,您可以首先获得更好的结果。也

我有一个SQL数据库,其中有一组我被分配的坐标(lat,long)。我想问一下距离我的点5公里半径范围内的点。我想知道如何以不收集不必要记录的方式构造查询?

我会选择Euklid<代码>距离=sqrt(功率(x1-x2,2)+功率(y1-y2,2))。它无处不在。如果度数不能很容易地转换为km,那么可能需要添加x/y坐标的转换

然后你可以去选择你喜欢的一切
,其中x介于(x-5)和(x+5)之间,y介于(y-5)和(y+5)
。现在您可以使用Euklid检查结果


通过优化结果顺序,您可以首先获得更好的结果。也许还有一种方法可以将Euklid带到SQL。

因为你说的是大约5公里的小距离,我们可能不在北极或南极的直接附近,所以我们可以使用一个近似的经度和纬度值网格系统。以纬度表示的每度相当于距离
km/u/lat=6371km*2*pi/360度=111.195km
。两条相距1度的纵线之间的距离取决于实际纬度:

km_per_long=km_per_lat * cos(lat)
对于德国北部地区(北纬51度),该值约为69.98公里

因此,假设我们对lat0和long0附近的小距离感兴趣,我们可以安全地假设纵向和横向角度的平移因子将保持不变,我们可以简单地应用公式

SELECT 111.195*sqrt(power(lat-@lat0,2)
                   +power(cos(pi()/180*@lat0)*(long-@long0),2)) dist_in_km FROM tbl
由于要使用select的
WHERE
子句中的公式,因此可以使用以下公式:

SELECT * FROM tbl 
WHERE 111.195*sqrt(power(lat-@lat0,2)
                  +power(cos(pi()/180*@lat0)*(long-@long0),2)) < 5
通过应用
acos()
计算实际角度增量后,只需将该值乘以地球半径
R=6371km=180/pi()*111.195km
,即可获得所需距离(参见此处:)

更新(回复评论):

不知道你打算做什么。如果您只想比较一个参考位置,那么您当然可以像这样预编译距离计算

SELECT @lat0:=51,@long0:=-9;  -- assuming a base position of: 51°N 9°E
SELECT @rad:=PI()/180,@fx:=@rad*6371,@fy:=@fx*cos(@rad*@lat0);
然后,您的距离计算将简化为

SELECT @dist:=sqrt(power(@fx*(lat-@lat0),2)+power(@fy*(long-@long0),2))

当前位置位于
lat
long
(无需更多余弦函数)。这取决于您是否希望首先将所有传入位置存储在数据库中,或者是否希望在Spring、Java或任何您正在使用的语言之外的地方进行计算。方程式在那里,易于使用

什么数据库引擎和版本?到目前为止,您尝试了什么?我使用基于bootspring/Hibernate的MySQL数据库。我不知道我是否需要下载所有记录,然后计算它们与中心点的距离,如果我可以立即拉出查询。您需要的精度是多少?你能假设0.05英寸(纬度,长度)约为5公里吗?我想从数据库中找到距离预定中心点5公里半径内的所有点。以下是此应用程序的总结。笛卡尔距离不适用于纬度距离的计算,除非位置非常接近彼此和赤道。好吧,在我看来,5km非常接近。而且,正如我所说,可能需要进行转换,cars10对此做了很好的阐述;-)我想在使用Hibernate的BootSpring应用程序中使用它。直接在数据库中计算距离是否值得?从数据库中获取所有记录,然后选择它们是否更好?
SELECT @dist:=sqrt(power(@fx*(lat-@lat0),2)+power(@fy*(long-@long0),2))