您的当前位置:首页正文

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

2023-05-02 来源:星星旅游


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

目录

• 1. 概述

• 2. 栅格数据

• 3. 矢量数据

1. 概述

可以通过GDAL给地理数据写入空间参考信息,不过要注意的是GDAL给矢量数据和栅格数据写入空间坐标参考的接口不太一样。

2. 栅格数据

实现代码如下:

#include

#include

#include

using namespace std;

int main()

{

GDALAllRegister();

CPLSetConfigOption(\"GDAL_FILENAME_IS_UTF8\支持中文路径

CPLSetConfigOption(\"SHAPE_ENCODING\解决中文乱码问题

CPLSetConfigOption(\"GDAL_DATA\2.4.2/install/data\");

\"D:/Work/GDALBuild/gdal-

GDALDriver *pDriver = GetGDALDriverManager()->GetDriverByName(\"GTIFF\"); //图像驱动

char** ppszOptions = NULL;

ppszOptions = CSLSetNameValue(ppszOptions, \"BIGTIFF\配置图像信息

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); 理坐标系

char *pszWKT = nullptr;

spatialReference.exportToWkt(&pszWKT);

dst->SetProjection(pszWKT);

CPLFree(pszWKT);

//wgs84地

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

#include

#include

using namespace std;

int main()

{

GDALAllRegister();

CPLSetConfigOption(\"GDAL_FILENAME_IS_UTF8\支持中文路径

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\wkbPolygon, NULL);

//创建属性字段

{

// 字符串

OGRFieldDefn oField1(\"名称\

oField1.SetWidth(8);

if (poLayer->CreateField(&oField1) != OGRERR_NONE) {

printf(\"Creating Name field failed.\\n\"); return FALSE;

}

// 浮点数

OGRFieldDefn oField2(\"面积\

oField2.SetPrecision(3);

if (poLayer->CreateField(&oField2) != OGRERR_NONE) {

printf(\"Creating Name field failed.\\n\"); return FALSE;

}

// 整型

OGRFieldDefn oField3(\"结点数\

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(\"面积\

poFeature->SetField(\"结点数\

if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)

{

printf(\"Failed to create feature in shapefile.\\n\");

return false;

}

//释放

GDALClose(dataset);

dataset = nullptr;

}

与写入到栅格数据不同,空间参考信息写入到矢量数据是写入到GDAL数据集的图层类中的,并且直接传入OGRSpatialReference类即可。

因篇幅问题不能全部显示,请点此查看更多更全内容