重要声明:
在下载和使用商业地图前,请确保您的行为在地图供应商的许可范围以内,或者已获得相关的授权,并遵守所在国家和地区的相关测绘与地图发布的法律和规定,本文只介绍地图源分析的技术的方法,对下载和使用商业地图造成的知识产权破坏或其它违法与侵权问题,概不承担任何责任。
Mobile Atlas Creator(下面简称MOBAC)从版本1.9开始,不再默认内置各种商业地图(如Google、Bing、Yahoo等)的地图源,改为支持用户自定义地图源,您可以通过配置XML文件,BeanShell脚本,或者开发独立的Jar包,来使得Mobile Atlas Creator支持更多您需要下载的地图。
本文将以Google地图为例,为您介绍XML和BeanShell的基本配置方法。
1、单图层地图源的XML配置方法
我们以Google地图为例,首先打开Google地图网站 http://ditu.google.cn,
标准的Web摩卡托投影地图都会将地图拆分为等尺寸的正方形瓦块(详见:http://miocool.com/forums/viewtopic.php?f=16&t=250),接下来我们需要用浏览器自带的工具分析出地图网站的图片瓦块的网址规律,我们下面将主要以Chrome浏览器为例进行介绍,使用其它浏览器的用户也可以用“网页检查器(Safari)”或者“Web开发者(Firefox)”等类似菜单功能来分析这些网址,原理相似,我们不做更多介绍。
点击Chrome浏览器的菜单(地址栏右侧,图标是三个横线的)按钮,选择:工具 -> 开发者工具,如下所示:
在开发者工具中,切换到Network(网络请求)页,此时工具会列出所有发生了的网络请求,请随便放缩一下地图,您会看到产生了很多新请求,标准的地图图片请求都是256x256大小的标准图片,选择其中的任意一个地图图片请求,右侧Preview就会列出该图片的网址和预览图。(注意:如果请求太多不好找,建议用底部的“Images”过滤功能来只显示图片,或者先用清空按钮清除现有请求,再缩放下地图刷新出新的图片)。
监测到的Google地图的图片请求如下所示:
可以看到该图片的网址为:
http://mt3.google.cn/vt/lyrs=m@21000000 ... 12&z=5&s=G
上面例子中图片使用了mt3.google.cn服务器,大多数在线地图都支持多台服务器(负载均衡技术)同时工作,也就是说同一图片在多个服务器都有备份,不同用户随机连接到不同服务器,以保证连接速度。MOBAC也支持对多台服务器进行同时连接下载,这需要我们找出所有可能的服务器的名称,如上例中的mt3.google.cn, 我们猜测可能还存在mt0,mt1,mt2,mt4.....,可以通过试探法验证出到底有哪些服务器:
首先点击图片网址在新窗口中打开图片,然后尝试将地址栏中mt3.googlg.cn的数字3依次替换为0,1,2,3,4,5.....,检查图片网址是否仍然可用(返回相同的图片)。通过试验您会发现Google地图服务器一共4个,分别是mt0, mt1, mt2,mt3
接下来用“记事本”或者其它文本编辑工具新建一个文本文件,输入下面的内容:
在下载和使用商业地图前,请确保您的行为在地图供应商的许可范围以内,或者已获得相关的授权,并遵守所在国家和地区的相关测绘与地图发布的法律和规定,本文只介绍地图源分析的技术的方法,对下载和使用商业地图造成的知识产权破坏或其它违法与侵权问题,概不承担任何责任。
Mobile Atlas Creator(下面简称MOBAC)从版本1.9开始,不再默认内置各种商业地图(如Google、Bing、Yahoo等)的地图源,改为支持用户自定义地图源,您可以通过配置XML文件,BeanShell脚本,或者开发独立的Jar包,来使得Mobile Atlas Creator支持更多您需要下载的地图。
本文将以Google地图为例,为您介绍XML和BeanShell的基本配置方法。
1、单图层地图源的XML配置方法
我们以Google地图为例,首先打开Google地图网站 http://ditu.google.cn,
标准的Web摩卡托投影地图都会将地图拆分为等尺寸的正方形瓦块(详见:http://miocool.com/forums/viewtopic.php?f=16&t=250),接下来我们需要用浏览器自带的工具分析出地图网站的图片瓦块的网址规律,我们下面将主要以Chrome浏览器为例进行介绍,使用其它浏览器的用户也可以用“网页检查器(Safari)”或者“Web开发者(Firefox)”等类似菜单功能来分析这些网址,原理相似,我们不做更多介绍。
点击Chrome浏览器的菜单(地址栏右侧,图标是三个横线的)按钮,选择:工具 -> 开发者工具,如下所示:

在开发者工具中,切换到Network(网络请求)页,此时工具会列出所有发生了的网络请求,请随便放缩一下地图,您会看到产生了很多新请求,标准的地图图片请求都是256x256大小的标准图片,选择其中的任意一个地图图片请求,右侧Preview就会列出该图片的网址和预览图。(注意:如果请求太多不好找,建议用底部的“Images”过滤功能来只显示图片,或者先用清空按钮清除现有请求,再缩放下地图刷新出新的图片)。
监测到的Google地图的图片请求如下所示:

可以看到该图片的网址为:
http://mt3.google.cn/vt/lyrs=m@21000000 ... 12&z=5&s=G
上面例子中图片使用了mt3.google.cn服务器,大多数在线地图都支持多台服务器(负载均衡技术)同时工作,也就是说同一图片在多个服务器都有备份,不同用户随机连接到不同服务器,以保证连接速度。MOBAC也支持对多台服务器进行同时连接下载,这需要我们找出所有可能的服务器的名称,如上例中的mt3.google.cn, 我们猜测可能还存在mt0,mt1,mt2,mt4.....,可以通过试探法验证出到底有哪些服务器:
首先点击图片网址在新窗口中打开图片,然后尝试将地址栏中mt3.googlg.cn的数字3依次替换为0,1,2,3,4,5.....,检查图片网址是否仍然可用(返回相同的图片)。通过试验您会发现Google地图服务器一共4个,分别是mt0, mt1, mt2,mt3
接下来用“记事本”或者其它文本编辑工具新建一个文本文件,输入下面的内容:
-
代码:
[全选]
[下载 Example1.xml]
-
<?xml version="1.0" encoding="UTF-8"?>
<customMapSource>
<name>My Own Google Map </name>
<minZoom>0 </minZoom>
<maxZoom>20 </maxZoom>
<tileType>PNG </tileType>
<url><![CDATA[http://mt {$serverpart}.google.cn/vt/lyrs=m@209712068&hl=zh-CN&gl=CN&src=app&x= {$x}&y= {$y}&z= {$z}&s=G]]> </url>
<serverParts>0 1 2 3 </serverParts>
</customMapSource> - Map Source XML
上面配置中,
<name>是自定义的地图源名字,注意不要和任何现有地图源名字重复哦。
<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>配置中,可以配置以下参数配置:
<name>: 必填参数,地图源名字,支持中文, 但保存时文件必须保存为UTF-8的编码哦。
<minZoom>: 必填参数,地图的最小缩放等级,如0级
<maxZoom>: 必填参数,地图的最大缩放等级,如20级
<tileType>: 必填参数,地图的图片格式,支持JPG、PNG、GIF, 3种配置
<url>: 必填参数,最重要的参数,表示访问的url规则,即:如何由x,y,z 拼出图片的在线网址,我们会在后面详细介绍该参数的配置。
<invertYCoordinate>: 可选参数,是否反转y,有些地图y编号是反向增长的,即最底下一行为0,越上北,编号越大,这时需要将此设为true,才能正常使用。
<serverParts>: 可选参数,指定多台服务器,作用于替换掉<url>中的{$serverport}部分
<backgroundColor>: 可选参数,地图的背景颜色,只对透明的地图或请求失败时才有意义,并按照#RGBA的格式,例如#FF00007F表示半透明的红色。
<tileUpdate>: 可选参数,绝对本地缓存的地图图片的刷新逻辑,支持:IfNoneMatch、ETag、IfModifiedSince、LastModified、None(默认)。前面4个需要服务器支持,None表示不考虑服务器标记,只按照MOBAC全局设置中设置的过期时间为准。
<ignoreErrors>: 可选参数,在下载出错时是否忽略错误,继续下载。如果设置为false(默认),会在显示一个红色叉在对应位置,并且会记录到总出错计数中,注意:对于天地图2.0, 因为地图设计的特殊性,必须将ignoreErrors设为true,才能正常下载(详细原因有机会再给大家详细介绍)。
2、多图层地图源的XML配置方法
对于Google混合地图等地图源,通过分析Network的网络请求,您会发现每个地方的图片其实是由2张地图叠加而成,底层是卫星图,上层是透明的道路地图,如下所示:
道路地图层(在上):

网址为: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
卫星地图层(在下)

网址为: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>)配置,它可以将任意多个不同类型的地图源叠在并输出。
上面例子中对应的Google混合地图的XML文件如下
-
代码:
[全选]
[下载 Example2.xml]
-
<?xml version="1.0" encoding="UTF-8"?>
<customMultiLayerMapSource>
<name>My Own Google Hybrid Map </name>
<layers>
<customMapSource>
<name>My Own Google Satellite </name>
<minZoom>0 </minZoom>
<maxZoom>20 </maxZoom>
<tileType>PNG </tileType>
<url><![CDATA[http://mt {$serverpart}.google.cn/vt/lyrs=s@126&hl=zh-CN&gl=CN&src=app&x= {$x}&y= {$y}&z= {$z}&s=G]]> </url>
<serverParts>0 1 2 3 </serverParts>
</customMapSource>
<customMapSource>
<name>My Own Google Street </name>
<minZoom>0 </minZoom>
<maxZoom>20 </maxZoom>
<tileType>PNG </tileType>
<url><![CDATA[http://mt {$serverpart}.google.cn/vt/imgtp=png32&lyrs=h@210000000&hl=zh-CN&gl=CN&src=app&x= {$x}&y= {$y}&z= {$z}&s=G]]> </url>
<serverParts>0 1 2 3 </serverParts>
</customMapSource>
</layers>
</customMultiLayerMapSource>
- Map Source XML
注意配置的顺序将影响最终合并效果,配置越靠前,合并时放的位置越下面。
将上面的文件保存为xml,保存到mapsources子目录,重启MOBAC,即可看到新增的地图源:My Own Google Hybrid Map
当多图层中的某一个图层,已经在其它配置文件中配置过,则您也可以直接通过地图源名字引用这些图层,例如,假设Map1和Map2是已经存在的地图源,而Map3是不存在的,则我们可以用下面的多图层地图源来合并Map1,Map2,Map3,其中Map1在最下面,Map3在最上面。
-
代码:
[全选]
[下载 Example3.xml]
-
<?xml version="1.0" encoding="UTF-8"?>
<customMultiLayerMapSource>
<name>My Own Google Hybrid Map </name>
<layers>
<mapSource>
<name>Map1 </name>
</mapSource>
<mapSource>
<name>Map2 </name>
</mapSource>
<customMapSource>
<name>Map3 </name>
<minZoom>0 </minZoom>
<maxZoom>20 </maxZoom>
<tileType>PNG </tileType>
<url>........... </url>
</customMapSource>
</layers>
</customMultiLayerMapSource>
- Map Source XML
3、其它类型地图源的XML配置方法
除了使用<customMapSource>配置标准的Web摩卡托投影地图,MOBAC还支持WMS,CloudMade,本地文件,本地Zip,本地Sqlite等多种格式的网络服务或本地资源作为地图源。例如,下面是TerraServer地图的WMS配置
-
代码:
[全选]
[下载 Example4.xml]
-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customWmsMapSource>
<name>TerraServer WMS </name>
<minZoom>12 </minZoom>
<maxZoom>18 </maxZoom>
<tileType>JPG </tileType>
<version>1.1.1 </version>
<layers>DRG </layers>
<url>http://terraserver-usa.com/ogcmap6.ashx? </url>
<coordinatesystem>EPSG:4326 </coordinatesystem>
<aditionalparameters><![CDATA[&EXCEPTIONS=BLANK&Styles=]]> </aditionalparameters>
<backgroundColor>#000000 </backgroundColor>
</customWmsMapSource>
- Map Source XML
不同类型地图源对应的顶级标签如下:
<customWmsMapSource>: WMS 地图
<cloudMade>: cloudMade地图
<localTileFiles>: 本地瓦片图片,必须按照zoom/x/y.png 或者其它支持的目录结构与命名规范存储
<localTileZip>: 存储在Zip中的本地瓦片图片,zip内部目录结构的要求和<localTileFiles>一样。
<localTileSQLite>: 本地Sqlite离线地图文件,目前支持RMaps, MBTiles, BigPlanetTracks, NaviComputer 和 OSMAND。
关于这些地图源的详细配置参数,这里不做进一步介绍,有需要的朋友可以参考MOBAC的官方Wiki:http://sourceforge.net/apps/mediawiki/mobac/index.php?title=Custom_XML_Map_Sources#Custom_WMS_map_sources
对于使用 Mobile Atlas Creator MP (地图加加改进版)的用户,可以使用我们开发的叠加本地图片到离线地图的功能,即类似Google Earth KMZ Overlay,将一张本地图片,按照指定的经纬度范围,平铺到地图的某个区域,并在所有缩放等级都可见。
下面是一个本地图片叠加层的例子:
-
代码:
[全选]
[下载 "Example5.xml"]
-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customMultiLayerMapSource>
<name>本地文件+卫星地图 </name>
<tileType>PNG </tileType>
<layers>
<mapSource>
<name>Google 卫星地图 </name>
</mapSource>
<localImageFile>
<name>Image1 </name>
<imageFile>C:\image\test.png </imageFile>
<minZoom>0 </minZoom>
<maxZoom>20 </maxZoom>
<boxNorth>33.52 </boxNorth>
<boxSouth>32.42 </boxSouth>
<boxWest>106.51 </boxWest>
<boxEast>106.99 </boxEast>
<retinaDisplay>false </retinaDisplay>
<backgroundColor>#00000000 </backgroundColor>
</localImageFile>
</layers>
</customMultiLayerMapSource>
- Map Source XML
它将本地的C:\image\test.png图片,平铺到纬度32.42 ~ 33.52, 经度:106.51 ~ 106.99 这个范围。并且与本地的“Google 卫星地图”这个图层进行叠加。
关于本地图片叠加层的更多使用技巧,请参考:http://miocool.com/forums/viewtopic.php?f=16&t=248
4、BeanShell地图源配置方法
对于一些比较复杂的地图,如Soso地图,通过分析其图片网址,会发现图片地址的规则不是简单的使用x,y,z,还引入了一些新的变量如dx,dy,或者对x,y,z进行复杂运算和判断才能构造出图片网址。例如 x + 20, y/2, z-1, 等等,这个时候,简单的XML配置文件无法应付,MOBAC为大家提供了更高阶的BeanShell脚本来支持。
BeanShell脚本允许您使用Java语法书写从x,y,z到最终网址之间的各种运算和条件判断,需要您具有一定的编程知识,您可以在其中使用Java的绝大多数语法和函数,也可以像普通脚本那样定义无类型的变量,是非常强大的地图源配置手段。
考虑到版权问题,我们这里不在以真实地图为例,而是以一个假想的地图来介绍BeanShell的使用:
假设有一个在线地图MyBSMap,其图片网址形如:http://map.bsh.com/tile?p=12&q=MM2013&m=97&src=app
通过分析,我们了解了它的p,q,m参数的规则为:
-
代码:
[全选]
-
p = x - 64;
q = “MM” + y ;
当z > 10时, m = z, 当z < 10时,m = z + x ; - Bean Shell
根据上述规则,我们用记事本新建一个文本文件如下:
-
代码:
[全选]
-
//每个Beanshell必须这个函数,传入x,y,z, 用户自行拼接一个网址字符串并返回;
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 ) 函数是必须的函数,tileType和name属性也是必须的属性,name指定的名字将是地图源的显示名,不能和其它地图源重复哦!
编辑好后将文件存储为bsh文件,如mybshmap.bsh, 保存到MOBAC目录的mapsources子目录,重启MOBAC,即可以看到新增的 "My BSH Map"地图源了。 如果文件中含有汉字,请保存为UTF-8编码,否则将显示为乱码或出错!
先写这么多了,其实,对于复杂的在线地图,最困难的在于分析URL规则,这需要您有一定的Javascript基础和足够的耐心,也希望您能将自己的分析和所得及时分享,让更多的人收益哦。