几何对象操作(一)

news2025/1/16 2:55:02

几何对象是构成要素的必要条件

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几何对象操作(一)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/922000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《中国综合算力指数》发布,我国算力规模居全球第二,中创积极响应东数西算政策

算力通俗地说就是计算能力,是数据中心处理数据并输出结果的能力。2023中国算力大会于近期在宁夏银川开幕。工业和信息化部负责人在会上透露,我国算力产业已初具规模。 截至目前,全国在用数据中心机架总规模超过760万标准机架,算力…

【PHP】错误处理

文章目录 错误处理错误分类错误代号错误触发 错误处理 错误处理:指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。 错误分类 1)语法错误:用户…

IDEA配置JDK8、JDK17中文文档

1.获取对应的chm文件,如 JAVA_API_1.7中文.chm。 2.使用CHMDecoder工具,下载链接 https://download.cnet.com/CHM-Decoder/3000-20412_4-10390773.html 这种也有在线的,转化就行(转化后是一个文件夹) 如果是用的我说的这个工具…

I2C设备驱动挂载

一、 概述: I2C工作原理: I2C总线标准的两根传输线,SDA是数据线,Scl是时钟线,当SCL为高,SDA由高到低时,发送启动信息,发送9个脉冲,1-7是地址,8是读写控制位&a…

GEE/PIE 遥感大数据处理与典型案例

查看原文>>>【399三天】GEE/PIE遥感大数据处理与典型案例实践 随着航空、航天、近地空间等多个遥感平台的不断发展,近年来遥感技术突飞猛进。由此,遥感数据的空间、时间、光谱分辨率不断提高,数据量也大幅增长,使其越来…

FPGA GTX全网最细讲解,aurora 8b/10b协议,OV5640摄像头视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX 接收接口GTX IP核调用和使用 4、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX aurora 8b/10b数据对…

深入Java中的观察者模式

观察者模式是软件开发中常用的一种设计模式,它通过定义一对多的依赖关系,使得一个对象(主题)的状态变化可以通知多个其他对象(观察者)。 这种模式的优点是解耦和增加扩展性,用于实现对象之间的…

iptables的使用规则

环境中为了安全要限制swagger的访问,最简单的方式是通过iptables防火墙设置规则限制。 在测试服务器中设置访问swagger-ui.html显示如下,区分大小写: iptables设置限制访问9783端口的swagger字段的请求: iptables -A INPUT -p t…

Spring 容器启动耗时统计

为了了解 Spring 为什么会启动那么久,于是看了看怎么统计一下加载 Bean 的耗时。 极简版 几行代码搞定。 import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;import java.util.HashMap; imp…

【科研】-- 如何将Endnote中参考文献格式插入到Word?

文章目录 如何将Endnote中参考文献格式插入到Word? 如何将Endnote中参考文献格式插入到Word? 1、首先确保Endnote和Word安装正确,正常可以从学校官网中下载到正版软件,下载后在word栏目中会出现EndNote的标签; 2、可…

[CVPR 2023]PyramidFlow-训练并推理-附bug调试

CVPR2023-PyramidFlow-zero shot异常检测网络 代码调试记录 一.论文以及开源代码二.前期代码准备三.环境配置四.bug调试num_samples should be a positive integer value, but got num_samples0AttributeError: Cant pickle local object fix_randseed.<locals>.seed_wor…

C++信息学奥赛1136:密码翻译

#include <iostream> #include <string> using namespace std;int main() {string arr;getline(cin, arr); // 输入字符串&#xff0c;包括空格for (int i 0; i < arr.length(); i) {char a arr[i] 1; // 字符加1if (arr[i] z) {a a; // 如果当前字符是…

springboot 基于JAVA的动漫周边商城的设计与实现64n21

动漫周边商城分为二个模块&#xff0c;分别是管理员功能模块和用户功能模块。管理员功能模块包括&#xff1a;文章资讯、文章类型、动漫活动、动漫商品功能&#xff0c;用户功能模块包括&#xff1a;文章资讯、动漫活动、动漫商品、购物车&#xff0c;传统的管理方式对时间、地…

PyTorch深度学习实战(13)——可视化神经网络中间层输出

PyTorch深度学习实战&#xff08;13&#xff09;——可视化神经网络中间层输出 0. 前言1. 可视化特征学习的结果2. 可视化第一个卷积层的输出3. 可视化不同网络层的特征图小结系列链接 0. 前言 随着深度学习的快速发展&#xff0c;神经网络已成为解决各种复杂任务的重要工具。…

day 38 | ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

518. 零钱兑换 II 这道题就是完全背包问题&#xff0c;因为可以选择的数量是无限的。所以第二层的遍历顺序就是从前往后。 因为是次数问题&#xff0c;递推公式是 的&#xff0c;初值应该设定为dp【0】 1&#xff0c;否则无法进行累加。 func change(amount int, coins []i…

Python编程基础-基本语法II

循环语句 for()语句 可以遍历任何序列的项目&#xff0c;如一个列表、元组或者一个字符串 格式&#xff1a; for 循环索引值 in 序列 循环体 #for循环把字符串中字符遍历出来 for letter in Python:print ( 当前字母 :, letter )#通过索引循环 fruits [banana, apple, m…

百度地图:设置复杂的自定义覆盖物,添加自定义覆盖物ComplexCustomOverlay

// 设置复杂的自定义覆盖物 setComplexCustomOverlay({coordinate,icon 1,label,contentHTML, }) {var mp this.map;let _BMAP this.data.type 3 ? BMapGL : BMap;// 自定义覆盖物----------------------------------------function ComplexCustomOverlay({point,icon,lab…

【全站最全】被苹果、谷歌和Microsoft停产的产品(一)

目录 ​编辑 2025 Skype for Business 2023 Cortana Google Domains Google Optimize Google Universal Analytics YouTube Stories Grasshopper Google Currents (2019) Google Stadia 2022 YouTube Originals Google OnHub Atom Google Surveys Apple Watc…

【3dsmax】练习——制作碗椅

目录 目标 步骤 一、制作主体部分 二、制作靠垫部分 三、制作支架部分 目标 制作如下图所示的碗椅 步骤 一、制作主体部分 1. 首先创建一个球体 2. 转换为可编辑多边形&#xff0c;然后切换到边层级&#xff0c;选中球体上部的所有边&#xff0c;然后删除 3. 通过“壳…

Linux下的系统编程——gdb调试工具

前言&#xff1a; 程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪。到目前为止我们的调试手段只有一种∶根据程序执行时的出错现象假设错误原因﹐然后在代码中适当的位置插入printf﹐执行程序并分析打印结果﹐如果结果和预期的一样﹐就基本上证明了自己假设…