转换shapefile投影:将Shapefile文件中的字段中的投影坐标系转换为经纬度坐标系

         这次的需求是将投影为Gauss_Kruger,投影坐标系为CGCS2000_3_Degree_GK_CM_108E的shapefile(shp)文件中某些字段的值进行投影坐标系的转换,将投影坐标转换为经纬度坐标(WGS84)

1.算法思路

        (1)使用相应的地理信息系统(GIS)库读取Shapefile文件的几何信息和属性表。

        (2)利用Pyproj库进行投影坐标系的转换,将投影坐标转换为经纬度坐标。

        (3)更新Shapefile文件中对应字段的值为转换后的经纬度坐标。

        (4)保存更新后的Shapefile文件

2.算法步骤

        (1)读取Shapefile文件并获取投影坐标系信息。

        (2)定义投影坐标系和经纬度坐标系之间的转换函数

        (3)对Shapefile中的每个要素进行循环处理:

                读取该要素的投影坐标

                转换为经纬度坐标

                更新要素的属性表中的经纬度字段值

        (4)保存更新后的Shapefile文件

3.Python代码实现

import shapefile
from pyproj import Proj, Transformer

# 读取Shapefile文件
shp_path = "shp/cut.shp"
sf = shapefile.Reader(shp_path)

# 读取投影信息
prj_file = open("shp/cut.prj", "r")
prj_content = prj_file.read()
prj_file.close()

# 构建投影对象
projection = Proj(prj_content)

# 定义投影坐标系和经纬度坐标系之间的转换函数
def project_to_latlon(x, y):
    transformer = Transformer.from_proj(projection, "epsg:4326")
    lon, lat = transformer.transform(x, y)
    return lon, lat

# 获取要素字段名
fields = [field[0] for field in sf.fields[1:]]  # 排除第一个字段 FID

# 确定要素字段中经纬度字段的索引(我需要转换的字段名为center_x和center_y)
center_x_index = fields.index("center_x")
center_y_index = fields.index("center_y")

# 更新Shapefile中的字段值为经纬度坐标
records = sf.records()
for record in records:
    center_x = record[center_x_index]
    center_y = record[center_y_index]
    lon, lat = project_to_latlon(center_x, center_y)
    # 更新经纬度字段值
    record[center_x_index] = lon
    record[center_y_index] = lat

# 保存更新后的Shapefile文件
with shapefile.Writer("transform_cut.shp") as w:
    # 添加字段
    w.fields = sf.fields[1:]
    # 添加几何信息和更新后的记录
    for i, shape in enumerate(sf.shapes()):
        w.record(*records[i])
        w.shape(shape)

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用`osgeo.osr`模块从矢量图层获取原始坐标系,并将其转换投影坐标系,可以按照以下步骤操作: ```python from osgeo import ogr, osr # 打开矢量图层 shapefile_path = 'your_shapefile.shp' driver = ogr.GetDriverByName('ESRI Shapefile') dataSource = driver.Open(shapefile_path, 0) layer = dataSource.GetLayer() # 获取原始坐标系 sourceSpatialRef = layer.GetSpatialRef() # 定义目标坐标系(例如 EPSG:3857) targetSpatialRef = osr.SpatialReference() targetSpatialRef.ImportFromEPSG(3857) # 创建坐标转换对象 transform = osr.CoordinateTransformation(sourceSpatialRef, targetSpatialRef) # 创建投影图层 projShapefile = 'projected_shapefile.shp' projDriver = ogr.GetDriverByName('ESRI Shapefile') projDataSource = projDriver.CreateDataSource(projShapefile) projLayer = projDataSource.CreateLayer('projected_layer', targetSpatialRef, geom_type=ogr.wkbPolygon) # 遍历原始图层的要素,进行投影转换并添加到投影图层 feature = layer.GetNextFeature() while feature: geometry = feature.GetGeometryRef() geometry.Transform(transform) projFeature = ogr.Feature(projLayer.GetLayerDefn()) projFeature.SetGeometry(geometry) projLayer.CreateFeature(projFeature) feature = layer.GetNextFeature() # 释放资源 dataSource.Destroy() projDataSource.Destroy() ``` 在这个示例,我们首先使用`ogr`模块打开矢量图层文件,并获取图层对象。然后,我们使用`GetSpatialRef`方法获取原始坐标系。 接下来,我们定义了目标坐标系(例如EPSG:3857),并使用`osr.SpatialReference`创建了一个目标坐标系对象。 然后,我们使用`osr.CoordinateTransformation`创建了一个坐标转换对象,用于将原始坐标系转换为目标坐标系。 接着,我们创建了一个新的投影图层,并使用`CreateFeature`方法遍历原始图层的要素。在循环,我们获取要素的几何对象,并使用转换对象对其进行投影转换。然后,我们创建了一个新的投影要素,并将投影后的几何对象添加到投影图层。 最后,我们释放了资源并关闭文件。 请确保你已经安装了GDAL库,并将代码的`your_shapefile.shp`替换为你自己的Shapefile文件路径,并将`projected_shapefile.shp`替换为你希望保存投影结果的文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值