上一篇博客介绍了如何使用OGR读取矢量数据,那么怎么用OGR写入呢,下面就让我们一起学习怎么写入数据吧。
1.创建新文件
在写入数据之前我们首先需要确定写入对象,也就是先创建一个可供写入数据的对象。
创建对象使用driver.CreateDataSource(<filename>)
,这里的driver即前面创建的数据驱动,需要注意的是这里面的filename不能已经存在,否则会报错。
2.创建Layer
数据源对象表示含有OGRLayer对象的一个文件或一个数据库,因此在写入数据之前我们还需要创建Layer,也就是图层要素。
这里用的方法为dataSource.CreateLayer(<name>, geom_type=<OGRwkbGeometryType>, [srs])
,其中dataSource即第一步创建的数据库。
这里的OGRwkbGeometryType为几何类型,常见的几何类型有ogr.wkbPoint、org.wkbLineString、org.wkbPolygon, [srs]为空间参考
举个例子:
from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
ds2 = driver.CreateDataSource('test.shp')
layer2 = ds2.CreateLayer('test', geom_type=ogr.wkbPoint)
运行这段代码之后会在文件目录下生成test.dbf test.shp test.shx三个文件
文件拓展名 | 用途 |
---|---|
.shp | *必要文件 用于存储要素几何的主文件,其中包括几何图形 |
.shx | *必要文件 形状索引文件,适当尺寸的几何元素索引信息可以加快访问速度 |
.dbf | *必要文件 数据库文件,其中包括几何元素的属性信息 |
3.删除文件
要删除一个shp文件,使用DeleteDataSource
driver.DeleteDataSource(‘test.shp’)
4.添加数据
OGRFeatureDefn里面封装了feature的属性,类型、名称及其默认的空间参考系统等。一个OGRFeatureDefn对象通常与一个层(layer)对应。
4.1 添加字段
在添加字段之前需要先定义,而且只能在layer里面加,而且还不能有数据,添加的字段如果是字符串,还要设定宽度。
字段数据类型 | OGR常量 |
---|---|
Integer | OFTInteger |
List of integers | OFTIntegerList |
Floating point number | OFTReal |
List of floating point numbers | OFTRealList |
String | OFTString |
List of strings | OFTStringList |
Date | OFTDate |
Time of day | OFTTime |
Date and time | OFTDateTime |
fieldDefn = ogr.FieldDefn('id', ogr.OFTString)
fieldDefn.SetWidth(4)
layer.CreateField(fieldDefn)
4.2添加feature
添加一个新的feature,首先得完成上一步,把字段field都添加齐了
然后从layer中读取相应的feature类型,并创建feature。
featureDefn = layer.GetLayerDefn()
feature = ogr.Feature(featureDefn)
4.3设定字段值和几何形状
设定几何形状
WKB(二进制Well-KnownBinary),用于不同软件程序间进行几何要素类型转换的一种二进制表示标准。
因为它是二进制格式,所以人们无法直接阅读获取其表示的内容,但是熟知文本格式(Well-Known Text,WKT)可以阅读。
几何要素类型 对应OGR常量
Point | wkbPoint |
---|---|
Multipoint | wkbMultiPoint |
Line | wkbLineString |
Multiline | wkbMultiLineString |
Polygon | wkbPolygon |
Multipolygon | wkbMultiPolygon |
Unknown geometry type | wkbUnknown(图层如果有多种几何类型就返回wkbUnknown) |
No geometry | wkbNone |
1.建立空的geometry对象:ogr.Geometry
定义各种不同的geometry使用的方法是不一样的(point, line, polygon, etc)
新建点point,使用方法AddPoint( , , [])。其中的z坐标一般是省略的,默认值是0
例如:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
2.设置几何形状
feature.SetGeometry(point)
设定某字段的数值
feature.SetField('id', 23)
4.4将feature写入layer
layer.CreateFeature(feature)
完整代码
from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
ds2 = driver.CreateDataSource('test.shp')
layer = ds2.CreateLayer('test', geom_type=ogr.wkbPoint)
#定义字段
fieldDefn = ogr.FieldDefn('id', ogr.OFTString)
fieldDefn.SetWidth(4)
layer.CreateField(fieldDefn)
#定义要素
featureDefn = layer.GetLayerDefn()
feature = ogr.Feature(featureDefn)
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
#设置几何形状
feature.SetGeometry(point)
#设定某字段的数值
feature.SetField('id', 23)
#将feature写入layer
layer.CreateFeature(feature)
运行结果
在arcmap中打开如下,由于我们没有添加投影信息,因此得到也是无投影的文件。