首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在php中计算到经度/经度的距离?

如何在php中计算到经度/经度的距离?
EN

Stack Overflow用户
提问于 2011-10-06 17:58:55
回答 9查看 51.4K关注 0票数 11

我正在尝试做的是,我在数据库中存储了一个经纬度/经度的条目。我想计算用户lat/long和条目lat/long (在DB中)之间的距离。之后,我想要回声距离小于500米的那些。到目前为止,我可以使用foreach来完成这项工作。

代码语言:javascript
运行
复制
<?php
mysql_connect("localhost", "beepbee_kunwarh", "kunwar") or die('MySQL Error.');
mysql_select_db("beepbee_demotest") or die('MySQL Error.');

$Lat = $_REQUEST['Lat'];
$long = $_REQUEST['long'];

$query = mysql_query("SELECT a.*, 3956 * 2 * ASIN(SQRT( POWER(SIN(($Lat - Lat) * pi()/180 / 2), 2) + COS($Lat * pi()/180) * COS(Lat * pi()/180) *POWER(SIN(($long - long) * pi()/180 / 2), 2) )) as distance FROM userResponse GROUP BY beepid HAVING distance <= 500 ORDER by distance ASC;");
$data = array();
while ($row = mysql_fetch_array($query)) {
    $data[] = $row;
}
echo json_encode($data);
?>
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-10-06 18:08:06

我几周前就这么做了。

这个链接是你最好的选择:

http://code.google.com/apis/maps/articles/phpsqlsearch.html

即使你不使用他们的API,他们的PHP和SQL查询也有很好的帮助。

票数 15
EN

Stack Overflow用户

发布于 2012-01-28 22:32:49

我不建议在您的sql语句中丢弃距离计算,即使我承认'denil‘提出的解决方案很巧妙。

它有三个缺点:代码维护,sql服务器过载,以及(最重要的)地球不对称(就像一个被卡车压过的老式凹痕棒球)。这意味着您可能希望在将来更改代码(有一些非常复杂的算法- http://en.wikipedia.org/wiki/Geographical_distance)。

我推荐使用一个单独的函数,用一个简单的通用算法计算距离(类似于denil的算法,如果不是完全相同的话)。我提交的这段代码是纯php的(不需要使用googlemaps api):

代码语言:javascript
运行
复制
<?php

function distanceGeoPoints ($lat1, $lng1, $lat2, $lng2) {

    $earthRadius = 3958.75;

    $dLat = deg2rad($lat2-$lat1);
    $dLng = deg2rad($lng2-$lng1);


    $a = sin($dLat/2) * sin($dLat/2) +
       cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
       sin($dLng/2) * sin($dLng/2);
    $c = 2 * atan2(sqrt($a), sqrt(1-$a));
    $dist = $earthRadius * $c;

    // from miles
    $meterConversion = 1609;
    $geopointDistance = $dist * $meterConversion;

    return $geopointDistance;
}

// YOUR CODE HERE
echo distanceGeoPoints(22,50,22.1,50.1);

?>

有许多免费软件(试试gps trackmaker)可以让你检查你所在地区的误差范围(如果你需要精度的话)。对于上面的经纬度/经度对,误差在+/- 0.1%以内(根据当地的地形图)。

注意:此公式给出的是地图距离(海平面上的距离),而不是地形距离(忽略地形)。

票数 17
EN

Stack Overflow用户

发布于 2011-10-06 18:06:07

尝试此查询。我在搜索的时候发现了这个,但是忘记了是谁创建的

代码语言:javascript
运行
复制
SELECT a.*,
            3956 * 2 * ASIN(SQRT( POWER(SIN(($lat - lat) * pi()/180 / 2), 2) + COS($lat * pi()/180) * COS(lat * pi()/180) *
            POWER(SIN(($long - longi) * pi()/180 / 2), 2) )) as
            distance FROM table
            GROUP BY id HAVING distance <= 500 ORDER by distance ASC

$lat和$long变量是用户的当前位置。经度和纬度是条目的纬度和经度

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7672759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档