曾妮麗
(南京科技職業(yè)學(xué)院信息工程學(xué)院,南京 210048)
明晰的標(biāo)識(shí)或?qū)Ш较到y(tǒng)總是能夠讓我們相對(duì)快速的找到目標(biāo),從而節(jié)省時(shí)間。早前一些生活場(chǎng)景中我們更多的是通過(guò)圖文標(biāo)識(shí)來(lái)指引我們的用戶,幫助他們快速找尋目標(biāo)。隨著信息技術(shù)的發(fā)展,尤其是智能終端設(shè)備的普遍應(yīng)用,利用便攜式終端設(shè)備來(lái)創(chuàng)建導(dǎo)航系統(tǒng),已有較多的研究并有了一些應(yīng)用。
信息知識(shí)、文獻(xiàn)數(shù)量急劇增加,使得各地方館藏圖書(shū)數(shù)量激增,一些新建成的圖書(shū)館體量也變得越來(lái)越大,通過(guò)移動(dòng)終端設(shè)備導(dǎo)航系統(tǒng)來(lái)尋找圖書(shū),可以讓用戶查詢目標(biāo)書(shū)目,并根據(jù)路線圖快速查找到圖書(shū)的位置。
目前,大部分圖書(shū)館服務(wù)系統(tǒng)主要是提供常規(guī)的借閱和查詢服務(wù),用戶查詢到圖書(shū)后雖然能很方便的獲取圖書(shū)的索書(shū)號(hào)等信息,但是對(duì)于不熟悉圖書(shū)館館藏結(jié)構(gòu)的用戶而言,想要快速的找到目標(biāo)圖書(shū),還需要再費(fèi)一番周折。
圖書(shū)導(dǎo)航系統(tǒng)的主要功能是,在傳統(tǒng)檢索的基礎(chǔ)上,讓讀者快速地找到圖書(shū)。具體包含用戶的登錄功能,該功能又包含管理員登錄和普通用戶登錄。普通用戶登錄后,提供查詢功能;同時(shí)可以為用戶在館內(nèi)找到書(shū)目提供導(dǎo)航路徑支持。管理員登錄后,可以對(duì)數(shù)據(jù)庫(kù)書(shū)目信息表進(jìn)行操作管理,操作主要包含書(shū)目的增加、刪除、查詢等。
根據(jù)需求分析得到客戶端需要的模塊和所需的模塊的簡(jiǎn)要說(shuō)明(表1)。
表1 客戶端主要功能設(shè)計(jì)說(shuō)明
主要包含管理員登錄及管理模塊。管理員登錄后,進(jìn)入管理界面,可以選擇數(shù)據(jù)庫(kù)表,針對(duì)表中記錄進(jìn)行查詢、刪除、增加記錄等操作。
根據(jù)需求分析得到的客戶端的模塊和各個(gè)模塊之間執(zhí)行的順序得到如圖1所示的流程圖。
圖1 系統(tǒng)功能交互
其中書(shū)目導(dǎo)航服務(wù)作為系統(tǒng)設(shè)計(jì)的主要功能部分,我們首先需要進(jìn)行圖書(shū)館館內(nèi)書(shū)架陳設(shè)平面圖的繪制,同時(shí)將現(xiàn)實(shí)書(shū)架及圖書(shū)的位置與平面地圖建立映射,該映射關(guān)系以數(shù)據(jù)庫(kù)表的形式存儲(chǔ)。系統(tǒng)通過(guò)書(shū)架的信息可以轉(zhuǎn)化為地圖上的位置信息。
主要業(yè)務(wù)流程是用戶通過(guò)掃描或手動(dòng)輸入起始書(shū)架位置,其中書(shū)架信息在各書(shū)架處已經(jīng)事先進(jìn)行標(biāo)注,有對(duì)應(yīng)的提示信息;然后輸入目標(biāo)書(shū)目的索書(shū)號(hào)信息。起始位置可以通過(guò)地圖數(shù)據(jù)庫(kù)表直接轉(zhuǎn)化為地圖上的起始位置信息,目標(biāo)書(shū)目索書(shū)號(hào)獲取后先從書(shū)目數(shù)據(jù)庫(kù)表獲取書(shū)架信息,然后在地圖數(shù)據(jù)庫(kù)表里匹配映射的地圖目標(biāo)位置信息,最終通過(guò)A*尋路算法計(jì)算出行走的最優(yōu)路徑,并以路徑圖的方式疊加進(jìn)行顯示。
根據(jù)該圖書(shū)書(shū)目信息查詢及導(dǎo)航功能,三個(gè)主要數(shù)據(jù)庫(kù)表設(shè)計(jì)如下:
(1)用戶信息表。存儲(chǔ)注冊(cè)用戶姓名、學(xué)號(hào)、手機(jī)號(hào)碼、和密碼等信息。
(2)圖書(shū)書(shū)目信息表。該表主要存儲(chǔ)圖書(shū)館館藏書(shū)目的基本信息,具體包含圖書(shū)ID、圖書(shū)書(shū)目名稱(chēng)、圖書(shū)索書(shū)號(hào)信息、圖書(shū)所在書(shū)架信息等。
(3)導(dǎo)航地圖數(shù)據(jù)映射信息表。該表存儲(chǔ)地圖與館內(nèi)書(shū)架布局映射數(shù)據(jù)信息,主要包含ID、書(shū)架、映射地圖橫向坐標(biāo)、映射地圖縱向坐標(biāo)等字段。
項(xiàng)目使用SQLite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)信息,因此首先需要在項(xiàng)目創(chuàng)建初期進(jìn)行SQLite相應(yīng)文件的配置。同時(shí)使用SQLite Studio數(shù)據(jù)庫(kù)可視化工具,幫助我們快速方便進(jìn)行數(shù)據(jù)庫(kù)表的創(chuàng)建以及管理。同時(shí)安裝SQLite4Unity3d插件,可以快速對(duì)數(shù)據(jù)庫(kù)表中的信息進(jìn)行操作。
客戶端主要功能是用戶進(jìn)行傳統(tǒng)檢索和2D導(dǎo)航。常用的查詢方式包含書(shū)名、關(guān)鍵詞、索書(shū)號(hào)等,以下主要介紹通過(guò)書(shū)名、索書(shū)號(hào)關(guān)鍵詞進(jìn)行查詢的實(shí)現(xiàn)過(guò)程。在進(jìn)行導(dǎo)航功能的實(shí)現(xiàn)過(guò)程中,用戶需要獲取到起始位置的書(shū)架信息以及目標(biāo)圖書(shū)的索書(shū)號(hào)信息,將這些信息輸入界面方可實(shí)現(xiàn)導(dǎo)航路徑的生成。
3.2.1 書(shū)目信息查詢功能
書(shū)目查詢功能主要實(shí)現(xiàn)了讀者可通過(guò)圖書(shū)書(shū)名等信息查找整條記錄信息。讀者登錄查詢界面后,在關(guān)鍵詞后文本框輸入需要查找的圖書(shū)的書(shū)名信息,單擊確定后會(huì)在下面的顯示區(qū)域輸出涉及圖書(shū)書(shū)名的相關(guān)記錄的詳細(xì)信息。
查詢功能代碼實(shí)現(xiàn)的過(guò)程,首先是需要在創(chuàng)建的數(shù)據(jù)庫(kù)操作管理腳本文件中創(chuàng)建讀取方法,此方法接收輸入的關(guān)鍵詞,通過(guò)where方法在數(shù)據(jù)庫(kù)的表中找到相應(yīng)的圖書(shū)。語(yǔ)句如下:
public IEnumerable
return_connection.Table
接著創(chuàng)建查詢腳本,需要先連接數(shù)據(jù)庫(kù),之后獲取界面中讀者輸入的書(shū)名信息,利用Get?BooksNamed()函數(shù)查找信息。此時(shí)顯示的所有記錄,可以利用forech(){}循環(huán)語(yǔ)句遍歷所有的記錄,并且將記錄依次顯示出來(lái)。之后再利用To?Control()函數(shù)將記錄以一定的方式顯示。
3.2.2 2D導(dǎo)航路徑生成功能
2D導(dǎo)航路徑生成功能主要方便讀者能夠快速的在圖書(shū)館內(nèi)找到所需要的書(shū)目,這一功能首先需要進(jìn)行平面地圖的繪制,建立與現(xiàn)實(shí)環(huán)境的映射關(guān)系,然后再使用A*尋路算法生成導(dǎo)航路徑。
(1)地圖的制作。平面地圖的制作主要有兩種方式,一種是直接繪制一張地圖,直接在這張地圖上進(jìn)行映射。該方法直接顯示地圖,不能對(duì)地圖進(jìn)行縮放。另一種是采用瓦片系統(tǒng)來(lái)制作,這種方式可以實(shí)現(xiàn)對(duì)地圖的縮放,分級(jí)顯示地圖效果,能夠方便讀者查詢細(xì)節(jié)效果。本項(xiàng)目采用了第一種方式進(jìn)行地圖的設(shè)計(jì)。
在A*尋路算法中,會(huì)將地圖劃分為若干個(gè)小圖塊,并以網(wǎng)格的形式表示整個(gè)地圖,最終在代碼中會(huì)以2D數(shù)組來(lái)表示我們的地圖。簡(jiǎn)單來(lái)說(shuō),繪制的地圖將會(huì)由若干個(gè)圖塊組成,算法需要解決的就是如何從起始圖塊以較優(yōu)路徑找到目標(biāo)圖塊,如圖2所示。
圖2 2D網(wǎng)格表示的地圖
因此在進(jìn)行圖書(shū)館館藏環(huán)境平面地圖的繪制時(shí),需要思考系統(tǒng)地圖中網(wǎng)格是如何劃分的,也就是網(wǎng)格的基本像素單位。通過(guò)研究系統(tǒng)中A*尋路算法的網(wǎng)格,同時(shí)考慮系統(tǒng)中圖片單位像素的設(shè)置。在實(shí)際的繪制中,將書(shū)架的長(zhǎng)度繪制為160像素,寬度設(shè)置為32像素,書(shū)架的橫向主要間距設(shè)置為64像素,主要間距寬度設(shè)置為32像素。這樣的操作一方面為了保證和系統(tǒng)中A*算法的網(wǎng)格進(jìn)行匹配,另一方面也要考慮書(shū)架的實(shí)際長(zhǎng)寬比。
除了考慮書(shū)架具體的形狀和大小外,還需要考慮圖書(shū)館實(shí)際的情況。需要了解我校圖書(shū)館書(shū)目類(lèi)別以及各個(gè)類(lèi)別的數(shù)量等,還需要了解書(shū)架擺放的規(guī)律等。通過(guò)走訪和實(shí)地考察,學(xué)校圖書(shū)館館藏書(shū)目基本涉及所有圖書(shū)學(xué)科類(lèi)別,根據(jù)我們學(xué)校的專(zhuān)業(yè)特點(diǎn),如我們學(xué)校早前是化工專(zhuān)業(yè)為主,這類(lèi)圖書(shū)較多;另外同其他圖書(shū)館一樣文學(xué)類(lèi)、計(jì)算機(jī)類(lèi)等類(lèi)別圖書(shū)數(shù)量也會(huì)比較多。在圖書(shū)館館內(nèi)實(shí)地觀察得知,圖書(shū)館書(shū)架正反兩面均可放置圖書(shū),每個(gè)書(shū)架分成左右5格,每格又分為上下5層;書(shū)架的放置分為左右兩大組,左邊是按從右到左的順序,右邊按從左往右的順序排放。具體的繪制效果如圖3所示。
圖3 圖書(shū)館館藏平面地圖
(2)地圖映射數(shù)據(jù)庫(kù)建立。地圖繪制完成后,需要建立現(xiàn)實(shí)中書(shū)架與系統(tǒng)中地圖坐標(biāo)的映射關(guān)系。首先確定地圖中系統(tǒng)坐標(biāo)原點(diǎn)的位置,將坐標(biāo)原點(diǎn)設(shè)置在地圖的中心位置(具體如圖4),根據(jù)系統(tǒng)的設(shè)置,每個(gè)單位是32像素這樣第一個(gè)書(shū)架右上角的坐標(biāo)為(-10,8),其他可以依次類(lèi)推。
圖4 地圖坐標(biāo)系及書(shū)架碰撞區(qū)設(shè)置
由于每個(gè)書(shū)架又分為正反兩面,均可擺放圖書(shū),同時(shí)每個(gè)書(shū)架左右分為5欄,因此每一大類(lèi)的書(shū)目我們又會(huì)分為子類(lèi),擺放在對(duì)應(yīng)的豎格中。以下將以A類(lèi)書(shū)目在第一個(gè)書(shū)架中的擺放以及對(duì)應(yīng)的映射情況為例進(jìn)行介紹,如圖5所示。
圖5 書(shū)目A大類(lèi)書(shū)架信息
圖書(shū)館館藏圖書(shū)中A大類(lèi)圖書(shū)數(shù)量不是很多,我們將其集中在一個(gè)書(shū)架上,書(shū)架的兩面按照豎格依次存放子類(lèi)A10,A20,A30,A40,A50,A60,A70,A80,A90等子類(lèi)的書(shū)目,根據(jù)網(wǎng)格像素?cái)?shù)及坐標(biāo)原點(diǎn)的位置,系統(tǒng)中地圖映射的坐標(biāo)依次為A10(-10,8),A20(-11,8),A30(-12,8),A40(-13,8),A50(-14,8),A60(-10,7),A70(-11,7),A80(-12,7),A90(-13,7)。其他類(lèi)別下,如果書(shū)目較少,采取同樣的方式進(jìn)行書(shū)架的劃分以及書(shū)目的擺放,如果書(shū)目較多,則分多個(gè)書(shū)架進(jìn)行擺放,每個(gè)書(shū)架每豎格書(shū)目的安排劃分更加細(xì)致。
采取這樣的方法,我們最終將得到整個(gè)地圖的數(shù)據(jù)庫(kù)映射信息表,該地圖映射數(shù)據(jù)庫(kù)表主要包含書(shū)架bookshelf字段(如A10),映射系統(tǒng)中的橫向坐標(biāo)位置信息bookshelf_x字段(-10),映射系統(tǒng)中的縱向坐標(biāo)位置信息bookshelf_y。其中地圖映射數(shù)據(jù)庫(kù)表具體結(jié)構(gòu)如下圖,地圖映射數(shù)據(jù)庫(kù)表具體數(shù)據(jù)信息表如圖6所示。
圖6 圖書(shū)館地圖映射數(shù)據(jù)庫(kù)表中數(shù)據(jù)信息
圖書(shū)書(shū)目導(dǎo)航路徑的生成,主要采用A*尋路算法。要求讀者在系統(tǒng)的當(dāng)前位置文本框中輸入自身所在的圖書(shū)館中書(shū)架的信息,然后在系統(tǒng)界面的查找書(shū)目后面的文本框中輸入需要查找的圖書(shū)的完整索書(shū)號(hào)信息,之后系統(tǒng)會(huì)利用A*尋路算法生成最優(yōu)路徑并將路徑繪制在地圖上。
此項(xiàng)功能的實(shí)現(xiàn)我們主要使用了AstarPath?finding插件。利用該插件實(shí)現(xiàn)這一功能的主要方法和步驟如下:
(1)場(chǎng)景界面的搭建。主要是將地圖放置在界面中間,然后利用UI文本字段等創(chuàng)建搜索區(qū)域。
(2)利用A*尋路插件提供的功能進(jìn)行當(dāng)前位置和查詢圖書(shū)兩個(gè)對(duì)象在場(chǎng)景中的基本設(shè)置。
(3)將文本框中的書(shū)架和書(shū)目信息轉(zhuǎn)化為系統(tǒng)地圖中的坐標(biāo)數(shù)據(jù)。其中書(shū)目索書(shū)號(hào)轉(zhuǎn)書(shū)架以及系統(tǒng)地圖坐標(biāo)信息轉(zhuǎn)化的代碼如下:
public InputField inputEnd;
//找尋的圖書(shū)索書(shū)號(hào)輸入文本框
public Transform searchBook;
//定義要找尋的圖書(shū)的對(duì)象
DataService ds=new DataService("existing.db");
//創(chuàng)建連接數(shù)據(jù)庫(kù)實(shí)例
private float End_x,End_y;
//找尋圖書(shū)映射在地圖上的坐標(biāo)信息
void Start(){searchBook=GameObject.Find("search?Book").transform; //賦值查找找尋圖書(shū)}
public void GetEndPosition(){
ds.inputkeyword=input End.text;
//獲取找尋圖書(shū)的索書(shū)號(hào)
var bookshelfSearch=ds.Get BooksNamenum();
//獲取找尋圖書(shū)的書(shū)架信息
IEnumerable
//通過(guò)書(shū)架從數(shù)據(jù)庫(kù)地圖map表中獲取記錄信息}
private void ToConsole(IEnumerable
//將索書(shū)號(hào)轉(zhuǎn)化為書(shū)架信息
forearch(var books in bookshelfSearch){
ds.inputkeyword=books.bookshelf;}}
private void ToConsole(IEnumerable
//將書(shū)架信息轉(zhuǎn)化為映射地圖坐標(biāo)信息
foreach(var booktile in maptile){
End_x=booktile.bookshelf_x;
End_y=booktile.bookshelf_y;
searchBook.position=new Vector3(End_x,End_y,0);}}
(4)通過(guò)地圖上的坐標(biāo)起始位置和結(jié)束位置,利用A*尋路算法生成路徑并進(jìn)行繪制。圖7表示從起始位置書(shū)架A50,查詢索書(shū)號(hào)為D100的圖書(shū)的較優(yōu)路徑。
圖7 書(shū)目查詢導(dǎo)航路徑生成界面
利用館藏圖書(shū)查詢導(dǎo)航系統(tǒng),能夠方便學(xué)生進(jìn)行圖書(shū)傳統(tǒng)檢索的同時(shí),可以在館藏平面地圖的基礎(chǔ)上讓學(xué)生按照路徑圖快速地找到圖書(shū),極大地方便了學(xué)生,提升了圖書(shū)館數(shù)字化水平。文中采用的導(dǎo)航方式,盡管是一種低成本的方式,同時(shí)也具備較高的精度,但是2D的形式對(duì)用戶的空間想象力仍然有較高的要求。