目录

接下来看在JS中的方法:

1.手动添加热点(点击图上添加点)

2.查找热点

3.修改热点

4.删除热点

其他方法


作为管理员,在管理全景时会涉及到各个标签的操作,本篇文章介绍在JS中对热点的操作,其数据可传到后端并写入数据库。

首先先给一个在xml文件中的动态热点添加的方法,下面的代码直接把两个url图片换了就可以直接看效果:

<hotspot name="mark" url="hotspot.png" scale="0.2" ath="56.614" atv="-27.089" onclick="test();" />
<events onclick="test();" />
<action name="test">screentosphere(mouse.x, mouse.y, h, v);addhotspot(get(hs));set(hotspot[get(hs)].url, 'mark2.png');
</action>

接下来看在JS中的方法:

1.手动添加热点(点击图上添加点)

krpano提供screentosphere(x,y,h,v)spheretoscreen(h,v,x,y,stereoside)方法来进行屏幕和全景坐标转换。

先看第一种方法,这种krpano工程中添加热点的方法:

krpano的每一个全景项目都有一个tour_editor.html文件,这个文件里提供的添加热点的方法是先在固定点添加一个热点,并给热点添加一个可拖动的方法,然后再手动拖动热点到想要添加的地方。

//动态添加热点
function AddHotspot() {var spotname = "addhotspot";var hlookat = 0.000;var vlookat = 0.000;krpano.call("addhotspot(" + spotname + ");");krpano.call("set(hotspot[" + spotname + "].url,../SystemPicture/Mark.png);");krpano.call("set(hotspot[" + spotname + "].ath," + hlookat + ");");krpano.call("set(hotspot[" + spotname + "].atv," + vlookat + ");");krpano.call("set(hotspot[" + spotname + "].ondown,draghotspot(););");
}//获取krpano点坐标 ath-x  atv-y
function GetHotspot(ath, atv) {$('#showpoint').text(ath + '<br />' + atv);//将数据添加到数据库//成功后图上删除该点
}

xml中的代码

     <!--  Drag hotspot  --><!--  The screentosphere action will convert the x/y variables to the h/v variables and the spheretoscreen action the h/v variables to the x/y variables.  --><action name="draghotspot">spheretoscreen(ath, atv, hotspotcenterx, hotspotcentery, 'l');sub(drag_adjustx, mouse.stagex, hotspotcenterx);sub(drag_adjusty, mouse.stagey, hotspotcentery);asyncloop(pressed,sub(dx, mouse.stagex, drag_adjustx);sub(dy, mouse.stagey, drag_adjusty);screentosphere(dx, dy, ath, atv);roundval(ath, 3);roundval(atv, 3);js(GetHotspot(get(ath), get(atv))););</action>

当然,以上代码只提供了方法,还要在JS中添加一个按钮,一个文本框,点击按钮来激活添加点功能,文本框显示全景坐标,这个坐标需要传到后端保存到数据库中。

上面的方法有一个缺点,毕竟如果要目的地在目前视角的对面,由于需要拖动到目的地,所以显得心累……

因此,下面来看第二种方法:

krpano提供的与JS的交互方法中,就有屏幕坐标转换为球面坐标(screentosphere(x,y)),球面坐标转换为屏幕坐标(spheretoscreen(h,v)),获得的结果是一个对象。

function AddAnyHotspot() {//跨浏览器的事件对象var EventUtil = {addHandler:function(elem,type,handler){if(elem.addEventListener){elem.addEventListener(type,handler,false);}else if(elem.attachEvent){elem.attachEvent("on"+type,handler);}else{elem["on"+type]=handler;}},removeHandler:function(elem,type,handler){if(elem.removeEventListener){elem.removeEventListener(type,handler,false);}else if(elem.detachEvent){elem.detachEvent("on"+type,handler);}else{elem["on"+type]=null;}},getEvent:function(event){return event?event:window.event;},getTarget:function(event){return event.target||event.srcElement;},preventDefault:function(event){if(event,preventDefault){event.preventDefault();}else{event.returnValue = false;}},stopPropagation:function(event){if(event.stopPropagation){event.stopPropagation();}else{event.cancelBubble=true;}}};//鼠标点击监听var div = document.getElementById("pano");EventUtil.addHandler(div, "click", function(event){event = EventUtil.getEvent(event);//JS中获取屏幕坐标方法的Y值比krpano中获取方法多66个像素点var sphereXY = krpano.screentosphere(event.screenX, event.screenY - 66);var  sp  = krpano.spheretoscreen(event.screenX, event.screenY - 66);var sphereX = sphereXY.x;var sphereY = sphereXY.y ;krpano.call("addhotspot(kk);");krpano.call("set(hotspot[kk].url,../SystemPicture/Mark.png);");krpano.call("set(hotspot[kk].ath," + sphereX + ");");krpano.call("set(hotspot[kk].atv," + sphereY + ");");});
}

大概是Krpano的获取屏幕坐标点的算法和JS中的不一样,他们获得的屏幕坐标的Y是不相同的,JS大66,所以必须减去。
还是需要在JS中添加一个按钮来调用这个函数哟。

其实我觉得对热点的操作难点应该就是在添加热点了吧,所以其他部分就直接放代码了。

2.查找热点

//查找点
function LookupHotspot() {//手动输入热点text查找,此时可能出现多个热点var spottext = $("#inputHotspot").val();  //热点的text名字,可重复//在数据库中找到该名字所匹配的所有热点,并返回其信息,在图上显示//......//图上点击某点,信息框中出现对应的信息,此时点唯一//在数据库中找到该名字所匹配的热点后,再匹配坐标值找到对应点    函数传递三个变量,后两个可缺省//将全景图的视野转向第一个热点所在位置$("#ModyfiHotspot").attr("disabled", false);$("#DelHotspot").attr("disabled", false);krpano.set("view.hlookat", -180);krpano.set("view.vlookat", 50);//改变所找到点的图标krpano.call("set_hotspots/plugin(hotspot, url, ../SystemPicture/Mark2.png, name, " + spottext + ");");  //此处变量应为热点text和图片,热点text是用户输入的值
}

注意,注释中的热点text是热点的某种名称,例如每个人的姓名,不唯一,而热点的hotspot_name是热点的真正的名称,例如每个人的身份证号,是唯一的。
如果热点具有点击事件,那么点击热点后可直接获取这个热点的真正名称改变其图标,如果不具有可操作事件,那就根据上面的方法获取屏幕点坐标,然后给定一个小范围的圆,在这个圆内的点就是你点的那个点,毕竟你点的位置和点的真正位置不一定是完全一致的。

3.修改热点

function ModyfiHotspot() {//点击表中所查找出的点,修改对应的信息var spotname = $("#inputHotspot").val();  //该点的name,唯一值//将视野转向该点并修改该点的图标krpano.set("view.hlookat", 0);krpano.set("view.vlookat", 30);//krpano.call("set_hotspots/plugin(hotspot, url, ../SystemPicture/Mark2.png, name, spot4);");//设置该点在图上可拖动,修改坐标krpano.call("set(hotspot[" + spotname + "].ondown,draghotspot(););");//......返回修改的内容//......修改成功后图上删掉该点
}

修改热点不推荐先删再添加,如果热点多且表关联大,则效率极其低下,而且如果这样做更好,那还要update干嘛呢。

4.删除热点

//删除点
function DeleteHotspot() {var spotname = $("#inputHotspot").val();//图上操作krpano.call("removehotspot(" + spotname + ");");//此处变量为热点name,唯一值,主键//数据库操作
}

其他方法

获取接口对象
在创建播放器时,可以通过config的onready参数传入回调函数来获取krpano Javascript-Interface object。修改页面的JS代码如下:

<!doctype html>
<html>
<head><meta charset="utf-8"><script type="text/javascript" src="./krpano.js"></script><style type="text/css">html,body{width:100%;height:100%;}</style>
</head>
<body><div id="container" style="width:100%;height:100%;"></div><script type="text/javascript">var krpanoReady = function(krpano){//函数传入的krpano参数就是krpano Javascript-Interface object//显示krpano打印窗口krpano.call("showlog()")}var config = {target: "container", swf: "krpano.swf", xml: "index.xml", html5: "prefer", onready: krpanoReady}embedpano(config)</script>
</body>
</html>

接口对象的方法
krpano Javascript-Interface object拥有 set(variable,value)、 get(variable)、 call(action)、 spheretoscreen(h,v)、 screentosphere(x,y)这五个方法。那么要通过JS来设置播放器的效果,主要通过set、get、call这三个方法。使用这些方法前,需要先点这里了解一下krpano实现的简单动态脚本语言。

set(variable,value)

定义或者设置krpano动态脚本语言的变量值。使用例子如下:


//定义或设置变量a为1
krpano.set("a", 1)
//设置name为layer_1的layer对应visible属性为false
krpano.set("layer[layer_1].visible", false)
//设置name为layer_1的layer对应html属性为'txt'
krpano.set("layer[layer_1].html", "txt")

get(variable)

获取krpano动态脚本语言的变量值,当变量值未定义时返回null。使用例子如下:

//获取变量值
var a = krpano.get("a")
//获取name为layer_1的layer对应visible属性
var visible = krpano.get("layer[layer_1].visible")

call(action)

执行指定的任意krpano动态语言语句。使用例子如下:

//显示krpano打印窗口
krpano.call("showlog()")

通过JavaScript添加场景
上述样例代码只创建了一个空播放器,那么我们怎么样使用JavaScript来添加场景等相关播放器数据呢?

我们先来看一下,如何添加并设置一个场景的图片资源。JS代码如下:

var krpanoReady = function(krpano){var xml = '<scene name="scene_1"><image><sphere url="sphere.jpg" /></image></scene>'krpano.call("loadxml(" + xml + ");loadscene(scene_1);")
}
var config = {target: "container", swf: "krpano.swf", xml: "index.xml", html5: "prefer", onready: krpanoReady}
embedpano(config)

添加数据主要通过调用krpano动态语言的loadxml方法实现。那么loadscene方式的作用是:根据指定scene的name来加载并渲染指定的场景。详细请参考krpano文档。

loadxml不止可以添加场景,还可以添加任何krpano的XML配置允许的数据来达到展示效果。比如添加plugin、layer、hotspot等。但是loadxml有一定的限制,当执行loadxml时,会将没有声明keep属性为true的数据对象都移除并切换掉当前的场景。时间有限,今天的就先介绍到这里。使用loadxml相关注意的具体应用问题,在后续的文章中进行介绍。

部分参考:www.zhuanfnag.org

Krpano全景:在javascript中动态添加/删除/修改(位置)热点(向后端写入)相关推荐

  1. Krpano学习:在javascript中动态添加/删除/修改(位置)热点(向后端写入)

    作为管理员,在管理全景时会涉及到各个标签的操作,本篇文章介绍在JS中对热点的操作,其数据可传到后端并写入数据库. 首先先给一个在xml文件中的动态热点添加的方法,下面的代码直接把两个url图片换了就可 ...

  2. javascript中动态添加事件

    直接写函数: <script language="javascript"> document.getElementById("result").οn ...

  3. javascript中动态添加事件!!

    直接写函数: <script language="javascript"> document.getElementById("result").on ...

  4. uniapp中动态添加及修改导航栏

    在pages.json {"path": "pages/cart/cart","style": {"navigationBarTi ...

  5. 微信小程序中动态添加删除class类名 使用三元表达式动态设置标签的class名

    目的,在微信小程序的swiper中达到除了active的哪一项外的其他项都有一个半透明的白色浮层. 效果图 如下: 功能实现: 我们使用三元表达式即可实现动态设置标签中的class属性 如下: < ...

  6. Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)

    首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...

  7. javascript动态添加、修改、删除对象的属性和方法

    上一节介绍了如何引用一个对象的属性和方法,现在介绍如何为一个对象添加.修改或 者删除属性和方法. 在其他语言中,对象一旦生成,就不可更改了,要为一个对象添加修改成员必须要在对 应的类中修改,并重新实例 ...

  8. Unity NGUI中动态添加和删除sprite(附上转载者注释)

    --------------------- 此部分为转载的感受. 原文对于NGUI如何动态添加删除sprite,以及调用NGUI中的图集Atlas都有很明确的代码. 转载括号内容附上转载作者(Bula ...

  9. vue 动态添加click_vue,在模块中动态添加dom节点,并监听

    vue向数组中动态添加数据 vue中数据更新通过v-model实现,向数组中添加数据通过push()实现,向shortcuts数组中动态添加newShortcut对象中的title和action th ...

最新文章

  1. 【树形DP】树的重心详解+多组例题详解
  2. 2022 美国国家工程院院士公布:张宏江等入选海外院士,马斯克及微软CEO在列...
  3. oracle冷备份/恢复
  4. 前端学习(1569):todoMVC准备工作
  5. 垃圾回收算法与实现系列-String在虚拟机中的实现
  6. Oracle Instance
  7. 【算法导论】【排序】—— 计数排序(counting sort)
  8. 使用cd-hit对核酸序列或氨基酸序列聚类
  9. 快门光圈感光度口诀_只要三杯水,就能搞懂光圈/快门/感光度的关系!
  10. IDEA本地插件下载及安装
  11. 方舟服务器设置文档,方舟云服务器设置
  12. php大道至简之框架
  13. Glide加载图片会出现淡绿色的背景
  14. 保护个人隐私,你需要这样设置 iPhone 的语音备忘录,禁用位置命名
  15. 中科大计算机博士毕业条件,惊呆!中科大博士毕业6年后再考医学专科,他这样回应……...
  16. 关于java变量命名,介绍阿里JAVA命名规范及IDEA实时检测插件的使用以及CODELF取名神器
  17. CPU概述及CPU的内部结构
  18. gitee提交代码到仓库
  19. 以太坊智能合约部署——一个简单的投票系统
  20. java喜好设置_Java中使用Preferences 的 API设置用户偏好

热门文章

  1. (Fabric 学习六)Fabric2.0 私有数据 使用marbles官方示例
  2. 回忆经典,九叔教你用Python制作贪吃蛇游戏
  3. 【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】
  4. android 调用系统文件管理器
  5. [知识图谱] 4.1-知识图谱在金融领域中的应用实践
  6. (176)FPGA与门实现门控时钟原理
  7. 中文信息处理——纵览与建议
  8. Python爬虫 煎蛋网全站妹子图爬虫
  9. 大数据助力智慧物流,新一代物流产业数据价值分析
  10. Git分支切换的正确操作,你真的会吗?