assegnare e spostare i centroidi nei loro poligoni


9

Sto usando QGIS 1.8 Lisboa. Dopo aver calcolato i centroidi da un file di forma poligonale, se alcuni di essi si trovano al di fuori dei contorni del poligono, vorrei spostarli sul poligono da cui provenivano. Il criterio dovrebbe essere univoco in quanto devo usarli per estrarre le coordinate da utilizzare come codice identificativo del poligono stesso. Pertanto, la procedura dovrebbe generare la stessa posizione del punto ogni volta che viene eseguita per lo stesso poligono (non una posizione casuale come quella data dalla funzione "punti casuali", che fornisce un nuovo risultato ogni volta che viene eseguita).


1
Sembra due domande. Se ho capito bene, vuoi (a) aggiungere punti casuali all'interno di un poligono e (b) dare a loro o al poligono un ID univoco basato su questo. La cosa più semplice che viene in mente per (a) è usare le capacità di punti casuali esistenti in QGIS e quindi intersecare quella nuvola di punti con il poligono.
lynxlynxlynx,

l'uso della funzione "punti casuali" diverse volte con gli stessi poligoni porta a risultati diversi (vale a dire, la posizione dei punti derivati ​​da ciascun poligono è diversa ad ogni nuovo utilizzo della funzione) e voglio creare un metodo che mi dia sempre lo stesso punto per poligono da cui ho potuto estrarre le coordinate che voglio usare come codice identificativo per i poligoni stessi.
umbe1987,

usa lo strumento 'vero centroide' di fTools in strumenti di geometria - docs.qgis.org/html/en/docs/user_manual/plugins/…
Mapperz

mi dà solo il centroide, ma questo potrebbe anche trovarsi al di fuori del poligono, che devo evitare. Devo spostarli sul poligono da cui derivano, usando una funzione come la distanza minima (ma non mi interessa la distanza, voglio che venga spostato). In un altro blog qualcuno mi ha detto di usare ST_PointOnSurface di PostGIS (ma sto usando QGIS).
umbe1987,

Risposte:


7

È possibile utilizzare la libreria Shapely Python, che fornisce una funzione representative_point()garantita all'interno del poligono.

Ecco uno script Python che può essere eseguito nella console QGIS Python. È necessario selezionare il livello poligonale per cui si desidera creare l'attributo. La funzione prende il nome dell'attributo che si desidera aggiornare. L'attributo deve già esistere nel tuo livello, deve essere di tipo stringa e dovrebbe essere abbastanza lungo (30 caratteri).

Ecco un esempio dei punti trovati dall'algoritmo:

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()

Sto provando a provarlo, sembra esattamente quello che stavo cercando. Ti farò sapere non appena lo eseguo!
umbe1987,

una cosa che non ho capito è che cosa intendi con "deve essere un tipo di stringa e dovrebbe essere abbastanza lungo (30 caratteri)". Questa libreria funziona direttamente su shpfile poligonali? In tal caso, dovrei creare un nuovo campo di tipo stringa nella scheda Att con almeno 30 caratteri e questo sarebbe quello da aggiornare?
umbe1987,

@ user9518: Sì, il modo in cui la funzione è scritta nel momento in cui è necessario creare l'attributo nella tabella e quindi passare solo il nome del campo alla funzione. Lo script potrebbe anche essere facilmente adattato per creare il campo richiesto stesso, se è quello che è necessario.
Jake,

Mi manca solo una cosa. Sembra ora che sto definendo una funzione (o una classe) digitando "def", ma poi quando finisco di scrivere lo script non succede nulla. Come posso finalmente avere il risultato nella mia tabella?
umbe1987,

1
Ha funzionato perfettamente !!! Immagino che le coordinate siano scritte secondo il sistema di coordinate del livello e che se voglio avere i punti ho bisogno di creare un shp con quelle coordinate, giusto? Se fossi qui ti offrirei almeno 3 birre! Grazie mille per i tuoi sforzi !!!
umbe1987,

5

Lo strumento centroide ftools può posizionare il centroide al di fuori del poligono se è concavo.

ST_PointOnSurfacefarà sicuramente quello che vuoi. È possibile utilizzare il comando dall'interno di QGIS se è stato installato utilizzando SPIT per ottenere il file di forma in PostGIS e quindi utilizzare il plug-in PgQuery per eseguire la query.

In alternativa, se installare PostGIS è un po 'troppo per un uso una tantum, è possibile utilizzare Spatialite da QGIS. È quindi possibile utilizzare il plug-in QSpatiaLite per importare i dati su SpatiaLite ed eseguire la query (riconoscimenti SpatialLite ST_PointOnSurface).


2

quando ti capisco bene, usa: Vector-> Strumenti di ricerca_> Punti casuali. Ora seleziona "Stratified Sampling Design (Single poligons)" usa il valore dal campo di input e usa il campo approriate, che fornisce il valore numerico dei punti, che dovrebbero essere generati per ogni diverso poligono


cosa intendi con "campo appropriato"? Stavo pensando di usare il centroide e quindi collegarlo alla parte più vicina del poligono a cui si riferisce, se si trova al di fuori del contorno, calcolando (ad esempio) la distanza minima di quel punto dal poligono più vicino. Lo scopo è quindi quello di estrarre le coordinate di quel punto per usarle come unico codice identificativo specifico del poligono.
umbe1987,

Fondamentalmente quello che sto cercando di fare è assegnare ogni centroide al relativo poligono e spostarlo in modo che si trovi all'interno del suo poligono (o almeno per toccarne il bordo).
umbe1987,

@ user9518: scusa, ho frainteso la tua domanda. Ho pensato che volessi un numero specifico di punti casuali all'interno di ogni poli, ad esempio 2 punti per poli 1, 10 punti all'interno di poli2 ecc., Quindi il termine "campo appropriato". ovviamente è possibile selezionare 1 per "utilizzare questo numero di punti" per generare un solo punto per ogni poli. questo punto si trova all'interno del poli o almeno tocca il suo limite. ma questo punto viene ancora trovato per caso, quindi quando ripeti la procedura ottieni altri punti :-(
Kurt

1

plug-in realcentroids, disponibile per l'installazione tramite Plugin> Gestisci e Installa Plugin ha funzionato per me in QGIS 2.2 per generare punti simili a centroidi, forzati all'interno di ogni poligono se concavo (il punto si troverà molto vicino al bordo). Ho provato lo strumento Punti casuali come suggerito da Kurt e sebbene abbia specificato 1 punto per poligono, ne genera invece due. Uno svantaggio aggiunto è che nella maggior parte dei casi, i punti non rappresentano il centroide in quanto sono casuali.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.