讀CSV文件並寫arcgis shp文件


一、在這里我用到的csv文件是包含x,y坐標及高程、降雨量數據的文件。如下圖所示。

二、SF簡介

        簡單要素模型(Simple Feature,SF),是 OGC 國際組織定義的面向對象的矢量數據模
型。要素 Feature 包括幾何對象和屬性信息兩部分。其中,幾何對象有兩種表示
方式 - WKT(Well Known Text)和 WKB(Well Known Binary),前者用於編程賦值,后者
用於數據庫或二進制文件格式。

三、創建SF對象

from osgeo import ogr
#SF 對象的 WKT 表示格式
pnt_wkt = "POINT(1 1)"
lin_wkt = "LINESTRING(0 0,15 15) "
pol_wkt = "POLYGON((1 1,1 10,10 10,10 1,1 1),( 2 2,2 8,8 8,8 2,2 2)) "
#創建 SF 對象
pnt = ogr.CreateGeometryFromWkt(pnt_wkt)
lin = ogr.CreateGeometryFromWkt(lin_wkt)
pol = ogr.CreateGeometryFromWkt(pol_wkt)

四、讀CSV文件並寫arcgis shp文件

#讀csv文件

filename='stations.csv'
fh=open(filename,'r')

#讀csv文件頭

title=fh.readline()

title=title.strip()

title=title.split(",")

#讀取csv數據

vals=[]

datas=[]

val=fh.readline()

while val is not None:
  val=val.strip()
  if len(val) ==0:
    break
  for v in val.split(","):
    v_=float(v)
    vals.append(v_)
  datas.append(vals)
  vals=[]
  val=fh.readline()

#寫shp文件

from osgeo import ogr,osr

import os

filename = "stations.shp"

driver = ogr.GetDriverByName("ESRI Shapefile")
#判斷shp文件名是否在當前文件夾中存在,如果存在則刪除
if os.access(filename, os.F_OK ):
  driver.DeleteDataSource(filename)

#創建shp文件

ds = driver.CreateDataSource(filename)

#定義投影

spatialref=osr.SpatialReference('LOCAL_CS["arbitrary"]')

#定義幾何類型

geomtype=ogr.wkbPoint

#定義圖層(此方法可以根據datas數據設定字符編碼默認為utf-8編碼。)

layer=ds.CreateLayer(filename[:-4],srs=spatialref,geom_type=geomtype)

#定義圖層屬性字段信息

fdx=ogr.FieldDefn(title[0],ogr.OFTReal)
fdx.SetPrecision(3)
fdy=ogr.FieldDefn(title[1],ogr.OFTReal)
fdy.SetPrecision(3)
fdz=ogr.FieldDefn(title[2],ogr.OFTReal)
fdz.SetPrecision(3)
fdp=ogr.FieldDefn(title[3],ogr.OFTReal)
fdp.SetPrecision(3)

layer.CreateField(fdx)

layer.CreateField(fdy)

layer.CreateField(fdz)

layer.CreateField(fdp)

#將幾何對象及屬性寫入圖層

for i in range(len(datas)):
  d=datas[i]

  #創建SF對象
  wkt="POINT(%f %f %f)" % (d[0],d[1],d[2])
  geom=ogr.CreateGeometryFromWkt(wkt)

  #圖層屬性信息
  feat=ogr.Feature(layer.GetLayerDefn())
  feat.SetGeometry(geom)
  feat.SetField(title[0],d[0])
  feat.SetField(title[1],d[1])
  feat.SetField(title[2],d[2])
  feat.SetField(title[3],d[3])
  layer.CreateFeature(feat)

#關閉文件

ds.Dsetroy()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM