【问题标题】: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 调用。

    【讨论】:

    • 进一步扩展:如果你想计算两组坐标之间的距离,你可以使用haversine formula。请注意,公式给出的距离将是“鸟儿飞翔”,因此它会比行驶距离略短。
    • 如果您关心执行此类查询的性能,请查看MySQL geospatial extensions
    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        • 2016-12-21
        • 2011-12-24
        相关资源
        最近更新 更多