Долгое время в QGIS отсутствовала возможность отображать результаты пространственных SELECT-запросов к базам PostGIS. Другими словами не было возможности отобразить на карте результат чего-то похожего на
SELECT id, st_union(the_geom) FROM spatial_table GROUP BY id;
Но теперь, благодаря работе проделанной Giuseppe Sucameli и Jurgen E. Fischer это стало возможным. Недавно принятый патч позволяет выполнять произвольные запросы через провайдер PostgreSQL.
К сожалению, на сегодняшний день пользовательский интерфейс отсутствует, но пользоваться этой несомненно полезной функцией можно из Консоли Python. Например этот код можно использоваться чтобы взять слой растительности из БД Geosample и выполнить операцию объединения по полю eco_name_1:
db_conn = "dbname='geosample' host=gis-lab.info port=5432 user='guest' password='guest'" id_field = "eco_name_l" table = "(select eco_name_l, st_union(the_geom) as the_geom from ecoregions group by eco_name_l)" uri = "%s key=%s table='%s' (the_geom) sql=" % ( db_conn, id_field, table, ) layer = QgsVectorLayer( uri, "testlayer", "postgres" )
созданный слой можно добавить на карту:
QgsMapLayerRegistry.instance().addMapLayer( layer )
Кроме того, можно обращаться к объектам слоя и выполнять измерения
provider = layer.dataProvider() feat = QgsFeature() provider.select([], QgsRectangle()) provider.nextFeature(feat) dist = QgsDistanceArea() dist.measure(feat.geometry())
См. также пост в блоге Carson Farmer’а