线对象QgsLineString

  • 几何对象中线用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')

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用QGIS的C++代码示例,可以根据给定的点宽度绘制出光滑的线: ```cpp #include <gsPointXY> #include <QgsGeometry> <QgsFeature> #include <Qgs> #include <QgsVectorLayer> #include <QgsMapCanvas> void drawSmoothRoad(const QVector<QgsPointXY>& points, double dWidth) { // 创建一个多边形对象 QgsGeometry* geometry = new QgsGeometry(QgsWkbTypes::PolygonGeometry); // 构造多边形的边界点 QVector<QgsPointXY> boundaryPoints; for (int i = 0; i < points.size(); ++i) { QgsPointXY p1 = points[i]; QgsPointXY p2 = points[(i + 1) % points.size()]; // 计算路的边界点 QgsPointXY v = p2 - p1; v.normalize(); QgsPointXY normal(-v.y(), v.x()); QgsPointXY offset1 = p1 + normal * (dWidth / 2.0); QgsPointXY offset2 = p2 + normal * (dWidth / 2.0); boundaryPoints << offset1; boundaryPoints << offset2; } // 添加边界点到多边形对象 QgsPolygon polygon; polygon.setExteriorRing(QgsLineString(boundaryPoints)); geometry->convertFrom(polygon); // 创建一个QgsFeature对象,并将多边形对象添加到其中 QgsFields fields; QgsFeature feature(fields); feature.setGeometry(geometry); // 将feature添加到图层中 QgsVectorLayer* layer = new QgsVectorLayer("Polygon", "Road", "memory"); layer->dataProvider()->addFeatures(QList<QgsFeature>() << feature); // 创建一个地图画布,并在其中添加图层 QgsMapCanvas canvas; canvas.setDestinationCrs(layer->crs()); canvas.setLayers(QList<QgsMapLayer*>() << layer); canvas.zoomToFullExtent(); canvas.refresh(); } int main() { // 示例用的点坐标和宽度 QVector<QgsPointXY> points; points << QgsPointXY(0, 0); points << QgsPointXY(0, 10); points << QgsPointXY(10, 10); points << QgsPointXY(10, 0); double width = 2.0; // 绘制光滑路线 drawSmoothRoad(points, width); return 0; } ``` 请注意,上面的代码仅为示例,你可能需要根据你的实际需求进行适当的修改。此外,确保你已经正确安装了QGIS库并将其包含到你的项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值