2.2.13 沿街立面分析
沿街立面分析
沿街立面分析是指在场景中绘制一条街道线,然后调整相机位置,只观察一侧街道效果的分析功能。
主要包括添加(创建)、更新、显隐、删除和获取结果操作。
注意:可创建空的分析图层,也可创建预设的分析图层,如需创建预设分析图层,则IsLoad
,IsActive
,Points
三个参数需要同时配置
下图是沿街立面分析效果:
参数说明
沿街立面分析可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
LayerOptionsName | 图层配置对象名称 | string | 分析图层需配置为:AnalysisLayerOptions |
DataSourceTypeName | 数据源类型 | string | as_facade代表沿街立面分析 |
PointColor | 点颜色 | R,G,B,A | 颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0" |
PointSize | 点大小 | float | 点大小取值范围在1-10之间 |
LineColor | 线颜色 | R,G,B,A | 颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0" |
LineWidth | 线宽度 | float | 线宽度取值范围在1-10之间 |
ResponseMode | 漫游响应模式 | int | 鼠标拖动漫游响应模式。0-正常拖动;1-放大;2-缩小。创建时只能为"0",默认:0 |
ViewDirection | 观察方向 | int | 观察方向。以绘制的第一个点到第二个点为参考方向。1-左侧;2-右侧。无默认值,必须设置 |
FacadeMode | 观察模式 | int | 相机观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1 |
Fovy | 相机张角 | float | 观察相机张角。该值必须与FacadeMode 同时设置,默认为0度 |
ZNear | 近截面距离 | float | 相机近截面距离。默认:100 |
ZFar | 远截面距离 | float | 相机远截面距离。默认:100000 |
ProjectRigth | 设置右侧宽度值 | double | 设置右侧宽度值。该值必须与左侧宽度值对称,并且不能大于水平方向最大值 |
ProjectLeft | 设置左侧宽度值 | double | 设置左侧宽度值。该值必须与右侧宽度值对称,并且不能大于水平方向最大值 |
ProjectBottom | 设置底部高度值 | double | 设置底部高度值。该值不能大于垂直方向最大高度值 |
IsLoad | 是否初始化加载点 | bool | 默认为false |
IsActive | 是否激活分析 | bool | 默认为true,表示是否可操作场景进行绘制 |
Points | 坐标点集 | x,y,z列表 | 需传入经度,纬度,高程坐标集,中间用;分隔,并以;结尾 |
IsWorld | 是否世界坐标点 | bool | 传入的坐标是否是世界坐标。true-世界坐标,false-经纬度坐标。默认为true |
获取结果说明
沿街立面分析可以通过图层对象的GetLayerResult() 方法获取结果。获取的结果值对象参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
DataSourceTypeName | 数据源类型 | string | as_facade代表沿街立面分析 |
ClickPoints | 点击点坐标 | x,y,z列表 | 鼠标点击场景形成的关键点的经度,纬度,高程坐标列表,中间用;分隔,并以;结尾 |
PerspectiveRight | 相机水平调整最大值 | float | 相机水平方向可调整的最大距离 |
PerspectiveTop | 相机高度调整最大值 | float | 相机可调整的最大高度 |
代码调用示例
Javascript调用
//回调执行函数
function callBackFun(layerid, type){
var info = new Array();
info = layerid.split("|");//idinfo通过|进行分隔
var mapviewid = info[0].substr(10, info[0].length - 10);//MapviewId:
var layerid = info[1].substr(8, info[1].length - 8);//LayerId:
var layer = layermap[layerid];
var opt = layer.GetLayerResult();
if(opt.GetConfigValueByKey("DataSourceTypeName") == "as_facade" && isGetPerspective == false)
{
var Rigth = opt.GetConfigValueByKey("PerspectiveRight");//获取相机右侧最大值
PerspectiveRight = Rigth;
ProjectRigth = Rigth;
var Top = opt.GetConfigValueByKey("PerspectiveTop"); //获取相机左侧最大值
PerspectiveTop = Top - 0.01;
ProjectTop = Top -0.01;
isGetPerspective = true;
}
}
//鼠标左键抬起回调
function callBackLButtonUp(x, y){
if(resRectangle!=null)
{
RemoveRectangle();
}
}
var isGetPerspective = false;
var layermap = new Array();
var PerspectiveRight =0;
var PerspectiveTop = 0;
var ProjectRigth = 0;
var ProjectTop = 0;
//*************************************************************************
//沿街立面分析
//*************************************************************************
var facadeLayer;
//创建沿街立面
function CreateFacadeLayer() {
var tlo = map.CreateLayerOptions("as_facade ");//创建分析图层配置,任意名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("PointColor", "1,0,0,1.0");//点颜色(RGBA),默认红色
tlo.AddConfig("PointSize", "5");//点的大小,默认5
tlo.AddConfig("LineColor", "0.0,1.0,0.0,1.0");//线颜色,默认绿色
tlo.AddConfig("LineWidth", "2.0");//线宽(0-10),默认1
tlo.AddConfig("ResponseMode", "0");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
tlo.AddConfig("ViewDirection", "1");//观察方向。以绘制的第一个点到第二个点为参考方向。1-左侧;2-右侧。无默认值,必须设置
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("Fovy", "45");//张角。该值必须与FacadeMode同时设置,默认为"0"
tlo.AddConfig("ZNear", "1000");//近截面距离,默认为100
tlo.AddConfig("ZFar", "50000");//远截面距离,默认为100000
facadeLayer = map.CreateLayer("AnalysisLayer", tlo); //创建分析图层,第一项参数必须为AnalysisLayer
map.AddLayer(facadeLayer); //添加分析图层
layermap[facadeLayer.GetLayerID()] = facadeLayer;
facadeLayer.AddObserver();
}
//更新沿街立面
//当做更新操作时,只需把需要更新的参数构建更新配置参数就可以,不需要更新的参数不需要在设置
function UpdateFacadeLayer() {
var tlo = map.CreateLayerOptions("as_facade ");//创建分析图层配置,给配置起个名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置,必须是此键值对
tlo.AddConfig("DataSourceTypeName", "as_facade"); //数据源类型,as_facade代表沿街立面
tlo.AddConfig("ViewDirection", "1");//观察方向。以绘制的第一个点到第二个点为参考方向。1-左侧;2-右侧。无默认值,必须设置
tlo.AddConfig("FacadeMode", "2");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ZNear", "1000");//近截面距离,默认为100
tlo.AddConfig("ZFar", "50000");//远截面距离,默认为100000
facadeLayer.UpdateLayerOptions(tlo); //更新沿街立面
}
//获取沿街立面结果
function GetFacadeLayer() {
var opt = facadeLayer.GetLayerResult();//获取图层结果
//判断当前图层数据源类型
if(opt.GetConfigValueByKey("DataSourceTypeName") == "as_facade")
{
var ClickPoints = opt.GetConfigValueByKey("ClickPoints");//获取点击坐标
alert("ClickPoints:" + ClickPoints);
var Rigth = opt.GetConfigValueByKey("PerspectiveRight");//获取相机右侧最大值
alert("PerspectiveRight:" + Rigth);
var Top = opt.GetConfigValueByKey("PerspectiveTop");//获取相机上侧最大值
alert("PerspectiveTop:" + Top);
}
}
//删除沿街立面
function RemoveFacadeLayer() {
map.RemoveLayer(facadeLayer);//删除沿街立面
}
//放大
function Enlarge() {
var tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("ResponseMode", "1");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer.UpdateLayerOptions(tlo);
AddRectangle();//绘制矩形响应器
}
//缩小
function Narrow() {
var tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("ResponseMode", "2");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer.UpdateLayerOptions(tlo);
}
//复原
function Restore() {
var tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("ResponseMode", "0");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer.UpdateLayerOptions(tlo);
}
//宽度减少
function ProjectRigthDown()
{
if(ProjectRigth < 10 )
{
alert("宽度不可小于0");
return false;
}
ProjectRigth = ProjectRigth-10;
var ProjectLeft = -ProjectRigth;
var tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ProjectRigth", ProjectRigth);//设置右侧宽度值,与左侧宽度必须对称
tlo.AddConfig("ProjectLeft", ProjectLeft);//设置左侧宽度值,与右侧宽度必须对称
tlo.AddConfig("ProjectBottom", -ProjectTop);//设置底部高度值
facadeLayer.UpdateLayerOptions(tlo);
}
//宽度增加
function ProjectRigthUp()
{
if(ProjectRigth +10> PerspectiveRight)
{
alert("宽度不可大于原始相机宽度");
return false;
}
ProjectRigth = ProjectRigth+10;
var ProjectLeft = -ProjectRigth;
var tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ProjectRigth", ProjectRigth);//设置右侧宽度值,与左侧宽度必须对称
tlo.AddConfig("ProjectLeft", ProjectLeft);//设置左侧宽度值,与右侧宽度必须对称
tlo.AddConfig("ProjectBottom", -ProjectTop);//设置底部高度值
facadeLayer.UpdateLayerOptions(tlo);
}
//高度减少
function ProjectTopDown()
{
if(ProjectTop <10)
{
alert("高度不可小于0");
return false;
}
ProjectTop = ProjectTop-10;
var ProjectBottom = -ProjectTop;
var tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ProjectRigth", PerspectiveRight);//设置右侧宽度值,与左侧宽度必须对称
tlo.AddConfig("ProjectLeft", -PerspectiveRight);//设置左侧宽度值,与右侧宽度必须对称
tlo.AddConfig("ProjectBottom", ProjectBottom);//设置底部高度值
facadeLayer.UpdateLayerOptions(tlo);
}
//高度增加
function ProjectTopUp()
{
if(ProjectTop +10> PerspectiveTop)
{
alert("高度不可大于原始相机高度");
return false;
}
ProjectTop = ProjectTop+10;
var ProjectBottom = -ProjectTop;
var tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ProjectRigth", PerspectiveRight);//设置右侧宽度值,与左侧宽度必须对称
tlo.AddConfig("ProjectLeft", -PerspectiveRight);//设置左侧宽度值,与右侧宽度必须对称
tlo.AddConfig("ProjectBottom", ProjectBottom);//设置底部高度值
facadeLayer.UpdateLayerOptions(tlo);
}
//*************************************************************************
//矩形响应器
//*************************************************************************
var resRectangle;
//添加矩形响应器
function AddRectangle() {
var resp = map.CreateResponserOptions("UIRectangleResponser");
resp.AddConfig("LineColor", "0.0,0.0,1.0,1.0");//设置线的颜色
resp.AddConfig("LineWidth", "2");//线宽(0-10)
resp.AddConfig("IsDragMode", "true");//是否为拖拽模式,拖拽模式下,需要按住鼠标进行绘制,默认为false
//下列二个配置可选
//resp.AddConfig("IsLoad", "false");//是否预加载
//resp.AddConfig("Points", "500,600;600,200;");//屏幕坐标,以;结尾
resRectangle = map.CreateResponser("UIRectangleResponser", resp);
map.AddResponser(resRectangle);
}
//移除矩形响应器
function RemoveRectangle() {
map.RemoveResponser("UIRectangleResponser"); /////移除矩形响应器
resRectangle = null;
}
//*************************************************************************
//截图响应器
//*************************************************************************
var resSceneShot;
//添加截图响应器
function AddResImagecut() {
var resp = map.CreateResponserOptions("SceneshotResponser");
resp.AddConfig("FilePath", "D:\\");/////截图保存目录
resp.AddConfig("FileName", "shot4.jpg"); /////截图保存名称
resp.AddConfig("bIsOrtho", "false");//是否正交投影,false为透视投影,一般都为透视
resp.AddConfig("bUseCache", "false");//是否保存缓存
resp.AddConfig("ImageMultiple", "2");//截图倍数
resp.AddConfig("JoinMultiple", "2");//拼接倍数
//resp.AddConfig("ImageWidth", "1024");//图片宽度,不设及默认自动获取屏幕大小
//resp.AddConfig("ImageHeight", "768");//图片高度,不设及默认自动获取屏幕大小
resp.AddConfig("LodScale", "1.0");//模型加载衰减,1为默认值,范围0-正无穷大,0-1之间会让模型更清楚,大于1会导致模型模糊,普通截图一般不设置该参数
resSceneShot = map.CreateResponser("SceneshotResponser", resp);
resSceneShot.AddObserver();
map.AddResponser(resSceneShot);
}
//移除截图响应器
function RemoveResImagecut() {
map.RemoveResponser("SceneshotResponser"); /////移除截图响应器,必须为SceneshotResponser
}
C++调用
BaseObjectCOMLib::ILayerObjectPtr facadeLayer;//沿街立面分析图层对象
void CfacadeDlg::OnBnClickedCreatefacadelayer()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade ");//创建分析图层配置,任意名称
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo->AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo->AddConfig("PointColor", "1,0,0,1.0");//点颜色(RGBA),默认红色
tlo->AddConfig("PointSize", "5");//点的大小,默认5
tlo->AddConfig("LineColor", "0.0,1.0,0.0,1.0");//线颜色,默认绿色
tlo->AddConfig("LineWidth", "2.0");//线宽(0-10),默认1
tlo->AddConfig("ResponseMode", "0");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
tlo->AddConfig("ViewDirection", "1");//观察方向。以绘制的第一个点到第二个点为参考方向。1-左侧;2-右侧。无默认值,必须设置
tlo->AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo->AddConfig("Fovy", "45");//张角。该值必须与FacadeMode同时设置,默认为"0"
tlo->AddConfig("ZNear", "1000");//近截面距离,默认为100
tlo->AddConfig("ZFar", "50000");//远截面距离,默认为100000
facadeLayer = map->CreateLayer("AnalysisLayer", tlo); //创建分析图层,第一项参数必须为AnalysisLayer
map->AddLayer(facadeLayer); //添加分析图层
facadeLayer->AddObserver();
}
void CfacadeDlg::OnBnClickedUpdatefacadelayer()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade ");//创建分析图层配置,给配置起个名称
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置,必须是此键值对
tlo->AddConfig("DataSourceTypeName", "as_facade"); //数据源类型,as_facade代表沿街立面
tlo->AddConfig("ViewDirection", "1");//观察方向。以绘制的第一个点到第二个点为参考方向。1-左侧;2-右侧。无默认值,必须设置
tlo->AddConfig("FacadeMode", "2");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo->AddConfig("ZNear", "1000");//近截面距离,默认为100
tlo->AddConfig("ZFar", "50000");//远截面距离,默认为100000
facadeLayer->UpdateLayerOptions(tlo); //更新沿街立面
}
void CfacadeDlg::OnBnClickedGetfacadelayer()
{
ConfigOptionsCOMLib::ILayerOptionsPtr opt = facadeLayer->GetLayerResult();//获取图层结果
//判断当前图层数据源类型
std::string DataSourceTypeName = opt->GetConfigValueByKey("DataSourceTypeName");//获得数据源类型
if(DataSourceTypeName == "as_facade")
{
CString ClickPoints = opt->GetConfigValueByKey("ClickPoints");//获取点击坐标
MessageBox(L"ClickPoints:" + ClickPoints);
CString Rigth = opt->GetConfigValueByKey("PerspectiveRight");//获取相机右侧最大值
MessageBox(L"PerspectiveRight:" + Rigth);
CString Top = opt->GetConfigValueByKey("PerspectiveTop");//获取相机上侧最大值
MessageBox(L"PerspectiveTop:" + Top);
}
}
void CfacadeDlg::OnBnClickedRemovefacadelayer()
{
map->RemoveLayer(facadeLayer);//删除沿街立面
facadeLayer = NULL;
}
void CfacadeDlg::OnBnClickedEnlarge()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo->AddConfig("ResponseMode", "1");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer->UpdateLayerOptions(tlo);
AddRectangle();//绘制矩形响应器
}
void CfacadeDlg::OnBnClickedNarrow()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo->AddConfig("ResponseMode", "2");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer->UpdateLayerOptions(tlo);
}
void CfacadeDlg::OnBnClickedRestore()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo->AddConfig("ResponseMode", "0");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer->UpdateLayerOptions(tlo);
}
void CfacadeDlg::OnBnClickedProjectrigthdown()
{
if(ProjectRigth < 10 )
{
MessageBox(L"宽度不可小于0");
return;
}
ProjectRigth = ProjectRigth-10;
double ProjectLeft = -ProjectRigth;
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo->AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo->AddConfig("ProjectRigth", DoubleToString(ProjectRigth).c_str());//设置右侧宽度值,与左侧宽度必须对称
tlo->AddConfig("ProjectLeft", DoubleToString(ProjectLeft).c_str());//设置左侧宽度值,与右侧宽度必须对称
tlo->AddConfig("ProjectBottom", DoubleToString(-ProjectTop).c_str());//设置底部高度值
facadeLayer->UpdateLayerOptions(tlo);
}
void CfacadeDlg::OnBnClickedProjectrigthup()
{
if(ProjectRigth +10> PerspectiveRight)
{
MessageBox(L"宽度不可大于原始相机宽度");
return;
}
ProjectRigth = ProjectRigth+10;
double ProjectLeft = -ProjectRigth;
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo->AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo->AddConfig("ProjectRigth", DoubleToString(ProjectRigth).c_str());//设置右侧宽度值,与左侧宽度必须对称
tlo->AddConfig("ProjectLeft", DoubleToString(ProjectLeft).c_str());//设置左侧宽度值,与右侧宽度必须对称
tlo->AddConfig("ProjectBottom", DoubleToString(-ProjectTop).c_str());//设置底部高度值
facadeLayer->UpdateLayerOptions(tlo);
}
void CfacadeDlg::OnBnClickedProjecttopdown()
{
if(ProjectTop <10)
{
MessageBox(L"高度不可小于0");
return;
}
ProjectTop = ProjectTop-10;
double ProjectBottom = -ProjectTop;
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo->AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo->AddConfig("ProjectRigth", DoubleToString(PerspectiveRight).c_str());//设置右侧宽度值,与左侧宽度必须对称
tlo->AddConfig("ProjectLeft", DoubleToString(-PerspectiveRight).c_str());//设置左侧宽度值,与右侧宽度必须对称
tlo->AddConfig("ProjectBottom", DoubleToString(ProjectBottom).c_str());//设置底部高度值
facadeLayer->UpdateLayerOptions(tlo);
}
void CfacadeDlg::OnBnClickedProjecttopup()
{
if(ProjectTop +10> PerspectiveTop)
{
MessageBox(L"高度不可大于原始相机高度");
return;
}
ProjectTop = ProjectTop+10;
double ProjectBottom = -ProjectTop;
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("as_facade");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo->AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo->AddConfig("ProjectRigth", DoubleToString(PerspectiveRight).c_str());//设置右侧宽度值,与左侧宽度必须对称
tlo->AddConfig("ProjectLeft", DoubleToString(-PerspectiveRight).c_str());//设置左侧宽度值,与右侧宽度必须对称
tlo->AddConfig("ProjectBottom", DoubleToString(ProjectBottom).c_str());//设置底部高度值
facadeLayer->UpdateLayerOptions(tlo);
}
void CfacadeDlg::OnBnClickedAddresimagecut()
{
ConfigOptionsCOMLib::IResponserOptionPtr resp = map->CreateResponserOptions("SceneshotResponser");
resp->AddConfig("FilePath", "D:\\");/////截图保存目录
resp->AddConfig("FileName", "shot4.jpg"); /////截图保存名称
resp->AddConfig("bIsOrtho", "false");//是否正交投影,false为透视投影,一般都为透视
resp->AddConfig("bUseCache", "false");//是否保存缓存
resp->AddConfig("ImageMultiple", "2");//截图倍数
resp->AddConfig("JoinMultiple", "2");//拼接倍数
//resp->AddConfig("ImageWidth", "1024");//图片宽度,不设及默认自动获取屏幕大小
//resp->AddConfig("ImageHeight", "768");//图片高度,不设及默认自动获取屏幕大小
resp->AddConfig("LodScale", "1.0");//模型加载衰减,1为默认值,范围0-正无穷大,0-1之间会让模型更清楚,大于1会导致模型模糊,普通截图一般不设置该参数
resSceneShot = map->CreateResponser("SceneshotResponser", resp);
resSceneShot->AddObserver();
map->AddResponser(resSceneShot);
}
void CfacadeDlg::OnBnClickedRemoveresimagecut()
{
map->RemoveResponser("SceneshotResponser"); /////移除截图响应器,必须为SceneshotResponser
}
//添加矩形响应器
void CfacadeDlg::AddRectangle() {
ConfigOptionsCOMLib::IResponserOptionPtr resp = map->CreateResponserOptions("UIRectangleResponser");
resp->AddConfig("LineColor", "0.0,0.0,1.0,1.0");//设置线的颜色
resp->AddConfig("LineWidth", "2");//线宽(0-10)
resp->AddConfig("IsDragMode", "true");//是否为拖拽模式,拖拽模式下,需要按住鼠标进行绘制,默认为false
//下列二个配置可选
//resp->AddConfig("IsLoad", "false");//是否预加载
//resp->AddConfig("Points", "500,600;600,200;");//屏幕坐标,以;结尾
resRectangle = map->CreateResponser("UIRectangleResponser", resp);
map->AddResponser(resRectangle);
}
//移除矩形响应器
void CfacadeDlg::RemoveRectangle() {
map->RemoveResponser("UIRectangleResponser"); /////移除矩形响应器
resRectangle = NULL;
}
std::string CfacadeDlg::DoubleToString(DOUBLE num)
{
std::stringstream streamStd;
streamStd << num;
return streamStd.str();
}
//回调执行函数
void CfacadeDlg::FireOnLayerNotifyVpsdkctrl1(LPCTSTR idInfo, long layerType)
{
ConfigOptionsCOMLib::ILayerOptionsPtr opt = facadeLayer->GetLayerResult();
std::string DataSourceTypeName = opt->GetConfigValueByKey("DataSourceTypeName");//获得数据源类型
if(DataSourceTypeName == "as_facade" && isGetPerspective == false)
{
CString Rigth = opt->GetConfigValueByKey("PerspectiveRight");//获取相机右侧最大值
PerspectiveRight = _ttof(Rigth);
ProjectRigth = _ttof(Rigth);
CString Top = opt->GetConfigValueByKey("PerspectiveTop"); //获取相机左侧最大值
PerspectiveTop = _ttof(Top) - 0.01;
ProjectTop = _ttof(Top) -0.01;
isGetPerspective = true;
}
}
//鼠标左键抬起回调
void CfacadeDlg::FireOnLButtonUpVpsdkctrl1(short xPos, short yPos)
{
if(resRectangle!=NULL)
{
RemoveRectangle();
}
}
C#调用
ILayerObject facadeLayer;
bool isGetPerspective = false;
double PerspectiveRight = 0;
double PerspectiveTop = 0;
double ProjectRigth = 0;
double ProjectTop = 0;
//创建沿街立面
private void CreateFacadeLayer_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("as_facade ");//创建分析图层配置,任意名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("PointColor", "1,0,0,1.0");//点颜色(RGBA),默认红色
tlo.AddConfig("PointSize", "5");//点的大小,默认5
tlo.AddConfig("LineColor", "0.0,1.0,0.0,1.0");//线颜色,默认绿色
tlo.AddConfig("LineWidth", "2.0");//线宽(0-10),默认1
tlo.AddConfig("ResponseMode", "0");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
tlo.AddConfig("ViewDirection", "1");//观察方向。以绘制的第一个点到第二个点为参考方向。1-左侧;2-右侧。无默认值,必须设置
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("Fovy", "45");//张角。该值必须与FacadeMode同时设置,默认为"0"
tlo.AddConfig("ZNear", "1000");//近截面距离,默认为100
tlo.AddConfig("ZFar", "50000");//远截面距离,默认为100000
facadeLayer = map.CreateLayer("AnalysisLayer", tlo); //创建分析图层,第一项参数必须为AnalysisLayer
map.AddLayer(facadeLayer); //添加分析图层
facadeLayer.AddObserver();
}
//更新沿街立面
//当做更新操作时,只需把需要更新的参数构建更新配置参数就可以,不需要更新的参数不需要在设置
private void UpdateFacadeLayer_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("as_facade ");//创建分析图层配置,给配置起个名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置,必须是此键值对
tlo.AddConfig("DataSourceTypeName", "as_facade"); //数据源类型,as_facade代表沿街立面
tlo.AddConfig("ViewDirection", "1");//观察方向。以绘制的第一个点到第二个点为参考方向。1-左侧;2-右侧。无默认值,必须设置
tlo.AddConfig("FacadeMode", "2");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ZNear", "1000");//近截面距离,默认为100
tlo.AddConfig("ZFar", "50000");//远截面距离,默认为100000
facadeLayer.UpdateLayerOptions(tlo); //更新沿街立面
}
//获取沿街立面结果
private void GetFacadeLayer_Click(object sender, EventArgs e)
{
ILayerOptions opt = facadeLayer.GetLayerResult();//获取图层结果
//判断当前图层数据源类型
if (opt.GetConfigValueByKey("DataSourceTypeName") == "as_facade")
{
string ClickPoints = opt.GetConfigValueByKey("ClickPoints");//获取点击坐标
MessageBox.Show("ClickPoints:" + ClickPoints);
string Rigth = opt.GetConfigValueByKey("PerspectiveRight");//获取相机右侧最大值
MessageBox.Show("PerspectiveRight:" + Rigth);
string Top = opt.GetConfigValueByKey("PerspectiveTop");//获取相机上侧最大值
MessageBox.Show("PerspectiveTop:" + Top);
}
}
//删除沿街立面
private void RemoveFacadeLayer_Click(object sender, EventArgs e)
{
map.RemoveLayer(facadeLayer);//删除沿街立面
}
//放大
private void Enlarge_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("ResponseMode", "1");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer.UpdateLayerOptions(tlo);
AddRectangle();//绘制矩形响应器
}
//缩小
private void Narrow_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("ResponseMode", "2");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer.UpdateLayerOptions(tlo);
}
//复原
private void Restore_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("ResponseMode", "0");//漫游响应模式。1-放大;2-缩小;0-复原操作。创建时只能为"0",默认为0
facadeLayer.UpdateLayerOptions(tlo);
}
//宽度减少
private void ProjectRigthDown_Click(object sender, EventArgs e)
{
if (ProjectRigth < 10)
{
MessageBox.Show("宽度不可小于0");
return;
}
ProjectRigth = ProjectRigth - 10;
double ProjectLeft = -ProjectRigth;
ILayerOptions tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ProjectRigth", ProjectRigth.ToString());//设置右侧宽度值,与左侧宽度必须对称
tlo.AddConfig("ProjectLeft", ProjectLeft.ToString());//设置左侧宽度值,与右侧宽度必须对称
tlo.AddConfig("ProjectBottom", (-ProjectTop).ToString());//设置底部高度值
facadeLayer.UpdateLayerOptions(tlo);
}
//宽度增加
private void ProjectRigthUp_Click(object sender, EventArgs e)
{
if (ProjectRigth + 10 > PerspectiveRight)
{
MessageBox.Show("宽度不可大于原始相机宽度");
return;
}
ProjectRigth = ProjectRigth + 10;
double ProjectLeft = -ProjectRigth;
ILayerOptions tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ProjectRigth", ProjectRigth.ToString());//设置右侧宽度值,与左侧宽度必须对称
tlo.AddConfig("ProjectLeft", ProjectLeft.ToString());//设置左侧宽度值,与右侧宽度必须对称
tlo.AddConfig("ProjectBottom", (-ProjectTop).ToString());//设置底部高度值
facadeLayer.UpdateLayerOptions(tlo);
}
//高度减少
private void ProjectTopDown_Click(object sender, EventArgs e)
{
if (ProjectTop + 10 > PerspectiveTop)
{
MessageBox.Show("高度不可大于原始相机高度");
return;
}
ProjectTop = ProjectTop + 10;
double ProjectBottom = -ProjectTop;
ILayerOptions tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ProjectRigth", PerspectiveRight.ToString());//设置右侧宽度值,与左侧宽度必须对称
tlo.AddConfig("ProjectLeft", (-PerspectiveRight).ToString());//设置左侧宽度值,与右侧宽度必须对称
tlo.AddConfig("ProjectBottom", ProjectBottom.ToString());//设置底部高度值
facadeLayer.UpdateLayerOptions(tlo);
}
//高度增加
private void ProjectTopUp_Click(object sender, EventArgs e)
{
if (ProjectTop + 10 > PerspectiveTop)
{
MessageBox.Show("高度不可大于原始相机高度");
return;
}
ProjectTop = ProjectTop + 10;
double ProjectBottom = -ProjectTop;
ILayerOptions tlo = map.CreateLayerOptions("as_facade");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_facade");//数据源类型,as_facade代表沿街立面
tlo.AddConfig("FacadeMode", "1");//观察模式。1-透视投影;2-正视投影;0-返回全局。创建时不能设置为"2",默认为1
tlo.AddConfig("ProjectRigth", PerspectiveRight.ToString());//设置右侧宽度值,与左侧宽度必须对称
tlo.AddConfig("ProjectLeft", (-PerspectiveRight).ToString());//设置左侧宽度值,与右侧宽度必须对称
tlo.AddConfig("ProjectBottom", ProjectBottom.ToString());//设置底部高度值
facadeLayer.UpdateLayerOptions(tlo);
}
ILayerObject resSceneShot;
private void AddResImagecut_Click(object sender, EventArgs e)
{
var resp = map.CreateResponserOptions("SceneshotResponser");
resp.AddConfig("FilePath", "D:\\");/////截图保存目录
resp.AddConfig("FileName", "shot4.jpg"); /////截图保存名称
resp.AddConfig("bIsOrtho", "false");//是否正交投影,false为透视投影,一般都为透视
resp.AddConfig("bUseCache", "false");//是否保存缓存
resp.AddConfig("ImageMultiple", "2");//截图倍数
resp.AddConfig("JoinMultiple", "2");//拼接倍数
//resp.AddConfig("ImageWidth", "1024");//图片宽度,不设及默认自动获取屏幕大小
//resp.AddConfig("ImageHeight", "768");//图片高度,不设及默认自动获取屏幕大小
resp.AddConfig("LodScale", "1.0");//模型加载衰减,1为默认值,范围0-正无穷大,0-1之间会让模型更清楚,大于1会导致模型模糊,普通截图一般不设置该参数
resSceneShot = map.CreateResponser("SceneshotResponser", resp);
resSceneShot.AddObserver();
map.AddResponser(resSceneShot);
}
//移除截图响应器
private void RemoveResImagecut_Click(object sender, EventArgs e)
{
map.RemoveResponser("SceneshotResponser"); /////移除截图响应器,必须为SceneshotResponser
}
//*************************************************************************
//矩形响应器
//*************************************************************************
ILayerObject resRectangle;
//添加矩形响应器
private void AddRectangle()
{
var resp = map.CreateResponserOptions("UIRectangleResponser");
resp.AddConfig("LineColor", "0.0,0.0,1.0,1.0");//设置线的颜色
resp.AddConfig("LineWidth", "2");//线宽(0-10)
resp.AddConfig("IsDragMode", "true");//是否为拖拽模式,拖拽模式下,需要按住鼠标进行绘制,默认为false
//下列二个配置可选
//resp.AddConfig("IsLoad", "false");//是否预加载
//resp.AddConfig("Points", "500,600;600,200;");//屏幕坐标,以;结尾
resRectangle = map.CreateResponser("UIRectangleResponser", resp);
map.AddResponser(resRectangle);
}
//移除矩形响应器
private void RemoveRectangle()
{
map.RemoveResponser("UIRectangleResponser"); /////移除矩形响应器
resRectangle = null;
}
private void axVPSDKCtrl1_FireOnLayerNotify(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnLayerNotifyEvent e)
{
ILayerOptions opt = facadeLayer.GetLayerResult();
if (opt.GetConfigValueByKey("DataSourceTypeName") == "as_facade" && isGetPerspective == false)
{
string Rigth = opt.GetConfigValueByKey("PerspectiveRight");//获取相机右侧最大值
double cRigth = double.Parse(Rigth);
PerspectiveRight = cRigth;
ProjectRigth = cRigth;
string Top = opt.GetConfigValueByKey("PerspectiveTop"); //获取相机左侧最大值
double cTop = double.Parse(Top);
PerspectiveTop = cTop - 0.01;
ProjectTop = cTop - 0.01;
isGetPerspective = true;
}
}
private void axVPSDKCtrl1_FireOnLButtonUp(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnLButtonUpEvent e)
{
if (resRectangle != null)
{
RemoveRectangle();
}
}