【问题标题】:Strange behaviour with Osmdroid overlay at high zoom levelsOsmdroid 覆盖在高缩放级别的奇怪行为
【发布时间】:2011-11-13 22:48:05
【问题描述】:

我在我的应用程序中使用 osmdroid 3.0.5 jar 来显示地图视图。我正在叠加一个由水平线和垂直线组成的叠加层。我注意到,仅在某些位置,在高缩放级别下,某些线条会消失,然后在拖动地图时重新出现。

我制作了一个最小的示例应用程序,该应用程序演示了在真实设备和模拟器(Gingerbread 2.3.3)上都出现的问题。

完整的代码如下所示 - ('transform' 方法在实际应用中是必需的,尽管它们似乎不在这个最小示例中):

public class DemoMap extends Activity implements MapViewConstants {

    private MapView mapView;
    private MapController mapController;
    private MapOverlay mmapOverlay = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.copymain);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setTileSource(TileSourceFactory.MAPNIK);
        mapView.setBuiltInZoomControls(true);
        mapView.setMultiTouchControls(true);
        mapController = mapView.getController();
        mapController.setZoom(17);
        // Only shows the bug at ceratin lat/lon positions, this is one
        GeoPoint point2 = new GeoPoint(39191699, -120102561);
        mapController.setCenter(point2);
        mmapOverlay = new MapOverlay(this);
        List<Overlay> listOfOverlays = mapView.getOverlays();
        listOfOverlays.add(mmapOverlay);
        mapView.invalidate();
    }

    public class MapOverlay extends org.osmdroid.views.overlay.Overlay {

        public MapOverlay(Context ctx) {super(ctx); }

        private int mVpl;// viewport left, top, right, bottom
        private int mVpt;
        private int mVpr;
        private int mVpb;
        private MapView mMv = null;

        // Two routines to transform and scale between viewport and mapview
        private float transformX(float in, MapView mv) {
            float out;
            out = ((mVpr - mVpl) * in) / (mv.getRight() - mv.getLeft())
                    + mVpl;
            return out;
        }

        private float transformY(float in, MapView mv) {
            float out;
            out = ((mVpb - mVpt) * in) / (mv.getBottom() - mv.getTop())
                    + mVpt;
            return out;
        }

        @Override
        protected void draw(Canvas pC, MapView mapV, boolean shadow) {
            if (shadow)
                return;

            Paint paint;
            paint = new Paint();
            paint.setColor(Color.RED);
            paint.setAntiAlias(true);
            paint.setStyle(Style.STROKE);
            paint.setStrokeWidth(1);
            paint.setTextAlign(Paint.Align.LEFT);
            paint.setTextSize(12);
            final Rect viewportRect = new Rect();
            final Projection projection = mapV.getProjection();
            viewportRect.set(projection.getScreenRect());
            mVpl = viewportRect.left;
            mVpt = viewportRect.top;
            mVpr = viewportRect.right;
            mVpb = viewportRect.bottom;
            // draw two lines to split screen into 2x2 quarters
            // drag the map left and right and the vertical line disappears,
            // then reappears! It's OK at one less zoom level
            pC.drawLine(transformX(mapV.getWidth()/2, mapV), transformY(0, mapV),
                    transformX(mapV.getWidth()/2, mapV),
                    transformY(mapV.getHeight(), mapV), paint);

            pC.drawLine(transformX(0, mapV), transformY(mapV.getHeight()/2, mapV),
                    transformX(mapV.getWidth(), mapV),
                    transformY(mapV.getHeight()/2, mapV), paint);
        }
    }
}

有趣的是,在我的真实应用程序中,如果我对屏幕外位图进行绘制,然后在 Overlay 绘制结束时一次性绘制,线条不会消失就可以了。

任何帮助将不胜感激。

【问题讨论】:

    标签: android osmdroid


    【解决方案1】:

    我知道这是一个老问题,但我相信您遇到的是Issue 221。这已在 3.0.9 版本中修复。

    另见:OSMDroid PathOverlay drawing is corrupted at high zoom levels

    【讨论】:

    • 感谢您的更新。我很想尝试新的 jar,但我不知道如何让 javadocs jar 在 Eclipse 中为我提供上下文辅助帮助。自 3.0.7 以来似乎没有任何
    • 我们应该在发布新版本的同时发布一个新的 javadoc 版本。我将添加一个问题报告。请注意,您也可以使用 maven 构建自己的。
    • 仅供参考 - javadoc 可以从 Maven 中心下载:search.maven.org/#browse%7C-2035155240
    • 感谢您的更新。不幸的是,我无法再通过这个获得 Eclipse/SDK 来提供悬停帮助。您必须在 libs\jarname.properties 中添加对 jar 的引用。我对 3.0.5 所做的是将 javadoc jar 重命名为 .zip,展开它并在属性文件中引用它。那行得通,但对于 3.0.9 则不然。他们真的用 SDK17 破坏了 Eclipse 和 javadocs!不再有任何选项让 Eclipse 验证 javadoc 文件,所以我想我将不得不继续使用 3.0.5,无论如何,谢谢。
    • 更新:如果我也添加了 sources.jar 并在 osmdroid-android-3.0.9.jar.properties 中引用它,那么 javadocs 会显示在悬停中,所以一切正常。 (除了每个项目都必须有一个单独的 jar 副本,但这只是 Android SDK 的疯狂!)
    【解决方案2】:

    听起来这可能是此错误的另一种表现形式: Issue 207

    您是否发现早期 API 版本的行为相同?

    【讨论】:

    • 可能是这样。我想我会在 API 7 模拟器上尝试一下,谢谢
    • 我使用 API7 和 Osmdroid 3.0.3 重建了它,并在 API 7 模拟器上运行它。问题仍然存在。这些是我可以使用的最早版本。位图解决方案工作正常,但我总是担心内存泄漏,因为我对位图没有太多经验
    • 阅读 207 这应该是不同的,它与缓存中的标准图块没有任何真正的区别。
    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多