如何用Python提取长字符串中[]内的键对应值?GeoDjango提取EPSG值需求
提取PROJCS字符串中EPSG值的Python方案
方案1:正则表达式快速提取
直接用正则匹配AUTHORITY["EPSG","XXX"]格式的内容,提取其中的数字:
import re crs_str = 'PROJCS["WGS_1984_UTM_Zone_42N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",69],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' # 提取所有EPSG编号 all_epsg = re.findall(r'AUTHORITY\["EPSG","(\d+)"\]', crs_str) print(all_epsg) # 输出 ['7030', '6326'] # 提取大地基准对应的EPSG(如WGS84的6326) geog_epsg = re.search(r'GEOGCS\[[^\]]+AUTHORITY\["EPSG","(\d+)"\]', crs_str).group(1) print(geog_epsg) # 输出 6326
方案2:GeoDjango内置工具(更可靠)
既然使用GeoDjango,推荐用官方的SpatialReference类解析CRS字符串,无需手动处理格式:
from django.contrib.gis.gdal import SpatialReference crs_str = 'PROJCS["WGS_1984_UTM_Zone_42N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",69],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' srs = SpatialReference(crs_str) # 获取当前投影的EPSG编号(UTM 42N对应32642) print(srs.srid) # 输出 32642 # 获取大地基准的EPSG编号(WGS84对应6326) datum_epsg = srs.get_attr_value('AUTHORITY', 1) print(datum_epsg) # 输出 6326 # 获取椭球体的EPSG编号(WGS84椭球对应7030) spheroid_epsg = srs.GetAttrValue('SPHEROID', 2) print(spheroid_epsg) # 输出 7030
注意事项
- 正则方案适合简单场景,但如果CRS字符串格式出现变体(如空格、引号差异)可能失效;
- GeoDjango内置方案能准确解析CRS的所有元数据,是生产环境的优先选择。
内容的提问来源于stack exchange,提问作者Alae Tube
相关产品推荐
相关产品推荐

