Próbuję znaleźć punkty przegięcia, tj. Punkty, w których krzywe linii zaczynają się i kończą. Jeśli spojrzysz na obraz, zielona linia może być drogą lub strumieniem, a czarne punkty to punkty, w których krzywe zaczynają się i kończą.
Jakie byłyby kroki na wysokim szczeblu w celu automatyzacji generowania tych punktów? Mam pulpit ArcGIS i jestem całkiem przydatny w ArcObjects.
arcobjects
algorithm
Devdatta Tengshe
źródło
źródło
Odpowiedzi:
Gdy krzywa składa się z odcinków linii, wówczas wszystkie punkty wewnętrzne tych odcinków są punktami przegięcia, co nie jest interesujące. Zamiast tego należy uważać, że krzywa jest zbliżona do wierzchołków tych segmentów. Poprzez rozcięcie częściowo segmentowanej krzywej o dwóch różnicach między tymi segmentami, możemy następnie obliczyć krzywiznę. Mówiąc wprost, punkt przegięcia to miejsce, w którym krzywizna wynosi zero.
W tym przykładzie występują długie odcinki, w których krzywizna wynosi prawie zero. Sugeruje to, że wskazane punkty powinny przybliżać końce takich odcinków regionów o niskiej krzywiźnie.
Dlatego skuteczny algorytm splajtuje wierzchołki, oblicza krzywiznę wzdłuż gęstego zestawu punktów pośrednich, identyfikuje zakresy prawie zerowej krzywizny (wykorzystując rozsądne oszacowanie, co to znaczy być „blisko”), i zaznacza punkty końcowe tych zakresów .
Oto działający
R
kod ilustrujący te pomysły. Zacznijmy od ciągu linii wyrażonego jako ciąg współrzędnych:Spline x i y współrzędne osobno do uzyskania parametryzacji krzywej. (Parametr zostanie wywołany
time
.)Interpoluj splajny na potrzeby kreślenia i obliczeń:
Potrzebujemy funkcji do obliczenia krzywizny sparametryzowanej krzywej. Musi oszacować pierwszą i drugą pochodną splajnu. W przypadku wielu splajnów (takich jak splajny sześcienne) jest to łatwe obliczenie algebraiczne.
R
zapewnia trzy pierwsze pochodne automatycznie. (W innych środowiskach można chcieć obliczać pochodne numerycznie).Proponuję oszacować próg zerowej krzywizny pod względem zasięgu krzywej. To przynajmniej dobry punkt wyjścia; należy go wyregulować zgodnie z krętością krzywej (to znaczy zwiększyć dla dłuższych krzywych). Będzie to później wykorzystane do pokolorowania wykresów zgodnie z krzywizną.
Teraz, gdy wierzchołki zostały spline i obliczono krzywiznę, pozostaje tylko znaleźć punkty przegięcia . Aby je pokazać, możemy narysować wierzchołki, narysować splajn i zaznaczyć na nim punkty przegięcia.
Punkty otwarte to oryginalne wierzchołki,
xy
a czarne punkty to punkty przegięcia automatycznie identyfikowane za pomocą tego algorytmu. Ponieważ krzywizny nie można wiarygodnie obliczyć w punktach końcowych krzywej, punkty te nie są specjalnie oznaczone.źródło
Możesz użyć narzędzia Densify . W tym przypadku wybierz zagęszczenie według kąta, następnie wybierz maksymalny kąt akceptowany w linii prostej. Następnie zastosuj do linii wyników do narzędzia Linia podziału w wierzchołkach . Na koniec usuń linie o kształcie_długości mniejszym niż minimalna długość drogi.
Na tym zdjęciu widzimy trzy kroki:
1- Zagęścić linię za pomocą kąta. Jako parametru użyłem 10 stopni i zastosowaliśmy linię podziału. Na zdjęciu zakrzywiona linia znajduje się w początkowej fazie.
2 - Wybierz segmenty, w których długość kształtu nie jest redundantna. Jak widać w tabeli, nie wybrałem tych zbędnych długości. Następnie wybieram je do nowej klasy funkcji.
3- Wyodrębniliśmy wierzchołki znajdujące się na krawędziach linii, które są punktami przegięcia.
źródło
Możesz użyć narzędzia Uogólnij , który ma maksymalne przesunięcie od oryginalnej linii jako parametr, dzięki czemu możesz wybrać przesunięcie, które pasuje do twojego przypadku.
Jeśli nazwiemy pierwotną linię „line_cur”, a uogólnioną „line_gen”, możemy przyciąć „line_cur” przez „line_gen”. Wynikiem będzie prosty segment „line_cur”. Następnie możemy wyczyścić bardzo krótki odcinek, usuwając go za pomocą zapytania SQL, które wybiera Shape_length większą niż minimalna długość drogi.
źródło