用 openstreetmap 自製Garmin 地圖

一、前言
Garmin的機子好用,特別是在手持機裡面真的是有目共睹。小弟出國幾次都離不開它。雖然60csx也到了該世代交替的時候,但還能用的話就先用囉。

記得以前看過一篇(http://www.mobile01.com/topicdetail.php?f=228&t=500771),介紹繁體的日本地圖,資料來源來自於日本的國土地理院。經過了這麼多年,特別是openstreet出現後,我想製作地圖給garmin gps機器的難度已經大大的降低。在這篇(http://www.mobile01.com/topicdetail.php?f=228&t=2441286)裡面已經介紹過有很多地方做出了以openstreet為基礎的garmin地圖。至於整個製作的方式,經過一番摸索,終於能做出還算好用的地圖了,特別是對應舊機子(如老摳摳的60csx)的部份。

溫馨提示:透過這個方法做出來的地圖,我自己的滿意度達到85分。
1.舊的機器只能讀繁體中文和英文,而透過這個方法在日本地圖能夠看到漢字,而將假名用英文拼音(和haily大發表的繁體日本地圖概念一樣)。雖然不正統,但這是舊機器能使用的方法。
2.可導航。
3.可搜尋。
4.不保證正確(就和維基百科可能有錯誤是一樣的),但出國短期旅遊應該可以應付。


二、Openstreetmap
是一種線上的地圖,但編輯的方式不同於google,而是很像wiki,由眾人進行編輯而成。而openstreet還能夠下載近乎原始資料的*.osm檔,作為後續的使用。和google地圖不同的是,openstreet的資料「應用」和「結合」比較少,但因為有熱心的民眾不斷更新,所以有時候資料蠻能符合當下的現況的。

三、使用的軟體
從openstreet資料變成最後的garmin可用地圖,需要幾個軟體。其中幾個軟體應該有些garmin玩家不陌生,因為是管理garmin地圖常用的軟體。
Gmaptool->能對於garmin地圖進行合併、分割、增減屬性(但不能更改有上鎖的圖資)。
mapsettoolkit->管理電腦中所有的garmin圖資,包含其中的Family ID等。過去如果某些圖資安裝失敗,開不起來mapsource/basecamp,也要透過這個軟體來移除。(這裡有介紹)
Cgpsmapper->最神奇的應該是這個軟體,功能是做什麼的一直不是非常清楚,以前要用,現在還是要用,但似乎角色比較輕了。(免費版即可)

接下來是從openstreetmap轉出來資料要用到的軟體
convertZ->老牌轉換字碼的軟體,特別對於老摳摳機器沒辦法讀unicode時,特別需要,如果機器夠新,不用改字碼(簡體中文、日文等等),那也可以跳過。(請google,很容易找到)
Mkgmap->這是專門處理將openstreetmap轉成garmin機器的img的軟體。
Mkgmap的splitter->因為有時候檔案太大,需要用這個軟體加以分割。

四、步驟
1. 下載openstreet資料(openstreet)
開啟openstreet
用 openstreetmap 自製Garmin 地圖

找到想下載的區域,按下匯出
用 openstreetmap 自製Garmin 地圖

也可以手動框選
用 openstreetmap 自製Garmin 地圖
用 openstreetmap 自製Garmin 地圖

Ok之後選擇匯出

但這樣範圍通常太大,會被系統拒絕。所以要用「如果上述工具匯出失敗,請考慮使用下列的來源:」這裡提供的工具。像第一個overpass API還蠻好用的。

2. 檢視資料
像剛剛選取的區域,下載的檔案有145MB。可以用可以開啟超大文字檔的軟體開啟,不開啟也是可以的。檔頭像這樣。
用 openstreetmap 自製Garmin 地圖

裡面巨細靡遺的有各種資訊
用 openstreetmap 自製Garmin 地圖
<如果需要轉字碼,參閱後面運用convertZ的單元>

3. mkgmap製作檔案
下載mkgmap (免費軟體)( http://www.mkgmap.org.uk/),下載後解壓縮。
用 openstreetmap 自製Garmin 地圖

同時將剛剛下載好的osm檔案放到同一個資料夾。
用 openstreetmap 自製Garmin 地圖

這是一個只能在command line工作的檔案,所以需要進入命令提示字元開啟。
用命令列的方式到工作的資料夾
用 openstreetmap 自製Garmin 地圖

接下來是關鍵,如何用mkgmap來轉換。參考mkgmap的官網可能會看不懂,但是網友力量大,不少人分享了過去的經驗。

建議寫一個簡單的文字檔,來處理這些繁雜的命令。
用 openstreetmap 自製Garmin 地圖

以下稍微介紹一下各項參數。
mapname=63530001 ->設定個別img檔的名稱,必需是8位數字
code-page=932 ->機器用的語言代碼。這個很關鍵,如果機器能讀日文的,code page要選932,才能看到漢字和假名。如果沒有選,則中文字會變成拼音。<繁中機器另外介紹>。
route ->增加這個設定可以導航
drive-on-left ->左駕
generate-sea=multipolygon,extend-sea-sectors,close-gaps=10 ->繪製海面圖塊。如果沒有選,則海面不會特別繪製。但這組參數有時候不太成功,實在不成功的話就先跳過。
input-file=map ->輸入的檔案
lower-case ->看人家這樣寫,意思是什麼不知道….
country-name=JAPAN
region-name=JAPAN
region-abbr=JP
country-abbr=JP
overview-mapname=JP1 ->自己定,後面會出現的overview名稱
family-id=66 ->自己定,但要看一下已經安裝的地圖FID(用mapsetoolkit看,不可重複
family-name=JP ->自己定
series-name=JP ->自己定
description=JP ->自己定
remove-short-arcs ->精簡不必要的短線段
add-pois-to-areas ->這個設定的意義還不是很懂
add-pois-to-lines ->這個設定的意義還不是很懂
index
tdbfile ->產生tdb檔,後面安裝有需要
poi-address

另外有個參數可以加 gmapsupp。增加這個的話會直接產生gmapsupp.img檔,直接置換gps機器裡面的檔案就可以使用。(原來檔案請先改面或備份)

然後在命令提示字元裡key入:
Java –ea –jar mkgmap.jar –read-cofig=”<命令檔案名稱>”

Java –ea –jar mkgmap.jar –read-cofig=”test1.txt”
用 openstreetmap 自製Garmin 地圖

在資料夾裡產生了這些檔案
用 openstreetmap 自製Garmin 地圖

4. 加入到mapsource
開啟mapsetoolkit
用 openstreetmap 自製Garmin 地圖

裡面會出現安裝的地圖。點擊install
用 openstreetmap 自製Garmin 地圖

Mapset-name/Product code/Family ID 都是自動帶出。
選擇TDB-file
選擇overview map (這個檔名之前自己設定的)
自己設定一個registry name

按下install

Mapset裡面出現了新的地圖
用 openstreetmap 自製Garmin 地圖

5. 檢視成果
用mapsource 或 basecamp來看看囉
用 openstreetmap 自製Garmin 地圖

有很多poi
用 openstreetmap 自製Garmin 地圖

這是日文系統的內容
用 openstreetmap 自製Garmin 地圖

可以搜尋最近點
用 openstreetmap 自製Garmin 地圖

如果可以打日文,也可以搜尋….
用 openstreetmap 自製Garmin 地圖

Ps. 地址搜尋可能就不建議了。

可建立航線(應該也可以導航吧….)
用 openstreetmap 自製Garmin 地圖

之前去的航跡
用 openstreetmap 自製Garmin 地圖

五、字集轉檔
可是上面這樣的檔案,如果傳到機器裡面會是亂碼一片,老摳摳的機器不支援。最好的情況是如同當年Haily大的方式,漢字變成中文字,而假名變成拼音,勉強可以用。因此要對原來下載來的osm檔進行轉檔。運用convertZ這個軟體。

打開convertZ,先用剪貼簿檢視器看一下
用 openstreetmap 自製Garmin 地圖

按下uni-繁
用 openstreetmap 自製Garmin 地圖

太神奇了,日文轉成繁體中文了。但是假名不見了….
所以要在運用convertZ裡面另一個神奇功能:詞彙修正。當他看到假名時,就自動轉換成拼音
類似像這樣的東西。
用 openstreetmap 自製Garmin 地圖

但這問題不是這麼簡單,需要一番波折。總之最後要做成一個對應檔,我把它較成japan.dat,匯入到詞彙修正當中。
用 openstreetmap 自製Garmin 地圖

同時轉碼設定裡面,big5日文假名支援打勾
用 openstreetmap 自製Garmin 地圖

這時候再來看看剪貼簿檢視器
用 openstreetmap 自製Garmin 地圖

假名就變成了拼音了


convertZ更厲害的是可以轉換整個文字檔。
用 openstreetmap 自製Garmin 地圖

用 openstreetmap 自製Garmin 地圖

選擇剛剛的osm檔,加入轉換。並且選擇utf-8轉utf-8(因為mkgmap必須是utf-8的編碼),然後進到進階選項中,選擇輸出為繁體中文。目的地找個自己記得的地方。點擊隱藏進階選項,選擇開始轉換。
用 openstreetmap 自製Garmin 地圖

開起來看一下,繁體中文,假名是拼音。
用 openstreetmap 自製Garmin 地圖
用 openstreetmap 自製Garmin 地圖

這時候的檔案就能進到mkgmap來進行轉換,但有些參數要改一下:
mapname=63530002 ->盡量不要重覆
code-page=950 ->改成繁體中文的代號
route
drive-on-left
input-file=map-1 ->轉過字碼後的檔案
lower-case
country-name=JAPAN
region-name=JAPAN
region-abbr=JP
country-abbr=JP
overview-mapname=JP2
family-id=67 ->不要重複
family-name=JP2 ->盡量不要重複,不然在mapsource裡面會分不清楚
series-name=JP2 ->盡量不要重複,不然在mapsource裡面會分不清楚
description=JP2 ->盡量不要重複,不然在mapsource裡面會分不清楚
remove-short-arcs
add-pois-to-areas
add-pois-to-lines
index
tdbfile
poi-address

用mapsetoolkit加入map後,開啟mapsource來看看成果
這是日文版
用 openstreetmap 自製Garmin 地圖

這是繁體中文+假名拼音版
用 openstreetmap 自製Garmin 地圖

六、超大osm檔轉換
像剛剛這樣的小區域,osm檔就要140MB,稍微大一點的就會爆掉,破G應該很容易。之前下載一塊區域,1.2G,跑完轉換字碼convertZ,但在mkgmap裡面就不行了。幸好mkgmap知道有這個問題,開發了splitter (http://www.mkgmap.org.uk/doc/splitter.html)。參考裡面的用法,key入指令。
其中 –Xmx2000m參數,如同網頁裡說的,參考自己電腦的記憶體。執行後就會出現分拆之後的檔案(.osm.pbf)

此時,理論上應該可以透過template.args這個檔案一次進行mkgmap的轉換,但測試失敗。因此還是個別檔案進行mkgmap。這時候的腳本檔當中input-file=各自的.osm.pbf檔。轉換後就有幾個img檔。

接下來應用gmaptool,將這幾個檔案組合。
打開gmaptool,add file
用 openstreetmap 自製Garmin 地圖

Split裡面,directory加入目標的資料夾,create選擇files for mapsource,Compile preview map鍵入mapset名字(自己取),set mapset FID自己選(不要重複), PID=1
用 openstreetmap 自製Garmin 地圖
然後點擊split all

進入目標的資料夾,把神奇的cgpsmapper.exe和sendg.dll放在同一個資料夾,點擊install.bat
用 openstreetmap 自製Garmin 地圖

跑了一堆東西出來
用 openstreetmap 自製Garmin 地圖

Preview map的檔案出現了
用 openstreetmap 自製Garmin 地圖

進入mapsetoolkit裡面,加入
用 openstreetmap 自製Garmin 地圖

進入mapsource看看結果,繁體中文+假名拼音
用 openstreetmap 自製Garmin 地圖

可以有航線(應該可以導航)
用 openstreetmap 自製Garmin 地圖

可以跨圖塊航線(導航)(這個地圖有四個圖塊)
用 openstreetmap 自製Garmin 地圖
用 openstreetmap 自製Garmin 地圖

七、後記
如果還有興趣,可以自己繪製地圖,透過osm的格式轉換到gps當中。試驗過的方式是在其他GIS軟體中繪製的線段,經由JOSM開啟轉換成osm檔,然後透過mkgmap、gmaptool和mapsetoolkit等軟體轉換、調整(如底圖透明、繪製priority等,以便在gps當中進行套合如等高線)和加入。

而convertz是讓老兵不死的重要軟體!

附加convertZ假名轉拼音的dat檔
附加壓縮檔: 201405/mobile01-bd257d0608627aacdcbda4a8289df6a6.zip

stupids1978 wrote:
一、前言Garmin...(恕刪)


真專業, 感謝分享
真是太厲害了,沒想到那麼久以前的高階玩法還有人繼續鑽研...
太佩服了...五分奉上~~
這篇文章寫得真好,要請教您一些問題。我下周要去土耳其,請問我已按照Openstreetmap的教學建置好土耳其的Openstreetmap地圖,並將地圖存至SD card 安裝至GPSmap 62stc,使用"地圖選擇"將台灣地圖關閉,再開啟土耳其地圖,但回到"地圖顯示"卻一片空白,都看不到所安裝的土耳其的Openstreetmap地圖,請問是因為GPS定位在台灣所以看不到土耳其的Openstreetmap地圖嗎? 還是我沒安裝正確?
煩請提供建議,謝謝。
小弟我試著在做北海道全境地圖
但在mkgmap這個步驟遇到下面的錯誤

D:\mkgmap-r3293\mkgmap-r3293>Java -ea -jar mkgmap.jar --keep-going --read-config
="mapsetup.txt"
Time started: Fri Jun 13 11:56:35 CST 2014
java.lang.OutOfMemoryError: Java heap space
at it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap.rehash(Int2ObjectOpe
nHashMap.java:694)
at it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap.put(Int2ObjectOpenHa
shMap.java:195)
at uk.me.parabola.mkgmap.reader.osm.OSMId2ObjectMap.put(OSMId2ObjectMap.
java:49)
at uk.me.parabola.mkgmap.reader.osm.ElementSaver.addPoint(ElementSaver.j
ava:101)
at uk.me.parabola.mkgmap.reader.osm.xml.Osm5XmlHandler.startNode(Osm5Xml
Handler.java:344)
at uk.me.parabola.mkgmap.reader.osm.xml.Osm5XmlHandler.access$100(Osm5Xm
lHandler.java:42)
at uk.me.parabola.mkgmap.reader.osm.xml.Osm5XmlHandler$SaxHandler.startE
lement(Osm5XmlHandler.java:96)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startEle
ment(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.
emptyElement(Unknown Source)
at com.sun.org.apache.xerces.internal.xinclude.XIncludeHandler.emptyElem
ent(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scan
StartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(U
nknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next
(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(U
nknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(U
nknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown So
urce)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Un
known Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.p
arse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown S
ource)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at uk.me.parabola.mkgmap.reader.osm.xml.Osm5MapDataSource.load(Osm5MapDa
taSource.java:63)
at uk.me.parabola.mkgmap.reader.osm.OsmMapDataSource.load(OsmMapDataSour
ce.java:127)
at uk.me.parabola.mkgmap.main.MapMaker.loadFromFile(MapMaker.java:167)
at uk.me.parabola.mkgmap.main.MapMaker.makeMap(MapMaker.java:63)
at uk.me.parabola.mkgmap.main.Main$1.call(Main.java:253)
at uk.me.parabola.mkgmap.main.Main$1.call(Main.java:249)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Number of MapFailedExceptions: 0
Number of ExitExceptions: 0
Time finished: Fri Jun 13 11:58:17 CST 2014
Total time taken: 102278ms
stupids1978 wrote:
一、前言Garmin...(恕刪)

deaddreamer wrote:
我下周要去土耳其,請問我已按照Openstreetmap的教學建置好土耳其的Openstreetmap地圖,並將地圖存至SD card 安裝至GPSmap 62stc,使用"地圖選擇"將台灣地圖關閉,再開啟土耳其地圖,但回到"地圖顯示"卻一片空白,都看不到所安裝的土耳其的Openstreetmap地圖,請問是因為GPS定位在台灣所以看不到土耳其的Openstreetmap地圖嗎? 還是我沒安裝正確?


這是有可能的。因為gps定位在台灣,不會顯示土耳其的地圖。可能要手動拉到遙遠的土耳其,放大看看。62stc我手上沒有,但同學有,應該是這個問題沒錯。

祝旅途愉快

SeanLin wrote:
小弟我試著在做北海道全境地圖
但在mkgmap這個步驟遇到下面的錯誤
D:\mkgmap-r3293\mkgmap-r3293>Java -ea -jar mkgmap.jar --keep-going --read-config
="mapsetup.txt"
Time started: Fri Jun 13 11:56:35 CST 2014
java.lang.OutOfMemoryError: Java heap space


顯然是因為檔案太大,超過mkgmap可負荷的範圍(out of memory error)

請先用mkgmap網頁中的splitter (網址),將osm檔分拆。例如我在做關西地圖時,就必須拆成四個檔案來做。

另外,實際日本測試後,導航的功能因為openstreetmap本身圖資的精確度問題,不建議真的依照這樣執行,需要先在電腦上規劃好。


stupids1978 wrote:
顯然是因為檔案太大,...(恕刪)

感謝大大指導
下載了splitter,不過參數不太會下
原來這樣做成的地圖不適合用於導航啊
真是寶貴的消息
splitter的參數就很單純

java -Xmx2000m -jar splitter.jar file.osm

file.osm ->下載的osm檔
-Xmx2000m 參考自己的電腦。我上次應該是很小心,只有用800還是600吧。這部分可能要試一下
如果要改字碼,osm檔要在分拆前改喔

至於導航:我碰到的問題是高速公路和平面道路系統的問題,沒有被很清楚的分隔好,這部份只能殘念,畢竟是眾人完成的,如果沒有熱心的人一直加進去,那就沒辦法。

加5分
感謝熱心分享
^^
stupids1978 wrote:
splitter的...(恕刪)
文章分享
評分
複製連結
bluekai