Menggunakan Pengukuran Geodesik untuk Radius Lingkaran?

15

Saat ini saya sedang mengembangkan situs pemetaan OpenLayers. Pengukuran dapat dilakukan menggunakan alat garis, dan alat area. Kedua hal ini saat ini ditetapkan untuk menghitung pengukuran geodesik sebagaimana diuraikan dalam API OpenLayers .

Saya menggunakan pengukuran geodesi daripada pengukuran planar karena selama pengujian pengguna, orang mempertanyakan pengukuran alat untuk jarak yang sudah mereka ketahui (seperti mengemudi antar kota).

Fitur baru dari situs ini adalah agar pengguna dapat menggambar lingkaran di peta radius yang ditetapkan. OpenLayers hanya memungkinkan untuk menggambar lingkaran menggunakan jarak planar, jadi ketika pengguna mengukur lingkaran dengan alat pengukuran geodesik, nilai tidak cocok. Pada gambar di bawah ini lingkaran radius planar adalah 10 km, tetapi pengukuran garis geodesik untuk diameternya adalah 12 km.

Jelas ini akan membuat pengguna (dan saya sendiri) bertanya-tanya mana yang benar.

teks alternatif

Melihat jawaban ini, tampaknya sebagian besar sistem GIS desktop "mengabaikan" masalah ini, dan mengembalikan pengukuran dan jarak planar. Jadi apa praktik terbaik dalam hal antarmuka pengguna dan akurasi untuk menangani pengukuran planar dan geodesik?

Memperbarui

Saya menemukan contoh Google ini yang menggambarkan masalah jari-jari dan proyeksi Mercator:

http://maps.forum.nu/gm_sensitive_circle2.html

Kode JavaScript untuk menggambar lingkaran adalah sebagai berikut:

    var lat1 = (PI/180)* center.lat(); // radians
    var lng1 = (PI/180)* center.lng(); // radians

    for (var a = 0 ; a < 361 ; a++ ) {
        var tc = (PI/180)*a;
        var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
        var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
        var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
        var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
        circlePoints.push(point);
        bounds.extend(point);
    }

Apakah lingkaran ini memperhitungkan kelengkungan bumi?

Pembaruan Terakhir

Kode kerja diposting di http://geographika.co.uk/creating-a-geodesic-circle-in-openlayers

geografi
sumber
1
pasti ada yang salah di sini. perbedaannya tidak bisa 20% dari jarak pendek antara garis lurus dan garis yang mengikuti spheroid. sesuatu yang lain harus dilibatkan.
Nicklas Avén
4
Proyeksi ini kemungkinan besar adalah Mercator, yang hanya memiliki skala sebenarnya di garis katulistiwa (umumnya, sebenarnya dimungkinkan untuk memiliki proyeksi Mercator dengan skala sebenarnya di tempat lain (pada satu garis lintang), tetapi sebagian besar parameterisasi global menggunakan katulistiwa). Dan kesalahan skala untuk Mercator memang sangat tinggi (tidak terbatas, pada kenyataannya, di kutub) meningkat saat Anda menuju utara / selatan dari garis lintang skala sebenarnya.
Paul Ramsey
Pengukuran dilakukan pada 52 derajat Utara, dan memang dalam proyeksi Mercator. Jadi apakah ini berarti fitur sisi klien apa pun yang diambil di Mercator akan menghasilkan area dan panjang yang sangat tidak akurat kecuali di dekat khatulistiwa?
geografi
1
Ya itu masalahnya, proyeksikan data ke jaringan lokal dalam meter atau kaki dan semua akan baik-baik saja.
Ian Turton
2
@ Paul Panggilan yang bagus. Tetapi data ini hanya menunjukkan bahwa proyeksi itu silindris, yang mana Mercator adalah satu. Dalam proyeksi silindris sejati, distorsi horizontal sama dengan detik (garis lintang). Dengan rumus ini, distorsi 20/12/12 mencapai garis lintang 52,66 derajat; itulah tepatnya garis lintang Limerick.
whuber

Jawaban:

8

Jika Anda membuat bir rumahan di peramban, Anda bisa mendapatkan "lingkaran" (itu tidak akan membulat di layar karena proyeksi Anda; lebih tepatnya didekati dengan poligon dengan poin sebanyak yang Anda inginkan), gunakan bentuk langsung perhitungan geodesik: diberi titik, arah (azimuth), dan jarak yang memberi Anda titik yang dihasilkan. Detail berdarah: http://en.wikipedia.org/wiki/Vincenty%27s_formulae#Direct_Method

Sepertinya seseorang telah melakukan terjemahan ke javascript: http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html . Beruntungnya kamu!

Untuk menyelesaikannya:

  • Putuskan seberapa tebal (# dari simpul, sebut saja n) Anda ingin hasil akhirnya.
  • Membagi 360 derajat menjadi beberapa bagian.
  • Buat poligon dengan (untuk i dalam rentang (n): polygon.add (vincenty_direct (start_point, i * 360 / n, jarak)))
  • Setelah itu, mungkin perbaiki beberapa proyeksi dan iritasi planarisation:
    • Jika Anda menggunakan proyeksi peta web biasa, yang hampir pasti Anda lakukan, poligon yang dihasilkan akan sangat melar secara vertikal jika mendekati tiang.
    • Demikian pula, jika poligon hasil melintasi garis tanggal internasional, itu akan sangat borked.

Bersulang!

Dan S.
sumber
1
Metode Vincenty telah ditambahkan ke OpenLayers di utils namespace - dev.openlayers.org/apidocs/files/OpenLayers/… dengan ini dan penjelasan Anda, terutama parameter bantalan, hapus ini. Terima kasih!
geografi
:) Biarkan saya tahu betapa menjengkelkannya 'iritasi'. Idealnya perbaikan sudah menjadi bagian dari OpenLayers & itu hanya akan berfungsi, tapi saya tidak yakin.
Dan S.
3

OpenLayers hanya memungkinkan untuk menggambar lingkaran menggunakan jarak planar

Untuk mendapatkan lingkaran geodesik, Anda bisa menggunakan operasi buffer di layanan geometri ESRI.

... jika unit linier seperti kaki atau meter, buffering geodesik dilakukan

Yang dapat diakses secara bebas tersedia di sini .

Kirk Kuykendall
sumber
Terima kasih atas tautan yang bermanfaat - Saya akan melihat apakah saya dapat memanggil layanan dan memperbarui fitur dalam JavaScript. Satu-satunya kekhawatiran saya akan bergantung pada layanan web yang bisa dimatikan kapan saja. Saya menduga bahwa titik buffer geodesik akan menjadi lingkaran 10km akurat / nyata?
geografis di
Lingkaran harus akurat, namun, saya akan memeriksanya menggunakan alat ukur Anda. Saya pikir layanan geometri adalah bagian dari instalasi server arcgis standar, jadi jika yang sudah pensiun harus ada lebih banyak di web untuk dipilih. google.com/...
Kirk Kuykendall