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