GIS-坐标系-EPSG(二次整理)

中国地图-坐标系

EPSG的英文全称是European Petroleum Survey Group,中文名称为欧洲石油调查组织。

比如对于中国来讲,以地球的几何球心为中心的地图就是EPSG:4479,以地球的椭球焦点为中心就是EPSG:4480,此外还有EPSG:4490,因为选择不同的座标系对于油气勘探的成本至关重要,所以有不同的座标系。

 

 

EPSG:4326 (WGS84)

在世界地图方面,EPSG:4326是比较著名的一个,加密前的高德、百度用的也是WGS84,因为由美国主导的GPS系统就是在用它,它还有一个名气更大的别名叫作WGS84,WGS(World Geodetic System)是世界大地测量系统的意思,由于是1984年定义的,所以叫WGS84,之前的版本还有WGS72、WGS66、WGS60。

 

EPSG:3857(墨卡托投影)

另一个比较知名的编码是EPSG:3857,这也是一张世界地图,目前主要是各大互联网地图公司以它为基准,例如Google地图,Microsoft地图都在用它。

 

EPSG:4490(CGCS2000)

我国的GPS系统-北斗导航系统以及国家发行的“天地图”,用的是这一套地理坐标系统,中文名“中国国家2000地理坐标系统”,英文全称翻译名“中国大地坐标系2000”。

英文名 China Geodetic Coordinate System 2000。

 

北京54、西安80

是我国已经逐渐停止使用的两个地理坐标系统。

北京54坐标系统WKID是4214,西安80坐标系统的WKID是4610。

 

GCJ-02坐标系

GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统。

它是一种对经纬度数据的加密算法,即加入随机的偏差。

国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。

 

具体EPSG编码查询网址

http://epsg.io/3857

可参考文档

https://www.cnblogs.com/E7868A/p/11460865.html

https://www.cnblogs.com/onsummer/p/7451128.html

 

 

<think>我们参考引用资料,特别是引用[2]和引用[3]中关于坐标系转换和投影转换的内容。用户问题:如何在GIS二次开发中将投影坐标系转换为经纬度?要求提供方法和示例。根据引用[2]:-经纬度(地理坐标)与投影坐标(如Web墨卡托)之间的转换是常见的需求。-转换时需要注意坐标系的匹配(如WGS84、GCJ-02等)。-示例中提到了将WGS84经纬度转换为GCJ-02经纬度,然后再转换为Web墨卡托投影坐标的过程。反过来,投影坐标也可以转回地理坐标(经纬度)。引用[3]提到了GDAL库中的OGRCoordinateTransformation类,该类用于坐标转换(包括地理坐标与投影坐标之间的转换)。因此,我们可以使用GDAL库进行转换。GDAL是一个开源的地理空间数据处理库,支持多种坐标系转换。步骤:1.初始化源坐标系和目标坐标系(这里源坐标系是投影坐标系,目标坐标系是地理坐标系)。2.创建坐标转换对象。3.使用该对象进行坐标转换。注意:在转换时,需要知道投影坐标系的具体参数(如投影方式、基准面等)以及目标地理坐标系的参数(如WGS84)。示例:将Web墨卡托投影坐标(x,y)转换为WGS84经纬度。假设投影坐标系EPSG:3857(Web墨卡托投影),地理坐标系EPSG:4326(WGS84经纬度)。代码示例(使用GDAL的Python绑定):"""注意:在运行前需要安装GDAL(例如:pipinstallGDAL)步骤:1.导入gdal模块2.定义源坐标系(投影坐标系EPSG:3857)和目标坐标系(地理坐标系EPSG:4326)3.创建坐标转换对象4.进行转换注意:Transform函数在转换点时,参数顺序为[经度,纬度](对于地理坐标)和[x,y](对于投影坐标)。但在使用OGRCoordinateTransformation时,输入输出的顺序是(x,y)或者(longitude,latitude),具体顺序由坐标系定义决定。在EPSG:4326中,坐标顺序是(纬度,经度)还是(经度,纬度)?实际上,EPSG:4326标准是纬度在前,经度在后,但很多软件(如GDAL的某些版本)可能采用经度在前,纬度在后。GDAL从2.3版本开始,默认使用经度在前(即x为经度,y为纬度),但为了安全,我们可以通过设置轴映射策略来明确。然而,根据引用[3]中关于OGRCoordinateTransformation的Transform函数的参数顺序,我们需要按照目标坐标系的坐标轴顺序来输入输出。在EPSG:4326中,传统上我们使用(纬度,经度),但OGC标准规定为(经度,纬度)。GDAL默认遵循OGC标准(经度,纬度)。因此,我们转换后的坐标是(经度,纬度)。示例代码:"""fromosgeoimportosrdefproj_to_latlon(x,y,source_epsg=3857,target_epsg=4326):#创建源坐标系(投影坐标)source=osr.SpatialReference()source.ImportFromEPSG(source_epsg)#创建目标坐标系(地理坐标)target=osr.SpatialReference()target.ImportFromEPSG(target_epsg)#创建坐标转换对象transform=osr.CoordinateTransformation(source,target)#转换坐标,注意输入是(x,y),输出是(经度,纬度,高度),这里高度通常为0#注意:Transform函数要求输入点是一个元组或列表,可以转换多个点point=transform.TransformPoint(x,y)#返回经度和纬度(忽略高度)returnpoint[0],point[1]#示例:将Web墨卡托坐标(12999263.814430239,4801734.910328635)转换为经纬度x=12999263.814430239y=4801734.910328635lon,lat=proj_to_latlon(x,y)print(f"经度:{lon},纬度:{lat}")"""注意:上述代码中,TransformPoint返回一个元组:(longitude,latitude,altitude)。因为我们输入的是二维坐标,所以高度为0。引用[2]中提到的例子:信息大厦的WGS84经纬度(39.5555556,116.768333)投影到Web墨卡托后是(12999263.814430239,4801734.910328635)。我们可以用这个点反向转换回经纬度,应该接近原值。另外,引用[2]也提到,如果原始投影坐标是基于其他坐标系(如GCJ-02或BD-09)的投影,那么转换回的地理坐标也是对应坐标系的经纬度。如果需要WGS84,则还需要进行坐标系转换(例如使用其他库进行GCJ02转WGS84)。因此,如果投影坐标是从GCJ-02地理坐标投影得到的,那么用上述方法转换得到的是GCJ-02经纬度,而不是WGS84。如果需要WGS84,则还需要一步转换。总结步骤:1.确定投影坐标的原始坐标系(是WGS84、GCJ-02还是BD-09?)。2.使用投影反算得到对应坐标系的地理坐标(经纬度)。3.如果需要目标坐标系的地理坐标(如WGS84),再进行坐标系间的转换(例如GCJ02转WGS84)。但上述代码只处理了投影坐标到地理坐标的转换(不考虑地理坐标系之间的转换,如GCJ02转WGS84)。如果需要转换地理坐标系,则需要额外的步骤。因此,如果用户明确知道投影坐标的原始地理坐标系是WGS84(即EPSG:3857通常对应WGS84),那么转换得到的就是WGS84经纬度。如果投影坐标的原始地理坐标系是GCJ-02,那么我们需要先得到GCJ-02的经纬度,然后再用其他方法转换为WGS84。关于坐标系间转换(如GCJ02转WGS84),可以使用第三方库,例如coordTransform_py(https://github.com/wandergis/coordTransform_py)等。因此,在二次开发中,如果遇到非标准坐标系(如GCJ-02、BD-09)的投影,需要分两步:1.投影反算:将投影坐标转换为对应坐标系(如GCJ-02)的经纬度。2.坐标系转换:将GCJ-02经纬度转换为WGS84经纬度(或其他目标坐标系)。示例(假设投影坐标是GCJ-02的Web墨卡托投影,需要转WGS84经纬度):第一步:用上面的方法将投影坐标转换为GCJ-02经纬度(注意:这里源投影坐标系还是EPSG:3857,因为Web墨卡托投影的数学公式相同,但基准面不同?实际上,EPSG:3857定义的是基于WGS84的,所以如果投影坐标是GCJ-02的,那么它实际上不是标准的EPSG:3857,而是使用同样的投影方法但基准面不同。所以严格来说,我们需要创建自定义的源坐标系,但通常做法是先用相同的投影反算得到经纬度,然后再转换坐标系,因为投影反算的数学公式相同)。因此,我们可以先按EPSG:3857投影反算得到经纬度,然后认为这个经纬度是GCJ-02坐标系的(因为原始投影数据是GCJ-02地理坐标投影得到的)。然后进行第二步:将GCJ-02经纬度转换为WGS84经纬度。第二步:使用GCJ02转WGS84的算法。注意:由于GCJ-02是加密坐标系,转换需要特定算法。我们提供一个综合示例(包括GCJ02转WGS84):首先,安装coordTransform_py库(注意:这个库不是官方标准库,但常用):pipinstallcoordTransform_py然后,我们可以这样写:步骤:1.将投影坐标(假设是GCJ-02的Web墨卡托投影)按EPSG:3857反算得到经纬度(这时得到的是GCJ-02经纬度)。2.使用coordTransform_py中的gcj02_to_wgs84函数将GCJ-02经纬度转换为WGS84经纬度。代码示例:注意:由于coordTransform_py库可能不存在,我们也可以自己实现转换函数(算法公开,但精度可能略有差异)。这里我们使用一个公开的算法。由于coordTransform_py库的安装可能不便,我们这里使用一个简单的转换函数(示例用,精度可能有限):我们可以参考公开的转换算法,例如:以下是一个常用的GCJ02转WGS84的近似算法(来自网络):"""importmathdeftransform_lat(x,y):ret=-100.0+2.0*x+3.0*y+0.2*y*y+0.1*x*y+0.2*math.sqrt(abs(x))ret+=(20.0*math.sin(6.0*x*math.pi)+20.0*math.sin(2.0*x*math.pi))*2.0/3.0ret+=(20.0*math.sin(y*math.pi)+40.0*math.sin(y/3.0*math.pi))*2.0/3.0ret+=(160.0*math.sin(y/12.0*math.pi)+320*math.sin(y*math.pi/30.0))*2.0/3.0returnretdeftransform_lon(x,y):ret=300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1*math.sqrt(abs(x))ret+=(20.0*math.sin(6.0*x*math.pi)+20.0*math.sin(2.0*x*math.pi))*2.0/3.0ret+=(20.0*math.sin(x*math.pi)+40.0*math.sin(x/3.0*math.pi))*2.0/3.0ret+=(150.0*math.sin(x/12.0*math.pi)+300.0*math.sin(x/30.0*math.pi))*2.0/3.0returnretdefdelta(lat,lon):a=6378245.0#长半轴ee=0.00669342162296594323#扁率dLat=transform_lat(lon-105.0,lat-35.0)dLon=transform_lon(lon-105.0,lat-35.0)radLat=lat/180.0*math.pimagic=math.sin(radLat)magic=1-ee*magic*magicsqrtMagic=math.sqrt(magic)dLat=(dLat*180.0)/((a*(1-ee))/(magic*sqrtMagic)*math.pi)dLon=(dLon*180.0)/(a/sqrtMagic*math.cos(radLat)*math.pi)returndLat,dLondefgcj02_to_wgs84(lng,lat):dlat,dlng=delta(lat,lng)returnlng-dlng,lat-dlat#然后,我们组合两个步骤:defgcj02_proj_to_wgs84_latlon(x,y):#第一步:将投影坐标(假设是EPSG:3857投影)转换为GCJ-02经纬度lon_gcj02,lat_gcj02=proj_to_latlon(x,y)#注意:proj_to_latlon函数返回的是(lon,lat)#第二步:将GCJ-02经纬度转换为WGS84经纬度lon_wgs84,lat_wgs84=gcj02_to_wgs84(lon_gcj02,lat_gcj02)returnlon_wgs84,lat_wgs84#示例:将GCJ-02投影坐标(12999263.814430239,4801734.910328635)转换为WGS84经纬度x=12999263.814430239y=4801734.910328635lon_wgs84,lat_wgs84=gcj02_proj_to_wgs84_latlon(x,y)print(f"WGS84经度:{lon_wgs84},WGS84纬度:{lat_wgs84}")"""注意:上述gcj02_to_wgs84函数是一个近似算法,实际应用中可能需要更高精度的算法。总结:在GIS二次开发中,将投影坐标系转换为经纬度的基本步骤是:1.使用GDAL的坐标转换功能(OGRCoordinateTransformation)进行投影反算,得到地理坐标(经纬度)。2.注意投影坐标系和地理坐标系EPSG代码(或自定义坐标系定义)。3.如果得到的地理坐标不是目标坐标系(如WGS84),则需要进行额外的坐标系转换(如GCJ-02转WGS84)。以上代码示例展示了如何用Python和GDAL实现转换。其他语言(如C++、C#)的GDAL绑定也有类似接口。另外,引用[2]中特别强调:经纬度转web墨卡托投影时,要想叠加上去,必须保证经纬度的坐标系和地图底图的坐标系一致。因此,在转换时务必注意坐标系的一致性。如果用户使用的是其他开发环境(如JavaScript),则可以使用proj4js等库进行转换。希望以上回答对用户有帮助。</think>### GIS二次开发中投影坐标系转换为经纬度的方法与示例 在GIS二次开发中,投影坐标系(如Web墨卡托投影)转换为地理坐标系(经纬度)的核心步骤如下: #### 一、转换原理 1. **坐标系关系** 投影坐标(如$x,y$)通过数学反演可转换为地理坐标($lng,lat$),转换公式为: $$ \begin{cases} lng = \frac{x}{R \cdot k} \cdot \frac{180}{\pi} \\ lat = \frac{2}{\pi} \cdot \arctan(e^{y/R}) - 90 \end{cases} $$ 其中 $R$ 为地球半径,$k$ 为比例因子[^2]。 2. **坐标系一致性** - 投影坐标必须与目标地图的坐标系匹配(如GCJ-02或WGS84) -坐标系不一致(如将WGS84投影坐标叠加到GCJ-02地图),需先转换坐标系再投影[^2]。 #### 二、转换方法(以GDAL库为例) ##### 方法1:直接使用GDAL的坐标转换类 ```python from osgeo import osr def proj_to_latlon(x, y, source_epsg=3857, target_epsg=4326): """将投影坐标转为经纬度 Args: x, y: 投影坐标值 source_epsg: 投影坐标系EPSG(默认Web墨卡托3857) target_epsg: 目标坐标系EPSG(默认WGS84经纬度4326) Returns: (经度, 纬度) """ # 创建坐标系对象 source = osr.SpatialReference() source.ImportFromEPSG(source_epsg) target = osr.SpatialReference() target.ImportFromEPSG(target_epsg) # 创建转换对象 transform = osr.CoordinateTransformation(source, target) # 执行转换(注意参数顺序:x, y, [z]) lon, lat, _ = transform.TransformPoint(x, y) return round(lon, 6), round(lat, 6) # 保留6位小数 # 示例:将Web墨卡托坐标转为WGS84经纬度 x = 12999263.8144 # 投影坐标X y = 4801734.9103 # 投影坐标Y lon, lat = proj_to_latlon(x, y) print(f"经度: {lon}°, 纬度: {lat}°") ``` ##### 方法2:手动实现反投影公式(Web墨卡托→WGS84) ```python import math def webmercator_to_wgs84(x, y): """Web墨卡托投影坐标转WGS84经纬度 Args: x, y: 投影坐标(单位:米) Returns: (lng, lat) 经度纬度(单位:度) """ lng = (x / 20037508.34) * 180 lat = (y / 20037508.34) * 180 lat = 180/math.pi * (2 * math.atan(math.exp(lat * math.pi/180)) - math.pi/2) return round(lng, 6), round(lat, 6) # 使用示例 x = 12998591.3685 # 北京某点投影X y = 4801565.4702 # 北京某点投影Y lng, lat = webmercator_to_wgs84(x, y) print(f"WGS84坐标: lng={lng}, lat={lat}") ``` #### 三、关键注意事项 1. **参数顺序** GDAL的`TransformPoint()`方法参数顺序为 **$x$ (经度方向), $y$ (纬度方向)**[^3],与标准GIS坐标顺序一致。 2. **精度范围** - 经度范围:$[-180, 180]$ - 纬度范围:$[-90, 90]$ - Web墨卡托坐标值通常超过$10^7$量级[^2] 3. **坐标系匹配** ```mermaid graph LR A[投影坐标] -->|需匹配| B[地图底图坐标系] B --> C{坐标系类型} C -->|GCJ-02| D[高德/腾讯地图] C -->|BD-09| E[百度地图] C -->|WGS84| F[天地图/GPS] ``` 4. **跨坐标系转换** 若需将GCJ-02投影坐标转为WGS84经纬度: ```python # 伪代码流程 gcj02_proj = (x_gcj, y_gcj) # 原始投影坐标 gcj02_lnglat = proj_to_latlon(gcj02_proj) # 转GCJ-02经纬度 wgs84_lnglat = gcj02_to_wgs84(gcj02_lnglat) # 坐标系转换 ``` #### 四、实际应用场景 1. **GPS设备集成** 将车载GPS获取的WGS84投影坐标转换为GCJ-02经纬度,叠加到高德地图。 2. **跨平台数据迁移** 将百度地图的BD-09投影坐标转为标准WGS84经纬度存储。 3. **空间分析** 在Web墨卡托投影中进行路径计算后,转经纬度进行地理标注。 > **提示**:当转换结果偏差较大时,检查: > 1. EPSG代码是否匹配(如3857 vs 4490) > 2. 坐标系转换是否遗漏(尤其涉及国测局加密) > 3. 坐标值单位是否为米(投影坐标系单位)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值