????????今天有些不一樣,發這篇文章并不是項目需要。單純的想到有這個功能沒使用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 = Noneif __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_projdefn_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 = Noneif __name__ == '__main__':os.chdir(r'G:\彭俊喜')line_to_face('樣本_line.shp', '123312.shp')# 參數:輸入線矢量,輸出面矢量
四、總結
? ? ? ? 網上貌似還沒有線轉面的教程,我應該算是首發了。當然我說的是使用osgeo庫,arcpy除外,畢竟這玩意相當于ARCGIS一樣太變態了。
????????本文章主要是分享個人在學習Python過程中寫過的一些代碼。有些部分借鑒了前人以及官網的教程,如有侵權請聯系作者刪除,大家有問題可以隨時留言交流,博主會及時回復。