确定某个点是否在某个区域内

时间:2011-09-19 06:17:17

标签: mysql database map geolocation

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

我想知道一组坐标的任何坐标是否位于其中一个区域内,如果是,则指定哪个坐标和哪个区域。这可以通过一次在一个区域内找到每个区域内的所有点,或者通过找出每个点是否一次位于一个区域内来完成。

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

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

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

我也查看了Google Fusion Tables,找不到符合我想要的SQL查询(并不意味着没有一个 - 我只是错过了它)。

2 个答案:

答案 0 :(得分:2)

为了记录,我最终使用geodjango和支持mysql数据库。

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。

答案 1 :(得分:1)

对于有兴趣使用Fusion Tables解决此问题的任何人,您可以使用ST_INTERSECTS

  

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

  对于&lt; location_column&gt;,请使用&lt; column_name&gt;在你的表中   包含位置数据。

     

对于&lt; geometry&gt;,请使用以下其中一项:

     
      
  • &LT;圆&GT;
  •   
  • &LT;矩形&GT;
  •   
     

ST_INTERSECTS不能与ORDER BY ST_DISTANCE结合使用。

不幸的是,您无法直接使用LATLNG。但是,CIRCLE s可以小到1米。以下内容应该足够好了:

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