ArcGIS tính toán khoảng cách giữa hai điểm bằng phép chiếu không tương đương như thế nào?


10

Đây là một câu hỏi tiếp theo cho câu hỏi trước của tôi, bạn có thể đề xuất một số văn bản giới thiệu được viết tốt về các phép chiếu hệ tọa độ không?


Giả sử tôi đang làm việc với phép chiếu bản đồ CH1903, mà đối với tất cả những gì tôi biết là tuân thủ, nhưng không tương đương. Ý nghĩa, các góc (hình dạng) đã được bảo tồn, nhưng không phải là các khu vực, khoảng cách hoặc tỷ lệ. (Ít nhất những điều này đã không được bảo tồn chính xác ). Càng xa càng tốt.

Tôi đang tự hỏi ArcGIS thực hiện loại phép tính nào khi tôi muốn tính khoảng cách giữa hai điểm. Trong ArcObjects, tôi có thể sử dụng IProximityOperatorgiao diện như sau:

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

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

Câu hỏi: Khi tôi làm việc với một hệ thống tham chiếu không bảo toàn chính xác khoảng cách, ArcGIS sẽ làm gì khi tôi truy vấn nó cho khoảng cách giữa hai điểm (như được hiển thị ở trên)?

  • Có phải nó chỉ đơn giản là làm một số phép toán Pythagore (a 2 + b 2 = c 2 ) để có được khoảng cách, có nghĩa là khoảng cách trả về sẽ chỉ chính xác như phép chiếu cho phép?

  • Hoặc nó sẽ làm một cái gì đó phức tạp hơn, như một số hình thức chiếu lại, để có được một khoảng cách chính xác hơn?

( Cùng một câu hỏi, nhưng tổng quát hơn: Khi hình học đã được dự kiến, không ArcGIS thực hiện tất cả các phép tính đơn giản trong không gian Euclide, hoặc không chiếu bản đồ đã qua sử dụng vẫn còn ảnh hưởng đến tính toán khoảng cách, góc, khu vực, vv?)


2
Vui lòng tạo một câu hỏi mới thay vì sửa đổi bản gốc của bạn. Mặt khác, bạn lật đổ tất cả các cơ chế trên trang web này: xếp hạng có nghĩa là gì khi hai hoặc nhiều câu hỏi được chơi trong một luồng? Điều đó có nghĩa gì khi đánh dấu một câu trả lời là đúng? Vv
whuber

1
@whuber: Mặc dù tất cả những gì được viết trong chủ đề này vẫn thuộc chủ đề WRT, câu hỏi ban đầu được hỏi, tôi đồng ý rằng bây giờ thực sự có hai câu hỏi được hỏi ở đây. Bây giờ đã quá muộn để thay đổi điều đó, nhưng sẽ ghi nhớ lời khuyên của bạn cho lần sau.
stakx

Câu trả lời:


10

Nếu bạn muốn có một phương pháp tính toán khoảng cách trắc địa ổn định, tôi khuyên bạn nên sử dụng trình bao bọc của Richie Carmichael cho Công cụ Chiếu của ESRI .

Cập nhật: Tôi vừa thử mã Richie với ArcGIS 10.0 trên Vista64 và nhận được một ngoại lệ sau khi gọi LoadLibrary. Tôi sẽ xem xét điều đó sau.

Bây giờ mặc dù, đây là một số mã để trả lời các câu hỏi trong các ý kiến ​​của một câu trả lời khác.

Mã so sánh IProighborOperator cho các điểm có và không có tham chiếu không gian. Sau đó, nó cho thấy làm thế nào để sử dụng một phép chiếu tương đương phương vị (với điểm đầu tiên là điểm tiếp tuyến) để tìm khoảng cách vòng tròn lớn.

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);
}

Đây là đầu ra:

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

Tôi nghĩ sẽ rất thú vị khi thử nghiệm điều này với dll của công cụ chiếu (pe.dll). Sẽ đăng kết quả nếu tôi nhận được mã Richie hoạt động.

Cập nhật: Khi tôi đã thay đổi mã Richies để biên dịch cho x86, tôi đã chạy nó. Thật thú vị ... khoảng cách vòng tròn lớn mà nó mang lại cho tôi là 1960273.80162999 - một sự khác biệt đáng kể so với phương pháp trả về phương vị phương vị ở trên.


Lý do cho sự khác biệt có thể là do đoạn đường (trong PCS) kết nối các điểm không phải là trắc địa dự kiến, sẽ bị cong khi chiếu. Theo đó bạn nhận được một giá trị nhỏ hơn bạn nên. Một thử nghiệm của lý thuyết này rất đơn giản để thực hiện: lấy một trắc địa đơn giản (chẳng hạn như đường xích đạo) và so sánh hai phép tính khoảng cách giữa hai điểm được phân tách rộng rãi trên trắc địa. Một là tính toán trực tiếp, như trong mã của bạn; cái còn lại phá vỡ trắc địa thành các phân đoạn, trực tiếp tính toán độ dài của phân đoạn và thêm chúng vào. Cái sau nên chính xác hơn.
whuber

9

Trong ArcGIS 10, hãy kiểm tra IGeometryServer2 hiện có GetDistanceGeodesic (khoảng cách trắc địa giữa hai hình học), GetLạngsGeodesic (trả về độ dài trắc địa của từng đường đa tuyến) và DensifyGeodesic : Phương pháp GeodesicDensify).

Như đã đề cập trong các câu trả lời khác, ArcGIS vẫn sử dụng các tính toán chủ yếu là phẳng.

Melita Kennedy


Một số bình luận về các câu trả lời khác (chưa đủ đại diện để bình luận trực tiếp!).

Phép chiếu phương vị phương vị của Esri hỗ trợ các elip. Mã GreatCircleDist đang tạo ra một PCS sử dụng GCS dựa trên hình elip / hình cầu, do đó khoảng cách từ điểm trung tâm / điểm gốc sẽ là khoảng cách trắc địa, không phải là khoảng cách vòng tròn lớn. Nó cũng có thể được đơn giản hóa. Chúng ta biết các coords dự kiến ​​của điểm đầu tiên bởi vì đó là tâm của hình chiếu: 0,0. Vì vậy, chỉ có điểm thứ 2 cần được chiếu. Hàm EuclidianDistance đơn giản hóa sau đó có thể được sử dụng.

Tôi đã kiểm tra kết quả dựa trên các chức năng trắc địa của pe.dll và nó khớp. Có vẻ như ứng dụng Richie đang sử dụng một hình cầu, vì vậy nó sẽ trả về khoảng cách / tọa độ vòng tròn lớn trong ứng dụng thử nghiệm của nó. Đó là lý do tại sao kết quả không phù hợp. Tôi đã không nhận ra các giá trị bán kính; Tôi nghĩ rằng tôi cần nói chuyện với anh ấy về nó!


2
Melita - Thật tuyệt khi gặp bạn ở đây!
Kirk Kuykendall

1
Tôi đồng ý, chào mừng bạn!
matt wilkie

8

Độ chính xác của bất kỳ câu trả lời nào về ArcGIS có thể thay đổi bất cứ lúc nào - đối với tất cả những gì chúng tôi biết, các quy trình mới sẽ được giới thiệu trong gói dịch vụ tiếp theo mà không cần cảnh báo hoặc tài liệu. Điều đó đang được nói, phần mềm ESRI trong một thời gian dài đã sử dụng các tính toán Euclide ( ví dụ: công thức Pythagore cho khoảng cách) bất cứ khi nào tọa độ dự kiến ​​được sử dụng. Thông thường, trong các tính toán như cách bạn minh họa, phần mềm thậm chí không có quyền truy cập vào thông tin chiếu, vậy còn có thể làm gì khác?

Câu hỏi của bạn dường như gợi ý rằng các phép tính khoảng cách Euclide cho phép chiếu tương đương là chính xác. Không gì có thể hơn được sự thật. Đối với phép chiếu tương đương một điểm, khoảng cách Euclide đến điểm gốc được đảm bảo bằng khoảng cách đo đạc; đối với phép chiếu tương đương hai điểm, khoảng cách Euclide đến một trong hai điểm cơ sở được đảm bảo bằng khoảng cách đo đạc. Đổi lại cho những đảm bảo đó, độ méo số liệu giữa tất cả các cặp điểm khác thường được tăng lên rất nhiều so với các phép chiếu khác mà người ta có thể chọn.


@whuber: Cảm ơn bạn đã trả lời. Liên quan đến đoạn đầu tiên: Tôi đã hình dung ArcGIS có thể thấy rằng phép chiếu bản đồ CH1903 (sử dụng ellipsoid Bessel 1841) được sử dụng, và sau đó chiếu các điểm trở lại vào ellipsoid thông qua mốc đo lường, và sau đó thực hiện các phép tính khoảng cách trên ellipsoid. Từ câu trả lời của bạn, tôi cho rằng ArcGIS sẽ không làm tất cả những điều đó và sẽ ở lại trong không gian XY của Euclid để thực hiện các phép tính. (Còn phần mềm GIS khác thì sao?) - Đoạn 2: Tất nhiên là bạn đúng, cảm ơn vì đã làm rõ điểm này.
stakx

Một cơ chế từ chối ẩn chỉ có thể nếu các đối tượng điểm duy trì các tham chiếu đến một phép chiếu. Tôi không tin họ làm.
whuber

@whuber: Sẽ là đủ (để tính toán chính xác hơn) để biết ellipsoid được sử dụng cho phép chiếu? AFAIK, ArcGIS lưu trữ một tham chiếu đến phép chiếu được sử dụng với mỗi lớp tính năng (lớp dữ liệu).
stakx

1
Trên thực tế IPoint, có nguồn gốc từ IGeometry, có SpatialReference như một tài sản. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/ Khăn Tuy nhiên, tôi không nghĩ ReturnDistance sử dụng nó. Nó có thể là giá trị thử nghiệm để xem nếu điều đó thay đổi mặc dù.
Kirk Kuykendall

1
@stakx Tôi đã cập nhật câu trả lời của mình để bao gồm mã cho thấy rằng việc đặt spatialref không ảnh hưởng đến ReturnDistance.
Kirk Kuykendall
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.