ArcGIS를 처음 사용하고 "물고기가 수영 할 때"두 지점 사이의 거리를 계산하려고합니다.


9

주어진 과제에 대한 수역 인 Hydrography라는 레이어가 있습니다. 스테이션 포인트와 대상 포인트가 있습니다. 이 두 점 사이의 거리이지만 수 문학 내부의 거리를 계산해야합니다. (보트는 육지로 갈 수 없습니다)

DefenseService 거리 계산은 통과 할 수 있지만 래스터를 입력으로 사용하지 않기 때문에 직선으로 보입니다. 유클리드가 거의 그곳에있는 것 같지만, 앞으로 나아갈 것은 찾을 수 없습니다.

ArcGIS Explorer 2500, ArcGIS for Server 10.1 SP1 Enterprise를 사용하고 있으며 C #으로 서비스 및 도구를 작성하고 있습니다.

수문 촬영, IPoints 작성, 다음에해야 할 일에 대한 손실이 있습니다!

도움을 주시면 감사하겠습니다.


1
여기에는 '응답 없음'이 있지만 매우 비슷한 질문이라고 생각합니다. gis.stackexchange.com/questions/33799/…
Mapperz

그가 프로그래머가 아니라고 말할 때까지 나의 흥분 수준은 즉시 상승하기 시작했다. 도구를 사용하여 수행 할 수 없습니다. 선택한 위치와 대상 목록이있는 사용자 정의 도구 창이 있습니다. 서버에서 메소드를 호출하고 각 대상까지의 거리로 목록을 채워야합니다.
SASS_Shooter

수화 레이어 선 또는 다각형입니까?
Conor

래스터로 변환하는 다각형입니다.
SASS_Shooter

유스 케이스는 약간 혼란 스럽습니다. 당신은 호수 가장자리를 따라 두 지점에서 가장 짧은 거리를 찾으려고합니까? 아니면 당신의 역은 하천 역 (호수의 바닥)에 해당합니까?
DPierce

답변:


4

Spatial Analyst Extension에서 비용 거리 및 비용 경로 도구 를 사용하십시오 .

Hydrography Polygons에서 래스터를 만들 수 있습니다. 그런 다음 물을 나타내는 래스터 셀의 값이 낮아지고 (예 : 1) 다른 래스터 셀의 값이 높아집니다 (예 : 1000). 그런 다음이 래스터를 비용 경로 도구 에서 비용 거리 래스터 로 사용할 수 있습니다 .


예-비용 거리가 래스터를 입력으로 사용하고 수화기 래스터의 시작점과 끝점을 입력했습니다. 반환 된 값은 길이를 얻을 수있는 폴리 라인입니다.
SASS_Shooter

1

운하와 자연 수로에 중심선과 비슷한 일을했습니다. 내가 사용한 접근 방식은 포인트를 TIN으로 만들고 TIN을 이등분 한 다음 원래 정점에서 두 번째 TIN을 만든 다음 이등분선을 수정 한 Dijkstra의 알고리즘 버림 옵션을 사용하여 가장 간단한 솔루션을 형성하지 않는 즉시 확인합니다. . 수정은 라인이 '솔루션'지점에서 종료 될 수 있거나 이전 경로가 이미 존재해야합니다. 이것에 대한 기본 솔루션은 없으며, 프로그래머가 아니거나 적어도 하나의 좋은면을 얻을 수있는 위치에 있다면 유일한 옵션은 지오 데이터베이스에 오프셋으로 추적하고 보는 것입니다 shape_length 필드


TIN = 삼각 불규칙 네트워크, 각 점이 가장 가까운 이웃에 연결되고 선이 교차하지 않도록 점과 연결 선의 격자. 이에 대해서는 http://en.wikipedia.org/wiki/Delaunay_triangulation을 참조하십시오 . ESRI TIN 객체를 사용하지 않고 삼각 측량을위한 코드를 찾아 메모리에 보관했습니다 ( http://www.codeproject.com/Articles/492435/Delaunay-Triangulation-For-Fast-Mesh-Generation). .

최단 경로 알고리즘은 http://en.wikipedia.org/wiki/Dijkstra 's_algorithm을 참조하십시오 . 멋진 그림이 있습니다. 복잡한 이름에도 불구하고 정말 간단합니다.

선을 형성하는 점에서 들로네 삼각 분할 (Delaunay Triangulation)을 수행 한 다음 삼각형의 각 가장자리의 중간 점 (기본 지오메트리 ... 평균 X, 평균 Y)을 찾은 다음 다각형 내에 떨어진 점을 메쉬에 삽입하여 중심 경로 및 경계의 모든 정점에 대한 링크. 그런 다음 수로의 은행을 따르는 패싯을 제외하면 Dijkstra의 알고리즘을 사용하여 네트워크를 추적하고 결국 수로의 중심을 따라 A 지점에서 B 지점까지의 경로를 찾을 수 있습니다. 가능한 경로가 많을 것이므로 누적 길이가 이미 기록 된 길이를 초과했을 때 각 정점에 무게를 유지하고 경로를 중지했으며, 더 적 으면 짧은 누적 길이로 정점을 업데이트하십시오. 경로가 추적되며 상당히 많을 수 있습니다.

또는 삼각 측량을 한 후에 삼각형의 모서리를 피쳐 클래스로 두 점 선으로 바꾸고 네트워크를 구축 한 다음 추적을 수행 할 수 있습니다. ESRI 추적 루틴이 내 것보다 훨씬 빠르지 만 특정 요구 사항이 있었으며 기하학적 네트워크를 사용하여 해결할 수 없었습니다.


Michael-저는 C # 개발자입니다. ArcGIS와 프로그래밍 도구가 처음입니다. 나는 Military Analyst를 사용하여 즉시 사용 가능한 솔루션을 찾았지만 ESRI는 모든 것을 지혜롭게 떨어 뜨 렸습니다. TIN의 요점과 어떤 Dyjkstra 알고리즘을 사용 했습니까?
SASS_Shooter

1

나중에이 스레드를 읽는 사람을 위해 이것을 추가하고 있습니다.

여기 에이 문제를 파고 포인트 콜 사이의 거리를 확보하는 방법을 배웠습니다.

첫 번째 문제는 RasterCatalog의 정적 특성에서 비롯된 것입니다. 이 래스터를 기반으로 변경해도 RasterCatalog 내부의 래스터는 변경되지 않습니다. 우리는 해안선지도 근처에 없었던 고대 버전을 가지고 있음이 밝혀졌습니다. 학습 한 내용 : 래스터 카탈로그를 재구성하십시오. 래스터를 기반으로 래스터를 변경할 때마다.

가중치가 추가 된 거리 래스터는 다루기가 다소 번거로워집니다. 다음 시나리오를 살펴보십시오. 래스터의 원래 값은보고자하는 총 거리 1 개입니다. 셀 크기는 1 미터입니다. 래스터의 가중치가 48 인 경우보고 싶은 총 거리는 117km * 48입니다. 따라서 CostDistance 방법의 거리는 셀 거리가 아니라 가중 거리입니다. 각 셀의 합 = 총 거리에 전달 된 값까지 각 셀의 값을 추가하는 것 같습니다. 셀 크기 자체가 1 미터라도 !!!

거리 래스터는 모두 원점에 중점을 둡니다. 따라서 CostDistance 루틴을 호출 할 때 해당 목록에 원점을 포함시키지 않으려 고합니다. 그렇게하면 거리가 0 인 한 지점을 얻게됩니다.

많은 방법이 봉투를 사용하여 공정을 제한하는 반면, 가장 비싼 두 가지 방법은 래스터에 값을 설정하고 다각형 내에 영역이없는 래스터를 추출하고 모든 엔벨로프 설정을 무시하고 자동으로 항상 전체 래스터에 적용합니다. 불행하게도, 우리는 거대한 겹치는 세그먼트를 생성하고 세그먼트를 특정 박스 영역에 할당함으로써 이것을 단축시킬 수 있습니다. 그러나 그렇게 할 때 1 차 작업 영역이 잘못된 겹친 영역에 존재하지 않도록주의해야합니다. (즉, 주요 관심 지점을 포함하지 않도록 모든 중첩이 신중하게 선택되어야합니다!) 그 이유는 선택한 Coast Guard 스테이션이 존재하는 위치에 따라 올바른 래스터를 선택하여 RasterCatalog를 탐색하기 때문입니다. 프로세스를 더욱 복잡하게하기 위해 겹침은지도의 가장자리를 벗어나지 않고 원점에서 최대 120km까지 이동할 수 있어야하며 다른 주요 관심 지점과 겹치지 않아야합니다. esh.

내가 배운 유일한 다른 점은 래스터에 수학하기가 쉽지만 래스터에 구멍을 뚫고 싶거나 값이있는 도넛을 설정하고 도넛의 내부에 값 1 (잠금처럼 지연됨)은 복잡한 도구 및 ArcObject 호출 조합으로 끝납니다. 마지막 교훈은 ArcObjects가 모든 것을 할 수는 없다는 것입니다. 그래서 때로는 파이썬으로 작성된 느리고 번거로운 도구로 작업을 수행해야합니다. 또한 ESRI 도구 개발자는 일관성 유지에 대해 아무것도 몰랐습니다. 때로는 래스터 데이터베이스를 다른 시간에 가져 와서 래스터가 필요하고 때로는 기능 집합이 필요했습니다. 그리고 입력과 같은 형식으로 데이터를 반환하지 않습니다!

혼란 스러운가? 걱정하지 마십시오. ESRI입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.