Chcę stworzyć akcję, która będzie dodawała do aktywnego projektu QGISa warstwy. Wujek Google podpowiedział, że trzeba zrobić akcję typu Python wyglądającą tak:
Kod:
qgis.utils.iface.addVectorLayer('/home/tomasz/gis/wektor/warstwa.shp','warstwa','ogr')
I super, działa! Tylko, że ja potrzebuję czegoś więcej
1. Warstwa, na której chcę mieć zrobioną akcję to warstwa poligonowa (konkretnie gminy).
2. Dodawana warstwa ma być z bazy PostGIS, a nie szejp jak w przykładzie.
3. Warstwa ma milion obiektów, a ja chcę tylko obiekty z danej gminy.
4. Obiekty mają atrybut mówiący o tym w jakiej gminie się znajdują ("gmina"), każdy obiekt znajduje się tylko w jednej gminie (czyli zapytanie wygląda tak: "gmina" LIKE 'Widawa')
Jak to ugryźć? Da się to w ogóle zrobić?
(20-01-2011, 11:54)tomalos napisał(a): [ -> ]Jak to ugryźć? Da się to w ogóle zrobić?
A co ma się nie dać
Kod:
qgis.utils.iface.addVectorLayer('/home/tomasz/gis/wektor/warstwa.shp|layerid=0|subset="costam" > 3','warstwa','ogr')
W przypadku postgresa będzie podobnie, trzeba poszperać w ogrowym formacie podawania źródła danych. Tylko ostrożnie, bo błąd podczas wykonywania zapytanie wywala cały program (zajmę się tym po weekendzie, tylko niech mi ktoś przypomni, pliz). Na przykład w przypadku szejpa dzieje się tak przy próbie pominięcia członu layerid, ale widzę, że niektóre szejpy w ogóle wywalają. Na dziś dzień trzeba niestety cierpliwie poszukać właściwego formatu, podnosząc program co chwila.
EDIT: Jednak nie widzę takich, co "w ogóle wywalają" ;-) Zawsze jest to błąd w zapytaniu, np. błędna ścieżka lub nazwa pola. Pusty wynik zapytania też nie jest groźny.
Super! Dzięki Borys, nie omieszkam przypomnieć się po niedzieli odnośnie wywoływania warstwy z bazy

Póki co natrafiłem na drobny problemy przy szejpach, pojawia się jeśli dane są tekstem i występują znaki z ogonkami, taka akcja:
qgis.utils.iface.addVectorLayer('/home/tomasz/Geoinformacja/wektor/rezeprzy.shp|layerid=0|subset="nzw" LIKE "Białaczów"','rezerwat','ogr')
generuje taki błąd:
Wystąpił błąd podczas wykonywania kodu Pythona:
Traceback (most recent call last):
File "/home/tomasz/.qgis/python/plugins/gmap_overview_plugin/gmap_gui.py", line 80, in onChangeExtent
html = html.replace('{scale}',str(self.getZoomScale()))
File "/home/tomasz/.qgis/python/plugins/gmap_overview_plugin/gmap_gui.py", line 97, in getZoomScale
return list(zoom).index(zoom.min())
ValueError: list.index(x): x not in list
Wersja Pythona:
2.6.5 (r265:79063, Apr 16 2010, 13:28:26)
[GCC 4.4.3]
Wersja QGIS:
1.7.0-Trunk Trunk, 15058M
Lokalizacja Pythona: ['/home/tomasz/.qgis/python/plugins/GeoCoding', '/home/tomasz/.qgis/python/plugins/GeoCoding', '/home/tomasz/.qgis/python/plugins/elevation', '/home/tomasz/.qgis/python/plugins/cswclient', '/usr/share/qgis/python', '/home/tomasz/.qgis/python', '/home/tomasz/.qgis/python/plugins', '/usr/share/qgis/python/plugins', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/pymodules/python2.6', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode', '/usr/local/lib/python2.6/dist-packages', '/usr/share/qgis/python', '/home/tomasz/.qgis/python/plugins/mmqgis/forms', '/usr/share/qgis/python', '~/.qgis/python', '/home/tomasz/.qgis/python/plugins/ziplayers/logic', '/home/tomasz/.qgis/python/plugins/ziplayers/gui', '/home/tomasz/.qgis/python/plugins/imgshowhide/logic', '/home/tomasz/.qgis/python/plugins/imgshowhide/gui', '/usr/share/qgis/python/plugins/fTools/tools', '/home/tomasz/Geoinformacja/projekty']
Jako rozwiązanie tymczasowe zastosowałem zamiast znaków z ogonkami znak '%'.
Spróbuj dodać prefiks u: subset="nzw" LIKE u"Białaczów" . A złości się wtyczka GMap Overview.
Faktycznie, mogłem się domyślić, że chodzi o tą wtyczkę, zainstalowałem ją z ciekawości i już odinstalowałem. Dodanie 'u' zmieniło tyle, że jak powiększam do zasięgu warstwy to ustawia się prawidłowy zasięg dla całej warstwy shp, bez 'u' ląduję w kosmosie. I zmieniła się ikonka
![[Obrazek: zrzut_ekranu-9.png]](http://i121.photobucket.com/albums/o235/tomalos/2011/zrzut_ekranu-9.png)
Na ikonce jest uadny widoczek ;-)
Nie działa, bo bez sensu Ci napisałem, gdzie znacznik unikoda wstawić

Trza całe źródło warstwy ująć w u' ... ':
Kod:
qgis.utils.iface.addVectorLayer(u'/home/tomasz/Geoinformacja/wektor/rezeprzy.shp|layerid=0|subset="nzw" LIKE "Białaczów"','rezerwat','ogr')
Dla warstwy Postgresowej wyglądałoby to tak:
Kod:
qgis.utils.iface.addVectorLayer(u"dbname=nazwabazy host=localhost port=5432 user=eustachy password=muriel key=id table=rezeprzy (the_geom) sql=nzw LIKE 'Białaczów'",'rezerwat','postgres')
Tak tak, za parametrem table wstawiamy luzem (ale w nawiasie) nazwę kolumny geometrii. Zwróć uwagę na cudzysłowy. Python akceptuje zarówno pojedyncze, jak i podwójne, byle konsekwentnie zagnieżdżać: "to jest 'jakiś' napis". Postgres natomiast wymaga podawania wartości tekstowych w pojedynczych nawiasach, co wymusza ujęcie całego parametru u"źródło danych" w podwójne.
Uciekłem od cywilizacji na kilka dni, więc nie mogłem wcześniej podziękować.
Dzięki za pomoc, dodawanie warstwy z bazy działa bardzo fajnie, co mnie cieszy.
Nadal jednak są problemy z polskimi znakami. Warstwa niby się dodaje (pojawia się w na liście z normalną ikonką), jednak wygląda na pustą (brak danych w tabeli, powiększenie do zasięgu wywala w kosmos - w okienku skali pojawia się napis "skala nieprawidłowa").