Nowy w ArcGIS i chce obliczyć odległość między dwoma punktami „podczas pływania ryby”


9

Mamy warstwę o nazwie Hydrografia, która jest obszarem wodnym dla danego zadania. Mam punkt stacji i punkt docelowy. Muszę obliczyć odległość między tymi dwoma punktami, ale wewnątrz hydrografii. (łodzie nie mogą płynąć po lądzie)

Obliczenie odległości DefenceService wygląda na przejezdne, ale wydaje się, że jest w linii prostej, ponieważ nie przyjmuje żadnych danych rastrowych jako danych wejściowych. Wydaje się, że euklides jest prawie na miejscu, ale nie mogę znaleźć niczego, co byłoby proste.

Korzystam z ArcGIS Explorer 2500, ArcGIS dla Server 10.1 SP1 Enterprise, a nasze usługi i narzędzia piszemy w języku C #.

Mam ładowanie hydrografii, tworzenie punktów IP, ale nie wiem, co robić dalej!

Poproszę o pomoc.


1
Nie ma tutaj „ nieakceptowanej
— Mapperz

Mój poziom ekscytacji zaczął rosnąć natychmiast, dopóki nie powiedział, że nie jest programistą. Nie można tego zrobić za pomocą narzędzi. Mam niestandardowe okno narzędzia z wybraną lokalizacją i listą celów. Muszę wywołać metodę na serwerze i wypełnić listę odległościami do każdego celu.
— SASS_Shooter

Czy twoje linie warstw hydrograficznych lub wielokąty?
— Conor,

Są to wielokąty, które przekształcamy w raster.
— SASS_Shooter

Twój przypadek użycia jest trochę mylący. Czy próbujesz znaleźć najkrótszą odległość od dwóch punktów na brzegu jeziora? Czy twoje stacje odpowiadają stacji rzecznej (która znajduje się na dnie jeziora)?
— DPierce

Odpowiedzi:


4

Użyj narzędzi Odległość kosztów i Ścieżka kosztów z rozszerzenia Analityka przestrzenna.

Możesz utworzyć raster ze swoich wielokątów hydrograficznych. Następnie upewnij się, że komórki rastrowe reprezentujące wodę mają niską wartość (np. 1), a pozostałe komórki rastrowe mają wysoką wartość (np. 1000). Następnie możesz użyć tego rastra jako rastra kosztu odległości w narzędziu ścieżki kosztów .


Tak - odkryłem, że Koszt Dystansu wymaga rastra jako danych wejściowych i moich punktów na rastrze hydrograficznym za start i metę. Zwrócona wartość to polilinia, z której mogę uzyskać długość.
— SASS_Shooter

1

Zrobiłem coś podobnego dla linii środkowej nad kanałami i naturalnymi ciekami wodnymi. Podejście, które zastosowałem, polegało na TIN punktów, podzieleniu TIN, a następnie utwórz drugi TIN z oryginalnych wierzchołków, a dwusieczne następnie przechodzą, używając opcji odrzucania zmodyfikowanego algorytmu Dijkstry, gdy tylko okaże się, że nie będą najprostszym rozwiązaniem . Modyfikacja polegała na tym, że linia mogła zakończyć się w punkcie „rozwiązania” lub na poprzedniej ścieżce, jeśli taka już istnieje. Nie ma na to gotowego rozwiązania, a jeśli nie jesteś programistą lub przynajmniej jesteś w stanie uzyskać dobrą stronę, jedyną opcją jest prześledzenie z przesunięciem do geobazy i sprawdzenie pole shape_length.


TIN = trójkątna nieregularna sieć, sieć punktów i linie łączące, dzięki czemu każdy punkt jest połączony z najbliższymi sąsiadami i żadne linie nie przecinają się. W tym celu patrz http://en.wikipedia.org/wiki/Delaunay_triangulation . Nie używałem obiektów ESRI TIN, zamiast tego znalazłem kod do triangulacji i zachowałem je w pamięci, coś w rodzaju http://www.codeproject.com/Articles/492435/Delaunay-Triangulation-For-Fast-Mesh-Generation .

Algorytm najkrótszej ścieżki można znaleźć na stronie http://en.wikipedia.org/wiki/S_algorytm Dijkstry. Ma ładny obraz; pomimo skomplikowanej nazwy jest naprawdę dość prosta.

Z punktów tworzących linie wykonałem triangulację Delaunaya, a następnie znalazłem punkt środkowy każdej krawędzi trójkąta (podstawowa geometria ... średnia X, średnia Y), a następnie wstawiłem punkty, które wpadły w wielokąty do siatki, co daje środkowa ścieżka i linki do wszystkich wierzchołków na granicy. Następnie wykluczając fasety, które biegną wzdłuż brzegów cieku, prześledź sieć za pomocą algorytmu Dijkstry, a ostatecznie znajdziesz ścieżkę z punktu A do punktu B biegnącą w przybliżeniu w centrum centrum cieków wodnych. Będzie wiele możliwych ścieżek, więc utrzymałem wagę na każdym wierzchołku i zatrzymałem ścieżkę, gdy łączna długość przekroczyła już zarejestrowaną długość, a jeśli była mniejsza, zaktualizuj wierzchołek krótszą łączną długością - zmniejsza to ścieżki, które są śledzone, a może być ich całkiem sporo;

Alternatywnie, po triangulacji możesz zmienić krawędzie trójkątów w dwie linie punktowe jako klasę obiektów, zbudować sieć, a następnie wykonać śledzenie. Jestem pewien, że procedury śledzenia ESRI są znacznie szybsze niż moje, ale miałem określoną potrzebę i nie mogłem jej rozwiązać za pomocą sieci geometrycznych.


Michael - Jestem programistą C #. Po prostu nowość w ArcGIS i ich narzędziach programistycznych. Znalazłem jedno gotowe rozwiązanie przy użyciu Military Analyst, ale ESRI w całej swojej mądrości porzuca je. Co rozumiesz przez TIN punkty i jakiego algorytmu Dyjkstra używałeś?
— SASS_Shooter

1

Dodam to dla każdego, kto w przyszłości przeczyta ten wątek.

Oto wszystko, czego nauczyłem się, zagłębiając się w ten problem i uzyskując pełną odległość między punktami.

Nasz pierwszy problem wynikał ze statycznej natury RasterCatalog. Zmiana rastrów, na których jest to oparte, NIE zmienia rastra w katalogu RasterCatalog. Okazało się, że nasza miała starożytną wersję, której nigdzie nie było w pobliżu mapy wybrzeża. Wyciągnięta lekcja: Odbuduj katalog Raster za każdym razem, gdy zmienisz rastry, na których jest oparty.

Dystansowy raster z dodanymi wagami staje się dość niewygodny do pracy. Spójrz na następujący scenariusz: Oryginalna wartość rastra to 1 łączna odległość, na którą chcę spojrzeć, to 117 km. Rozmiar komórki wynosi 1 metr. Jeśli raster ma teraz wartość ważoną 48, to łączna odległość, na którą chcę spojrzeć, wynosi 117 km * 48 !!! Zatem odległość w metodzie CostDistance nie jest odległością komórki, ale odległością ważoną, najwyraźniej dodając wartość w każdej komórce, aż suma każdej komórki = wartość przekazana dla całkowitej odległości. Nawet jeśli sam rozmiar komórki wynosi 1 metr !!!

Raster odległości jest skupiony na punkcie początkowym. Kiedy wywołujesz procedurę CostDistance, nie chcesz uwzględniać punktu początkowego na tej liście. jeśli to zrobisz, otrzymasz jeden punkt w odległości 0. (to nawet zakłopotane wsparcie ESRI)

Podczas gdy wiele metod wykorzystuje Obwiednię do ograniczenia swojego procesu, dwie najdroższe, ustawiając wartość rastra i wyodrębniając raster bez obszaru w wielokącie, ignorują wszystkie ustawienia obwiedni i automatycznie stosują to do całego rastra. Na nieszczęście dla nas możemy to tylko skrócić, tworząc masywne nakładające się segmenty i przypisując segment do określonego obszaru w ramce. Robiąc to, musimy jednak uważać (co jest trudne), aby główny obszar operacji nie istniał w niewłaściwym obszarze nakładającym się. (innymi słowy, wszystkie nasze nakładki muszą być starannie wybrane, aby nie zawierały żadnych głównych punktów zainteresowania!). Powodem tego jest to, że nawigujemy w katalogu Raster, wybierając właściwy raster na podstawie tego, gdzie istnieje wybrana stacja Straży Przybrzeżnej. Aby jeszcze bardziej skomplikować nasz proces, nakładanie się musi umożliwiać nam nawigację w odległości do 120 km od naszego punktu początkowego bez zbiegania z krawędzi mapy i nienakładania się na inne główne punkty zainteresowania. Do licha.

Jedyne inne rzeczy, których się nauczyłem, to łatwość matematyki do rastra, ale jeśli chcesz albo „wbić dziurę” w rastrze (zablokowanie), albo ustawić pączka o wartości, a wnętrze pączka ma wartość 1 (opóźnienia jak blokada) kończy się złożoną kombinacją narzędzi i wywołań ArcObject. Co prowadzi do wyciągniętej ostatniej lekcji: ArcObjects nie może zrobić wszystkiego. Czasami jestem zmuszony do robienia rzeczy za pomocą powolnych, uciążliwych narzędzi, które wszystkie zostały napisane w pythonie. Dowiedziałem się również, że twórcy narzędzi ESRI nie wiedzieli nic o utrzymywaniu spójności. Czasami korzystali z bazy danych rastrowych, innym razem potrzebowali rastra, a czasami potrzebowali zestawu funkcji. I nie zwracają danych w tym samym formacie, którego wymagają na wejściu!

Zmieszany? Nie martw się, to ESRI.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.