GDAL:創建矢量線、矢量面數據

分享給有需要的人,代碼質量勿噴。

C/C++——常規——附加包含目錄——添加include目錄

鏈接器——輸入——附加依賴項——添加...\gdal_i.lib

一、創建矢量線數據 單個要素

//GDAL
#include "ogrsf_frmts.h"

void xjCreateVectorLineByGDAL(QList<xjPoint> xjListNode, const QString &xjSavePath)
 {
	 GDALAllRegister();
	 OGRRegisterAll();
	 const char *xjDriverName = "ESRI Shapefile";
	 GDALDriver *xjDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(xjDriverName);
	 if (xjDriver == NULL)
	 {
		 QMessageBox::warning(0, ("prompt"), QString(xjDriverName) + "driver not available!!!");
		 return;
	 }

	 GDALDataset *xjDataset = xjDriver->Create(xjSavePath.toStdString().c_str(), 0, 0, 0, GDT_Unknown, NULL);
	 if (xjDataset == NULL)
	 {
		 QMessageBox::warning(0, ("prompt"), "Creation of output file failed!!!");
		 return;
	 }

	 OGRLayer *xjLayer = xjDataset->CreateLayer("point_out", NULL, wkbLineStringZM, NULL);
	 if (xjLayer == NULL)
	 {
		 QMessageBox::warning(0, ("prompt"), "Layer creation failed!!!");
		 return;
	 }

/* GDALDataset* xjDataset = (GDALDataset*)GDALOpenEx(xjShpPath.toStdString().c_str(), GDAL_OF_UPDATE, NULL, NULL, NULL);
	OGRLayer *xjLayer = xjDataset->GetLayer(0); */

	 //創建屬性字段
	 OGRFieldDefn fieldID("ID", OFTInteger);
	 fieldID.SetWidth(32);
	 xjLayer->CreateField(&fieldID);
	 OGRFieldDefn fieldNAME("NAME", OFTString);
	 fieldNAME.SetWidth(32);
	 xjLayer->CreateField(&fieldNAME);
	 OGRFieldDefn fieldLENGTH("LENGTH", OFTReal);
	 fieldLENGTH.SetPrecision(16);
	 xjLayer->CreateField(&fieldLENGTH);

	 //創建要素
	 OGRFeature *xjFeature = OGRFeature::CreateFeature(xjLayer->GetLayerDefn());
	 OGRLineString xjLine;
	 int pointCount = xjListNode.size();
	 for (int i = 0; i < pointCount; i++)
	 {
		 xjPoint Pd = xjListNode.at(i);
		 OGRPoint pt;
		 pt.setX(Pd.x);
		 pt.setY(Pd.y);
		 pt.setZ(Pd.z);
		 xjLine.addPoint(&pt);
	 }
	 xjFeature->SetGeometry(&xjLine);

	 //屬性
	 xjFeature->SetField("ID", "id");
	 xjFeature->SetField("NAME", "name");
	 xjFeature->SetField("LENGTH", 2.3);

	 //判斷
	 if (xjLayer->CreateFeature(xjFeature) != OGRERR_NONE)
	 {
		 QMessageBox::warning(0, ("prompt"), "Failed to create feature in shapefile!!!");
		 return;
	 }
	 OGRFeature::DestroyFeature(xjFeature);

	 GDALClose(xjDataset);
 }

二、創建矢量面數據 多個要素

 void xjCreateVectorPolygonByGDAL(const QList<QList<xjPoint>> &xjListPoint, const QString &xjSavePath)
 {
	 GDALAllRegister();
	 OGRRegisterAll();
	 const char *xjDriverName = "ESRI Shapefile";
	 GDALDriver *xjDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(xjDriverName);
	 if (xjDriver == NULL)
	 {
		 QMessageBox::warning(0, "prompt", "error of GDAL: Driver not available!!!");
		 return;
	 }

	 GDALDataset *xjDataset = xjDriver->Create(xjSavePath.toStdString().c_str(), 0, 0, 0, GDT_Unknown, NULL);
	 if (xjDataset == NULL)
	 {
		 QMessageBox::warning(0, "prompt", "error of GDAL: Creation of output file failed!!!");
		 return;
	 }

	 OGRLayer *xjLayer = xjDataset->CreateLayer("polygon1", NULL, wkbPolygonZM, NULL);
	 if (xjLayer == NULL)
	 {
		 QMessageBox::warning(0, "prompt", "error of GDAL: Layer creation failed!!!");
		 return;
	 }

	 //創建屬性字段
	 OGRFieldDefn fieldID("ID", OFTInteger);
	 fieldID.SetWidth(32);
	 xjLayer->CreateField(&fieldID);
	 OGRFieldDefn fieldNAME("NAME", OFTString);
	 fieldNAME.SetWidth(32);
	 xjLayer->CreateField(&fieldNAME);
	 OGRFieldDefn fieldAREA("AREA", OFTReal);
	 fieldAREA.SetPrecision(16);
	 xjLayer->CreateField(&fieldAREA);

	 //創建要素
	 for (int i = 0; i < xjListPoint.size(); i++)
	 {
		 //創建要素
		 OGRFeature *xjFeature = OGRFeature::CreateFeature(xjLayer->GetLayerDefn());
		 //矢量面要素的邊界是閉合環
		 OGRLinearRing xjRing;
		 QList<xjPoint> list = xjListPoint.at(i);
		 for (int j = 0; j < list.size(); j++)
		 {
			 xjRing.addPoint(list.at(j).x, list.at(j).y, list.at(j).z);
		 }
		 xjRing.closeRings();//首尾點重合形成閉合環

		 //圖層添加要素
		 OGRPolygon xjPolygon;
		 xjPolygon.addRing(&xjRing);
		 xjFeature->SetGeometry(&xjPolygon);

		 //設置屬性
		 xjFeature->SetFID(i);
		 xjFeature->SetField(0, i);
		 std::string pname = "name_" + to_string(i);
		 xjFeature->SetField(1, pname.c_str());
		 xjFeature->SetField("AREA", 2.2);

		 //判斷
		 if (xjLayer->CreateFeature(xjFeature) != OGRERR_NONE)
		 {
			 QMessageBox::warning(0, "prompt", "error of GDAL: Failed to create feature in shapefile!!!");
			 continue;
		 }
		 OGRFeature::DestroyFeature(xjFeature);
	 }
	 GDALClose(xjDataset);
 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章