写论文数据可视化需要用到shp文件,这里做个记录方便日后自己查看。
本文参考博主1、博主2的代码改的(故不多解释,直接上数据和代码)。并附上PythonGIS相关的知识手册。
1.数据路径和格式
下图中CSV文件里寸的是影像的名称和四角点以及中心点的经纬度坐标
2.源代码
下面给出了生成点要素和面要素的代码:
# 导入相关库
import os
from osgeo import ogr
import pandas as pd
from osgeo import osr
import glob
# 启动异常报错提示
ogr.UseExceptions()
# .shp文件保存路径
shp_path = r'F:\SHP'
# 输入的csv文件路径
csv_path = r'F:\SHP'
#点要素
def poin_shp():
for csv_filename in glob.glob(os.path.join(csv_path, '*.csv')):
# 读入csv文件信息,设置点几何的字段属性
csv_df = pd.read_csv(csv_filename)
# 利用.csv文件创建一个点shp文件
# 获取驱动
driver = ogr.GetDriverByName('ESRI Shapefile')
# 创建数据源
shp_filename = os.path.basename(csv_filename)[:-4] + '_point.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(csv_filename)[:-4]
# 定义坐标系对象
sr = osr.SpatialReference()
# 使用WGS84地理坐标系
sr.ImportFromEPSG(4326)
# 创建点图层, 并设置坐标系
out_lyr = ds.CreateLayer(layer_name, srs=sr, geom_type=ogr.wkbPoint)
# 创建图层定义
# 利用csv文件中有四个字段创建4个属性字段
# station字段
station_fld = ogr.FieldDefn('Image', ogr.OFTString)
station_fld.SetWidth(6)
out_lyr.CreateField(station_fld)
# Latitude字段
lat_fld = ogr.FieldDefn('latitude', ogr.OFTReal)
lat_fld.SetWidth(9)
lat_fld.SetPrecision(5)
out_lyr.CreateField(lat_fld)
# Longitude字段
lon_fld = ogr.FieldDefn('longitude', ogr.OFTReal)
lon_fld.SetWidth(9)
lon_fld.SetPrecision(5)
out_lyr.CreateField(lon_fld)
# # pr字段
# pr_fld = ogr.FieldDefn('pr', ogr.OFTReal)
# pr_fld.SetWidth(5)
# pr_fld.SetPrecision(2)
# out_lyr.CreateField(pr_fld)
# tas字段
# tas_fld = ogr.FieldDefn('tas', ogr.OFTReal)
# tas_fld.SetWidth(6)
# tas_fld.SetPrecision(2)
# out_lyr.CreateField(tas_fld)
# 从layer中读取相应的feature类型,并创建feature
featureDefn = out_lyr.GetLayerDefn()
feature = ogr.Feature(featureDefn)
# 设定几何形状
point = ogr.Geometry(ogr.wkbPoint)
# 读入csv文件信息,设置点几何的字段属性
for i in range(len(csv_df)):
# 设置属性值部分
# 站点Id
feature.SetField('Image', str(csv_df.iloc[i, 0]))
# 纬度
feature.SetField('latitude', float(csv_df.iloc[i, 1]))
# 经度
feature.SetField('longitude', float(csv_df.iloc[i, 2]))
# # pr值
# feature.SetField('pr', float(csv_df.iloc[i, 3]))
# tas值
# feature.SetField('tas', float(csv_df.iloc[i, 3]))
# 设置几何信息部分
# 利用经纬度创建点, X为经度, Y为纬度
point.AddPoint(float(csv_df.iloc[i, 2]), float(csv_df.iloc[i, 1]))
feature.SetGeometry(point)
# 将feature写入layer
out_lyr.CreateFeature(feature)
# 从内存中清除 ds,将数据写入磁盘中
ds.Destroy()
#面要素
def Polygon_shp():
for csv_filename in glob.glob(os.path.join(csv_path, '*.csv')):
# 读入csv文件信息,设置点几何的字段属性
csv_df = pd.read_csv(csv_filename)
# 利用.csv文件创建一个点shp文件
# 获取驱动
driver = ogr.GetDriverByName('ESRI Shapefile')
# 创建数据源
shp_filename = os.path.basename(csv_filename)[:-4] + '_Polygon.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(csv_filename)[:-4]
# 定义坐标系对象
sr = osr.SpatialReference()
# 使用WGS84地理坐标系
sr.ImportFromEPSG(4326)
# 创建面图层, 并设置坐标系
out_lyr = ds.CreateLayer(layer_name, srs=sr, geom_type=ogr.wkbPolygon)
# 创建图层定义
# 利用csv文件中有四个字段创建4个属性字段
# Image字段
station_fld = ogr.FieldDefn('Image', ogr.OFTString)
station_fld.SetWidth(6)
out_lyr.CreateField(station_fld)
# Latitude字段
lat_fld = ogr.FieldDefn('latitude', ogr.OFTReal)
lat_fld.SetWidth(9)
lat_fld.SetPrecision(5)
out_lyr.CreateField(lat_fld)
# Longitude字段
lon_fld = ogr.FieldDefn('longitude', ogr.OFTReal)
lon_fld.SetWidth(9)
lon_fld.SetPrecision(5)
out_lyr.CreateField(lon_fld)
# # pr字段
# pr_fld = ogr.FieldDefn('pr', ogr.OFTReal)
# pr_fld.SetWidth(5)
# pr_fld.SetPrecision(2)
# out_lyr.CreateField(pr_fld)
# tas字段
# tas_fld = ogr.FieldDefn('tas', ogr.OFTReal)
# tas_fld.SetWidth(6)
# tas_fld.SetPrecision(2)
# out_lyr.CreateField(tas_fld)
# 从layer中读取相应的feature类型,并创建feature
featureDefn = out_lyr.GetLayerDefn()
feature = ogr.Feature(featureDefn)
# 读入csv文件信息,设置点几何的字段属性
for i in range(len(csv_df)):
# 设置属性值部分
# 站点Id
feature.SetField('Image', str(csv_df.iloc[i, 0]))
# 纬度
# feature.SetField('tl_lat', float(csv_df.iloc[i, 3]))
# feature.SetField('tr_lat', float(csv_df.iloc[i, 5]))
# feature.SetField('bl_lat', float(csv_df.iloc[i, 7]))
# feature.SetField('br_lat', float(csv_df.iloc[i, 9]))
# # 经度
# feature.SetField('tl_lon', float(csv_df.iloc[i, 4]))
# feature.SetField('tr_lon', float(csv_df.iloc[i, 6]))
# feature.SetField('bl_lon', float(csv_df.iloc[i, 8]))
# feature.SetField('br_lon', float(csv_df.iloc[i, 10]))
# 设置几何信息部分
# 利用经纬度创建点, X为经度, Y为纬度
ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(float(csv_df.iloc[i, 4]), float(csv_df.iloc[i, 3])) #左上
ring.AddPoint(float(csv_df.iloc[i, 6]), float(csv_df.iloc[i, 5])) #右上
ring.AddPoint(float(csv_df.iloc[i, 10]), float(csv_df.iloc[i, 9])) # 右下
ring.AddPoint(float(csv_df.iloc[i, 8]), float(csv_df.iloc[i, 7])) #左下
# 设定几何形状
Polygon = ogr.Geometry(ogr.wkbPolygon)
Polygon.AddGeometry(ring)
# ds = ogr.Open(shp_path, True)
# layer = ds.GetLayer(0)
# feature = ogr.Feature(layer.GetLayerDefn())
feature.SetGeometry(Polygon)
# 将feature写入layer
out_lyr.CreateFeature(feature)
# 从内存中清除 ds,将数据写入磁盘中
ds.Destroy()
if __name__ == "__main__":
# poin_shp() #点要素
Polygon_shp() #面要素
3.结果展示
转成功后便生成如下文档。
想要看到图形,用ArcMap打开即可。步骤为:ArcMap工具栏选择“文件”——"添加数据“——选择相应的”.SHP“文件即可。
这里就只展示图的一部分(点要素)。
版权声明:本文为weixin_44814176原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。