当前位置: 首页 > article >正文

关于网页地图的坐标系

EPSG:4326地理坐标系 和 EPSG:3857Web 墨卡托投影

EPSG:4326
  • 定义:EPSG:4326 是基于 WGS84 椭球的地理坐标系,使用经度(Longitude)和纬度(Latitude)表示地球上的位置。
  • 特点
    • 经度范围为 -180° 至 +180°,纬度范围为 -90° 至 +90°。
    • 单位为度(°),适合精确的地理定位和科学应用。
    • 由于其基于椭球体模型,计算复杂度较高。
  • 应用场景
    • 用于存储地理数据,如 GPS 数据、地理信息系统(GIS)数据等。
    • 适用于大范围的地理信息描述。
EPSG:3857
  • 定义:EPSG:3857 是基于 Web 墨卡托投影(伪墨卡托投影)的投影坐标系,将地球视为正球体进行投影。
  • 特点
    • 坐标单位为米,范围为纬度 ±85.051129°。
    • 由于投影的等角特性,地图在不同层级上保持形状不变,适合导航和地图显示。
    • 高纬度地区存在面积变形,但计算简单,适合 Web 地图应用。
  • 应用场景
    • 广泛用于 Web 地图服务,如 Google Maps、OpenStreetMap、ArcGIS 等。
    • 适合地图显示和导航,但 不适合存储地理数据
两者关系

通常地理数据以 EPSG:4326 存储,因为其精度高且易于理解;而在 Web 地图中显示时,会转换为 EPSG:3857(大部分地图api底层会进行转换,开发调用api只需要写入 EPSG:4326坐标)。
当网页地图中加载数据时,系统会将 EPSG:4326 坐标转换为 EPSG:3857 坐标,以适应地图的投影和显示。这种转换是必要的,因为 EPSG:3857 坐标系使用的是平面坐标,对地图的缩放和平移效果更好。

各大地图服务提供商所使用的坐标系:

地图服务坐标系
天地图CGCS2000(中国2000国家大地坐标系),EPSG代码为4490。
高德地图GCJ-02(火星坐标系),基于WGS-84加密处理。
百度地图BD-09,基于GCJ-02二次加密。
谷歌地图国外使用WGS-84坐标系;在中国使用GCJ-02。
Mapbox默认使用WGS-84(EPSG:4326)或Web墨卡托投影(EPSG:3857),但可通过修改支持其他坐标系。
ArcGIS通常使用WGS-84(EPSG:4326)或Web墨卡托投影(EPSG:3857),具体取决于数据源。

说明

  • CGCS2000WGS-84 非常接近,差异在厘米级别,通常可忽略。

关于火星坐标系要注意的

火星坐标系用于避免地图数据被直接使用或分析。由于中国的法律对地图数据有严格的管理,因此在中国境内的地图API(如高德和百度地图)都会对GPS坐标进行加密,转换为火星坐标系。
这种转换使得直接从GPS设备获取的WGS 84坐标不再准确,需要通过特定的算法进行转换才能在这些地图服务中正确显示。
例如:leaflet加载高德地图,如果添加点击事件获取地图上的点那么点的坐标是火星坐标系的,如果向地图上添加已知点,为了加到正确的位置上,也要求是火星坐标系。
下面是java的基于geotools api实现高德火星坐标系转WGS-84坐标系(基于wkb字符串)

@Slf4j
public class WKBToGeoJSONUtil {/*** 将WKB十六进制字符串转换为GeoJSON格式的Map* @param hexWKB PostGIS返回的WKB十六进制字符串* @param decimals 保留的小数位数* @return 对应GeoJSON结构的Map* @throws Exception 如果解析WKB或生成GeoJSON时发生错误*/public static Map<String, Object> convert(String hexWKB, int decimals) throws Exception {Geometry geometry = parseWKB(hexWKB);Geometry wgs84Geometry = CoordinateTransform.gcj02ToWgs84(geometry);return convertToGeoJSONMap(wgs84Geometry, decimals);}/*** 解析WKB字符串为JTS Geometry对象* @param hexWKB WKB十六进制字符串* @return 解析后的Geometry对象* @throws Exception 如果解析WKB时发生错误*/private static Geometry parseWKB(String hexWKB) throws Exception {try {WKBReader wkbReader = new WKBReader();byte[] wkbBytes = WKBReader.hexToBytes(hexWKB);return wkbReader.read(wkbBytes);} catch (ParseException e) {log.error("Failed to parse WKB string: {}", hexWKB, e);throw new Exception("Failed to parse WKB string", e);}}/*** 将Geometry对象转换为GeoJSON Map* @param geometry JTS Geometry对象* @param decimals 保留的小数位数* @return GeoJSON格式的Map* @throws IOException 如果生成GeoJSON时发生错误*/private static Map<String, Object> convertToGeoJSONMap(Geometry geometry, int decimals) throws IOException {try {GeometryJSON geometryJSON = new GeometryJSON(decimals);StringWriter writer = new StringWriter();geometryJSON.write(geometry, writer);String geoJsonStr = writer.toString();ObjectMapper objectMapper = new ObjectMapper();return objectMapper.readValue(geoJsonStr, new TypeReference<Map<String, Object>>() {});} catch (IOException e) {log.error("Failed to convert Geometry to GeoJSON Map", e);throw new IOException("Failed to convert Geometry to GeoJSON Map", e);}}/*** 坐标转换工具类*/private static class CoordinateTransform {private static final double PI = Math.PI;private static final double AXIS = 6378245.0;private static final double OFFSET = 0.00669342162296594323;/*** 将GCJ-02坐标系的Geometry转换为WGS84坐标系* @param geometry GCJ-02坐标系的Geometry* @return WGS84坐标系的Geometry*/public static Geometry gcj02ToWgs84(Geometry geometry) {GeometryEditor editor = new GeometryEditor();return editor.edit(geometry, new GeometryEditor.CoordinateSequenceOperation() {@Overridepublic CoordinateSequence edit(CoordinateSequence coordSeq, Geometry geom) {Coordinate[] coords = coordSeq.toCoordinateArray();for (Coordinate coord : coords) {double[] wgs84 = gcj02ToWgs84(coord.x, coord.y);coord.x = wgs84[0];coord.y = wgs84[1];}return new CoordinateArraySequence(coords);}});}/*** 将GCJ-02坐标转换为WGS84坐标* @param lng 经度* @param lat 纬度* @return WGS84坐标*/private static double[] gcj02ToWgs84(double lng, double lat) {if (outOfChina(lng, lat)) {return new double[]{lng, lat};}double[] delta = delta(lng, lat);return new double[]{lng - delta[0], lat - delta[1]};}/*** 判断坐标是否在中国范围内* @param lng 经度* @param lat 纬度* @return 是否在中国范围内*/private static boolean outOfChina(double lng, double lat) {return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271;}/*** 计算GCJ-02与WGS84之间的偏移量* @param lng 经度* @param lat 纬度* @return 偏移量*/private static double[] delta(double lng, double lat) {double dLat = transformLat(lng - 105.0, lat - 35.0);double dLng = transformLng(lng - 105.0, lat - 35.0);double radLat = lat / 180.0 * PI;double magic = Math.sin(radLat);magic = 1 - OFFSET * magic * magic;double sqrtMagic = Math.sqrt(magic);dLat = (dLat * 180.0) / ((AXIS * (1 - OFFSET)) / (magic * sqrtMagic) * PI);dLng = (dLng * 180.0) / (AXIS / sqrtMagic * Math.cos(radLat) * PI);return new double[]{dLng, dLat};}private static double transformLat(double x, double y) {double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y;ret += 0.2 * Math.sqrt(Math.abs(x));ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(y * PI) + 40.0 * Math.sin(y / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * Math.sin(y / 12.0 * PI) + 320 * Math.sin(y * PI / 30.0)) * 2.0 / 3.0;return ret;}private static double transformLng(double x, double y) {double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y;ret += 0.1 * Math.sqrt(Math.abs(x));ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(x * PI) + 40.0 * Math.sin(x / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * Math.sin(x / 12.0 * PI) + 300.0 * Math.sin(x / 30.0 * PI)) * 2.0 / 3.0;return ret;}}/*** 测试方法*/public static void main(String[] args) {// 示例 WKB 字符串String wkb = "0104000020E6100000......";// wkb字符串try {Map<String, Object> geoJsonMap = convert(wkb, 6); // 转换为GeoJSON,保留6位小数log.info("GeoJSON Map: {}", geoJsonMap);} catch (Exception e) {log.error("Error converting WKB to GeoJSON", e);}}
}

效果展示(上图为mapbox4326坐标系、下面是高德地图火星坐标系)
在这里插入图片描述
可见偏差比较小。

相关文章:

关于网页地图的坐标系

EPSG:4326地理坐标系 和 EPSG:3857Web 墨卡托投影 EPSG:4326 定义&#xff1a;EPSG:4326 是基于 WGS84 椭球的地理坐标系&#xff0c;使用经度&#xff08;Longitude&#xff09;和纬度&#xff08;Latitude&#xff09;表示地球上的位置。特点&#xff1a; 经度范围为 -180 …...

环境会影响你的决策:K近邻算法(KNN)

环境会影响你的决策&#xff1a;K近邻算法&#xff08;KNN) 1. 核心思想与流程 KNN是一种基于局部相似性的分类算法&#xff0c;核心思想是“近朱者赤”&#xff1a;待测样本的类别由其最近的k个邻居的多数类别决定。 关键步骤&#xff1a; 定义空间与距离&#xff1a;通常采…...

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】 一、本次实践介绍1.1 实践环境简介1.3 本次实践完成目标 二、 相关服务介绍2.1 华为云ECS云服务器介绍2.2 Node.js介绍 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息 四、登录华为云4.1 登录华为云4.2 查…...

Vue 3 路由管理实战:构建多页面博客导航 - 掌握 Vue Router 实现 SPA 页面跳转

引言 欢迎再次回到 Vue 3 + 现代前端工程化 系列技术博客! 在昨天的第三篇博客中,我们深入探索了 Vue 3 响应式系统的进阶应用,通过构建简易购物车应用,熟练掌握了 watch 监听器和 computed 计算属性的运用。 今天,我们将开启 Vue 3 工程化实践的全新篇章,聚焦于构建单页…...

C语言整体梳理-基础篇-结构体

结构体详解 1.1结构体是什么&#xff1f; 结构体是一些值的集合&#xff0c;这些值成为成员变量&#xff0c;结构体的每个成员可以是不同类型的变量。 数组是相同类型的元素组成的集合&#xff0c;结构体可以是不同类型元素组成的集合。 1.2结构体的声明 1.2.1常规声明 s…...

MacBook 终端中使用 vim命令

在 MacBook 终端中使用 vim 编辑器时&#xff0c;以下是一些常用命令和操作指南&#xff1a; 1. 基本操作 启动 vim vim 文件名 # 打开或创建文件退出 vim 保存并退出&#xff1a; 按 Esc&#xff0c;然后输入 :wq&#xff0c;按 Enter。 不保存退出&#xff1a; 按 Esc&am…...

【 实战案例篇三】【某金融信息系统项目管理案例分析】

大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…...

springboot、deepseek4j、bge-m3和milvus

1、pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …...

会话与会话管理:Cookie与Session的深度解析

一、什么是会话&#xff1f; 二、Cookie&#xff1a;客户端存储技术 1. Cookie的工作原理 2、在后端设置cookie 3、在前端设置cookie 三、浏览器开启了cookie禁用怎么办&#xff1f; 一、什么是会话&#xff1f; 会话&#xff08;Session&#xff09;是指一个用户与服务器之间…...

etcd部署硬件资源推荐

etcd部署硬件资源推荐 原文&#xff1a;https://etcd.io/docs/v3.5/op-guide/hardware/ etcd 通常在开发或测试环境中运行良好&#xff0c;即使资源有限&#xff1b;在笔记本电脑或廉价云服务器上开发时&#xff0c;使用 etcd 也很常见。然而&#xff0c;在生产环境中运行 etcd…...

MAVlink链路环境搭建并解决“ModuleNotFoundError: No module named ‘xxx’”问题

MAVlink链路常用于云台相机与飞控以及地面站之间的数据传输&#xff0c;搭建MAVlink链路环境需要安装Python、Future、MAVLink、pymavlink四样工具用于生成mavlink代码。 Python 直接从官网下载默认安装即可https://www.python.org/downloads/ 在电脑命令行进行安装验证&#x…...

ROS2软件调用架构和机制解析:Publisher创建

术语 DDS (Data Distribution Service): 用于实时系统的数据分发服务标准&#xff0c;是ROS 2底层通信的基础RMW (ROS Middleware): ROS中间件接口&#xff0c;提供与具体DDS实现无关的抽象APIQoS (Quality of Service): 服务质量策略&#xff0c;控制通信的可靠性、历史记录、…...

Android -- 使用Sharepreference保存List储存失败,原因是包含Bitmap,drawable等类型数据

1.报错信息如下&#xff1a; class android.content.res.ColorStateList declares multiple JSON fields named mChangingConfigurations 2.Bean类属性如下&#xff1a; data class AppInfoBean( val appName: String?, val appIcon: Drawable, val appPackage: String?,…...

java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类

&#xff08;以下内容全部来自上述课程&#xff09; 1.抽象类 父类定义抽象方法后&#xff0c;子类的方法就必须重写&#xff0c;抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为&#xff08;方法&#xff09;抽取到父类之后。由于每一个子类执行的内容是不一样…...

Go - 泛型的使用

泛型的语法 泛型为Go语言添加了三个新的重要特性: 函数和类型的类型参数。将接口类型定义为类型集&#xff0c;包括没有方法的类型。类型推断&#xff0c;它允许在调用函数时在许多情况下省略类型参数。 类型参数 类型参数的使用 除了函数中支持类型参数列表外&#xff0c…...

蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)

[NOIP 2007 普及组] 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃&#xff0c;他背叛了暗夜精灵&#xff0c;率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀&#xff0c;被困在一个荒芜的大岛上。 为了杀死守望者&#xff0c;尤迪安开始对这个荒岛…...

内容中台的企业CMS架构是什么?

企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计&#xff0c;通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档&#xff0c;也能生成高并发的营销落地页&#xff0c;配合版本控制机制确保内…...

算法题(81):询问学号

审题&#xff1a; 需要我们根据给出的n值确定录入数据个数&#xff0c;然后根据给出的数据存储学号。再根据m值确定需要输出的学号个数&#xff0c;然后根据数组内容输出学号 思路: 我们可以利用数组进行数据顺序存储&#xff0c;以及随机读取完成本题 由于学号最大为1e9&#…...

React antd的datePicker自定义,封装成组件

一、antd的datePicker自定义 需求&#xff1a;用户需要为日期选择器的每个日期单元格添加一个Tooltip&#xff0c;当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码&#xff0c;确保Tooltip正确显示&#xff0c;并且数据…...

C++ AVL树详解(含模拟实现)

目录 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的旋转&#xff08;难点&#xff09; AVL树的验证 AVL树的删除(本文不做具体的模拟实现) AVL树的性能 AVL树的模拟实现 AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索…...

Spring Boot 3.x 系列【3】Spring Initializr快速创建Spring Boot项目

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot版本3.0.3 源码地址&#xff1a;https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言安装JDK 17创建Spring Boot 项目 方式1&#xff1a;网页在线生成方式2&#…...

Elasticsearch:过滤 HNSW 搜索,快速模式

作者&#xff1a;来自 Elastic Benjamin Trent 通过我们的 ACORN-1 算法实现&#xff0c;探索我们对 Apache Lucene 中的 HNSW 向量搜索所做的改进。 多年来&#xff0c;Apache Lucene 和 Elasticsearch 一直支持使用 kNN 查询的过滤搜索&#xff0c;允许用户检索符合指定元数据…...

TCP长连接与短连接

TCP长连接与短连接 TCP&#xff08;传输控制协议&#xff09;中的长连接和短连接是两种不同的连接管理方式&#xff0c;各有优缺点&#xff1a; 短连接 短连接是指客户端与服务器完成一次数据交换后就断开连接。下次需要通信时&#xff0c;再重新建立连接。 特点&#xff1…...

【AI测试学习】AnythingLLM+Ollama+DeepSeek部署私人知识库

1.搭建DeepSeek大语言模型 1.1Ollama大预言模型部署 Ollama简化了大型语言模型的运行,让每个人都能在本地轻松体验AI的强大,打开浏览器-下载Ollama-输入命令-搞定,这是本地部署大语言模型的全新方式。 这里我们借助Ollama大预言模型部署工具进行搭建 官网如下:Ollama …...

防流、节抖、重绘、回流原理,以及实现方法和区别

防流、节抖、重绘、回流原理&#xff0c;以及实现方法和区别&#xff0c;还有就是为什么会出现这种情况&#xff1f; 防抖&#xff08;Debounce&#xff09; 原理 防抖就像是你坐电梯&#xff0c;如果你一直不停地按开门按钮&#xff0c;电梯不会每次都开门&#xff0c;而是…...

通义灵码插件安装入门教学 - IDEA(安装篇)

在开发过程中&#xff0c;使用合适的工具和插件可以极大地提高我们的工作效率。今天&#xff0c;我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件&#xff0c;这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者&#xff0c;本文都将为你提供…...

ES、OAS、ERP、电子政务、企业信息化(高软35)

系列文章目录 ES、OAS、ERP、电子政务、企业信息化 文章目录 系列文章目录前言一、专家系统&#xff08;ES&#xff09;二、办公自动化系统&#xff08;OAS&#xff09;三、企业资源规划&#xff08;ERP&#xff09;四、典型信息系统架构模型1.政府信息化和电子政务2.企业信息…...

用大白话解释缓存Redis +MongoDB是什么有什么用怎么用

Redis和MongoDB是什么&#xff1f; Redis&#xff1a;像你家的“小冰箱”&#xff0c;专门存高频使用的食物&#xff08;数据&#xff09;。它是基于内存的键值数据库&#xff0c;读写速度极快&#xff08;每秒超10万次操作&#xff09;。比如你每次打开手机App&#xff0c;用…...

华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径

华为数通Datacom&#xff08;Data Communication&#xff09;课程是华为认证体系中的核心方向之一&#xff0c;聚焦企业网络通信与数据通信技术&#xff0c;适合从事网络规划、部署和运维的人员。 一、数通Datacom课程体系 华为数通Datacom认证分为 三个级别&#xff0c;逐级递…...

PyTorch 的 nn.NLLLoss:负对数似然损失全解析

PyTorch 的 nn.NLLLoss&#xff1a;负对数似然损失全解析 在 PyTorch 的损失函数家族中&#xff0c;nn.NLLLoss&#xff08;Negative Log Likelihood Loss&#xff0c;负对数似然损失&#xff09;是一个不太起眼但非常重要的成员。它经常跟 LogSoftmax 搭配出现&#xff0c;尤…...