根据栅格数据的范围和像元大小生成等比例的矢量数据

news2024/9/23 19:25:29

为啥会有这么一个需求呢,后面要是继续写的话会详细说,首先是有一个栅格数据,比如这样的:

我的目标是这样的(矢量),

就是这样,上面的栅格数据像大小是2*2的,直接上代码:

string fileNameRaster = System.IO.Path.GetFileName(rasterPath);

IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();

string projectPath = System.IO.Path.GetDirectoryName(rasterPath);

IWorkspace rWorkspace = pWorkspaceFactory.OpenFromFile(projectPath, 0);

IRasterWorkspace pRasterWorkspace = rWorkspace as IRasterWorkspace;

IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(fileNameRaster);

IRasterLayer pRasterLayer = new RasterLayerClass();

pRasterLayer.CreateFromDataset(pRasterDataset);

IRaster pRaster = pRasterLayer.Raster;

IRasterProps pRasterProps = (IRasterProps)pRaster;

double xMin = pRasterProps.Extent.XMin;

double xMax = pRasterProps.Extent.XMax;

double yMin = pRasterProps.Extent.YMin;

double yMax = pRasterProps.Extent.YMax;

int dHeight = pRasterProps.Height;//当前栅格数据集的行数

int dWidth = pRasterProps.Width; //当前栅格数据集的列数

int count = dHeight * dWidth;//网格数据的总数

double dX = pRasterProps.MeanCellSize().X; //栅格的宽度

double dY = pRasterProps.MeanCellSize().Y; //栅格的高度

IRaster2 raster2 = pRaster as IRaster2;

object o = Type.Missing;

//这个CreateFeatureClass()方法就是创建一个featureclass,我就不贴代码了,网上很多

IFeatureClass pfeatureClass = CreateFeatureClass(System.IO.Path.GetDirectoryName(rasterPath), System.IO.Path.GetFileNameWithoutExtension(rasterPath));

if (pfeatureClass != null)

{

for (int i = 0; i < dHeight; i++)

{

double x0 = xMin;

double y0 = yMax - dY * i;

for (int j = 0; j < dWidth; j++)

{

IGeometry geo = new PolygonClass();

IPolygon polygon = new PolygonClass();

IGeometryCollection pGeomCol = polygon as IGeometryCollection;

IFeature pfeature = pfeatureClass.CreateFeature();

//xMIN, yMax,

IRing pRing = new RingClass();

IPointCollection pPointMulti = pRing as IPointCollection;

//左上

IPoint pPoint0 = new PointClass();

pPoint0.PutCoords(x0 + dX * j, y0);

pPointMulti.AddPoint(pPoint0, ref o, ref o);

//右上

IPoint pPoint1 = new PointClass();

pPoint1.PutCoords(x0 + dX * (j + 1), y0);

pPointMulti.AddPoint(pPoint1, ref o, ref o);

//右下

IPoint pPoint2 = new PointClass();

pPoint2.PutCoords(x0 + dX * (j + 1), y0 - dY);

pPointMulti.AddPoint(pPoint2, ref o, ref o);

//左下

IPoint pPoint3 = new PointClass();

pPoint3.PutCoords(x0 + dX * j, y0 - dY);

pPointMulti.AddPoint(pPoint3, ref o, ref o);

//关闭的点

IPoint pPoint4 = new PointClass();

pPoint4.PutCoords(x0 + dX * j, y0);

pPointMulti.AddPoint(pPoint4, ref o, ref o);

pRing.Close();

if (!pRing.IsExterior)

{

pRing.ReverseOrientation();

}

pGeomCol.AddGeometry(pRing, ref o, o);

ITopologicalOperator topo = polygon as ITopologicalOperator;

topo.Simplify();

geo = polygon;

int numIndex = pfeature.Fields.FindField("number");

int pixelIndex = pfeature.Fields.FindField("pixelValue");

int num = i * dWidth + j;

pfeature.set_Value(numIndex, num);

//0,列号,行号

// object value = raster2.GetPixelValue(0, j, i);

//pfeature.set_Value(pixelIndex, value);

pfeature.Shape = geo as IPolygon;

pfeature.Store();

}

}

}

大概的实现的思路就是以栅格数据的左上角为顶点,先创建一行的数据,因为像元大小为2,point0-point3就是4个角点,左上,右上,右下,左下,需要注意,第一点跟最后一个点必须是同个点,就是把这个图形包起来(我的理解),所有就有了point4,之后依次遍历,一行遍历之后,开始下一个循环,你的左上角的起始顶点变成了上个图形的左下角的坐标。再次循环就可以了,实现思路就是这样。

PS:网格多了程序很耗时。

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

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

相关文章

【JAVA程序设计】【C00109】基于SSM(非maven)的员工工资管理系统

基于SSM&#xff08;非maven&#xff09;的员工工资管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架非maven开发的企业工资管理系统共分为二个角色&#xff1a;系统管理员、员工 管理员角色包含以下功能&#xff1a; 系统后台登陆、管理员管理、员工信…

Linux基础命令-nice调整进程的优先级

文章目录 Nice 命令介绍 语法格式 常用参数 参考实例 1 调整bash的优先级为-10 2 调整脚本的优先级为6 3 调整指令的优先级 4 默认使用nice命令调整优先级 命令总结 Nice 命令介绍 nice命令的主要功能是用于调整进程的优先级&#xff0c;合理分配系统资源。Linux系…

torchaudio的I/O函数

info、load、save1.1 infotorchaudio.info(filepath: str, ...)Fetch meta data of an audio file. Refer to torchaudio.backend for the detail.返回音频文件的meta信息这里的meta元信息包括采样率、帧数、通道数、量化位数、音频格式info torchaudio.info(rE:\adins\data\2…

Java使用DFA算法实现敏感词过滤

1 前言敏感词过滤就是你在项目中输入某些字&#xff08;比如输入xxoo相关的文字时&#xff09;时要能检测出来&#xff0c;很多项目中都会有一个敏感词管理模块&#xff0c;在敏感词管理模块中你可以加入敏感词&#xff0c;然后根据加入的敏感词去过滤输入内容中的敏感词并进行…

测试软件5

一 css基础 css定义&#xff1a;可以设置网页中的样式&#xff0c;外观&#xff0c;美化 css中文名字&#xff1a;级联样式表&#xff0c;层叠样式表&#xff0c;样式表 二 css基础语法 1.style标签写在title标签后面 2.选择器{属性名1&#xff1a;属性值1&#xff1b;属性名…

ChatGPT最牛应用,让它帮你更新网站新闻吧!

谁能想到&#xff0c;ChatGPT火了&#xff01;既能对话入流&#xff0c;又能写诗歌论文、出面试题、编代码&#xff0c;甚至还通过了谷歌面试拿到L3工程师offer&#xff0c;放在一年之前&#xff0c;没人相信这是当前AI能够达到的水平。ChatGPT自面世以来&#xff0c;凭借其极为…

【数据结构初阶】手把手带你实现栈

前言 在进入数据结构初阶的学习之后&#xff0c;我们学习了顺序表和链表&#xff0c;当然栈也是一种特殊的数据结构&#xff0c;他的特点是后进先出。 栈的概念及结构 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定仅在表尾进行插入和删…

iptables的介绍

iptables简介 1、 什么是iptables&#xff1f; iptables是linux防火墙工作在用户空间的管理工具&#xff0c;是 netfilter/iptables IP信息包过滤系统的一部分&#xff0c;用来设置、维护和检查Linux内核的IP数据包过滤规则 2、 iptables特点 iptables是基于内核的防火墙&…

【pytorch 入门系列】02 手把手多分类从0到1

温故而知新&#xff0c;通过手把手写一个多分类任务来复习之前所学过的知识。 前置知识 factorize的妙用&#xff1a;把文本数据枚举化 labels, uniques pd.factorize([b, b, a, c, b]) labels,uniques(array([0, 0, 1, 2, 0]), array([‘b’, ‘a’, ‘c’], dtypeobject))…

【C++】-- 特殊类设计

对于类的思维境界提升&#xff0c;没有太大的实际意义&#xff0c;但是锻炼思想。 目录 单例模式 饿汉模式 懒汉模式 #&#xff1a;请设计一个类&#xff0c;不能被拷贝。 拷贝只会发生在两个场景中&#xff1a;拷贝构造函数赋值运算符重载因此想要让一个类禁止拷贝&#xf…

对称锥规划:对称锥的增广拉格朗日乘子法(Semi-Smooth Newton Method解无约束优化子问题)

文章目录对称锥规划&#xff1a;对称锥的增广拉格朗日乘子法&#xff08;Semi-Smooth Newton Method解无约束优化子问题&#xff09;对称锥的增广拉格朗日函数Semi-Smooth Newton Method半光滑牛顿法广义雅可比半光滑性半光滑牛顿算法参考文献对称锥规划&#xff1a;对称锥的增…

2023年最新阿里云服务器价格表出炉(精准收费标准及配置价格表)

阿里云在全球率先宣布了基于 Intel Ice Lake 处理器的第七代云服务器ECS&#xff0c;性能提升的同时降低了报价&#xff0c;性价比更高了。进入2023年阿里云服务器价格依然是大家关心的问题&#xff0c;事实上阿里云服务器租用价格和最新收费标准都可以通过官方云服务器计算器来…

【IoT】智能烟雾报警器

设计简介 硬件设计由AT89C51单片机、DS18B20温度传感器、4位共阳数码管、电源模块、报警模块、按键模块、MQ-2烟雾检测模块和ADC0832模数转换模块组成。 烟雾传感器MQ-2检测空气中的烟雾气体&#xff0c;通过ADC0832进行数据转换&#xff0c;经过单片机的运算处理后在数码管上…

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(上)

前言 HTML 是一切Web开发的基础&#xff0c;本文专门为小白整理&#xff0c;针对前端零基础的朋友们&#xff0c;手把手教你学习HTML&#xff0c;让你轻松迈入WEB开发的行列。 首先&#xff0c;感谢 橙子_ 在HTML学习以及本文编写过程中对我的帮助。 文章目录前言一.HTML简介1.…

Java使用不同方式获取两个集合List的交集、补集、并集(相加)、差集(相减)

1 明确概念首先知道几个单词的意思&#xff1a;并集 union交集 intersection补集 complement析取 disjunction减去 subtract1.1 并集对于两个给定集合A、B&#xff0c;由两个集合所有元素构成的集合&#xff0c;叫做A和B的并集。记作&#xff1a;AUB 读作“A并B”例&#…

微纳制造技术——基础知识

1.什么是直接带隙半导体和间接带隙半导体 导带底和价带顶处以同一K值&#xff0c;称为直接带隙半导体 导带底和价带顶不处在同一K值&#xff0c;称为间接带隙半导体 2.扩散和漂移的公式 3.三五族半导体的性质 1.high mobility 2.wide bandgap 3.direct bandgap 4.三五族…

SWM181 串口功能使用介绍

SWM181 串口功能使用介绍&#x1f4cc;SDK固件包&#xff1a;https://www.synwit.cn/kuhanshu_amp_licheng/✨注意新手谨慎选择作为入门单片机学习。&#x1f33c;开发板如下图&#xff1a; &#x1f4cb;SWM181描述上写了有4个串口&#xff0c;在数据手册上&#xff0c;将引脚…

教你如何搭建设备-巡检管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建设备-巡检管理。1.2、应用场景设备管理员进行制定设备巡检时间/内容计划、记录设备巡检信息、可以查看今日待巡检设备。2、设置方法2.1、表单搭建1&#xff09;新建表单【设备档案-履历表】&#xff0c;字段设置如下&#x…

activiti7执行流程详解

什么是工作流&#xff1f; 官方定义&#xff1a;工作流是将一组任务组织起来以完成某个经营过程&#xff1a;定义了任务的触发顺序和触发条件&#xff0c;每个任务可以由一个或多个软件系统完成&#xff0c;也可以由一个或一组人完成&#xff0c;还可以由一个或多个人与软件系统…

阿赵的MaxScript学习笔记分享八《文件操作》

大家好&#xff0c;我是阿赵。继续分享MaxScript学习笔记第八篇 。这一篇主要讲文件操作&#xff0c;包括文件的I/O和导入导出。 1、获得3DsMax指定的一些目录路径 如果在电脑上安装了3DsMax软件&#xff0c;那么在文档里面会有一个3dsMax的文件夹&#xff0c;里面有一些3dsMa…