ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql php js 经纬度 转换 查询

2022-08-24 16:01:20  阅读:380  来源: 互联网

标签:pi js let mysql lat theta lng php Math


坐标系介绍

地球坐标 (WGS84)

WGS-84:是国际标准,GPS坐标(Google Earth使用、或者GPS模块)
国际标准,从专业GPS 设备中取出的数据的坐标系
国际地图提供商使用的坐标系

火星坐标 (GCJ-02)也叫国测局坐标系

GCJ-02:中国坐标偏移标准,Google Map、高德、腾讯使用
中国标准,从国行移动设备中定位获取的坐标数据使用这个坐标系
国家规定: 国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。
腾讯地图用的也是GCJ02坐标

百度坐标 (BD-09)

BD-09:百度坐标偏移标准,Baidu Map使用
百度标准,百度 SDK,百度地图,Geocoding 使用

  1. PHP
/**
 * 中国正常GCJ02坐标---->百度地图BD09坐标
 * 腾讯地图用的也是GCJ02坐标
 * @param double $lat 纬度
 * @param double $lng 经度
 */
function Convert_GCJ02_To_BD09($lat, $lng)
{
    $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    $x = $lng;
    $y = $lat;
    $z = sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $x_pi);
    $theta = atan2($y, $x) + 0.000003 * cos($x * $x_pi);
    $lng = $z * cos($theta) + 0.0065;
    $lat = $z * sin($theta) + 0.006;
    return array('lng' => $lng, 'lat' => $lat);
}

/**
 * 百度地图BD09坐标---->中国正常GCJ02坐标
 * 腾讯地图用的也是GCJ02坐标
 * @param double $lat 纬度
 * @param double $lng 经度
 * @return array();
 */
function Convert_BD09_To_GCJ02($lat, $lng)
{
    $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    $x = $lng - 0.0065;
    $y = $lat - 0.006;
    $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
    $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
    $lng = $z * cos($theta);
    $lat = $z * sin($theta);
    return array('lng' => $lng, 'lat' => $lat);
}

//用变量替换时注意数据类型
$lng = floatval(112.618056);
$lat = floatval(37.858867);
$locXY = Convert_GCJ02_To_BD09($lng, $lat);
$content = "百度地图坐标系,经度:" . $locXY['lng'] . ";纬度:" . $locXY['lat'];
echo $content;
  1. JS
//将腾讯/高德地图经纬度转换为百度地图经纬度
function qqMapTransBMap(lng, lat) {
    let x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    let x = lng;
    let y = lat;
    let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
    let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
    let lngs = z * Math.cos(theta) + 0.0065;
    let lats = z * Math.sin(theta) + 0.006;

    return {
        lng: lngs,
        lat: lats
    }
}

// 将百度地图经纬度转换为腾讯/高德地图经纬度
function bMapTransQQMap(lng, lat) {
    let x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    let x = lng - 0.0065;
    let y = lat - 0.006;
    let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
    let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
    let lngs = z * Math.cos(theta);
    let lats = z * Math.sin(theta);

    return {
        lng: lngs,
        lat: lats
    }
}

mysql 查询距离

一般地图上显示的坐标顺序为,纬度在前(范围-9090),经度在后(范围-180180)

CREATE TABLE `customer` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(50) NOT NULL COMMENT '名称',
  `lon` double(9,6) NOT NULL COMMENT '经度',
  `lat` double(8,6) NOT NULL COMMENT '纬度',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='商户表';

INSERT INTO `customer`(`id`, `name`, `lon`, `lat`) VALUES (1, '天津市区', 117.315575, 39.133462);
INSERT INTO `customer`(`id`, `name`, `lon`, `lat`) VALUES (2, '北京市区', 116.407999, 39.894073);
INSERT INTO `customer`(`id`, `name`, `lon`, `lat`) VALUES (3, '保定', 115.557124, 38.853490);
INSERT INTO `customer`(`id`, `name`, `lon`, `lat`) VALUES (4, '石家庄', 114.646458, 38.072369);
INSERT INTO `customer`(`id`, `name`, `lon`, `lat`) VALUES (5, '昌平区1', 116.367180, 40.009561);
INSERT INTO `customer`(`id`, `name`, `lon`, `lat`) VALUES (6, '海淀区2', 116.313425, 39.973078);
INSERT INTO `customer`(`id`, `name`, `lon`, `lat`) VALUES (7, '海淀区1', 116.329236, 39.987231);
INSERT INTO `customer`(`id`, `name`, `lon`, `lat`) VALUES (8, '首开广场', 116.355254, 40.079937);


SELECT
    *,
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
                POW(
                    SIN(
                        (
                            40.080335 * PI() / 180 - lat * PI() / 180
                        ) / 2
                    ),
                    2
                ) + COS(40.080335 * PI() / 180) * COS(lat * PI() / 180) * POW(
                    SIN(
                        (
                            116.35511 * PI() / 180 - lon * PI() / 180
                        ) / 2
                    ),
                    2
                )
            )
        ) * 1000
    ) AS juli
FROM
    customer
ORDER BY
    juli ASC

标签:pi,js,let,mysql,lat,theta,lng,php,Math
来源: https://www.cnblogs.com/fuqian/p/16620317.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有