GDAL数据集写入空间坐标参考

简介: GDAL数据集写入空间坐标参考

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

标签: 空间参考 , 栅格化 , 矢量 , GDAL


相关文章
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
JSON 数据格式 计算机视觉
Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)
本文介绍了如何使用OpenCV和Python根据JSON标注文件获取并绘制目标区域,同时可将裁剪的图像单独保存。通过示例代码,展示了如何读取图片路径、解析JSON标注、绘制标注框并保存裁剪图像的过程。此外,还提供了相关的博客链接,供读者进一步学习。
48 0
|
4月前
|
数据可视化 Serverless 数据格式
Python的GDAL求取栅格文件相互间的像素变化值
完成这一过程后,你将会得到一个包含像素差异值的新栅格文件,可以使用各种地理信息系统软件进行可视化和分析。
56 0
|
7月前
GEE——Google dynamic world中在影像导出过程中无法完全导出较大面积影像的解决方案(投影的转换)EPSG:32630和EPSG:4326的区别
GEE——Google dynamic world中在影像导出过程中无法完全导出较大面积影像的解决方案(投影的转换)EPSG:32630和EPSG:4326的区别
137 0
|
7月前
|
计算机视觉 开发者 Python
OpenCV合并图像中加权和与覆盖的讲解与实战(附Python源码)
OpenCV合并图像中加权和与覆盖的讲解与实战(附Python源码)
214 0
|
7月前
|
存储 编解码 Python
Python GDAL基于经、纬度提取大量遥感影像中相同位置处像元的数值
【2月更文挑战第8天】本文介绍基于Python语言中的gdal模块,对2景不同的遥感影像加以对应位置像素值匹配的方法——即基于一景遥感影像的每一个像元,提取另一景遥感影像中,与之空间位置相同的像元的像素值的方法~
219 1
Python GDAL基于经、纬度提取大量遥感影像中相同位置处像元的数值
|
7月前
|
定位技术 Python
Python ArcPy将多个文件夹内大量遥感影像批量四等分裁剪或切割为N×M个部分
Python ArcPy将多个文件夹内大量遥感影像批量四等分裁剪或切割为N×M个部分
101 1
Python ArcPy将多个文件夹内大量遥感影像批量四等分裁剪或切割为N×M个部分
|
7月前
|
存储 定位技术 对象存储
C++语言GDAL批量裁剪多波段栅格图像:基于像元个数裁剪
C++语言GDAL批量裁剪多波段栅格图像:基于像元个数裁剪
168 2
|
7月前
|
定位技术
ArcGIS中ArcMap创建镶嵌数据集、导入栅格图像文件并修改像元数值范围的方法
ArcGIS中ArcMap创建镶嵌数据集、导入栅格图像文件并修改像元数值范围的方法
|
7月前
|
定位技术 C++ 数据格式
C++中GDAL为CreateCopy()创建的栅格图像增添波段数量的方法
C++中GDAL为CreateCopy()创建的栅格图像增添波段数量的方法