通过 MySQL 在半径中获取 zip 的问题

I w*_*ce. 9 mysql spatial geometry

我有一张邮政编码表,其中包括每个邮政编码的中心纬度和 lng。我使用它从任意点获取给定英里半径内的邮政编码列表。

我突然想到,仅仅因为 zip 的中心点不在给定的半径内,并不意味着 zip 本身不在半径内。

我用我超高级的艺术技巧在这里说明了这一点:

在此处输入图片说明

  • 绿色条纹斑点代表邮政编码 A、B 和 C。

  • 红色污点是每个邮政编码的地理中心

  • 紫红色圆点是目标位置,并且..

  • 块状蓝色圆圈距离目标位置 1 英里

如果我对粉红色污迹 1 英里半径内的所有邮政编码运行查询,则仅返回邮政编码 B 和 C,因为 zip A 的中心点不在 1 英里半径内,即使粉红色污迹本身显然在邮政编码 A 中。

SELECT *,
        p.distance_unit
                 * DEGREES(ACOS(COS(RADIANS(p.latpoint))
                 * COS(RADIANS(z.y))
                 * COS(RADIANS(p.longpoint) - RADIANS(z.x))
                 + SIN(RADIANS(p.latpoint))
                 * SIN(RADIANS(z.y)))) AS dist
  FROM standard_zip AS z
  JOIN (   /* these are the query parameters */
        SELECT  $lat  AS latpoint,  $lng AS longpoint,
                $miles AS radius,      69 AS distance_unit
    ) AS p ON 1=1
  WHERE z.y
     BETWEEN p.latpoint  - (p.radius / p.distance_unit)
         AND p.latpoint  + (p.radius / p.distance_unit)
    AND z.x
     BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
         AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
  ORDER BY dist
Run Code Online (Sandbox Code Playgroud)

我到底如何编写一个将在结果中包含 zip A 的查询?

如果需要,我可以访问每个邮政编码的空间/几何形状,如果需要,我可以将其添加到表格中,但我不知道如何在 MySQL 中将其用于此目的。


编辑:我花了一天时间阅读空间数据的 Oracle 和 MySQL 文档,并成功地将我的空间数据转换为 MySQL。如何编写使用几何列而不是经纬度的类似查询?我正在使用 2D 数据.. 几何仅是多边形和多多边形..

我想我有点想通了..

select
  *
from
  (
    select
      MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
      zip
    from
      zip_spatial
    group by
      zip
    order by
      miles asc
  ) d
where
  d.miles < 5
Run Code Online (Sandbox Code Playgroud)

如果有人有更好、更有效的解决方案,我会暂时保留悬赏。

l.l*_*ith 7

来自Oracle® Spatial Developer's Guide 11g 第 2 版 (11.2) 中的在 Oracle索引和查询空间数据

查询空间数据

Spatial 使用带有主要和次要过滤器操作的两层查询模型来解析空间查询和空间连接。术语两层表示执行两个不同的操作来解析查询。如果两个操作都被执行,则返回准确的结果集。

如果在该表上定义了空间索引,则不能将数据库链接 (dblink) 名称附加到查询中的空间表的名称。

空间查询

在空间 R 树索引中,每个几何图形都由其最小边界矩形 (MBR) 表示。考虑下面包含图 1 中几个对象的层。每个对象都标有其几何名称(geom_1 表示线串,geom_2 表示四边多边形,geom_3 表示三角形多边形,geom_4 表示椭圆),每个对象周围的 MBR 用虚线表示。

图 1 具有 MBR 的几何结构

“图 1 具有 MBR 的几何图形”的描述

典型的空间查询是请求位于查询窗口(即定义的围栏或窗口)内的所有对象。动态查询窗口是指一个在数据库中没有定义但必须在使用前定义的矩形区域。图 2 显示了与图 1 相同的几何图形,但添加了一个由粗虚线框表示的查询窗口。

图 2 带有查询窗口的图层

“带有查询窗口的 F​​igure2 图层”的描述

在图 2 中,查询窗口包含几何 geom_1 和 geom_2 的一部分,以及 geom_3 的 MBR 的一部分,但没有包含实际的 geom_3 几何。查询窗口不覆盖 geom_4 几何或其 MBR 的任何部分。

初级过滤器操作符

SDO_FILTER 运算符实现 Oracle Spatial 查询处理模型中涉及的两步过程的主要过滤器部分。初级过滤器仅使用索引数据来确定一组候选对象对是否可以交互。具体来说,主过滤器检查候选对象的 MBR 是否交互,而不是对象本身是否交互。SDO_FILTER 运算符语法如下:

SDO_FILTER(geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY, param VARCHAR2)
Run Code Online (Sandbox Code Playgroud)

在前面的语法中:

  • geometry1 是表中 SDO_GEOMETRY 类型的列。此列必须进行空间索引。

  • geometry2 是 SDO_GEOMETRY 类型的对象。该对象可能来自也可能不来自表。如果它来自一个表,它可能会或可能不会被空间索引。

  • param 是 VARCHAR2 类型的可选字符串。它可以指定 min_resolution 和 max_resolution 关键字之一或两者。

以下示例仅执行初级过滤器操作(没有次级过滤器操作)。它们将返回图 2 中显示的所有几何图形,这些几何图形具有与查询窗口交互的 MBR。以下示例的结果是几何图形 geom_1、geom_2 和 geom_3。

Example1 在不将查询窗口插入到表中的情况下执行初级过滤操作。该窗口将在内存中建立索引,性能会非常好。

Example1带有临时查询窗口的主过滤器

SELECT A.Feature_ID FROM TARGET A  WHERE sdo_filter(A.shape, SDO_geometry(2003,NULL,NULL,
                                       SDO_elem_info_array(1,1003,3),
                                       SDO_ordinate_array(x1,y1, x2,y2))
                           ) = 'TRUE';   
Run Code Online (Sandbox Code Playgroud)

在 Example1 中,(x1,y1) 和 (x2,y2) 是查询窗口的左下角和右上角。


Ric*_*mes 5

任何包含 A 的尝试都可能包含 D、E、F、G。如果没有定义每个邮政编码区域的确切路径,则无法解决问题。

找到这样的数据库,然后SPATIAL使用这样的任意多边形构建索引。