【问题标题】:Determine if a point is within a region确定一个点是否在一个区域内
【发布时间】:2011-09-19 06:17:17
【问题描述】:

我有一个包含许多区域(例如建筑物或属性)的 kml 文件。形状可能很复杂(不仅仅是矩形,还可能是 n 边,甚至是凸面),但在大多数情况下,它们会很小(每边不超过一公里)。可能有数万个坐标和数百个(可能是数千个)区域。

我想知道一组坐标中的任何坐标是否在这些区域中的一个内,如果是,是什么坐标以及什么区域。这可以通过每次一个区域查找每个区域内的所有点来完成,或者通过一次一个点找出每个点是否位于一个区域内来完成。

我希望有某种数据库驱动的解决方案,但我愿意接受任何解决方案。

应用程序将在 Amazon EC2 实例上启动,因此与 RDS 兼容的东西会很好)

暂定的解决方案是 mysql 中的 ST_WITHIN 或 ST_CONTAINS 或 ST_INTERSECTS,但我不清楚它们之间的区别。

我还查看了 Google Fusion Tables,但找不到符合我要求的 SQL 查询(并不意味着没有 - 我只是错过了)。

【问题讨论】:

    标签: mysql database map geolocation


    【解决方案1】:

    为了记录,我最终使用了带有 mysql 数据库的 geodjango。

    RegionContainer.objects.filter(region_area__contains=Point(longitude, latitude))
    

    给出包含具有给定纬度和经度坐标的点的区域列表。 python/django代码变成sql查询。

    SELECT `locationapp_region_container`.`id`,
           `locationapp_region_container`.`profile_id`,
           AsText(`locationapp_region_container`.`region_area`) 
           FROM `locationapp_region_container` 
           WHERE MBRContains(`locationapp_region_container`.`region_area`,
           GeomFromText(POINT (80.6123000000000047 -43.2349804300000002)))
    

    因为后台数据库是 MySQL,所以支持 RDS。

    【讨论】:

      【解决方案2】:

      有兴趣使用 Fusion Tables 解决此问题的朋友,可以使用ST_INTERSECTS

      在 WHERE 子句中使用。语法为:ST_INTERSECTS(<location_column>, <geometry>)

      对于 ,在表中使用 包含位置数据。

      对于 ,使用以下之一:

      ST_INTERSECTS 不能与 ORDER BY ST_DISTANCE 组合。

      很遗憾,您不能直接使用 LATLNG。但是,CIRCLEs 可以小到 1 米。以下应该足够好:

      select * from <table> where st_intersects(<column>,
      circle(latlng(<latitude>, <longitude>), 1))
      

      【讨论】:

      • 我确实最终使用了融合表作为我的解决方案的一部分,但不是与这个问题相关的部分。我还试图完全摆脱 ft,因为向融合表发送辅助请求所涉及的额外延迟是不可取的。我确实喜欢这个解决方案允许点稍微不准确(gps 结果经常出现这种情况)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 2012-05-19
      • 2017-12-22
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多