php - 如何根据用户坐标和半径从表中检索数据

标签 php mysql geolocation latitude-longitude

基本上,我向带有用户纬度和经度值(分别为$userLat、$userLong)的php 文件发送GET 请求。
在我的数据库中,我有一个包含以下列的“位置”表:

  • 地点名称
  • 纬度
  • 半径(以米为单位)

因此,我想进行一个查询,将用户坐标与所有位置坐标进行比较,看看位置与用户之间的距离是否 <= 该位置的半径。如果是,则返回该位置的名称。


查询应该是这样的(伪代码):

SELECT Location_Name FROM Locations WHERE distanceBetween(($userLat, $userLong) AND (Lat, Lng)) <= Radius

最佳答案

我使用与 @socca1157 回答相同的查询,但我认为我可以在查询开始时对常量 3959 提供一个微小的解释。

我的示例还获取了用户地址的纬度和经度

$address = urlencode($_GET['user-address']);

$earth_radius = 3959;
$search_radius = 100;

$ch = curl_init('https://maps.google.com/maps/api/geocode/json?address='.$address.'&sensor=false');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$geocode = curl_exec($ch);
curl_close($ch);

$output = json_decode($geocode);

$lat = $output->results[0]->geometry->location->lat;
$lng = $output->results[0]->geometry->location->lng;


$sql = "SELECT *, ( $earth_radius * acos( cos( radians($lat) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( latitude ) ) ) ) AS distance FROM table WHERE isActive = 1 HAVING distance < $search_radius ORDER BY distance LIMIT 5";
$result = mysql_query($sql);

因此,例如,如果您想以公里而不是英里为单位进行搜索,您可以使用以公里为单位的地球半径,即 6,371 公里。

关于php - 如何根据用户坐标和半径从表中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13962644/

相关文章:

php - 通过从 MySQL 获取 id 将 $_SESSION ['name' ] 更改为 $_SESSION['id]

php - laravel 外键迁移错误

javascript - 对 Google map 上的地理位置进行地理编码会出现错误

Python ssl.SSLError : [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl. c:748)

algorithm - 确定给定的纬度/经度是否在美国境内

php - for循环中的动态变量名

php - 在linux Redhat服务器64位上安装并执行Wkhtmltopdf(使用PHP)

php - 检查 PDO 执行的查询是否有要获取的结果

mysql - MySQL 中何时使用单引号、双引号和反引号

php - 使用 PHP 和 jQuery 预览数据库中保存的图像