Python實(shí)現(xiàn)csv文件(點(diǎn)表和線表)轉(zhuǎn)換為shapefile文件的方法
Python實(shí)現(xiàn)csv文件(點(diǎn)表和線表)轉(zhuǎn)換為shapefile文件
說明
- 點(diǎn)表使用的geometry坐標(biāo)是wkbPoint(幾何點(diǎn)坐標(biāo))
- 線表使用的geometry坐標(biāo)是wkbLineString(多點(diǎn)坐標(biāo))
區(qū)別詳細(xì)看截圖


參考別人寫的方法加了注釋,把點(diǎn)和邊的轉(zhuǎn)化寫成了函數(shù),每次轉(zhuǎn)成功后加了讀取shp文件來測試是否轉(zhuǎn)化成功 注意事項(xiàng)
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))
創(chuàng)建字段的名稱最好為英文,而且不能超過十字字符,一個中文漢字占的字符多。
代碼
(geopandas gdal 導(dǎo)入要考慮順序,不然會報(bào)錯)
import os, re
import geopandas as gpd
import gdal
import pandas as pd
from osgeo import ogr, osr # osr用于獲取坐標(biāo)系統(tǒng),ogr用于處理矢量文件
from conf.path_config import gis_excel_dir
# 解決shp dbf 文件中文編碼選自自己想轉(zhuǎn)的編碼常用的 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 轉(zhuǎn) shp
"""
os.chdir(os.path.dirname(path)) # 將path所在的目錄設(shè)置為當(dāng)前文件夾
ds = ogr.Open(path, 1) # 1代表可讀可寫,默認(rèn)為0
csv_lyr = ds.GetLayer() # 獲取csv文件
sr = osr.SpatialReference()
sr.ImportFromEPSG(4326) # 定義坐標(biāo)系統(tǒng)
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) # 創(chuàng)建一個點(diǎn)圖層
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()) # 創(chuàng)建一個點(diǎn)
x = csv_row.GetFieldAsDouble('橫坐標(biāo)') # csv中的坐標(biāo)字段
y = csv_row.GetFieldAsDouble('縱坐標(biāo)') # csv中的坐標(biāo)字段
shp_pt = ogr.Geometry(ogr.wkbPoint) # 創(chuàng)建幾何點(diǎn)
shp_pt.AddPoint(x, y)
# 獲取csv字段
# 為創(chuàng)建的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) # 將點(diǎn)的幾何數(shù)據(jù)添加到點(diǎn)中
layer.CreateFeature(point_feature) # 將點(diǎn)寫入到圖層中
del ds
del shp_ds # 釋放句柄,文件緩沖到磁盤
print("This process has succeeded!")
def line_csv_2_dbf(path, shp_fn):
"""
geometry坐標(biāo)為 LineString坐標(biāo)
"""
os.chdir(os.path.dirname(path)) # 將path所在的目錄設(shè)置為當(dāng)前文件夾
ds = ogr.Open(path, 1) # 1代表可讀可寫,默認(rèn)為0
csv_lyr = ds.GetLayer() # 獲取csv文件
sr = osr.SpatialReference()
sr.ImportFromEPSG(4326) # 定義坐標(biāo)系統(tǒng)
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) # 創(chuàng)建多個點(diǎn)圖層
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坐標(biāo)
y1 = csv_row.GetFieldAsDouble('y1') # y1坐標(biāo)
x2 = csv_row.GetFieldAsDouble('x2') # x1坐標(biāo)
y2 = csv_row.GetFieldAsDouble('y2') # y2坐標(biāo)
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字段
# 為創(chuàng)建的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):
"""
測試轉(zhuǎn)成的shp文件
"""
df = gpd.read_file(path, encoding='gbk', rows=20) # 轉(zhuǎn)shp前的編碼格式
print(df)
if __name__ == '__main__':
'''線表轉(zhuǎn)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)
# 讀取測試轉(zhuǎn)之后的結(jié)果
read_shapefile(path=os.path.join(gis_excel_dir, 'gd.shp'))
'''點(diǎn)表轉(zhuǎn)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)
# 讀取測試轉(zhuǎn)之后的結(jié)果
# read_shapefile(path=os.path.join(gis_excel_dir, 'point.shp'))
到此這篇關(guān)于Python實(shí)現(xiàn)csv文件(點(diǎn)表和線表)轉(zhuǎn)換為shapefile文件的文章就介紹到這了,更多相關(guān)Python csv文件轉(zhuǎn)換為shapefile文件內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信