使用gdal均匀筛选点矢量

使用gdal均匀筛选点矢量

作用:

通过计算各点之间的欧式距离,筛选出符合目标的、均匀发布在空间中的N个数据点。

效果示意图

运行环境

python 3.10
安装:tqdm、numpy和tqdm这三个库

完整代码

import numpy as np
from osgeo import ogr, osr
from tqdm import tqdm# 代码作用:通过计算各点之间的欧式距离,筛选出符合目标的、均匀发布在空间中的N个数据点。# 定义需要采样的个数
n_samples = 100
input_path = r"测试数据\村点.shp"
output_path = r"测试数据\samples.shp"# 1. 读取原始点数据
driver = ogr.GetDriverByName('ESRI Shapefile')
inds = driver.Open(input_path, 0)
layer = inds.GetLayer()# 2. 提取点坐标和属性
coords = []
attrs = []
for feature in layer:geom = feature.GetGeometryRef()coords.append((geom.GetX(), geom.GetY()))attrs.append([feature.GetField(i) for i in range(feature.GetFieldCount())])
coords = np.array(coords)
attrs = np.array(attrs)# 3. 定义距离函数
def distance(p1, p2):return np.sqrt(np.sum((p1 - p2)**2))# 4. 随机选择第一个点
idx = np.random.choice(coords.shape[0], 1)
samples = coords[idx]
sample_attrs = attrs[idx]# 5. 选择空间均衡的采样点
for _ in tqdm(range(n_samples - 1)):dists = np.array([np.min(np.array([distance(p, s) for s in samples])) for p in coords])idx = np.argmax(dists)samples = np.append(samples, [coords[idx]], axis=0)sample_attrs = np.append(sample_attrs, [attrs[idx]], axis=0)coords = np.delete(coords, idx, axis=0)attrs = np.delete(attrs, idx, axis=0)# 6. 将采样点转为gdal几何对象
out_samples = []
for sample in samples:point = ogr.Geometry(ogr.wkbPoint)point.AddPoint(sample[0], sample[1])out_samples.append(point)# 7. 创建新的矢量层并写入采样点
out_driver = ogr.GetDriverByName('ESRI Shapefile')
out_ds = out_driver.CreateDataSource(output_path)
out_layer = out_ds.CreateLayer('samples', layer.GetSpatialRef(), ogr.wkbPoint)# 添加属性字段
for i in range(len(layer.schema)):field_defn = layer.schema[i]out_layer.CreateField(field_defn)# 写入采样点要素
for i, sample in enumerate(out_samples):feature = ogr.Feature(out_layer.GetLayerDefn())feature.SetGeometry(sample)for j, attr in enumerate(sample_attrs[i]):feature.SetField(j, attr)out_layer.CreateFeature(feature)out_layer = None
out_ds = None

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[柏鹭杯 2021]试试大数据分解?

题目:(NSSCTF | 在线CTF平台) 题目就是如此,我没看到有5个不同的文本,其中最后一个文本以pem后缀,所以我们先来了解一下什么是pem格式。 PEM 格式 PEM格式通常用于数字证书认证机构(Certifica…

【MySQL】SQL优化

SQL优化 插入数据 insert 一次插入数据和批量插入数据 insert into tb_test (id, name) values (1,Tom); insert into tb_test (id, name) values (1,Tom),(2,Jack),(3,Jerry);优化方案: 手动控制事务,且按主键顺序插入。start transaction; insert …

我独自升级崛起怎么下载 一文分享我独自升级崛起游戏下载教程

我独自升级崛起怎么下载 一文分享我独自升级崛起游戏下载教程 我独自升级:崛起是一款由韩国漫画改编而成的热门多人网络在线联机游戏,这款游戏是一款的角色扮演类型游戏,游戏有着独一无二的剧情模式。小伙伴们在游戏中可以体验到独特的成长系…

哈希表详解

目录 1.unordered系列关联式容器 2.哈希 3.unordered_map和unordered_set哈希实现 4.代码总和 1.unordered系列关联式容器 1.1unordered系列 c98的STL里面提供了底层为红黑树的关联式容器(set和map); 但是在结点数目很多的时候查询的效率就低了, 所以c11里STL又提供了四个…

SFP、SFP+、SFP28 与 QSFP28 收发器之间的差异:兼容性和性能

近年来,网络技术发展迅速,因此,计算专业人员面临着越来越令人困惑的术语和缩写词。 管理数据中心时必须了解的一个关键领域是收发器,特别是 SFP (1550nm/1310nm)、SFP (850nm) 和 QSFP28 (4x25G) 之间的差异。 这些型号在兼容性方…

绿联 安装Tomcat服务器

绿联 安装Tomcat服务器以及反代说明 1、tomcat版本 镜像名,根据项目决定选择哪个版本以及对应的JDK tomcat8.x.x: tomcat:8-jdk8 tomcat:8-jdk11 tomcat:8-jdk17 tomcat:8-jdk21 tomcat9.x.x: tomcat:9-jdk8 tomcat:9-jdk11 tomcat:9-jdk17 …

扫描工具nmap

介绍 说到黑客,知识就是力量。您对目标系统或网络的了解越多,可用的选项就越多。因此,在进行任何利用尝试之前,必须进行适当的枚举。 假设我们获得了一个 IP(或多个 IP 地址)来执行安全审计。在我们做任何…

《自动机理论、语言和计算导论》阅读笔记:p261-p314

《自动机理论、语言和计算导论》学习第 10 天,p261-p314总结,总计 48 页。 一、技术总结 1.generating & reachable 2.Chomsky Normal Form(CNF) 乔姆斯基范式。 3.pumping lemma 泵作用引理。引理:引理是数学中为了取得某个更好的…

FloodFill算法简介(用BFS、DFS算法解决)

FloodFill算法中文名:洪水灌溉 FloodFill通常是这样一类问题,如下图: 负数表示凹陷的土地,正数表示凸起的土地,发洪水/下雨会淹没凹陷的地方 通常会问这几种问题: 1.被淹没的区域有几块 2.被淹没的最大…

Transformer中的位置编码详解

什么是位置编码 位置编码概述 位置编码的目的是为了补充序列的位置信息,这是因为自注意力机制本身不包含位置的概念(例如顺序信息)。位置编码的具体作用是,对于不同的输入序列成分,赋予其不同的位置标识,确…

❤️新版Linux零基础快速入门到精通——第三部分❤️

❤️新版Linux零基础快速入门到精通——第三部分❤️ 非科班的我!Ta!还是来了~~~3. Linux权限管控3.1 认知root用户3.1.1 Switch User——su3.1.2 sudo命令3.1.3 为普通用户配置sudo认证 3.2 用户和用户组3.2.1 用户、用户组3.2.2 用户组管理3.2.3 用户管…

人工智能大模型培训老师叶梓 探索知识库问答中的查询图生成:处理多跳复杂问题的新方法

在人工智能领域,基于知识库的问答(KBQA)技术正变得越来越重要。它使得机器能够理解自然语言问题,并从结构化的知识库中检索答案。然而,面对多跳复杂问题,传统的KBQA方法往往力不从心。近期,研究…