【问题标题】:Calculate distance between two address php计算两个地址php之间的距离
【发布时间】:2015-06-13 21:01:41
【问题描述】:
我有一种情况,客户要求我计算主要地址和客户地址之间的距离。并且根据距离,我必须向我的购物车添加一些额外费用,并进行一些验证并向客户显示他的地址已停止服务。
以下是说明;
主要地址;佛罗里达大街 2801 号,佛罗里达州迈阿密,33133。
如果输入的用户地址距离主地址 25 英里或更多,弹出
up 会说“我们很抱歉。您的地址不在我们的服务范围内
区域,我们无法在此向您交付/提取设备
时间。”如果用户的地址在 5 英里或以下,不收取额外费用。如果
用户地址在 5-10 英里外,额外收费 20 美元。如果用户的
地址在 10-25 英里之外,额外收费 30 美元。还有任何订单
500 美元或以上,无论距离多远(0-25 英里),均不收取额外费用。
我想出了下面的答案和思考,这是我的问题的解决方案吗?
Distance from point A to B using Google Maps, PHP and MySQL
如何确保地址正确?
任何替代品都将受到高度赞赏。谢谢
【问题讨论】:
标签:
php
wordpress
google-maps
woocommerce
【解决方案1】:
该要求没有指定距离是否应该是从基址到用户地址的直线,或者是否应该考虑道路上的实际距离。
对于前者,您应该能够在 PHP 中计算两个经/纬度对之间的距离,而无需使用外部 API,并且只使用 Google API 从地址中检索坐标(看看@ 987654321@)。对于后者,您发布的问题/答案似乎很合适。
确保地址正确只是验证输入的问题。您可以验证 Google API 是否为用户输入的地址返回结果,如果没有,则显示错误,要求他们确认输入的地址。
或者,如果您在接受用户地址的页面中包含 Google 地图控件,则可以增加您获得 Google API 具有纬度/经度数据的地址的可能性,并且还可以直接获得纬度和经度,无需单独的 API 调用。
【解决方案2】:
<?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;
?>
【解决方案3】:
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;