通过泰森多边形划分覆盖区域

2023-10-24 07:52

本文主要是介绍通过泰森多边形划分覆盖区域,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

泰森多边形(Thiessen Polygon)法
泰森多边形又叫冯洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是一组由连接两邻点线段的垂直平分线组成的连续多边形。一个泰森多边形内的任一点到构成该多边形的控制点的距离小于到其他多边形控制点的距离。

1 原理
在开展流域水文分析时,往往流域范围仅有少量雨量站,为较为准确地将雨量站点实际观测的降雨量反应到区域或子流域上,需要进行数据的邻近分析,而泰森多边形方法被广泛应用与计算流域平均面雨量。
流域上各点的雨量用离该点最近雨量站的降雨量代表。用泰森多边形法计算流域的平均降雨量,是以各雨量站之间连线的垂直平分线,把流域划分为若干个多边形,然后以各个多边形的面积为权数,计算各站雨量的加权平均值,并把它作为流域的平均降雨量,一般来说结果比单纯算术平均法更为精确。

泰森多边形法特点:

每个泰森多边形内仅含有一个离散点数据
泰森多边形内的点到相应离散点的距离最近
位于泰森多边形边上的点到其两边的离散点的距离相等
面雨量计算方法:

a.先计算每个泰森多形内的平均雨量,就是该多边形内的雨量站雨量乘以权重,权重即该多边形面积值除以流域面积。
b.把所有多边形内的平均雨量相加,再除以多边形个数即是结果。
2 操作步骤
1.首先,在ArcMap中导入站点.shp(含降雨量数据)和流域边界.shp。需要注意的是,二者均为shp矢量数据,如下图所示。

2.接下来,利用ArcToolbox工具中的Create Thiessen Polygons工具(Toolboxes → Analysis Tools → Proximity → Create ThiessenPolygons)进行泰森多边形的创建。

点击Create Thiessen Polygons弹出窗口后所做的参数设置如下图所示,在Input Features中输入RainfallStation数据,在Output Features Class中自定义输出路径(一般选择之前已经定义好的默认路径),在Output Fields (optional)中选择All(即输出所有属性字段)。

【另】报错
ERROR:Input RainfallStation does not hace OIDs.
需要进行一步操作,先给降水数据表添加object_ID字段!!!

实现方法1:添加新字段

操作步骤如下:在属性表中,如果没有 Object ID 字段,可以添加一个新字段。

右键单击内容列表中的表或图层,然后选择打开属性表。

单击表窗口中的表选项按钮 表选项。
即使您未处于编辑会话中,也可以进行计算;但在这种情况下无法撤消计算结果。

单击添加字段。

输入字段的名称。

单击类型箭头,然后单击字段类型。

根据需要设置任何其他字段属性。

单击确定。

**实现方法2:**将数据导出为.shp文件,会自动添加Object ID 字段。

3.设置Create Thiessen Polygons里的Environments

输入界面设置完成后进行环境变量设置,选择Create Thiessen Polygons窗口下面的【Environments】按钮,进入环境设置窗口,设置Output Coordinate System,选择Same as Input,也可以选择与untitled_poly保持一致的坐标系,不过选择与与untitled_poly保持一致的坐标系很有可能生不成泰森多边形,因此可以先选择与输入一致的坐标系,后面需要修改坐标系的时候再修改一下就可以了。
然后对【Processing Extent】进行设置,设置生成泰森多边形的四周边界,此处选择Same as Layer untitled_poly,其余保持默认。如图所示:

以上需要设置的地方都设置完成后,点击OK,在Create Thiessen Polygons窗口再点击OK,则生成的泰森多边形如图所示:

4.现在生成的泰森多边形是一个将untitled_poly流域包含在内的大四边形,不能直接用于untitled_poly流域的面雨量计算,因此需要按照untitled_poly流域的形状对新生成的泰森多边形数据进行裁剪。
采用ArcToolbox工具中的Clip工具(Toolboxes → Analysis Tools → Extract → Clip)进行裁剪,在弹出的窗口中如下图进行设置:单位选择Meters

点击OK后,裁剪后得到的图如下图所示:

5.接下来计算裁剪后生成的每一个多边形的面积,打开裁剪后的Rainfall_Station_CreateThies_Clip数据的属性表,并添加Area字段,并计算面积。
添加面积字段方法:单击Table Options → Add Field…,添加面积字段后,右击Area字段,点击Calculate Geometry…,然后按雨量站名称类别显示如下图所示:

各子区域面积如下:

【另】出错

【另】出错长精度
可选择单位为【m】或【km】。

6.然后将属性表中所有数据全部选中,右击如图所示位置属性列表条件field——几何计算——导出dbf。

点击Copy Selected,粘贴到excel表格中进行面积权重的计算,最后根据各雨量站点所测的降雨量进行加权平均,就可以计算出untitled_poly流域的降雨量了。计算结果如图所示:

另:利用MATLAB计算面降水量

clc
close all
clear
load(‘P.mat’)
load(‘areaRatio.mat’)
% 求各站点年平均降水量
% ------------------------------------------------------------------
% 按年划分降水
PAnnual = cell(nStation, 1); % zeros(nyear,365);
PAnnually = zeros(nStation,nYear);
PAveAnnual = zeros(1,nStation);
% 按月划分降水
PMonth = cell(nStation,2); % 元胞数组(月降水数据)
PAveMonth = zeros(nStation,12); % 元胞数组(月平均降水)
for in=1:nStation
PAnnual{in,1} = year_data_simple( yearStart, yearEnd, P(:,in));
PAnnually(in,:) = sum(PAnnual{in,1},2)';
PAveAnnual(1,in) = mean( sum( PAnnual{in,1}, 2) ); % 多年平均降水

 PMonth{in,1} = month_data_simple( yearStart, yearEnd, P(:,in));PMonth{in,2} = sum( PMonth{in,1}, 2 );tempP = reshape( PMonth{in,2}, 12, nYear);PAveMonth(in,:) = mean(tempP,2)';

end
% 计算面降水量:各月降水占比和年降水量变化
PArea = sum (PAveMonth.*areaRatio, 1);
PAreaYear = sum (PAnnually.*areaRatio, 1);

这篇关于通过泰森多边形划分覆盖区域的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/273783

相关文章

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

POJ3041 最小顶点覆盖

N*N的矩阵,有些格子有物体,每次消除一行或一列,最少要几次消灭完。 行i - >列j 连边,表示(i,j)处有物体,即 边表示 物体。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;impo

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户