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))

latlong 中的当前位置(不再需要余弦函数)。您是想先将所有传入的位置存储在数据库中,还是想在 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查找属于圆的坐标的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中的坐标系

在给定多边形坐标的情况下查找点属于哪个多边形的算法

找到圆的矩后出现奇怪的坐标

d3.js画圆弧和圆的坐标、弧长计算方法

圆心坐标怎么求的

计算几何如何计算两个圆的交点坐标