おしらせ

MapProxy

2014年10月28日

MapProxyとは

MapProxyとは、地図配信用のプロキシサーバです。

OSGeoによる概要
MapProxy — OSGeo-Live 8.5-dev Documentation

MapProxy は、複数のソースからなる地図を予めレンダリングし、ローカルなキャッシュに格納することによってマッピングアプリケーションを高速化します。レイヤの透化、測地系の変更、複数のレイヤ統合、電子透かしの追加など、多くのことを可能にします。

TileCacheMapCacheと同じですが、ポリゴンでのアクセス制御も出来るようです。
なお、TileStacheはGeoJSONでも出力できます。

インストール

Pythonのパッケージで簡単にインストールできます。
CentOS6にて

$ sudo pip install PyYAML
$ sudo pip install Shapely
$ sudo yum install python-lxml
$ sudo pip install MapProxy

この他にGeosやProj.4なども必要ですが、すでに他のGISソフトを使っているのであっという間に終わりました。
次のようになれば成功。

$ mapproxy-util --version
MapProxy 1.7.1

試用

設定には、まず適当なディレクトリから次のコマンドを実行します。

$ mapproxy-util create -t base-config ./

すると次の4ファイルが作成されます。
 mapproxy.yaml ・・・ サンプル。OSMの地図をWMSで参照します。
 full_example.yaml ・・・ 例や説明がたくさん入ったサンプル。これを参考に設定ファイルを書いていく。 
 seed.yaml ・・・ seed(予めタイルデータを作っておく)する時のサンプル。
 full_seed_example.yaml ・・・同じくseedの例や説明。

サーバを起動するにはこう。

mapproxy-util serve-develop ./mapproxy.yaml -b 192.168.0.23:8082 

デフォルトではポート8080を使うのでオプションで違うポートを指定します。
IPアドレスは接続を受け付けるときのアドレス。127.0.0.1で自分自身からのみ、0.0.0.0だと制限しません。

デモページが用意されているので動作を確認できます。

http://192.168.0.23:8082/demo/

他の設定

他のTMSサーバやWMSサーバを組み込もうとしていますが、グリッドやズームレベルの様子が変なので保留。
理由は分かりませんが、MapProxyのTMSはズームレベル0で2x2となっていました。
地理院地図などはレベル0で1x1(全体で一枚)。

設定の min_res で調整するようですが同じようには出来ていません。 demoページのOpenLayersのソースを見ると maxResolution: 78271.516964, とあるのでクライアント側で調整が必要かも。

以下がWMSとTMSをソースにする設定。

layers:
  - name: drm2603
    # MapCache's TMS
    title: drm2603
    sources: [drm2603_cache]
  - name: drm2603wms
    # MapServer WMS
    title: drm2603
    sources: [drm2603wms_cache]

caches:
  drm2603_cache:
    grids: [g20_grid_b]
    sources: [drm2603_tile]
  drm2603wms_cache:
    grids: [g20_grid_a]
    sources: [drm2603_wms]

sources:
  drm2603_tile:
    type: tile
    grid: g20_grid_b
    url: http://spatialsv03/drmmap/tms/1.0.0/drm2603@g20/%(z)s/%(x)s/%(y)s.png
  drm2603_wms:
    type: wms
    supported_srs: ['EPSG:3857', 'EPSG:900913', 'EPSG:4326', 'EPSG:4612']
    supported_formats: ['image/tiff', 'image/jpeg', 'image/png']
    http:
      # defines how long MapProxy should wait for data from source servers
      client_timeout: 60 # seconds
      # add additional HTTP headers to all requests to your sources.
      headers:
        my-header: value
    req:
      url: http://localhost/cgi-bin/mapserv?
      layers: drm2603
      transparent: true
      # additional options passed to the WMS source
      map: /home/demo/webviewer.map


grids:
  webmercator:
     base: GLOBAL_WEBMERCATOR
  osm_grid:
    base: GLOBAL_MERCATOR
    srs: 'EPSG:3857'
    origin: nw
  g20_grid_b:
    base: GLOBAL_MERCATOR
    origin: sw
    # default tile size is 256 x 256 pixel
    tile_size: [256, 256]
    srs: 'EPSG:3857'
    align_resolutions_with: GLOBAL_MERCATOR
    # resolution of level 0
    min_res: 156543.0339280410
    num_levels: 21

OpenLayersに組み込む時は、Layerのオプションに zoomOffset:-1 を付けると地理院地図などと重ねて表示できます。

		var layerMapProxy = new OpenLayers.Layer.TMS(
			"MapProxy",
			"http://spatialsv02:8082/tms/",
			{
				layername: "drm2603/g20_grid_b"
				,type: "png"
				,isBaseLayer: false
				,visibility: false
				,opacity: 0.5
				,version:""
				,zoomOffset:-1
			}
		);
		map.addLayer(layerMapProxy)