今天有些不一样,发这篇文章并不是项目需要。单纯的想到有这个功能没使用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')
# 参数:输入线矢量,输出面矢量
四、总结
标签:layer,GIS,Python,矢量,geom,result,path,out From: https://www.cnblogs.com/RSran/p/17851290.html网上貌似还没有线转面的教程,我应该算是首发了。当然我说的是使用osgeo库,arcpy除外,毕竟这玩意相当于ARCGIS一样太变态了。
本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。