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.