Maison développement back-end tutoriel 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 ;
Copier après la connexion

调用 :

CALL DIS(_lat,_lng,_ras,@_data);
Copier après la connexion
参数说明:

_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;
}
Copier après la connexion

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

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

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les utilisations d'Oracle Statement Quelles sont les utilisations d'Oracle Statement Sep 15, 2023 pm 01:12 PM

L'utilisation de la déclaration Oracle comprend la déclaration de variable, la déclaration de constante, la déclaration de curseur et la déclaration de sous-programme. Introduction détaillée : 1. Déclaration de variable, dans le bloc PL/SQL, vous pouvez utiliser l'instruction DECLARE pour déclarer des variables ; 2. Les constantes sont des valeurs non modifiables déclarées dans le bloc PL/SQL 3. Déclaration de curseur, utilisée dans PL/SQL ; L'ensemble des résultats de la requête est traité dans le bloc ; 4. Déclaration de sous-programme. Un sous-programme est un bloc de code réutilisable défini dans un bloc PL/SQL.

PHP renvoie toutes les valeurs du tableau pour former un tableau PHP renvoie toutes les valeurs du tableau pour former un tableau Mar 21, 2024 am 09:06 AM

Cet article expliquera en détail comment PHP renvoie toutes les valeurs d'un tableau pour former un tableau. L'éditeur pense que c'est assez pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. . Utilisation de la fonction array_values() La fonction array_values() renvoie un tableau de toutes les valeurs d'un tableau. Il ne conserve pas les clés du tableau d'origine. $array=["foo"=>"bar","baz"=>"qux"];$values=array_values($array);//$values ​​​​sera ["bar","qux"]Utilisation une boucle peut utiliser une boucle pour obtenir manuellement toutes les valeurs du tableau et les ajouter à un nouveau

Comment utiliser la fonction Range en Java Comment utiliser la fonction Range en Java Apr 19, 2023 pm 11:49 PM

Préface En Java, la méthode Range est disponible dans les classes IntStream et LongStream. Dans la classe IntStream, il est utile de renvoyer la valeur séquentielle de IntStream dans la portée du paramètre de fonction. Dans la méthode, startInclusive(inclusive) et endExclusive(exclusive) sont les deux paramètres utilisés avec la taille du pas d'incrément, comme mentionné précédemment, la valeur de début sera incluse et la valeur de fin sera exclue. Dans le cas de LongStream, la seule différence est l'ajout de la valeur LongStream. Syntaxe de plage Voyons la syntaxe de la méthode range en Java. Plage IntStream

Comment utiliser déclarer dans Oracle Comment utiliser déclarer dans Oracle Sep 19, 2023 am 09:44 AM

L'instruction DECLARE est un mot-clé utilisé dans Oracle pour déclarer des variables, des constantes et des curseurs. Fournit un moyen pratique de définir et d’initialiser les objets de données utilisés dans les blocs PL/SQL. En utilisant l'instruction DECLARE, le code PL/SQL peut être rendu plus modulaire et plus lisible.

Expliquez en termes simples : Comprenez parfaitement le principe de fonctionnement de la gamme de langues Go Expliquez en termes simples : Comprenez parfaitement le principe de fonctionnement de la gamme de langues Go Mar 12, 2024 pm 02:18 PM

Le langage Go est un langage de programmation concis et puissant avec une conception et des fonctionnalités uniques à bien des égards. L'une des fonctionnalités les plus impressionnantes est le mot-clé range, qui est utilisé pour parcourir des structures de données telles que des tableaux, des tranches, des cartes et des canaux. La flexibilité et la commodité de range facilitent la traversée de structures de données complexes, mais de nombreuses personnes ne comprennent pas comment cela fonctionne. Cet article expliquera le fonctionnement de range de manière simple et approfondie, et utilisera des exemples de code spécifiques pour aider les lecteurs à mieux comprendre. Tout d'abord, regardons un exemple simple

Comment implémenter la comparaison de dates, le tri et d'autres opérations avec le type varchar dans MySQL Comment implémenter la comparaison de dates, le tri et d'autres opérations avec le type varchar dans MySQL May 31, 2023 pm 01:49 PM

Lors de l'utilisation de MySQL, les dates sont généralement stockées au format datetime, timestamp et autres. Cependant, parfois en raison de besoins particuliers ou de raisons historiques, la date est stockée au format varchar. Alors, comment devons-nous traiter les données de date au format varchar ? Utiliser la fonction : STR_TO_DATE(str,format) La fonction STR_TO_DATE(str,format) est la fonction inverse de la fonction DATE_FORMAT(). Il faut une chaîne str et un format chaîne format. STR_TO_DATE() renvoie une valeur DATETIME si la chaîne de format contient des composants de date et d'heure, ou si le mot

L'énorme Cadillac Escalade IQ offre 460 milles d'autonomie à un prix allant jusqu'à 170 000 $ L'énorme Cadillac Escalade IQ offre 460 milles d'autonomie à un prix allant jusqu'à 170 000 $ Sep 30, 2024 am 06:15 AM

La version électrique de GM du légendaire Escalade vient de sortir son configurateur, et le prix varie de 130 000 $ à environ 170 000 $ après incitations. C'est plus que presque tout autre véhicule électrique, camionnette ou SUV de luxe, y compris le C de Tesla.

Quelle est la différence entre char et varchar dans MySQL Quelle est la différence entre char et varchar dans MySQL Sep 04, 2023 pm 02:16 PM

Les différences entre char et varchar dans mysql sont : 1. CHAR est de longueur fixe, tandis que VARCHAR est de longueur variable ;2. L'efficacité de stockage et de récupération de CHAR est élevée, tandis que l'efficacité de stockage et de récupération de VARCHAR n'est pas élevée 3. CHAR occupe de l'espace de stockage ; , VARCHAR peut économiser de l'espace de stockage.

See all articles