mysql圆的范围_使用MySQL空间扩展在圆内选择点

本文详细介绍了如何在MySQL中进行地理空间距离计算,特别是针对经纬度的Haversine公式应用,以及如何通过查询找到特定半径内的点。内容包括如何处理不同UTM区域的计算,以及使用MySQL的几何图元和空间索引来提高效率。
摘要由CSDN通过智能技术生成

小编典典

MySQL中没有支持纬度/经度距离计算的地理空间扩展功能。 从MySQL

5.7开始。

您正在要求地球表面上的邻近圆。您在问题中提到flags表中的每一行都有纬度/经度值,并且在几个不同的UTM区域之一中还具有通用横向墨卡托(UTM)投影值。如果我正确记得我的英国军械测量局地图,则UTM可用于在这些地图上定位项目。

计算UTM中 同一区域 中两个点之间的距离很简单:笛卡尔距离就可以解决问题。但是,当点位于不同区域时,该计算将无法进行。

因此,对于您问题中所述的应用,必须使用大正圆距离,该距离是使用Haversine或其他合适的公式计算得出的。

MySQL加上地理空间扩展,支持一种将各种平面形状(点,折线,多边形等)表示为几何图元的方法。MySQL

5.6实现了一个未记录的距离函数st_distance(p1, p2)。但是,此函数返回笛卡尔距离。因此,它 完全不适合

基于纬度和经度的计算。在温带纬度下,纬度的纬向对向度几乎是经度(东西向)对向度的两倍,这是因为纬度线越靠近两极越靠近。

因此,圆形近似公式需要使用真实的纬度和经度。

在您的应用程序中,可以通过以下查询找到flags给定十英里内的所有点latpoint,longpoint:

SELECT id, coordinates, name, r,

units * DEGREES( ACOS(

COS(RADIANS(latpoint))

* COS(RADIANS(X(coordinates)))

* COS(RADIANS(longpoint) - RADIANS(Y(coordinates)))

+ SIN(RADIANS(latpoint))

* SIN(RADIANS(X(coordinates))))) AS distance

FROM flags

JOIN (

SELECT 42.81 AS latpoint, -70.81 AS longpoint,

10.0 AS r, 69.0 AS units

) AS p ON (1=1)

WHERE MbrContains(GeomFromText (

CONCAT('LINESTRING(',

latpoint-(r/units),' ',

longpoint-(r /(units* COS(RADIANS(latpoint)))),

',',

latpoint+(r/units) ,' ',

longpoint+(r /(units * COS(RADIANS(latpoint)))),

')')), coordinates)

如果要搜索20公里内的点,请更改查询的这一行

20.0 AS r, 69.0 AS units

例如,对此

20.0 AS r, 111.045 AS units

r是您要搜索的半径。 units是地球表面每个纬度的距离单位(英里,公里,弗隆,无论您想要什么)。

该查询使用边界纬度/经度以及MbrContains来排除绝对距起点太远的点,然后使用大圆距离公式生成其余点的距离。所有这些的解释可以在这里找到。如果您的表使用MyISAM访问方法并且具有空间索引,MbrContains则将利用该索引来快速搜索。

最后,上面的查询选择矩形内的所有点。要将其范围缩小到圆上的点,并按接近度对其进行排序,请像下面这样包装查询:

SELECT id, coordinates, name

FROM (

/* the query above, paste it in here */

) AS d

WHERE d.distance <= d.r

ORDER BY d.distance ASC

2020-05-17

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值