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教程有兴趣的朋友有所帮助。

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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 !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

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.

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

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

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.

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

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

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.

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.
