Saya telah memberikan lokasi yang ditentukan oleh lintang dan bujur. Sekarang saya ingin menghitung kotak pembatas dalam jarak misalnya 10 kilometer dari titik itu.
Kotak pembatas harus didefinisikan sebagai latmin, lngmin dan latmax, lngmax.
Saya membutuhkan barang ini untuk menggunakan API panoramio .
Apakah seseorang mengetahui rumus cara mendapatkan poin itu?
Sunting: Teman-teman saya mencari rumus / fungsi yang mengambil lat & lng sebagai masukan dan mengembalikan kotak pembatas sebagai latmin & lngmin dan latmax & latmin. Mysql, php, c #, javascript baik-baik saja tetapi juga pseudocode harus baik-baik saja.
Sunting: Saya tidak mencari solusi yang menunjukkan jarak 2 poin
Jawaban:
Saya menyarankan untuk memperkirakan secara lokal permukaan bumi sebagai bola dengan radius yang diberikan oleh ellipsoid WGS84 pada garis lintang yang diberikan. Saya menduga bahwa penghitungan yang tepat dari latMin dan latMax akan membutuhkan fungsi elips dan tidak akan menghasilkan peningkatan akurasi yang cukup (WGS84 sendiri merupakan perkiraan).
Implementasi saya mengikuti (Ini ditulis dengan Python; Saya belum mengujinya):
EDIT: Kode berikut mengubah (derajat, bilangan prima, detik) menjadi derajat + pecahan derajat, dan sebaliknya (tidak diuji):
sumber
Saya menulis artikel tentang menemukan koordinat pembatas:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
Artikel tersebut menjelaskan rumus dan juga menyediakan implementasi Java. (Ini juga menunjukkan mengapa rumus Federico untuk bujur min / maks tidak akurat.)
sumber
public override string ToString()
sangat buruk untuk menimpa metode global seperti itu hanya untuk satu tujuan, lebih baik hanya menambahkan metode lain, kemudian mengganti metode standar, yang dapat digunakan di bagian aplikasi lain, bukan untuk gis tepatnya ...Di sini saya telah mengubah jawaban Federico A. Ramponi menjadi C # untuk siapa pun yang tertarik:
sumber
Saya menulis fungsi JavaScript yang mengembalikan empat koordinat kotak pembatas persegi, diberi jarak dan sepasang koordinat:
sumber
minLon = void 0;
danmaxLon = MAX_LON;
itu masih tidak bekerja.centerPoint
argumen adalah larik yang terdiri dari dua koordinat. Misalnya,getBoundingBox([42.2, 34.5], 50)
-void 0
adalah keluaran CoffeeScript untuk "tidak ditentukan" dan tidak akan memengaruhi kemampuan kode untuk dijalankan.degLat.degToRad
bukan fungsidegToRad
kesalahan "bukan fungsi". Tidak pernah tahu mengapa tetapiNumber.prototype.
bukan ide yang baik untuk fungsi utilitas seperti ini jadi saya mengubahnya menjadi fungsi lokal normal. Juga penting untuk dicatat bahwa kotak yang dikembalikan adalah [LNG, LAT, LNG, LAT] bukan [LAT, LNG, LAT, LNG]. Saya memodifikasi fungsi pengembalian ketika saya menggunakan ini untuk menghindari kebingungan.Karena saya membutuhkan perkiraan yang sangat kasar, jadi untuk menyaring beberapa dokumen yang tidak perlu dalam kueri elasticsearch, saya menggunakan rumus di bawah ini:
N = kms diperlukan dari lokasi yang diberikan. Untuk kasus Anda N = 10
Tidak akurat tapi berguna.
sumber
Anda sedang mencari rumus ellipsoid.
Tempat terbaik yang saya temukan untuk memulai pengkodean didasarkan pada pustaka Geo :: Ellipsoid dari CPAN. Ini memberi Anda dasar untuk membuat pengujian Anda dari dan untuk membandingkan hasil Anda dengan hasilnya. Saya menggunakannya sebagai dasar untuk pustaka serupa untuk PHP di tempat kerja saya sebelumnya.
Geo :: Ellipsoid
Lihatlah
location
metodenya. Sebut dua kali dan Anda mendapatkan bbox Anda.Anda tidak memposting bahasa yang Anda gunakan. Mungkin sudah ada pustaka geocoding yang tersedia untuk Anda.
Oh, dan jika Anda belum mengetahuinya sekarang, Google maps menggunakan ellipsoid WGS84.
sumber
Ilustrasi penjelasan yang sangat baik dari @Jan Philip Matuschek. (Harap pilih jawabannya, bukan ini; Saya menambahkan ini karena saya meluangkan sedikit waktu untuk memahami jawaban aslinya)
Teknik kotak pembatas untuk mengoptimalkan menemukan tetangga terdekat perlu mendapatkan garis lintang minimum dan maksimum, pasangan bujur, untuk titik P pada jarak d. Semua titik yang berada di luar ini pasti berada pada jarak yang lebih besar dari d dari titik tersebut. Satu hal yang perlu diperhatikan di sini adalah perhitungan garis lintang persimpangan seperti yang disorot dalam penjelasan Jan Philip Matuschek. Garis lintang persimpangan tidak berada pada garis lintang titik P tetapi sedikit diimbangi darinya. Ini adalah bagian yang sering terlewat tetapi penting dalam menentukan garis bujur batas minimum dan maksimum yang benar untuk titik P untuk jarak d. Ini juga berguna dalam verifikasi.
Jarak haversine antara (garis lintang persimpangan, garis bujur tinggi) ke (garis lintang, garis bujur) P sama dengan jarak d.
Inti Python di sini https://gist.github.com/alexcpn/f95ae83a7ee0293a5225
sumber
Berikut ini adalah implementasi sederhana menggunakan javascript yang didasarkan pada konversi derajat lintang ke kms dimana
1 degree latitude ~ 111.2 km
.Saya menghitung batas peta dari garis lintang dan bujur tertentu dengan lebar 10 km.
sumber
Saya mengadaptasi skrip PHP yang saya temukan untuk melakukan hal ini. Anda dapat menggunakannya untuk mencari sudut-sudut kotak di sekitar suatu titik (katakanlah, jarak 20 km). Contoh spesifik saya adalah untuk Google Maps API:
http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometers
sumber
Saya sedang mengerjakan masalah kotak pembatas sebagai masalah sampingan untuk menemukan semua titik dalam radius SrcRad dari titik LAT, PANJANG statis. Ada cukup banyak perhitungan yang digunakan
untuk menghitung batas bujur, tetapi saya menemukan ini tidak memberikan semua jawaban yang diperlukan. Karena yang benar-benar ingin Anda lakukan adalah
Saya tahu, saya tahu jawabannya harus sama, tetapi ternyata tidak. Tampaknya dengan tidak memastikan bahwa saya melakukan (SRCrad / RadEarth) Pertama dan kemudian membaginya dengan bagian Cos saya meninggalkan beberapa titik lokasi.
Setelah Anda mendapatkan semua titik kotak pembatas, jika Anda memiliki fungsi yang menghitung Jarak Titik ke Titik dengan garis lintang, panjang mudah untuk hanya mendapatkan titik-titik yang berada dalam radius jarak tertentu dari titik tetap. Inilah yang saya lakukan. Saya tahu perlu beberapa langkah ekstra, tetapi itu membantu saya
sumber
Sangat sederhana, cukup buka situs web panoramio dan kemudian buka Peta Dunia dari situs web panoramio. Lalu buka lokasi yang ditentukan yang diperlukan garis lintang dan bujur.
Kemudian Anda menemukan lintang dan bujur di bilah alamat misalnya di alamat ini.
http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all
lt = 32,739485 => lintang ln = 70,491211 => bujur
widget Panoramio JavaScript API ini membuat kotak pembatas di sekitar pasangan lintang / bujur dan kemudian mengembalikan semua foto dengan batas tersebut.
Jenis lain dari widget Panoramio JavaScript API di mana Anda juga dapat mengubah warna latar belakang dengan contoh dan kode ada di sini .
Itu tidak muncul dalam mood menulis. Itu muncul setelah penerbitan.
sumber
Di sini saya telah mengubah jawaban Federico A. Ramponi menjadi PHP jika ada yang tertarik:
sumber
Terima kasih @Fedrico A. untuk implementasi Phyton, saya telah memasukkannya ke dalam kelas kategori Objective C. Disini adalah:
Saya telah mengujinya dan tampaknya bekerja dengan baik. Struct BoundsLocation harus diganti dengan kelas, saya telah menggunakannya hanya untuk membagikannya di sini.
sumber
Semua jawaban di atas hanya sebagian yang benar . Khususnya di wilayah seperti Australia, mereka selalu menyertakan tiang dan menghitung persegi panjang yang sangat besar bahkan untuk 10 km.
Khususnya algoritme oleh Jan Philip Matuschek di http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex menyertakan persegi panjang yang sangat besar dari (-37, -90, -180, 180) untuk hampir setiap titik di Australia. Ini mengenai pengguna besar dalam database dan jarak harus dihitung untuk semua pengguna di hampir setengah negara.
Saya menemukan bahwa Drupal API Earth Algorithm oleh Rochester Institute of Technology bekerja lebih baik di sekitar kutub serta di tempat lain dan jauh lebih mudah untuk diterapkan.
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
Gunakan
earth_latitude_range
danearth_longitude_range
dari algoritma di atas untuk menghitung persegi panjang pembatasDan gunakan rumus penghitungan jarak yang didokumentasikan oleh google maps untuk menghitung jarak
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
Untuk mencari berdasarkan kilometer, bukan mil, ganti 3959 dengan 6371. Untuk (Lat, Lng) = (37, -122) dan tabel Markers dengan kolom lat dan lng , rumusnya adalah:
Baca jawaban rinci saya di https://stackoverflow.com/a/45950426/5076414
sumber
Inilah jawaban Federico Ramponi di Go. Catatan: tidak ada pengecekan kesalahan :(
sumber