レンダリングの中心となるタグは一つのオブジェクト(レコード)では原則として一つでなければならない。 しかし、例えば、amenity=school(エリア型タグ) と barrier=fence(ライン型タグ) のように、エリア型タグ とライン型タグが共存することがある。barrierタグは方向性のない描画が行われるため問題はない。
問題が起きるのは、エリア型タグと natural=cliff や man_made=embankment など方向性タグの共存である。 エリア型タグはポリゴンの内側に対して塗りつぶし描画を行うために line の方向を合わせる。 これが natural=cliff や man_made=embankment の方向と合わないことがある。 このような場合、一つのオブジェクトとはできず、エリア型タグを持つオブジェクトとライン型タグを持つオブジェクト を分ける必要がある。
マッパーとしてはラインの方向はライン型タグで決める。エリア型タグとしての方向はプログラムで決定できる。 したがって、両者の方向が一致するときは、一つのレコードにエリア型タグとライン型タグを含めることができる。
両者の方向が相反するときどうするか? レコードに reversedフラグを設け、 エリア型タグの都合で、ノードの並びを反転させたとき、reversedフラグを オンとしておく。
この reversedタグはエリア型タグの有無に拘わらず、閉ループであれば機械的に ポリゴン(type=2) とみなして 必要に応じてノードの並びを反転させ、そのとき、reversedフラグをオンにする。
natural=water はエリア型であるが、natural=cliff はライン型である。 道路(highway)は一般にライン型であるが、highway=service、highway=pedestrian(歩行者天国)に限り、 ライン型とエリア型が採れる。 このように、ライン型かエリア型かの判断は状況に依存するため、レコード自体には reversedフラグだけを含め、 状況に応じたレンダリングは地図描画アプリで行うこととする。
マルチポリゴン(type=3)の場合、inner polygon で反転が起きたかどうかを記憶していないが、タグがある場合には、 それぞれの innerポリゴンは、別途、polygonレコード(type=2)が存在し、そこでは reversedフラグが存在して、 正しくレンダリングできる。
現在のOSMバイナリレコードファイル形式を下に示す。 type(4バイト)の上位4ビットが本来のtype(0: point、1: line, 2: polygon, 3: multipolygon)であり、 下位 28ビットは rec_id である。rec_id は通し番号で、デバッグに使う可能性があって、追加したものである。 しかし、今のところ使用していない。
通常は osm_id でレコードを追加できる。relationオブジェクトは複数レコードに分かれることがあるため、 osm_id単独ではレコードを正確には識別できない。このため、独自の rec_id をレコードに付加した。 しかし、osm_id と length(レコード長)を組み合わせれば、ほぼ確実にレコードを識別できる。 また、レコード全体をバイナリで比較すれば完璧である。
以上のことから、rec_id は必ずしもいらないし、現在は使っていない。 また、rec_id は当面、28ビット程度必要であり、24ビットでは不足する。 もし、rec_id をレコードに含める場合、osm_id のように独立項目とすべきであり、head に含めるのは好ましくない。
よって、type項目に rec_id を含めるのはやめる。type項目の上位4ビットは 本来のtype(0: point、1: line, 2: polygon, 3: multipolygon, 4~7: 空き)とする。残りの下位 28ビットは フラグ等のエリアとして、当面、最下位ビットを reversed フラグとする。
length, head, osm_id, uid, time, lon, lat, {key, val}* ----- Node
length, head, osm_id, uid, time, bbox, num_nds, {lon, lat}*, {key, val}* ----- Way
length, head, osm_id, uid, time, bbox, num_members, {type, ref, role}*, {key, val}* ----- Relation
bbox: minlon, minlat, maxlon, maxlat
町田市の芹が谷公園の東南に位置する 高ケ坂石器時代遺跡近くの台地ウェイ osm_id = 925098042 は natural=cliff である。
OSMオブジェクトは反時計回りの閉ループである。 Parser.java では、時計回りに並べ替え、reversedフラグをオンにしている。