问题描述
今天我在「懒人GIS」的微信公众号上看到一个比较感兴趣的应用,就是利用 FME 实现瓦片数据的下载与拼接,所以我也试着去实现了一下。
解决思路
以 ArcGIS 发布的切片服务为例,获取切片的地址为
http://ip:6080/arcgis/rest/services/ServiceName/MapServer/tile/zoom/y/x
上面地址中,红色加粗的参数需要依据 ArcGIS Server 发布服务的具体情况而定。其中:zoom 表示瓦片级别,x 和 y 表示瓦片的行号和列号。
当然,不同服务获取瓦片的方式有所不同,还需要依据实际情况进行分析。如果有权限控制的情况,可能还需要动态获取 token 或是 key 等参数。
这里我们以 ArcGIS 发布的切片服务为例进行瓦片数据的获取和拼接,解决思路如下:
1. 创建一张属性表,每条记录有三个重要属性:待下载瓦片数据的行号、列号、瓦片级别
2. 依据行列号和瓦片级别构建在线瓦片的链接地址
3. 使用ImageFetcher/HttpCaller转换器获取对应的瓦片(本例使用ImageFetcher)
4. 使用RasterGeoreference计算瓦片的相对坐标,方便进行后续拼接,否则所有的图片会叠加在一起
5. 使用RasterMosaicker进行瓦片拼接
6. 输出拼接后的瓦片
模板截图
具体实现的模板截图如下图所示:
在该模板中,我们预先设定了几个用户参数,也是为了让模板更加灵活:
url:ArcGIS 地图服务地址
row_count:批量下载瓦片的行数
col_count:批量下载瓦片的列数
zoom:下载瓦片的瓦片级别
size:瓦片图片的大小(一般为256,或512)
在模板中,我们首先用 Creator 创建了一个空的对象,然后克隆了 row_count * col_count 份,使用AttributeCreator计算每条记录的 x 和 y 的值(更推荐使用AttributeManager),并拼接出下载瓦片的 url 地址,随后使用ImageFetcher下载瓦片,使用RasterGeoreference计算瓦片的相对坐标,使用RasterMosaicker拼接瓦片,最后输出。
其中AttributeCreator计算 x、y、url的值如下图的设置:
其中用到了%(取余操作符),以及 floor函数进行取整操作。
当然,如果你觉着这样比较复杂,也可以预先创建一个 Excel 文件,直接读取 Excel 文件。
使用RasterGeoreference计算瓦片的相对坐标的设置如下图:
这里需要注意的是瓦片服务的坐标原点在哪里,若遵循 TMS 标准,则坐标原点在左下角,否则在左上角。ArcGIS 瓦片服务的坐标原点在左上角,所以 0 / 0 图片是左上角的第一张图片。
核心转换器
ImageFetcher:通过执行 HTTP GET 操作在指定的 URL 上获取图片,并将得到的数据作为栅格要素对象返回。
RasterGeoreference:用指定的参数对栅格进行空间配准(上述案例中我们计算的是相对位置,其实也可以使用真实坐标进行配准)。
RasterMosaicker:把多个栅格要素镶嵌为一个栅格要素。