Saya harus dapat menghitung kotak atau lingkaran untuk garis lintang WGS84 dan bujur WGS84 tertentu, dan jarak tetapi tidak tahu harus mulai dari mana!
Jarak dari awal Lat / Lon akan 10km atau kurang.
Apakah mungkin bagi seseorang untuk memberi saya beberapa petunjuk / Contoh tentang cara melakukan ini
Jawaban:
WGS-apa? WGS-84? Bergantung pada keakuratan yang Anda butuhkan, Anda mungkin perlu mengetahui lebih banyak informasi - dugaan saya adalah itu sebabnya Anda tidak dapat memilih, meskipun tidak ada yang peduli untuk meninggalkan komentar yang mengatakan mengapa.
Berikut ini dua cara:
Tidak akurat, tetapi mungkin 'cukup baik'
Satu derajat garis lintang adalah sekitar 10001.965729 / 90 kilometer (jarak dari khatulistiwa ke kutub, dibagi sembilan puluh derajat) atau 111,113 kilometer, menggunakan datum WGS-84. Ini adalah perkiraan karena bentuk bumi, dan karena jarak berubah ketika Anda mendekati kutub (satu alasan untuk menggunakan garis lintang, bukan garis bujur - pada akhirnya jarak satu derajat garis bujur adalah nol!) Bumi juga tidak sempurna bola. Keduanya adalah alasan untuk menggunakan pendekatan berbasis proyeksi dan datum yang lebih kompleks, dalam jawaban kedua saya.
Ini menggunakan derajat desimal, bukan derajat / menit / detik.
Jadi, kotak pembatas Anda akan menjadi poin Anda, plus dan minus 0,08999 derajat. Atau Anda bisa menggunakan angka ini sebagai jari-jari, memberi Anda lingkaran pembatas .
Setiap orang GIS yang membaca ini akan ngeri. Namun, sebagian besar akan akurat, tergantung di mana Anda berada di dunia. Untuk radius 10 km itu harus baik-baik saja.
Jauh lebih akurat, tetapi lebih banyak kode
Gunakan perpustakaan proyeksi dan tentukan datum Anda, dll. Saya merekomendasikan Proj4; ini banyak digunakan sehingga Google mengembalikan banyak hasil untuk pertanyaan tentang itu, dan ada pembungkus Delphi . Jika Anda kesulitan menggunakannya, kirimkan pertanyaan lain di sini di SO - tidak termasuk untuk yang ini. Situs web Proj4 memiliki contoh-contoh menggunakan API dasar, dan meskipun ini dalam bahasa C, situs web ini harus mudah diterjemahkan. Referensi API mereka adalah tempat terbaik untuk memulai, diikuti oleh FAQ .
Saya akan menggunakan WGS-84 sebagai datum dasar (representasi bumi) kecuali Anda tahu yang spesifik yang ingin Anda gunakan, atau yang digunakan untuk membuat koordinat Anda. Ini biasa digunakan dan cukup akurat.
Jika posisi Anda berasal dari Google Maps (misalnya), tentukan proyeksi Mercator. Anda mungkin ingin menggunakan proyeksi lain, atau menggunakan, katakanlah, koordinat UTMbukannya lintang dan bujur, tergantung pada sumber data Anda dan jika Anda ingin akurasi tinggi untuk area lokal kecil. (UTM memiliki banyak zona, yang semuanya mengubah distorsi sehingga di dalam zona itu, sangat akurat; jika Anda menggunakan zona untuk koordinat di luarnya, distorsi akan sangat meningkat saat Anda bergerak menjauh. Jika Anda melihat seluruh bumi diproyeksikan dari satu zona, itu mungkin tidak dapat dikenali. Tapi dalam suatu zona, terjemahan UTM akan menjadi sebaik yang Anda bisa dapatkan. Koordinat umumnya ditentukan dalam meter, bukan dalam derajat, sehingga mungkin lebih berguna untuk Anda, mengingat Anda membutuhkan 10 km radius 10km mudah dalam satu zona tunggal, Anda hanya perlu memilih zona yang sesuai berdasarkan koordinat pusat Anda .Sedikit rumit adalah ketika Anda mendekati perbatasan: itu adalah situasi umum, dan itu baik-baik saja, hanya menjadikonsisten dalam cara Anda memilih mana yang Anda gunakan . Proj4 juga akan memungkinkan Anda menerjemahkan proyeksi, sehingga Anda dapat beralih dari Mercator WGS-84 lat / panjang ke zona UTM n , misalnya, atau ke dan dari dua zona UTM.)
sumber
Dengan asumsi Anda ingin membuat kueri dalam database, Anda mungkin ingin melakukan pencarian cepat (tidak akurat), dan kemudian menghitung jarak untuk tempat yang dihasilkan dengan tepat. Apakah itu skenario Anda?
Fungsi berikut (dalam PHP, maaf) kira-kira akan menghitung perbedaan dalam lintang dan bujur. Perbedaan ini tergantung pada garis lintang titik pencarian Anda. Gunakan mereka (dengan toleransi kecil) untuk melakukan pencarian cepat di database. Kotak dapat dihitung hanya dengan lintang + -deltaLatitude dan bujur + -deltaLongitude.
Dengan rumus haversine , Anda dapat menghitung jarak di bola. Gunakan untuk setiap tempat yang ditemukan, untuk mendapatkan jarak "tepat". Dengan cara ini Anda dapat menguji, jika kedua tempat berada dalam radius tertentu (lingkaran bukan kotak).
sumber
Untuk menguji apakah lat / lon berada di dalam atau di luar lingkaran pembatas, Anda perlu menghitung jarak dari lat / lon referensi Anda ke titik lat / lon yang ingin Anda uji. Karena jarak Anda 10km atau kurang, saya akan mencoba menggunakan pendekatan Equirectangular untuk mendapatkan jarak daripada Haversine karena kesederhanaan. Untuk mendapatkan jarak dalam km:
Catatan penting: lat / lon dalam rumus ini adalah dalam radian bukan derajat. Nilai khas EarthRadius adalah 6371 km yang akan mengembalikan jarak dalam satuan km. Sekarang ini adalah tes sederhana jika jarak Anda di dalam atau di luar lingkaran. Jika lingkaran pembatas bekerja, saya akan pergi dengan itu.
Untuk persegi panjang pembatas, saya akan menganggap Anda ingin persegi panjang didefinisikan dengan menjadi sejajar dengan garis khatulistiwa. Saya kemudian akan menghitung sudut-sudut kotak berlari menggunakan perhitungan rentang / bantalan (bantalan menjadi 45 derajat, 135 derajat, 225 derajat dan 315 derajat). Dari sana, saya akan menganggap Anda tidak ada di sekitar kutub dan menggunakan titik dalam uji poligon.
sumber
Di bawah ini adalah kode T-SQL yang saya gunakan untuk membangun kotak pembatas di SQL-Server 2012. Dalam kasus saya, saya mendapatkan nilai desimal untuk Lat, Long. Saya menggunakan ini untuk dengan cepat membatasi jumlah baris sebelum saya menggunakan
STDistance
fungsi SQL untuk memverifikasi bahwa hasil sebenarnya dalam jarak tertentu. Fungsi geografi sangat mahal dalam SQL Server sehingga dengan membangun kotak pembatas saya dapat sangat mengurangi berapa kali harus dieksekusi.sumber