You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:33:29