<<聲明>>本軟體只是針對PaPaGO的SDK進階應用. 所有軟體版權及景點著作權, 仍屬原廠商公司所有. 參照本篇內容實作者, 請勿應用於商業範圍. 若有商業行為發生, 請與原產品公司協調.

所謂的網路蜘蛛, 原指的是透過網路的特性, 層層向外穿透, 取得網路上的資訊. 像大多數的入口網站 (如Google), 都具有此類特性. 它能迅速且有效的搜尋網路資源, 並取得有用的內容.

今天發表的網路蜘蛛<景點蜘蛛篇>, 是最近開發<景點分享平台專案>時, 突然想到的功能. 原理很簡單, 說穿了不值錢. 老王賣瓜, 正題之前先來幾張開發中的擷圖:

軟體主畫面:
[軟體發表] 網路蜘蛛

直接匯整自己喜歡或適合的圖片: (本圖例的長榮桂冠酒店照片, 原出處為拉不拉多生活旅遊休閒網, 圖片版權仍屬該網站或公司所有.
[軟體發表] 網路蜘蛛

分享給眾多不同的軟體: (這個部份還在陸續進行中)
[軟體發表] 網路蜘蛛

支援整合多種路程, 航跡. 讓大家自己收集各類型檔案. 可以收集某人去過的足跡 (航跡,track), 也可以收集別人規劃好的路程 (路線, route). 當然, 要收集網誌裡的筆記也可以囉...
[軟體發表] 網路蜘蛛

=======================================================

回到主題. 在整合PaPaGO的SDK的時候, 突然想到一個功能. 要是能用程式把所有的景點資料都 "撈" 出來, 這... 有多少筆資料呢? 於是有了這一篇文章.

首先, 當然要有PaPaGO SDK啦! 接下來有了工具, 那要怎麼撈呢?

用過導航軟體的朋友, 應該都會發現有個功能叫做 "查詢附近景點". 今天我們就拿這個功能來下手. PaPaGO SDK中有一個函式FindByLocation, 只要輸入WGS84的經緯度及搜尋範圍(半徑), 就可以取得方圓數百公尺內所有景點陣列資料. 那如何判斷在哪裡搜尋呢? 先來看看下圖:

把台灣細分成許多微小的區域, 在每個點上搜尋不就好了?
[軟體發表] 網路蜘蛛

像這樣可以嗎? 不行, 因為中間深藍色的地方, 就成了漏網之魚.
[軟體發表] 網路蜘蛛

這樣好多了吧? 嗯, 所有的地區都能涵蓋到, 不錯!
[軟體發表] 網路蜘蛛

至於每個點之間的距離要怎麼取決呢? 我是這樣算的:
假設地球半徑6378.1公里, 並當成正球體來看. 所以赤道長約2 * pi * 6378.1 = 40074.7842公里. 每一度經度跨徑 (橘色線) 長度40074.7842 / 360 = 111.3188公里. 在北緯30度的地方, 因為COS(30)=0.866, 因此當地一度經度跨徑 (藍線) 只剩下96.4049公里.
[軟體發表] 網路蜘蛛

依此原理計算, 在台灣最南的N22度, 若每1度細分成200次來撈景點, 我的搜尋半徑必須設成365公尺.
[軟體發表] 網路蜘蛛

我只會入門的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筆資料.
[軟體發表] 網路蜘蛛
哇!大大真是程式高手啊~~這的點子真是非常有幫助!!
Cupid大哥又來一個軟體
航點格式轉換系統 已經是夠不錯的了
Cupid 大哥果然是用心....
期待這次的軟體更能夠發揮所長,期待中......
6S 64G 金 + HTC U11 128G + Xs MAX 256G
Cupid wrote:
<<聲明...(恕刪)


那可以匯出N1XX.XXXX E2X.XXXX 的座標嗎?

我想轉成POI檔使用, 可以造福更多人.....

PS:
我不是PAPAGO的使用者啦.....
舊山線上 台鐵唯一的 折返線 即將拆除! 趕快去悼念吧XD 我有2兆 隨便照+趴趴走http://blog.yam.com/ericsun0514
ericsun0514 wrote:
那可以匯出N1XX.XXXX E2X.XXXX 的座標嗎?
我想轉成POI檔使用, 可以造福更多人.....


圖中的Garmin圖示, 就是匯出成POI格式, 是可以給POI Loader用的.
Cupid wrote:
圖中的Garmin圖...(恕刪)


大大:

問一個笨問題..

那意思是...我得要買papago R12 + SDK 才能享受您寫的程式囉!
舊山線上 台鐵唯一的 折返線 即將拆除! 趕快去悼念吧XD 我有2兆 隨便照+趴趴走http://blog.yam.com/ericsun0514
ericsun0514 wrote:
那意思是...我得要買papago R12 + SDK 才能享受您寫的程式囉!


這個嘛... 就這個<景點蜘蛛>的架構而言, 是必須在具有PAPAGO SDK的環境下才能執行沒錯.
而我之後在發表<景點分享平台專案>時, 會把這個功能獨立出來, 分製成具有PAPAGO SDK及沒有PAPAGO SDK的兩個版本. 各位同學可以依自己的環境來選擇要採用哪一種版本.

我只是針對軟體的功能來提出想法, 並且去實踐它. 至於您要不要去購買SDK, 我很難幫您決定. 若我勸您去買, 這樣會有商業行為的嫌疑. 若我勸您不用買, 似乎又在阻人財路.

小弟只是純開發及創作, 其餘的部份就有勞大大您的智慧來解決囉!

另一種方式 不用透過SDK 直接使用資料庫方式就可以了
就是採用 TWD67 OR 97 坐標系統
因為 二度分帶採用是公尺 方式 可以直接透過資料庫查詢就可以做到

將你想要查詢所在先定出來 是 X1 (XXXXXX m),Y1 (XXXXXXX m)
然後半徑 R (500 m)

minx = X1 - R
maxx = X1 + R
miny = Y1 - R
maxy = Y1 + R

配合自己有一個 POI 資料庫就可以下


select field form table where (x between maxx and minx) and (y between maxy and miny) => access 不支援 between 可以改用 < > 自行替換


此方式雖然沒有採用 GIS 方式準確 但是方便好用 速度也比較快
Cupid大大請教一下喔
我最近也想用papago sdk寫些程式,請問您的sdk是書上附的那套,還是另外買的阿
如果是另外買要多少錢阿,我也是用VB6
謝謝
YangChen wrote:
另一種方式 不用透...(恕刪)


大大:
我不會寫程式啦....

可否分享一個小程式呢...感激不盡啦!
舊山線上 台鐵唯一的 折返線 即將拆除! 趕快去悼念吧XD 我有2兆 隨便照+趴趴走http://blog.yam.com/ericsun0514
關閉廣告
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!