From d3c31199f14a4b5b0732742f215d68282a2076a3 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Wed, 3 Apr 2013 14:35:24 +0200 Subject: [PATCH] adapt building height to ground resolution --- src/org/oscim/generator/TileGenerator.java | 14 +++++++++++--- .../oscim/renderer/layer/ExtrusionLayer.java | 17 ++++++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/org/oscim/generator/TileGenerator.java b/src/org/oscim/generator/TileGenerator.java index 2129f969..74e58623 100644 --- a/src/org/oscim/generator/TileGenerator.java +++ b/src/org/oscim/generator/TileGenerator.java @@ -106,6 +106,7 @@ public class TileGenerator implements IRenderCallback, IMapDatabaseCallback { private float mStrokeScale = 1.0f; private float mLatScaleFactor; + private float mGroundResolution; // replacement for variable value tags that should not be matched by RenderTheme private final static Tag mTagEmptyName = new Tag(Tag.TAG_KEY_NAME, null, false); @@ -150,8 +151,15 @@ public class TileGenerator implements IRenderCallback, IMapDatabaseCallback { setScaleStrokeWidth(mTile.zoomLevel); // account for area changes with latitude - mLatScaleFactor = 0.5f + 0.5f * ((float) Math.sin(Math.abs(MercatorProjection - .pixelYToLatitude(mTile.pixelY, mTile.zoomLevel)) * (Math.PI / 180))); + double latitude = MercatorProjection.pixelYToLatitude(mTile.pixelY + (Tile.TILE_SIZE >> 1), + mTile.zoomLevel); + mLatScaleFactor = 0.5f + 0.5f * ((float) Math.sin(Math.abs(latitude) * (Math.PI / 180))); + + mGroundResolution = (float) (Math.cos(latitude * (Math.PI / 180)) + * MercatorProjection.EARTH_CIRCUMFERENCE + / ((long) Tile.TILE_SIZE << mTile.zoomLevel)); + + Log.d(TAG, mTile + " " + mGroundResolution); mTile.layers = new Layers(); @@ -409,7 +417,7 @@ public class TileGenerator implements IRenderCallback, IMapDatabaseCallback { if (mRenderBuildingModel) { //Log.d(TAG, "add buildings: " + mTile + " " + mPriority); if (mTile.layers.extrusionLayers == null) - mTile.layers.extrusionLayers = new ExtrusionLayer(0); + mTile.layers.extrusionLayers = new ExtrusionLayer(0, mGroundResolution); ((ExtrusionLayer) mTile.layers.extrusionLayers).addBuildings(mWay); diff --git a/src/org/oscim/renderer/layer/ExtrusionLayer.java b/src/org/oscim/renderer/layer/ExtrusionLayer.java index 91e8a7a1..e1670d7c 100644 --- a/src/org/oscim/renderer/layer/ExtrusionLayer.java +++ b/src/org/oscim/renderer/layer/ExtrusionLayer.java @@ -58,11 +58,13 @@ public class ExtrusionLayer extends Layer { private final static int IND_OUTLINE = 3; public boolean compiled = false; + private final float mGroundResolution; - public ExtrusionLayer(int level) { + public ExtrusionLayer(int level, float groundResolution) { this.type = Layer.EXTRUSION; this.level = level; + mGroundResolution = groundResolution; mVertices = mCurVertices = VertexPool.get(); mIndices = new VertexPoolItem[4]; @@ -89,11 +91,20 @@ public class ExtrusionLayer extends Layer { if (height == 0) height = 12 * 100; - // 5 cm steps - float sfactor = (400f / Tile.TILE_SIZE) / 5f; + // 10 cm steps + float sfactor = 1 / 10f; height *= sfactor; minHeight *= sfactor; + // match height with ground resultion + // (meter per pixel) + height /= mGroundResolution; + minHeight /= mGroundResolution; + + // my preference + height *= 0.85; + minHeight *= 0.85; + int length = 0; for (int ipos = 0, ppos = 0, n = way.geom.index.length; ipos < n; ipos++, ppos += length) { length = way.geom.index[ipos];