几何对象是构成要素的必要条件
import numpy as np
def getgtypes():
return 'point', 'linestring', 'polygon', 'multipoint', 'multilinestring', 'multipolygon'
def showgeoms(geoms, name="tmp", gtype=None):
# 快速显示一串几何对象,gtype 如果是默认的则根据geoms生成相应的类型
if gtype is None:
gtype = geoms[0].constGet().geometryType() if isinstance(geoms[0], QgsGeometry) else geoms[0].geometryType()
gtype = gtype.lower()
if gtype not in getgtypes():
raise Exception('gtype should be one of :{' + ','.join(getgtypes()) + '}' + 'input gtype is {}'.format(gtype))
vl = QgsVectorLayer(gtype, name, "memory")
pr = vl.dataProvider()
feats = []
for geom in geoms:
feat = QgsFeature()
feat.setGeometry(geom)
feats.append(feat)
pr.addFeatures(feats)
QgsProject.instance().addMapLayer(vl)
iface.zoomFull()
通过QgsFeature的setGeometry()方法进行几何对象的绑定
setGeometry()方法接收两种类型:
- QgsGeometry对象
- QgsAbstractGeometry的子类
(QgsPoint, QgsLineString, QgsPolygon)
对于第二种类型,其实是:setGeometry(QgsGeometry(QgsAbstractGeometry的子类))
def p3():
feat1 = QgsFeature() # 创建一个空的地理要素对象
p1 = QgsPoint(3, 4) # 创建一个二维点对象
feat1.setGeometry(p1) # 将之前创建的点"p1"设置为"feat1"的几何信息。
feat2 = QgsFeature()
p2 = p1.clone() # 创建一个"p1"的克隆对象
gp2 = QgsGeometry(p2) # 将克隆的点"p2"转换为一个几何对象"gp2"
feat2.setGeometry(gp2)
print(feat1.geometry(), feat2.geometry())
得到具体的几何类型
很多情况下,在处理数据时,对几何对象数据的访问是来自于图层→要素>几何对象的顺序,得到的一般也是几何对象QgsGeometry对象,要得到具体的类型:
- constGet() # 得到仅可读的具体类别的几何对象,开销小
- get() # 得到引用,修改得到的对象会修改几何对象,开销大
def p4():
line = QgsLineString(range(10), range(10)) # 创建一个包含10个点线性几何对象
gl = QgsGeometry(line) # 将线性几何对象"line"转换为一个QgsGeometry对象
print(gl)
l1 = gl.constGet() # 得到仅可读的具体几何对象
print(l1)
l2 = gl.get() # 得到引用,修改l2会修改几何对象
print(l2)
获取QgsGeometry对象的具体类型
def p5():
l = QgsLineString(range(10), range(10))
gl = QgsGeometry(l)
print(QgsWkbTypes.geometryDisplayString(gl.type())) # 打印几何对象类型的显示字符串,即可读性更好的类型名称
print(gl.constGet().geometryType()) # 获取只读的几何对象
print(gl.wkbType()) # 打印几何对象的WKB(Well-Known Binary)类型代码
几何对象的一些属性
boundingBox() 外接矩形轮廓 centroid() 中心点 buffer(distance,segments) 缓冲区
def p6():
x = np.random.random(100) * 100
y = np.random.random(100) * 100
pts = QgsLineString(x, y)
mp = QgsMultiPoint()
_ = [mp.addGeometry(pt) for pt in pts]
gmp = QgsGeometry(mp)
showgeoms([mp], 'multipoint')
# 计算外接矩形
bbx = gmp.boundingBox()
print('bbox is:', bbx)
gbbx = QgsGeometry.fromRect(bbx)
print('gbbox is:', gbbx)
showgeoms([gbbx], 'gbox')
# 计算中心点
cd = gmp.centroid()
showgeoms([cd], 'centroid')
# 计算缓冲区
bpg1 = gbbx.buffer(10, 1) # 缓冲区半径为10,平滑度为1
showgeoms([bpg1], 'buffer10_1')
showgeoms(bpg1.get().exteriorRing(), 'buffer10_1') # 显示了缓冲区的外部环
bpg10 = gbbx.buffer(10, 10)
showgeoms([bpg10], 'buffer10_10')
showgeoms(bpg10.get().exteriorRing(), 'buffer10_10')
return gmp
Delaunay三角
泰森多边形 voronoi
def p10():
x = np.random.random(100) * 100
y = np.random.random(100) * 100
pts = QgsLineString(x, y)
mp = QgsMultiPoint()
_ = [mp.addGeometry(pt) for pt in pts.points()]
dl = QgsGeometry(mp.clone()).delaunayTriangulation(0.1) # Delaunay三角剖分
mpoly = dl.constGet()
showgeoms(mpoly, 'Delaunay三角剖分')
# bbox=QgsGeometry.fromRect(mp.boundingBox())
# bbb=bbox.buffer(20,10)
vd = QgsGeometry(mp.clone()).voronoiDiagram() # extent=bbb)#泰森多边形voronoiDiagram
mpoly2 = vd.constGet()
showgeoms(mpoly2, 'Voronoi韦恩图')
showgeoms([mp], '点集')
return dl, vd, mp
参考:pyqgis2.06几何对象操作(一)