我有一个包含许多区域(比如建筑物或属性)的kml文件。形状可能很复杂(不仅仅是矩形,但可能是n面,甚至是凸面),但大多数情况下它们都很小(一边不超过一公里)。可能存在数万个坐标和数百个(可能是数千个)区域。
我想知道一组坐标的任何坐标是否位于其中一个区域内,如果是,则指定哪个坐标和哪个区域。这可以通过一次在一个区域内找到每个区域内的所有点,或者通过找出每个点是否一次位于一个区域内来完成。
我希望有一种数据库驱动的解决方案,但我愿意接受任何解决方案。
该应用程序将在Amazon EC2实例上启动,因此与RDS兼容的东西会很好)
暂定解决方案是mysql中的ST_WITHIN或ST_CONTAINS或ST_INTERSECTS,但我不清楚它们之间的区别。
我也查看了Google Fusion Tables,找不到符合我想要的SQL查询(并不意味着没有一个 - 我只是错过了它)。
答案 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子句中使用。语法为:
对于&lt; location_column&gt;,请使用&lt; column_name&gt;在你的表中 包含位置数据。ST_INTERSECTS(<location_column>, <geometry>)
对于&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))