5202


以下のツールを利用して、 OpenStreetMap の地図を表示しようとしています。

  * postgresql --with-protobuf-c
  * postgis
  * mapnik --with-postgres
  * osm2pgsql

`brew` コマンドでそれぞれインストールを行い、
シンプルな世界地図は表示されるようになりました。([world_map_and_styles.py](http://mapnik-
utils.googlecode.com/svn/example_code/hello_world/pure_python/world_map_and_styles.py))

目的としては、日本周辺の地図を表示したいため、[日本周辺の地図データ](http://download.geofabrik.de/asia/japan.html)をダウンロードし、以下のコマンドを利用し、
DB を作成しました。

[code]

    osm2pgsql -d gis japan-latest.osm.pbf --style openstreetmap-carto.style
    
[/code]

(実際は、上記コマンドの前に、`osm2pgsql -d gis japan-latest.osm.pbf` のみを実行済みでした。)

その後、サンプルを改造した以下のコード(Python)を実行しているのですが、画像全体に、海部分のみが表示され、地形部分が全く表示されません。

ぜひ、解決のためのご助言を頂きたいです。  
よろしくお願いします。

[code]

    #!/usr/bin/env python
    
    from mapnik import *
    import mapnik
    import math
    
    
    m = Map(600,300,'+proj=latlong +datum=WGS84')
    m.background = Color('steelblue')
    m.zoom_to_box( mapnik.Envelope(128.0,26.0,136.0,48.0) );
    m.aspect_fix_mode = aspect_fix_mode.ADJUST_BBOX_HEIGHT
    
    
    poly = PolygonSymbolizer(Color('lavender'))
    line = LineSymbolizer(Color('slategray'),.3)
    s,r = Style(),Rule()
    r.symbols.extend([poly,line])
    s.rules.append(r)
    m.append_style('My Style',s)
    
    # Layer
    lyr = Layer('Geometry from PostGIS')
    db_params = dict(
        #host='',
        #user='',
        #password ='',
        dbname='gis',
        table='planet_osm_polygon'
    )
    lyr.datasource = PostGIS(**db_params)
    
    lyr.srs = '+proj=latlong +datum=WGS84'
    lyr.styles.append('My Style')
    m.layers.append(lyr)
    
    render_to_file(m, 'map/hello_world_in_pure_python.png')
    
[/code]


CC BY-SA 3.0
2015-01-23T01:51:27.863
5117
2015-01-24T10:20:17.283
2015-01-24T10:12:21.763
30
3766
question
python postgresql openstreetmap mapnik
OpenStreetMapのマップを、mapnik + python + postgis で表示しようとしているが表示されない


DBの空間参照系と一致させるため、レイヤーに指定する`srs` (spatial reference system)
をosm2pgsqlがデフォルトで使う空間参照系にする必要があります:

[code]

    merc = mapnik.Projection('+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m  +nadgrids=@null +no_defs +over')
    lyr.srs = merc.params()
    
[/code]

関連ドキュメント: ["Getting Started in Python - Creating a
Layer"](https://github.com/mapnik/mapnik/wiki/GettingStartedInPython#create-a-
layer)

出力結果:

![レンダリング結果](https://i.stack.imgur.com/TWeZIm.png)

なお、`Map`に設定する`srs`は、レンダリング時に利用する空間参照系になります。

osm2pgsqlがデフォルトで使う空間参照系は、ヘルプで調べることができ、

[code]

    $ osm2pgsql --help  | grep default
       ...
       -m|--merc        Store data in proper spherical mercator (default).
    
[/code]

[manページ](https://github.com/openstreetmap/osm2pgsql/blob/master/docs/osm2pgsql.1#L251)に必要なパラメータの詳細が書かれています。

[code]

    Spherical Mercator  (\-m) SRS:900913 +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over
    
[/code]

また、DBがどの空間参照系を直接調べることもできます:

[code]

    $ psql gis
    gis=# select Find_SRID('', 'planet_osm_polygon', 'way');
     find_srid
    -----------
        900913
    
[/code]

SRIDが分かったら、それをキーにして`Projection`に渡すための[PROJ.4](http://trac.osgeo.org/proj/)形式のパラメータを調べます:

[code]

    gis=# \x
    gis=# select auth_name, proj4text from spatial_ref_sys where srid=900913;
    -[ RECORD 1 ]---------------------------------------------------------------------------------------------------------------
    auth_name | spatialreferencing.org
    proj4text | +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs
    
[/code]

SRIDは空間参照系に割り振られているIDのことで、これを指定することで`Projection`に渡すパラメータを省略することもできます:

[code]

    # /usr/local/share/proj/ にある定義ファイルが参照されます。
    # 今回はgrepしてどのファイルに定義されているか探しました。
    merc = mapnik.Projection('+init=other.extra:900913')
    
[/code]


CC BY-SA 3.0
2015-01-24T10:09:50.520
5202
2015-01-24T10:20:17.283
2020-06-17T08:14:45.997
-1
30
5117
answer