Python實(shí)現(xiàn)csv文件(點(diǎn)表和線表)轉(zhuǎn)換為shapefile文件的方法
Python實(shí)現(xiàn)csv文件(點(diǎn)表和線表)轉(zhuǎn)換為shapefile文件
說(shuō)明
- 點(diǎn)表使用的geometry坐標(biāo)是wkbPoint(幾何點(diǎn)坐標(biāo))
- 線表使用的geometry坐標(biāo)是wkbLineString(多點(diǎn)坐標(biāo))
區(qū)別詳細(xì)看截圖
參考別人寫(xiě)的方法加了注釋,把點(diǎn)和邊的轉(zhuǎn)化寫(xiě)成了函數(shù),每次轉(zhuǎn)成功后加了讀取shp文件來(lái)測(cè)試是否轉(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)建字段的名稱最好為英文,而且不能超過(guò)十字字符,一個(gè)中文漢字占的字符多。
代碼
(geopandas gdal 導(dǎo)入要考慮順序,不然會(huì)報(bào)錯(cuò))
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代表可讀可寫(xiě),默認(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)建一個(gè)點(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: # 對(duì)于csv文件中每一行 point_feature = ogr.Feature(layer.GetLayerDefn()) # 創(chuàng)建一個(gè)點(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)寫(xiě)入到圖層中 del ds del shp_ds # 釋放句柄,文件緩沖到磁盤(pán) 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代表可讀可寫(xiě),默認(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)建多個(gè)點(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: # 對(duì)于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 # 釋放句柄,文件緩沖到磁盤(pán) print("This process has succeeded!") def read_shapefile(path): """ 測(cè)試轉(zhuǎn)成的shp文件 """ df = gpd.read_file(path, encoding='gbk', rows=20) # 轉(zhuǎn)shp前的編碼格式 print(df) if __name__ == '__main__': '''線表轉(zhuǎn)shp 以及讀取測(cè)試''' 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) # 讀取測(cè)試轉(zhuǎn)之后的結(jié)果 read_shapefile(path=os.path.join(gis_excel_dir, 'gd.shp')) '''點(diǎn)表轉(zhuǎn)shp 以及讀取測(cè)試''' # shp_fn = "xnd.shp" # path = os.path.join(gis_excel_dir, 'point.csv') # csv文件名稱 # point_csv_2_shp(path=path, shp_fn=shp_fn) # 讀取測(cè)試轉(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
零基礎(chǔ)寫(xiě)python爬蟲(chóng)之urllib2中的兩個(gè)重要概念:Openers和Handlers
文章首先介紹了urllib2的2個(gè)方法,然后詳細(xì)介紹了urllib2中的2個(gè)重要概念Openers和Handlers的相關(guān)知識(shí),希望能對(duì)大家有所幫助2014-11-11Python實(shí)現(xiàn)從log日志中提取ip的方法【正則提取】
這篇文章主要介紹了Python實(shí)現(xiàn)從log日志中提取ip的方法,涉及Python文件讀取、數(shù)據(jù)遍歷、正則匹配等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Python通用驗(yàn)證碼識(shí)別OCR庫(kù)之ddddocr驗(yàn)證碼識(shí)別
dddd_ocr也是一個(gè)用于識(shí)別驗(yàn)證碼的開(kāi)源庫(kù),又名帶帶弟弟ocr,爬蟲(chóng)界大佬sml2h3開(kāi)發(fā),識(shí)別效果也是非常不錯(cuò),下面這篇文章主要給大家介紹了關(guān)于Python通用驗(yàn)證碼識(shí)別OCR庫(kù)之ddddocr驗(yàn)證碼識(shí)別的相關(guān)資料,需要的朋友可以參考下2022-05-05Python的Tqdm模塊實(shí)現(xiàn)進(jìn)度條配置
這篇文章主要介紹了Python的Tqdm模塊實(shí)現(xiàn)進(jìn)度條配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Pycharm生成可執(zhí)行文件.exe的實(shí)現(xiàn)方法
這篇文章主要介紹了Pycharm生成可執(zhí)行文件.exe的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06python3基于OpenCV實(shí)現(xiàn)證件照背景替換
這篇文章主要為大家詳細(xì)介紹了python3基于OpenCV實(shí)現(xiàn)證件照背景替換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07解讀MaxPooling1D和GlobalMaxPooling1D的區(qū)別
這篇文章主要介紹了MaxPooling1D和GlobalMaxPooling1D的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12