|
|
|
|
|
|
|
|
|
#include "geospatialanalysis.h"
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
|
|
|
|
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 = visAnalsyt.IsVisible(datasetRaster,pntView3D,pntObject3D);
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
|
|
}
|