FME抓取遥感影像瓦片地图服务

0 前言

随着传感器的精度不断提高,遥感影像所占的空间也越来越大,为了方便分享浏览,通常会发布成影像瓦片服务。不管是商业软件还是开源软件发布的影像瓦片服务,本质都是将遥感影像按照不同的级别(不同比例尺)切片成一张张小的瓦片地图,在浏览器上查看的时候根据比例尺和范围查询相应的瓦片地图进行加载。但是发布在互联网上的影像瓦片地图无法进行本地化的分析处理,这个时候就需要将瓦片地图抓取到本地进行拼接处理。

1 抓取瓦片图的原理

瓦片地图服务分享在互联网或局域网上,遵循网络传输协议和特定的加载规则。平时我们在地图浏览页面浏览影像的操作,比如放大缩小和平移,都是以地图窗口为视角作为查询范围,结合当前地图的缩放级别,来查询特定级别特定范围下的瓦片数据。然后瓦片地图就像拼图一样加载在浏览器页面上,形成我们看到的整幅地图的效果。要想抓取瓦片地图,首先要了解瓦片地图服务的构造。本文以智慧广州公众服务“天地图·广州 智慧广州时空信息云平台”为例,进行讲解。广州天地图主页展示如下:
天地图1
因为需要使用到浏览器的开发者工具,在这里推荐使用谷歌浏览器。在谷歌浏览器的界面下按F12调出开发者工具,切换到Network选项卡,然后在地图窗口内放大一下地图来请求新的瓦片,请求的瓦片信息会在Network选项卡中显示出来,如下:
天地图2

我们选中其中一个瓦片图,查看Request URL的内容,复制出来观察一下。

http://gzmap.gov.cn:12345/ServiceAccess/MapService-T/%E5%BD%B1%E5%83%8F/1e85e146b0728d2fb3a5312c75089400/tile/2/377/284

可以看到URL后面的“tile/2/377/284”表示当前瓦片的级别和行列号,该瓦片处在影像级别2,行号377,列号284的位置中。

打开前面的URL地图服务部分,可以看出是用ArcServer平台发布的服务。我们可以查看这个影像服务的座标系,瓦片的大小和精度,影像有多少个级别,影像的分辨率等信息。这里的影像分了12个级别,从 Level ID 0 到 Level ID 11,其中每个级别的Start TileEnd Tile存储着起始瓦片和终止瓦片的信息。服务页面的部分信息展示如下:
server_info
通过右击页面查看网页源代码,可以看到每个级别影像暴露出来的Start TileEnd Tile的URL地址,这也是我们自动化下载影像的入口。
leve_info
通过Start TileEnd Tile显示出来的行列号,我们可以构造出该级别下所有瓦片的行列号,进而构造出该级别所有瓦片的地址。一个地址对应的是一张瓦片PNG,我们只需要全部下载后拼接就能得到一整幅地图。

比如本例中Level 0级别的 Start Tile 和 End Tile 分别为“93/70”和“95/71”。然后我们需要构造改级别下所有的行列号,如下:
(93,70),(93,71)
(94,70),(94,71)
(95,70),(95,71)
可以看出在级别0的影像瓦片只有6张,非常的少,但是随着级别的提高,瓦片的数量呈几何上升。通过行列号构造出所有的瓦片URL后就能下载所有的瓦片png了,进而再将所有的png拼接起来。

2 如何使用FME抓取瓦片图

我们在前面讲了抓取瓦片图的原理,现在就开始讲如何用FME抓取影像并拼接。因为我做的FME工作流较长,我就挑重点转换器的原理来讲解,最后会提供FME模板供大家下载参考

在新建的FME工程中,现新建2个公共参数,如下:

  • Tile_URL :存储影像服务地址
  • Level_id:存储要抓取地图的影像级别

2.1 获取影像页面信息

我们在得到一幅影像的服务地址后(比如天地图的影像服务),可以使用HttpCaller转换器来获取整个页面的信息,再用StringSearcher转换器获取该页面上12个级别的Start TileEnd Tile信息。

  • HttpCaller:Http请求转换器,通过URL可以发起Http\Https请求来获取站点信息。

  • StringSearcher:字符查找转换器,可以进行简单字符查找,可以使用正则表达式进行高级查找。

获取了12个级别的Start TileEnd Tile信息后,我们需要指定级别来获取瓦片,否则12个级别的瓦片数量会非常庞大,普通电脑的存储空间根本不够。博主这边测试了Level0到Level5的瓦片下载和拼接,Level8级别的瓦片因数量过多(186110个),FME在进行瓦片镶嵌时崩溃了。

2.2 生成矩阵数组

在指定要获取的影像界别后,需要基于Start TileEnd Tile生成所有瓦片的地址信息。在这里博主使用自定义转换器结合Python代码来实现。博主自定义了一个名叫“MatrixArray2”的转换器,接收起始位置和终止位置的XY信息,可以生成步长1的矩阵列表,输出的矩阵列表表示为array_x和array_y,另外通过index_x和index_y保留从0开始计数的矩阵位置信息。
MatrixArray

2.3 获取瓦片图

在获取整个影像或者局部影像的时候,我们首先是需要获取到起始和终止影像的信息,然后来构造区域内所有瓦片图的地址信息。我们在上一个步骤中获取到的矩阵数组,需要进一步构造出每个瓦片图的地址信息。这里我们使用AttributeCreater转换器,然后输入以下表达式:

$(Tile_URL)/tile/@Value(level_id)/@Value(array_x)/@Value(array_y)

在构造出每个瓦片图的地址信息后,使用ImageFetcher转换器来下载瓦片图。在Image URL参数中输入构造的瓦片图地址,在Image Type参数中输入要下载图片类别。图片类型需要根据影像服务对应的图片类型来设置,否则会下载不了,大部分是使用PNG格式,也存在PNG和JPG混合使用的模式,该模式需要分开下载。
ImagFetcher

2.4 瓦片图定位

下载好的每个瓦片图是没有空间信息的,需要我们通过需要来为每个瓦片图设置相对的空间位置。要为瓦片图设置空间位置,有2个转换器可以实现,分别是Offsetter和RasterGeoreferencer转换器。

  • Offsetter:设置空间偏移
  • RasterGeoreferencer:为栅格设置空间位置

两者设置的空间偏移量都是一致的:
Offsetter

2.5保存瓦片并镶嵌瓦片

保存瓦片直接添加写模块然后设置好变量文件名就可以了,瓦片镶嵌使用RasterMosaicker转换器,然后添加写模块保存到本地。这个步骤简单,就不多介绍了。

3 工程下载

FME工程下载地址:https://download.csdn.net/download/u013480096/12443463

4 总结

影像抓取也属于爬虫的一类,暴力的信息抓取会给服务器造成巨大的负担,影像或者座标信息的泄露也有可能会承担相应的责任,希望大家能够合理依法的利用技术,维护国家安全,拥有保密意识。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章