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();
    }
}

results matching ""

    No results matching ""