所謂的網路蜘蛛, 原指的是透過網路的特性, 層層向外穿透, 取得網路上的資訊. 像大多數的入口網站 (如Google), 都具有此類特性. 它能迅速且有效的搜尋網路資源, 並取得有用的內容.
今天發表的網路蜘蛛<景點蜘蛛篇>, 是最近開發<景點分享平台專案>時, 突然想到的功能. 原理很簡單, 說穿了不值錢. 老王賣瓜, 正題之前先來幾張開發中的擷圖:
軟體主畫面:
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-d036e20d15054f0a36e7d9403ae78881.jpg)
直接匯整自己喜歡或適合的圖片: (本圖例的長榮桂冠酒店照片, 原出處為拉不拉多生活旅遊休閒網, 圖片版權仍屬該網站或公司所有.
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-70e136cf5eb212bb44de7efe98b0755c.jpg)
分享給眾多不同的軟體: (這個部份還在陸續進行中)
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-261c20b10b03e8414b7cc3c3eca14c82.jpg)
支援整合多種路程, 航跡. 讓大家自己收集各類型檔案. 可以收集某人去過的足跡 (航跡,track), 也可以收集別人規劃好的路程 (路線, route). 當然, 要收集網誌裡的筆記也可以囉...
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-b37c8eb4cacadccf0a5c1d74e6d0e2a1.jpg)
=======================================================
回到主題. 在整合PaPaGO的SDK的時候, 突然想到一個功能. 要是能用程式把所有的景點資料都 "撈" 出來, 這... 有多少筆資料呢? 於是有了這一篇文章.
首先, 當然要有PaPaGO SDK啦! 接下來有了工具, 那要怎麼撈呢?
用過導航軟體的朋友, 應該都會發現有個功能叫做 "查詢附近景點". 今天我們就拿這個功能來下手. PaPaGO SDK中有一個函式FindByLocation, 只要輸入WGS84的經緯度及搜尋範圍(半徑), 就可以取得方圓數百公尺內所有景點陣列資料. 那如何判斷在哪裡搜尋呢? 先來看看下圖:
把台灣細分成許多微小的區域, 在每個點上搜尋不就好了?
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-ae371f5348c9916d013cea96c4a5325c.jpg)
像這樣可以嗎? 不行, 因為中間深藍色的地方, 就成了漏網之魚.
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-8d790f4558f383fe1bd2fae6c9ec39a1.jpg)
這樣好多了吧? 嗯, 所有的地區都能涵蓋到, 不錯!
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-88efac13bd6031f3105fdca699b89db0.jpg)
至於每個點之間的距離要怎麼取決呢? 我是這樣算的:
假設地球半徑6378.1公里, 並當成正球體來看. 所以赤道長約2 * pi * 6378.1 = 40074.7842公里. 每一度經度跨徑 (橘色線) 長度40074.7842 / 360 = 111.3188公里. 在北緯30度的地方, 因為COS(30)=0.866, 因此當地一度經度跨徑 (藍線) 只剩下96.4049公里.
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-d750859201dfaefd8ca7ace3ddabe955.jpg)
依此原理計算, 在台灣最南的N22度, 若每1度細分成200次來撈景點, 我的搜尋半徑必須設成365公尺.
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-7f40723aba4f7754affd37a2dc4e6fdb.jpg)
我只會入門的BASIC語言, 於是我用VB6.0來寫: (在表單上加入一個ADODC元件, 再把附檔WPS_PPG5.mdb解開, 放在您要執行的位置)
拜PaPaGO SDK之賜, 不到50行的程式, 就把所有的資料撈出來了...
'---------------------------------------------------
Private Sub Form_Load()
Dim MapObj As Object
Dim x As Long, y As Long, find As Long, c As Long, bResult As Long
Dim pGisX As Long, pGisY As Long
Dim strName As String, strCity As String, strTown As String, strType As String, strClass As String, nDist As Long
Dim dbFile As String
dbFile = "I:\WPS_PPG5.mdb"
With Adodc1
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbFile & ";Persist Security Info=False"
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.CommandType = adCmdText
.RecordSource = "SELECT * FROM WPS_PPG5"
.Refresh
End With
Set MapObj = New MapObject
Call MapObj.LoadProfile("C:\\PPGSDK\\SAMPLES\\VB\\myPaPaGOVB\\Data\\pc_standard.mpb", bResult)
Call MapObj.OpenMap("C:\\PPGSDK\\Samples\\VB\\myPaPaGOVB\\Data\\Taiwan_UYS.nv5", bResult)
Call MapObj.LoadBackgroundFile("C:\\PPGSDK\\SAMPLES\\VB\\myPaPaGOVB\\Data\\Taiwan_c0.mmh", bResult)
Call MapObj.SetFindItemSize(1000)
'台灣本島從東經120度到東經122度, 每隔18秒(約516公尺)搜尋一次景點
'1度=60分=3600秒, 所以3600/18秒 = 200 (每度要細分200次間隔跑完)
'120000000表示120度, 跑200次, 所以 STEP 5000
For x = 120000000 To 122000000 Step 5000
'台灣本島從北緯25.5度到北緯21.5度, 每隔18秒(約516公尺)搜尋一次景點
For y = 25500000 To 21500000 Step -5000
Call MapObj.FindByLocation(x, y, 516) ' 516公尺為搜尋半徑
Call MapObj.GetFindResult_Count(find) ' 共找到 find 個景點
'把每個景點寫入資料庫
For c = 0 To find - 1
' 取得景點座標及名稱
Call MapObj.GetFindResult(c, pGisX, pGisY, strName)
' 取得景點其它資訊 (包括縣市, 鄉鎮市區, 類別屬性..)
Call MapObj.GetFindResultExt(c, strCity, strTown, strType, strClass, nDist)
' 寫入資料庫
Adodc1.Recordset.AddNew
Adodc1.Recordset.Fields("pGisX") = pGisX
Adodc1.Recordset.Fields("pGisY") = pGisY
Adodc1.Recordset.Fields("strName") = strName
Adodc1.Recordset.Fields("strCity") = strCity
Adodc1.Recordset.Fields("strTown") = strTown
Adodc1.Recordset.Fields("strType") = strType
Adodc1.Recordset.Fields("strClass") = strClass
Adodc1.Recordset.Update
Next
Next
Next
Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set MapObj = Nothing
End Sub'---------------------------------------------------
[後記]
感謝台灣導航軟體廠商, 提供使用者自己加入參與GPS/GIS軟體創作的行列. 如果大家能多交換私房景點, 就會有更多好玩的地方可以去了.
至於記錄下來的景點, 由於圓形範圍會有重複的地方, 要怎麼處理 (刪除) 多餘的資料呢? 我用了SQL裡的Distinct指令, 看起來滿完美的, 總共55873筆資料.
![[軟體發表] 網路蜘蛛](http://attach.mobile01.com/attach/200609/mobile01-c6a4ffa8ea742cd21fb23a67acf60c5c.jpg)