You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
map-display/geospatialanalysis.cpp

103 lines
3.2 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "geospatialanalysis.h"
#include <QMessageBox>
#include "Geometry/UGGeoLine.h"
GeoSpatialAnalysis::GeoSpatialAnalysis()
{
}
/*@brief 两点间的可视性
* @param pntView 观察点
* @param pntObject 目标点
* @param relativeAltitude 飞机相对高度默认值为0
* @tolerance 误差容限
*/
UG3DAnalyst::SingleResult *GeoSpatialAnalysis::DoublePointVisibility(QMapControl* pMapControl,UGPoint2D pntView, UGPoint2D pntObject,double relativeAltitude,int tolerance)
{
//通过下面的方法首先判断点所在的位置是否存在高程数据;
UGDatasetRasterPtr viewPtDataset = pMapControl->getDemDataSet(pntView);
UGDatasetRasterPtr objectPtDataset = pMapControl->getDemDataSet(pntObject);
if(viewPtDataset == NULL || objectPtDataset == NULL)
{
QMessageBox::about(NULL,"提示","无高程数据 ");
return NULL;//-1
}
if(viewPtDataset != objectPtDataset)
{
QMessageBox::about(NULL,"提示","观测点与被观测点不属于同一个高程数据集 ");
return NULL;//-1
}
UGDatasetRasterPtr datasetRaster = viewPtDataset;
//3D分析分析实例对象
// UG3DAnalyst visAnalsyt;
UGPoint3D pntView3D,pntObject3D;
//高程值需根据x,y查询数据集得到
//得到当前测量点的高程值
// 1.首先将坐标点转换为栅格数据集对应的行和列
UGPoint pntviewImg;//观察点
double altitude;//地形高度
datasetRaster->XYToImg(pntView,pntviewImg);
altitude = datasetRaster->GetValue(pntviewImg.x,pntviewImg.y);
pntView3D.x = pntView.x;
pntView3D.y = pntView.y;
// pntView3D.z = altitude + relativeAltitude - tolerance;
pntView3D.z = relativeAltitude - tolerance; //用于测试,把相对高度当成海拔高度
//目标点
// UGPoint pntObjectImg;
// //坐标点转换为栅格数据集对应的行和列
// datasetRaster->XYToImg(pntObject,pntObjectImg);
// altitude = datasetRaster->GetValue(pntObjectImg.x,pntObjectImg.y);
pntObject3D.x = pntObject.x;
pntObject3D.y = pntObject.y;
pntObject3D.z = pntView3D.z;
//进行通视分析查询;
UG3DAnalyst::SingleResult* result = geoAnalystMag.IsVisible(datasetRaster,pntView3D,pntObject3D);
return result;
}
/**
* @introduce 剖面分析
*
* @param pInputRaster[in]:输入栅格数据集
* @param pCrossLine[in]:输入线数据
* @param geoValue[out]:线经过的栅格数据值
* @param geoPt[out]:线经过的坐标点(经纬度)
* @return 计算是否成功
*
* @author cbwu
* @date 2023-09-05
*/
bool GeoSpatialAnalysis::SurfaceProfile_Parallel(const UGDatasetRasterPtr &pInputRaster, UGGeoLine *pCrossLine, QVector<double>& geoValue,QVector<QPointF>& geoPt)
{
//剖面分析
UGGeoLine geoProfile;
UGGeoLine geoXY;
bool b = geoAnalystMag.SurfaceProfile_Parallel(pInputRaster,pCrossLine,geoProfile,geoXY);
const UGPoint2D* ptValues = geoProfile.GetPoints(0);
const UGPoint2D* pts = geoXY.GetPoints(0);
// QVector<double> x,y0;
QPointF pt;
for(int i=0;i<geoProfile.GetPointCount();i++)
{
geoValue.append(ptValues->y);
pt.setX(pts->x);
pt.setY(pts->y);
geoPt.append(pt);
ptValues++;
pts++;
}
return b;
}