格网插值就是使用离散的数据点创建一个栅格图像的过程。通常情况下,有一系列研究区域的离散点,如果我们想将这些点转换为规则的网格数据来进行进一步的处理,或者和其他网格数据进行合并 等处理,就需要使用格网插值算法。

我们的应用是在海洋数据的处理的处理上,像海洋温度数据,在海洋与陆地的接触部分,数据会有缺失 ,对这些数据缺失的点就需要进行数据的插值处理,才能进行接下来其他的处理,所以插值处理尤为重要。

在gdal库中有对应各个插值算法的算法参数结构体,我一直用的是反距离权重插值算法(GDALGridInverseDistanceToAPowerOptions),这个根据你应用的数据可以使用不同的算法,gdal中插值的算伐有四种。下面是数据插值处理的代码。

#include <QCoreApplication>

  1. #include <gdal_priv.h>
  1. #include <iostream>
  1. #include <fstream>
  1. #include <string>
  1. #include <vector>
  1. #include <gdalgrid.h>
  1. #include <QDebug>
  1. using namespace std;
  1. using std::string; //使用string对象
  1. using std::vector; //使用vector


  1. //自己定义的split函数,作用相当于boost库的split函数
  1. void Split(const std::string& src, const std::string& separator, std::vector<std::string>& dest) //字符串分割到数组
  1. {

  1. //参数1:要分割的字符串;参数2:作为分隔符的字符;参数3:存放分割后的字符串的vector向量

  1. string str = src;
  1. string substring;
  1. string::size_type start = 0, index;
  1. dest.clear();
  1. index = str.find_first_of(separator,start);
  1. do
  1. {
  1. if (index != string::npos)
  1. {
  1. substring = str.substr(start,index-start );
  1. dest.push_back(substring);
  1. start =index+separator.size();
  1. index = str.find(separator,start);
  1. if (start == string::npos) break;
  1. }
  1. }while(index != string::npos);

  1. //the last part
  1. substring = str.substr(start);
  1. dest.push_back(substring);
  1. }

  1. void DpdInterpolation(const char*pszPoints,const char*pszDst)
  1. {
  1. //const char*pszPoints = "";//目标文件
  1. //const char*pszDst = "E:\\odp_workplace\\odp_data\\testdata\\interpolation\\Dpdinterpolation_test.grd";//生成的结果文件

  1. //设置输出图像的分辨率为0.5
  1. double pixResoultion = 0.5;

  1. //计算离散点XY坐标的最大最小值,用于确定输出图像的大小
  1. double dfXMin;
  1. double dfXMax;
  1. double dfYMin;
  1. double dfYMax;
  1. double dfZMin;
  1. double dfZMax;

  1. double tmpX;
  1. double tmpY;
  1. double tmpZ;

  1. int i = 0;
  1. int nPoints = 125;//设置离散点的个数

  1. double * padfX = new double[nPoints];
  1. double * padfY = new double[nPoints];
  1. double * padfZ = new double[nPoints];

  1. //将文本文件读入数组
  1. ifstream ifile(pszPoints,ios::in);
  1. string strBuf;

  1. while(getline(ifile,strBuf))
  1. {
  1. vector<string> vstr;
  1. Split(strBuf,",",vstr);

  1. tmpX = atof(vstr[0].c_str());
  1. tmpY = atof(vstr[1].c_str());
  1. tmpZ = atof(vstr[2].c_str());
  1. qDebug()<<tmpX<<tmpY<<tmpZ<<endl;

  1. padfX[i] = tmpX;
  1. padfY[i] = tmpY;
  1. padfZ[i] = tmpZ;

  1. if(i==0)
  1. {
  1. dfXMin = tmpX;
  1. dfXMax = tmpX;
  1. dfYMin = tmpY;
  1. dfYMax = tmpY;
  1. dfZMin = tmpZ;
  1. dfZMax = tmpZ;
  1. }

  1. dfXMin = (tmpX<dfXMin) ? tmpX : dfXMin;
  1. dfXMax = (tmpX>dfXMax) ? tmpX : dfXMax;
  1. dfYMin = (tmpY<dfYMin) ? tmpY : dfYMin;
  1. dfYMax = (tmpY>dfYMax) ? tmpY : dfYMax;
  1. dfZMin = (tmpZ<dfZMin) ? tmpZ : dfZMin;
  1. dfZMax = (tmpZ>dfZMax) ? tmpZ : dfZMax;
  1. i++;

  1. }

  1. ifile.close();

  1. //计算图像大小
  1. int nXSize = (dfXMax-dfXMin)/pixResoultion;
  1. int nYSize = (dfYMax-dfYMin)/pixResoultion;

  1. //构造插值算法参数并设置参数值
  1. GDALGridInverseDistanceToAPowerOptions *poOptions = new GDALGridInverseDistanceToAPowerOptions();
  1. poOptions->dfPower = 2;//设置权重指数p
  1. poOptions->dfRadius1 = 20;//设置搜索椭圆第一半径
  1. poOptions->dfRadius2 = 15;//设置搜索椭圆第二半径

  1. char *pData = new char[nXSize*nYSize];

  1. GDALGridCreate(GGA_InverseDistanceToAPower,poOptions,nPoints,padfX,padfY,padfZ,dfXMin,dfXMax,dfYMin,dfYMax,nXSize,nYSize,GDT_Float32,pData,NULL,NULL);

  1. delete poOptions;

  1. //创建新的数据集
  1. GDALDriver *pDriver = GetGDALDriverManager()->GetDriverByName("GS7BG");//GSAG GSBG GS7BG
  1. GDALDataset *poDataset = pDriver->Create(pszDst,nXSize,nYSize,1,GDT_Float32,NULL);
  1. double adfGeoTransform[6] = {dfXMin,pixResoultion,0,dfYMax,0,-pixResoultion};
  1. poDataset->SetGeoTransform(adfGeoTransform);

  1. //写入数据
  1. poDataset->RasterIO(GF_Write,0,0,nXSize,nYSize,pData,nXSize,nYSize,GDT_Float32,1,0,0,0,0);

  1. delete []pData;
  1. GDALClose(poDataset);

  1. }
  1. 要使用这段代码就得配置好环境,我的编译环境为qt5.11.2+vs2017+gdal

基于gdal的格网插值的更多相关文章

  1. 基于GDAL的栅格图像空间插值预处理

    转自 基于GDAL的栅格图像空间插值预处理——C语言版 基于GDAL的栅格图像预处理 前言 栅格数据和矢量数据构成空间数据的主要来源,怎样以开源方式读取并处理这些空间数据?目前有多种开源支持包,这里只 ...

  2. BootStrap入门教程 (一) :手脚架Scaffolding(全局样式(Global Style),格网系统(Grid System),流式格网(Fluid grid System),自定义(Customing),布局(Layouts))

    2011年,twitter的“一小撮”工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用.优雅.灵活.可扩展的前端工具集--BootStrap.Bootstrap由MARK ...

  3. WorldWind源码剖析系列:经纬度格网类LatLongGrid

    经纬度格网类LatLongGrid继承自可渲染对象类RenderableObject,是WorldWind中用来在星球外表绘制经纬度格网的封装类.其类图如下所示. 绘制经纬网格的主体函数为Render ...

  4. 关于基于GDAL库QT软件平台下C++语言开发使用说明

    背景前提 地理空间数据抽象库(GDAL)是一个用于读取和编写栅格和矢量地理空间数据格式的计算机软件库,由开源地理空间基金会在许可的X / MIT风格免费软件许可下发布. 作为一个库,它为调用应用程序提 ...

  5. 基于GDAL的遥感影像显示(C#版)

    基于GDAL的遥感影像显示(C#版) - 菜菜的专栏 - 博客频道 - CSDN.NET  http://blog.csdn.net/RSyaoxin/article/details/9220735

  6. GIS可视化——热点格网图

    一.简介 原理:按照格网大小将区域进行划分,由一个矩形格网替代当前范围内的数据,由格网中心数字代替格网的权重(可以为格网中数据的数量,数据某权重的平均值.最大值.最小值等), 由格网之间颜色的不同表达 ...

  7. Arcgis CreateFishnet工具,生成到FileGDB中要素类的格网大小不一致

    我的第一篇博客!哈哈 最近在做一些关于创建渔网的工作,发现一些问题,做个总结. 1.问题描述:如图1,设置好渔网的必要参数,输出目录为gdb里的矢量图层,(行列数比较大,渔网的地理范围较小),输出的格 ...

  8. 基于frp的内网穿透实例4-为本地的web服务实现HTTPS访问

    原文地址:https://wuter.cn/1932.html/ 一.想要实现的功能 目前已经实现将本地的web服务暴露到公网,现想要实现https访问.(前提:已经有相应的证书文件,如果没有就去申请 ...

  9. 后渗透阶段之基于MSF的内网主机探测

    当我们通过代理可以进入某内网,需要对内网主机的服务进行探测.我们就可以使用MSF里面的内网主机探测模块了. 在这之前,先修改 /etc/proxychains.conf ,加入我们的代理. 然后 pr ...

随机推荐

  1. 5分钟解决google play上架App设置隐私政策声明问题

    本文同步自javaexception 问题: 在我们的app上架到google play后,为了赚点小钱,就集成google ads,然而这会引发一个新的问题,那就是设置隐私政策声明的问题,通常我们会 ...

  2. 一款Android图文识别与扫描软件

    OCR图文识别App 是一款准确高效的 OCR文字识别与扫描软件,识别准确度高,速度快,扫描文件清晰,可导出TXT.Excel. 免费使用. 技术 基于百度在业界领先的人工智能与深度学习技术,提供对身 ...

  3. 理解Device Tree Usage(续)

    4 How Interrupts work   与遵循树的自然结构的地址范围转换不同, 中断信号可以起源于或者终止于板卡上的任何设备. 与设备树中自然表示的设备寻址不同,中断信号的表示独立于设备树节点 ...

  4. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  5. JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法

    标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...

  6. c语言总练习题

    !4,42 ?45 1 Description 键盘输入一个双精度数据,乘以2以后输出 Input 输入一个double型数据 Output 输出它的两倍数,结果保留8位小数 Sample Input ...

  7. 【js】项目中有关时间的问题

    一.时间戳 简单讲,unix时间戳就是从1970-01-01开始所经过的秒数,什么时候获取时间戳,就是到那个时间点所经历的秒数. 二.JavaScript获取时间戳 根据时间戳的定义,可以使用java ...

  8. 有人WIFI模块使用详解

    补充 模块在连接路由器时如果希望模块固定IP 不过发现固定IP之后好像连接路由器的等待时间增加了 用的这一款 看一下现在可能用到了引脚 这个模块也有三种模式AP,STA,AP+STA 先说一下模块在A ...

  9. Android 平台 Native 代码的崩溃捕获机制及实现

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/g-WzYF3wWAljok1XjPoo7w 一.背景 ...

  10. js设置回车键触发事件

    设置按回车键时触发查询事件: document.onkeydown = function(e){ var ev = document.all ? window.event : e; if(ev.key ...