经纬度坐标系转换:全面解析与实践

news2024/12/13 10:41:16

摘要

在地理信息处理与地图应用开发领域,经纬度坐标系的转换起着举足轻重的作用。不同的地图服务提供商,如百度和高德,各自采用了特定的坐标系,并且在某些情况下需要进行相互转换以及与其他通用坐标系之间的转换。本文将深入探讨多种经纬度坐标系的相关知识,包括百度与高德坐标系的特点、常见坐标系转换方法,并提供详细的代码示例,涵盖 Python 代码实现以及在实际应用场景中的应用方式,同时强调在转换过程中需要注意的各种事项。

一、常见坐标系概述

  1. WGS84 坐标系
    • WGS84(World Geodetic System 1984)是全球广泛使用的大地坐标系,也是 GPS 系统所采用的标准坐标系。其以地球的质心为原点,基于一系列精确测量的地球参数构建而成。长半轴米,扁率。该坐标系在全球定位、导航以及地理信息的国际交流等方面具有基础性地位,为各种地理空间数据提供了一个统一的全球基准。
  2. 北京 54 坐标系
    • 北京 54 坐标系是新中国成立初期从前苏联 1942 年普尔科沃坐标系基础上建立起来的大地坐标系。原点位于前苏联的普尔科沃,采用克拉索夫斯基椭球体,长半轴米,扁率。在我国早期的测绘、国土资源调查等领域有着广泛应用,虽然随着技术发展逐渐被其他坐标系所补充,但在一些历史地理数据处理和特定行业应用中仍然具有重要意义。
  3. 西安 80 坐标系
    • 西安 80 坐标系采用 1975 年国际大地测量与地球物理联合会推荐的地球椭球体参数,长半轴米,扁率。它是在我国天文大地网整体平差基础上建立的,在我国的测绘、土地管理、城市规划等众多领域长期发挥着重要作用,相较于北京 54 坐标系,其精度和适应性在国内应用场景中有了进一步提升。
  4. 百度坐标系(BD09)
    • 百度地图使用的百度坐标系是在 GCJ02 坐标系基础上进一步加密偏移得到的。其目的主要是为了更好地适应百度地图的服务特性和数据安全需求。百度坐标系在百度地图的各类应用中广泛使用,如地图展示、位置搜索、导航规划等。但由于其加密特性,在与其他坐标系进行数据交互时需要进行专门的转换处理。
  5. 高德坐标系(GCJ02)
    • 高德地图以及其他一些国内地图服务提供商采用的高德坐标系,也称为火星坐标系。它是由国家测绘局制定的一种对 WGS84 坐标系进行加密处理后的坐标系,主要是出于国家安全和地理信息管理的考虑。在国内的地图应用市场中,GCJ02 坐标系的应用非常广泛,涵盖了众多基于位置的服务场景。

二、百度加密经纬度与百度坐标系转换

  1. 百度地图接口原理与使用
    • 百度地图提供了geoconv/v1/接口用于地理坐标转换,其中包括将百度加密经纬度转换为百度坐标系下的经纬度。该接口基于百度内部的坐标转换算法,综合考虑了地球模型、投影方式以及数据加密规则等因素。
    • Python 代码实现示例
# encoding:utf-8
import requests

# 接口地址
url = "https://api.map.baidu.com/geoconv/v1/"

# 此处填写你在控制台-应用管理-创建应用后获取的AK
ak = "此处填写你在控制台-应用管理-创建应用后获取的AK"

def batch_convert(coords_list):
    params = {
        "from": 6,
        "to": 5,
        "ak": ak
    }
    # 将坐标列表转换为字符串格式,符合接口要求
    coords_str = '|'.join([','.join(map(str, coord)) for coord in coords_list])
    params["coords"] = coords_str

    try:
        response = requests.get(url=url, params=params)
        response.raise_for_status()  # 检查请求是否成功
        return response.json()
    except requests.RequestException as e:
        print(f"请求发生错误: {e}")
        return None
    except ValueError as e:
        print(f"解析 JSON 数据失败: {e}")
        return None
  • 在上述代码中,首先构建了请求的基本参数,包括from(源坐标类型为百度加密经纬度,值为6)、to(目标坐标类型为百度坐标系,值为5)和ak(开发者申请的访问密钥)。然后将待转换的坐标列表转换为符合接口要求的字符串格式,发送请求并处理响应。如果请求成功,将返回的 JSON 数据解析并返回;若出现请求异常或 JSON 解析错误,则分别捕获并打印错误信息,同时返回None

三、高德坐标系与其他坐标系转换

  1. 高德坐标系与 WGS84 坐标系转换
    • 高德坐标系(GCJ02)与 WGS84 坐标系之间的转换是较为常见的需求。其转换算法相对复杂,涉及到非线性的加密和解密过程。虽然没有官方提供的像百度地图那样的直接转换接口,但可以通过一些开源算法库或自行实现转换算法来完成。
    • 以下是一个简单的高德坐标系(GCJ02)转 WGS84 坐标系的 Python 代码示例(基于一种常见的转换算法实现):
import math

def gcj02_to_wgs84(lng, lat):
    a = 6378245.0
    ee = 0.00669342162296594323
    # 转换算法实现
    def transform(lng, lat):
        dlat = _transformlat(lng - 105.0, lat - 35.0)
        dlng = _transformlng(lng - 105.0, lat - 35.0)
        radlat = lat / 180.0 * math.pi
        magic = math.sin(radlat)
        magic = 1 - ee * magic * magic
        sqrtmagic = math.sqrt(magic)
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * math.pi)
        dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * math.pi)
        mglat = lat + dlat
        mglng = lng + dlng
        return mglng, mglat

    def _transformlat(lng, lat):
        ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.abs(lng))
        ret += (20.0 * math.sin(6.0 * lng * math.pi / 180.0) + 20.0 * math.sin(2.0 * lng * math.pi / 180.0)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lat * math.pi / 180.0) + 40.0 * math.sin(lat / 3.0 * math.pi / 180.0)) * 2.0 / 3.0
        ret += (160.0 * math.sin(lat / 12.0 * math.pi / 180.0) + 320.0 * math.sin(lat * math.pi / 30.0 * math.pi / 180.0)) * 2.0 / 3.0
        return ret

    def _transformlng(lng, lat):
        ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.abs(lng))
        ret += (20.0 * math.sin(6.0 * lng * math.pi / 180.0) + 20.0 * math.sin(2.0 * lng * math.pi / 180.0)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lng * math.pi / 180.0) + 40.0 * math.sin(lng / 3.0 * math.pi / 180.0)) * 2.0 / 3.0
        ret += (150.0 * math.sin(lng / 12.0 * math.pi / 180.0) + 300.0 * math.sin(lng / 30.0 * math.pi / 180.0)) * 2.0 / 3.0
        return ret

    dlat = _transformlat(lng - 105.0, lat - 35.0)
    dlng = _transformlng(lng - 105.0, lat - 35.0)
    radlat = lat / 180.0 * math.pi
    magic = math.sin(radlat)
    magic = 1 - ee * magic * magic
    sqrtmagic = math.sqrt(magic)
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * math.pi)
    dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * math.pi)
    mglat = lat + dlat
    mglng = lng + dlng
    return lng * 2 - mglng, lat * 2 - mglat

  • 上述代码实现了从高德坐标系(GCJ02)到 WGS84 坐标系的转换功能。首先定义了地球椭球体的相关参数和,然后通过内部函数_transformlat_transformlng计算坐标转换的中间变量,最后根据转换公式得到 WGS84 坐标系下的经纬度坐标。

四、不同坐标系转换在实际应用中的整合

  1. 地图可视化中的坐标系转换应用
    • 在开发多地图源的地图应用时,例如同时使用百度地图和高德地图的地图展示功能,需要根据不同地图源的要求进行坐标系转换。以在网页中显示地图标记为例,如果从一个数据源获取的坐标是 WGS84 坐标系,而要在百度地图上显示,则需要先将其转换为百度坐标系;若要在高德地图上显示,则需要转换为高德坐标系。
    • 假设使用 JavaScript 结合百度地图 API 和高德地图 API 进行开发,以下是一个简单的示例代码框架:
// 引入百度地图 API 和高德地图 API
// 百度地图初始化
var bmap = new BMap.Map("bmap_container");
// 高德地图初始化
var amap = new AMap.Map('amap_container');

// 假设获取到的 WGS84 坐标数据
var wgs84Lng = 116.3975;
var wgs84Lat = 39.9088;

// 将 WGS84 坐标转换为百度坐标系并在百度地图上显示
var bdCoords = wgs84ToBD09(wgs84Lng, wgs84Lat);
var bmapPoint = new BMap.Point(bdCoords.lng, bdCoords.lat);
var bmapMarker = new BMap.Marker(bmapPoint);
bmap.addOverlay(bmapMarker);

// 将 WGS84 坐标转换为高德坐标系并在高德地图上显示
var gcjCoords = wgs84ToGCJ02(wgs84Lng, wgs84Lat);
var amapPoint = new AMap.LngLat(gcjCoords.lng, gcjCoords.lat);
var amapMarker = new AMap.Marker(amapPoint);
amap.addOverlay(amapMarker);

// 这里的 wgs84ToBD09 和 wgs84ToGCJ02 是自定义的坐标转换函数,需要根据前面提到的转换算法实现

  • 在上述代码中,首先初始化了百度地图和高德地图的实例,然后获取了 WGS84 坐标系下的坐标数据。接着分别调用自定义的wgs84ToBD09(将 WGS84 转换为百度坐标系)和wgs84ToGCJ02(将 WGS84 转换为高德坐标系)函数,将转换后的坐标用于创建地图标记并添加到相应的地图上,从而实现在不同地图上的正确显示。

  1. 地理数据存储与分析中的坐标系转换考量
    • 在地理数据的存储和分析过程中,也需要统一坐标系标准。例如,在一个地理信息数据库中,如果存储了来自不同地图服务或测量设备的坐标数据,可能存在多种坐标系混合的情况。为了进行有效的数据分析,如空间查询、距离计算、区域统计等,需要将所有坐标数据转换为同一坐标系,通常可以选择 WGS84 坐标系作为统一标准。
    • 以 Python 中的地理信息数据处理库geopandas为例,如果数据集中存在高德坐标系(GCJ02)和百度坐标系(BD09)的坐标数据,需要先进行转换为 WGS84 坐标系后再进行数据分析。以下是一个简单的示例代码片段:
import geopandas as gpd

# 读取包含坐标数据的数据集,假设其中有 'longitude' 和 'latitude' 字段表示坐标
data = gpd.read_file('your_data.geojson')

# 定义坐标转换函数,这里假设已经实现了 gcj02_to_wgs84 和 bd09_to_wgs84 函数
def convert_coords(row):
    if row['coordinate_system'] == 'GCJ02':
        wgs84_lng, wgs84_lat = gcj02_to_wgs84(row['longitude'], row['latitude'])
    elif row['coordinate_system'] == 'BD09':
        wgs84_lng, wgs84_lat = bd09_to_wgs84(row['longitude'], row['latitude'])
    else:
        wgs84_lng, wgs84_lat = row['longitude'], row['latitude']
    return wgs84_lng, wgs84_lat

# 对数据集中的坐标进行转换
data[['wgs84_longitude', 'wgs84_latitude']] = data.apply(convert_coords, axis=1, result_type='expand')

# 现在可以使用 wgs84_longitude 和 wgs84_latitude 字段进行地理数据分析,如空间索引构建、空间关系计算等

  • 在上述代码中,首先使用geopandas读取包含坐标数据的数据集,然后根据数据集中的坐标系统标识字段coordinate_system,调用相应的坐标转换函数(gcj02_to_wgs84bd09_to_wgs84)将坐标转换为 WGS84 坐标系,并将转换后的坐标存储到新的字段wgs84_longitudewgs84_latitude中,最后就可以基于这些统一坐标系下的坐标数据进行各种地理数据分析操作。

五、注意事项与最佳实践

  1. 坐标系转换精度考量
    • 不同坐标系转换算法存在一定的近似性,尤其是在涉及到加密坐标系(如百度坐标系和高德坐标系)与原始 WGS84 坐标系之间的转换时,可能会引入一定的误差。在高精度地理应用场景,如精密测绘、高精度导航等,需要对转换误差进行评估和补偿。可以采用多数据源对比验证、结合更精确的大地测量模型等方法来提高转换精度。
  2. 地图服务 API 使用限制与合规性
    • 无论是百度地图还是高德地图的 API,在使用过程中都有一定的使用限制,包括请求频率限制、配额限制等。开发者需要仔细阅读并遵守相应的 API 使用条款,合理规划应用的请求量,避免因超出限制而导致服务中断或账号封禁等问题。同时,在使用地图数据和 API 时,要确保应用的合规性,遵循相关法律法规,保护用户隐私和地理信息安全。
  3. 开源库与算法的可靠性验证
    • 在使用开源的坐标系转换算法库或代码片段时,要对其可靠性进行验证。由于部分开源代码可能存在版本更新不及时、算法不准确或兼容性问题等,在应用到生产环境之前,最好进行充分的测试和验证,可以与官方文档或已知的标准转换结果进行对比,确保转换结果的正确性。

综上所述,经纬度坐标系转换在地理信息处理和地图应用开发中是一个复杂但至关重要的环节。深入理解不同坐标系的特点、掌握各种转换方法并合理应用于实际场景,同时遵循相关注意事项和最佳实践,能够为开发高质量、准确可靠的地理信息应用提供坚实的基础。无论是构建地图可视化应用、进行地理数据存储与分析,还是开展其他与地理空间信息相关的业务,都需要精确处理经纬度坐标系转换问题,以满足不同用户和业务场景的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt之第三方库‌QXlsx使用(三)

Qt开发 系列文章 - QXlsx(三) 目录 前言 一、Qt开源库 二、QXlsx 1.QXlsx介绍 2.QXlsx下载 3.QXlsx移植 4.修改项目文件.pro 三、使用技巧 1.添加头文件 2.写入数据 3.读出数据 总结 前言 Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用…

C++类的运算符重载

目标 让自定义的类直接使用运算符运算 代码 头文件及类定义 #include <iostream>using namespace std; class Complex {int rel;int vir; public:void show(){cout <<"("<<this->rel<<","<<this->vir<<&quo…

SQL注入--Sqlmap使用

一.GET型注入 介绍&#xff1a;注入点在URL里的称之为GET型注入。 单目标 sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id1" sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id1&page10" -p page sqlmap.py -u "http://127.0.0.1/sqli/Less-…

前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor

与框架无关 vue2-ace-editor有问题&#xff0c;ace拿不到&#xff08;brace&#xff09; 一些组件都是基于ace-builds或者brace包装的 不如直接用下面的&#xff0c;不如直接使用下面的 <template><div ref"editor" class"json-editor"><…

知行之桥EDI系统V2024 12月9111版本更新

知行之桥EDI系统V2024于12月推出版本更新&#xff08;版本号&#xff1a;9111&#xff09;&#xff0c;在原有产品的基础上进行了一系列的新增、更改和修复&#xff0c;以确保 EDI 和 MFT 集成尽可能的简单化。 主要特性 新增 新增EDI 交易伙伴管理控制台 交易伙伴管理控制台…

nmap详解

Nmap&#xff08;Network Mapper&#xff09;是一个开放源代码的网络探测和安全审核的工具。由于它的功能强大&#xff0c;被广泛应用于网络安全领域。以下是Nmap的一些主要功能及其在实战中的应用举例。 Nmap的主要功能&#xff1a; 端口扫描&#xff1a;检测目标主机上开放…

HarmonyOS 5.0应用开发——属性动画

【高心星出品】 文章目录 属性动画animateTo属性动画animation属性动画 属性动画 属性接口&#xff08;以下简称属性&#xff09;包含尺寸属性、布局属性、位置属性等多种类型&#xff0c;用于控制组件的行为。针对当前界面上的组件&#xff0c;其部分属性&#xff08;如位置属…

求解自洽场方程

Let’s break down the problem and the solving process step-by-step. Problem Overview The problem appears to be related to linear algebra and possibly quantum mechanics (given the mention of “eigenvalues” and “Hamiltonian” in the Chinese text). We hav…

yarn 安装问题

Couldn’t find package “regenerator-runtime” on the “npm” registry. Error: Couldn’t find package “watch-size” on the “npm” regist 标题Error: Couldn’t find package “babel-helper-vue-jsx-merge-props” on the “npm” registry. Error: Couldn’t f…

Edge SCDN的独特优势有哪些?

强大的边缘计算能力 Edge SCDN&#xff08;边缘安全加速&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为用户提供稳定快速的访问…

360极速浏览器不支持看PDF

360安全浏览器采用的是基于IE内核和Chrome内核的双核浏览器。360极速浏览器是源自Chromium开源项目的浏览器&#xff0c;不但完美融合了IE内核引擎&#xff0c;而且实现了双核引擎的无缝切换。因此在速度上&#xff0c;360极速浏览器的极速体验感更佳。 展示自己的时候要在有优…

神经网络权重矩阵初始化:策略与影响

文章目录 一、权重矩阵初始化&#xff1a;神经网络训练的关键起点&#xff08;一&#xff09;初始化的重要性及随机特性&#xff08;二&#xff09;不同初始化方法的探索历程零初始化&#xff1a;简单却致命的选择&#xff08;仅适用于单层网络&#xff09;标准初始化&#xff…

【算法day13】二叉树:递归与回溯

题目引用 找树左下角的值路径总和从中序与后序遍历构造二叉树 今天就简简单单三道题吧~ 1. 找到树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 我们…

OpenCV实验:图片加水印

第二篇&#xff1a;图片添加水印&#xff08;加 logo&#xff09; 1. 实验原理 水印原理&#xff1a; 图片添加水印是图像叠加的一种应用&#xff0c;分为透明水印和不透明水印。水印的实现通常依赖于像素值操作&#xff0c;将水印图片融合到目标图片中&#xff0c;常用的方法…

路由器、二层交换机与三层交换机的区别与应用

路由器、二层交换机和三层交换机是常见的网络设备&#xff0c;常常协同工作。它们都可以转发数据&#xff0c;但在功能、工作层级以及应用场景上存在差异。 1. 工作层级 三者在OSI模型中的工作层级不同&#xff1a; 路由器&#xff1a; 工作在 网络层&#xff08;第三层&#…

Motionface RTASR 离线实时语音识别直播字幕使用教程

软件使用场景&#xff1a; 直播、视频会议、课堂教学等需要实时字幕的场景。 1&#xff1a;系统要求 软件运行支持32位/64位windows 10/11系统&#xff0c;其他硬件要求无&#xff0c;无显卡也能实时识别字幕。 2&#xff1a;下载安装 链接:百度网盘 请输入提取码 提取码&#…

从零开始认识主板

主板&#xff08;Motherboard&#xff09;是计算机中最重要的硬件之一&#xff0c;它连接并协调了计算机中所有的其他硬件组件。以下是主板的基本组成部分及其功能&#xff0c;从零开始帮助你了解主板&#xff1a; 1. 主板的定义与作用 主板是计算机的核心电路板&#xff0c;用…

Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…

【HarmonyOS之旅】HarmonyOS概述(一)

目录 1 -> HarmonyOS简介 2 -> HarmonyOS发展历程 3 -> HarmonyOS技术特性 3.1 -> 硬件互助&#xff0c;资源共享 3.1.1 -> 分布式软总线 3.1.2 -> 分布式设备虚拟化 3.1.3 -> 分布式数据管理 3.1.4 -> 分布式任务调度 3.1.5 -> 分布式连接…

FireFox火狐浏览器企业策略禁止更新

一直在用火狐浏览器&#xff0c;但是经常提示更新&#xff0c;进入浏览器右上角就弹出提示&#xff0c;比较烦。多方寻找&#xff0c;一直没有找到合适的方案&#xff0c;毕竟官方没有给出禁用检查更新的选项&#xff0c;甚至about:config里都没有。 最终找到了通过企业策略控…