分享一下php gps转gcj-02的方法

    本文是关于PHP的相关知识教程分享,主要分享一下php gps转gcj-02的方法,大致内容如下:1、创建一个php示例文件;2、通过“public static function wgs84ToGcj02 (float $lng, float $lat):array {...}”方法将WGS84转为GCJ02即可。


 分享一下php gps转gcj-02的方法


分享一下php gps转gcj-02的方法


php gps转gcj-02的方法代码如下:


<?php
  
  
namespace App\Tool;
  
/**
 * Class GpsUtils
 * GCJ-02 -- 由国测局制定的GCJ-02 标准,高德地图,腾讯地图,谷歌地图中国大陆板块均采用此标准
 * @package App\Tool
 */
class GpsUtils {
    const x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    // π
    const pi = 3.1415926535897932384626;
    // 长半轴
    const a = 6378245.0;
    // 扁率
    const ee = 0.00669342162296594323;
  
    /**
     * 百度坐标系(BD-09)转WGS坐标
     *
     * @param float $lng 百度坐标纬度
     * @param float $lat 百度坐标经度
     * @return array WGS84坐标数组
     */
    public static function bd09ToWgs84 (float $lng, float $lat): array {
        $gcj = self::bd09ToGcj02($lng, $lat);
        return self::gcj02ToWgs84($gcj[0], $gcj[1]);
    }
  
    /**
     * WGS坐标转百度坐标系(BD-09)
     *
     * @param float $lng WGS84坐标系的经度
     * @param float $lat WGS84坐标系的纬度
     * @return array 百度坐标数组
     */
    public static function wgs84ToBd09 (float $lng, float $lat): array {
        $gcj = self::wgs84ToGcj02($lng, $lat);
        return self::gcj02ToBd09($gcj[0], $gcj[1]);
    }
  
    /**
     * 火星坐标系(GCJ-02)转百度坐标系(BD-09)
     *
     * @param float $lng 火星坐标经度
     * @param float $lat 火星坐标纬度
     * @return array 百度坐标数组
     * @see 谷歌、高德——>百度
     */
    public static function gcj02ToBd09 (float $lng, float $lat): array {
        $z = sqrt($lng * $lng + $lat * $lat) + 0.00002 * sin($lat * self::x_pi);
        $theta = atan2($lat, $lng) + 0.000003 * cos($lng * self::x_pi);
        $bd_lng = $z * cos($theta) + 0.0065;
        $bd_lat = $z * sin($theta) + 0.006;
        return [$bd_lng, $bd_lat];
    }
  
    /**
     * 百度坐标系(BD-09)转火星坐标系(GCJ-02)
     *
     * @param float $bd_lon 百度坐标纬度
     * @param float $bd_lat 百度坐标经度
     * @return array
     * @see 百度——>谷歌、高德
     */
    public static function bd09ToGcj02 (float $bd_lon, float $bd_lat): array {
        $x = $bd_lon - 0.0065;
        $y = $bd_lat - 0.006;
        $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * self::x_pi);
        $theta = atan2($y, $x) - 0.000003 * cos($x * self::x_pi);
        $gg_lng = $z * cos($theta);
        $gg_lat = $z * sin($theta);
        return [$gg_lng, $gg_lat];
    }
  
    /**
     * WGS84转GCJ02(火星坐标系)
     *
     * @param float $lng WGS84坐标系的经度
     * @param float $lat WGS84坐标系的纬度
     * @return array 火星坐标数组
     */
    public static function wgs84ToGcj02 (float $lng, float $lat): array {
        $d_lat = self::transformlat($lng - 105.0, $lat - 35.0);
        $d_lng = self::transformlng($lng - 105.0, $lat - 35.0);
        $rad_lat = $lat / 180.0 * self::pi;
        $magic = sin($rad_lat);
        $magic = 1 - self::ee * $magic * $magic;
        $sqrt_magic = sqrt($magic);
        $d_lat = ($d_lat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrt_magic) * self::pi);
        $d_lng = ($d_lng * 180.0) / (self::a / $sqrt_magic * cos($rad_lat) * self::pi);
        $mg_lat = $lat + $d_lat;
        $mg_lng = $lng + $d_lng;
        return [$mg_lng, $mg_lat];
    }
  
    /**
     * GCJ02(火星坐标系)转GPS84
     * @param float $lng 火星坐标系的经度
     * @param float $lat 火星坐标系纬度
     * @return array WGS84坐标数组
     */
    public static function gcj02ToWgs84 (float $lng, float $lat): array {
        $d_lat = self::transformlat($lng - 105.0, $lat - 35.0);
        $d_lng = self::transformlng($lng - 105.0, $lat - 35.0);
        $rad_lat = $lat / 180.0 * self::pi;
        $magic = sin($rad_lat);
        $magic = 1 - self::ee * $magic * $magic;
        $sqrt_magic = sqrt($magic);
        $d_lat = ($d_lat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrt_magic) * self::pi);
        $d_lng = ($d_lng * 180.0) / (self::a / $sqrt_magic * cos($rad_lat) * self::pi);
        $mg_lat = $lat + $d_lat;
        $mg_lng = $lng + $d_lng;
        return [$lng * 2 - $mg_lng, $lat * 2 - $mg_lat];
    }
  
    /**
     * 纬度转换
     * @param float $lng
     * @param float $lat
     * @return float|int
     */
    public static function transFormLat (float $lng, float $lat): float {
        $ret = -100.0 + 2.0 * $lng + 3.0 * $lat + 0.2 * $lat * $lat + 0.1 * $lng * $lat + 0.2 * sqrt(abs($lng));
        $ret += (20.0 * sin(6.0 * $lng * self::pi) + 20.0 * sin(2.0 * $lng * self::pi)) * 2.0 / 3.0;
        $ret += (20.0 * sin($lat * self::pi) + 40.0 * sin($lat / 3.0 * self::pi)) * 2.0 / 3.0;
        $ret += (160.0 * sin($lat / 12.0 * self::pi) + 320 * sin($lat * self::pi / 30.0)) * 2.0 / 3.0;
        return $ret;
    }
  
    /**
     * 经度转换
     * @param float $lng
     * @param float $lat
     * @return float
     */
    public static function transFormLng (float $lng, float $lat): float {
        $ret = 300.0 + $lng + 2.0 * $lat + 0.1 * $lng * $lng + 0.1 * $lng * $lat + 0.1 * sqrt(abs($lng));
        $ret += (20.0 * sin(6.0 * $lng * self::pi) + 20.0 * sin(2.0 * $lng * self::pi)) * 2.0 / 3.0;
        $ret += (20.0 * sin($lng * self::pi) + 40.0 * sin($lng / 3.0 * self::pi)) * 2.0 / 3.0;
        $ret += (150.0 * sin($lng / 12.0 * self::pi) + 300.0 * sin($lng / 30.0 * self::pi)) * 2.0 / 3.0;
        return $ret;
    }
}


    GCJ-02是由中国国家测绘局制订的地理信息系统的坐标系统。它是一种对经纬度数据的加密算法,即加入随机的偏差。国内出版的各种地图系统,必须至少采用GCJ-02对地理位置进行首次加密。关于php gps转gcj-02的方法教程解析到这里就结束了,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题