【Python&GIS】基于Python面矢量转换线矢量

发布时间 2023-11-23 12:16:54作者: RS迷途小书童

        今天有些不一样,发这篇文章并不是项目需要。单纯的想到有这个功能没使用Python实现,所以就去研究了一下,第一时间就和大家分享。如何使用Python的osgeo库实现面矢量数据与线矢量数据的互相转换。

一、导入所需库

import os
from osgeo import ogr

二、面转线

        代码中注释都给了,就不讲解了。入参就是输入面矢量的路径,输出线矢量的路径。有一个小问题就是这段代码只适用于多个单面,即一个面为一个要素的情况。如果多个面合并成一个面的也能转换,不过要素会缺失!

# -*- coding: utf-8 -*-
"""
@Time : 2023/11/21 11:02
@Auth : RS迷途小书童
@File :Vector Face To Line.py
@IDE :PyCharm
@Purpose:面矢量、线矢量相互转换
"""


def face_to_line(int_path, out_path):
    """
    :param int_path: 输入面矢量路径
    :param out_path: 输出线矢量路径
    :return: None
    """
    driver = ogr.GetDriverByName('ESRI Shapefile')
    ds = ogr.Open(int_path, 0)
    layer = ds.GetLayer()
    # 打开面矢量数据,并获取其图层
    src_proj = layer.GetSpatialRef()
    # 获取其源坐标信息
    if os.path.exists(out_path):
        driver.DeleteDataSource(out_path)
        # 如果目标文件已存在,则删除它
    ds_result = driver.CreateDataSource(out_path)
    layer_result = ds_result.CreateLayer(out_path, srs=src_proj, geom_type=ogr.wkbLineString)
    defn_result = layer_result.GetLayerDefn()
    # 创建目标资源、目标图层、目标要素
    for feature in layer:
        # 遍历面矢量中的所有要素
        geom = feature.GetGeometryRef()
        # 获取该要素的地理空间范围
        line_geom = geom.GetGeometryRef(0)
        # 获取线格式地理空间范围
        feature_result = ogr.Feature(defn_result)
        # 创建一个新的要素。要素是Shapefile中的数据实体,它们有几何形状和属性。
        feature_result.SetGeometry(line_geom)
        # 将图形赋值到要素上
        layer_result.CreateFeature(feature_result)
        # 创建该要素,写入
    layer_result = None


if __name__ == '__main__':
    os.chdir(r'G:\彭俊喜')
    face_to_line('1.shp', '样本_line.shp')
    # 参数:输入面矢量,输出线矢量

三、线转面

        这里的逻辑就和面转线不一样,不能够直接读取要素范围然后写入,只能通过线的范围创建wkt格式的面数据再写入。同样入参为线矢量路径和面矢量路径。

# -*- coding: utf-8 -*-
"""
@Time : 2023/11/21 11:02
@Auth : RS迷途小书童
@File :Vector Face To Line.py
@IDE :PyCharm
@Purpose:面矢量、线矢量相互转换
"""


def line_to_face(int_path, out_path):
    """
    :param int_path: 输入线矢量路径
    :param out_path: 输出面矢量路径
    :return: None
    """
    driver = ogr.GetDriverByName('ESRI Shapefile')
    ds = ogr.Open(int_path, 0)
    layer = ds.GetLayer()
    # 打开面矢量数据,并获取其图层
    src_proj = layer.GetSpatialRef()
    # 获取其源坐标信息
    if os.path.exists(out_path):
        driver.DeleteDataSource(out_path)
        # 如果目标文件已存在,则删除它
    ds_result = driver.CreateDataSource(out_path)
    layer_result = ds_result.CreateLayer(out_path, srs=src_proj, geom_type=ogr.wkbPolygon)
    # 创建一个数据资源,格式为面矢量,坐标系为src_proj
    defn_result = layer_result.GetLayerDefn()
    # 创建目标资源、目标图层、目标要素
    for feature in layer:
        # 遍历面矢量中的所有要素
        geom = feature.GetGeometryRef()
        # 获取该要素的地理空间范围
        feature_result = ogr.Feature(defn_result)
        # 创建一个新的要素。要素是Shapefile中的数据实体,它们有几何形状和属性。
        polygon = ogr.CreateGeometryFromWkt("Polygon(%s)" % str(geom)[str(geom).find("("):])
        # print("Polygon"+str(geom)[11:])
        feature_result.SetGeometry(polygon)
        # 将图形赋值到要素上
        layer_result.CreateFeature(feature_result)
        # 创建该要素,写入
    layer_result = None


if __name__ == '__main__':
    os.chdir(r'G:\彭俊喜')
    line_to_face('样本_line.shp', '123312.shp')
    # 参数:输入线矢量,输出面矢量

四、总结

        网上貌似还没有线转面的教程,我应该算是首发了。当然我说的是使用osgeo库,arcpy除外,毕竟这玩意相当于ARCGIS一样太变态了。

        本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。