一、在這里我用到的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()