Запрос при подключении слоя из Postgis

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
sanyasi
Активный участник
Сообщения: 115
Зарегистрирован: 18 ноя 2009, 11:31
Репутация: 0

Запрос при подключении слоя из Postgis

Сообщение sanyasi » 03 июн 2012, 21:40

Подскажите, есть ли возможность, при подключении слоя из Postgis в Qgis (например линии или точки), вывод ограничить контуром города из таблицы asettlement-polygon с указанием id нужного города, или просто ограничить квадратом (координатами углов), кругом (центр, радиус), ну или еще как-нибудь.

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Запрос при подключении слоя из Postgis

Сообщение rhot » 04 июн 2012, 09:34

Обычными инструментами QGIS, по-моему, нельзя.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Запрос при подключении слоя из Postgis

Сообщение yellow-sky » 04 июн 2012, 09:38

Такая возможность есть, правда не очень френдли-юзер способом.
При добавлении слоя из постгис базы с помощью Query Builder вы можете ограничить выборку (тоже самое можно сделать уже и после добавления слоя, во вкладке General->Subset). К сожалению, Query Builder не имеет встроенных возможностей для построения пространственных запросов, так как он универсальный и работает со всеми провайдерами. Но за то, он и не ограничивает выражение SQL where clause, поэтому вы можете написать любое выражение, которое поддерживает ваша СУБД.
Как пример, для выборки городов попадающих в определенный полигон:

Код: Выделить всё

ST_Within(the_geom, ST_GeomFromText('POLYGON ((3529000 6306000, 3550000 6306000, 3550000 6336000, 3529000 6336000, 3529000 6306000 ))',3857))
Выборка городов, находящихся не далее 50км от указанной точки:

Код: Выделить всё

ST_Distance(the_geom, ST_GeomFromText( 'POINT(3529000 6306000)',3857))<50000
Выбор городов, лежащих внутри полигона, взятого из другой таблицы, с заданным id:

Код: Выделить всё

ST_Intersects(the_geom, (SELECT the_geom FROM rayons where gid = 913))
Если городов у вас не так много, то возможно будет проще создать вьюхи для каждого из полигонов. Тогда не придется мучить пользователей такими извращениями. Либо как вариант заготовить проекты с уже забитыми ограничениями для нужных слоев.

sanyasi
Активный участник
Сообщения: 115
Зарегистрирован: 18 ноя 2009, 11:31
Репутация: 0

Re: Запрос при подключении слоя из Postgis

Сообщение sanyasi » 04 июн 2012, 10:41

Спасибо - сейчас у меня st_dwithin(the_geom,'0101000020E6100000B9F30550EA7C414020327E2082874C40', 0.2), что видимо индексы не использует. Какой вариант предпочтительней?

С view - тоже пока не всё понятно
viewtopic.php?f=32&t=10765

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Запрос при подключении слоя из Postgis

Сообщение yellow-sky » 04 июн 2012, 10:53

Лучше не гадать, а проверить explain вашего запроса. Посмотрите в pgAdmin, юзаются индексы или нет. С ST_Within, ST_Dwithin должен использоваться. С ST_Distance - нет.

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя