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('/\?[\d\D]+/',$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);
php百度地图计算两地现实距离的更多相关文章
- iOS 百度地图计算两个点时间的距离
		最近在解项目bug,更新地位城市的时候有个错误,后来想在位置改变多少距离之后,再取更新位置,这个功能去年做过.但是又忘记了! 所以还是记录一下吧. 百度地图提供了一个方法: BMKMapPointFo ... 
- JS高德地图计算两地之间的实际距离
		这个是通过导航的方式来获取两地之间的实际距离,和消耗的时间(key值自己去申请哈) <!doctype html> <html> <head> <meta c ... 
- 百度地图坐标之间的距离php
		function GetDistance($lat1, $lng1, $lat2, $lng2){ define('PI',3.1415926535898); define('EARTH_RADIUS ... 
- 百度地图 - demo
		项目需要集成百度地图,那么关于如何集成百度地图的事,就自己去百度开放平台查看文档吧,这是非常简单的事,在这里就不多说了. 那么下面我就说说我在这个demo里所做的事. 首先,项目需要具备定位及计算两地 ... 
- Java根据两点的经纬度来计算之间的距离
		import java.util.HashMap; import java.util.Map; public class MapDistance { private static double EAR ... 
- 百度地图api 实例 自动提示 并计算两地的行驶距离
		百度地图api 实例 自动提示 并计算两地的行驶距离 <!DOCTYPE html> <html> <head> <meta http-equiv=" ... 
- 百度地图Api 根据两个坐标点计算距离
		百度地图Android Sdk的Api里面,没有现成的直接获取两个坐标点之间距离的方法,但是,在jsapi里面,有直接计算距离的方法. class Point: pass def max(a,b): ... 
- 【百度地图API】如何根据摩卡托坐标进行POI查询,和计算两点距离
		原文:[百度地图API]如何根据摩卡托坐标进行POI查询,和计算两点距离 摘要: 百度地图API有两种坐标系,一种是百度经纬度,一种是摩卡托坐标系.在本章你将学会: 1.如何相互转换这两种坐标: 2. ... 
- Java-根据经纬度计算距离(百度地图距离)
		最近碰到一个需求,需要根据两个点的经纬度查询两点的距离.感觉以后还会用到,所以小记一波. 第一步:添加Maven依赖. <dependency> <groupId>org.ga ... 
随机推荐
- 开源的DirectUI界面开发库DUILIB试用demo (Win32程序)
			Demo 第三版源码VC2005工程(附全部.h,ansi/unicode lib,dll),下载地址:http://goo.gl/c0L7Q 开源项目地址:http://code.google. ... 
- 2019/10/17 CSP模拟 总结
			T1 补票 Ticket 没什么好说的,不讲了 T2 删数字 Number 很后悔的是其实考场上不仅想出了正解的方程,甚至连优化都想到了,却因为码力不足只打了\(O(n^2)\)暴力,甚至还因为细节挂 ... 
- iOS之CATiledLayer的属性简介和使用
			1.CATiledLayer简介 CATiledLayer用于大型图片进行分割显示,需要显示的图片才会加载,直接上代码: - (void)viewDidLoad { [super viewDidLoa ... 
- SpringBoot学习笔记(四):SpringBoot集成Mybatis-Plus+代码生成
			简介 官网:http://baomidou.oschina.io/mybatis-plus-doc/ 平时业务代码不复杂的时候我们写什么代码写的最多,就是我们的SQL语句啊,配置那么多的Mapper. ... 
- Cesium官方教程8-- 几何体和外观效果
			原文地址:https://cesiumjs.org/tutorials/Geometry-and-Appearances/ 几何体和外观效果(Geometry and Appearances) 这篇教 ... 
- spring容器创建bean对象的方式
			xml文件中有bean的配置,而且这个bean所对应的java类中存在一个无参构造器 那么这个时候spring容器就可以使用反射调用无参构造器来创建实例了(常规的方式) 通过工厂类获得实例(工厂类实现 ... 
- Python学习day10-文件处理
			figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ... 
- BaseController 的使用
			为了提现代码的高可用性,我们可以常见的把dao层进行抽取,service ,但是很少看见有controller的抽取,其实dao层也是可以被抽取的. 首先我们定义一个BaseController接口 ... 
- Windows API 23 篇 WTSQuerySessionInformation
			函数原型:BOOLWINAPIWTSQuerySessionInformationW( IN ... 
- Tomcat--远程Debug以及参数配置调优
			本文会讲解Tomcat远程Debug调试,Tomcat-manager监控(简单带过),psi-probe监控和Tomcat参数调优.本文基于Tomcat8.5版本. Tomcat远程Debug: 远 ... 
