2.7.3 截图功能
截图功能
截图功能是指将当前三维地图中展示的数据通过截屏的方式保存成图片。支持普通截图和高清截图两种模式。
截图功能是通过响应器对象实现的,主要包括添加(创建)和删除2种操作。
下图是截图功能效果:
参数说明
截图功能可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
FilePath | 文件目录 | string | 截图文件保存目录 |
FileName | 图片名称 | string | 截图图片名称 |
bIsOrtho | 是否正交投影 | bool | 截图相机的投影方式,true-正交投影;false-透视投影。 正常使用透视投影 |
ImageMultiple | 截图倍数 | int | 设定多倍截图的倍数。默认:1-单倍截图 |
JoinMultiple | 拼接倍数 | int | 设定多倍截图的拼接倍数。一般与ImageMultiple 的值保持一致。 默认:1-单倍拼接 |
ImageWidth | 图片宽度 | int | 单个画面中的图片宽度。一般不设,会自动获取当前场景屏幕的宽度 |
ImageHeight | 图片高度 | int | 单个画面中的图片高度。一般不设,会自动获取当前场景屏幕的高度 |
LodScale | 模型加载衰减值 | float | 模型加载衰减。默认:1.0,范围0-正无穷大,0-1之间会让模型更清楚,大于1会导致模型模糊,高清截图一般设置为0 |
IsArea | 是否开启高清截图 | bool | 设定是否开启高清截图。true-开启;false-不开启。默认为false不开启 |
代码调用示例
Javascript调用
//回调实现函数
function callBackFun(respType, state){
//respType为响应器类型,state为执行进度,范围0-100,100标识截图成功,0标识失败
if(state == 100){
alert("respType为响应器类型,state为执行进度,范围0-100,100标识截图成功,0标识失败\n respType:" + respType + " state:" + state);
screenDoingState = false;//截图开始即设置标识为false
removeImageCut();//截图完成后务必执行移除
}
}
var event;
var resSceneShot = null;//响应器对象
var screenDoingState = false;//截图是否在执行状态
//普通截图--其适用于任何场景情况,截图过程中请勿创建或者删除响应器
function commonImageCut() {
if(screenDoingState){
alert("正在截图,请勿重复创建!");
return;
}
if(resSceneShot == null){
event = addEvent(obj, "FireOnResponserNotify", callBackFun);//响应器对应事件均为FireOnResponserNotify
var resp = map.CreateResponserOptions("SceneshotResponser");//创建响应器配置对象,参数任意名称
resp.AddConfig("FilePath", "C:\\");//截图保存目录
resp.AddConfig("FileName", "imageCommonTest.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);//创建响应器对象,SceneshotResponser代表截图响应器
resSceneShot.AddObserver();//开启事件回调
map.AddResponser(resSceneShot);//添加响应器
screenDoingState = true;//截图开始即设置标识为true
}else{
alert("请勿重复截图!");
}
}
//高清截图--其适用于低空环境下,对地面建筑的截图,截图过程中请勿创建或者删除响应器
function highImageCut() {
if(screenDoingState){
alert("正在截图,请勿重复创建!");
return;
}
if(resSceneShot == null){
event = addEvent(obj, "FireOnResponserNotify", callBackFun);//响应器对应事件均为FireOnResponserNotify
var resp = map.CreateResponserOptions("SceneshotResponser");//创建响应器配置对象,参数任意名称
resp.AddConfig("FilePath", "C:\\");//截图保存目录
resp.AddConfig("FileName", "imageHighTest.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", "0.0");//模型加载衰减,1为默认值,范围0-正无穷大,0-1之间会让模型更清楚,大于1会导致模型模糊,高清截图一般设置为0
resp.AddConfig("IsArea", "1"); //是否开启高清截图
resSceneShot = map.CreateResponser("SceneshotResponser", resp);//创建响应器对象,SceneshotResponser代表截图响应器
resSceneShot.AddObserver();
map.AddResponser(resSceneShot);//添加响应器
screenDoingState = true;
}else{
alert("请勿重复截图!");
}
}
//移除截图响应器,截图完毕后务必移除,截图过程中请勿创建或者删除响应器
function removeImageCut(){
if(screenDoingState){
alert("正在截图,请勿删除!");
return;
}
if(resSceneShot != null){
map.RemoveResponser("SceneshotResponser");
resSceneShot = null;
delEvent(obj, "FireOnResponserNotify", callBackFun, event);//第四个参数用于IE11事件删除,其他浏览器传null即可
}
}
C++调用
BaseObjectCOMLib::IResponserObjectPtr resSceneShot;//截图响应器对象
bool screenDoingState;//截图是否正在执行
//普通截图--其适用于任何场景情况,截图过程中请勿创建或者删除响应器
void Cf6c2SceneshotDlg::OnBnClickedcommonimagecut()
{
if(screenDoingState)
{
std::cout << "截图进行中,请勿重复执行" << std::endl;
return;
}
if(resSceneShot)
{
return;
}
ConfigOptionsCOMLib::IResponserOptionPtr resp = map->CreateResponserOptions("");//创建响应器配置,参数任意名称
resp->AddConfig("FilePath", "C:\\");//截图保存目录
resp->AddConfig("FileName", "imageCommonTest.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);//创建响应器对象,SceneshotResponser代表截图响应器
resSceneShot->AddObserver();//开启事件回调
map->AddResponser(resSceneShot);//添加响应器
screenDoingState = TRUE;//截图开始即设置标识为true
}
//高清截图
void Cf6c2SceneshotDlg::OnBnClickedhighimagecut()
{
if(screenDoingState)
{
std::cout << "截图进行中,请勿重复执行" << std::endl;
return;
}
if(resSceneShot)
{
return;
}
ConfigOptionsCOMLib::IResponserOptionPtr resp = map->CreateResponserOptions("");//创建响应器配置,参数任意名称
resp->AddConfig("FilePath", "C:\\");//截图保存目录
resp->AddConfig("FileName", "imageHighTest.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", "0.0");//模型加载衰减,1为默认值,范围0-正无穷大,0-1之间会让模型更清楚,大于1会导致模型模糊,高清截图一般设置为0
resp->AddConfig("IsArea", "1"); //是否开启高清截图
resSceneShot = map->CreateResponser("SceneshotResponser", resp);//创建响应器对象,SceneshotResponser代表截图响应器
resSceneShot->AddObserver();//开启事件回调
map->AddResponser(resSceneShot);//添加响应器
screenDoingState = TRUE;//截图开始即设置标识为true
}
//移除截图响应器
void Cf6c2SceneshotDlg::OnBnClickedremoveimagecut()
{
if(screenDoingState)
{
std::cout << "截图进行中,请勿删除" << std::endl;
return;
}
if(!resSceneShot)
{
return;
}
map->RemoveResponser("SceneshotResponser");
resSceneShot = NULL;
}
//截图状态回调
void Cf6c2SceneshotDlg::FireOnResponserNotifyVpsdkctrl1(LPCTSTR respType, long notifyType)
{
//respType为响应器类型,state为执行进度,范围0-100,100标识截图成功,0标识失败
if(notifyType == 100){
MessageBox(L"respType为响应器类型,state为执行进度,范围0-100,100标识截图成功,0标识失败\n respType:" + respType + " state:" + notifyType);
screenDoingState = FALSE;
OnBnClickedremoveimagecut();//截图完成后请务必执行清除
}
}
C#调用
IResponserObject resSceneShot;//截图响应器对象
bool screenDoingState = false;//截图是否在执行状态
//普通截图--其适用于任何场景情况,截图过程中请勿创建或者删除响应器
private void commonImageCut_Click(object sender, EventArgs e)
{
if(screenDoingState){
MessageBox.Show("正在截图,请勿重复创建!");
return;
}
if(resSceneShot == null){
var resp = map.CreateResponserOptions("SceneshotResponser");//创建响应器配置对象,参数任意名称
resp.AddConfig("FilePath", "C:\\");//截图保存目录
resp.AddConfig("FileName", "imageCommonTest.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);//创建响应器对象,SceneshotResponser代表截图响应器
resSceneShot.AddObserver();//开启事件回调
map.AddResponser(resSceneShot);//添加响应器
screenDoingState = true;//截图开始即设置标识为true
}else{
MessageBox.Show("请勿重复截图!");
}
}
//高清截图--其适用于低空环境下,对地面建筑的截图,截图过程中请勿创建或者删除响应器
private void highImageCut_Click(object sender, EventArgs e)
{
if(screenDoingState){
MessageBox.Show("正在截图,请勿重复创建!");
return;
}
if(resSceneShot == null){
var resp = map.CreateResponserOptions("SceneshotResponser");//创建响应器配置对象,参数任意名称
resp.AddConfig("FilePath", "C:\\");//截图保存目录
resp.AddConfig("FileName", "imageHighTest.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", "0.0");//模型加载衰减,1为默认值,范围0-正无穷大,0-1之间会让模型更清楚,大于1会导致模型模糊,高清截图一般设置为0
resp.AddConfig("IsArea", "1"); //是否开启高清截图
resSceneShot = map.CreateResponser("SceneshotResponser", resp);//创建响应器对象,SceneshotResponser代表截图响应器
resSceneShot.AddObserver();
map.AddResponser(resSceneShot);//添加响应器
screenDoingState = true;
}else{
MessageBox.Show("请勿重复截图!");
}
}
//移除截图响应器,截图完毕后务必移除,截图过程中请勿创建或者删除响应器
private void removeImageCut_Click(object sender, EventArgs e)
{
if(screenDoingState){
MessageBox.Show("正在截图,请勿删除!");
return;
}
if(resSceneShot != null){
map.RemoveResponser("SceneshotResponser");
resSceneShot = null;
}
}
//回调实现函数
private void axVPSDKCtrl1_FireOnResponserNotify(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnResponserNotifyEvent e)
{
//respType为响应器类型,state为执行进度,范围0-100,100标识截图成功,0标识失败
if(e.notifyType == 100){
MessageBox.Show("respType为响应器类型,state为执行进度,范围0-100,100标识截图成功,0标识失败\n respType:" + e.respType + " state:" + e.notifyType);
screenDoingState = false;//截图开始即设置标识为false
map.RemoveResponser("SceneshotResponser");//截图完成后务必执行移除
resSceneShot = null;
}
}