陳燕紅,郭 斌
(新疆農業大學 計算機與信息工程學院,新疆 烏魯木齊 830052)
當前,旅游業已成為一種非常熱門而且很有發展前景的產業,然而受限于時空、財力甚至傳染病疫情等客觀因素影響,人們往往無法前往向往已久的特色景點。而應用全景展示、虛擬現實技術[1],通過模擬實景,構建一種虛擬旅游場景可以有效解決該問題[2-3]。虛擬旅游已成為有效拓展旅游產業的重要手段,發展虛擬旅游產業在國內和國際上都具有廣闊空間。
文中從全景模型的角度出發,結合交互設計和Android全景技術[4-5],研究基于全景地圖構建與特色旅游景點精確標注、地圖全景導航嵌入、多類外部導航嵌入以及景點多維度展示的Android全景旅游向導關鍵技術。文章詳細闡述了基于相關技術實現的新疆烏魯木齊特色景點全景向導系統。該系統有效增強了游客與景區間的動態交互,為用戶提供足不出戶便可享受身臨其境的特色景點觀光旅游體驗,有利于促進特色景點的對外宣傳和業務拓展。同時,系統利用虛擬全景技術為游客提供虛擬全景旅游[6],有助于減少旅游出行人次,一定程度上減少了碳排放和景區污染,從而開啟生態保護、綠色旅游[7]的新模式。
隨著現代虛擬旅游中全景技術的廣泛應用,越來越多的旅游景區開始計劃應用這種互動性更強、展示更立體的手段來宣傳自己的特色景點。Android全景旅游向導系統具有傳統宣傳和導游方式所沒有的優勢:
(1)使用方便快捷。利用Android手機就可以隨意選擇景區,全方位地進行景點的360度觀賞,并可以進行大小上下、前后左右調節,使得游客體驗到在特色美景中身臨其境的奇妙感受。
(2)給予身臨其境的觀光體驗。Android全景技術配合景點精確標注全景地圖、全景導航嵌入和特色景點多媒體展示,立體完整地保留了特色景點場景的真實性,為用戶全方位地展示了景點及其沿途的風景。
(3)提供強大的功能。Android全景旅游向導系統提供多層次人機交互和多維度全景導航,同時配合文字、圖像、聲音、動畫等多媒體元素,打造全新的虛擬旅游手段。
全景(panorama),也稱為三維實景,作為一種新興的富媒體技術,其“全方位展示球型范圍、360度環視、保留場景真實性”特性是與傳統媒體最大的區別,給觀者帶來美好的真實現場感。全景主要分為兩類:三維實景和虛擬實景[8-9]。3D實景主要利用街景車或單反相機拍攝照片,經過特殊的拼合技術處理后[10],利用展示技術為觀者提供在立體場景中身臨其境的體驗;虛擬實景則是利用信息技術模擬產生三維場景,可以全方位地觀察三維空間中的事物[11]。
OpenGL ES是OpenGL三維圖形API的子集,主要針對手機、PDA等嵌入式設備設計。隨著設備硬件水平以及Android系統版本的提升,OpenGL ES最新版本支持自定義渲染管線,這使得渲染的三維場景更加真實[12],為用戶提供了全新體驗。關鍵步驟為:
(1)載入全景圖,核心代碼為:
setContentView(R.layout.activity_main);//初始化全景控件
mGLPanorama=(GLPanorama) findViewById(R.id.mGLPanorama);
mGLPanorama.setGLPanorama(R.drawable.imggugong);//載入全景圖
(2)繪制全景圖展示球體:OpenGL ES中的立體圖像是通過多個小三角形拼接而成,球面上的每一個點都要滿足球的極坐標方程[13];
(3)注冊陀螺儀傳感器:為了實現球隨著手機轉動而轉動,需要使用陀螺儀快速、精準地對設備旋轉角度進行檢測;加入手勢操控,實現拖動圖片轉動;
(4)獲取傳感器數據:從x、y、z軸的正向位置觀看處于原始方位的設備,如果設備逆時針旋轉,將會收到正值;否則,為負值,得到兩次檢測到手機旋轉的時間差(納秒),并將其轉化為秒將手機在各個軸上的旋轉角度相加,即可得到當前位置相對于初始位置的旋轉弧度,將弧度轉化為角度;
(5)加入手勢操控,實現拖動圖片轉動;加入指示器,并為指示器加入動畫從而可以跟隨全景圖一起轉。單擊指示器時,獲取當前旋轉的角度,逆向旋轉,實現慢慢還原的過渡效果。
Google提供的工具包gvr-android-sdk可以實現在手機APP中嵌入360度全景圖片、視頻文件,從而通過增加動態互動來提升用戶體驗。它利用計算機生成模擬環境,實現多源信息交互[14]和融合的三維動態場景和實體行為的系統仿真[15],為用戶提供沉浸在實景中的體驗。加載全景圖、全景視頻:
panoOptions=new Options(); // 加載全景圖
panoOptions.inputType=Options.TYPE_STEREO_OVER_UNDER; // 圖像類型為立體圖像
istr=assetManager.open("andes.jpg");
panoWidgetView.loadImageFromBitmap(BitmapFactory.decodeStream(istr), panoOptions);
VrVideoView.Options options=new VrVideoView.Options(); // 加載全景視頻
options.inputType=VrVideoView.Options.TYPE_STEREO_OVER_UNDER; // 視頻類型為立體視頻
騰訊地圖JavaScript API可用于在應用程序中實時載入強交互性的地圖和街景,并提供地圖操作、標注、出行規劃、街景等功能豐富的接口[16]。街景是通過街景車在道路上實時拍攝的360度全景圖像,為用戶呈現一種走在街道上觀看的感覺。街景由多個場景組成,每個場景都有一個唯一標識,稱為“PanoId”。加載騰訊地圖、街景的關鍵步驟如下:
(1)在頁面的前端使用script標簽加載API服務;
(2)在移動端加載騰訊地圖,并載入騰訊地圖街景;
(3)載入騰訊地圖街景:
pano_container=document.getElementById('PanoCtn'); //街景容器
pano = new qq.maps.Panorama(pano_container, {
pano: '10011501120802180635300', //場景ID
pov:{ //視角
heading:1, //偏航角
pitch:0 //俯仰角
},
zoom:1 //縮放
})
(4)顯示街景道路覆蓋范圍的地圖疊加層:
//創建地圖
var map = new qq.maps.Map(document.getElementById("container"), {
center: new qq.maps.LatLng(39.916527, 116.397128),
zoom: 10
});
var panolayer = new qq.maps.PanoramaLayer(); // 添加街景路網圖層
panolayer.setMap(map); // 設置街景路網層容器
文中基于Android全景技術實現了新疆烏魯木齊特色景點全景向導系統。系統主要功能包括:烏魯木齊特色景點地圖加載、景點多維度展示、全景導航、系統內容導航、外部導航、后臺信息管理等。下面主要介紹系統實現的技術方案、效果分析以及關鍵模塊。
烏魯木齊特色景點全景向導系統主要分為地圖加載、多維度景點展示、多類導航和后臺系統管理四個部分。系統使用的主要開發工具和技術有Android全景技術、騰訊地圖Javascript API、高德地圖SDK、百度地圖SDK、科大訊飛TTS、Python Django以及SQLLite后臺數據庫。具體技術方案如下:
(1)實現Android地圖加載,并精確標注特色旅游景點;
(2)Android導航嵌入技術是最重要的技術環節。本系統涉及到地圖全景導航嵌入、內部導航、(騰訊、高德、百度)外部導航三種導航嵌入;
(3)特色景點多維度展示;
(4)地圖信息和景點信息的后臺管理;
(5)對系統進行調試,并完善系統的設計。
Android地圖加載及特色旅游景點的精確標注[17]是構建系統的重要基礎。利用高德地圖SDK,在服務器端獲取初始位置經緯度完成系統啟動和地圖加載,并利用經緯度進行特色旅游景點在地圖中的精確標注,見圖1。核心程序代碼如下:

圖1 系統啟動并加載烏魯木齊特色景點地圖
/* 1、系統啟動并加載地圖 */
aMap = mMapView.getMap(); // 獲得地圖對象
LatLng latLng = new LatLng(43.457701,87.2114828); // 構造初始位置
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,10));
setMapAttribute(); // 設置地圖屬性
/* 2、特色景點的精確標注 */
LatLng latLng = new LatLng(Double.parseDouble(jsonObject.get("local_x").toString()),
Double.parseDouble(jsonObject.get("local_y").toString())); // 獲取經緯度
MarkerOptions markerOption = new MarkerOptions();
markerOption.icon(BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.drawable.local))); // 自定義標記點圖標
本系統集成了三種導航嵌入,分別是全景導航、內部導航、“騰訊、高德、百度”外部導航。系統將三種導航集成在特色景點展示頁面右下角菜單中。
選擇“全景”,會打開特定景點的全景導航(見圖2)。在該頁面中,用戶可以隨意控制觀賞角度,隨心所欲地進行上下、左右、前后、大小調節,從而體驗浸入式全景游覽感受。在烏魯木齊周邊,還有一些出于生態保護目的而關閉的景點,比如天山烏魯木齊河源1號冰川(見圖3),利用本系統可獲得該類景點沿途風景的立體全景展示,從而滿足游客的好奇與向往。

圖2 通過“全景”載入全景導航——新疆國際大巴扎

圖3 全景導航——天山烏魯木齊河源1號冰川
選擇“內部導航”,打開從當前位置去向特定景點的高德地圖導航,可以快速啟程觀賞美景。
選擇“外部導航”,則會打開騰訊、高德、百度三種導航列表(見圖4),可以選擇任一導航開啟到任何目的地的旅程。

圖4 通過“外部導航”載入百度地圖導航
全景導航嵌入的核心代碼:
/*在服務端獲取全景圖URL,并利用Webview顯示 */
final String jingtu_url = intent.getStringExtra("url"); //獲取數據
WebView webView = (WebView) findViewById(R.id.
local_web); // Webview控件
webView.getSettings().setJavaScriptEnabled(true); // WebView支持JavaScript腳本
webView.loadUrl(jingtu_url); //訪問全景網頁
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);}} //通過WebView顯示網頁
/*構建VR全景視圖 */
final MyPanoramaImageView panoramaImageView = findViewById(R.id.panorama_image_view);
gyroscopeObserver = new GyroscopeObserver();
gyroscopeObserver.setMaxRotateRadian(Math.PI/9);
本系統對烏魯木齊周邊的特色景點進行了多維度展示,介紹了景點的歷史典故、發展歷程、主要景色、旅游建議、自駕路線以及公共交通等信息,見圖5。

圖5 多維度景點展示
多維度景點展示的核心代碼:
/* 景點多維度展示 */
Intent intent = getIntent(); // 獲取數據
final ArrayList
addressName = result.get(0);
latx = Double.valueOf(result.get(3));
laty = Double.valueOf(result.get(4));
textView.setMovementMethod(ScrollingMovementMethod.getInstance());//富文本內容
textView.setMovementMethod(LinkMovementMethod.getInstance());
RichText.fromHtml(result.get(1)).into(textView); //特色景點展示
文中基于交互設計和Android全景技術,研究Android全景旅游向導系統,闡述了實現新疆烏魯木齊特色景點Android全景向導系統的技術要點。盡管系統能夠為用戶提供特色景點全景導航以及景點和沿途風景的全方位展示,但仍需要在人機智能交互[18]和虛擬現實觀光體驗等方面進一步增強,并提供高效、價優的智能出行規劃[19],以期能讓出游者在虛擬空間身臨其境地感受各地特色美景。