Pengukuran Jarak yang Lebih Baik dalam Proyeksi Web Mercator


10

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"?

Jawaban:


12

Untuk jarak pendek, Anda dapat mengalikan jarak yang dihitung dengan cos(lat), karena skala proyeksi mercator sebanding dengan garis potong garis lintang (garis potong adalah 1/cos). Juga lihat http://en.wikipedia.org/wiki/Mercator_projection#Mathematics_of_the_projection


Tambahan terima kasih ke @ jeremiah-england : sementara koreksi di atas akan benar ketika menyangkut proyeksi Mercator yang sebenarnya, Web Mercator (EPSG: 3857) bukan Mercator. EPSG menyebutnya "Pseudo-Mercator." Masalahnya adalah bahwa ia menggunakan WGS84, model elips, dan memproyeksikannya menggunakan perhitungan spherical mercator (yang digunakan Google karena lebih cepat). Jika Anda mengukur jarak Anda 1/cos(phi)dengan Mercator web, Anda akan mendapat diskon sekitar 0,6% di khatulistiwa. Lihat presentasi Noel Zinn di Web Mercator untuk lebih jelasnya.

Menurut presentasi yang disebutkan di atas, metode berikut dapat digunakan untuk menghitung jarak yang lebih akurat dari koordinat web mercator. Diberikan dx- perbedaan koordinat horizontal (arah WE), dan dy- perbedaan koordinat vertikal (arah SN):

e = 0.081819191
adjustedX = dx * cos(lat) / sqrt(1 - e^2 * sin(lat)^2)
adjustedY = dy * cos(lat) * (1 - e^2) / pow(1 - e^2 * sin(lat)^2, 3/2)
adjustedDistance = hypot(adjustedX, adjustedY)

Rasio antara penyesuaian ini dan cos(lat)lebih besar dalam arah SN, mulai dari 0.9933di khatulistiwa hingga 1.0034di kutub. Rasio arah WE dimulai dengan 1di khatulistiwa dan tumbuh sampai 1.0034di kutub.

Perhatikan bahwa koreksi ini masih bekerja dengan cukup baik hanya untuk jarak pendek, di mana geometri planar dari permukaan Bumi dapat diasumsikan.


1
Dan untuk jarak yang lebih jauh, Anda dapat menggunakan lintang rata-rata dari dua titik akhir: cos((l1 + l2)/2)yang akan memberi Anda jarak rhumb-line / konstan, daripada jarak lingkaran-besar.
MerseyViking

yang hanya mengubah spheroid, tetapi tidak memberikan presisi yang sama seperti proyeksi lokal.
falcacibar

1
@falcibar - saya tidak melihat bagaimana memilih garis lintang rata-rata mengubah spheroid
mkadunc

@MerseyViking: terima kasih, lupa menyebutkan bahwa lintang terbaik untuk digunakan untuk perhitungan akan menjadi rata-rata dari dua poin yang dibandingkan.
mkadunc

1
+1 untuk jawabannya. @Mersey: Mengapa koreksi garis lintang rata-rata berfungsi? Lagi pula, distorsi dalam Mercator dapat menjadi besar secara sewenang-wenang dan keberangkatan dari loxodromes dari geodesics juga bisa besar. Tampaknya ada beberapa kesalahan yang berpotensi besar yang dapat dibuat dimana koreksi sederhana tidak dapat diandalkan.
whuber

6

Saya akan mempertimbangkan opsi kedua Anda untuk menyimpan data Anda dalam GEOGRAPHYformat 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 GEOMETRYtipe dan satu di WGS84 sebagai GEOGRAPHYtipe (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:

  • Anda juga bisa mendapatkan area yang lebih akurat dan panjang fitur berdasarkan permintaan pengguna
  • Anda tidak perlu khawatir lupa menambahkan kode khusus untuk setiap permintaan yang berhubungan dengan pengukuran

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:

Toleransi kesalahan untuk metode geografi bisa sebesar 1.0e-7 * luasan

Dari MSDN


Sayangnya SDE hanya akan mengizinkan satu kolom spasial: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… - Saya belum mencoba membuat tampilan dan mendaftarkannya dengan SDE, tetapi itu mungkin menjadi pendekatan yang mungkin.
Allan Adair

@ Allan - senang tahu. Lain positif untuk menggunakan SDE kalau begitu! Sebuah tabel dengan hanya 4326 geometri dan gabungan kembali ke tabel asli + tampilan spasial harus mencapai tujuan yang sama
geografi

3

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


0

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

|   minx     |    miny    |    maxx    |   maxy     |  srid  |
+------------+------------+------------+------------+--------+
|234567.34314|234567.34334|234567.34334|234567.34334|  1234  |

semua nilai minx, miny, maxx, maxy disimpan di Spherical Mercator (Web Mercator). jadi saya akan menggunakan postgis sebagai contoh.

SELECT ST_Distance(
         ST_Transform( -- transform/reproject
            ST_SetSRID(geom_line, 3857) -- geom_line with forced srid assignation to web mercator
            , ( -- here we get the first SRID from the spatial position of geom_line
                 SELECT  srid
                 FROM    zones
                 WHERE   ST_Contains(
                           ST_MakeBox2d(ST_Point(minx,miny),ST_Point(maxx,maxy))
                           , geom_line
                         )
                 LIMIT 1
            ))

Semoga ini bermanfaat, semoga harimu menyenangkan.


Saya tidak bisa memastikan, tetapi berdasarkan penggunaan "STDistance" Blomster dalam pertanyaannya, sepertinya dia tidak menggunakan PostGIS. Jika Blomster menggunakan SQL Server tidak ada fungsi ST_Transform.
Allan Adair

Saya memberikan proses dan cara terbaik yang saya bisa menyelesaikannya, dia bisa menangani sisanya, lagi pula dia bisa menggunakan proyeksi ulang perangkat lunak, tetapi sangat disayangkan bahwa SQL Server tidak berurusan dengan proyeksi.
falcacibar

mungkin CLR diaktifkan dan .net library nettopologysuite dapat membantu?
falcacibar

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.