PostGIS + Mapnik + FreeBSD上のTileCache

こんにちは ネットワーク内のサーバーの1つで「openstreetmap.orgのようなもの」を実行する必要がありましたが、インターネット接続がなくてもこれらすべてが機能し続けるようになりました。

残念ながら、これを実装する方法について「Great and Mighty」に関する優れたマニュアルを見つけられなかったため、2日間を費やした後、どうやってそれを成し遂げたかについて話すことにしました。



与えられたもの:




一般に、必要なものを実装する方法には多くのオプションがありますが、私はこのツールのセットについて詳しく調べることにしました。





設置


1. PostGISを配置する

これで問題はありませんでした、それはポートにあります、すなわち/usr/ports/databases/postgis





インストール後、/ usr / local / share / postgis / contrib / postgis-1.5フォルダーに移動し、psqlユーティリティを使用してpostgis.sqlおよびspatial_ref_sys.sqlを実行します

2. Mapnikを入れる

それ自体もポートにあります: /usr/ports/graphics/mapnik





インストール後、ここで必要なユーティリティをダウンロードする必要があります。

svn.openstreetmap.org/applications/rendering/mapnik (必要なものについては以下で説明します)。

3. TileCacheを配置します

TileCacheを使用すると、さらに簡単になります。アーカイブをtilecache.org/tilecache-2.11.tar.gzからダウンロードしてください

カスタマイズ


当然、チューニングはインストールよりもはるかに楽しいです!

最初に、写真でどのように機能するかを説明します。

画像



だから。 まず、osmファイルを取得する必要があります。 これには多くのオプションがあります。たとえば、 openstreetmap.orgから直接エクスポートする(ただし、領域のサイズには制限があります)または

既製のエクスポートをダウンロードします。例: gis-lab.info/projects/osm_dump

次のようなコマンドを使用して、このファイルをPostGISデータベースにロードする必要があります。

osm2pgsql -U user RU-SPE.osm





ここで、userはデータベースへのログイン、RU-SPE.osmはダウンロードするマップです。 私の場合、これはサンクトペテルブルクの地図です。

コンソール出力は次のようになります。



osm2pgsql SVN version 0.80.0 (32bit id space)



Using projection SRS 900913 (Spherical Mercator)

Setting up table: planet_osm_point

Setting up table: planet_osm_line

Setting up table: planet_osm_polygon

Setting up table: planet_osm_roads

Mid: Ram, scale=100



Reading in file: RU-SPE.osm

Processing: Node(1767k 176.7k/s) Way(264k 18.88k/s) Relation(7314 1828.50/s) parse time: 28s



Node stats: total(1767355), max(1633105798) in 10s

Way stats: total(264350), max(150391691) in 14s

Relation stats: total(7314), max(2024096) in 4s



Writing way (264k)



Writing relation (7314)

Committing transaction for planet_osm_point

Sorting data and creating indexes for planet_osm_point

Committing transaction for planet_osm_roads

Sorting data and creating indexes for planet_osm_roads

Committing transaction for planet_osm_line

Sorting data and creating indexes for planet_osm_line

Committing transaction for planet_osm_polygon

Sorting data and creating indexes for planet_osm_polygon

Indexes on planet_osm_roads created in 0s

Completed planet_osm_roads

Indexes on planet_osm_point created in 3s

Completed planet_osm_point

Indexes on planet_osm_line created in 4s

Completed planet_osm_line

Indexes on planet_osm_polygon created in 6s

Completed planet_osm_polygon



Osm2pgsql took 48s overall








エラーがなければ、次に進みましょう。



今、私たちは全世界の境界線と海岸線が必要です-これが私たちの地図の裏付けになります。 これを行わない場合、素材は単純になります。

すべてを1か所に整理して保持するには、ホームディレクトリに/ mapnik /フォルダーを作成します。

次に、そこに移動してこれらの境界をロードします。そのために、次のコマンドを使用します。



wget tile.openstreetmap.org/world_boundaries-spherical.tgz

tar xvzf world_boundaries-spherical.tgz

wget tile.openstreetmap.org/processed_p.tar.bz2

tar xvjf processed_p.tar.bz2 -C world_boundaries

wget tile.openstreetmap.org/shoreline_300.tar.bz2

tar xjf shoreline_300.tar.bz2 -C world_boundaries

wget www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/110m-admin-0-boundary-lines.zip

unzip 110m-admin-0-boundary-lines.zip -d world_boundaries

wget www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-populated-places.zip

unzip 10m-populated-places.zip -d world_boundaries








上記で、 svn.openstreetmap.org / applications / rendering / mapnikのどのユーティリティが必要かを伝えると約束しました。

したがって、次のものが必要になります。

generate_xml.py(ほとんどの場合、ファイルを編集し、インポートmapnikをmapnikとしてimport mapnik2に置き換える必要があります)

osm.xml

およびフォルダ

株式会社/

記号/



osm.xmlファイルを更新するためのスクリプトも必要になる場合があります。ここから入手できます: github.com/mapnik/mapnik/tree/master/utils/upgrade_map_xml

そして、osm.xmlをダウンロードできます。これは、ここから既に修正済みです: pastebin.com/bMsXytcc

次に、map.xmlを生成します。このために起動します。



./generate_xml.py osm.xml --host localhost --user user --dbname gis --symbols symbols/ --world_boundaries world_boundaries/ --port 5432 --epsg='900913' --accept-none > map.xml





--accept-noneは、渡されていないパラメーターを空として受け入れることを意味します。



かなり大きなmap.xmlファイルを取得する必要があります



ほぼすべて、TileCacheのみを構成するために残ります。



ダウンロードしたアーカイブを/usr/local/www/data/tilecache



ます。 ここでは、2つのファイルのみを構成する必要があります:tilecache.cfgとindex.html。

最初に、データを取得する場所をTileCacheに説明する必要があります(また、作成したmap.xmlから取得する必要があります)。

これを行うには、同じ行を追加します:

[osm-map]

type=MapnikLayer

mapfile=/usr/home/user/mapnik/map.xml

spherical_mercator=true

bbox=-20037508.34,-20037508.34,20037508.34,20037508.34

resolutions=2445.984375,1222.9921875,611.49609375,305.748046875,152.8740234375,76.43701171875,38.218505859375,19.1092529296875,9.55462646484375,4.777314,2.388657,1.1943285,0.59716427,0.298582

metaTile=true

metaSize=8,8

metaBuffer=40

levels=12

extent_type=loose








ここに重要なパラメーター:

mapfile=/usr/home/user/mapnik/map.xml



データファイルへのパス

bbox=-20037508.34,-20037508.34,20037508.34,20037508.34



境界。 これらは全世界の境界線です。詳細については、 docs.openlayers.org / library / spherical_mercator.htmlを参照してください。

解像度= ...これが最も興味深いです。 これらの数値はさまざまなズームレベルの解像度であり、それらで除算すると、数値20037508.34 * 2/256で2の累乗が得られます。 この数値は、世界の「正方形」の側面を1つのタイル(小さな正方形)の側面で割ったもので、デフォルトでは256ピクセルです。



他のすべてのレイヤーは、コメントアウトすることをお勧めします。



それではindex.htmlに進みましょう。

その中で、たとえば次のようにinit()関数を設定する必要があります。



function init(){



map = new OpenLayers.Map("map", {

maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),

numZoomLevels:14,

maxResolution:156543.03125/64,

units:'m',

projection: "EPSG:900913",

displayProjection: new OpenLayers.Projection("EPSG:4326")

});



layer = new OpenLayers.Layer.WMS( "OSM",

"tilecache.cgi?", {layers: 'osm-map', format: 'image/png'} );

map.addLayer(layer);

map.addControl(new OpenLayers.Control.Permalink());

map.addControl(new OpenLayers.Control.PanZoomBar());

map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));

map.addControl(new OpenLayers.Control.Permalink());

map.addControl(new OpenLayers.Control.Permalink('permalink'));

map.addControl(new OpenLayers.Control.MousePosition());

map.addControl(new OpenLayers.Control.OverviewMap());

map.addControl(new OpenLayers.Control.KeyboardDefaults());



if (!map.getCenter()) {

var proj = new OpenLayers.Projection("EPSG:4326");

var point = new OpenLayers.LonLat(30, 60);

map.setCenter(point.transform(proj, map.getProjectionObject()),4);

}

}








以下のパラメーターに注意する必要があります。

maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)



境界はmaxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)



とまったく同じである必要がmaxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)



ます。

maxResolution:156543.03125/64



は2445.984375、つまり 最大解像度。

map.setCenter(point.transform(proj, map.getProjectionObject()),4);



サンクトペテルブルクの全体図が見えるように、地図の中心と初期ズームを設定します。

浅いタッチ:Apacheがtilecache.cgiを実行できるようにします:

<Directory "/usr/local/www/data/tilecache">

AllowOverride None

Options None

Order allow,deny

Allow from all







そして、 chmod 755 tilecache.cgi









確認する


確認するには、ブラウザでtilecacheフォルダーを開くだけで、すべてうまくいった場合は、そのようなマップを参照してください(レニングラード地域はまだ読み込まれています):

画像



合計


結果は、PostGISデータベースからデータを読み取り、インターネットに接続せずにタイルに変換できるサーバーになります。

何かおかしくなったら質問に答えようとします。




All Articles