GDAL数据集写入空间坐标参考
1. 概述
可以通过GDAL给地理数据写入空间参考信息,不过要注意的是GDAL给矢量数据和栅格数据写入空间坐标参考的接口不太一样。
2. 栅格数据
实现代码如下:
#include <iostream>
#include <gdal_priv.h>
#include <string>
using namespace std;
int main()
{
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //支持中文路径
CPLSetConfigOption("SHAPE_ENCODING", ""); //解决中文乱码问题
CPLSetConfigOption("GDAL_DATA", "D:/Work/GDALBuild/gdal-2.4.2/install/data");
GDALDriver *pDriver = GetGDALDriverManager()->GetDriverByName("GTIFF"); //图像驱动
char** ppszOptions = NULL;
ppszOptions = CSLSetNameValue(ppszOptions, "BIGTIFF", "IF_NEEDED"); //配置图像信息
const char* dstPath = "dst.tif";
GDALDataset* dst = pDriver->Create(dstPath, 256, 256, 3, GDT_Byte, ppszOptions);
if (dst == nullptr)
{
printf("Can't Write Image!");
return false;
}
//空间参考
OGRSpatialReference spatialReference;
spatialReference.importFromEPSG(4326); //wgs84地理坐标系
char *pszWKT = nullptr;
spatialReference.exportToWkt(&pszWKT);
dst->SetProjection(pszWKT);
CPLFree(pszWKT);
pszWKT = nullptr;
//坐标信息
double padfTransform[6] = {
114.0, //左上角点坐标X
0.000001, //X方向的分辨率
0, //旋转系数,如果为0,就是标准的正北向图像
34.0, //左上角点坐标Y
0, //旋转系数,如果为0,就是标准的正北向图像
0.000001, //Y方向的分辨率
};
dst->SetGeoTransform(padfTransform);
GDALClose(dst);
}
这里创建了一个wgs84地理坐标系空间参考的栅格数据,通过OGRSpatialReference类导出了描述空间参考的wkt字符串,写入到GDAL数据集中。
3. 矢量数据
实现代码如下:
#include <iostream>
#include <gdal_priv.h>
#include <ogrsf_frmts.h>
using namespace std;
int main()
{
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //支持中文路径
CPLSetConfigOption("SHAPE_ENCODING", ""); //解决中文乱码问题
CPLSetConfigOption("GDAL_DATA", "D:/Work/GDALBuild/gdal-2.4.2/install/data");
//空间参考
OGRSpatialReference spatialReference;
spatialReference.importFromEPSG(4326); //wgs84地理坐标系
//创建
GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("ESRI Shapefile");
if (!driver)
{
printf("Get Driver ESRI Shapefile Error!\n");
return false;
}
GDALDataset* dataset = driver->Create("dst.shp", 0, 0, 0, GDT_Unknown, NULL);
OGRLayer* poLayer = dataset->CreateLayer("houseType", &spatialReference, wkbPolygon, NULL);
//创建属性字段
{
// 字符串
OGRFieldDefn oField1("名称", OFTString);
oField1.SetWidth(8);
if (poLayer->CreateField(&oField1) != OGRERR_NONE) {
printf("Creating Name field failed.\n"); return FALSE;
}
// 浮点数
OGRFieldDefn oField2("面积", OFTReal);
oField2.SetPrecision(3);
if (poLayer->CreateField(&oField2) != OGRERR_NONE) {
printf("Creating Name field failed.\n"); return FALSE;
}
// 整型
OGRFieldDefn oField3("结点数", OFTInteger);
if (poLayer->CreateField(&oField3) != OGRERR_NONE) {
printf("Creating Name field failed.\n"); return FALSE;
}
}
//创建特征
OGRFeature *poFeature = new OGRFeature(poLayer->GetLayerDefn());
OGRLinearRing ogrring;
int pNum = 4;
ogrring.setNumPoints(pNum);
ogrring.setPoint(0, 114.0, 34.0, 0.0);
ogrring.setPoint(1, 115.0, 34.0, 0.0);
ogrring.setPoint(2, 115.0, 35.0, 0.0);
ogrring.setPoint(3, 114.0, 35.0, 0.0);
OGRPolygon polygon;
polygon.addRing(&ogrring);
poFeature->SetGeometry(&polygon);
poFeature->SetField("名称", "多边形");
poFeature->SetField("面积", polygon.get_Area());
poFeature->SetField("结点数", pNum);
if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
{
printf("Failed to create feature in shapefile.\n");
return false;
}
//释放
GDALClose(dataset);
dataset = nullptr;
}
与写入到栅格数据不同,空间参考信息写入到矢量数据是写入到GDAL数据集的图层类中的,并且直接传入OGRSpatialReference类即可。
GDAL数据集写入空间坐标参考的更多相关文章
- 实战 | 将Apache Hudi数据集写入阿里云OSS
1. 引入 云上对象存储的廉价让不少公司将其作为主要的存储方案,而Hudi作为数据湖解决方案,支持对象存储也是必不可少.之前AWS EMR已经内置集成Hudi,也意味着可以在S3上无缝使用Hudi.当 ...
- osgEarth使用笔记1——显示一个数字地球
目录 1. 概述 2. 实现 2.1. 三维显示 2.2. 二维显示 1. 概述 osgEarth支持.earth格式的文件,里面保存了数字地球相关信息的配置XML,只需要读取这个配置文件,就可以直接 ...
- gdal读写图像分块处理
转自赵文原文 gdal读写图像分块处理(精华版) Review: 用gdal,感觉还不如直接用C++底层函数对遥感数据进行处理.因为gdal进行太多封装,如果你仅仅只是Geotif等格式进行处理,IO ...
- 完善GDAL与OpenCV间的数据格式转换与影像分块读写
本博客为原创内容,未经博主允许禁止转载,商用,谢谢. 一.前言 关于GDAL与openCV间的数据格式转换,在我之前的博客中已有简要说明,这里,由于最近工作上经常用到openCV里的函数进行图像处理, ...
- 1. GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)
一.前言 GDAL具有强大的图像读写功能,但是对常用图像处理算法的集成较少,OpenCV恰恰具有较强的图像处理能力,因此有效的结合两者对图像(遥感影像)的处理带来了极大的方便.那么如何实现GDAL与o ...
- GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)
一.前言 GDAL具有强大的图像读写功能,但是对常用图像处理算法的集成较少,OpenCV恰恰具有较强的图像处理能力,因此有效的结合两者对图像(遥感影像)的处理带来了极大的方便.那么如何实现GDAL与o ...
- gdal读写图像分块处理(精华版)
一.gdal进行数据操作在安装好gdal后,即可调用gdal库中的函数.(需要包含的头文件:gdal_priv.h)1.打开数据集使用gdal库进行数据(影像)操作的第一步就是打开一个数据集.对于“数 ...
- 使用C#版本的gdal库打开hdf文件
作者:朱金灿 来源:http://blog.csdn.net/clever101 最近应同事的请求帮忙研究下使用C#版的gdal库读取hdf文件,今天算是有一点成果,特地做一些记录. 首先是编译C#版 ...
- 官宣!AWS Athena正式可查询Apache Hudi数据集
1. 引入 Apache Hudi是一个开源的增量数据处理框架,提供了行级insert.update.upsert.delete的细粒度处理能力(Upsert表示如果数据集中存在记录就更新:否则插入) ...
- Python 利用GDAL对图像进行几何校正
原文链接:https://blog.csdn.net/qq_27045589/article/details/81062586 一.几何校正方法 图像校正本质是建立一种从原始图像行列号到某种投影的数学 ...
随机推荐
- VideoCapture
from xgoedu import XGOEDU import time #实例化edu XGO_edu = XGOEDU() XGO_edu.lcd_text(50,50,'hello',colo ...
- ABC319 A-E 题解
A 用 map <string, int> 将名字对应的值存下来即可. 赛时代码 B 按照题意暴力模拟,注意细节. 赛时代码 C 答辩题,卡了我半个小时. 枚举 \(1\sim 9\) 的 ...
- react 16.3生命周期更新解析
React v16.3虽然是一个小版本升级,但是却对React组件生命周期函数有巨大变化. 文章梗概 新版本+2-3个生命周期. 为什么增加那2个生命周期? 为什么减去之前3个生命周期? 相关知识延伸 ...
- QT(3)-QTableView
@ 目录 0 相关文章 1 说明 2 常用函数 2.1 clearSpans 2.2 setSpan 2.3 columnAt 2.4 rowAt 2.5 columnSpan 2.6 rowSpan ...
- 【行云流水线实践】基于“OneBuild”方法对镜像进行快速装箱
在云原生领域,无论使用哪种编排调度平台,Kubernetes,DockerSwarm,OpenShift等,业务都需要基于镜像进行交付,我们在内部实践"Source-to-image&quo ...
- Java IO教程- Java文件
创建文件 我们可以从中创建一个 File 对象 路径名 父路径名和子路径名 URI(统一资源标识符) 我们可以使用File类的以下构造函数之一创建一个文件: File(String pathname) ...
- 颠覆了!eShop跟随.Net 8迎来重磅升级,微服务架构与GPT的完美结合!
.Net 8正式发布了,发布了诸多重大的新功能.新特性! .Net 8新增的功能带来诸多惊喜,还未一一体验完毕呢,我又发现了跟随.Net 8的发布,eShop也迎来重磅升级! eShop一直以来都是微 ...
- LabVIEW基于机器视觉的实验室设备管理系统(4)
目录 行动计划 后面板连线 初始化 返回 注册 账号限制 查重账号或者姓名 确认密码 注册 效果演示 我们上一期制作完了给账户修改密码,那么我们这一期就来完成账户注册这一功能.老规矩哦,先来计划 ...
- 2021年前端面试题——JS
目录: DOM事件流有那些阶段? 解释事件冒泡以及如何阻止它? 事件委派/事件委托是什么? 如何理解 JS 中的this关键字? 更改this指向的方法有那些? apply.call.bind 区别? ...
- 吉特日化MES & RabbitMQ 的基本配置
在吉特日化MES(日化配料系统)中涉及到大量的消息推送,其中针对设备数据的交互(读写) 大量使用了RabbitMQ来进行消息通讯以及程序上的解耦,其中包含使用PDA扫码登录到PLC控制程序,下发生产工 ...