トップMy OpenStreetMap > 建物の描画

建物の描画

はじめに

建物の描画の描画は難しいものではない。 しかし、OSM地図の地物としては全体の過半数を占める。それゆえ、描画に要する時間が気にかかる。

プログラム

建物の描画プログラムを示す。建物は線路の上や高架の下にあったりする。 他の地物との上下関係をコントロールするのが layer である。詳細は、別のページとする。

public class RenderBuilding extends SuperRenderer {
    static Paint paintBuilding = getPaintFill(colorBuildingYes);
    static Paint paintRoof = getPaintFill(colorBuildingRoof);
    static Paint paintWater = getPaintFill(colorWater);

    void render(Canvas cv, TileToRender tile, OSM[] osms, int fromIndex, int toIndex, int layer) {
        for (int n = fromIndex; n < toIndex; n++) {
            OSM osm = osms[n];
            if (osm.type < 2 || (osm.tag_flags & bitBuilding) == 0 || osm.layer != layer) {
                continue;
            }
            Tag.Val building = osm.getVal(Tag.Key.building);

            if (building == Tag.Val.roof) {
                osm.fillPolygon(cv, tile, paintRoof);
            } else if (building != Tag.Val.no) {
                osm.fillPolygon(cv, tile, paintBuilding);
            }
        }

        for (int n = fromIndex; n < toIndex; n++) {
            OSM osm = osms[n];
            if (osm.type < 2 || (osm.tag_flags & bitLeisure) == 0) {
                continue;
            }

            if (osm.getVal(Tag.Key.leisure) == Tag.Val.swimming_pool && osm.layer == layer) {
                osm.fillPolygon(cv, tile, paintWater);
            }
        }
    }
}

この段階での画面当たりのレンダリング&描画時間を下に示す。

建物の描画は zoom 13、14以上である。この範囲の描画時間の増加は 10%程度である。

ズーム   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20   平均
郊 外 238 214 137 258 171 128  78 117  69  79  58  58  50  58  51  118ms
東 京 223 225 173 213 172  91  62 123 104  88  59  53  68  62  50  118ms