최근, 수석 의사의 요청의 접수, 나는 위치의 위도와 경도 아날로그 데이터 포인트 모양 파일 (.shp 인)에 매년 .csv 파일을 파이썬 프로그램, 2006-- 2099을 쓰고 싶어요. 온라인 사용 arcpy 회전뿐만 아니라 오픈 소스 GIS의 공식 (를 OSGeo) 지역 사회 유지 패키지로 사용 매끈한 백 차례, 그러나, 오픈 소스 GIS / RS 열광으로, GDAL은 / OGR 패키지, 더 근본적인 작업의 대부분은 달성 될 수있다, 물론, 그것은 최선의 선택입니다. 작업이 또한이기 때문에, 상대적으로 기초 번호를 복잡. 물론, 우리는 유지 보수 프로그램 다시 문제를 줄이기 위해 의존하는 타사 패키지의 도입을 최소화하기 위해 더 많은 일을 할 파이썬 패키지를 가능한 한 많이, 그렇지 않은 경우 필요에 따라 할 수 있습니다.
여기에 사용이 GDAL / OGR과 팬더 (파이썬 패키지와 함께 제공 : OS, 글로브 패키지) 점 모양 파일에 사이트의 위도와 경도 정보를 CSV 파일 CSV 파일을 달성하기 위해. (CSV 파일 필드 가지고 주목 사이트 ID (캐릭터 타입), 위도 (플로트), 경도 (부동 소수점), 사이트 예측값 (플로트)를, 각 필드의 라인의 정확도)
.CSV 파일 (입력) 경로에 위치되어
있는 소스 코드는 다음과 같은된다 :
# 导入相关库
import os
from osgeo import ogr
import pandas as pd
from osgeo import osr
import glob
# 启动异常报错提示
ogr.UseExceptions()
# .shp文件保存路径
shp_path = r'F:\多种模式平均后降尺度\Site149RCP降尺度数据Shp_2006-2099\rcp85\平均气温tas'
# 输入的csv文件路径
csv_path = r'F:\多种模式平均后降尺度\Site149RCP降尺度数据CSV_2006-2099\rcp85\平均气温tas'
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] + '.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('station', 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('station', 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()
: 프로그램 운영 효과 후
.shp 인 파일 출력 경로 :
개방 검사는 효과 .shp 인 파일을 QGIS :
파일 속성 테이블과 .CSV 비교 열기 :
올바른 완벽!
그리고, 나중에 참조 할 수 있도록하는 것이, 그것을 기록 다행히 해결, 그것은 거의 3 시간이 걸렸다 쓰기 테스트 코드에 코드의 코드를 실행할 수 있지만, 최근의 기억은 OK, 쓰기 코드는 책을 설정해야하지, 수동입니다!