Mapbox离线区域 - 无法查看已保存的地图区域

时间:2016-05-10 21:06:52

标签: android mapbox offline

从版本4.0.0开始,Mapbox将ability to download offline regions引入了他们的Android SDK。我试图通过以下方式使用此功能:

  1. 当我在线时,将地图的可见部分下载为离线区域
  2. 关闭应用
  3. 几天后,如果没有网络连接,请打开应用程序,地图指向该地区的某个位置,并提供地图。
  4. 但似乎并没有这样做。当我离线运行应用程序时,它会挂起,并且只有地图应该是灰色表面。日志表明Mapbox一直在尝试发布地图图块的请求(不应该这样做,因为地图应该可以离线使用)。

    快速调试显示地图的onMapReadyCallback永远不会被调用,而且我告诉Mapbox它应该跟踪用户(这会将我带到地图的已保存区域)。所以似乎这里有一个恶性循环:如果地图没有准备好我就不能去保存的区域,并且地图没有准备好,直到它加载所有当前可见的瓷砖,它不能,因为它是离线的...

    任何人都可以帮忙吗?

    供参考,以下是我下载地区的方式:

    private void downloadWithinBounds() {
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(MapboxMap mapboxMap) {
                Projection projection = mapboxMap.getProjection();
                LatLng topLeft = projection.fromScreenLocation(new PointF(0, 0));
                LatLng bottomRight = projection.fromScreenLocation(
                        new PointF(mapView.getWidth(), mapView.getHeight()));
                manager.createOfflineRegion(new OfflineTilePyramidRegionDefinition(
                        Style.MAPBOX_STREETS,
                        new LatLngBounds.Builder()
                                .include(topLeft)
                                .include(bottomRight)
                                .build(),
                        mapboxMap.getCameraPosition().zoom,
                        mapboxMap.getMaxZoom(),
                        1.0f
                ), new byte[0], new OfflineManager.CreateOfflineRegionCallback() {
                    @Override
                    public void onCreate(OfflineRegion offlineRegion) {
                        offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE);
                        offlineRegion.setObserver(new OfflineRegion.OfflineRegionObserver() {
                            @Override
                            public void onStatusChanged(OfflineRegionStatus status) {
                                if (status.isComplete()) {
                                    Toast.makeText(MainActivity.this, "Done saving map.", Toast.LENGTH_SHORT).show();
                                }
                            }
    
                            // ...
    
                        });
                    }
    
                    // ...
    
                });
            }
        });
    }
    

    以下是我尝试将地图移动到onCreate()中的正确位置的方法:

    mapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(final MapboxMap mapboxMap) {
            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            Location last = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    
            mapboxMap.setCameraPosition(new CameraPosition.Builder()
                    .zoom(INITIAL_ZOOM)
                    .target(last != null ? new LatLng(last.getLatitude(), last.getLongitude()) : null)
                    .build()
            );
            mapboxMap.getTrackingSettings().setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW);
            mapboxMap.setMyLocationEnabled(true);
    
            mapboxMap.setStyle(Style.MAPBOX_STREETS);
    
            // ...
        }
    });
    

    onMapReady()永远不会被调用。

    编辑:这是the full source code of my activity

2 个答案:

答案 0 :(得分:0)

我们目前正在针对此问题进行修复,您可以查看使用4.0.1-SNAPSHOT是否可以解决问题。您可以通过打开应用build.grade并使用此功能来执行此操作:

repositories {
    mavenCentral()
    maven { url "http://oss.sonatype.org/content/repositories/snapshots/" }
}

dependencies {
    compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:4.0.1-SNAPSHOT@aar'){
        transitive=true
    }
}

答案 1 :(得分:0)

我尝试重现你的问题。您可以查看我为此here使用的代码。在这个例子中,我将我的相机位置设置为xml,指向冰岛的Dalvik(65.970773,-18.532800)。在OnMapReady回调中,如果设备上没有可用的,我正在尝试下载该区域。我打开设备并等待下载完成。完成后我强制关闭应用程序并关闭wifi /蜂窝网络。 当我重新打开地图时,似乎没有加载地图。

我尝试单步执行代码并注意到这个块:

    LatLng topLeft = projection.fromScreenLocation(new PointF(0, 0));
    LatLng bottomRight = projection.fromScreenLocation(
            new PointF(mMapView.getWidth(), mMapView.getHeight()));

    LatLngBounds bounds = new LatLngBounds.Builder()
            .include(topLeft)
            .include(bottomRight)
            .build();

我看到topLeft和bottomRight是相同的LatLng,因为mMapView.getWidth()& mMapView.getHeight尚未测量,并且分别返回0。用来自Dalvik地区周围的硬编码LatLng替换这些解决了这个问题并且加载了地图。 我找到了here能够使其工作的代码。