您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么用Python實現csv文件(點表和線表)轉換為shapefile文件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用Python實現csv文件(點表和線表)轉換為shapefile文件”吧!
Python實現csv文件(點表和線表)轉換為shapefile文件
說明
點表使用的geometry坐標是wkbPoint(幾何點坐標)
線表使用的geometry坐標是wkbLineString(多點坐標)
區別詳細看截圖
參考別人寫的方法加了注釋,把點和邊的轉化寫成了函數,每次轉成功后加了讀取shp文件來測試是否轉化成功 注意事項
1.解決shp dbf 文件中文編碼
#gdal.SetConfigOption(“SHAPE_ENCODING”, “”)
#gdal.SetConfigOption(“SHAPE_ENCODING”, “gb2312”)
gdal.SetConfigOption(“SHAPE_ENCODING”, “gbk”)
2.layer.CreateField(ogr.FieldDefn(‘local_id', ogr.OFTString))
創建字段的名稱最好為英文,而且不能超過十字字符,一個中文漢字占的字符多。
代碼
(geopandas gdal 導入要考慮順序,不然會報錯)
import os, re import geopandas as gpd import gdal import pandas as pd from osgeo import ogr, osr # osr用于獲取坐標系統,ogr用于處理矢量文件 from conf.path_config import gis_excel_dir # 解決shp dbf 文件中文編碼 選自自己想轉的編碼 常用的 gbk gb2312 utf8 # gdal.SetConfigOption("SHAPE_ENCODING", "") # gdal.SetConfigOption("SHAPE_ENCODING", "gb2312") gdal.SetConfigOption("SHAPE_ENCODING", "gbk") def point_csv_2_shp(path, shp_fn): """ point 轉 shp """ os.chdir(os.path.dirname(path)) # 將path所在的目錄設置為當前文件夾 ds = ogr.Open(path, 1) # 1代表可讀可寫,默認為0 csv_lyr = ds.GetLayer() # 獲取csv文件 sr = osr.SpatialReference() sr.ImportFromEPSG(4326) # 定義坐標系統 shp_driver = ogr.GetDriverByName('ESRI Shapefile') # 獲取shapefile文件處理句柄 if os.path.exists(shp_fn): # 如果文件夾中已存在同名文件則先刪除 shp_driver.DeleteDataSource(shp_fn) shp_ds = shp_driver.CreateDataSource(shp_fn) layer = shp_ds.CreateLayer(shp_fn, sr, ogr.wkbPoint) # 創建一個點圖層 layer.CreateField(ogr.FieldDefn('id', ogr.OFTString)) layer.CreateField(ogr.FieldDefn('ground_h', ogr.OFTString)) layer.CreateField(ogr.FieldDefn('type', ogr.OFTString)) for csv_row in csv_lyr: # 對于csv文件中每一行 point_feature = ogr.Feature(layer.GetLayerDefn()) # 創建一個點 x = csv_row.GetFieldAsDouble('橫坐標') # csv中的坐標字段 y = csv_row.GetFieldAsDouble('縱坐標') # csv中的坐標字段 shp_pt = ogr.Geometry(ogr.wkbPoint) # 創建幾何點 shp_pt.AddPoint(x, y) # 獲取csv字段 # 為創建的shp文件字段賦值 point_feature.SetField('id', csv_row.GetFieldAsString('local_id')) # GetFieldAsString 獲取csv中的列名 point_feature.SetField('ground_h', csv_row.GetFieldAsString('ground_h')) point_feature.SetField('type', csv_row.GetFieldAsString('dev_type')) point_feature.SetGeometry(shp_pt) # 將點的幾何數據添加到點中 layer.CreateFeature(point_feature) # 將點寫入到圖層中 del ds del shp_ds # 釋放句柄,文件緩沖到磁盤 print("This process has succeeded!") def line_csv_2_dbf(path, shp_fn): """ geometry坐標為 LineString坐標 """ os.chdir(os.path.dirname(path)) # 將path所在的目錄設置為當前文件夾 ds = ogr.Open(path, 1) # 1代表可讀可寫,默認為0 csv_lyr = ds.GetLayer() # 獲取csv文件 sr = osr.SpatialReference() sr.ImportFromEPSG(4326) # 定義坐標系統 shp_driver = ogr.GetDriverByName('ESRI Shapefile') # 獲取shapefile文件處理句柄 if os.path.exists(shp_fn): # 如果文件夾中已存在同名文件則先刪除 shp_driver.DeleteDataSource(shp_fn) shp_ds = shp_driver.CreateDataSource(shp_fn) layer = shp_ds.CreateLayer(shp_fn, sr, ogr.wkbLineString) # 創建多個點圖層 layer.CreateField(ogr.FieldDefn('id', ogr.OFTString)) layer.CreateField(ogr.FieldDefn('l_id', ogr.OFTString)) layer.CreateField(ogr.FieldDefn('u_id', ogr.OFTString)) for csv_row in csv_lyr: # 對于csv文件中每一行 point_feature = ogr.Feature(layer.GetLayerDefn()) x1 = csv_row.GetFieldAsDouble('x1') # csv中的 x1坐標 y1 = csv_row.GetFieldAsDouble('y1') # y1坐標 x2 = csv_row.GetFieldAsDouble('x2') # x1坐標 y2 = csv_row.GetFieldAsDouble('y2') # y2坐標 mult_coord = '(' + str(x1) + ' ' + str(y1) + ',' + str(x2) + ' ' + str(y2) + ')' # geom = ogr.CreateGeometryFromWkt('LINESTRING ' + '(2 1,0 1)') geom = ogr.CreateGeometryFromWkt('LINESTRING' + mult_coord) # 獲取csv字段 # 為創建的shp文件字段賦值 point_feature.SetField('id', csv_row.GetFieldAsString('gid')) # GetFieldAsString 獲取csv中的列名 point_feature.SetField('l_id', csv_row.GetFieldAsString('l_id')) point_feature.SetField('u_id', csv_row.GetFieldAsString('u_id')) point_feature.SetGeometryDirectly(geom) layer.CreateFeature(point_feature) del ds del shp_ds # 釋放句柄,文件緩沖到磁盤 print("This process has succeeded!") def read_shapefile(path): """ 測試轉成的shp文件 """ df = gpd.read_file(path, encoding='gbk', rows=20) # 轉shp前的編碼格式 print(df) if __name__ == '__main__': '''線表轉shp 以及讀取測試''' shp_fn = "gd.shp" # 最終要得到的shp文件的文件名 path = os.path.join(gis_excel_dir, 'line.csv') # csv文件名稱 line_csv_2_dbf(path=path, shp_fn=shp_fn) # 讀取測試轉之后的結果 read_shapefile(path=os.path.join(gis_excel_dir, 'gd.shp')) '''點表轉shp 以及讀取測試''' # shp_fn = "xnd.shp" # path = os.path.join(gis_excel_dir, 'point.csv') # csv文件名稱 # point_csv_2_shp(path=path, shp_fn=shp_fn) # 讀取測試轉之后的結果 # read_shapefile(path=os.path.join(gis_excel_dir, 'point.shp'))
到此,相信大家對“怎么用Python實現csv文件(點表和線表)轉換為shapefile文件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。