[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ń.
Odpowiedzi:
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 ...
Geometria powinna być wyprowadzana w następujący sposób:
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.
źródło
Najpierw użyj ogr, aby otworzyć plik kształtu:
konwertuj geometrię kształtu pliku na geometrię kształtu
Dla wielokątów w wieloboku:
A teraz możesz korzystać ze wszystkich funkcji foremnego ( foremnego )
źródło
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ć.
źródło
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:
źródło