开发者社区> 问答> 正文

使用MySQL空间扩展在圆内选择点

我有一个名为的表flags,其中包含一个coordinates充满MySQL“点”的列。我需要执行一个查询,以基于半径为100m的经度和纬度获取一个圆内的所有标志。

从使用的角度来看,这是基于用户的位置。例如,移动电话将给出用户的纬度和经度位置,然后将其传递给API的这一部分。然后由API围绕用户创建一个半径为100米的不可见圆,然后返回该圆中的标志。

这是API的这一部分,我不确定如何创建,因为我不确定如何使用SQL创建此不可见的圆并仅选择该半径内的点。

这可能吗?有MySQL空间功能可以帮助我做到这一点吗?

我相信该Buffer()函数可以做到这一点,但是我找不到有关如何使用它的任何文档(例如示例SQL)。理想情况下,我需要一个答案,向我展示如何使用此功能或最接近它的功能。在将这些坐标存储为地理空间点的地方,我应该使用地理空间函数来执行我要最大化效率的工作。

标志表:

ID 座标 名称 示例行:

1 | [几何-25B] | Tenacy AB

对于标志表,我有纬度,经度位置以及东和北(UTM)

用户的位置只是标准的纬度/经度,但是我有一个可以将该位置转换为UTM的库

展开
收起
保持可爱mmm 2020-05-13 13:54:22 643 0
1 条回答
写回答
取消 提交回答
  • 您正在要求地球表面上的邻近圆。您在问题中提到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 来源:stack overflow

    2020-05-13 13:54:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像