1. 程式人生 > >KRpano (大)小地圖新增熱點,同步切換場景

KRpano (大)小地圖新增熱點,同步切換場景

KRpano 提供了Google 和bing 兩種地圖選擇,分別需要單獨去申請對應的KEY,並在 xml skin_settings 內配置。

eg:

<skin_settings 
    //是否開啟地圖
    maps="true"
    //地圖型別
    maps_type="google" 
    // bing 地圖key,需要申請
    maps_bing_api_key="3Tu0ib1asdasds~whYE2KpPasdasdDP6-wQ~AqetasdU-flrBVr-8FayTcyasdasdasdM8yKnTwLZba9j7QYn90dlkazsh_"
    //Google地圖key,需要申請
maps_google_api_key="AIzaSyCe7Hq9oyoLuHDQeJoMJPA5RNzplk_DXiE" //縮放按鈕是否顯示 maps_zoombuttons="false" />

可以參考此連結
也可直接訪問以下連結進行申請:

google key 申請地址(翻牆可訪問):Google maps

bing key 申請地址:Bing maps

以下可以參考下載的 krpano 安裝包內路徑為:krpano\viewer\examples\googlemaps 下的檔案進行編輯。
如果你沒有安裝包可以到 krpano.com下載

以下是步驟


大地圖:
這裡寫圖片描述
開啟你 vtourskin.xml 找到 layer name=skin_map 的標籤,並在標籤內新增屬性: mapsapi.html5=”http://ditu.google.cn” (谷歌地圖需要翻牆才能看,此處新增屬性呼叫中國版的API 地址)

標籤內的 onmapready=”skin_addmapspots();” 事件 是指地圖準備就緒後呼叫 skin_addmapspots 事件,看名字就知道是在地圖上新增熱點,我們找到這個 action 注: (krpano 內 action 標籤就是事件定義)

新增地圖熱點:
【在這個事件內迴圈了當前場景的數量,多少場景新增多少熱點(實踐中當然是使用者自己新增熱點了),設定了熱點的點選事件,設定了熱點的經緯度(獲取的場景內的經緯度,所以在場景標籤 scene 內需要設定 經度lat、緯度lng、方位heading屬性)】

    <action name="skin_addmapspots">
        for(set(i,0), i LT scene.count, inc(i),
            if(scene[get(i)].lat,
                <!--設定熱點name,修改:將spot+場景名字作為熱點名稱,-->
                txtadd(spotname, 'spot', get(scene[get(i)].name));
                <!--設定熱點點選事件 函式:skin_hidetooltips() 熱點點選後縮回工具條。activatespot(',get(spotname),');當前熱點選中。skin_loadscene();載入場景-->
                txtadd(spotclickevent, 'skin_hidetooltips(); activatespot(',get(spotname),'); skin_loadscene(', get(scene[get(i)].name), ',get(skin_settings.loadscene_blend)); skin_updatescroll(); delayedcall(0.5,skin_showmap(false));');
                <!--拷貝場景熱點name-->
                copy(scene[get(i)].mapspotname, spotname);
                <!--新增熱點 引數:(熱點名稱,經度,緯度,方位,false,點選事件,null)-->
                addspot(get(spotname), get(scene[get(i)].lat), get(scene[get(i)].lng), get(scene[get(i)].heading), false, get(spotclickevent), null);
                <!--滑鼠懸停地圖熱點是否彈出文字提示-->
                if(skin_settings.tooltips_mapspots,
                    set(layer[skin_map].spot[get(spotname)].tooltip, get(scene[get(i)].title) );
                    txtadd(layer[skin_map].spot[get(spotname)].onover, 'set(hovering,true);',  get(style[skin_tooltips].onover) );
                    txtadd(layer[skin_map].spot[get(spotname)].onout,  'set(hovering,false);', get(style[skin_tooltips].onout)  );
                  );
              );
          );
        if(xml.scene != null,
            activatespot( get(scene[get(xml.scene)].mapspotname) );
          ,
            activatespot(spot0);
          );
        <!-- zoom and pan the map to see all spots at the same time spotclickevent-->
        zoomToSpotsExtent();
    </action>

場景內的經緯度屬性:

    <scene name="scene_2" title="2" onstart="" havevrimage="true" thumburl="panos/2.tiles/thumb.jpg"  lat="39.796233694" lng="19.70181763" heading="0.0">
        <view hlookat="0" vlookat="0" fovtype="MFOV" fov="120" maxpixelzoom="2.0" fovmin="70" fovmax="140" limitview="auto" />
        <preview url="panos/2.tiles/preview.jpg" />
        <image type="CUBE" multires="true" tilesize="512" if="!webvr.isenabled">
            <level tiledimagewidth="2112" tiledimageheight="2112">
                <cube url="panos/2.tiles/%s/l2/%v/l2_%s_%v_%h.jpg" />
            </level>
            <level tiledimagewidth="1024" tiledimageheight="1024">
                <cube url="panos/2.tiles/%s/l1/%v/l1_%s_%v_%h.jpg" />
            </level>
        </image>
        <image if="webvr.isenabled">
            <cube url="panos/2.tiles/vr/pano_%s.jpg" />
        </image>
    </scene>

到此點開地圖應該可以看到地圖上會有熱點出現,點選某個熱點,場景會同步切換

熱點

小地圖:
這裡寫圖片描述

完成上面的操作後,小地圖就很簡單了
只需要給它一個容器、定位、寬、高 屬性,並新增事件 onloaded=”skin_addmapspots();” 新增熱點,就可以了。

屬性解釋:

zoom 縮放深度
key.html5 Google maps api key
key.flash Bing maps api key

    <layer name="mapcontainer" type="container" keep="true" bgcolor="0xD81B1B" bgalpha="1" align="leftbottom" x="5" y="5" width="270" height="370"> 
        <plugin name="map" keep="true"
                url.html5="%SWFPATH%/plugins/bingmaps.js"
                url.flash="%SWFPATH%/plugins/bingmaps.swf"
                key.html5="get(skin_settings.maps_google_api_key)"
                key.flash="get(skin_settings.maps_bing_api_key)"
                maptype="SATELLITE"
                lat="39.563340" lng="19.904324" zoom="20"
                align="lefttop" x="10" y="10" width="250" height="350"
                onloaded="skin_addmapspots();"
            >
            <radar visible="true" size="300" alpha="0.33" fillcolor="0xFFFFFF" fillalpha="1.0" linecolor="0x00FF00" linealpha="0.5" linewidth="0.5" dragable="true" headingoffset="0" />
            <!--skin_addmapspots 函式新增的熱點示例:active 當前場景-->
            <!-- <spot name="spot1" lat="39.563340" lng="19.904324" heading="0" active="true" /> -->
        </plugin>
    </layer>

現在我們發現:大地圖熱點點選場景同步切換,但小地圖熱點卻沒改變
我們只需在場景切換時同步改變熱點的位置就可以了。
接下來我們找到 vtourskin.xml 找到
skin_loadscene這個action,如下:

    <action name="skin_loadscene">      
        if(webvr.isenabled AND scene.count GT 1,
            set(hotspot[webvr_prev_scene].visible, false);
            set(hotspot[webvr_next_scene].visible, false);
          );
        txtadd(layer[skin_thumbborder].parent, 'skin_thumb_', get(scene[%1].index));
        layer[skin_thumbs].scrolltocenter(get(scene[%1].thumbx), get(scene[%1].thumby));
        loadscene(get(scene[%1].name), null, get(skin_settings.loadscene_flags), %2);

    </action>

新增熱點以下程式碼:

        <!--切換場景時,地圖熱點切換,txtadd 為定義變數函式,此處定義了mapSpotName 變數為 spot加上get(scene[%1].name) 的字串為mapSpotName變數。(因為我在新增熱點事件  skin_addmapspots 設定的是spot + 場景名稱 作為熱點名稱,此處獲取也應這樣獲取。)-->
        txtadd(mapSpotName, 'spot', get(scene[%1].name));
        plugin[map].activatespot(get(mapSpotName));<!--plugin[map]為小地圖,activatespot設定當前場景的地圖熱點-->

到此,大地圖熱點點選小地圖熱點會同步改變,小地圖點選大地圖同步改變,場景也同步改變。

效果圖:

這裡寫圖片描述