usando shapely: traduzione tra poligoni e poligoni


12

[EDIT: la soluzione a questo era semplicemente usare OGR per leggere gli shapefile. Vedi l'esempio di geographika.]

In uno shapefile ESRI, non vi è alcuna distinzione tra poligoni e multipoligoni. Inoltre, non vi è alcuna distinzione esplicita tra fori interni e anelli esterni (oltre alla "mano" di un determinato poligono).

Quindi, dopo aver letto un file di forma, ho un elenco di sequenze di coordinate che descrivono gli anelli, ma senza un'elaborazione più intensiva, non riesco a distinguere quali di questi anelli sono anelli esterni, fori interni o poligoni aggiuntivi.

Sembra che per la formosa 's poligono e multipoligono costruttori, ci deve essere una chiara distinzione tra esterno e gli anelli interni, così come dovrei passare da un elenco chiaro di anelli a un insieme ordinato di poligoni separati, con interni chiaramente designata e gli anelli esterni ?

Riassumendo: se ho un elenco di anelli poligonali, ma non so quali anelli siano buchi all'interno o poligoni separati, come dovrei ordinarli in poligoni separati con fori interni designati?

Sto cercando una semplice soluzione algoritmica che posso implementare in Python, può essere utilizzata per elaborare centinaia di poligoni in ~ un minuto o meno, e lo sto facendo per eseguire un gran numero di intersezioni.


In questa domanda mancano le informazioni cruciali su ciò che si utilizza per leggere lo Shapefile.
inc42

@ inc42 Stavo usando Python per leggere direttamente il file.
BenjaminGolder,

Ah, allora Shapely bit è fuorviante. Il tuo vero problema era scoprire come determinare il "tipo" di anello nel formato Shapefile. :)
inc42

Risposte:


10

Oltre alla risposta di relet su come ottenere singoli poligoni, è quindi possibile eseguire un'intersezione su tutti i poligoni per creare i buchi. Se il tuo set di dati contiene poligoni sovrapposti, sei sfortunato.

Spiega di nuovo cosa c'è che non va nei lettori di file di forma esistenti?

Non sarebbe più semplice esportare gli ID funzione e i valori M dal file di forma e poi ricollegarli ai poligoni dopo aver utilizzato un lettore di file di forma esistente?

Per i multipatch è possibile utilizzare la stessa tecnica di assegnazione degli ID poligono a un "ID patch" e quindi aggiungere nuovamente questo attributo alle funzionalità.

Modifica: mentre dici di non voler usare OGR, nel caso in cui cambi idea ..

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

La geometria dovrebbe essere emessa come segue:

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

La prima parentesi contiene le corde dell'anello esterno, le successive parentesi le corde degli anelli interni. Se hai valori Z, i punti devono essere nel formato 79285 57742 10 (dove l'ultimo coord è un'altezza).

Altrimenti potresti usare le funzioni Shapely Contains e Within per valutare ogni poligono tra loro e applicare preventivamente un indice spaziale - http://pypi.python.org/pypi/Rtree/ per accelerare l'elaborazione.


grazie, questo non è quello che sto cercando, ma ho visto alcuni chiarimenti che potrei fare alla mia domanda. Per rispondere alle tue domande: 1, perché le sto ordinando per fare tonnellate di intersezioni in primo luogo. 2, niente, ho solo bisogno di uno che sia leggero e che posso usare facilmente da Python, e non ho imparato ogr. 3, no, non sarebbe più facile in questo caso.
BenjaminGolder,

1
Wow! Grazie geographika! Ora sono convinto al 90% che ogr sia la soluzione qui. Ho riscontrato alcuni problemi di installazione con ogr, ma sembra che valga la pena risolverli. Quindi ogr organizza gli anelli nel suo output in bianco? e va bene con gli shapefile 3d (io uso molto 3d)?
BenjaminGolder,

Sembra che le risposte alle mie domande siano sì e sì. E grazie per avermi fatto conoscere rtree. Sembra che OGR risolva completamente il mio problema, purché questa volta possa configurare correttamente l'installazione.
BenjaminGolder,

Reinstallazione di OGR: ricorda che avrai bisogno dei binari per Windows e dei corrispondenti collegamenti Python.
geographika,

9

Innanzitutto, usa ogr per aprire shapefile:

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

converti le geometrie dello shapefile in geometrie formose

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

Per i poligoni nel multipoligono:

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

E ora, è possibile utilizzare tutte le funzioni del formosa ( formosa )


1

Non ho familiarità con il modo in cui i poligoni sono effettivamente memorizzati nei file di forma, ma - un anello poligonale non dovrebbe essere un anello chiuso se e solo se si ripetono le coordinate di partenza? Quindi, se si confronta ogni coordinata successiva con la coordinata iniziale, si troverà il primo punto in cui un poligono è chiuso. Se questa è l'ultima coordinata del poligono, è un poligono semplice, in caso contrario, è un multipoligono e richiede l'elaborazione degli altri anelli.

Potrebbe essere l '"elaborazione più intensiva" che si desidera evitare, ma in realtà è solo un'iterazione attraverso le coordinate che viene fornita gratuitamente quando è necessario leggerle in ogni caso.


Mi scuso: la mia domanda è stata un po 'fuorviante e l'ho modificata. Ho gli anelli poligonali e so quando ho un elenco di più di un anello poligonale, ma a parte l'ordine dei punti in senso orario o antiorario, non so se si tratti di anelli interni o esterni. Se sono anelli interni, non ho modo di essere sicuro dell'anello esterno a cui appartengono, a parte misurare la loro posizione.
BenjaminGolder,

Vedo. Sono anche felice di vedere che hai trovato la tua strada per ogr. ;)
relet

-2

Come indicato da @ inc42 , a pagina 8 dell'ESRI Shapefile Descrizione tecnica: un libro bianco ESRI - luglio 1998 (pagina 12 di 34 nel PDF) c'è una discussione sul contenuto dei record poligonali che potrebbe essere quello che stai cercando:

Un poligono può contenere più anelli esterni. L'ordine dei vertici o l'orientamento di un anello indica quale lato dell'anello è l'interno del poligono.


p.10 ha "Un poligono può contenere più anelli esterni. L'ordine dei vertici o l'orientamento di un anello indica quale lato dell'anello è l'interno del poligono."
inc42

@ inc42 aggiornato di conseguenza anche se penso che il numero di pagina dovrebbe essere 8 (o 12 di 34).
PolyGeo
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.