我的情况是客户要求我计算主地址和客户地址之间的距离。根据距离,我会在购物车中添加一些额外费用并进行一些验证,并向客户显示他的地址已停止服务。
以下是说明;
主要地址; 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
如何确保正确的地址? 任何候补将受到高度赞赏。感谢
答案 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;