🗺️

MapserverでWMSサービスを構築する

2023/02/27に公開

前回、Mapserver環境を構築したので、今回は続きでWMSサービスの提供までを記載する。

(前回)
https://zenn.dev/dokushu_eo/articles/66d050a202e5d4

前提条件

Webで公開されているデータをそのまま利用してWMSサービスを提供する。
具体的にはダウンロードしたりせず、fuse(及びその派生)を利用してマウントして利用する。

s3ストレージのマウント

おそらくs3で提供されているならgoofysの一択。

https://github.com/kahing/goofys

ただ、今回はURLでのみ公開している場合もあるため、汎用性からhttp2fsを利用。

http2fsのインストール

# apt-get install -y httpfs2
使い方
# httpfs2 ${http_file} ${mountdir} -o allow_other -o default_permissions -o ro

具体例

# httpfs2 https://s3.ap-northeast-1.wasabisys.com/je-pds/cog/v1/JAXA.G-Portal_GCOM-C.SGLI_standard.L3-AROT.daytime.v3_global_daily/2018-01/01/0/E000.00-E180.00/E000.00-S90.00-E180.00-N90.00-AROT.tiff /mnt/je-pds/cog/v1/JAXA.G-Portal_GCOM-C.SGLI_standard.L3-AROT.daytime.v3_global_daily/2018-01/01/0/E000.00-E180.00/ -o allow_other -o default_permissions -o ro
# ls /mnt/je-pds/cog/v1/JAXA.G-Portal_GCOM-C.SGLI_standard.L3-AROT.daytime.v3_global_daily/2018-01/01/0/E000.00-E180.00/
E000.00-S90.00-E180.00-N90.00-AROT.tiff

mapserverの設定

postgisの設定

テーブルの作成

ポイントは2つ

  1. postgis extensionとpostgis_raster extensionを適用すること。
  2. テーブルにrasterデータを入れない場合、locationのカラムを作成すること。
# psql -U gis -h localhost -d mapserv -W
mapserv=# CREATE EXTENSION postgis;
mapserv=# CREATE EXTENSION postgis_raster;
mapserv=# CREATE TABLE wmap (id bigserial primary key, rast raster, geom GEOMETRY (POLYGON , 4326), filename text, location varchar);

データの投入

raster2pgsqlコマンドを利用して、http2fsでマウントしたrasterデータ(Geotiffファイル)をpostgisに投入する。

raster2pgsql -a -F -R -s 4326 /mnt/je-pds/cog/v1/JAXA.G-Portal_GCOM-C.SGLI_standard.L3-AROT.daytime.v3_global_daily/2018-01/01/0/E000.00-E180.00/E000.00-S90.00-E180.00-N90.00-AROT.tiff wmap > E000.00-S90.00-E180.00-N90.00-AROT.sql
psql -U gis -d mapserv -h localhost -f E000.00-S90.00-E180.00-N90.00-AROT.sql

mapファイルの作成

MAP
  NAME "mapserver_wms"
  IMAGETYPE png
  EXTENT -180 -90 180 90 # <Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>
  SIZE 800 800
  PROJECTION
    "init=epsg:4326"
  END
  OUTPUTFORMAT
    NAME png
    DRIVER 'GD/PNG'
    MIMETYPE 'image/png'
    IMAGEMODE RGBA
    EXTENSION 'png'
    TRANSPARENT ON
  END
  OUTPUTFORMAT
    NAME GTiff
    DRIVER "GDAL/GTiff"
    MIMETYPE "image/tiff"
    IMAGEMODE INT16
    EXTENSION "tif"
    TRANSPARENT ON
  END
  WEB
    IMAGEPATH "/var/www/html/ms/"
    IMAGEURL "http://192.168.xx.xx/ms/"
    TEMPLATE "/var/www/html/wms_template.html"
    METADATA
      "wms_title" "wms_server"
      "wms_abstract" "abstract"
      "wms_srs" "EPSG:4326"
      "wms_enable_request" "*"
      "wms_getmap_formatlist" "image/png,image/tiff"
    END
  END
  
  LAYER
    NAME "png"
    OFFSITE 255 255 255
    STATUS ON
    TYPE RASTER
    DATA "/mnt/je-pds/cog/v1/JAXA.G-Portal_GCOM-C.SGLI_standard.L3-AROT.daytime.v3_global_daily/2018-01/01/0/E000.00-E180.00/E000.00-S90.00-E180.00-N90.00-AROT.tiff"
    PROCESSING "BANDS=1"
    PROCESSING "NODATA=65535"
    PROCESSING "SCALE=AUTO"
    PROJECTION
      "init=epsg:4326"
    END
    METADATA
      "wms_title" "wms_titleg"
      "wms_getmap_formatlist" "image/png"
    END
  END
END

templateの作成

ブラウザで動作確認をするにはTEMPLATEの設定が必要な様なので簡易的なWMSを表示するHTML(TEMPLATE)を作成・保存する。

<!-- MapServer Template -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/transitional.dtd">
<html>
  <head>
    <title>MapServer Template Sample</title>
  </head>
  <body>
    MapServer Template Sample<br>
  <img src="[img]">
  </body>
</html>

動作確認

コマンドベースでの動作確認

mapservコマンドに-nhオプションをつけて、CUIベースで動作確認ができる。
ただし、PNG等のバイナリを応答するのでコンソールが文字化けるので注意。

% mapserv -nh "QUERY_STRING=map=/var/www/html/wms.map"

https://manpages.ubuntu.com/manpages/xenial/man1/mapserv.1.html

ブラウザでの動作確認

ブラウザにMapファイルを引数としたmapservを指定して、実行

http://192.168.xx.xx/cgi-bin/mapserv?map=/var/www/html/wms.map

もしうまく動作しない場合などは、DEBUGファイルには出力されないようなので、apache2のアクセスログを見る、GetCapabilitiesを確認するなどをしてみる。

http://192.168.xx.xx/cgi-bin/mapserv?map=/var/www/html/wms.map&SERVICE=WMS&REQUEST=GetCapabilities

WMSクライアント(QGIS)での動作確認

WMSクライアントにWMSサービスのエンドポイントを指定する。
WMSサービスのエンドポイントはブラウザでの動作確認で入力したURLになる。

http://192.168.xx.xx/cgi-bin/mapserv?map=/var/www/html/wms.map

Discussion