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 總結

影像抓取也屬於爬蟲的一類,暴力的信息抓取會給服務器造成巨大的負擔,影像或者座標信息的泄露也有可能會承擔相應的責任,希望大家能夠合理依法的利用技術,維護國家安全,擁有保密意識。

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