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类即可。 因篇幅问题不能全部显示,请点此查看更多更全内容