Mysql存储过程——通过百度坐标,查询半径内符合条件的用户以及排序后的距离
之前做过一个类似的应用,今天翻出来看了看,觉得写的不是很合理,于是重新考虑后写了一个查询的存储过程。
表就不描述,
过程如下:
-- ---------------------------- -- Procedure structure for DIS -- ---------------------------- DROP PROCEDURE IF EXISTS `DIS`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `DIS`(IN `_lat` varchar(11),IN `_lng` varchar(11),IN `_ras` int,INOUT `_data` text) BEGIN DECLARE _sql text ; DECLARE EARTH_RADIUS VARCHAR(10) ; DECLARE _range VARCHAR(16); DECLARE lngR VARCHAR(16); DECLARE maxLat VARCHAR(16); DECLARE minLat VARCHAR(16); DECLARE maxLng VARCHAR(16); DECLARE minLng VARCHAR(16); SET EARTH_RADIUS = 6378.137; SET _range = 180 / pi() * _ras / EARTH_RADIUS; SET lngR = _range / cos(_lat * pi() / 180); SET maxLat = _lat + _range; SET minLat = _lat - _range; SET maxLng = _lng + lngR ; SET minLng = _lng - lngR ; SET @_sql = CONCAT('SELECT *, ceil( 2 * asin( sqrt( pow(sin((((',_lat,' * PI() / 180.0) - (',_lat,' * PI() / 180.0))) / 2),2) + cos(',_lat,' * PI() / 180.0) * cos(lat * PI() / 180.0) * pow(sin(((',_lng,' * PI() / 180.0) - (lng * PI() / 180.0)) / 2),2) ) ) * ',EARTH_RADIUS,' * 1000 ) AS di FROM dis WHERE lat BETWEEN ',minLat,' AND ',maxLat,' AND lng BETWEEN ',minLng,' AND ',maxLng,' ORDER BY di LIMIT 0,10'); PREPARE stmt FROM @_sql; EXECUTE stmt; END ;; DELIMITER ;
调用 :
CALL DIS(_lat,_lng,_ras,@_data);
_lat,经度;
_lng,纬度;
_ras,半径(单位为km);
@_data ,接受返回
返回值中di为距离已经排序,由近及远,单位为m。
如果不使用存储过程可以拆分成PHP程序:
define("EARTH_RADIUS",6378.137); /** * 获取距离四个坐标 * @param $lon * @param $lat * @param int $distance 默认1KM的距离 * @return array */ function getCoor($lng,$lat,$distance = 1){ $range = 180 / pi() * $distance / EARTH_RADIUS; $lngR = $range / cos($lat * pi() / 180); $data = array(); $data["maxLat"] = $lat + $range; $data["minLat"] = $lat - $range; $data["maxLng"] = $lng + $lngR ;//最大经度 $data["minLng"] = $lng - $lngR ;//最小经度 return $data; }
首先先获取一个正方型的坐标区域,然后通过上面 @_sql中sql拼接成一个sql语句,执行即可。
备注一下,这里得到的是一个正方型而非圆形半径的结果,可以再后期的时候做一个二次的筛除即可,例如array_filter(),这里就不再多描述了。
以上就介绍了Mysql存储过程——通过百度坐标,查询半径内符合条件的用户以及排序后的距离,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Penggunaan pengisytiharan Oracle termasuk pengisytiharan berubah-ubah, pengisytiharan malar, pengisytiharan kursor dan pengisytiharan subrutin. Pengenalan terperinci: 1. Pengisytiharan pembolehubah, dalam blok PL/SQL, anda boleh menggunakan pernyataan DECLARE untuk mengisytiharkan pembolehubah; set hasil pertanyaan diproses dalam blok; 4. Pengisytiharan subrutin ialah blok kod boleh guna semula yang ditakrifkan dalam blok PL/SQL.

Artikel ini akan menerangkan secara terperinci bagaimana PHP mengembalikan semua nilai tatasusunan untuk membentuk tatasusunan Editor berpendapat ia agak praktikal, jadi saya berkongsi dengan anda sebagai rujukan . Menggunakan fungsi array_values() Fungsi array_values() mengembalikan tatasusunan semua nilai dalam tatasusunan. Ia tidak mengekalkan kunci tatasusunan asal. $array=["foo" =>"bar","baz" =>"qux"];$values=array_values($array);//$values akan menjadi ["bar","qux"]Menggunakan gelung boleh Gunakan gelung untuk mendapatkan semua nilai tatasusunan secara manual dan menambahnya kepada yang baharu

Prakata Dalam Java, kaedah Julat tersedia dalam kedua-dua kelas IntStream dan LongStream. Dalam kelas IntStream, ia membantu mengembalikan nilai jujukan IntStream dalam skop parameter fungsi. Dalam kaedah ini, startInclusive(inclusive) dan endExclusive(exclusive) ialah dua parameter yang digunakan bersama dengan saiz langkah kenaikan, seperti yang dinyatakan sebelum ini, nilai mula akan disertakan dan nilai akhir akan dikecualikan. Dalam kes LongStream, satu-satunya perbezaan ialah penambahan nilai LongStream. Sintaks Julat Mari kita lihat sintaks kaedah julat dalam Java. Julat IntStream

Bahasa Go ialah bahasa pengaturcaraan yang ringkas dan berkuasa dengan reka bentuk dan ciri unik dalam banyak aspek. Salah satu ciri yang paling mengagumkan ialah kata kunci julat, yang digunakan untuk mengulang struktur data seperti tatasusunan, kepingan, peta dan saluran. Fleksibiliti dan kemudahan julat memudahkan untuk merentasi struktur data yang kompleks, tetapi ramai orang keliru tentang cara ia berfungsi. Artikel ini akan menerangkan cara julat berfungsi dengan cara yang ringkas dan mudah difahami serta menggunakan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik. Pertama, mari kita lihat contoh mudah

Semasa penggunaan MySQL, tarikh biasanya disimpan dalam format tarikh, cap waktu dan lain-lain, kadang-kadang disebabkan keperluan khas atau sebab sejarah, tarikh disimpan dalam format varchar. Gunakan fungsi: STR_TO_DATE(str,format) Fungsi STR_TO_DATE(str,format) ialah fungsi songsang bagi fungsi DATE_FORMAT(). Ia memerlukan rentetan str dan format rentetan format. STR_TO_DATE() mengembalikan nilai DATETIME jika rentetan format mengandungi komponen tarikh dan masa, atau jika perkataan

Pernyataan DECLARE ialah kata kunci yang digunakan dalam Oracle untuk mengisytiharkan pembolehubah, pemalar dan kursor. Menyediakan cara yang mudah untuk menentukan dan memulakan objek data untuk digunakan dalam blok PL/SQL. Dengan menggunakan pernyataan DECLARE, kod PL/SQL boleh dibuat lebih modular dan boleh dibaca.

Pengambilan elektrik GM terhadap Escalade yang legenda baru sahaja menaikkan konfigurasinya, dan harganya berkisar antara $130,000 hingga kira-kira $170,000 selepas insentif. Ini adalah lebih daripada hampir mana-mana kenderaan elektrik mewah lain, pikap atau SUV di luar sana, termasuk Tesla's C

Perbezaan antara char dan varchar dalam mysql ialah: 1. CHAR ialah panjang tetap, manakala VARCHAR adalah panjang berubah-ubah 2. CHAR storan dan kecekapan pengambilan adalah tinggi, manakala VARCHAR kecekapan penyimpanan dan pengambilan tidak tinggi; , VARCHAR boleh menjimatkan ruang storan.
