跳到主要内容

矢量

layer

获取矢量文件范围
# 获取矢量文件范围
extent: tuple = layer.GetExtent()
minx: float = extent[0]
maxx: float = extent[1]
miny: float = extent[2]
maxy: float = extent[3]
获取矢量文件图层类型
ds: ogr.DataSource = ogr.Open(filePath)
layer: ogr.Layer = ds.GetLayer()
# 获取图层第一个 feature 的 Geometry 类型代码
# 具体代码在 ogr_core.h 文件中, 输入 wkb 就可以看到了
geomTypeCode = layer.GetGeomType()

Geometry

创建面
# 创建 linearRing
ring: ogr.Geometry = ogr.Geometry(ogr.wkbLinearRing)
for coord in coords:
ring.AddPoint(x, y)
# 闭合 ring
ring.CloseRings()
# 创建 polygon
poly: ogr.Geometry = ogr.Geometry(ogr.wkbPolygon)
poly.AddGeometry(ring)
根据已有格式创建
# 根据 wkt 创建
geom: ogr.Geometry = ogr.CreateGeometryFromWkt(poly.ExportToWkt())
# 根据 wkb 创建
geom: ogr.Geometry = ogr.CreateGeometryFromWkb(poly.ExportToWkb())
# 根据 json 创建
geom: ogr.Geometry = ogr.CreateGeometryFromJson(poly.ExportToJson())
# 根据 gml 创建
geom: ogr.Geometry = ogr.CreateGeometryFromGML(poly.ExportToGML())
获取 geometry 类型

最佳实践

curd

创建 shp
# 创建 shp 文件
driver: ogr.Driver = ogr.GetDriverByName('ESRI Shapefile')
ds: ogr.DataSource = driver.CreateDataSource('output.shp')
# 创建空间坐标系
srs: osr.SpatialReference = osr.SpatialReference()
srs.ImportFromWkt(prj)
# 创建 Layer
layer: ogr.Layer = ds.CreateLayer('polygon', srs, ogr.wkbPolygon)
# 创建字段 (可选)
layer.CreateField(ogr.FieldDefn("ID", ogr.OFTString))
layer.CreateField(ogr.FieldDefn("X", ogr.OFTInteger))
layer.CreateField(ogr.FieldDefn("Y", ogr.OFTInteger))
layer.CreateField(ogr.FieldDefn("Z", ogr.OFTReal))
# 获取 FeatureDefn
defn: ogr.FeatureDefn = layer.GetLayerDefn()
# 创建 Feature
feature: ogr.Feature = ogr.Feature(defn)
# 录入字段 (可选)
feature.SetField("ID", id)
feature.SetField("X", x)
feature.SetField("Y", y)
feature.SetField("Z", z)
# 创建 Geometry
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(x, y)
# Feature 设置 Geometry
feature.SetGeometry(geom)
# Layer 设置 Feature
layer.CreateFeature(feature)
# 释放内存
del ds, layer, feature, geom, driver, point
修改属性表
# 打开矢量文件, 并设置 update 为 1, 将其设置为可编辑状态
driver: ogr.Driver = ogr.GetDriverByName('ESRI Shapefile')
ds: ogr.DataSource = driver.Open(shp_file, update=1)
# 获取矢量文件元数据
layer: ogr.Layer = ds.GetLayer()
featureDefn: ogr.FeatureDefn = layer.GetLayerDefn()
feature: ogr.Feature = layer.GetNextFeature()

while (feature):
# 修改属性表对应字段属性值
feature.SetField(2, 1)
# 重写已存在 feature, 这一步至关重要
layer.SetFeature(feature)
feature = layer.GetNextFeature()

算法

点矢量文件反距离加权
from osgeo import gdal

# 点矢量文件生成栅格文件
gdal.Grid(raster, shp, format="GTiff",
outputType=gdal.GDT_Float32,
algorithm="invdist:power=2.0:smoothing=0.0:radius1=0.0:radius2=0.0:angle=0.0:max_points=0:min_points=100:nodata=0.0",
zfield="Z",
width=1650, height=740)
# gdal.Grid() 方法生成的栅格图像若转成 PNG 图像, 起始点从左下角, 极其奇葩
# 可使用 gdal.warp() 在同坐标下转换, 即可修正
warpOptions = gdal.WarpOptions(
srcSRS=srs, dstSRS=src, format='GTiff', cutlineDSName=mask, cropToCutline=True)
gdal.Warp(warp,
raster, options=warpOptions)