przypisuj i przesuwaj centroidy do ich wielokątów

9

Używam QGIS 1.8 Lisboa. Po obliczeniu centroidów z pliku kształtu wielokąta, jeśli niektóre z nich leżą poza obrysem wielokąta, chciałbym przenieść je na wielokąt, z którego pochodzą. Kryterium powinno być jednoznaczne, ponieważ muszę je wykorzystać do wyodrębnienia współrzędnych, które zostaną użyte jako kod identyfikacyjny samego wielokąta. Dlatego procedura powinna wyprowadzać tę samą lokalizację punktu za każdym razem, gdy działa dla tego samego wielokąta (nie przypadkowa pozycja, jak ta podana przez funkcję „losowych punktów”, która daje nowy wynik za każdym razem, gdy jest uruchamiana).

umbe1987
źródło
1
Brzmi jak dwa pytania. Jeśli dobrze rozumiem, chcesz (a) dodać losowe punkty wewnątrz wielokąta i (b) nadać im lub wielobokowi unikalny identyfikator na podstawie tego. Najprostszą rzeczą, o której przychodzi na myśl (a), jest wykorzystanie istniejących możliwości losowych punktów w QGIS, a następnie po prostu przecięcie tej chmury punktów z wielokątem.
lynxlynxlynx
używanie funkcji „losowych punktów” w różnych momentach z tymi samymi wielokątami prowadzi do różnych wyników (mianowicie położenie punktów pochodzących z każdego wielokąta jest różne przy każdym nowym użyciu funkcji), i chcę stworzyć metodę, która dałaby mi zawsze ten sam punkt na wielokąt, z którego mógłbym wyodrębnić współrzędne, które chcę wykorzystać jako kod identyfikacyjny dla samych wielokątów.
umbe1987
skorzystaj z narzędzia „True Centroid” fTools pod narzędziami do geometrii - docs.qgis.org/html/en/docs/user_manual/plugins/…
Mapperz
po prostu daje mi centroid, ale to też może leżeć poza poligonem, którego muszę unikać. Muszę przenieść je na wielokąt, z którego pochodzą, używając funkcji takiej jak minimalna odległość (ale odległość mnie nie interesuje, chcę ją przesunąć). Na innym blogu ktoś powiedział mi, żebym użył ST_PointOnSurface PostGIS (ale używam QGIS).
umbe1987
2
czy jest to teraz duplikat witryny gis.stackexchange.com/questions/50029/... ?
podmrok

Odpowiedzi:

7

Możesz użyć biblioteki Pythona Shapely, która zapewnia funkcję, representative_point()która z pewnością leży w obrębie wielokąta.

Oto skrypt w języku Python, który można uruchomić w konsoli QGIS Python. Należy wybrać warstwę wielokąta, dla której chcesz utworzyć atrybut. Funkcja przyjmuje nazwę atrybutu, który chcesz zaktualizować. Atrybut musi już istnieć w warstwie, musi być ciągiem znaków i powinien być wystarczająco długi (30 znaków).

Oto przykład punktów znalezionych przez algorytm:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()
Jake
źródło
Próbuję to przetestować, wydaje się dokładnie tym, czego szukałem. Dam ci znać, jak tylko go uruchomię!
umbe1987
Jedną rzeczą, o której nie miałem pojęcia, jest to, co masz na myśli mówiąc, że „musi to być ciąg znaków i powinien on być wystarczająco długi (30 znaków)”. Czy ta biblioteka działa bezpośrednio na plikach wieloboków? Jeśli tak, to czy mam utworzyć nowe pole typu ciągu w zakładce Att z co najmniej 30 charachters, i to byłby ten, który należy zaktualizować?
umbe1987
@ user9518: Tak, sposób, w jaki funkcja jest pisana w tej chwili, musisz samodzielnie utworzyć atrybut w tabeli, a następnie przekazać nazwę funkcji tylko do pola. Skrypt można również dość łatwo dostosować do utworzenia wymaganego pola, jeśli jest to potrzebne.
Jake
Po prostu tęsknię za jedną rzeczą. Wygląda na to, że teraz definiuję funkcję (lub klasę), wpisując „def”, ale kiedy skończę pisać skrypt, nic się nie dzieje. Jak w końcu mogę uzyskać wynik w mojej tabeli?
umbe1987
1
Działa idealnie !!! Wyobrażam sobie, że współrzędne są zapisywane zgodnie z układem współrzędnych warstwy i że jeśli chcę mieć punkty, muszę utworzyć SHP z tymi współrzędnymi, prawda? Gdybyś tu był, zaoferowałbym Ci przynajmniej 3 piwa! Dziękuję bardzo za wasze wysiłki !!!
umbe1987
5

Narzędzie Ftools centroid może umieścić centroid poza wielokątem, jeśli jest wklęsły.

ST_PointOnSurfacena pewno zrobi co chcesz. Możesz użyć polecenia z QGIS, jeśli zainstalowałeś przy użyciu SPIT, aby przenieść plik shapefile do PostGIS, a następnie użyć wtyczki PgQuery do uruchomienia zapytania.

Alternatywnie, jeśli instalacja PostGIS jest trochę jednorazowa, możesz użyć Spatialite z poziomu QGIS. Następnie możesz użyć wtyczki QSpatiaLite, aby zaimportować dane do SpatiaLite i uruchomić zapytanie (wyróżnienia SpatialLite ST_PointOnSurface).

MappaGnosis
źródło
2

kiedy dobrze cię rozumiem, użyj: Vector-> Research Tools_> Random Points. Teraz wybierz w „Stratified Sampling Design (Individual polygons)” użyj wartości z pola wejściowego i użyj odpowiedniego pola, które daje liczbową wartość punktów, które powinny być wygenerowane dla każdego innego wielokąta

Kurt
źródło
co masz na myśli przez „odpowiednie pole”? Myślałem o użyciu środka ciężkości, a następnie powiązaniu go z najbliższą częścią wielokąta, do którego się odnosi, jeśli leży poza konturem, poprzez (na przykład) obliczenie minimalnej odległości tego punktu do najbliższego wielokąta. Celem jest następnie wyodrębnienie tych współrzędnych punktowych w celu wykorzystania ich jako unikalnego specyficznego kodu identyfikacyjnego wielokąta.
umbe1987
Zasadniczo próbuję przypisać każdy środek ciężkości do jego względnego wielokąta i przesunąć go, aby leżał wewnątrz wielokąta (lub przynajmniej dotknął jego granicy).
umbe1987
@ user9518: przepraszam, źle zrozumiałem twoje pytanie. Pomyślałem, że potrzebujesz określonej liczby losowych punktów w każdym poli, np. 2 punkty dla poli 1, 10 punktów w poli2 itd., Dlatego też termin „odpowiednie pole”. oczywiście możesz wybrać 1 dla „użyj tej liczby punktów”, aby wygenerować tylko jeden punkt dla każdego poli. ten punkt znajduje się wewnątrz poli lub przynajmniej dotyka jego granicy. ale ten punkt nadal występuje losowo, więc po ponownym wykonaniu procedury otrzymujesz inne punkty :-(
Kurt
1

Wtyczka realcentroids, dostępna do zainstalowania poprzez Wtyczki> Zarządzaj i instaluj Wtyczki działały dla mnie w QGIS 2.2, aby generować punkty podobne do centroidów, wklęsłe wewnątrz każdego wielokąta (punkt będzie leżał bardzo blisko krawędzi). Wypróbowałem narzędzie Losowe punkty, zgodnie z sugestią Kurta, i chociaż podałem 1 punkt na wielokąt, zamiast tego generuje dwa. Dodatkową wadą jest to, że w większości przypadków punkty nie reprezentują środka ciężkości, ponieważ są losowe.

http://www.agt.bme.hu/gis/qgis/realcentroid/

Alexandra Mates
źródło