确定一个点是不是在一个区域内

Posted

技术标签:

【中文标题】确定一个点是不是在一个区域内【英文标题】: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 查询(并不意味着没有 - 我只是错过了)。

【问题讨论】:

【参考方案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 结果经常出现这种情况)。

以上是关于确定一个点是不是在一个区域内的主要内容,如果未能解决你的问题,请参考以下文章

查找一个点(纬度,经度)是不是在 OpenStreetMaps“方式”(区域)内

如何判断一个指定的经纬度点是不是落在一个多边形区域内

确定一个点是不是在球面的一部分内

确定 CGPoint 是不是在图像区域内

怎么判断一个点是不是在多边形区域内

OpenGL如何检查一个点是不是在由伯恩斯坦曲线组成的区域内