przy użyciu foremnego: tłumaczenia między wielokątami i wielokątami

12

[EDYCJA: rozwiązaniem tego było po prostu użycie OGR do odczytu plików kształtów. Zobacz przykład geographika.]

W pliku kształtu ESRI nie ma rozróżnienia między wielokątami i wielokątami. Co więcej, nie ma wyraźnego rozróżnienia między wewnętrznymi otworami a zewnętrznymi pierścieniami (poza „przydatnością” danego wielokąta).

Po przeczytaniu pliku kształtu mam listę sekwencji współrzędnych opisujących pierścienie, ale bez bardziej intensywnego przetwarzania nie jestem w stanie odróżnić, które z tych pierścieni są pierścieniami zewnętrznymi, wewnętrznymi otworami lub dodatkowymi wielokątami.

Wygląda na to, że w przypadku konstruktorów foremnych wielokątów i wielokątów musi istnieć wyraźne rozróżnienie między pierścieniami zewnętrznymi i wewnętrznymi, więc jak przejść od niejasnej listy pierścieni do uporządkowanego zestawu oddzielnych wielokątów z wyraźnie oznaczonymi pierścieniami wewnętrznymi i zewnętrznymi ?

Podsumowując: jeśli mam listę pierścieni wielokąta, ale nie wiem, które pierścienie są dziurami we wnętrzu lub osobnymi wielokątami, jak najlepiej posortować je na osobne wielokąty z wyznaczonymi otworami wewnętrznymi?

Szukam prostego rozwiązania algorytmicznego, które mogę zaimplementować w pythonie, którego można użyć do przetworzenia setek wielokątów w około minutę lub mniej i robię to, aby wykonać dużą liczbę skrzyżowań.

BenjaminGolder
źródło
W tym pytaniu brakuje kluczowych informacji na temat tego, czego używasz do czytania pliku Shapefile.
inc42
@ inc42 Używałem Pythona do bezpośredniego odczytu pliku.
BenjaminGolder
Ach, to kawałek Shapely wprowadza w błąd. Rzeczywistym problemem było ustalenie, jak określić „rodzaj” pierścienia w formacie Shapefile. :)
inc42

Odpowiedzi:

10

Oprócz odpowiedzi Releta na temat uzyskiwania pojedynczych wielokątów, możesz następnie przeciąć wszystkie wielokąty, aby utworzyć dziury. Jeśli Twój zestaw danych zawiera nakładające się wielokąty, ale nie masz szczęścia.

Wyjaśnij jeszcze raz, co jest nie tak z istniejącymi czytnikami plików shapefile?

Czy nie byłoby łatwiej wyeksportować identyfikatory funkcji i wartości M z pliku shapefile, a następnie połączyć je z powrotem z wielokątami po użyciu istniejącego czytnika plików shapefile?

W przypadku wielokrotności możesz użyć tej samej techniki przypisywania identyfikatorów wielokątów do „identyfikatora łaty”, a następnie dodawania tego atrybutu z powrotem do funkcji.

Edycja: Chociaż mówisz, że nie chcesz używać OGR, na wypadek, gdybyś zmienił zdanie ...

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

Geometria powinna być wyprowadzana w następujący sposób:

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

Pierwszy wspornik zawiera współrzędne pierścienia zewnętrznego, kolejne wsporniki współrzędne pierścieni wewnętrznych. Jeśli masz wartości Z, punkty powinny mieć format 79285 57742 10 (gdzie ostatnia współrzędna jest wysokością).

W przeciwnym razie możesz użyć funkcji Shapely Contains i Within, aby ocenić ze sobą każdy wielokąt i zastosować wcześniej indeks przestrzenny - http://pypi.python.org/pypi/Rtree/, aby przyspieszyć przetwarzanie.

geografia
źródło
dzięki, to nie jest to, czego szukam, ale zobaczyłem więcej wyjaśnień, które mogłem udzielić na moje pytanie. Aby odpowiedzieć na twoje pytania: 1, ponieważ najpierw sortuję je, aby zrobić mnóstwo skrzyżowań. 2, nic, po prostu potrzebuję takiego, który jest lekki i którego mogę łatwo używać z Pythona, i nie nauczyłem się ogr. 3, nie, w tym przypadku nie byłoby łatwiej.
BenjaminGolder
1
łał! Dzięki geographika! Jestem teraz w 90% przekonany, że ogr jest tutaj rozwiązaniem. Wystąpiły problemy z instalacją programu ogr, ale wygląda na to, że warto je rozwiązać. Więc ogr organizuje pierścienie na wyjściu wkt? i czy jest dobrze z plikami kształtu 3D (używam dużo 3D)?
BenjaminGolder
Wygląda na to, że odpowiedzi na moje pytania brzmią „tak” i „tak”. I dziękuję za zapoznanie mnie z rtree. Wydaje się, że OGR całkowicie rozwiązuje mój problem - o ile tym razem mogę poprawnie skonfigurować instalację.
BenjaminGolder
Ponowna instalacja OGR - pamiętaj, że będziesz potrzebować plików binarnych dla systemu Windows i pasujących powiązań Pythona.
geographika
9

Najpierw użyj ogr, aby otworzyć plik kształtu:

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

konwertuj geometrię kształtu pliku na geometrię kształtu

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

Dla wielokątów w wieloboku:

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

A teraz możesz korzystać ze wszystkich funkcji foremnego ( foremnego )

Konstantyn
źródło
1

Nie jestem zbyt obeznany z tym, w jaki sposób wielokąty są faktycznie przechowywane w plikach kształtów, ale - czy pierścień wielokąta nie powinien być zamkniętą pętlą tylko wtedy, gdy powtarza się współrzędna początkowa? Więc jeśli porównasz każdą kolejną współrzędną ze współrzędną początkową, znajdziesz pierwszy punkt, w którym wielokąt jest zamknięty. Jeśli jest to ostatnia współrzędna wielokąta, jest to prosty wielokąt, jeśli nie, jest to wielokąt i wymaga przetworzenia innych pętli.

Może to być „bardziej intensywne przetwarzanie”, którego chcesz uniknąć, ale tak naprawdę jest to tylko iteracja współrzędnych, które są dostępne za darmo, gdy i tak musisz je odczytać.

relet
źródło
Przepraszam - moje pytanie było trochę mylące i zredagowałem je. Mam pierścienie wielokąta i wiem, kiedy mam listę więcej niż jednego pierścienia wielokąta, ale oprócz kolejności punktów zgodnych z ruchem wskazówek zegara lub w przeciwnym kierunku, nie wiem, czy są to pierścienie wewnętrzne czy zewnętrzne. Jeśli są to pierścienie wewnętrzne, nie mam możliwości sprawdzenia, do którego pierścienia zewnętrznego należą, poza pomiarem ich położenia.
BenjaminGolder
Widzę. Cieszę się również, że znalazłeś swoją drogę do ogrodu. ;)
relet
-2

Jak wskazuje @ inc42 , na stronie 8 opisu technicznego ESRI Shapefile: Biała księga ESRI - lipiec 1998 r. (Strona 12 z 34 w pliku PDF) zawiera omówienie zawartości rekordów wielokątów, które mogą być tym, czego szukasz:

Wielokąt może zawierać wiele pierścieni zewnętrznych. Kolejność wierzchołków lub orientacja pierścienia wskazuje, po której stronie pierścienia znajduje się wnętrze wielokąta.

PolyGeo
źródło
str. 10 ma „Wielokąt może zawierać wiele pierścieni zewnętrznych. Kolejność wierzchołków lub orientacja pierścienia wskazuje, która strona pierścienia jest wnętrzem wielokąta”.
inc42
@ inc42 odpowiednio zaktualizowane, chociaż uważam, że numer strony powinien wynosić 8 (lub 12 z 34).
PolyGeo