Chcę przyciąć zestaw polilinii (czarne linie na obrazku poniżej) do zewnętrznej granicy wielokąta. Wszelkie puste przestrzenie w obrębie wielokąta należy zignorować. Moje idealne wyjście to przerywane żółte linie. Linie początkowe mogą, ale nie muszą być proste. Obraz jest uproszczonym przykładem, w rzeczywistości wielokąt jest o wiele bardziej złożony i zawiera setki linii. Nie sądzę, by wypukły kadłub działał (ale mogę się mylić). Jestem otwarty na rozwiązania w arcgis, qgis, arcpy, foremne itp. Kodowanie najlepiej byłoby w pythonie, ponieważ jestem otwarty na inne opcje, jeśli to konieczne. Arcgis byłby również lepszy, aby ułatwić moim współpracownikom udostępnianie tego narzędzia, ale nie jest to wymagane.
Najlepsze, co mogę teraz wymyślić, to przecięcie pojedynczej linii z wielokątem, tworząc zestaw punktów na wszystkich przecięciach granicznych. Posortuj punkty według odległości do początku linii. Najdalsze i najbliższe punkty (FAC) będą zewnętrzną granicą wielokąta. Następnie użyj punktów FAC, aby wybrać odpowiednie wierzchołki z oryginalnej linii i utwórz żółtą linię przerywaną z odpowiednich punktów. Powinien działać, ale wydaje się bardziej skomplikowany niż to konieczne.
Kilka dodatkowych myśli:
- Linie są „wystarczająco” liniowe, aby wystarczyło proste obliczenie odległości między punktami, odniesienie liniowe nie powinno być konieczne.
- Byłoby to łatwe, gdyby istniało narzędzie do dzielenia linii w punkcie, ale nie mogę jej znaleźć.
Myśli ktoś?
źródło
Odpowiedzi:
Chcę wrzucić moje rozwiązanie pyQGIS, nic więcej.
Mój przypadek testowy - przed wycięciem:
Po wycięciu:
Aby uzyskać pełny zestaw atrybutów oryginalnych linii, myślę, że najlepiej byłoby połączyć je z wynikiem. W przeciwnym razie należy je utworzyć w sekcji przygotowania i ustawić w najbardziej wewnętrznej pętli. Ale nie sprawdziłem, czy przejdą proces rozpuszczania, czy też się zgubią, ponieważ w zasadzie mogą mieć różne wartości.
źródło
Jeśli uruchomisz Zintegruj z wielokątami i liniami jako danymi wejściowymi, doda wierzchołek do każdego miejsca, w którym się przecinają. (Ostrożnie, ponieważ funkcja Integrate modyfikuje dane wejściowe zamiast tworzyć nowe dane wyjściowe).
Gdy upewnisz się, że są zbieżne wierzchołki, możesz iterować wierzchołki linii i sprawdzić, czy oba dotykają drugiej cechy. Z uporządkowanej listy wierzchołków, które się dotykają, weź minimum i maksimum z zestawu. Następnie utwórz dwie linie z każdej operacji: A: (początek, ..., min) i B: (maks., ..., koniec).
Inną opcją, chociaż nie jestem pewien, czy ArcPy zachowuje porządkowanie części elementu na podstawie kolejności wierzchołków w obiekcie wejściowym, byłoby uruchomienie klipu w niezmienionej postaci. W środkowej linii w twoim przykładzie powinna to być funkcja wieloczęściowa z trzema częściami. W zależności od kolejności można iterować każdą linię wieloczęściową utworzoną przez Clip i usuwać wszystkie oprócz pierwszej i ostatniej części funkcji wieloczęściowej.
źródło
W tym przypadku istnieją trzy problemy:
Otwory
Ponieważ dowolna linia w otworze zostanie zachowana, usuń otwory z wielokątów. W poniższym skrypcie robię to za pomocą kursorów i geometrii.
Linie między wielokątami
Linie dotykające dwóch wielokątów muszą zostać usunięte. W poniższym skrypcie robię to, wykonując sprzężenie przestrzenne
one to many
z moimi liniami jako moją klasą elementów wejściowych, a wielokątami jako moją klasą elementów złączonych. Każda linia, która zostanie wygenerowana dwukrotnie, dotyka dwóch wielokątów i jest usuwana.Linie końcowe
Aby usunąć linie dotykające tylko wielokąta na jednym końcu, przekształcam linie w punkty końcowe. Następnie używam warstw obiektów i selekcji, aby ustalić, które punkty końcowe są zmiennoprzecinkowe. Wybieram punkty końcowe, które przecinają wielokąty. Następnie zmieniam wybór. To wybiera punkty końcowe, które nie przecinają wielokątów. Zaznaczam dowolną linię, która przecina te wybrane punkty i usuwam je.
Wynik
Założenia
erase
ifeature vertices to points
)Scenariusz
Poniższy skrypt generuje klasę obiektów o nazwie twojej klasy obiektów liniowych plus
_GreedyClip
, w tej samej geobazie, co twoja klasa obiektów liniowych. Potrzebna jest również lokalizacja obszaru roboczego.źródło