Получите функции, запросив шейп-файл

У меня есть шейп-файл, и я хотел бы запросить объекты, которые находятся внутри геометрии (многоугольника), выполнив сценарий SQL. Я использую библиотеку Python osgeo для выполнения запросов:

shapefile = osgeo.ogr.Open(file)
layer = shapefile.GetLayer()
driver = osgeo.ogr.GetDriverByName('ESRI Shapefile')
layer = shapefile.GetLayer()
test = shapefile.ExecuteSQL('select * from "%s"' % layer.GetName())

Однако я понятия не имею, как изменить этот оператор выбора, чтобы выбрать элементы, которые находятся внутри многоугольника (например, POLYGON (12.578608968 55.6344916225, 12.578625747 55.6344383472, 12.5791438324 55.633937277, 12.5792915832 55.6339468684, 12.5792915832 55.6339468684, 12.5692539441) 55.6339468684, 12.5692539441. Моя интуиция подсказывала, что это будет примерно так:

select * from layer
where geometry in Polygon(.....)

Я могу сделать это с помощью графического интерфейса пользователя на рабочем столе QuantumGIS, поэтому должна быть возможность запрашивать функции и в SQL, хотя я не могу найти никаких ресурсов в Интернете.

Есть идеи для этого?


person Laurynas Stašys    schedule 08.12.2015    source источник
comment
Консоль QGIS (Python) подойдет?   -  person SIslam    schedule 08.12.2015
comment
Что ты имеешь в виду? Я не хочу использовать Qgis. У меня есть автономное приложение Python, в котором я хочу запросить шейп-файл.   -  person Laurynas Stašys    schedule 08.12.2015
comment
Вы хотите выделить один многоугольник внутри другого? Тогда вам нужно два полигона или отдельная геометрия? например школа внутри округа?   -  person SIslam    schedule 08.12.2015
comment
Я хочу выбрать точки (объекты из шейп-файла), которые находятся в многоугольнике   -  person Laurynas Stašys    schedule 08.12.2015
comment
Хорошо, тогда пример будет: Сколько школ приходится на округ X?   -  person SIslam    schedule 08.12.2015
comment
Очень близко. Однако вместо указания страны в качестве свойства мне нужно указать страну в виде многоугольника, и вместо запроса количества школ мне нужен список школ в многоугольнике.   -  person Laurynas Stašys    schedule 08.12.2015
comment
Немного непонятно, можете ли вы разместить фиктивные данные для обоих слоев?   -  person SIslam    schedule 08.12.2015
comment
Вы не предоставили достаточно информации для правильного ответа. Вы должны опубликовать схемы соответствующих слоев и поля, которые вы хотите вернуть. Кроме того, вам нужно чистое решение для базы данных или чистое решение на Python (возможно)? Вы также можете получить более качественную помощь по gis stackexchange.   -  person GrantD71    schedule 09.12.2015
comment
Я нашел решение, используя функцию SetSpatialFilter на слое. Хотя спасибо за ваши комментарии   -  person Laurynas Stašys    schedule 09.12.2015


Ответы (1)


Я думаю, что вам нужен метод Intersects, который определяет, два геометрии пересекаются друг с другом, сравнивая их следующим образом:

geomA.Intersects(geomB)

С помощью этого метода вы можете сохранить многоугольник, который хотите сравнить, в геометрию, а затем итерировать объекты в вашем шейп-файле, сравнивая каждый из них, чтобы увидеть, пересекает ли он желаемый многоугольник (с помощью GetNextFeature() или выполнив некоторый запрос, а затем итерацию результата установленный).

person DarkCygnus    schedule 08.01.2018