基于gdal的格网插值
格网插值就是使用离散的数据点创建一个栅格图像的过程。通常情况下,有一系列研究区域的离散点,如果我们想将这些点转换为规则的网格数据来进行进一步的处理,或者和其他网格数据进行合并 等处理,就需要使用格网插值算法。
我们的应用是在海洋数据的处理的处理上,像海洋温度数据,在海洋与陆地的接触部分,数据会有缺失 ,对这些数据缺失的点就需要进行数据的插值处理,才能进行接下来其他的处理,所以插值处理尤为重要。
在gdal库中有对应各个插值算法的算法参数结构体,我一直用的是反距离权重插值算法(GDALGridInverseDistanceToAPowerOptions),这个根据你应用的数据可以使用不同的算法,gdal中插值的算伐有四种。下面是数据插值处理的代码。
#include <QCoreApplication>
- #include <gdal_priv.h>
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include <gdalgrid.h>
- #include <QDebug>
- using namespace std;
- using std::string; //使用string对象
- using std::vector; //使用vector
- //自己定义的split函数,作用相当于boost库的split函数
- void Split(const std::string& src, const std::string& separator, std::vector<std::string>& dest) //字符串分割到数组
- {
- //参数1:要分割的字符串;参数2:作为分隔符的字符;参数3:存放分割后的字符串的vector向量
- string str = src;
- string substring;
- string::size_type start = 0, index;
- dest.clear();
- index = str.find_first_of(separator,start);
- do
- {
- if (index != string::npos)
- {
- substring = str.substr(start,index-start );
- dest.push_back(substring);
- start =index+separator.size();
- index = str.find(separator,start);
- if (start == string::npos) break;
- }
- }while(index != string::npos);
- //the last part
- substring = str.substr(start);
- dest.push_back(substring);
- }
- void DpdInterpolation(const char*pszPoints,const char*pszDst)
- {
- //const char*pszPoints = "";//目标文件
- //const char*pszDst = "E:\\odp_workplace\\odp_data\\testdata\\interpolation\\Dpdinterpolation_test.grd";//生成的结果文件
- //设置输出图像的分辨率为0.5
- double pixResoultion = 0.5;
- //计算离散点XY坐标的最大最小值,用于确定输出图像的大小
- double dfXMin;
- double dfXMax;
- double dfYMin;
- double dfYMax;
- double dfZMin;
- double dfZMax;
- double tmpX;
- double tmpY;
- double tmpZ;
- int i = 0;
- int nPoints = 125;//设置离散点的个数
- double * padfX = new double[nPoints];
- double * padfY = new double[nPoints];
- double * padfZ = new double[nPoints];
- //将文本文件读入数组
- ifstream ifile(pszPoints,ios::in);
- string strBuf;
- while(getline(ifile,strBuf))
- {
- vector<string> vstr;
- Split(strBuf,",",vstr);
- tmpX = atof(vstr[0].c_str());
- tmpY = atof(vstr[1].c_str());
- tmpZ = atof(vstr[2].c_str());
- qDebug()<<tmpX<<tmpY<<tmpZ<<endl;
- padfX[i] = tmpX;
- padfY[i] = tmpY;
- padfZ[i] = tmpZ;
- if(i==0)
- {
- dfXMin = tmpX;
- dfXMax = tmpX;
- dfYMin = tmpY;
- dfYMax = tmpY;
- dfZMin = tmpZ;
- dfZMax = tmpZ;
- }
- dfXMin = (tmpX<dfXMin) ? tmpX : dfXMin;
- dfXMax = (tmpX>dfXMax) ? tmpX : dfXMax;
- dfYMin = (tmpY<dfYMin) ? tmpY : dfYMin;
- dfYMax = (tmpY>dfYMax) ? tmpY : dfYMax;
- dfZMin = (tmpZ<dfZMin) ? tmpZ : dfZMin;
- dfZMax = (tmpZ>dfZMax) ? tmpZ : dfZMax;
- i++;
- }
- ifile.close();
- //计算图像大小
- int nXSize = (dfXMax-dfXMin)/pixResoultion;
- int nYSize = (dfYMax-dfYMin)/pixResoultion;
- //构造插值算法参数并设置参数值
- GDALGridInverseDistanceToAPowerOptions *poOptions = new GDALGridInverseDistanceToAPowerOptions();
- poOptions->dfPower = 2;//设置权重指数p
- poOptions->dfRadius1 = 20;//设置搜索椭圆第一半径
- poOptions->dfRadius2 = 15;//设置搜索椭圆第二半径
- char *pData = new char[nXSize*nYSize];
- GDALGridCreate(GGA_InverseDistanceToAPower,poOptions,nPoints,padfX,padfY,padfZ,dfXMin,dfXMax,dfYMin,dfYMax,nXSize,nYSize,GDT_Float32,pData,NULL,NULL);
- delete poOptions;
- //创建新的数据集
- GDALDriver *pDriver = GetGDALDriverManager()->GetDriverByName("GS7BG");//GSAG GSBG GS7BG
- GDALDataset *poDataset = pDriver->Create(pszDst,nXSize,nYSize,1,GDT_Float32,NULL);
- double adfGeoTransform[6] = {dfXMin,pixResoultion,0,dfYMax,0,-pixResoultion};
- poDataset->SetGeoTransform(adfGeoTransform);
- //写入数据
- poDataset->RasterIO(GF_Write,0,0,nXSize,nYSize,pData,nXSize,nYSize,GDT_Float32,1,0,0,0,0);
- delete []pData;
- GDALClose(poDataset);
- }
- 要使用这段代码就得配置好环境,我的编译环境为qt5.11.2+vs2017+gdal
基于gdal的格网插值的更多相关文章
- 基于GDAL的栅格图像空间插值预处理
转自 基于GDAL的栅格图像空间插值预处理——C语言版 基于GDAL的栅格图像预处理 前言 栅格数据和矢量数据构成空间数据的主要来源,怎样以开源方式读取并处理这些空间数据?目前有多种开源支持包,这里只 ...
- BootStrap入门教程 (一) :手脚架Scaffolding(全局样式(Global Style),格网系统(Grid System),流式格网(Fluid grid System),自定义(Customing),布局(Layouts))
2011年,twitter的“一小撮”工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用.优雅.灵活.可扩展的前端工具集--BootStrap.Bootstrap由MARK ...
- WorldWind源码剖析系列:经纬度格网类LatLongGrid
经纬度格网类LatLongGrid继承自可渲染对象类RenderableObject,是WorldWind中用来在星球外表绘制经纬度格网的封装类.其类图如下所示. 绘制经纬网格的主体函数为Render ...
- 关于基于GDAL库QT软件平台下C++语言开发使用说明
背景前提 地理空间数据抽象库(GDAL)是一个用于读取和编写栅格和矢量地理空间数据格式的计算机软件库,由开源地理空间基金会在许可的X / MIT风格免费软件许可下发布. 作为一个库,它为调用应用程序提 ...
- 基于GDAL的遥感影像显示(C#版)
基于GDAL的遥感影像显示(C#版) - 菜菜的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/RSyaoxin/article/details/9220735
- GIS可视化——热点格网图
一.简介 原理:按照格网大小将区域进行划分,由一个矩形格网替代当前范围内的数据,由格网中心数字代替格网的权重(可以为格网中数据的数量,数据某权重的平均值.最大值.最小值等), 由格网之间颜色的不同表达 ...
- Arcgis CreateFishnet工具,生成到FileGDB中要素类的格网大小不一致
我的第一篇博客!哈哈 最近在做一些关于创建渔网的工作,发现一些问题,做个总结. 1.问题描述:如图1,设置好渔网的必要参数,输出目录为gdb里的矢量图层,(行列数比较大,渔网的地理范围较小),输出的格 ...
- 基于frp的内网穿透实例4-为本地的web服务实现HTTPS访问
原文地址:https://wuter.cn/1932.html/ 一.想要实现的功能 目前已经实现将本地的web服务暴露到公网,现想要实现https访问.(前提:已经有相应的证书文件,如果没有就去申请 ...
- 后渗透阶段之基于MSF的内网主机探测
当我们通过代理可以进入某内网,需要对内网主机的服务进行探测.我们就可以使用MSF里面的内网主机探测模块了. 在这之前,先修改 /etc/proxychains.conf ,加入我们的代理. 然后 pr ...
随机推荐
- golang中的defer
1.defer的作用 defer 语句会将函数推迟到外层函数返回之后执行. 即defer后面的函数在defer语句所在的函数执行结束的时候会被调用 2.defer的语法 defer后面必须是函数调用语 ...
- Storm入门(十)Twitter Storm: Transactional Topolgoy简介
作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/736/twitter-stor ...
- 【spring源码分析】IOC容器初始化(总结)
前言:在经过前面十二篇文章的分析,对bean的加载流程大致梳理清楚了.因为内容过多,因此需要进行一个小总结. 经过前面十二篇文章的漫长分析,终于将xml配置文件中的bean,转换成我们实际所需要的真正 ...
- 浏览器F12 waterfall性能检测详解详解
Queueing 是排队的意思 Stalled 是阻塞 请求访问该URL的主机是有并发和连接数限制的,必须要等之前的执行才能执行之后的,这段时间的耗时 DNS Lookup 是指域名解析所耗时间 I ...
- 难以理解的AQS(上)
在一篇博客中,我们看了下CopyOnWriteArrayList的源码,不是很难,里面用到了一个可重入的排他锁: ReentrantLock,这东西看上去和Synchronized差不多,但是和Syn ...
- 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识
什么是REST REST 是 Representational State Transfer 的缩写. 它是一种架构的风格, 这种风格基于一套预定义的规则, 这些规则描述了网络资源是如何定义和寻址的. ...
- springcloud~配置中心实例搭建
server端 build.gradle相关 dependencies { compile('org.springframework.cloud:spring-cloud-config-server' ...
- Python:说说字典和散列表,散列冲突的解决原理
散列表 Python 用散列表来实现 dict.散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组).在一般书中,散列表里的单元通常叫做表元(bucket).在 dict 的散列表当中,每个键 ...
- SOFARPC源码解析-搭建环境
文档地址:https://www.sofastack.tech 简介摘要 SOFA 是蚂蚁金服自主研发的金融级分布式中间件,包含构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服 ...
- 机器学习之logistic回归算法与代码实现原理
Logistic回归算法原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10033567.html ...