ArcGIS는 비등 거리 투영으로 두 점 사이의 거리를 어떻게 계산합니까?


10

이것은 이전 질문에 대한 후속 질문입니다. 좌표계 투영법에 대해 잘 작성된 소개 텍스트를 제안 할 수 있습니까?


CH1903 맵 프로젝션으로 작업하고 있다고 가정 해 봅시다. 의미, 각도 (모양)는 유지되었지만 영역, 거리 또는 스케일은 유지되지 않았습니다. (적어도 이것들은 정확하게 보존되지 않았습니다 ). 여태까지는 그런대로 잘됐다.

두 지점 사이의 거리를 계산할 때 ArcGIS가 어떤 종류의 계산을 수행하는지 궁금합니다. ArcObjects에서 다음과 같이 IProximityOperator인터페이스 를 사용할 수 있습니다 .

IPoint a = ...,
       b = ...;

double distance = ((IProximityOperator)a).ReturnDistance(b);

질문 : 거리를 정확하게 유지하지 않는 참조 시스템으로 작업 할 때 ArcGIS가 두 점 사이의 거리를 쿼리 할 때 (위 그림 참조) 어떻게해야합니까?

  • 거리를 얻기 위해 피타고라스 수학 (a 2 + b 2 = c 2 )을 단순히 수행합니까? 반환 거리는 투영이 허용하는 한 정확할 것입니까?

  • 아니면 좀 더 정확한 거리를 얻기 위해 어떤 형태의 재 투영과 같이 더 복잡한 일을합니까?

( 같은 질문이지만 더 일반적으로 : 일단 형상이 투영되면 ArcGIS가 유클리드 공간에서 모든 계산을 간단하게 수행합니까, 아니면 사용한지도 투영이 여전히 거리, 각도, 면적 등의 계산에 영향을 줍니까?)


2
원본을 수정하는 대신 새 질문을 작성하십시오. 그렇지 않으면이 사이트의 모든 메커니즘을 파괴합니다. 하나의 스레드에서 둘 이상의 질문이 진행될 때 등급은 무엇을 의미합니까? 하나의 답변을 올바른 것으로 표시한다는 것은 무엇을 의미합니까? 기타
whuber

1
@ whuber : 이 스레드에서 작성된 모든 내용은 여전히 ​​원래 질문 된 주제에 대한 WRT이지만 여전히 두 가지 질문이 있음에 동의합니다. 지금 변경하기에는 너무 늦었지만 다음에 조언을 기억할 것입니다.
stakx

답변:


10

측지 거리를 안정적으로 계산하는 방법을 원한다면 ESRI의 Projection Engine에 Richie Carmichael의 래퍼를 사용하는 것이 좋습니다 .

업데이트 : Vista64에서 ArcGIS 10.0으로 Richie의 코드를 시험해 보았고을 호출 한 후 예외가 발생했습니다 LoadLibrary. 나중에 자세히 살펴 보겠습니다.

그러나 지금은 다른 답변의 의견에 대한 질문에 대한 답변이있는 코드가 있습니다.

이 코드는 공간 참조가 있거나없는 점에 대한 IProximityOperator를 비교합니다. 그런 다음 방위각 등거리 투영법 (첫 번째 점이 접선의 점임)을 사용하여 큰 원 거리를 찾는 방법을 보여줍니다.

private void Test()
{
    IPoint p1 = new PointClass();
    p1.PutCoords(-98.0, 28.0);

    IPoint p2 = new PointClass();
    p2.PutCoords(-78.0, 28.0);

    Debug.Print("Euclidian Distance {0}", EuclidianDistance(p1, p2));
    Debug.Print("Distance with no spatialref {0}", GetDistance(p1, p2));

    ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
    IGeographicCoordinateSystem gcs =
    srf.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);

    p1.SpatialReference = gcs;
    p2.SpatialReference = gcs;

    Debug.Print("Distance with spatialref {0}", GetDistance(p1, p2));
    Debug.Print("Great Circle Distance {0}", GreatCircleDist(p1, p2));

}
private double GetDistance(IPoint p1, IPoint p2)
{
    return ((IProximityOperator)p1).ReturnDistance(p2);
}

private double EuclidianDistance(IPoint p1, IPoint p2)
{
    return Math.Sqrt(Math.Pow((p2.X - p1.X),2.0) + Math.Pow((p2.Y - p1.Y), 2.0));
}

private double GreatCircleDist(IPoint p1, IPoint p2)
{
    ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
    IProjectedCoordinateSystem pcs =
    srf.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_WGS1984N_PoleAziEqui);
    pcs.set_CentralMeridian(true, p1.X);
    ((IProjectedCoordinateSystem2)pcs).LatitudeOfOrigin = p1.Y;
    p1.SpatialReference = pcs.GeographicCoordinateSystem;
    p1.Project(pcs);
    p2.SpatialReference = pcs.GeographicCoordinateSystem;
    p2.Project(pcs);
    return EuclidianDistance(p1, p2);
}

출력은 다음과 같습니다.

Euclidian Distance 20
Distance with no spatialref 20
Distance with spatialref 20
Great Circle Distance 1965015.61318737

프로젝션 엔진 dll (pe.dll)에 대해 이것을 테스트하는 것이 흥미로울 것이라고 생각합니다. Richie의 코드가 작동하면 결과를 게시합니다.

업데이트 : x86 용 컴파일을 위해 Richies 코드를 변경하면 실행되었습니다. 흥미롭게도 ... 그것이주는 원 거리는 1960273.80162999입니다-위의 방위 등거리 방법에서 반환 된 것과 큰 차이가 있습니다.


불일치의 이유는 점을 연결하는 선분 (PCS의)이 투영 측지가 아니기 때문에 투영 될 때 곡선 일 수 있기 때문입니다. 따라서 필요한 것보다 작은 가치를 얻습니다. 이 이론의 시험은 간단합니다 : 적도와 같은 간단한 측지선을 취하고 측지선에서 넓게 분리 된 두 지점 사이의 거리에 대한 두 계산을 비교합니다. 하나는 코드에서와 같이 직접 계산입니다. 다른 하나는 측지선을 세그먼트로 나누고 세그먼트 길이를 직접 계산하여 합산합니다. 후자가 더 정확해야합니다.
whuber

9

ArcGIS 10에서 GetDistanceGeodesic (두 형상 사이의 측지 거리), GetLengthsGeodesic (각 폴리선의 측지 길이를 반환) 및 DensifyGeodesic (정점을 연결하는 측지선을 따라 점을 플로팅하여 폴리 라인을 지정 함)이있는 IGeometryServer2를 확인하십시오. : GeodesicDensify) 방법.

다른 답변에서 언급했듯이 ArcGIS는 여전히 대부분 평면 계산을 사용합니다.

멜리 타 케네디


다른 답변에 대한 일부 해설

Esri의 방위각 등거리 투영은 타원체를 지원합니다. GreatCircleDist 코드는 타원체 / 구형 기반 GCS를 사용하는 PCS를 생성하므로 중심 / 원점으로부터의 거리는 큰 원거리가 아니라 측지 거리입니다. 또한 단순화 될 수 있습니다. 첫 번째 점의 투영 된 좌표는 투영의 중심이므로 0,0입니다. 따라서 두 번째 점만 투사하면됩니다. 단순화 된 EuclidianDistance 기능을 사용할 수 있습니다.

pe.dll의 측지 기능과 비교하여 결과를 확인했으며 일치했습니다. Richie의 앱이 구를 사용하는 것처럼 보이므로 테스트 응용 프로그램에서 큰 원 거리 / 좌표를 반환합니다. 그렇기 때문에 결과가 일치하지 않습니다. 반경 값을 인식하지 못했습니다. 나는 그것에 대해 이야기해야한다고 생각합니다!


2
Melita-만나서 반가워요!
Kirk Kuykendall

1
동의합니다. 탑승을 환영합니다!
매트 윌키

8

ArcGIS에 대한 답변의 정확성은 언제든지 변경 될 수 있습니다. 우리가 알고있는 모든 것은 새로운 서비스 절차에 경고 나 문서없이 도입 될 것입니다. 즉, ESRI 소프트웨어는 투영 좌표가 사용될 때마다 오랫동안 유클리드 계산 ( 예 : 거리에 대한 피타고라스 공식)을 사용했습니다. 종종 설명하는 것과 같은 계산에서 소프트웨어는 투영 정보에 액세스 할 수 없으므로 다른 작업을 수행 할 수 있습니까?

귀하의 질문 자체는 등거리 투영에 대한 유클리드 거리 계산이 올바른 것으로 제안합니다. 더 이상 진실에서 멀어 질 수는 없습니다. 원 포인트 등거리 투영 들어, 유클리드 거리 기준점은 측지선 거리를 동일하게 보장된다; 2 점 등거리 투사의 경우, 어느 기준점까지의 유클리드 거리는 측지 거리와 동일하게 보장됩니다. 이러한 보장에 대한 대가로, 다른 모든 쌍의 점 사이의 메트릭 왜곡은 일반적으로 다른 투영법에 비해 크게 증가합니다.


@ whuber : 답변 주셔서 감사합니다. 첫 번째 단락과 관련하여 : ArcGIS가 CH1903 맵 투영 (Bessel 1841 타원체를 사용함)이 사용 된 것을 확인한 다음 데이텀을 통해 점을 해당 타원체에 다시 투영 한 다음 타원체에서 거리를 계산합니다. 귀하의 답변에서 ArcGIS는 모든 것을하지 않으며 계산을 수행하기 위해 유클리드 XY 공간에 남아있을 것이라고 생각합니다. (다른 GIS 소프트웨어는 어떻습니까?)- 두 번째 단락 : 당연히이 점을 분명히 해주셔서 감사합니다.
stakx

포인트 객체가 투영에 대한 참조를 유지하는 경우에만 숨겨진 재 투영 메커니즘이 가능합니다. 나는 그들이 믿지 않습니다.
whuber

@ whuber : 투영에 사용 된 타원체를 아는 것이 충분 합니까 (보다 정확한 계산을 위해)? AFAIK, ArcGIS는 각 피쳐 클래스 (데이터 레이어)와 함께 사용 된 투영에 대한 참조를 저장합니다.
stakx

1
실제로 IGeometry에서 파생 된 IPoint는 SpatialReference를 속성으로 사용합니다. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/… 그러나 ReturnDistance가이를 사용한다고 생각하지 않습니다. 그래도 변경되었는지 테스트 해 볼 가치가 있습니다.
Kirk Kuykendall

1
@stakx 공간 참조 설정이 ReturnDistance에 영향을 미치지 않음을 보여주는 코드를 포함하도록 답변을 업데이트했습니다.
Kirk Kuykendall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.