重要聲明:在下載和使用商業(yè)地圖前,請確保您的行為在地圖供應(yīng)商的許可范圍以內(nèi),或者已獲得相關(guān)的授權(quán),并遵守所在國家和地區(qū)的相關(guān)測繪與地圖發(fā)布的法律和規(guī)定,本文只介紹地圖源分析的技術(shù)的方法,對下載和使用商業(yè)地圖造成的知識產(chǎn)權(quán)破壞或其它違法與侵權(quán)問題,概不承擔(dān)任何責(zé)任。Mobile Atlas Creator(下面簡稱MOBAC)從版本1.9開始,不再默認內(nèi)置各種商業(yè)地圖(如Google、Bing、Yahoo等)的地圖源,改為支持用戶自定義地圖源,您可以通過配置XML文件,BeanShell腳本,或者開發(fā)獨立的Jar包,來使得Mobile Atlas Creator支持更多您需要下載的地圖。
本文將以Google地圖為例,為您介紹XML和BeanShell的基本配置方法。
1、單圖層地圖源的XML配置方法我們以Google地圖為例,首先打開Google地圖網(wǎng)站
http://ditu.google.cn,
標(biāo)準的Web摩卡托投影地圖都會將地圖拆分為等尺寸的正方形瓦塊(詳見:http://miocool.com/forums/viewtopic.php?f=16&t=250),接下來我們需要用瀏覽器自帶的工具分析出地圖網(wǎng)站的圖片瓦塊的網(wǎng)址規(guī)律,我們下面將主要以Chrome瀏覽器為例進行介紹,使用其它瀏覽器的用戶也可以用“網(wǎng)頁檢查器(Safari)”或者“Web開發(fā)者(Firefox)”等類似菜單功能來分析這些網(wǎng)址,原理相似,我們不做更多介紹。
點擊Chrome瀏覽器的菜單(地址欄右側(cè),圖標(biāo)是三個橫線的)按鈕,選擇:工具 -> 開發(fā)者工具,如下所示:
在開發(fā)者工具中,切換到Network(網(wǎng)絡(luò)請求)頁,此時工具會列出所有發(fā)生了的網(wǎng)絡(luò)請求,請隨便放縮一下地圖,您會看到產(chǎn)生了很多新請求,標(biāo)準的地圖圖片請求都是256x256大小的標(biāo)準圖片,選擇其中的任意一個地圖圖片請求,右側(cè)Preview就會列出該圖片的網(wǎng)址和預(yù)覽圖。(注意:如果請求太多不好找,建議用底部的“Images”過濾功能來只顯示圖片,或者先用清空按鈕清除現(xiàn)有請求,再縮放下地圖刷新出新的圖片)。
監(jiān)測到的Google地圖的圖片請求如下所示:
可以看到該圖片的網(wǎng)址為:
http://mt3.google.cn/vt/lyrs=m@21000000 ... 12&z=5&s=G上面例子中圖片使用了mt3.google.cn服務(wù)器,大多數(shù)在線地圖都支持多臺服務(wù)器(負載均衡技術(shù))同時工作,也就是說同一圖片在多個服務(wù)器都有備份,不同用戶隨機連接到不同服務(wù)器,以保證連接速度。MOBAC也支持對多臺服務(wù)器進行同時連接下載,這需要我們找出所有可能的服務(wù)器的名稱,如上例中的mt3.google.cn, 我們猜測可能還存在mt0,mt1,mt2,mt4.....,可以通過試探法驗證出到底有哪些服務(wù)器:
首先點擊圖片網(wǎng)址在新窗口中打開圖片,然后嘗試將地址欄中mt3.googlg.cn的數(shù)字3依次替換為0,1,2,3,4,5.....,檢查圖片網(wǎng)址是否仍然可用(返回相同的圖片)。通過試驗?zāi)鷷l(fā)現(xiàn)Google地圖服務(wù)器一共4個,分別是mt0, mt1, mt2,mt3
接下來用“記事本”或者其它文本編輯工具新建一個文本文件,輸入下面的內(nèi)容:
- 代碼: [全選] [下載 Example1.xml]
- Map Source XML
上面配置中,
<name>是自定義的地圖源名字,注意不要和任何現(xiàn)有地圖源名字重復(fù)哦。
<url>就是剛才用瀏覽器分析出的url,只是需要把其中x,y,z的具體的值,替換為{$x}, {$y}, {$z}這樣的引用。同時把原url中mt3替換為了mt{$serverpart},并在接下來的<serverParts>....</serverParts>配置中寫入“0 1 2 3”。 在下載開始時,MOBAC會將{$x}, {$y}, {$z}替換為真實的x,y,z, 將{$serverpart}替換為0 1 2 3中隨機的一個。
將此文件保存為一個xml文件,如MyMap1.xml, 存到Mobile Atlas Creator安裝目錄下面mapsources子目錄,重啟MOBAC, 你就可以在MOBAC的地圖源列表中看到剛剛添加的“My Own Google Map”地圖源了。
注意: 如果XML配置文件中使用了漢字,必須在保存時選擇編碼為UTF-8,否則無法正常工作。在一個<customMapSource>配置中,可以配置以下參數(shù)配置:
<name>: 必填參數(shù),地圖源名字,支持中文, 但保存時文件必須保存為UTF-8的編碼哦。
<minZoom>: 必填參數(shù),地圖的最小縮放等級,如0級
<maxZoom>: 必填參數(shù),地圖的最大縮放等級,如20級
<tileType>: 必填參數(shù),地圖的圖片格式,支持JPG、PNG、GIF, 3種配置
<url>: 必填參數(shù),最重要的參數(shù),表示訪問的url規(guī)則,即:如何由x,y,z 拼出圖片的在線網(wǎng)址,我們會在后面詳細介紹該參數(shù)的配置。
<invertYCoordinate>: 可選參數(shù),是否反轉(zhuǎn)y,有些地圖y編號是反向增長的,即最底下一行為0,越上北,編號越大,這時需要將此設(shè)為true,才能正常使用。
<serverParts>: 可選參數(shù),指定多臺服務(wù)器,作用于替換掉<url>中的{$serverport}部分
<backgroundColor>: 可選參數(shù),地圖的背景顏色,只對透明的地圖或請求失敗時才有意義,并按照#RGBA的格式,例如#FF00007F表示半透明的紅色。
<tileUpdate>: 可選參數(shù),絕對本地緩存的地圖圖片的刷新邏輯,支持:IfNoneMatch、ETag、IfModifiedSince、LastModified、None(默認)。前面4個需要服務(wù)器支持,None表示不考慮服務(wù)器標(biāo)記,只按照MOBAC全局設(shè)置中設(shè)置的過期時間為準。
<ignoreErrors>: 可選參數(shù),在下載出錯時是否忽略錯誤,繼續(xù)下載。如果設(shè)置為false(默認),會在顯示一個紅色叉在對應(yīng)位置,并且會記錄到總出錯計數(shù)中,注意:對于天地圖2.0, 因為地圖設(shè)計的特殊性,必須將ignoreErrors設(shè)為true,才能正常下載(詳細原因有機會再給大家詳細介紹)。
2、多圖層地圖源的XML配置方法對于Google混合地圖等地圖源,通過分析Network的網(wǎng)絡(luò)請求,您會發(fā)現(xiàn)每個地方的圖片其實是由2張地圖疊加而成,底層是衛(wèi)星圖,上層是透明的道路地圖,如下所示:
道路地圖層(在上):
網(wǎng)址為:http://mt1.google.cn/vt/imgtp=png32&lyrs=h@210000000&hl=zh-CN&gl=CN&src=app&x=47&y=23&z=6&s=Gali
衛(wèi)星地圖層(在下)
網(wǎng)址為:http://mt3.google.cn/vt/lyrs=s@126&hl=zh-CN&gl=CN&src=app&x=47&y=23&z=6&s=Gali
合并后效果:
要支持這樣的多圖層地圖源,您可以是有MOBAC的多圖層地圖源(<customMultiLayerMapSource>)配置,它可以將任意多個不同類型的地圖源疊在并輸出。
上面例子中對應(yīng)的Google混合地圖的XML文件如下
- 代碼: [全選] [下載 Example2.xml]
- Map Source XML
注意配置的順序?qū)⒂绊懽罱K合并效果,配置越靠前,合并時放的位置越下面。
將上面的文件保存為xml,保存到mapsources子目錄,重啟MOBAC,即可看到新增的地圖源:My Own Google Hybrid Map
當(dāng)多圖層中的某一個圖層,已經(jīng)在其它配置文件中配置過,則您也可以直接通過地圖源名字引用這些圖層,例如,假設(shè)Map1和Map2是已經(jīng)存在的地圖源,而Map3是不存在的,則我們可以用下面的多圖層地圖源來合并Map1,Map2,Map3,其中Map1在最下面,Map3在最上面。
- 代碼: [全選] [下載 Example3.xml]
- Map Source XML
3、其它類型地圖源的XML配置方法除了使用<customMapSource>配置標(biāo)準的Web摩卡托投影地圖,MOBAC還支持WMS,CloudMade,本地文件,本地Zip,本地Sqlite等多種格式的網(wǎng)絡(luò)服務(wù)或本地資源作為地圖源。例如,下面是TerraServer地圖的WMS配置
- 代碼: [全選] [下載 Example4.xml]
- Map Source XML
不同類型地圖源對應(yīng)的頂級標(biāo)簽如下:
<customWmsMapSource>: WMS 地圖
<cloudMade>: cloudMade地圖
<localTileFiles>: 本地瓦片圖片,必須按照zoom/x/y.png 或者其它支持的目錄結(jié)構(gòu)與命名規(guī)范存儲
<localTileZip>: 存儲在Zip中的本地瓦片圖片,zip內(nèi)部目錄結(jié)構(gòu)的要求和<localTileFiles>一樣。
<localTileSQLite>: 本地Sqlite離線地圖文件,目前支持RMaps, MBTiles, BigPlanetTracks, NaviComputer 和 OSMAND。
關(guān)于這些地圖源的詳細配置參數(shù),這里不做進一步介紹,有需要的朋友可以參考MOBAC的官方Wiki:http://sourceforge.net/apps/mediawiki/mobac/index.php?title=Custom_XML_Map_Sources#Custom_WMS_map_sources
對于使用
Mobile Atlas Creator MP (地圖加加改進版)的用戶,可以使用我們開發(fā)的疊加本地圖片到離線地圖的功能,即類似Google Earth KMZ Overlay,將一張本地圖片,按照指定的經(jīng)緯度范圍,平鋪到地圖的某個區(qū)域,并在所有縮放等級都可見。
下面是一個本地圖片疊加層的例子:
- 代碼: [全選]
- Map Source XML
它將本地的C:\image\test.png圖片,平鋪到緯度32.42 ~ 33.52, 經(jīng)度:106.51 ~ 106.99 這個范圍。并且與本地的“Google 衛(wèi)星地圖”這個圖層進行疊加。
關(guān)于本地圖片疊加層的更多使用技巧,請參考:http://miocool.com/forums/viewtopic.php?f=16&t=248
4、BeanShell地圖源配置方法對于一些比較復(fù)雜的地圖,如Soso地圖,通過分析其圖片網(wǎng)址,會發(fā)現(xiàn)圖片地址的規(guī)則不是簡單的使用x,y,z,還引入了一些新的變量如dx,dy,或者對x,y,z進行復(fù)雜運算和判斷才能構(gòu)造出圖片網(wǎng)址。例如 x + 20, y/2, z-1, 等等,這個時候,簡單的XML配置文件無法應(yīng)付,MOBAC為大家提供了更高階的BeanShell腳本來支持。
BeanShell腳本允許您使用Java語法書寫從x,y,z到最終網(wǎng)址之間的各種運算和條件判斷,需要您具有一定的編程知識,您可以在其中使用Java的絕大多數(shù)語法和函數(shù),也可以像普通腳本那樣定義無類型的變量,是非常強大的地圖源配置手段。
考慮到版權(quán)問題,我們這里不在以真實地圖為例,而是以一個假想的地圖來介紹BeanShell的使用:
假設(shè)有一個在線地圖MyBSMap,其圖片網(wǎng)址形如:http://map.bsh.com/tile?p=12&q=MM2013&m=97&src=app
通過分析,我們了解了它的p,q,m參數(shù)的規(guī)則為:
- 代碼: [全選]
p = x - 64;
q = “MM” + y;
當(dāng)z>10時, m = z, 當(dāng)z < 10時,m = z + x;
- Bean Shell
根據(jù)上述規(guī)則,我們用記事本新建一個文本文件如下:
- 代碼: [全選]
//每個Beanshell必須這個函數(shù),傳入x,y,z, 用戶自行拼接一個網(wǎng)址字符串并返回;
String getTileUrl( int zoom, int x, int y ) {
p = x - 64;
q = "MM" + y;
int m;
if(z > 10)
{
m = z;
} else {
m = x + z
}
return "http://map.bsh.com/tile?p="+ p +"&q="+ q +"&m="+ m +"&src=app";
}
tileType = "png"; // 必須,可以等于 "png" ,"jpg" 或 "gif"
name = "My BSH Map"; //必須,并且不能和其它地圖源重名
tileSize = 256; // 圖片大小,可選
minZoom = 1; // 最小等級,可選
maxZoom = 18; // 最大等級,可選
- Bean Shell
注意:String getTileUrl( int zoom, int x, int y ) 函數(shù)是必須的函數(shù),tileType和name屬性也是必須的屬性,name指定的名字將是地圖源的顯示名,不能和其它地圖源重復(fù)哦!
編輯好后將文件存儲為bsh文件,如mybshmap.bsh, 保存到MOBAC目錄的mapsources子目錄,重啟MOBAC,即可以看到新增的 "My BSH Map"地圖源了。
如果文件中含有漢字,請保存為UTF-8編碼,否則將顯示為亂碼或出錯!先寫這么多了,其實,對于復(fù)雜的在線地圖,最困難的在于分析URL規(guī)則,這需要您有一定的Javascript基礎(chǔ)和足夠的耐心,也希望您能將自己的分析和所得及時分享,讓更多的人收益哦。