Ya, ada cara yang lebih baik. Anda perlu menggunakan indeks spasial . Indeks ini mengatur metadata tentang geometri untuk menyaring geometri jauh dengan sangat cepat, menghemat banyak siklus CPU dengan menghindari perhitungan yang Anda gambarkan. Anda tidak perlu repot menerapkannya sendiri karena semua basis data relasional utama menyediakan tipe geometri spasial dan indeks untuk digunakan.
Yang ingin Anda lihat adalah kueri "dalam jarak" (kueri untuk geometri dalam jarak tertentu dari beberapa geometri lain). Ini sangat standar dan sangat banyak masalah yang dipecahkan dan dimungkinkan di semua database di atas (dan dibangun menjadi beberapa):
- PostGIS:
ST_DWithin
- SQL Server:
STDistance
(Tidak jelas bahwa penggunaan indeks pada versi geografi 3D dari fungsi ini didukung)
- Oracle:
SDO_WITHIN_DISTANCE
(Ini tidak mengatakan secara eksplisit bahwa itu akan memicu penggunaan indeks. Saya akan memeriksa rencana permintaan. Anda mungkin perlu menerapkan suatu SDO_FILTER
untuk mendapatkannya untuk menggunakan indeks.)
- MySQL: Masih mencari tahu ini.
Solusi untuk memicu penggunaan indeks
Dalam kasus terburuk di mana Anda memiliki masalah dalam mendapatkan sistem untuk menggunakan indeks spasial dengan pertanyaan ini, Anda bisa menambahkan filter tambahan. Anda akan membuat kotak pembatas persegi dengan sisi panjang 2 * (jarak pencarian) berpusat di titik pencarian Anda dan membandingkan kotak pembatas kotak geometri dengan yang sebelum memeriksa jarak yang sebenarnya. Itulah yang dilakukan PostGIS di ST_DWithin
atas secara internal.
Jarak dalam GIS
Meskipun indeks spasial sangat fantastis dan benar-benar solusi tepat untuk masalah Anda, perhitungan jarak bisa menjadi rumit secara logis. Khususnya, Anda perlu khawatir tentang proyeksi apa (pada dasarnya semua parameter untuk sistem koordinat) data Anda disimpan. Sebagian besar proyeksi 2D (hal-hal selain sistem koordinat sudut seperti berbagai proyeksi lat / long) mendistorsi panjang secara signifikan. Sebagai contoh, proyeksi Web Mercator (yang digunakan oleh Google, Bing, dan setiap penyedia peta dasar utama lainnya) memperluas area dan jarak yang semakin jauh seiring lokasi semakin jauh dari garis khatulistiwa . Saya mungkin salah karena saya tidak dididik secara resmi dalam GIS, tetapi yang terbaik yang pernah saya lihat untuk proyeksi 2D adalah beberapa yang spesifik yang menjanjikan jarak yang benar dari suatusatu, titik konstan di seluruh dunia. (Tidak, tidak praktis menggunakan proyeksi berbeda untuk setiap permintaan; itu akan membuat indeks Anda tidak berguna.)
Intinya adalah Anda harus memastikan matematika Anda akurat. Cara paling sederhana untuk melakukannya dari perspektif pengembangan adalah dengan menggunakan proyeksi sudut (Ini sering disebut sebagai "geografis.") Dan fungsi yang mendukung melakukan matematika menggunakan model spheroid, tetapi perhitungan ini sedikit lebih mahal daripada rekan-rekan 2D. dan beberapa DB mungkin tidak mendukung pengindeksan mereka. Jika Anda bisa mendapatkan kinerja yang dapat diterima menggunakannya, mungkin itulah cara yang harus dilakukan. Pilihan umum lainnya adalah proyeksi regional (seperti zona UTM) yang mendapatkan jarak dan area yang cukup dekat untuk dikoreksi jika data Anda terbatas pada bagian tertentu dunia. Apa yang terbaik untuk aplikasi Anda akan tergantung pada kebutuhan spesifik Anda,
Ini berlaku bahkan jika Anda tidak menggunakan indeks spasial bawaan. Data Anda memiliki beberapa proyeksi terlepas dari teknologi atau teknik apa yang saat ini Anda gunakan atau gunakan di masa depan, dan saat ini sudah memengaruhi setiap pertanyaan dan perhitungan yang Anda buat.