Pracuję w taki sposób, aby tworzyć projekty hydrologiczne za pomocą QGIS i arkusza programu Excel, który mam. Aby to zrobić, chcę wyodrębnić niektóre informacje o liniach zawartych w warstwie wektorowej, która reprezentuje odcinek rury.
Informacje, które muszę wyodrębnić to:
- Numer identyfikacyjny
- Długość
- Współrzędne początkowe i końcowe X, Y
Znalazłem sposób na przechwycenie tego pola za pomocą „$ length” i innego algorytmu dla współrzędnych X i Y, ale w tym celu muszę otworzyć tabelę Atrybuty, umieścić wyrażenia w każdej kolumnie atrybutu i kliknąć, aby zaktualizować pola.
Czy istnieje sposób, aby po narysowaniu linii pola te były wypełniane automatycznie? To znaczy, rysuję / edytuję linię (rozpoczynam edycję lub koniec węzła), a kiedy otwieram tabelę atrybutów, pola długości i współrzędne X, Y są wypełniane i aktualizowane.
źródło
Odpowiedzi:
Jeśli potrzebujesz tylko tych pól w QGIS , możesz użyć pól wirtualnych. Pozwalają one na użycie wyrażenia (podobnego
$length
) zależnego od innych wartości lub geometrii.Otwórz kalkulator pola, dodaj nowe pole o długości nazwy, zaznacz pole wyboru „Pole wirtualne” i wprowadź
$length
jako wyrażenie (lub coś innego dla pozostałych pól).Nie zostaną one jednak zapisane w pliku programu Excel.
Jeśli chcesz synchronizować plik programu Excel z plikiem shp dla geometrii i dołączać pola pochodne do pliku programu Excel, istnieje wtyczka o nazwie ShpSync, która zna tę koncepcję i automatycznie aktualizuje pola, gdy funkcje są zmieniane, dodawane lub usuwane.
źródło
Interesujące pytanie! Nie znam żadnego innego sposobu osiągnięcia tego, co chcesz, ale używając PyQGIS.
Przeczytaj poniższy kod. Ma pewne teksty w niej:
'lines'
,'length'
,'startX'
,'startY'
,'endX'
,'endY'
. Możesz dostosować te nazwy w skrypcie, aby działał on na twoich danych. Pierwszy to nazwa warstwy, a reszta odpowiada nazwom pól. Zakładam, że twoja warstwa liniowa ma te pola (w końcu chcesz, żeby tam były zapisane wartości).Po dostosowaniu nazwy warstwy i nazw pól, które mają być automatycznie aktualizowane, skopiuj i wklej skrypt do konsoli QGIS Python.
Jeśli wszystko pójdzie dobrze, powinieneś zobaczyć, że wartości pól są automatycznie aktualizowane w dwóch scenariuszach: 1) Po dodaniu nowych elementów i 2) Po modyfikacji geometrii.
Tak to działa:
Jeśli masz problem z uruchomieniem skryptu, dodaj komentarz poniżej tej odpowiedzi.
Może się przydać, aby ta funkcja była już dostępna po otwarciu projektu QGIS. Jeśli tak jest, powiedz mi, że mogę zamieścić instrukcje, aby to zrobić.
EDYTOWAĆ:
Aby ta funkcja była dostępna za każdym razem, gdy otwierasz swój projekt QGIS (tj.
.qgs
Plik zawierający między innymi warstwę liniową), musisz wykonać następujące kroki:Przejdź do
QGIS->Project->Project Properties->Macros
, zaznaczPython macros
opcję i zastąp cały kod tym kodem (dostosuj wartości wskazujące nazwy warstw i pól):Upewnij się włączyć makra nad projektem, w ten sposób:
Settings->Options->General->Enable macros: Always
.Zapisz swój projekt QGIS.
Teraz za każdym razem, gdy otwierasz
.qgs
właśnie zapisany plik, atrybuty warstwy linii będą automatycznie aktualizowane po dodaniu nowej operacji lub modyfikacji geometrii (tj. Nie trzeba już niczego kopiować do konsoli Python QGIS).2. EDYCJA:
Właśnie opublikowałem wtyczkę o nazwie AutoFields, aby pomóc ludziom rozwiązać tego rodzaju problemy. Zrobiłem nawet film pokazujący, jak rozwiązać twój problem, możesz go obejrzeć na:
https://vimeo.com/germap/autofields-geometric-properties
Dokumentacja AutoFields: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis
źródło
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]
Jeśli naprawdę interesuje Cię moja wtyczka w przyszłości, prześlij mi wszelkie sugestie. Doceniam to. Możesz się ze mną skontaktować na GeoTux .W przypadku QGIS 3 przejdź do
Layers Properties
=>Attributes Form
=> wybierz pole z wartościami geometrii (na przykładarea
) => wpisz$area
odpowiednieDefaults value
pole i zaznaczApply default value on update
. To również może być przydatna:$perimeter
,$y
,$x
,$id
źródło
Umieściłbym dane w bazie danych (PostGIS) i wyodrębniłem je do QGIS w (prawdopodobnie zmaterializowanym) widoku.
źródło