# wgs84 转 UTM
# -*- coding: utf-8 -*-
import arcpy
import os
def calculate_utm_zone(shp_path):
"""
计算SHP数据的UTM 6度带号(北半球,EPSG:326XX)
:param shp_path: SHP文件路径
:return: UTM带号(如"32N"),目标坐标系(arcpy.SpatialReference)
"""
# 获取数据范围的中心经度
desc = arcpy.Describe(shp_path)
extent = desc.extent
center_lon = (extent.XMin + extent.XMax) / 2.0
# 计算UTM带号(6度分带)
utm_zone_number = int((center_lon + 180) // 6) + 1 # 公式: 带号 = floor((经度 + 180)/6) +1
utm_zone = f"{utm_zone_number}N" # 北半球
# 构建目标坐标系(WGS84 UTM Zone XXN,EPSG:326XX)
target_sr = arcpy.SpatialReference(32600 + utm_zone_number) # EPSG代码=32600+带号
return utm_zone, target_sr
def batch_project_to_utm(input_folder, output_folder):
"""
批量投影转换:WGS84 → UTM
:param input_folder: 输入文件夹(存放WGS84的SHP文件)
:param output_folder: 输出文件夹
"""
# 创建输出文件夹
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历输入文件夹中的所有SHP文件
arcpy.env.workspace = input_folder
shp_files = arcpy.ListFeatureClasses("*.shp")
for shp in shp_files:
try:
input_shp = os.path.join(input_folder, shp)
# 计算UTM带号和目标坐标系
utm_zone, target_sr = calculate_utm_zone(input_shp)
# 构建输出路径(示例:input.shp → input_UTM32N.shp)
output_name = f"{os.path.splitext(shp)[0]}_UTM{utm_zone}.shp"
output_shp = os.path.join(output_folder, output_name)
# 执行投影转换
arcpy.Project_management(
in_dataset=input_shp,
out_dataset=output_shp,
out_coor_system=target_sr,
transform_method="" # WGS84基准面无需变换
)
print(f"转换成功: {shp} → UTM{utm_zone}")
except arcpy.ExecuteError as e:
print(f"ArcGIS工具错误: {shp} | {arcpy.GetMessages(2)}")
except Exception as e:
print(f"其他错误: {shp} | {str(e)}")
# 使用示例
if __name__ == "__main__":
input_folder = r"F:\****\bianjie" # 替换为实际路径
output_folder = r"F:\****\bianjie" # 替换为实际路径
batch_project_to_utm(input_folder, output_folder)
10-28
4556
4556

被折叠的 条评论
为什么被折叠?



