SQL查找属于圆的坐标
Posted
技术标签:
【中文标题】SQL查找属于圆的坐标【英文标题】:SQL Finding the coordinates that belong to a circle 【发布时间】:2015-12-02 08:49:17 【问题描述】:我有一组 SQL 数据库,其中分配了坐标(纬度、经度)。我想问一下距离我的点5公里半径范围内的那些点。我想知道如何以不收集不必要记录的方式构造查询?
【问题讨论】:
什么数据库引擎和版本?到目前为止,您尝试过什么? 我使用基于 Boot Spring / Hibernate 的 mysql 数据库。不知道是不是需要把所有的记录都下载下来,然后再计算它们到中心点的距离,能不能马上拉出查询。 您需要的精度是多少?你能假设 0.05 in lat,long 大约是 5 公里吗? |我想从数据库中找到所有的点,例如。在距离我预定的中心点 5 公里的半径范围内。 这里是这个应用程序的一个记录。 plumislandmedia.net/mysql/haversine-mysql-nearest-loc 【参考方案1】:由于您说的是大约 5 公里的小距离,而且我们可能不在北极或南极附近,我们可以使用经度和纬度值的近似网格系统。纬度的每一度相当于km_per_lat=6371km*2*pi/360degrees = 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
由于您想在您的选择的WHERE
子句中使用公式,您可以使用以下内容:
SELECT * FROM tbl
WHERE 111.195*sqrt(power(lat-@lat0,2)
+power(cos(pi()/180*@lat0)*(long-@long0),2)) < 5
select 语句适用于以度数(十进制表示法)给出的纬度和经度值。因此,我们必须将cos()
函数中的值乘以pi()/180
,将其转换为弧度。
如果您必须处理更大的距离(>500 公里),那么最好应用导航中使用的适当距离公式,例如
cos(delta)=cos(lat0)*cos(lat)*cos(long-long0) + sin(lat0)*sin(lat)
通过应用acos()
计算出实际角度增量后,您只需将该值乘以地球半径R = 6371km = 180/pi()*111.195km
,即可获得所需的距离(参见此处:Wiki: great circle distance)
更新(回复评论):
不确定您打算做什么。如果您只想比较 一个 参考位置,那么您当然可以预编译您的距离计算,有点像
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 或您使用的任何语言之外的某个地方进行计算,这取决于您。方程在那里并且易于使用。
【讨论】:
我想在使用 Hibernate 的 Boot Spring 应用程序中使用它。直接在数据库中计算距离是否值得?从数据库中获取所有记录然后选择它们会更好吗?【参考方案2】:我会选择 Euklid。 dist=sqrt(power(x1-x2,2)+power(y1-y2,2))
。它无处不在。如果度数不能以公里为单位转换,也许您必须添加对 x/y 坐标的转换。
然后你可以去选择你喜欢的所有东西WHERE x IS BETWEEN (x-5) AND (x+5) AND y IS BETWEEN (y-5) AND (y+5)
。现在您可以使用 Euklid 检查结果。
通过对结果顺序的优化,您首先可以获得更好的结果。也许也有办法将 Euklid 带到 SQL 中。
【讨论】:
笛卡尔距离不适用于经纬度距离计算,除非位置非常靠近彼此和赤道。 嗯,在我看来,5公里已经很近了。而且,正如我所说,可能需要进行转换,cars10 对此进行了很好的阐述;-)以上是关于SQL查找属于圆的坐标的主要内容,如果未能解决你的问题,请参考以下文章