20-01-2011, 11:54,
(Ten post był ostatnio modyfikowany: 20-01-2011, 12:46 {2} przez tomalos.)
|
|
tomalos
geoboss
|
Liczba postów: 364
51
Dołączył: 29-09-2009
Reputacja:
3
|
|
Dodawanie warstw za pomocą akcji
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ć?
|
|
21-01-2011, 02:39,
(Ten post był ostatnio modyfikowany: 21-01-2011, 02:46 {2} przez borys.)
|
|
borys
Moderator
|
Liczba postów: 603
2
Dołączył: 27-08-2009
Reputacja:
2
|
|
RE: Dodawanie warstw za pomocą akcji
(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.
|
|
21-01-2011, 09:42,
|
|
tomalos
geoboss
|
Liczba postów: 364
51
Dołączył: 29-09-2009
Reputacja:
3
|
|
RE: Dodawanie warstw za pomocą akcji
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 '%'.
|
|
26-01-2011, 23:17,
(Ten post był ostatnio modyfikowany: 27-01-2011, 00:15 {2} przez borys.)
|
|
borys
Moderator
|
Liczba postów: 603
2
Dołączył: 27-08-2009
Reputacja:
2
|
|
RE: Dodawanie warstw za pomocą akcji
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.
|
|
02-02-2011, 13:17,
(Ten post był ostatnio modyfikowany: 02-02-2011, 13:18 {2} przez tomalos.)
|
|
tomalos
geoboss
|
Liczba postów: 364
51
Dołączył: 29-09-2009
Reputacja:
3
|
|
RE: Dodawanie warstw za pomocą akcji
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").
|
|
|