如何按纬度和经度查找最近的位置?

112*_*233 3 php mysql google-maps

这是loc_coordinate表结构:

在此输入图像描述

下面是代码,从数据库中获取最近的位置并显示存储在数据库本身的地名.

<?php
include("config.php");
$lat = "3.107685";
$lon = "101.7624521";

        $sql="SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS 'distance' FROM loc_coordinate HAVING 'distance'<='10' ORDER BY 'distance' ASC";
        $stmt =$pdo->prepare($sql);
        $stmt->execute();


        while($row = $stmt->fetch())
        {
          echo $row['place'];
        }

?>
Run Code Online (Sandbox Code Playgroud)

显示的错误:

致命错误:在第8行的C:\ wamp\www\mysite\by_coor.php中

PDOException:在第8行的C:\ wamp\www\mysite\by_coor.php中

echo $sql 显示这个:

SELECT((ACOS(SIN(3.107685*PI()/ 180)*SIN(lat*PI()/ 180)+ COS(3.107685*PI()/ 180)*COS(lat*PI()/ 180)*COS ((101.7624521-lon)*PI()/ 180))*180/PI())*60*1.1515)AS'距离'来自loc_coordinate'距离'<='10'按'距离'ASC

我不确定为什么我会收到这个错误.这是我在SQL查询中提到的网站:http://zcentric.com/2010/03/11/calculate-distance-in-mysql-with-latitude-and-longitude/

Yos*_*ati 15

试试这个

     SELECT * , (3956 * 2 * ASIN(SQRT( POWER(SIN(( $lat - LatOnTable) *  pi()/180 / 2), 2) +COS( $lat * pi()/180) * COS(LatOnTable * pi()/180) * POWER(SIN(( $long - LongOnTable) * pi()/180 / 2), 2) ))) as distance  
from yourTable  
having  distance <= 10 
order by distance
Run Code Online (Sandbox Code Playgroud)

将latOnTable替换为纬度表列名称,并将longOnTable替换为表格中的经度列名称.

  • 在末尾添加`limit 1` 将获得“最近”的位置,而不是最近位置的列表。 (2认同)

Neh*_*ggi 5

以下 SQL 语句可查找距给定坐标 10 英里半径内最近的位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅询问距离值小于等于10的行,并按距离对整个查询进行排序。要按公里而不是英里搜索,请将 3959 替换为 6371

SELECT
  id, (
    3959 * acos (
      cos ( radians($lat) )
      * cos( radians( tableLatColName ) )
      * cos( radians( tableLogColName ) - radians($long) )
      + sin ( radians($lat) )
      * sin( radians( tableLatColName ) )
    )
  ) AS distance
FROM table_name
HAVING distance <= 10
ORDER BY distance;
Run Code Online (Sandbox Code Playgroud)

这是使用 Google Maps API v3 和 MySQL 后端 -

https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#findnearsql

我正在研究同样的问题并发现了这个问题所以只是想分享它..:)