当前位置: 首页 > 面试题库 >

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

仲俊豪
2023-03-14
问题内容

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

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

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

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

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

标志表:

  • ID
  • 座标
  • 名称

示例行:

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

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

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


问题答案:

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


 类似资料:
  • 问题内容: 我是Jenkins的新手,所以这可能很简单。我安装了扩展选择参数插件。我正在使用“多重选择”参数类型从服务器列表(SERVER1,SERVER2,SERVER3)中进行选择,我已将“源”设置为“值”,“默认值”和“值描述”。 我保存了,看起来很棒。我可以选择任何或所有服务器进行构建。现在是一个大问题。如何在构建中使用这些值?基本上,我在构建过程中采取了一个步骤,该步骤可以接受用逗号分隔

  • 目录 19.1. 前言 19.2. OpenGIS几何模型 19.2.1. Geometry类的层次 19.2.2. 类Geometry 19.2.3. 类Point 19.2.4. 类Curve 19.2.5. 类LineString 19.2.6. 类Surface 19.2.7. 类Polygon 19.2.8. 类GeometryCollection 19.2.9. 类MultiPoint

  • 问题内容: 我有一个项目类和一个紧凑的“修饰符”类: 这可以。但是,我想添加一个查询,以在屏幕足够小时强制类紧凑。 乍一想,这就是我试图做的事情: 但这会产生以下错误: 您不能从@media内部扩展外部选择器。您只能在同一指令中使用@extend选择器。 我如何使用SASS来完成此任务而不必诉诸复制/粘贴样式? 问题答案: 简单的答案是:您不能这样做,因为Sass不能(或不会)为其构成选择器。您不

  • 在Docx4j中,是否有机会禁用以SHIFT-RETURN结尾的行上的字符空格?我正在将html文本转换为。docx文件和我在对齐文本上面临这个问题。MsWord中有特殊的布局选项,希望docx4j中有一个。 结果:

  • 问题内容: 因此,我的程序需要一种圆形ArrayList。 唯一的循环问题必须是get(int index)方法,这是原始方法: 如果index为-1,则应获取索引为ArrayList.size()-1的元素;如果index为ArrayList.size(),则应获取索引为0的元素。 我想到的最简单的方法是从java.util包扩展ArrayList并覆盖get(int index),这样它就不会

  • PHP 中的 mysql 扩展已经非常陈旧了,现在已经被两个后继者所取代: mysqli pdo 不仅仅是因为 mysql 扩展的开发工作早已停滞很久了,并且已经 从 PHP 5.5.0 以后被废弃 了,而且已经 被官方从 PHP 7.0 中剔除了。 为了避免到 php.ini 中查找你正在使用哪个扩展模块而浪费力气,另一种方法是利用你顺手的编辑器查找任何以 mysql_* 开头的函数。如果找到任