Python+GDAL实现txt/csv转.shp文件


需要的python包:

os,glob,pandas,gadl(osgeo)

gdal包下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal,找到对应python版本的gdal版本,下载。cmd下cd进入文件路径,pip install xxxxx.whl安装。

pandas下载:cmd下,pip install -i 镜像网址 pandas

GDAL使用参考:https://www.osgeo.cn/pygis/proj-osr.html

 

以txt为例:

##  txt\csv转shp,txt需要加正则表达
# 导入相关库
import os
from osgeo import ogr
import pandas as pd
from osgeo import osr
import glob

# 启动异常报错提示
ogr.UseExceptions()

# .shp文件保存路径
shp_path = r'D:\Projects\wwlln\all\ceshi_num\tiqu_678\hb\txt2shp'
# 输入的csv/txt文件路径
txt_path = r'D:\Projects\wwlln\all\ceshi_num\tiqu_678\hb\txt'

for txt_filename in glob.glob(os.path.join(txt_path,'*.txt')):

    # 读入csv/txt文件信息,设置点几何的字段属性
    txt_df = pd.read_table(txt_filename,header=None,sep='\s+')   ##  csv时不需要正则表达
    print(txt_df)

    # 利用.csv/.txt文件创建一个点shp文件
   
    # 获取驱动
    driver = ogr.GetDriverByName('ESRI Shapefile')
    
    # 创建数据源
    shp_filename = os.path.basename(txt_filename)[:-4] + '.shp'
    # 检查数据源是否已存在
    if os.path.exists(os.path.join(shp_path, shp_filename)):
        driver.DeleteDataSource(os.path.join(shp_path, shp_filename))    
    ds = driver.CreateDataSource(os.path.join(shp_path, shp_filename))
    
    # 图层名
    layer_name = os.path.basename(txt_filename)[:-4]
    
    # 定义坐标系对象
    sr = osr.SpatialReference()
    # 使用WGS84地理坐标系
    sr.ImportFromEPSG(4326)
    
    # 创建点图层, 并设置坐标系
    out_lyr = ds.CreateLayer(layer_name, srs = sr, geom_type=ogr.wkbPoint)
    
    # 创建图层定义
    # 利用csv/txt文件中的字段创建对应数量的属性字段
    ### zm:我的csv文件字段为:date1,time1,lat,lon,timingerror,statnumber,而我只需要date1,lat和lon字段
    # date字段
    date1_fld = ogr.FieldDefn('date1', ogr.OFTString)
    date1_fld.SetWidth(11)
    out_lyr.CreateField(date1_fld)
    
    #添加time字段
    # time1_fld = ogr.FieldDefn('time1', ogr.OFTString)
    # time1_fld.SetWidth(10)
    # out_lyr.CreateField(time1_fld)
    
    # Latitude字段
    lat_fld = ogr.FieldDefn('latitude', ogr.OFTReal)
    lat_fld.SetWidth(12)
    lat_fld.SetPrecision(6)
    out_lyr.CreateField(lat_fld)
    # Longitude字段
    lon_fld = ogr.FieldDefn('longitude', ogr.OFTReal)
    lon_fld.SetWidth(12)
    lon_fld.SetPrecision(6)
    out_lyr.CreateField(lon_fld)

    # timingerror字段
    # timingerror_fld = ogr.FieldDefn('timingerror',ogr.OFTReal)
    # timingerror_fld.SetWidth(4)
    # timingerror_fld.Setprecision(2)
    # out_lyr.CreateField(timingerror_fld)

    # statnumber 字段
    # statnum_fld = ogr.FieldDefn('timingerror',ogr.OFTINTEGER)
    # statnum_fld.Width(2)
    # out_lyr.CreateField(statnum_fld)   

    # 从layer中读取相应的feature类型,并创建feature
    featureDefn = out_lyr.GetLayerDefn()
    feature = ogr.Feature(featureDefn)
    
    # 设定几何形状
    point = ogr.Geometry(ogr.wkbPoint)
    
    # 读入csv/txt文件信息,设置点几何的字段属性
    for i in range(len(txt_df)):
        
        # 设置属性值部分
        # 站点Id
        feature.SetField('date1', str(txt_df.iloc[i, 0]))
        # 时间
        # feature.SetField('time1',str(txt_df.iloc[i,1])
        # 纬度
        feature.SetField('latitude', float(txt_df.iloc[i, 2]))
        # 经度
        feature.SetField('longitude', float(txt_df.iloc[i, 3]))
        #   ZM:我这里为timingerror,statnum,不写了
        # feature.SetField('timingerror', float(txt_df.iloc[i, 4]))
        
        # 设置几何信息部分
        # 利用经纬度创建点, X为经度, Y为纬度
        point.AddPoint(float(txt_df.iloc[i, 3]), float(txt_df.iloc[i, 2]))
        feature.SetGeometry(point)
        
        # 将feature写入layer
        out_lyr.CreateFeature(feature)
    
    # 从内存中清除 ds,将数据写入磁盘中
    ds.Destroy()


参考文章:https://blog.csdn.net/lidahuilidahui/article/details/103223147

翻译 朗读 复制 正在查询,请稍候…… 重试 朗读 复制 复制 朗读 复制 via 谷歌翻译(国内)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM