需要的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 谷歌翻译(国内) 译