- 几何对象中线用QgsLineString进行封装
- 支持Z和M值,用于表示2维的,2. 5维的,3维的线
- 线是由一串点连接而成
创建线
- QgsLineString() #创建空的线
- QgsLineString(points: Iterable[QgsPoint]) #从一串QgsPoint创建
- QgsLineString(x: Iterable[float], y: Iterable[float], z:Iterable[float] = [], m: Iterable[float] = [], is25DType: bool =False) #直接从x,y坐标点创建线,比同时添加多个点的setPoints()方法或逐个添加点addVertex()方法要快。
- QgsLineString(p1: QgsPoint, p2: QgsPoint) #创建一个线段.
- QgsLineString(points: Iterable[QgsPointXY]) #从qgspointxy创建
- QgsLineString(segment: QgsLineSegment2D) #从线段创建
- QgsLineString(QgsLineString ) #复制一条linestring
import math
import random
from qgis.core import QgsVectorLayer, QgsFeature, QgsProject, QgsPoint, QgsLineString
from qgis.utils import iface
def getgtypes():
return 'point', 'linestring', 'polygon', 'multipoint', 'multilinestring', 'multipolygon'
# 快速显示一串几何对象,gtype 如果是默认的则根据geoms生成相应的类型
def showgeoms(geoms, name="tmp", gtype=None):
if gtype is None:
gtype = geoms[0].geometryType().lower()
if gtype not in getgtypes():
raise Exception('gtype should be one of :{' + ','.join(getgtypes()) + '}')
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()
1、从空对象创建线
def create_an_empty_line():
# 从空线添加点
l1 = QgsLineString() # 创建空的线
pts = [QgsPoint(x, math.cos(x) + (x % 3 - 1) * random.random() * 5) for x in range(100)]
l1.setPoints(pts)
showgeoms([l1], 'line1')
# 从linestring末尾追加一个点
l2 = QgsLineString(l1) # 复制一条线
l2.addVertex(QgsPoint(100, 9))
showgeoms([l2], 'line2')
return l2
2、直接从坐标点创建
def created_with_coordinate_points():
ptx=[i+random.random()-0.5 for i in range(100)]
pty=[math.cos(x)+(x%3-1)*random.random()*5 for x in range(100)]
l3=QgsLineString(ptx,pty)
showgeoms([l3])
return l3
访问节点
- l3. startPoint() #线的首结点
- l3.endPoint() #线的末结点
- I3. numPoints() #线的结点数量
- l3. pointN(0) #第1个结点 参 数要小于numPoints的值,超出会报错
- l3. pointN(-1) #最后一个结点
- l3. pointN(3) #第四个结点
- l3. points()) #得到所有的点
- showgeoms(13. points(),'pts') #把linestring的 点转化为点对象图层
- l3.xAt(7) ,l3.yAt(7) #第8个节点的横坐标和纵坐标以及zAt, mAt
def access_node(linestring):
l3 = linestring
print(l3.startPoint()) # 线的首结点
print(l3.endPoint()) # 线的末结点
print(l3.numPoints()) # 线的结点数量
print(l3.pointN(0)) # 第1个结点 参数要小于numPoints的值
print(l3.pointN(-1)) # 最后一个结点
print(l3.pointN(3)) # 第四个结点
print(l3.points()) # 得到所有的点
showgeoms(l3.points(), 'pts')
修改对象节点
- l4. setXAt(0,-2) # 修改第0个节点的x坐标
- l4.setYAt(2,-5) # 修改第3个节点的y坐标
...还有setZAt, setMAt
def modify_object_node():
ptx = [i + random.random() - 0.5 for i in range(100)]
pty = [math.cos(x) + (x % 3 - 1) * random.random() * 5 for x in range(100)]
l3 = QgsLineString(ptx, pty)
showgeoms(l3, 'pl3')
showgeoms([l3], 'l3')
l4 = QgsLineString(l3)
l4.setXAt(0, -2)
l4.setYAt(2, -5)
showgeoms([l4], 'l4')
插入节点
idx=QgsVertexld(0,0,1) #第2个节点
l4. .insertVertex( idx, QgsPoint(2,7))
def insert_node():
ptx = [i + random.random() - 0.5 for i in range(100)]
pty = [math.cos(x) + (x % 3 - 1) * random.random() * 5 for x in range(100)]
l3 = QgsLineString(ptx, pty)
showgeoms(l3, 'pl3')
showgeoms([l3], 'l3')
l4 = QgsLineString(l3)
idx = QgsVertexId(0, 0, 1) # 第2个节点
l4.insertVertex(idx, QgsPoint(2, 7))
showgeoms([l4], 'l4')