Определить, находится ли точка в пределах области - PullRequest
1 голос
/ 19 сентября 2011

У меня есть файл kml, который содержит много регионов (скажем, здания или свойства). Формы могут быть сложными (не только прямоугольники, но потенциально n-сторонними или даже выпуклыми), но по большей части они будут небольшими (не более 1 км в сторону). Потенциально существуют десятки тысяч координат и сотни (может быть, тысячи) регионов.

Я хочу знать, находится ли какая-либо координата набора координат в одной из этих областей, и если да, то какие координаты и какие области. Это можно сделать, найдя все точки в каждом регионе по одному региону за один раз или выяснив, находится ли каждая точка в пределах региона по одной точке за раз.

Я надеюсь на какое-то решение на основе базы данных, но я открыт для любого решения.

Приложение будет запущено на экземпляре Amazon EC2, поэтому было бы неплохо что-то совместимое с RDS)

Предварительным решением будет ST_WITHIN или ST_CONTAINS или ST_INTERSECTS в mysql, но мне неясно, чем они отличаются.

Я также посмотрел таблицы Google Fusion и не могу найти SQL-запрос, который выполняет то, что я хочу (это не значит, что его нет - я просто пропустил его).

Ответы [ 2 ]

2 голосов
/ 08 июля 2012

Для справки, я закончил тем, что использовал 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 голос
/ 08 июля 2012

Для всех, кто заинтересован в использовании Fusion Tables для решения этой проблемы, вы можете использовать ST_INTERSECTS :

Используется в предложении WHERE.Синтаксис: ST_INTERSECTS(<location_column>, <geometry>)

Для, использоватьв таблице, содержащей данные о местоположении.

Для используйте одно из следующих значений:

ST_INTERSECTS нельзя комбинировать с ORDER BY ST_DISTANCE.

К сожалению, вы не можете использовать LATLNG напрямую.Однако CIRCLE s может составлять всего 1 метр.Следующее должно быть достаточно хорошо:

select * from <table> where st_intersects(<column>,
circle(latlng(<latitude>, <longitude>), 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...