曾妮麗
(南京科技職業學院信息工程學院,南京 210048)
明晰的標識或導航系統總是能夠讓我們相對快速的找到目標,從而節省時間。早前一些生活場景中我們更多的是通過圖文標識來指引我們的用戶,幫助他們快速找尋目標。隨著信息技術的發展,尤其是智能終端設備的普遍應用,利用便攜式終端設備來創建導航系統,已有較多的研究并有了一些應用。
信息知識、文獻數量急劇增加,使得各地方館藏圖書數量激增,一些新建成的圖書館體量也變得越來越大,通過移動終端設備導航系統來尋找圖書,可以讓用戶查詢目標書目,并根據路線圖快速查找到圖書的位置。
目前,大部分圖書館服務系統主要是提供常規的借閱和查詢服務,用戶查詢到圖書后雖然能很方便的獲取圖書的索書號等信息,但是對于不熟悉圖書館館藏結構的用戶而言,想要快速的找到目標圖書,還需要再費一番周折。
圖書導航系統的主要功能是,在傳統檢索的基礎上,讓讀者快速地找到圖書。具體包含用戶的登錄功能,該功能又包含管理員登錄和普通用戶登錄。普通用戶登錄后,提供查詢功能;同時可以為用戶在館內找到書目提供導航路徑支持。管理員登錄后,可以對數據庫書目信息表進行操作管理,操作主要包含書目的增加、刪除、查詢等。
根據需求分析得到客戶端需要的模塊和所需的模塊的簡要說明(表1)。

表1 客戶端主要功能設計說明
主要包含管理員登錄及管理模塊。管理員登錄后,進入管理界面,可以選擇數據庫表,針對表中記錄進行查詢、刪除、增加記錄等操作。
根據需求分析得到的客戶端的模塊和各個模塊之間執行的順序得到如圖1所示的流程圖。

圖1 系統功能交互
其中書目導航服務作為系統設計的主要功能部分,我們首先需要進行圖書館館內書架陳設平面圖的繪制,同時將現實書架及圖書的位置與平面地圖建立映射,該映射關系以數據庫表的形式存儲。系統通過書架的信息可以轉化為地圖上的位置信息。
主要業務流程是用戶通過掃描或手動輸入起始書架位置,其中書架信息在各書架處已經事先進行標注,有對應的提示信息;然后輸入目標書目的索書號信息。起始位置可以通過地圖數據庫表直接轉化為地圖上的起始位置信息,目標書目索書號獲取后先從書目數據庫表獲取書架信息,然后在地圖數據庫表里匹配映射的地圖目標位置信息,最終通過A*尋路算法計算出行走的最優路徑,并以路徑圖的方式疊加進行顯示。
根據該圖書書目信息查詢及導航功能,三個主要數據庫表設計如下:
(1)用戶信息表。存儲注冊用戶姓名、學號、手機號碼、和密碼等信息。
(2)圖書書目信息表。該表主要存儲圖書館館藏書目的基本信息,具體包含圖書ID、圖書書目名稱、圖書索書號信息、圖書所在書架信息等。
(3)導航地圖數據映射信息表。該表存儲地圖與館內書架布局映射數據信息,主要包含ID、書架、映射地圖橫向坐標、映射地圖縱向坐標等字段。
項目使用SQLite數據庫存儲數據信息,因此首先需要在項目創建初期進行SQLite相應文件的配置。同時使用SQLite Studio數據庫可視化工具,幫助我們快速方便進行數據庫表的創建以及管理。同時安裝SQLite4Unity3d插件,可以快速對數據庫表中的信息進行操作。
客戶端主要功能是用戶進行傳統檢索和2D導航。常用的查詢方式包含書名、關鍵詞、索書號等,以下主要介紹通過書名、索書號關鍵詞進行查詢的實現過程。在進行導航功能的實現過程中,用戶需要獲取到起始位置的書架信息以及目標圖書的索書號信息,將這些信息輸入界面方可實現導航路徑的生成。
3.2.1 書目信息查詢功能
書目查詢功能主要實現了讀者可通過圖書書名等信息查找整條記錄信息。讀者登錄查詢界面后,在關鍵詞后文本框輸入需要查找的圖書的書名信息,單擊確定后會在下面的顯示區域輸出涉及圖書書名的相關記錄的詳細信息。
查詢功能代碼實現的過程,首先是需要在創建的數據庫操作管理腳本文件中創建讀取方法,此方法接收輸入的關鍵詞,通過where方法在數據庫的表中找到相應的圖書。語句如下:
public IEnumerable
return_connection.Table
接著創建查詢腳本,需要先連接數據庫,之后獲取界面中讀者輸入的書名信息,利用Get?BooksNamed()函數查找信息。此時顯示的所有記錄,可以利用forech(){}循環語句遍歷所有的記錄,并且將記錄依次顯示出來。之后再利用To?Control()函數將記錄以一定的方式顯示。
3.2.2 2D導航路徑生成功能
2D導航路徑生成功能主要方便讀者能夠快速的在圖書館內找到所需要的書目,這一功能首先需要進行平面地圖的繪制,建立與現實環境的映射關系,然后再使用A*尋路算法生成導航路徑。
(1)地圖的制作。平面地圖的制作主要有兩種方式,一種是直接繪制一張地圖,直接在這張地圖上進行映射。該方法直接顯示地圖,不能對地圖進行縮放。另一種是采用瓦片系統來制作,這種方式可以實現對地圖的縮放,分級顯示地圖效果,能夠方便讀者查詢細節效果。本項目采用了第一種方式進行地圖的設計。
在A*尋路算法中,會將地圖劃分為若干個小圖塊,并以網格的形式表示整個地圖,最終在代碼中會以2D數組來表示我們的地圖。簡單來說,繪制的地圖將會由若干個圖塊組成,算法需要解決的就是如何從起始圖塊以較優路徑找到目標圖塊,如圖2所示。

圖2 2D網格表示的地圖
因此在進行圖書館館藏環境平面地圖的繪制時,需要思考系統地圖中網格是如何劃分的,也就是網格的基本像素單位。通過研究系統中A*尋路算法的網格,同時考慮系統中圖片單位像素的設置。在實際的繪制中,將書架的長度繪制為160像素,寬度設置為32像素,書架的橫向主要間距設置為64像素,主要間距寬度設置為32像素。這樣的操作一方面為了保證和系統中A*算法的網格進行匹配,另一方面也要考慮書架的實際長寬比。
除了考慮書架具體的形狀和大小外,還需要考慮圖書館實際的情況。需要了解我校圖書館書目類別以及各個類別的數量等,還需要了解書架擺放的規律等。通過走訪和實地考察,學校圖書館館藏書目基本涉及所有圖書學科類別,根據我們學校的專業特點,如我們學校早前是化工專業為主,這類圖書較多;另外同其他圖書館一樣文學類、計算機類等類別圖書數量也會比較多。在圖書館館內實地觀察得知,圖書館書架正反兩面均可放置圖書,每個書架分成左右5格,每格又分為上下5層;書架的放置分為左右兩大組,左邊是按從右到左的順序,右邊按從左往右的順序排放。具體的繪制效果如圖3所示。

圖3 圖書館館藏平面地圖
(2)地圖映射數據庫建立。地圖繪制完成后,需要建立現實中書架與系統中地圖坐標的映射關系。首先確定地圖中系統坐標原點的位置,將坐標原點設置在地圖的中心位置(具體如圖4),根據系統的設置,每個單位是32像素這樣第一個書架右上角的坐標為(-10,8),其他可以依次類推。

圖4 地圖坐標系及書架碰撞區設置
由于每個書架又分為正反兩面,均可擺放圖書,同時每個書架左右分為5欄,因此每一大類的書目我們又會分為子類,擺放在對應的豎格中。以下將以A類書目在第一個書架中的擺放以及對應的映射情況為例進行介紹,如圖5所示。

圖5 書目A大類書架信息
圖書館館藏圖書中A大類圖書數量不是很多,我們將其集中在一個書架上,書架的兩面按照豎格依次存放子類A10,A20,A30,A40,A50,A60,A70,A80,A90等子類的書目,根據網格像素數及坐標原點的位置,系統中地圖映射的坐標依次為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)。其他類別下,如果書目較少,采取同樣的方式進行書架的劃分以及書目的擺放,如果書目較多,則分多個書架進行擺放,每個書架每豎格書目的安排劃分更加細致。
采取這樣的方法,我們最終將得到整個地圖的數據庫映射信息表,該地圖映射數據庫表主要包含書架bookshelf字段(如A10),映射系統中的橫向坐標位置信息bookshelf_x字段(-10),映射系統中的縱向坐標位置信息bookshelf_y。其中地圖映射數據庫表具體結構如下圖,地圖映射數據庫表具體數據信息表如圖6所示。

圖6 圖書館地圖映射數據庫表中數據信息
圖書書目導航路徑的生成,主要采用A*尋路算法。要求讀者在系統的當前位置文本框中輸入自身所在的圖書館中書架的信息,然后在系統界面的查找書目后面的文本框中輸入需要查找的圖書的完整索書號信息,之后系統會利用A*尋路算法生成最優路徑并將路徑繪制在地圖上。
此項功能的實現我們主要使用了AstarPath?finding插件。利用該插件實現這一功能的主要方法和步驟如下:
(1)場景界面的搭建。主要是將地圖放置在界面中間,然后利用UI文本字段等創建搜索區域。
(2)利用A*尋路插件提供的功能進行當前位置和查詢圖書兩個對象在場景中的基本設置。
(3)將文本框中的書架和書目信息轉化為系統地圖中的坐標數據。其中書目索書號轉書架以及系統地圖坐標信息轉化的代碼如下:
public InputField inputEnd;
//找尋的圖書索書號輸入文本框
public Transform searchBook;
//定義要找尋的圖書的對象
DataService ds=new DataService("existing.db");
//創建連接數據庫實例
private float End_x,End_y;
//找尋圖書映射在地圖上的坐標信息
void Start(){searchBook=GameObject.Find("search?Book").transform; //賦值查找找尋圖書}
public void GetEndPosition(){
ds.inputkeyword=input End.text;
//獲取找尋圖書的索書號
var bookshelfSearch=ds.Get BooksNamenum();
//獲取找尋圖書的書架信息
IEnumerable
//通過書架從數據庫地圖map表中獲取記錄信息}
private void ToConsole(IEnumerable
//將索書號轉化為書架信息
forearch(var books in bookshelfSearch){
ds.inputkeyword=books.bookshelf;}}
private void ToConsole(IEnumerable
//將書架信息轉化為映射地圖坐標信息
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)通過地圖上的坐標起始位置和結束位置,利用A*尋路算法生成路徑并進行繪制。圖7表示從起始位置書架A50,查詢索書號為D100的圖書的較優路徑。

圖7 書目查詢導航路徑生成界面
利用館藏圖書查詢導航系統,能夠方便學生進行圖書傳統檢索的同時,可以在館藏平面地圖的基礎上讓學生按照路徑圖快速地找到圖書,極大地方便了學生,提升了圖書館數字化水平。文中采用的導航方式,盡管是一種低成本的方式,同時也具備較高的精度,但是2D的形式對用戶的空間想象力仍然有較高的要求。