zoukankan      html  css  js  c++  java
  • php百度地图计算两地现实距离


    请自行到百度地图官网申请您的ak

    
    <!--前端获取手机经纬度的代码-->
    
    <!--<!DOCTYPE html>-->
    <!--<html lang="en">-->
    <!---->
    <!--<head>-->
    <!--    <meta charset="UTF-8">-->
    <!--    <title>text</title>-->
    <!--    <script>-->
    <!--        function getLocation() {-->
    <!--            if (navigator.geolocation) {-->
    <!--                navigator.geolocation.getCurrentPosition(showMap,errorMap);-->
    <!--            } else {-->
    <!--                alert("您的浏览器不支持")-->
    <!--            }-->
    <!---->
    <!--        }-->
    <!--        function showMap(position){-->
    <!--        	var longitude = position.coords.longitude;-->
    <!--        	var latitude = position.coords.latitude;-->
    <!--        	alert("您的位置是:"+longitude+ "," + latitude);-->
    <!--		}-->
    <!--		function errorMap(value){-->
    <!--        	switch(value.code){-->
    <!--        		case 1: alert("位置请求被拒绝");break;-->
    <!--        		case 2: alert("暂时获取不到位置信息");break;-->
    <!--        		case 3: alert("请求超时");break;-->
    <!--        		case 4: alert("未知错误");break;-->
    <!--        	}-->
    <!--        }-->
    <!--        -->
    <!--		getLocation();-->
    <!--	</script>-->
    <!--	-->
    <!--</head>-->
    <!--</html>-->
    
    <?php
    
        /**
         * 计算两个地址之间的距离,单位:米
         * 地址要尽量详细,减小误差
         * @param address
         * @param $param
         * @return $param
         */
        function calculateDistance($address,$param){
            if (!is_array($param)){
                throw new Exception("参数必须为array");
            }
            $length = count($param);
            $url = urldecode("http://api.map.baidu.com/cloudgc/v1?ak=您的ak&address=".$address);
            $result = json_decode(get($url));
            $startLatLng = array(
                "lat" => $result->result[0]->location->lat,
                "lng" => $result->result[0]->location->lng
            );
            for ($i=0; $i<$length; $i++){
                $url = urldecode("http://api.map.baidu.com/cloudgc/v1?ak=您的ak&address=".$param[$i]['address']);
                $result = json_decode(get($url));
                $endLatLng = array(
                    "lat" => $result->result[0]->location->lat,
                    "lng" => $result->result[0]->location->lng
                );
                $distance = array( "distance"=>getDistance($startLatLng,$endLatLng),"unit"=>"m");
                array_push($param[$i],$distance);
            }
            return $param;
        }
    //    $add = array(
    //        array("address"=>"福建省厦门市集美区"),
    //        array("address"=>"北京市海淀区上地十街10号")
    //    );
    //    print_r(calculateDistance("福建省厦门市集美区",$add));    /**
         * 发送GET请求
         * @param url
         * @param param
         * @return result
         */
    
        function get($url, $param=array()){
            if(!is_array($param)){
                throw new Exception("参数必须为array");
            }
            $p='';
            foreach($param as $key => $value){
                $p=$p.$key.'='.$value.'&';
            }
            if(preg_match('/?[dD]+/',$url)){//matched ?c
                $p='&'.$p;
            }else if(preg_match('/?$/',$url)){//matched ?$
                $p=$p;
            }else{
                $p='?'.$p;
            }
            $p=preg_replace('/&$/','',$p);
            $url=$url.$p;
            //echo $url;
            $http =curl_init($url);
            curl_setopt($http, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($http, CURLOPT_SSL_VERIFYHOST, 2);
            curl_setopt($http,CURLOPT_RETURNTRANSFER,1);
            curl_setopt($http, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
            curl_setopt($http, CURLOPT_RETURNTRANSFER,1);
            curl_setopt($http, CURLOPT_HEADER,false);
            $result=curl_exec($http);
            curl_close($http);
            return $result;
        }
        /**
         * 计算两点之间距离
         * @param start
         * @param end
         * @return 米
         */
        function getDistance($startLatLng,$endLatLng){
            if (is_array($startLatLng)&&is_array($endLatLng)){
    
                $lat1 = (pi()/180)*$startLatLng['lat'];
                $lat2 = (pi()/180)*$endLatLng['lat'];
                $lng1 = (pi()/180)*$startLatLng['lng'];
                $lng2 = (pi()/180)*$endLatLng['lng'];
    
                //地球半径
                $R =  6371;
    
                //两点间的距离 km,如果想要米的话,结果*1000就可以了
                $d = acos(sin($lat1)*sin($lat2)+cos($lat1)*cos($lat2)*cos($lng2-$lng1))*$R;
            }else{
                $d = 1;
            }
            return $d*1000;
    
        }
    
        /**
         * 通过ip获取地址
         * @param $ip
         * @throws Exception
         * @return $result
         */
        function getAddressByIp($ip){
            if (!filter_var($ip,FILTER_VALIDATE_IP)){
                throw new Exception("IP无效");
            }
            $url = "http://api.map.baidu.com/location/ip?ak=您的ak&coor=bd09ll&ip=".$ip;
            $result = json_decode(get($url));
            if ($result->status != 0){
                throw new Exception("获取坐标失败");
            }
            $url = "http://api.map.baidu.com/geocoder/v2/?location=".$result->content->point->y.",".$result->content->point->x."&ak=您的ak&output=json";
    
            $result= json_decode(get($url));
            echo $result->result->formatted_address;
            return $result->result->formatted_address;
        }    //getAddressByIp("120.41.85.225");/**
     * 通过GPS定位拿到具体位置,电脑只有IE、edge才有定位权限
     * @param $latLng=array('lat'=>?,'lng'=>?)
     * @return $result->result->formatted_address
     */
    
        function getAddressByGPS($latLng)
        {
            $url = "http://api.map.baidu.com/geocoder/v2/?location=" .$latLng['lat'].",".$latLng['lng']. "&ak=您的ak&output=json";
            $result = json_decode(get($url));
            return $result->result->formatted_address;
        }
    
        $latLng = array(
            'lat'=>24.609098,
            'lng'=>118.045559
        );
        echo getAddressByGPS($latLng);
    
    
  • 相关阅读:
    Spring boot --- Spring Oauth(三)
    Spring boot --- Spring Oauth(一)
    JavaScript 学习(一)
    Springboot --- Spring Security (一)
    HTML 学习笔记 JavaScript (节点)
    HTML 学习笔记 JavaScript(事件)
    HTML 学习笔记 JavaScript (DOM)
    HTML 学习笔记 CSS3 (多列)
    HTML 学习笔记 CSS3(Animation)
    HTML 学习笔记 CSS3(过度 transition)
  • 原文地址:https://www.cnblogs.com/lovellll/p/10203033.html
Copyright © 2011-2022 走看看