zoukankan      html  css  js  c++  java
  • PHP实现的7组经纬度与距离的计算函数

    一. 根据当前位置计算四周的经纬度

    /**
     * 根据当前位置计算四周的经纬度
     * @param $lng
     * @param $lat
     * @param float $distance
     * @return array
     */
    function returnSquarePoint($lng, $lat, $distance = 0.5)
    {
        $earthRadius = 6378138;
        $dlng = 2 * asin(sin($distance / (2 * $earthRadius)) / cos(deg2rad($lat)));
        $dlng = rad2deg($dlng);
        $dlat = $distance / $earthRadius;
        $dlat = rad2deg($dlat);
    	
        return array(
            'left-top' => array('lat' => $lat + $dlat, 'lng' => $lng - $dlng),
            'right-top' => array('lat' => $lat + $dlat, 'lng' => $lng + $dlng),
            'left-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng - $dlng),
            'right-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng + $dlng)
        );
    }

    二. 根据经纬度计算范围

    /**
     * 根据经纬度计算范围
     * @param $lat1
     * @param $lng1
     * @param $lat2
     * @param $lng2
     * @return float
     */
    function getDistance($lat1, $lng1, $lat2, $lng2)
    {
        $earthRadius = 6378138;
        // 近似地球半径米          				// 转换为弧度
        $lat1 = ($lat1 * pi()) / 180;
        $lng1 = ($lng1 * pi()) / 180;
        $lat2 = ($lat2 * pi()) / 180;
        $lng2 = ($lng2 * pi()) / 180;           // 使用半正矢公式  用尺规来计算
        $calcLongitude = $lng2 - $lng1;
        $calcLatitude = $lat2 - $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
        $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;
        return round($calculatedDistance);
    }

    三. 通过经纬度根据距离从近到远排序

    /**
     * 通过经纬度根据距离从近到远排序
     * @param $lat
     * @param $lng
     * @return mixed
     */
    function computePoint($lat, $lng)
    {
        $page = 1;
        $pageSize = 7;
    
        $EARTH = 6378.137; 		// 固定参数 地球半径
        $PI = 3.1415926535898;  // 固定参数 圆周率
    
        $list = db('work')->alias('wk')
            ->field("
            wk.id,wk.work_name,wk.age,wk.teach,wk.gwbqid,wk.start_money,wk.work_description,wk.xz_id,
            wk.category,cp.company_id,cp.company_name,cp.la,cp.lo,
            (2 * $EARTH* ASIN(SQRT(POW(SIN($PI*(" . $lat . "-cp.la)/360),2)+COS($PI*" . $lat . "/180)* COS(cp.la * $PI/180)*POW(SIN($PI*(" . $lng . "-cp.lo)/360),2)))) as juli
            ")
            ->order('create_time desc,juli asc')
            ->page($page, $pageSize)
            ->select()->toArray();
    
        return $list;
    }

    四. 根据经纬度查询地理位置

    /**
     * 根据经纬度查询地理位置
     * @param $lat
     * @param $lng
     */
    function myLocation($lat, $lng)
    {
        $url = "http://api.map.baidu.com/geocoder/v2/?ak=YQH8OyfGcvOsPlHdnssSpkulaSNVgL0N&callback=renderReverse&location=$lat,$lng&output=json&pois=1";
    
        $res = file_get_contents($url);
        $lres = ltrim($res, "renderReverse && renderReverse(");
        $rres = rtrim($lres, ")");
    
        echo $rres;
    }

    五. 根据经纬度计算直线距离

    /**
     * 根据经纬度计算直线距离
     * @param $lat1
     * @param $lng1
     * @param $lat2
     * @param $lng2
     * @return float|int
     */
    function getDistances($lat1, $lng1, $lat2, $lng2)
    {
        define('PI', 3.1415926535898);
        define('EARTH_RADIUS', 6378.137);
    
        $radLat1 = $lat1 * (PI / 180);
        $radLat2 = $lat2 * (PI / 180);
    
        $a = $radLat1 - $radLat2;
        $b = ($lng1 * (PI / 180)) - ($lng2 * (PI / 180));
        $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
        $s = $s * EARTH_RADIUS;
        $s = round($s * 10000) / 10000;
    
        return $s * 1000;
    }

    六. 根据经纬度和半径计算出范围

    /**
     * 根据经纬度和半径计算出范围
     * @param string $lat 纬度
     * @param String $lng 经度
     * @param float $radius 半径
     * @return Array 范围数组
     */
    function calcScope($lat, $lng, $radius)
    {
        $degree = (24901 * 1609) / 360.0;
        $dpmLat = 1 / $degree;
    
        $radiusLat = $dpmLat * $radius;
        $minLat = $lat - $radiusLat;       // 最小纬度
        $maxLat = $lat + $radiusLat;       // 最大纬度
    
        $mpdLng = $degree * cos($lat * (3.141592 / 180));
        $dpmLng = 1 / $mpdLng;
        $radiusLng = $dpmLng * $radius;
    
        $minLng = $lng - $radiusLng;      // 最小经度
        $maxLng = $lng + $radiusLng;      // 最大经度
    
        /** 返回范围数组 */
        $scope = array(
            'minLat' => $minLat,
            'maxLat' => $maxLat,
            'minLng' => $minLng,
            'maxLng' => $maxLng
        );
    
        return $scope;
    }

    七. 获取两个经纬度之间的距离

    /**
     * 获取两个经纬度之间的距离
     * @param string $lat1 纬一
     * @param String $lng1 经一
     * @param String $lat2 纬二
     * @param String $lng2 经二
     * @return float  返回两点之间的距离
     */
    function calcDistance($lat1, $lng1, $lat2, $lng2)
    {
        if (empty($lat1) || empty($lng1) || empty($lat2) || empty($lng2)) {
            return false;
        }
    
        /** 转换数据类型为 double */
        $lat1 = doubleval($lat1);
        $lng1 = doubleval($lng1);
        $lat2 = doubleval($lat2);
        $lng2 = doubleval($lng2);
    
        $theta = $lng1 - $lng2;
        $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
        $dist = acos($dist);
        $dist = rad2deg($dist);
        $miles = $dist * 60 * 1.1515;
    
        return ($miles * 1.609344);
    }

    个人网站:www.zerofc.cn 公众号:ZEROFC_DEV QQ交流群:515937120 QQ:2652364582 头条号:1637769351151619 B站:286666708 大鱼号:北桥苏
  • 相关阅读:
    centos pptp client 配置
    hadoop hdfs 权限修改
    cdh Host Monitor 启动失败
    cdh yarn 启动失败
    hive 存储
    docker修改默认存储位置
    centos新增磁盘
    zookeeper服务部署数量
    实时人群计算——设想
    docker容器多服务——Supervisor
  • 原文地址:https://www.cnblogs.com/zerofc/p/15495886.html
Copyright © 2011-2022 走看看