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++


#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;
}