如何在GeoPandas中获取Shapefile多边形的UTM投影带
提取Shapefile多边形的UTM投影带解决方案
我来帮你搞定这个UTM投影带提取的问题!要从Shapefile的投影信息里提取UTM带号,用正则表达式确实是个靠谱的办法,下面给你一步步拆解实现:
步骤1:准备依赖
首先确保你已经导入必要的库:
import re import geopandas as gpd
步骤2:读取Shapefile并提取投影带号
这里分两种场景处理,覆盖大部分使用情况:
场景1:全局统一CRS(推荐,大部分Shapefile都是这种情况)
如果你的Shapefile所有要素的投影是统一的,直接全局提取效率更高:
# 读取Shapefile(变量名改成all_gdf避免和内置函数冲突) all_gdf = gpd.GeoDataFrame.from_file("你的shapefile路径.shp") # 定义正则表达式模式,兼容EPSG代码和PROJ字符串格式 utm_pattern = re.compile(r'(?:EPSG:32[67]|UTM zone )(\d{1,2})', re.IGNORECASE) # 获取全局CRS字符串 crs_str = str(all_gdf.crs) # 匹配UTM带号 match = utm_pattern.search(crs_str) if match: utm_zone = match.group(1) print(f"该Shapefile的UTM投影带是:{utm_zone}") else: print("未能识别出UTM投影带,请检查CRS是否为UTM类型")
场景2:遍历每个要素提取(适用于CRS不统一的特殊场景)
如果你的Shapefile存在不同CRS的要素(比较少见),可以循环逐个提取:
all_gdf = gpd.GeoDataFrame.from_file("你的shapefile路径.shp") utm_pattern = re.compile(r'(?:EPSG:32[67]|UTM zone )(\d{1,2})', re.IGNORECASE) for idx, current in all_gdf.iterrows(): # 获取当前要素的CRS字符串 crs_str = str(current.geometry.crs) match = utm_pattern.search(crs_str) if match: utm_zone = match.group(1) print(f"第{idx}个要素的UTM投影带是:{utm_zone}") else: print(f"第{idx}个要素无法识别UTM投影带")
正则表达式说明
我用的这个正则表达式可以覆盖常见的UTM投影格式:
(?:EPSG:32[67]|UTM zone ):匹配两种前缀——EPSG:326开头是北半球UTM,EPSG:327开头是南半球UTM;或者直接匹配UTM zone字符串(忽略大小写)(\d{1,2}):捕获1-2位的数字,也就是我们要的UTM带号re.IGNORECASE:忽略大小写,避免因为投影字符串的大小写差异导致匹配失败
内容的提问来源于stack exchange,提问作者Mauro Assis
相关产品推荐
相关产品推荐

