파이썬은 GDAL / OGR 패키지 대량 가방을 사용하고 판다는 점 모양 파일에 위도와 경도 정보 사이트 csv 파일을 취할 것

최근, 수석 의사의 요청의 접수, 나는 위치의 위도와 경도 아날로그 데이터 포인트 모양 파일 (.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, 쓰기 코드는 책을 설정해야하지, 수동입니다!

게시 11 개 원래 기사 · 원의 찬양 (51) ·은 10000 +를 볼

추천

출처blog.csdn.net/lidahuilidahui/article/details/103223147