Rumah pembangunan bahagian belakang tutorial php Mysql存储过程——通过百度坐标,查询半径内符合条件的用户以及排序后的距离

Mysql存储过程——通过百度坐标,查询半径内符合条件的用户以及排序后的距离

Aug 08, 2016 am 09:31 AM
declare range varchar

之前做过一个类似的应用,今天翻出来看了看,觉得写的不是很合理,于是重新考虑后写了一个查询的存储过程。

表就不描述,

过程如下:

-- ----------------------------
-- 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 ;
Salin selepas log masuk

调用 :

CALL DIS(_lat,_lng,_ras,@_data);
Salin selepas log masuk
参数说明:

_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;
}
Salin selepas log masuk

首先先获取一个正方型的坐标区域,然后通过上面 @_sql中sql拼接成一个sql语句,执行即可。

备注一下,这里得到的是一个正方型而非圆形半径的结果,可以再后期的时候做一个二次的筛除即可,例如array_filter(),这里就不再多描述了。

以上就介绍了Mysql存储过程——通过百度坐标,查询半径内符合条件的用户以及排序后的距离,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah kegunaan oracle declare Apakah kegunaan oracle declare Sep 15, 2023 pm 01:12 PM

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.

PHP mengembalikan semua nilai dalam tatasusunan untuk membentuk tatasusunan PHP mengembalikan semua nilai dalam tatasusunan untuk membentuk tatasusunan Mar 21, 2024 am 09:06 AM

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

Cara menggunakan fungsi Range dalam Java Cara menggunakan fungsi Range dalam Java Apr 19, 2023 pm 11:49 PM

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

Terangkan secara ringkas: Fahami dengan teliti prinsip kerja julat bahasa Go Terangkan secara ringkas: Fahami dengan teliti prinsip kerja julat bahasa Go Mar 12, 2024 pm 02:18 PM

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

Bagaimana untuk melaksanakan perbandingan tarikh, pengisihan dan operasi lain dengan jenis varchar dalam mysql Bagaimana untuk melaksanakan perbandingan tarikh, pengisihan dan operasi lain dengan jenis varchar dalam mysql May 31, 2023 pm 01:49 PM

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

Cara menggunakan declare dalam Oracle Cara menggunakan declare dalam Oracle Sep 19, 2023 am 09:44 AM

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.

Cadillac Escalade IQ yang besar menawarkan jarak 460 batu pada harga sehingga $170,000 Cadillac Escalade IQ yang besar menawarkan jarak 460 batu pada harga sehingga $170,000 Sep 30, 2024 am 06:15 AM

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

Apakah perbezaan antara char dan varchar dalam mysql Apakah perbezaan antara char dan varchar dalam mysql Sep 04, 2023 pm 02:16 PM

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.

See all articles