91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Python實現csv文件(點表和線表)轉換為shapefile文件

發布時間:2021-10-18 18:44:40 來源:億速云 閱讀:291 作者:iii 欄目:開發技術

本篇內容主要講解“怎么用Python實現csv文件(點表和線表)轉換為shapefile文件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用Python實現csv文件(點表和線表)轉換為shapefile文件”吧!

Python實現csv文件(點表和線表)轉換為shapefile文件
說明

  • 點表使用的geometry坐標是wkbPoint(幾何點坐標)

  • 線表使用的geometry坐標是wkbLineString(多點坐標)

區別詳細看截圖

怎么用Python實現csv文件(點表和線表)轉換為shapefile文件

怎么用Python實現csv文件(點表和線表)轉換為shapefile文件

參考別人寫的方法加了注釋,把點和邊的轉化寫成了函數,每次轉成功后加了讀取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文件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉树县| 安庆市| 泰来县| 新余市| 沁水县| 玉屏| 肥东县| 中江县| 新巴尔虎左旗| 南京市| 开江县| 临夏市| 嘉义市| 屏边| 玉田县| 陈巴尔虎旗| 瓮安县| 波密县| 华阴市| 武功县| 广州市| 广汉市| 丹棱县| 吴江市| 富蕴县| 南岸区| 巢湖市| 香河县| 绵竹市| 枣庄市| 罗城| 泉州市| 南开区| 赤水市| 和顺县| 东安县| 科技| 金华市| 达州市| 斗六市| 大城县|