Bagaimana ArcGIS menghitung jarak antara dua titik dengan proyeksi yang tidak sama?

10

Ini adalah pertanyaan lanjutan dari pertanyaan saya sebelumnya, Bisakah Anda menyarankan beberapa teks pengantar yang ditulis dengan baik tentang proyeksi sistem koordinat?


Mari kita asumsikan saya sedang bekerja dengan proyeksi peta CH1903, yang untuk semua yang saya tahu adalah konformal, tetapi tidak sama. Artinya, sudut (bentuk) telah dilestarikan, tetapi bukan area, jarak, atau skala. (Setidaknya ini belum diawetkan dengan tepat ). Sejauh ini baik.

Saya bertanya-tanya seperti apa perhitungan yang dilakukan ArcGIS ketika saya sekarang ingin menghitung jarak antara dua titik. Di ArcObjects, saya bisa menggunakan IProximityOperatorantarmuka sebagai berikut:

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

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

Pertanyaan: Ketika saya bekerja dengan sistem referensi yang tidak secara akurat menjaga jarak, apa yang akan dilakukan ArcGIS ketika saya menanyakannya untuk jarak antara dua titik (seperti yang ditunjukkan di atas)?

  • Apakah itu hanya melakukan beberapa matematika Pythagoras (a 2 + b 2 = c 2 ) untuk mendapatkan jarak, yang berarti jarak yang dikembalikan hanya akan seakurat yang dimungkinkan oleh proyeksi?

  • Atau akankah ia melakukan sesuatu yang lebih rumit, seperti semacam proyeksi ulang, untuk mendapatkan jarak yang lebih akurat?

( Pertanyaan yang sama, tetapi lebih umum: Setelah geometri diproyeksikan, apakah ArcGIS melakukan semua perhitungan hanya dalam ruang Euclidean, atau apakah proyeksi peta yang digunakan masih memengaruhi perhitungan jarak, sudut, area, dll?)

stakx
sumber
2
Harap buat pertanyaan baru alih-alih memodifikasi yang asli. Jika tidak, Anda menumbangkan semua mekanisme di situs ini: apa arti peringkat ketika dua pertanyaan atau lebih dimainkan dalam satu utas? Apa artinya menandai satu jawaban sebagai benar? Dll
whuber
1
@whuber: Meskipun semua yang telah ditulis di utas ini masih pada topik WRT pertanyaan asli yang diajukan, saya setuju bahwa sekarang ada benar-benar dua pertanyaan yang diajukan di sini. Sudah terlambat untuk mengubahnya sekarang, tetapi akan mengingat saran Anda untuk waktu berikutnya.
stakx

Jawaban:

10

Jika Anda menginginkan metode yang stabil dalam menghitung jarak geodesi, saya sarankan pembungkus Richie Carmichael untuk Mesin Proyeksi ESRI .

Pembaruan: Saya baru saja mencoba kode Richie dengan ArcGIS 10.0 di Vista64 dan mendapatkan pengecualian setelah menelepon LoadLibrary. Saya akan melihat lebih dalam nanti.

Untuk saat ini, berikut adalah beberapa kode untuk menjawab pertanyaan di komentar dari jawaban lain.

Kode membandingkan IProximityOperator untuk poin dengan dan tanpa referensi spasial. Kemudian itu menunjukkan bagaimana menggunakan proyeksi azimuth equidistant (dengan titik pertama menjadi titik singgung) untuk menemukan jarak lingkaran besar.

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

Inilah hasilnya:

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

Saya pikir akan menarik untuk menguji ini terhadap dll mesin proyeksi (pe.dll). Akan memposting hasil jika saya mendapatkan kode Richie berfungsi.

Pembaruan: Setelah saya mengubah kode Richies untuk dikompilasi untuk x86, saya menjalankannya. Menarik ... jarak lingkaran besar yang diberikannya kepada saya adalah 1960273.80162999 - perbedaan yang signifikan dari yang dikembalikan dari metode persamaan jarak azimut di atas.

Kirk Kuykendall
sumber
Alasan untuk perbedaan ini kemungkinan karena segmen garis (dalam PCS) yang menghubungkan titik-titik tersebut bukan geodesik yang diproyeksikan, yang akan melengkung ketika diproyeksikan. Dengan demikian Anda mendapatkan nilai yang lebih kecil dari yang seharusnya. Tes teori ini mudah dilakukan: ambil geodesik sederhana (seperti khatulistiwa) dan bandingkan dua perhitungan jarak antara dua titik yang terpisah secara luas pada geodesik. Salah satunya adalah perhitungan langsung, seperti dalam kode Anda; yang lain memecah geodesik menjadi segmen, langsung menghitung panjang segmen, dan menambahkannya. Yang terakhir harus lebih akurat.
whuber
9

Dalam ArcGIS 10, periksa IGeometryServer2 yang sekarang memiliki GetDistanceGeodesic (jarak geodesi antara dua geometri), GetLengthsGeodesic (kembalikan panjang geodesik dari setiap polyline), dan DensifyGeodesic (densifikasi polyline dengan memplot poin di sepanjang garis geodesik yang menghubungkan vertex, menggunakan IPolurve: : GeodesicDensify) metode.

Seperti yang disebutkan dalam jawaban lain, ArcGIS masih menggunakan sebagian besar perhitungan planar.

Melita Kennedy


Beberapa komentar atas jawaban lainnya (belum cukup perwakilan untuk berkomentar langsung!).

Proyeksi jarak jauh azimut Esri mendukung ellipsoid. Kode GreatCircleDist menciptakan PCS yang menggunakan GCS berbasis ellipsoid / spheroid, sehingga jarak dari titik pusat / asal akan menjadi jarak geodesik, bukan jarak lingkaran besar. Itu juga bisa disederhanakan. Kita tahu koordinat yang diproyeksikan dari poin pertama karena itu adalah pusat dari proyeksi: 0,0. Jadi hanya poin ke-2 yang perlu diproyeksikan. Fungsi EuclidianDistance yang disederhanakan kemudian dapat digunakan.

Saya memeriksa hasilnya terhadap fungsi geodesik pe.dll dan cocok. Sepertinya aplikasi Richie menggunakan bola, sehingga ia mengembalikan jarak / koordinat lingkaran besar dalam aplikasi pengujiannya. Itu sebabnya hasilnya tidak cocok. Saya tidak mengenali nilai radius; Saya pikir saya perlu berbicara dengannya tentang hal itu!

mkennedy
sumber
2
Melita - Senang bertemu Anda di sini!
Kirk Kuykendall
1
Saya setuju, selamat datang!
matt wilkie
8

Keakuratan jawaban apa pun tentang ArcGIS dapat berubah sewaktu-waktu - untuk semua yang kita tahu, prosedur baru akan diperkenalkan pada paket layanan berikutnya tanpa peringatan atau dokumentasi. Karena itu, perangkat lunak ESRI telah lama menggunakan perhitungan Euclidean ( misalnya , rumus Pythagoras untuk jarak) setiap kali koordinat yang diproyeksikan digunakan. Seringkali, dalam perhitungan seperti yang Anda gambarkan, perangkat lunak bahkan tidak memiliki akses ke informasi proyeksi, jadi apa lagi yang bisa dilakukan?

Pertanyaan Anda sendiri tampaknya menunjukkan bahwa perhitungan jarak Euclidean untuk proyeksi yang sama benar. Tidak ada yang bisa lebih jauh dari kebenaran. Untuk proyeksi satu titik yang sama jaraknya, jarak Euclidean ke titik dasar dijamin sama dengan jarak geodesik; untuk proyeksi dua titik yang berjarak sama, jarak Euclidean ke kedua titik dasar dijamin sama dengan jarak geodesik. Sebagai imbalan atas jaminan tersebut, distorsi metrik antara semua pasangan poin lainnya biasanya sangat meningkat dibandingkan dengan proyeksi lain yang mungkin dipilih.

whuber
sumber
@whuber: Terima kasih telah menjawab. Mengenai paragraf pertama: Saya pikir ArcGIS mungkin melihat bahwa proyeksi peta CH1903 (yang menggunakan ellipsoid Bessel 1841) digunakan, dan kemudian memproyeksikan poin kembali ke ellipsoid melalui datum, dan kemudian melakukan perhitungan jarak pada ellipsoid. Dari jawaban Anda, saya menganggap bahwa ArcGIS tidak akan melakukan semua itu dan akan tetap berada di ruang Euclidean XY untuk melakukan perhitungan. (Bagaimana dengan perangkat lunak SIG lainnya?) - Paragraf 2: Anda tentu saja benar, terima kasih telah menjelaskan poin ini.
stakx
Mekanisme proyeksi ulang tersembunyi hanya dimungkinkan jika objek titik mempertahankan referensi ke proyeksi. Saya tidak percaya mereka melakukannya.
whuber
@whuber: Apakah cukup (untuk perhitungan yang lebih akurat) untuk mengetahui ellipsoid yang digunakan untuk proyeksi? AFAIK, ArcGIS menyimpan referensi ke proyeksi yang digunakan dengan setiap kelas fitur (lapisan data).
stakx
1
Sebenarnya IPoint, yang berasal dari IGeometry, memiliki SpatialReference sebagai properti. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/… Namun, saya tidak berpikir ReturnDistance menggunakannya. Mungkin perlu pengujian untuk melihat apakah itu diubah.
Kirk Kuykendall
1
@stakx Saya telah memperbarui jawaban saya untuk memasukkan kode yang menunjukkan bahwa pengaturan spatialref tidak berdampak pada ReturnDistance.
Kirk Kuykendall