Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
QGis API - kilka pytań początkującego
23-01-2013, 11:14,
#1
Big Grin  QGis API - kilka pytań początkującego
Cześć,

Zacząłem intensywniej używać QGis API. Czy ktoś może pomóc w nast. kwestiach (używam 1.8.0 na win32):

1. Gdzie zgłaszać błędy? - np. jak się w tytule projektu użyje znaku, który nie może znaleźć się w nazwie pliku, to nie da się zrobić 'Save as'

2. Jak z poziomu API ustawić CRS projektu?

3. Czy gdzieś jest udokumentowane jak identyfikowane/numerowane są grupy i warstwy?

Z góry dziękuję za pomoc.

pzdr,g.
23-01-2013, 16:14, (Ten post był ostatnio modyfikowany: 23-01-2013, 16:14 {2} przez borys.)
#2
RE: QGis API - kilka pytań początkującego
Cytat:1. Gdzie zgłaszać błędy? - np. jak się w tytule projektu użyje znaku, który nie może znaleźć się w nazwie pliku, to nie da się zrobić 'Save as'

http://hub.qgis.org/

Po zalogowaniu obok zakładki "zagadnienia" masz drugą "nowe zagadnienie".

Głupia sprawa: ktoś wie, jak się zarejestrować? Smile) Zdaje się, że musisz się zarejestrować na wiki OsGEO http://wiki.osgeo.org i to będzie Twoje OSGeo ID, którym się wszędzie logujesz. Ale głowy nie dam, bo ta strona jest młodsza od mojego loginu. Mam nadzieję, że nie przeszkadza Ci zbytnio takie zacieśnienie powiązania z Fundacją Smile bo nie wiem, czy są również lokalne loginy.

Cytat:2. Jak z poziomu API ustawić CRS projektu?

Póki QGIS ma tylko jedną mapę, CRS ustawia się w niej, a nie w projekcie:

Kod:
crs = QgsCoordinateReferenceSystem ('epsg:2178')
qgis.utils.iface.mapCanvas().mapRenderer().setDestinationCrs(crs)

gdzie qgis.utils.iface to oczywiście aktualna instancja QgisInterface (będę tu używał ścieżek z konsoli 1.8; w konsoli 1.9 oraz we wtyczkach jest do niej prostszy dostęp).

Cytat:3. Czy gdzieś jest udokumentowane jak identyfikowane/numerowane są grupy i warstwy?

Rzuć okiem na klasę: http://qgis.org/api/classQgsLegendInterface.html
Jej metody zwracają trochę niespójne wyniki:

Kod:
qgis.utils.iface.legendInterface().groups()
zwraca listę (wyświetlanych) nazw grup, numerowaną w legendzie od góry na dół

Kod:
qgis.utils.iface.legendInterface().layers()
zwraca listę warstw (jako obiekty), numerowaną na mapie od góry na dół. Uwaga: Kolejność warstw na mapie zwykle jest taka jak w legendzie, ale od wersji bodaj 1.8 przybył panel "Kolejność warstw" i można wymusić inną.

Kod:
qgis.utils.iface.legendInterface().groupLayerRelationship()
zwraca jedną drzewiastą listę wszystkich nazw grup i warstw, gdzie nazwy grup są to (nieunikalne!) nazwy wyświetlane w legendzie, natomiast pod nazwą warstwy kryje się faktycznie unikalne id, a nie nazwa z legendy. Mając tę ostatnią nazwę warstwy, samą warstwę możemy odszukać w tym słowniku:

Kod:
QgsMapLayerRegistry().instance().mapLayers()
06-02-2013, 16:37, (Ten post był ostatnio modyfikowany: 07-02-2013, 09:37 {2} przez gregsa.)
#3
RE: QGis API - kilka pytań początkującego
Dzięki. Informacje skonsumowałem Smile i zaczyna mi to ładnie działać.

Jeszcze tylko pytanie jak włączyć z API opcję 'Reprojekcja w locie' i czy z plugina można wywołać dowolną akcję/funkcję, która jest podczepiona pod menu aplikacji (np Plik->Zapisz jako obraz)

pzdr,g.
18-02-2013, 21:31,
#4
RE: QGis API - kilka pytań początkującego
Pewnie za późno, ale może się przyda:

(06-02-2013, 16:37)gregsa napisał(a): Jeszcze tylko pytanie jak włączyć z API opcję 'Reprojekcja w locie'

iface.mapCanvas().mapRenderer().setProjectionsEnabled(True)

(06-02-2013, 16:37)gregsa napisał(a): i czy z plugina można wywołać dowolną akcję/funkcję, która jest podczepiona pod menu aplikacji (np Plik->Zapisz jako obraz)

Niektóre akcje są dostępne w QgisInterfejsie: http://qgis.org/api/classQgisInterface.html
Na przykład iface.actionZoomIn().trigger() jest tożsame z kliknięciem w klawisz zoomIn (czyli tylko przełączy narzędzie, jeszcze nic nie zzoomuje)

Jeśli jakiejś akcji nie ma "luzem", to można szukać jej w odpowiednim menu. Tutaj znowu podstawowe menu są dostępne w QgisInterfejsie, np menu Warstwa: iface.layerMenu().actions()
Jeśli jest to menu dodane przez jakąś wtyczkę i nie ma metody QgisInterface.cośtamMenu(), to trzeba go szukać po nitce do kłębka: iface.mainWindow().menuBar().actions()

Trzeba tylko pamiętać, że odliczanie kolejności w menu nadaje się tylko do wewnętrznych zastosowań, bo skład menu może być różny w zależności od wersji QGISa, poza tym jakiś plugin może wstawić akcję albo całe menu, zmieniając kolejność, z kolei użytkownik może sobie ukryć jakieś akcje w ramach dostosowywania interfejsu, w końcu położenie niektórych akcji zależy od systemu operacyjnego i środowiska graficznego; na przykład Opcje czasem będą w Ustawieniach, czasem w Edycji.
21-02-2013, 08:58,
#5
RE: QGis API - kilka pytań początkującego
Dzięki. Informacje się przydadzą Smile Powoli zaczynam "ograniać" dokumentację i na coraz więcej pytań odpowiadam sobie sam Smile

Jednak dwa obszary są dla mnie niejasne: drukowanie i "stylizacja" warstwy. Jakbyś mógł pokazać kawałek kodu, który w warstwie wektorowej z liniami ustawia grubość i kolor linii, to miałbym punkt zaczepienia do dalszych inwestygacji. Tu wiem, że są stare i nowe style, ale że efekt muszę mieć "na już" to chyba mniej skomplikowane są stare style?

Osobne zagadnienie to drukowanie. Czy jest API, które pozwoliłoby na przygotowanie takich obiektów, które się robi przez moduł do wydruków (t.j. menu "Plik>Nowy wydruk")?

pzdr,g.
21-02-2013, 18:45,
#6
RE: QGis API - kilka pytań początkującego
Stylizacja jest opisana w Cookbooku: http://www.qgis.org/pyqgis-cookbook/vect...tor-layers

Ja nie zawracałbym sobie już głowy starymi stylami. Nowe nie są takie straszne, zwłaszcza przy prostych symbolach Smile Np. tutaj pobrałem domyślny symbol warstwy (równie dobrze można oczywiście utworzyć nowy) , zmodyfikowałem go i użyłem do zbudowania nowego renderera:

Kod:
from PyQt4 import QtGui
layer = iface.activeLayer()
biezacySymbol = QgsSymbolV2.defaultSymbol( layer.geometryType() )
biezacySymbol.setColor(QtGui.QColor('#ff0000'))
renderer = QgsSingleSymbolRendererV2(biezacySymbol)
layer.setRendererV2(renderer)
iface.legendInterface().refreshLayerSymbology(layer)
layer.triggerRepaint()

Drugą możliwością jest QhsVectorLayer.readSymbology(), czyli wczytanie gotowego stylu z xmla (w natywnym formacie albo w nowszych wersjach w SLD).

Jeśli chodzi o wydruki, to w starszych wersjach nie były w pełni wyciągnięte do API. Im nowsza wersja, tym więcej się da zrobić programowo. Szczerze mówiąc, nie miałem nigdy potrzeby się nimi bawić, ale szukaj w klasach z QgsComposer w nazwie.
22-02-2013, 09:23, (Ten post był ostatnio modyfikowany: 22-02-2013, 16:03 {2} przez gregsa.)
#7
RE: QGis API - kilka pytań początkującego
(21-02-2013, 18:45)borys napisał(a): Ja nie zawracałbym sobie już głowy starymi stylami. Nowe nie są takie straszne, zwłaszcza przy prostych symbolach Smile
Dzięki! Ten kod mi zadziałał, więc zabieram się do roboty Smile

(21-02-2013, 18:45)borys napisał(a): Drugą możliwością jest QhsVectorLayer.readSymbology(), czyli wczytanie gotowego stylu z xmla (w natywnym formacie albo w nowszych wersjach w SLD).
Po testach widzę, że może lepiej uzyć QgsVectorLayer.loadNamedStyle(), bo readSymbology()wymaga już QDomNode jako argumentu.


pzdr,g.
22-02-2013, 17:50,
#8
RE: QGis API - kilka pytań początkującego
No tak tak, sorry, jeśli z pliku/bazy to tak :-)


Podobne wątki
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Zniknęło kilka etykiet Karolek 0 2 021 18-05-2020, 15:26
Ostatni post: Karolek
  kalkulator pól kilka warunków Magda 16 59 828 19-12-2014, 14:35
Ostatni post: martel
  [overpass api] import do qgis damien 1 11 468 21-11-2013, 00:05
Ostatni post: mdzidek
  Kilka okien mapy martel 3 18 260 15-10-2013, 22:39
Ostatni post: borys
  Wielka prośba początkującego demo 1 10 691 19-06-2013, 07:10
Ostatni post: [wiki]
  połączyć wiele/kilka poligonów w jeden diunida 5 42 593 27-02-2013, 13:30
Ostatni post: borys
  kilka typów na jednej warstwie [wiki] 13 62 267 29-02-2012, 12:43
Ostatni post: Rayo
  QGIS API maciek 1 10 923 04-01-2012, 17:13
Ostatni post: borys
  kilka warstw liniowych w jedną [wiki] 2 15 435 14-03-2011, 11:55
Ostatni post: [wiki]

Skocz do: