Kata pengantar
Dengan pengembangan internet seluler yang meluas saat ini, pengembangan aplikasi telah menjadi pilihan pertama bagi banyak perusahaan untuk memasuki internet seluler. Penulis telah mengembangkan banyak aplikasi dan menemukan bahwa banyak aplikasi memiliki fungsi seperti itu, yaitu, untuk mendapatkan orang di dekatnya. Bagaimana cara mendapatkan orang di dekatnya? Bahkan, ini sangat sederhana. Ini untuk selalu mencatat informasi koordinat pengguna (lintang dan bujur) ke dalam database, dan kemudian mencari semua pengguna dalam database dan posisi koordinat saat ini dalam rentang tertentu berdasarkan koordinat pengguna saat ini.
Bahkan, untuk jarak antara dua subjek yang lokasi geografisnya tidak berubah, yang terbaik adalah secara langsung statis hasilnya. Artinya, tulis langsung di konfigurasi.
Misalnya, temukan stasiun kereta bawah tanah di dekat rumah Anda.
Dalam hal ini, secara umum, subjek "rumah" tidak akan "berlari" dengan mudah. Tidak masuk akal untuk menghitung jarak sekali setiap kueri. Yang terbaik adalah mempertahankan jarak dan menanyakannya secara langsung.
Kasus lain:
Dapatkan stasiun kereta bawah tanah di dekat lokasi pengguna aplikasi
Dalam hal ini, lokasi geografis pengguna berubah. Jadi jarak sebenarnya harus dihitung secara real time setiap saat.
Ide Implementasi
Perlakukan bumi sebagai bola standar dan gunakan rumus jarak bola untuk menghitung panjang busur lingkaran besar antara dua titik pada permukaan bola.
Jarak bola
getDistance double statis publik (long1 ganda, lat1 ganda, long2 ganda, lat2 ganda) {lat1 = rad (lat1); lat2 = rad (lat2); Ganda A = LAT1 - LAT2; double b = rad (long1 - long2); Double SA2 = Math.sin (A / 2.0); ganda sb2 = math.sin (b / 2.0); Return 2 * earth_mean_radius_km * Math.asin (Math.sqrt (SA2 * SA2 + Math.cos (LAT1) * Math.cos (LAT2) * SB2 * SB2));}Ketahuilah lintang dan bujur di antara dua poin.
Tentu saja, perhitungan ini harus ditempatkan dalam database dan kemudian diurutkan kembali sesuai dengan jarak. Bawa saja formula di atas ke SQL.
Contoh stasiun kereta bawah tanah terdekat
Tabel contoh untuk membangun stasiun kereta bawah tanah
Buat stasiun tabel (id int auto_increment kunci utama, nama varchar (20) null komentar 'nama stasiun mrt', lng double null komentar 'bujur', lat double null komentar 'dimensi');
Contoh SQL
Set @targetlat = 31.175702; set @targetlng = 121.519095; pilih s.id, s.name, s.lng, s.lat, round (6378.138 * 2 * asin (sqrt (pow * (@targetgetlat * pi () / 180 - s. @TargetLat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin ((@targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) sebagai jarak dari stasiun sorde dengan jarak, s.idlimit 20;
Di antara mereka, TargetLat dan TargetLNG adalah lokasi geografis pengguna.
Ini memang bisa mencapai tujuan. Namun, ini untuk menghitung jarak antara semua data dan pengguna terlebih dahulu dan kemudian mengurutkannya.
Ketika jumlah stasiun kereta bawah tanah terlalu besar, operasi ini akan kurang elegan. Tidak hanya tidak cukup elegan, tetapi juga sangat efisien.
optimasi
Bahkan, banyak data dapat disaring sebelum menghitung jarak.
Tidak perlu menghitung jarak antara stasiun kereta bawah tanah AS saat menghitung jarak antara stasiun kereta bawah tanah Shanghai.
Ini dapat disaring beberapa data yang tidak diinginkan terlebih dahulu di sebagian besar aplikasi.
Misalnya, ketika data membedakan kota, Anda dapat mengubah SQL ke yang berikut:
Set @TargetLAT = 31.175702; set @TargetLng = 121.519095; set @cityid = 605; pilih S.Id, S.Name, S.Lng, S.Lat, Round (6378), Pi -Pi (SQRT (POW (SIN (SIN (@target *) (@target *) (@target *) (@target *) (@target * (@target * (@target * (@target * (@target * (@target * (@target *) (@target * (@target (@target *) (@target *) (@target (@target (@target (@target (Sin) (@target (@target (@target (@target (@target, 2) + cos (@targetlat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin ((@targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) sebagai jarak dari stasiun swhere city_id = @city), 2)) * 1000) sebagai jarak dari stasiun CITY_ID = @CITYID = @CITY / 2))
Peningkatan di atas adalah menghapus sebagian besar data yang akan dihitung sebelum menghitung. Saat mencari stasiun kereta bawah tanah Changsha, tidak perlu mencari di Shanghai terlebih dahulu.
Tentu saja, situasi ini sedikit istimewa karena Anda dapat mengetahui kota tempat pengguna berada di muka.
Perbaikan lainnya adalah:
Dengan lokasi pengguna sebagai pusat, gambar lingkaran dengan jari -jari R, dan kemudian secara terbalik mengeluarkan lintang dan bujur kisaran quadrilateral luar lingkaran. Sebelum menghitung jarak, filter keluar data di luar bujur dan bujur quadrilateral luar.
Tentukan jari -jari yang ideal dan filter data yang tidak dapat memenuhi kriteria terlebih dahulu.
Reverse Reverse Push-Out External Quadrilateral Range
/*** Dapatkan garis lintang dan bujur dari empat simpul titik pada garis lintang dan bujur tertentu {@code radius} km External quadrilateral (benar -benar berbicara, itu harus berupa kubus eksternal)** @param lng longitude* @param latitude* @param radius, unit: km* @return <retng2 latg2 latg2, latg2 latg2 latg2, latg2 latg2 latg2 latg2 latg2, unit: km* @reta @reta <p untuk Lng2, KM* @REG2 LAT (LNG2, KM Tuple4 <mouble> calcboxbydistFrompt (lng ganda, lat ganda, jari -jari ganda) {spatialContext context = spatialcontext.geo; Rectangle rectangle = context.getDistCalc () // .calcboxbydistFrompt (// context.makePoint (lng, lat), // radius * com.spatial4j.core.distance.distanceutils.km_to_deg, konteks, null //); Kembalikan tuple4 baru <> (rectangle.getminx (), rectangle.getmaxx (), rectangle.getminy (), rectangle.getmaxy ());}Koordinat Maven yang digunakan di sini adalah sebagai berikut:
<dependency> <GroupId> com.spatial4j </groupid> <ArTifactId> spatial4j </artifactid> <version> 0.5 </version> </dependency>
Saat ini, SQL dapat diubah menjadi ini:
Set @targetlat = 31.175702; set @targetlng = 121.519095; pilih s.id, s.name, s.lng, s.lat, round (6378.138 * 2 * asin (sqrt (pow * (@targetgetlat * pi () / 180 - s. @TargetLat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin ((@targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) sebagai stasiun jarak dari swhere (s.lng) antara $ {lng antara $ {lng1 {S.lng antara $ {S.Lng antara $ {s.lng antara $ {S.Lng antara $ {S.LNG $ { $ {lat1} dan $ {lat2}) memesan dengan jarak ASC, s.idlimit 20;LNG1, LNG2, LAT1, LAT2 di atas adalah kisaran kuadrilateral eksternal.
Informasi yang dikutip: http://blog.csdn.net/a364572/article/details/50483568
Kode Sumber Sampel
Layanan: https: //github.com/hylexus/bl ...
Inisialisasi data: https: //github.com/hylexus/bl ...
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.