使用haversine公式,结果太高
Posted
技术标签:
【中文标题】使用haversine公式,结果太高【英文标题】:Using haversine formula, result too high 【发布时间】:2012-05-11 23:50:30 【问题描述】:我有一个问题,我花了太多时间试图解决。 我正在使用 de Haversine 公式计算两点之间的距离,但我使用的代码给出的值对于 KM 这样的距离来说太高了。
这是代码:
$pesquisa_raio = "%" . $_GET['raio'] . "%";
$latitude = floatval("%" . $_GET['lat'] . "%");
$longitude = floatval("%" . $_GET['log'] . "%");
$cidade="%" . $_GET['cidade'] . "%";
$sql= "SELECT * FROM oferta";//"add depois" //Inner Join concelhos On oferta.concelhos_id = concelhos.idconcelhos ";
$query = mysql_query($sql);
$array = mysql_fetch_array($query);
$row = mysql_num_rows($query);
//$sql_cidades = "SELECT * FROM oferta WHERE localizacao like '$pesquisa_loc'";
if (isset($latitude) && isset($longitude))
if ($row > 0)
do
$endereco=$array['concelho_id'];
$request="http://maps.google.com/maps/api/geocode/json?address='.$endereco.'sensor=false";
$json_data=file_get_contents($request);
$earth_radius = 6372.795477598;
$lat_1 = floatval($latitude);
$lon_1 = floatval($longitude);
$lat_2 = 41.145570;//floatval($latitude2);
$lon_2 = -8.627014;//floatval($longitude2);
$delta_lat = $lat_2 - $lat_1 ;
$delta_lon = $lon_2 - $lon_1 ;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($lat_1)) * cos(deg2rad($lat_2)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
echo $distance."\n";
if($distance<=$pesquisa_raio)
$response = $array['titulo'] . "|";
while ($array = mysql_fetch_assoc($query));
json_encode($response);
是代码有问题,还是我看不懂结果?
已解决
所以我有这段代码不起作用,但我解决了问题,这就是解决方案:
$tipo_output = "json"; // pode ser utilizado o json também
// a sua API KEY do Google Maps gerado com o link acima
$google_api = "0R4r34bcHA6I0Ppts5oHcxhgoPmdOvt4Hz2cA2w";
// o endereço que desejamos que o google procure
// lembrando que o endereço tem que ser no padrão de uma requisição URL e caso possua acentuação, vamos executar um utf8_encode
$cidade=$array['concelho'];
echo $cidade;
$endereco_desejado = urlencode(utf8_encode("$cidade, PT"));
// Desired address
$endereco_final = "http://maps.google.com/maps/api/geocode/json?address=". $endereco_desejado ."&sensor=true";
// conteudo da página
$string = file_get_contents($endereco_final); // get json content
$json_a = json_decode($string); //json decoder
//busca da lat e log
$longitude2 = $json_a->results[0]->geometry->location->lng;
$latitude2 =$json_a->results[0]->geometry->location->lat;
//calculo da distancia
$earth_radius = 6371.0;
$latitude1 = $latitude * pi() / 180.0;
$longitude1 = $longitude * pi() / 180.0;
$latitude2 = $latitude2 * pi() / 180.0;
$longitude2 = $longitude2 * pi() / 180.0;
$dLat = $latitude2 - $latitude1;
$dLong = $longitude2 - $longitude1;
$a = sin($dLat / 2) * sin($dLat / 2) + cos( $latitude1) * cos($latitude2) * sin($dLong / 2) * sin($dLong / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$resultado=intval($earth_radius * $c); // resultado em km.
【问题讨论】:
哪些输入产生哪些输出?尝试计算非常靠近您的固定点和远离您的固定点的东西。尝试具有相同纬度和相同经度的值。 【参考方案1】:你的输入有问题。
$latitude = floatval("%" . $_GET['lat'] . "%");
$longitude = floatval("%" . $_GET['log'] . "%");
想想你在做什么。无论您从$_GET
获得什么,floatval('%123.4%')
将始终为零。
这些看起来像是 SQL 查询的剩余部分,但您需要不同的转义方法(例如 PDO)来避免 SQL 注入。
另外,您正在使用格式错误的查询加载远程数据并且显然忽略了结果?
$endereco=$array['concelho_id'];
$request="http://maps.google.com/maps/api/geocode/json?address='.$endereco.'sensor=false";
$json_data=file_get_contents($request);
这将产生一个类似于 http://maps.google.com/maps/api/geocode/json?address='.some kind of address.'sensor=false
的 URL,它永远不会给你有用的答案,因为它是
-
包括单引号和句点(您似乎混淆了双引号和单引号),
根本没有正确转义动态部分,
在
sensor=false
之前缺少&
。
(更不用说$array
甚至不会在您第一次运行do while
循环时被初始化。)
【讨论】:
太棒了!但是您知道如何正确执行此代码吗?因为我正在尝试获取数据库提供的城市动态名称,并且我需要谷歌地图提供的纬度和经度来进行计算,我正在搜索并且我找到了这部分代码: $endereco=$array['concelho_id']; $request="maps.google.com/maps/api/geocode/…"; $json_data=file_get_contents($request); TY @DCoder 我解决了这个问题:)【参考方案2】:我不确定你的代码,但我会创建一个函数来计算距离。
function getDistance($latitude1, $longitude1, $latitude2, $longitude2)
$earth_radius = 6371;
$dLat = deg2rad($latitude2 - $latitude1);
$dLon = deg2rad($longitude2 - $longitude1);
$a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2);
$c = 2 * asin(sqrt($a));
$d = $earth_radius * $c;
return $d;
Taken from the codecodex.com page for Haversine formula
我测试了 C# 公式,它是正确的。
【讨论】:
ty 但这是给我的结果:4657.0761803876 我无法取消这个数字,因为我放置坐标的两个城市之间的距离很大!这些之间的实际距离是 +/- 80 公里,所以我无法理解这个结果。 ty Chis Stater 我已经解决了这个问题:),我会发布解决方案以上是关于使用haversine公式,结果太高的主要内容,如果未能解决你的问题,请参考以下文章
CakePHP 2.2.4 无法使用 HAVING 子句和计算字段对结果进行分页 - Haversine 公式