cgcs2000坐标系的epsg计算

cgcs2000坐标系的epsg计算
ytkz之前写了一篇关于wgs84影像转为cgcs2000的影像的文章:《wgs84影像直接转换为cgcs2000影像》
在里面我写道:诸如遥感数据处理的东西,其实是没有技术含量的,本质上都是调用gdal的东西,你把gdal的各个接口弄明白了就掌握这个数据处理的技能,唯手熟尔。真正有难度的是算法、加速处理速度。我其实很久不做数据数据处理的东西了,因为我有足够的代码积累,我建立了一个代码库,需要哪个模块,我直接搜索。
cscs2000坐标系的EPSG代码计算
cscs2000坐标系其实和wgs84一样,分为两种:地理坐标系和投影坐标系。
用大白话来区分地理和投影,是看它们的单位。
单位若是度分秒,就是地理坐标系;单位是米,就是投影坐标系。
除此之外,我们还要获取坐标系的EPSG号码。
这个参数,我们需要填写到gdal的Warp进行重投影。
wgs84地理坐标系的EPSG号码4326,cgcs2000地理坐标系的EPSG号码4490。
如果你是想转换为cgcs2000投影坐标系,还得继续计算。
投影坐标系分为3度带,和6度带。
以3度带为例,不同的带号的计算规则如下:
例如,经度为105°E,计算过程是 105 / 3 = 35,得到带号 35。如果有小数点,则进行四舍五入。
我们继续计算 EPSG = 4513 + (带号 - 25)
代码如下:
def get_cgcs2000_3degree_epsg(lon):
"""
根据经度计算 CGCS2000 3度带投影的 EPSG 代码。
计算公式: Zone = int(round(lon / 3.0))
EPSG = 4513 + (Zone - 25)
"""
zone = int(round(lon / 3.0))
epsg = 4513 + (zone - 25)
return epsg, zone
6 度带适用于对精度要求相对较低,或者需要覆盖更大范围的项目。计算6度带的epsg号码的代码如下:
def get_cgcs2000_6degree_epsg(lon):
if lon < 75 or lon > 135:
# 超出中国主要范围,需要谨慎处理或使用地理坐标系
pass
zone_6 = int((lon + 1.5) / 6) + 1 # 带号
epsg = 4474 + zone_6
zone_6_simple = int((lon + 6) / 6) + 13
epsg_simple = 4490 + zone_6_simple
return epsg_simple, zone_6_simple
GDAL 的核心:重投影操作 (gdal.Warp)、
一旦我们确定了目标 EPSG 码(无论是地理坐标系 4490,还是投影坐标系如 4528),重投影的操作在 GDAL 中变得异常简单。
核心函数是 gdal.Warp(),它负责将一个数据集(数据源)重投影到另一个坐标系。
from osgeo import gdal
def warp_wgs84_to_cgcs2000(input_file, output_file, target_epsg):
"""
使用 gdal.Warp 实现 WGS84 到 CGCS2000 的重投影。
:param input_file: WGS84 格式的输入影像路径 (默认 EPSG:4326)
:param output_file: CGCS2000 格式的输出影像路径
:param target_epsg: 目标 CGCS2000 的 EPSG 码 (如 4490, 4528 等)
"""
print(f"开始重投影:从 WGS84 (EPSG:4326) 到 CGCS2000 (EPSG:{target_epsg})")
try:
# 调用 gdal.Warp 函数
gdal.Warp(
destNameOrDestDS=output_file, # 输出文件路径
srcDSOrSrcDSTab=input_file, # 输入文件路径
srcSRS='EPSG:4326', # 明确指定源坐标系(WGS84)
dstSRS=f'EPSG:{target_epsg}', # 目标坐标系
resampleAlg=gdal.GRA_Bilinear, # 重采样方法(双线性插值,适用于影像)
creationOptions=['COMPRESS=LZW', 'BIGTIFF=IF_NEEDED'] # 输出文件参数
)
print(f"重投影成功!新影像已保存至: {output_file}")
except Exception as e:
print(f"GDAL 重投影失败: {e}")
# 1. 假设影像中心经度为 105.0
center_lon = 105.0
# 2. 计算 3 度带的 EPSG 码
target_epsg, zone = get_cgcs2000_3degree_epsg(center_lon)
# 3. 执行重投影
input_path = "path/to/your/wgs84_image.tif"
output_path = f"path/to/output/cgcs2000_{target_epsg}.tif"
# warp_wgs84_to_cgcs2000(input_path, output_path, target_epsg)
总结:技术含量在哪?
正如文章开头所言:诸如遥感数据处理的东西,其实是没有技术含量的,本质上都是调用 gdal 的东西,你把 gdal 的各个接口弄明白了就掌握这个数据处理的技能,唯手熟尔。
真正的技术含量体现在以下几个方面:
1.算法设计与优化
2.性能加速与资源管理
3.代码积累与模块化复用
4.实际应用中的问题诊断与创新
希望这篇文章能帮你快速上手 WGS84 到 CGCS2000 的转换,有问题欢迎讨论!




