🗺️

PostGISを使ってWMSサービスを構築する

2023/03/09に公開

前回、MapserverでWMSサービスを構築した。
ただし1つのgeotiffファイルのみを用いているため、WMSの1レイヤー=1geotiffファイルとなってしまい、geotiffのファイル数分のレイヤーが必要になってしまい、実際のサービスとしては利用しづらい。

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

(前回)
https://zenn.dev/dokushu_eo/articles/252b826886b055

そこでデータベース(PostGIS)を利用して、要求された緯度経度に応じたgeotiffファイルを応答するWMSサービスを構築する。

RASTERデータ(geotiffファイル)をpostgisで提供する場合、geotiffファイルをPostgis内に保存するか、ファイルパスのみ保存し外部に(ファイルシステム上に)保存するかがあるため注意が必要。

今回は、テーブル内にgeotiffファイルを保存しない方法にする。
この時の注意は前回の記事のテーブルの作成の項を参照

テーブルにrasterデータを入れない場合、locationのカラムを作成すること。

また、raster2pgsqlコマンドについてもデータの投入の項の例の通り、「-R」オプションをつけることを忘れないように。

(raster2pgsqlの使い方)
http://cse.naro.affrc.go.jp/yellow/pgisman/2.2.0/using_raster_dataman.html

postgis

テーブルの作成

# psql -U gis -h localhost -d mapserv -W
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;
CREATE TABLE wmap (id bigserial primary key, rast raster, geom GEOMETRY (POLYGON , 4326), filename text, timestamp timestamp without time zone, location varchar);

Mapファイルの作成

DATAにPG(PostGISラスタドライバ)を付けた、postgisへの要求を記載する。
また、Mapserverのドキュメントにもあるように、タイル化されている場合は、mode=2をpostgisへの要求につけること。

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 "PG:host=localhost dbname=gis user=gis password=gis table=wmap mode=2"
    METADATA
      "wms_enable_request" "!*"
    END
    PROCESSING "BANDS=1"
    PROCESSING "NODATA=65535"
    PROCESSING "SCALE=AUTO"
    PROJECTION
      "init=epsg:4326"
    END
    METADATA
      "wms_title" "wms_title"
      "wms_getmap_formatlist" "image/png"
    END
  END
END

Discussion