抽稀点要素,计算角度

6 篇文章 0 订阅

分享给有需要的人,代码质量勿喷

//抽稀点要素,计算角度
bool VacuateDirection(const QString &pShp0, const QString &pShpRes, const int &interval)
{
	//注册
	GDALAllRegister();
	OGRRegisterAll();

	//读取原图层
	GDALDataset *oDS = (GDALDataset*)GDALOpenEx(pShp0.toStdString().c_str(), GDAL_OF_VECTOR, NULL, NULL, NULL);
	OGRLayer *oLayer = oDS->GetLayer(0);
	OGRSpatialReference *spatialReference = oLayer->GetSpatialRef();
	int featureCount = oLayer->GetFeatureCount();

#pragma region create new shp
	GDALDriver* driver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName("ESRI Shapefile");

	//new file
	GDALDataset *newDataSet = driver->Create(pShpRes.toStdString().c_str(), 0, 0, 0, GDT_Unknown, NULL);
	if (newDataSet == NULL)
		return false;

	OGRLayer *newLayer = newDataSet->CreateLayer("vacuatePointDirection", spatialReference, wkbPointZM, NULL);
	if (newLayer == NULL)
		return false;

#pragma region fields
	//FIDD
	OGRFieldDefn fieldFIDD("FIDD", OFTInteger);
	fieldFIDD.SetWidth(32);
	newLayer->CreateField(&fieldFIDD);
	//X
	OGRFieldDefn fieldX("X", OFTReal);
	fieldX.SetPrecision(16);
	newLayer->CreateField(&fieldX);
	//Y
	OGRFieldDefn fieldY("Y", OFTReal);
	fieldY.SetPrecision(16);
	newLayer->CreateField(&fieldY);
	//Z
	OGRFieldDefn fieldZ("Z", OFTReal);
	fieldZ.SetPrecision(16);
	newLayer->CreateField(&fieldZ);
	//direction
	OGRFieldDefn fieldDIRECTION("direction", OFTReal);
	fieldDIRECTION.SetPrecision(16);
	newLayer->CreateField(&fieldDIRECTION);
#pragma endregion

#pragma endregion

	//抽稀 计算角度
	for (int i = 0; i < (featureCount - interval); i += interval)
	{
#pragma region dir
		//P1
		OGRFeature *oFeature1 = oLayer->GetFeature(i);
		int fid1 = oFeature1->GetFID();
		OGRGeometry* oGeometry1 = oFeature1->GetGeometryRef();
		OGRPoint* oPt1 = (OGRPoint*)oGeometry1;
		double x1 = oPt1->getX();
		double y1 = oPt1->getY();
		double z1 = oPt1->getZ();

		//P2
		OGRFeature *oFeature2 = oLayer->GetFeature(i + interval);
		int fid2 = oFeature2->GetFID();
		OGRGeometry* oGeometry2 = oFeature2->GetGeometryRef();
		OGRPoint* oPt2 = (OGRPoint*)oGeometry2;
		double x2 = oPt2->getX();
		double y2 = oPt2->getY();
		double z2 = oPt2->getZ();

		//direction
		//double A = GetAnglePP(x1, y1, x2, y2);
		double ra = std::atan2(y2 - y1, x2 - x1);
		double A = ra * 180 / 3.1415926;
		if (A < 0)
		{
			A += 360;
		}
#pragma endregion

#pragma region create new feature
		//创建要素
		OGRFeature *newFeature = OGRFeature::CreateFeature(newLayer->GetLayerDefn());
		OGRPoint pt;
		pt.setX(x1);
		pt.setY(y1);
		pt.setZ(z1);
		newFeature->SetGeometry(&pt);

		//属性
		newFeature->SetField("FIDD", fid1);
		newFeature->SetField("X", x1);
		newFeature->SetField("Y", y1);
		newFeature->SetField("Z", z1);
		newFeature->SetField("direction", A);

		//判断
		if (newLayer->CreateFeature(newFeature) != OGRERR_NONE)
		{
			//QMessageBox::warning(0, ("prompt"), "Failed to create feature in shapefile!!!");
			return false;
		}
		OGRFeature::DestroyFeature(newFeature);
#pragma endregion
	}
	GDALClose(oDS);

	GDALClose(newDataSet);
}

ArcGIS设置旋转字段

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

累了就要打游戏

把我养胖,搞代码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值