从天地图下载瓦片构建ArcGIS Server底图服务

从天地图下载瓦片构建 底图服务
我们可以通过调用天地图发布的API来将天地图作为自己的底图 , 但是这需要我们去学习如何天地图的API , 并且要将天地图集成到自己的系统中则比较繁琐 , 并且在公司不能使用外网的情况下 , 调用天地图的API将变为不可行 。今天我们通过下载天地图的瓦片地图 , 然后按照的瓦片组织规则将天地图的瓦片构建为自己服务器上的底图服务 。
步骤如下:
1、从天地图下载瓦片
我们看到的天地图其实是由一个个瓦片拼接而成的 , 而这些瓦片存储在天地图的服务上 , 并且每一个瓦片都有自己的URI , 天地图上由四种类型的瓦片 , 分别是:vec(矢量底图瓦片)、cva(矢量注记瓦片)、img(影像底图瓦片)、cia(影像注记瓦片) , 他们对应的URI分别是:
矢量底图:
矢量注记:
影像底图:
影像注记:
其中每个URI包含四个参数 , 分别是:
T=vec_c ; x = ? ; y = ? ; l = ?;
T代表底图类型 , x代表瓦片的列号(起始位0) , y代表瓦片的行号(起始位0) , l代表底图的级别(起始位1 , 最大为20) 。
天地图的切片规则是这样的 , l=1时 , 整幅地图(全球地图)被切为两片 , 如图(l=1):

从天地图下载瓦片构建ArcGIS Server底图服务

文章插图
当l=2即以后 , 每个瓦片将被切位4片 , 如图(l=2):
从天地图下载瓦片构建ArcGIS Server底图服务

文章插图
2、通过坐标值计算在某一级别的行列号
通常 , 我们需要某一范围的地图 , 所以我们只需要下载一个范围内的地图 , 那如何通过一个范围的坐标系获得该范围的所有瓦片的行列好呢?
假设 , X、Y为一个点的坐标值 , 而x、y为这个点在级别l时所处瓦片的行列号 , 通过下面一个公式来计算(X、Y)在级别l所处瓦片的行列号(x、y):
仅限在中国范围内
x = ((180 + X)/s*256)-1;
y = ((90-Y)/s*256)-1;
其中s代表在级别l时的分辨率 , 分辨率如下表:(分辨率(s)和级别(l)一一对应)
this._listResolution.Add(0.70312500015485435);l=1
this._listResolution.Add(0.35156250007742718);l=2
this._listResolution.Add(0.17578125003871359);l=3
this._listResolution.Add(0.0878906250193568); l=4
this._listResolution.Add(0.0439453125096784); l=5
this._listResolution.Add(0.0219726562548392); l=6
this._listResolution.Add(0.0109863281274196); l=7
【从天地图下载瓦片构建ArcGIS Server底图服务】this._listResolution.Add(0.0054931640637098); l=8
this._listResolution.Add(0.0027465820318549957); l=9
this._listResolution.Add(0.0013732910159274978);l=10
this._listResolution.Add(0.00068664549607834132); l=11
this._listResolution.Add(0.00034332275992416907); l=12
this._listResolution.Add(0.00017166136807812298); l=13
this._listResolution.Add(8.5830684039061379E-05); l=14
this._listResolution.Add(4.2915342019530649E-05); l=15
this._listResolution.Add(2.1457682893727977E-05); l=16
this._listResolution.Add(1.0728841446864E-05); l=17
this._listResolution.Add(5.3644207234319882E-06); l=18
this._listResolution.Add(2.6822103617159941E-06); l=19
this._listResolution.Add(1.341105180858E-06); l=20
公式讲解:
180 + X 代表从左至右的经度距离 , s代表地图分辨率 , 就是每一个像素表示的距离(在这里单位为经纬度) , 而天地图的每一个切片为256*256像素的 , 所以每一个切片表示的距离为256*s , (180 + X)/s*256 则表示(X、Y)点所在切片的列号 , 可能是一个小数 , 所以则通过函数获得该数向上舍入(1.2则转化成2) , 由于行列号都是从0开始计数 , 故最后再减去1 。如此便得到在 级别为 l 时 , (X、Y)点的所在切片行列号为(x、y) 。