トップPC地図システム > マイOSM地図のレンダリングレイヤー

マイOSM地図のレンダリングレイヤー

はじめに

OSMデータを使ってのレンダリングが一括して行うのではなく、 陸地のレンダリング、森林・水域等のレンダリング、道路・鉄道のレンダリング、 といったようにいくつかに分けて行う。ここでは、それぞれをレイヤ―と呼ぶ。

OSMタグの一つに layer タグがあるが、これとは無関係である。

原理的にはレイヤ―別レンダリングをやめ、全てを一体化してレンダリングすることも 可能であるが、プログラムが巨大になり、開発やメンテナンスが難しくなる。

レイヤ―に分けた場合、レンダリングがレイヤ―順となるため、 それぞれのレンダリングをどのレイヤ―におくかが重要となる。 また、レイヤ―の並び(順番)が重要となる。

一般には、後からレンダリングするものは、前にレンダリングされているものが何かを認識せずに、 上書きするため、後にあるものの方が優先度が高いことになる。

しかし、シンボルマーク(アイコン)や名称は、後から、別のものが描画されて、 半分、見えなくなると、みっともない地図になる。 このため、このエリアにはこの後何も描いてはいけないようにできる仕組みを備えている。 この場合は、後からレンダリングするものが優先ではなく、先にレンダリングしたものが優先となる。

以上のような特質から、ここのレンダリングをどのレイヤ―のどの位置におくかについては、 変更が起きやすい。このため、メンテナンスしやすいプログラムにしておくことが重要である。

レイヤ―構造

現地図アプリGISのレイヤ―構造

現地図アプリGISのレイヤ―構造を以下に示す。

layerタグはレンダリングの順番を規定するものである。layerタグがなくても、トンネルは layer = -1、 橋、高架は layer = 1 とみなす。2層、3層の立体交差道路は layer = 2、layer = 3 とする。

現在の地図アプリでは Building と Roads だけ、この layer に沿ったレンダリングを行っている。 高架の下に建物があったり、線路の上に建物があったりするが、それが分かるようにレンダリングする。

まれに、ビルの屋上に人工の林(landuse=forest)や庭園(leisure=garden)があり、layer=1 タグがあったとしても 現在の地図アプリGISでは、lanuse=forest や leisure=garden は Lancoderレイヤ―で描画され、 後から建物がレンダリングされるため、建物の描画によって、林や庭園は消えてしまう。

屋上の林や庭園をレンダリングしたい場合には、そのレンダリングを layer の値で繰り返している Building、Road と同じ位置に置く必要がある。

単純に Landcover、Waterway 全体を layer = -5 ~ 5 についての繰り返しに含めてもよい。 全レコードに対して 11回同じ処理を繰り返しているのではなく、ループの前で、 layerの値で OSMレコード配列の並び替えを行っており、Buildingや Roadsをコールするのは1回だけである。 パフォーマンス上のロスは殆どない。

ただし、ポリゴンレコードについては、面積による並び替えも行っているため、 二つの並び替えを両立させる必要がある。

屋上の林や庭園は例外的で数少ないため、面積による並び替えまで考慮する必要はないので、 Landcover や Waterway はそのままで、landuse=forest、leisure=garden、waterway=stream(屋上の人工の小川) のレンダリングを重複して、Roads の次に置く方が無難であろう。実行は layer >= 1 に限定してよい。