【问题标题】:Which polygon is the coordinate in?坐标在哪个多边形?
【发布时间】:2016-03-26 23:13:53
【问题描述】:

在 MySQL 数据库中,假设我有成对的 lat/lng 点,它们在地图上创建了数万个多边形。给定一对 lat/lng 点,我如何找出它所在的多边形?

这似乎显示了如何判断一对纬度/经度坐标是否在多边形内:MySQL: Spatial Query to find whether a latitude/longitude point is located within a given boundary。如果我只需要针对一个多边形检查 lat/lng 对,那就太好了,但我有很多多边形。

我的感觉是我不能即时执行此操作(我假设 SQL 查询会非常大,以至于我会超过 MySQL 在字符数方面的某些限制)。也许我需要遍历每个多边形并针对 lat/lng 对进行测试——然后存储某种布尔标志来指示该对是否在多边形内。这对我来说似乎效率很低。

建议?

【问题讨论】:

    标签: mysql gis geospatial coordinate


    【解决方案1】:

    我假设这些对也有一个相应的值,通过它可以将它们分组为多边形。如果您为每个组提供两对在多边形周围形成“矩形”的坐标,则可以通过简单的 SQL 比较来显着限制搜索。

    后面的点是否包含在实际多边形中的计算似乎仅使用 SQL 实际上是不可能的。

    这是一个建议。

    【讨论】:

      【解决方案2】:

      你的多边形变化有多快?如果它们是相当静态的,您可以使用实际的 GIS 应用程序来制作成千上万个多边形的地图。然后,您基本上可以通过坐标查找多边形 id 并将其转换为 O(1) 问题。有时,数据库并不是您工具箱中唯一的锤子。

      【讨论】:

        【解决方案3】:

        您可以通过一个查询来完成此操作,但您首先需要将多边形作为适当的几何图形存储在 mysql 中。

        与其列出一长串点,不如编写一个脚本来获取你的点并制作多边形。

        CREATE TABLE mypolys (polyid INTEGER, g GEOMETRY);
        

        假设您的积分表有某种多边形,您可以遍历它们并组合您的积分(使用您选择的代码)。在您的代码中的某处,您将拥有如下 sql:

        INSERT INTO mypolys (polyid, g)
        VALUES(pid, PolygonFromText('POLYGON((
          x1 y1,
          x2 y2,
          x3 y3,
          x4 y4
          ))')
        );
        

        一旦你对所有的多边形都做了这些,查询一个点是否在一个多边形中(以及哪个)是这样的:

        SELECT polyid FROM mypolys 
        WHERE ST_CONTAINS(mypolys.g, Point(point_lon, point_lat))
        

        利用“几何”类型为您提供的空间索引。

        【讨论】:

        • 如果我按照您的建议将所有 lat/lng 点放在 GEOMETRY 列中,有没有办法将其转换回 lat/lng 值?我仍然需要它们在 Google 地图上绘制多边形。
        • 当然!像现在一样存储它们并使用 polyid 字段来维护到多边形的链接......这样您就可以在一个表中对您的点进行原始访问,并在另一个表中访问空间几何。您也可以将它们存储为“POINT”几何。但是,如果您存储在 2 个地方,那么即使某些内容得到更新,您也需要使用一些代码对其进行排序。另一种可能性是只将它们存储为多边形,当你显示时,只渲染为点(如果有一个选项......即清除多边形填充,没有线,只有点)。
        猜你喜欢
        • 2012-07-05
        • 2015-08-04
        • 2017-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多