1.3 倾斜摄影加载及单体化
倾斜摄影加载
倾斜摄影数据加载是指将自动化建模的倾斜摄影数据加载到场景中进行显示。CooRun SDK支持加载原始的倾斜摄影数据,也支持加载优化后的倾斜摄影数据加载。(科澜提供专业的数据生产及处理服务)。
主要包括添加(创建)、定位、显隐和删除4种操作。
下图是倾斜摄影加载效果:
参数说明
倾斜摄影加载可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
LayerOptionsName | 图层配置对象名称 | string | ModelLayerOptions代表模型图层配置对象 |
DataSourceTypeName | 数据源类型 | string | 本地数据需配置为smesh,服务数据需配置为smeshs |
Url | 数据访问路径 | string | 数据目录中/LAYER00/PRIFIXION_L00_0.osgb.zip文件路径 |
BasePath | 数据的层级路径 | string | 数据的层级目录 |
Compress | 是否压缩 | bool | 如果数据后缀为.zip则配置为true,否则配为false |
Srs | 坐标参考值 | string | 为数据路径下metadata.xml中SRS字段的值 |
OriginPoint | 坐标偏移值 | x,y,z | 为数据路径下metadata.xml中SRSOrigin字段的值 |
IsHasTexture | 是否有纹理 | bool | 默认为true,该参数在进行分析时起效 |
代码调用示例
Javascript调用
var gOsgbPath = "E:/测试数据/Osgb"; //本地压缩倾斜摄影数据层级路径
var osgbLayer = null;
var bVisible = true;
//创建倾斜摄影图层
function createOsgbLayer(){
if(osgbLayer == null){
osgbLayer = loadOsgbLayer(gOsgbPath, "true", true);
}else{
alert("请勿重复创建模型图层!");
}
}
//显隐倾斜摄影图层
function visibleOsgbLayer(){
if(osgbLayer){
osgbLayer.SetVisible(bVisible = !bVisible);//显隐图层
}else{
alert("无模型图层,无法显隐!");
}
}
//定位倾斜摄影图层
function locateOsgbLayer(){
if(osgbLayer){
osgbLayer.Locate();//图层定位
}else{
alert("无模型图层,无法定位!");
}
}
//删除倾斜摄影图层
function removeOsgbLayer(){
if(osgbLayer){
map.RemoveLayer(osgbLayer);//删除图层
osgbLayer = null;
bVisible = true;
}else{
alert("无模型图层,无需移除!");
}
}
//加载倾斜摄影图层
function loadOsgbLayer(url, compress, isLocate){
var dataType = "smesh";
if(url.indexOf('http') == -1){
dataType = "smesh";
}else{
dataType = "smeshs";
}
var tlo = map.CreateLayerOptions("osgbOpt");//创建图层配置对象,任意名称
tlo.AddConfig("LayerOptionsName", "ModelLayerOptions");//图层配置对象名称, ModelLayerOptions代表模型图层配置对象
tlo.AddConfig("DataSourceTypeName", dataType);//数据源类型
tlo.AddConfig("Url", url + "/LAYER00/PRIFIXION_L00_0.osgb.zip");//数据路径
tlo.AddConfig("Srs", "EPSG:4549");//坐标参考值
tlo.AddConfig("OriginPoint", "521059,3343006,0");//坐标偏移值
tlo.AddConfig("BasePath", url);//数据的层级路径,最后面没有斜线
tlo.AddConfig("Compress", compress);//是否压缩数据
var osgblayer = map.CreateLayer("ModelLayer", tlo);//创建倾斜摄影图层对象,第一项参数必须为ModelLayer
map.AddLayer(osgblayer);//添加图层对象
if(isLocate){
osgblayer.Locate();//图层定位
}
return osgblayer;
}
C++调用
std::string OsgbPath = "E:\\测试数据\\Osgb"; //本地压缩倾斜摄影数据路径
BaseObjectCOMLib::ILayerObjectPtr osgbLayer;//倾斜摄影图层
//创建倾斜摄影图层
void Cf0c2OSGBDlg::OnBnClickedcreateosgblayer()
{
//如果倾斜摄影图层存在
if(osgbLayer)
{
return;
}
char temp_status[MAX_PATH];
GetPrivateProfileStringA("Path", "OsgbPath", "", temp_status, MAX_PATH, mIniPath.c_str());
std::string OsgbPath(temp_status);
osgbLayer = loadOsgbLayer(OsgbPath,"true",true);
}
//显隐倾斜摄影图层
void Cf0c2OSGBDlg::OnBnClickedvisibleosgblayer()
{
//如果倾斜摄影图层为空
if(!osgbLayer)
{
return;
}
static bool osgbVisble = true;
osgbLayer->SetVisible(osgbVisble = !osgbVisble); //显隐倾斜摄影数据
}
//定位倾斜摄影图层
void Cf0c2OSGBDlg::OnBnClickedlocateosgblayer()
{
//如果倾斜摄影图层为空
if(!osgbLayer)
{
return;
}
osgbLayer->Locate(); //倾斜摄影图层定位
}
//删除倾斜摄影图层
void Cf0c2OSGBDlg::OnBnClickedremoveosgblayer()
{
//如果倾斜摄影图层为空
if(!osgbLayer)
{
return;
}
map->RemoveLayer(osgbLayer); //删除倾斜摄影数据
osgbLayer=NULL;
}
//加载倾斜摄影数据
BaseObjectCOMLib::ILayerObjectPtr Cf0c2OSGBDlg::loadOsgbLayer(std::string url,std::string compress,BOOL isLocate)
{
std::string dataType="smesh";
if(!url.find("http"))//判断是否网络加载
{
dataType = "smeshs";//数据源类型,服务数据
}
else
{
dataType = "smesh";//数据源类型,本地数据
}
std::string urlIndex=url+"/LAYER00/PRIFIXION_L00_0.osgb.zip";
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("osgbOpt");//创建图层配置对象,任意名称
tlo->AddConfig("LayerOptionsName", "ModelLayerOptions"); //图层配置对象名称, ModelLayerOptions代表模型图层配置对象
tlo->AddConfig("DataSourceTypeName", dataType.c_str());//数据源类型
tlo->AddConfig("Url", urlIndex.c_str());//数据路径
tlo->AddConfig("Srs", "EPSG:4549");//坐标参考值
tlo->AddConfig("OriginPoint", "521059,3343006,0");//坐标偏移值
tlo->AddConfig("BasePath", url.c_str());//数据的层级路径,最后面没有斜线
tlo->AddConfig("Compress", compress.c_str());//是否压缩数据
BaseObjectCOMLib::ILayerObjectPtr osgblayer = (BaseObjectCOMLib::ILayerObjectPtr)map->CreateLayer("ModelLayer", tlo);//创建倾斜摄影图层对象,第一项参数必须为ModelLayer
map->AddLayer(osgblayer);//添加图层对象
if(isLocate)//判断是否定位
{
osgblayer->Locate(); ////模型图层定位
}
return osgblayer;//返回模型图层
}
C#调用
var gOsgbPath = "http://192.168.1.50:8088/files/Osgb";
ILayerObject osgbLayer;//倾斜摄影图层
bool bVisible;//显隐控制
//创建倾斜摄影图层
private void createOsgbLayer_Click(object sender, EventArgs e)
{
if (osgbLayer == null)
{
osgbLayer = loadOsgbLayer(OsgbPath, "true", true);
}
else
{
MessageBox.Show("请勿重复创建模型图层!");
}
}
//显隐倾斜摄影图层
private void visibleOsgbLayer_Click(object sender, EventArgs e)
{
if (osgbLayer!=null)
{
osgbLayer.SetVisible(bVisible = !bVisible);//显隐图层
}
}
//定位倾斜摄影图层
private void locateOsgbLayer_Click(object sender, EventArgs e)
{
if (osgbLayer != null)
{
osgbLayer.Locate();//图层定位
}
}
//删除倾斜摄影图层
private void removeOsgbLayer_Click(object sender, EventArgs e)
{
if (osgbLayer != null)
{
map.RemoveLayer(osgbLayer);//删除图层
osgbLayer = null;
bVisible = true;
}
}
//加载倾斜摄影图层
private ILayerObject loadOsgbLayer(string url, string compress, bool isLocate){
string dataType = "smesh";
if(url.IndexOf("http") == -1){
dataType = "smesh";
}else{
dataType = "smeshs";
}
var tlo = map.CreateLayerOptions("osgbOpt");//创建图层配置对象,任意名称
tlo.AddConfig("LayerOptionsName", "ModelLayerOptions");//图层配置对象名称, ModelLayerOptions代表模型图层配置对象
tlo.AddConfig("DataSourceTypeName", dataType);//数据源类型
tlo.AddConfig("Url", url + "/LAYER00/PRIFIXION_L00_0.osgb.zip");//数据路径
tlo.AddConfig("Srs", "EPSG:4549");//坐标参考值
tlo.AddConfig("OriginPoint", "521059,3343006,0");//坐标偏移值
tlo.AddConfig("BasePath", url);//数据的层级路径,最后面没有斜线
tlo.AddConfig("Compress", compress);//是否压缩数据
tlo.AddConfig("IsHasTexture", "true");//是否有纹理,默认为true,该参数在进行分析时起效
var osgblayer = map.CreateLayer("ModelLayer", tlo);//创建倾斜摄影图层对象,第一项参数必须为ModelLayer
map.AddLayer(osgblayer);//添加图层对象
if(isLocate){
osgblayer.Locate();//图层定位
}
return osgblayer;
}
单体化拾取
单体化拾取是指通过单体化的方式实现倾斜摄影的拾取操作,达到倾斜摄影单个高亮以及获取它的属性信息。
单体化是针对倾斜摄影数据提出来的一个名词,单体化是指每一个我们需要单独管理的,可以被选中,可以赋予属性、可以查询等操作的对象。由于当前的倾斜摄影数据无法做到对数据中的建筑、地面、绿化等进行单个区分,为了在倾斜摄影上做相应业务操作,就需要通过单体化技术来实现。
单体化技术大致分为三类:ID单体化、切割单体化和动态单体化。这里我们采用了动态单体化的方式,即通过叠加矢量底面,动态渲染出单体化效果。
单体化的流程包括:加载倾斜摄影数据,加载矢量底面数据,创建单体化拾取响应器,场景中点击,倾斜摄影高亮并返回属性值五个步骤。
注1:单体化拾取响应器可以更新,更新时可对所有参数都进行更新。
注2:必须先加载倾斜摄影和矢量底面数据。矢量底面数据加载参考矢量面加载, 事件处理添加与删除参考addEvent方法和 delEvent方法
下图是单体化拾取效果:
参数说明
单体化拾取响应器可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
PickLayerIdList | 图层ID列表 | int列表 | 传-1则默认遍历所有矢量图层,若为多个图层,可使用xx,xx,xx 此种格式。图层Id可以通过图层对象的GetLayerId()方法获取 |
PickAssignLayerIdList | string | int列表 | 传-1则默认遍历所有倾斜摄影、模型图层。若为多个图层,可使用 xx,xx,xx此种格式。图层Id可以通过图层对象的GetLayerId()方法获取 |
PickColor | 颜色透明度 | R,G,B,A | 颜色值类型在0-1.0之间,如 "0.9,0.8,0.8,1.0",A的取值必须大于0.2 |
IsChangeColor | 是否变色 | bool | 默认值false,设为true,则PickColor 配置的颜色起效 |
HeightValue | 拉伸高度值 | double | 从矢量底面向上拉伸的高度值,必须设置 |
代码调用示例
Javascript调用
var event = null;
var pickObliqueResponser = null;
//创建单体化拾取响应器
function createObliquePickResponser(){
if(singleShpLayer == null){
alert("请创建拾取辅助矢量图层!");
return;
}
if(osgbLayer == null){
alert("请创建倾斜摄影图层!");
return;
}
if(event == null){
event = addEvent(obj, "FireOnResponserNotify", callBackFun);//响应器对应事件均为FireOnResponserNotify
}
if(pickObliqueResponser == null){
var pOption = map.CreateResponserOptions("osgb");//创建响应器配置对象,参数任意名称
pOption.AddConfig("PickLayerIdList", singleShpLayer.GetLayerID());//拾取辅助矢量图层id
pOption.AddConfig("PickAssignLayerIdList", osgbLayer.GetLayerID());//倾斜摄影图层id
pOption.AddConfig("IsChangeColor", "true");//是否变色
pOption.AddConfig("PickColor", "1,0,0,0.3");//拾取颜色
pOption.AddConfig("HeightValue", "1000");//拉伸高度值,一般不变
pickObliqueResponser = map.CreateResponser("PickObliqueResponser", pOption);//创建单体化拾取响应器对象,第一参必须为PickObliqueResponser字符串
pickObliqueResponser.AddObserver();//添加监听事件
map.AddResponser(pickObliqueResponser);//添加响应器对象
}else{
alert("单体化拾取响应器已创建,无需重复创建!");
}
}
//更新单体化拾取响应器
function updateObliquePickResponser(){
if(pickObliqueResponser){
var pOption = map.CreateResponserOptions("osgb");//创建响应器配置对象,参数任意名称
pOption.AddConfig("PickColor", "1,1,0,0.3");//拾取颜色
pickObliqueResponser.UpdateResponserOptions(pOption);//更新响应器对象
}else{
alert("单体化拾取响应器不存在,无法更新!");
}
}
//删除单体化拾取响应器
function removeObliquePickResponser(){
if(pickObliqueResponser){
map.RemoveResponser("PickObliqueResponser");//移除响应器
pickObliqueResponser = null;
if(event){
//移除回调事件
delEvent(obj, "FireOnResponserNotify", callBackFun, event);//第四个参数用于IE11事件删除,其他浏览器传null即可
event = null;
}
}else{
alert("单体化拾取响应器已移除,无需重复移除!");
}
}
//响应器回调执行函数
function callBackFun(respType, state){
if(pickObliqueResponser){
var str = pickObliqueResponser.GetResponserResult().GetConfigValueByKey("PickPointList");//获取拾取点位
var pickName = pickObliqueResponser.GetResponserResult().GetConfigValueByKey("id");//获取矢量属性信息
alert("拾取点:" + str + " 名称: " + pickName);
}
}
C++调用
BaseObjectCOMLib::ILayerObjectPtr singleShpLayer;//矢量辅助图层
BaseObjectCOMLib::IResponserObjectPtr pickObliqueResponser;//单体化拾取响应器对象
//创建单体化拾取响应器
void Cf0c2OSGBDlg::OnBnClickedcreateobliquepickresponser()
{
if(!pickObliqueResponser){
std::stringstream stream,stream1;
stream << singleShpLayer->GetLayerID();
ConfigOptionsCOMLib::IResponserOptionPtr resp =(ConfigOptionsCOMLib::IResponserOptionPtr)map->CreateResponserOptions("osgb");//创建响应器配置,参数任意名称
resp->AddConfig("PickLayerIdList", stream.str().c_str());//拾取辅助矢量图层id
stream1 << osgbLayer->GetLayerID();
resp->AddConfig("PickAssignLayerIdList",stream1.str().c_str());//倾斜摄影图层id
resp->AddConfig("PickColor", "1.0,0.0,0.0,0.5");//拾取颜色
resp->AddConfig("IsChangeColor", "true");//是否变色
resp->AddConfig("HeightValue", "1000");//拉伸高度值,一般不变
pickObliqueResponser = map->CreateResponser("PickObliqueResponser", resp);//创建单体化拾取响应器对象,第一参必须为PickObliqueResponser字符串
pickObliqueResponser->AddObserver(); //添加监听
map->AddResponser(pickObliqueResponser); //添加响应器
}
}
//更新单体化拾取响应器
void Cf0c2OSGBDlg::OnBnClickedupdateobliquepickresponser()
{
if(pickObliqueResponser){
ConfigOptionsCOMLib::IResponserOptionPtr resp = (ConfigOptionsCOMLib::IResponserOptionPtr)map->CreateResponserOptions("osgb");//创建响应器配置对象,参数任意名称
resp->AddConfig("PickColor", "1,1,0,0.3");//拾取颜色
pickObliqueResponser->UpdateResponserOptions(resp);//更新响应器对象
}
}
//删除单体化拾取响应器
void Cf0c2OSGBDlg::OnBnClickedremoveobliquepickresponser()
{
if(pickObliqueResponser){
map->RemoveResponser("PickObliqueResponser");//移除响应器
pickObliqueResponser = NULL;
}
}
//响应器回调执行函数
void Cf0c2OSGBDlg::FireOnResponserNotifyVpsdkctrl1(LPCTSTR respType, long notifyType)
{
if(pickObliqueResponser){
ConfigOptionsCOMLib::IResponserOptionPtr respOpt = pickObliqueResponser->GetResponserResult();
CString str = respOpt->GetConfigValueByKey("PickPointList");//获取拾取点位
CString pickName = respOpt->GetConfigValueByKey("id");//获取矢量属性信息
MessageBox(L"拾取点:"+ str+ L"\r\n名称:"+pickName);
}
}
C#调用
//创建单体化拾取响应器
private void createObliquePickResponser_Click(object sender, EventArgs e)
{
IResponserOption pOption = map.CreateResponserOptions("osgb");//创建响应器配置对象,参数任意名称
pOption.AddConfig("PickLayerIdList", ogrlayer.GetLayerID().ToString());//拾取辅助矢量图层id
pOption.AddConfig("PickAssignLayerIdList", osgbLayer.GetLayerID().ToString());//倾斜摄影图层id
pOption.AddConfig("IsChangeColor", "true");//是否变色
pOption.AddConfig("PickColor", "1,0,0,0.3");//拾取颜色
pOption.AddConfig("HeightValue", "1000");//拉伸高度值,一般不变
pickObliqueResponser = map.CreateResponser("PickObliqueResponser", pOption);//创建单体化拾取响应器对象,第一参必须为PickObliqueResponser字符串
pickObliqueResponser.AddObserver();//添加监听事件
map.AddResponser(pickObliqueResponser);//添加响应器对象
}
//更新单体化拾取响应器
private void updateObliquePickResponser_Click(object sender, EventArgs e)
{
if (pickObliqueResponser!=null)
{
IResponserOption pOption = map.CreateResponserOptions("osgb");//创建响应器配置对象,参数任意名称
pOption.AddConfig("PickColor", "1,1,0,0.3");//拾取颜色
pickObliqueResponser.UpdateResponserOptions(pOption);//更新响应器对象
}
}
//删除单体化拾取响应器
private void removeObliquePickResponser_Click(object sender, EventArgs e)
{
if (pickObliqueResponser!=null)
{
map.RemoveResponser("PickObliqueResponser");//移除响应器
pickObliqueResponser = null;
}
}
//响应器回调执行函数
private void axVPSDKCtrl1_FireOnResponserNotify(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnResponserNotifyEvent e)
{
if (pickObliqueResponser!=null)
{
string str = pickObliqueResponser.GetResponserResult().GetConfigValueByKey("PickPointList");//获取拾取点位
string pickName = pickObliqueResponser.GetResponserResult().GetConfigValueByKey("id");//获取矢量属性信息
MessageBox.Show("拾取点:" + str + " 名称: " + pickName);
}
}