Saya bekerja dengan tumpukan ESRI, menyimpan lapisan saya di geodatabase sql-spasial-diaktifkan-SDE (tipe Geometri, Web Mercator-3857).
Saya sedang membangun aplikasi pemetaan web, jadi secara default, ubin juga ada di web mercator, 3857.
Melalui procs yang tersimpan, saya menggunakan STDistance untuk menanyakan jarak dari lokasi pengguna (Koordinat juga di web mercator) ke berbagai lapisan.
Masalahnya adalah, karena distorsi web mercator, jarak calcs saya semakin tidak aktif, semakin jauh dari khatulistiwa mereka dibuat.
Saya berpikir untuk menyimpan layer saya dalam tipe sql-spatial-geography (bukan geometry), tetapi:
- Saya membayangkan pertanyaan jarak saya akan memakan waktu lebih lama (jarak calcs pada permukaan bola)
- saya perlu mengimpor kembali banyak data
- Layanan arcgis tidak akan secepat yang mereka butuhkan untuk diproyeksikan dengan cepat
Jika saya pergi ke Google maps, dan melakukan penghitungan jarak, jarak yang dikembalikan jauh lebih akurat, bahkan di daerah Nortern / selatan, jadi saya menganggap Google harus mengoreksi distorsi yang disebabkan oleh proyeksi web mercator.
Pertanyaan saya kemudian: Apakah ada nilai faktor sederhana yang dapat diterapkan pada jarak yang dilakukan dalam proyeksi web mercator untuk mendapatkan jarak "yang benar"?
sumber
cos((l1 + l2)/2)
yang akan memberi Anda jarak rhumb-line / konstan, daripada jarak lingkaran-besar.Saya akan mempertimbangkan opsi kedua Anda untuk menyimpan data Anda dalam
GEOGRAPHY
format lagi jika Anda mencari hasil yang akurat pada data global.Tidak ada yang menghentikan Anda dari memiliki dua bidang spasial dalam sebuah tabel - satu di Mercator sebagai
GEOMETRY
tipe dan satu di WGS84 sebagaiGEOGRAPHY
tipe (setidaknya tidak dalam SQL Server, saya tidak yakin tentang ArcSDE).Anda harus dapat membuat skrip geoproses sederhana yang akan mengisi kedua bidang dengan data asli Anda. Jika ada pengeditan dan pembaruan sering terjadi maka ini mungkin bukan pilihan.
Setelah memiliki dua bidang, Anda dapat melanjutkan menggunakan Mercator untuk tampilan cepat, dan mengonversi titik yang dimasukkan pengguna ke Lat / Lon untuk jarak.
Ini memiliki dua keunggulan utama:
Kecepatan kueri akan lebih kompleks, tetapi mungkin tidak terlalu diperhatikan oleh pengguna. Anda mungkin ingin menguji dengan satu kelas fitur sebelum memutuskan solusi. Anda juga harus mengonversi poin yang dimasukkan pengguna dari Mercator (yang seharusnya sepele, dan bisa dilakukan di browser).
Bahkan dengan tipe geografi sekalipun masih ada margin kesalahan:
Dari MSDN
sumber
Saran alternatif dari ESRI adalah menggunakan "layanan Geometri", yang melibatkan pengiriman geometri ke Server ArcGIS dan hasilnya dikembalikan. Jika Anda tidak mengharapkan masalah kemacetan dengan menggunakan layanan web, ini bisa menjadi pendekatan yang sangat efektif. Saya telah menggunakan pendekatan yang sama dalam aplikasi Silverlight.
Berikut ini adalah entri blog asli dari ESRI: http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Mengukur-distansi-and-areas-ketika-Anda-map-menggunakan-the- -Mercator-projection.aspx
Di blog ada contoh JavaScript yang disederhanakan, dan ada juga contoh aplikasi lengkap di sini: http://serverapps.esri.com/javascript_examples/compare_measurements.htm
sumber
Seperti yang dilakukan google earth, Anda dapat mengubah geometri menjadi proyeksi zona WGS84 lokal, atau proyeksi WGS84 yang ditingkatkan seperti SIRGAS di Amerika Selatan.
Anda dapat melihat di http://www.spatialreference.org untuk koordinat dari hampir semua proyeksi "zonifikasi", dan Anda dapat membuat tabel, dll, untuk mengubahnya tergantung pada zona.
Kami membayangkan zona tabel
semua nilai minx, miny, maxx, maxy disimpan di Spherical Mercator (Web Mercator). jadi saya akan menggunakan postgis sebagai contoh.
Semoga ini bermanfaat, semoga harimu menyenangkan.
sumber
OpenLayers memiliki metode utilitas untuk menghitung jarak antara dua titik EPSG: 4326 (WGS84) pada ellipsoid. Karena OpenLayers adalah open source, Anda dapat melihat penerapannya di sini: https://github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.js#L750
Bagi mereka yang menggunakan OpenLayers dan kontrol Measure, cukup aktifkan geodesic di opsi litteral untuk menggunakan perhitungan ini.
sumber