继《如何使用Python中的GDAL库对遥感影像进行读取和存储》之后,本文再简单地介绍一下,如何使用Python中的GDAL库创建矢量文件。
这里,矢量文件指的是点、线、面文件,shape格式,可以使用 ArcGIS 等软件读取编辑。
需要用到的Python库依然为GDAL,安装完GDAL后,就可以直接导入使用了。
废话不多说,直接上代码。
创建点文件
from osgeo import ogr,osr
Longitude = 116.4
Latitude = 39.9
def create_point():
## 生成点矢量文件 ##
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource("Point.shp") ## shp文件名称
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) ## 空间参考:WGS84
layer = data_source.CreateLayer("Point", srs, ogr.wkbPoint) ## 图层名称要与shp名称一致
field_name = ogr.FieldDefn("Name", ogr.OFTString) ## 设置属性
field_name.SetWidth(20) ## 设置长度
layer.CreateField(field_name) ## 创建字段
field_Longitude = ogr.FieldDefn("Longitude", ogr.OFTReal) ## 设置属性
layer.CreateField(field_Longitude) ## 创建字段
field_Latitude = ogr.FieldDefn("Latitude", ogr.OFTReal) ## 设置属性
layer.CreateField(field_Latitude) ## 创建字段
feature = ogr.Feature(layer.GetLayerDefn())
feature.SetField("Name", "point") ## 设置字段值
feature.SetField("Longitude", str(Longitude)) ## 设置字段值
feature.SetField("Latitude", str(Latitude)) ## 设置字段值
wkt = "POINT(%f %f)" % (float(Longitude), float(Latitude)) ## 创建点
point = ogr.CreateGeometryFromWkt(wkt) ## 生成点
feature.SetGeometry(point) ## 设置点
layer.CreateFeature(feature) ## 添加点
feature = None ## 关闭属性
data_source = None ## 关闭数据
这里,点的经纬度坐标,我直接给出了。如果有很多点的话,也可以从文本中读取,然后通过for循环逐一添加到shp文件中。
创建线文件
from osgeo import ogr,osr
def create_line():
## 生成线矢量文件 ##
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource("Line.shp") ## shp文件名称
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) ## 空间参考:WGS84
layer = data_source.CreateLayer("Line", srs, ogr.wkbLineString) ## 图层名称要与shp名称一致
field_name = ogr.FieldDefn("Name", ogr.OFTString) ## 设置属性
field_name.SetWidth(20) ## 设置长度
layer.CreateField(field_name) ## 创建字段
field_length = ogr.FieldDefn("Length", ogr.OFTReal) ## 设置属性
layer.CreateField(field_length) ## 创建字段
feature = ogr.Feature(layer.GetLayerDefn())
feature.SetField("Name", "line") ## 设置字段值
feature.SetField("Length", "100") ## 设置字段值
wkt = 'LINESTRING(116.4 39.9, 116.42 39.91, 116.39 39.92, 116.38 39.91)' ## 创建线
line = ogr.CreateGeometryFromWkt(wkt) ## 生成线
feature.SetGeometry(line) ## 设置线
layer.CreateFeature(feature) ## 添加线
feature = None ## 关闭属性
data_source = None ## 关闭数据
线是根据多个点的经纬度绘制出来的。因此,点的经纬度也可以从文本中读取,然后通过for循环逐一添加到shp文件中,形成线文件。注意,字段Length,这里是随便给出的,可以根据实际情况生成。
创建面文件
from osgeo import ogr,osr
def create_polygon():
## 生成线矢量文件 ##
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource("Polygon.shp") ## shp文件名称
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) ## 空间参考:WGS84
layer = data_source.CreateLayer("Polygon", srs, ogr.wkbPolygon) ## 图层名称要与shp名称一致
field_name = ogr.FieldDefn("Name", ogr.OFTString) ## 设置属性
field_name.SetWidth(20) ## 设置长度
layer.CreateField(field_name) ## 创建字段
field_length = ogr.FieldDefn("Area", ogr.OFTReal) ## 设置属性
layer.CreateField(field_length) ## 创建字段
feature = ogr.Feature(layer.GetLayerDefn())
feature.SetField("Name", "polygon") ## 设置字段值
feature.SetField("Area", "500") ## 设置字段值
wkt = "POLYGON((116.41 39.89, 116.41 39.91, 116.39 39.91, 116.39 39.89))" ## 创建面
polygon = ogr.CreateGeometryFromWkt(wkt) ## 生成面
feature.SetGeometry(polygon) ## 设置面
layer.CreateFeature(feature) ## 添加面
feature = None ## 关闭属性
data_source = None ## 关闭数据
同样,面也是根据4个点的经纬度绘制出来的,可以根据需要创建多个面。
将创建的点、线、面导入到ArcGIS中显示如下:
总结
总的来说,利用GDAL来创建点、线、面还是比较简单方便快捷的,在实际中也有很多应用,如果遇到应用比较频繁的情况,也可以将这3个代码写成一个类,后续再调用就比较方便啦!