计算两个地址php之间的距离

时间:2015-06-13 21:01:42

标签: php wordpress google-maps woocommerce

我的情况是客户要求我计算主地址和客户地址之间的距离。根据距离,我会在购物车中添加一些额外费用并进行一些验证,并向客户显示他的地址已停止服务。

以下是说明;

  

主要地址; 2801 Florida Ave,Miami Fl,33133。

     

如果输入的用户地址距离主地址25英里或更远,则弹出一个弹出窗口   会说"我们很抱歉。您的地址不属于我们的服务范围   区域,我们无法在此向您提供/接收设备   时间&#34。如果用户的地址距离5英里或更远,则不收取额外费用。如果   用户的地址距离5-10英里,额外收费20美元。如果是用户   地址10-25 mils,30美元的额外费用。也是任何订单   500美元或以上,无论距离(0-25英里),都不收取额外费用。

我想出了以下答案并思考,这是我问题的解决方案吗?

Distance from point A to B using Google Maps, PHP and MySQL

如何确保正确的地址? 任何候补将受到高度赞赏。感谢

3 个答案:

答案 0 :(得分:1)

要求并未指定距离应该是从基地址到用户地址的直线,还是应该考虑到道路上的实际距离。

对于前者,您应该能够在不使用外部API的情况下计算PHP中两个纬度/长度对之间的距离,并且仅使用Google API从地址中检索坐标(请查看{ {3}})。对于后者,您发布的问题/答案似乎是恰当的。

确保地址正确只是验证输入的问题。您可以验证Google API是否返回了用户输入的地址的结果,并显示错误,要求他们确认输入的地址(如果没有)。

或者,如果您在接受用户地址的页面中添加了Google地图控件,则可以提高您获取Google API具有长途/长途数据的地址的可能性。也可以直接获取纬度和经度而无需单独的API调用。

答案 1 :(得分:0)

<?php 
$from = "kathmandu,nepal";
$to = "mahendranagar,nepal";
$from = urlencode($from);
$to = urlencode($to);
$data = file_get_contents("http://maps.googleapis.com/maps/api/distancematrix/json?origins=$from&destinations=$to&language=en-EN&sensor=false");
$data = json_decode($data);
$time = 0;
$distance = 0;
foreach($data->rows[0]->elements as $road) {
    $time += $road->duration->value;
    $distance += $road->distance->value;
}
echo "To: ".$data->destination_addresses[0];
echo "<br/>";
echo "From: ".$data->origin_addresses[0];
echo "<br/>";
$distance=$distance/1000;
echo "Distance: ".$distance." km";
$default_price=11;
$distance_mile=$distance*1.6;
$price_distance=$default_price*$distance_mile;

if($distance_mile>=25){
    echo "<script>alert('We are sorry. Your address falls outside of our service area and we are unable to deliver/pick up equipment to you at this time.');</script>";
}
elseif($price_distance>=500){
    $price=$price_distance;
}else{
    if($distance_mile<5){
        $price=$price_distance;
    }elseif($distance_mile>5 && $distance_mile<10){
        $price=$default_price + 20;
    }
    elseif($distance_mile>10 && $distance_mile<25){
        $price=$default_price + 30;
    }
}
echo "final price : ".$price;
?>

答案 2 :(得分:-1)

function getDistance($addressFrom, $addressTo, $unit){
//Change address format
$formattedAddrFrom = str_replace(' ','+',$addressFrom);
$formattedAddrTo   = str_replace(' ','+',$addressTo);

//Send request and receive json data
$geocodeFrom = file_get_contents('http://maps.google.com/maps/api/geocode/json?address='.$formattedAddrFrom.'&sensor=false');
$outputFrom  = json_decode($geocodeFrom);
$geocodeTo   = file_get_contents('http://maps.google.com/maps/api/geocode/json?address='.$formattedAddrTo.'&sensor=false');
$outputTo    = json_decode($geocodeTo);

//Get latitude and longitude from geo data
$latitudeFrom  = $outputFrom->results[0]->geometry->location->lat;
$longitudeFrom = $outputFrom->results[0]->geometry->location->lng;
$latitudeTo    = $outputTo->results[0]->geometry->location->lat;
$longitudeTo   = $outputTo->results[0]->geometry->location->lng;

//Calculate distance from latitude and longitude
$theta = $longitudeFrom - $longitudeTo;
$dist  = sin(deg2rad($latitudeFrom)) * sin(deg2rad($latitudeTo)) +  cos(deg2rad($latitudeFrom)) * cos(deg2rad($latitudeTo)) * cos(deg2rad($theta));
$dist  = acos($dist);
$dist  = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
$unit  = strtoupper($unit);
if ($unit == "K") {
    return ($miles * 1.609344).' km';
} else if ($unit == "N") {
    return ($miles * 0.8684).' nm';
} else {
    return $miles.' mi';
}}

// You can use this function like the below.
$addressFrom = 'Insert from address';
$addressTo = 'Insert to address';
$distance = getDistance($addressFrom, $addressTo, "K");
echo $distance;