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 導入要考慮順序,不然會報錯)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
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文件的文章就介紹到這了,更多相關Python csv文件轉換為shapefile文件內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/brytlevson/article/details/120772341