pour notre application, j'intègre actuellement la carte avec une surce de carte personnalisée (comme décrit here). Tout fonctionne bien avec une connexion Internet active, en utilisant le OfflineManager
et OfflineTilePyramidRegionDefinition
Je peux télécharger des tuiles et les trouver dans le mbgl-offline.db mais ils ne semblent pas être utilisés dans l'application. Les régions hors connexion sont signalées comme complètes, mais n'apparaissent pas. Comme je comprends le offline documentation, après avoir téléchargé les tuiles, tout le reste est "mains".MapBox GL Android: Cartes hors ligne de la source de tuiles personnalisées téléchargées mais non utilisées
J'ai essayé plusieurs sources différentes (par exemple, OpenMapTiles.org), car nous sommes encore en train de configurer notre propre serveur de tuiles de cartes.
Ai-je oublié quelque chose ici? J'apprécie vraiment les pistes.
Best, Phil
Mise à jour: Voici quelques plus d'informations:
Le XML Mise en page
<com.mapbox.mapboxsdk.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
mapbox:center_latitude="51"
mapbox:center_longitude="7"
mapbox:style_url="http://demo.tileserver.org/styles/klokantech-basic.json"
mapbox:zoom="1"/>
Le code pour télécharger les données cartographiques:
// Set up the OfflineManager
OfflineManager offlineManager = OfflineManager.getInstance(context);
// Create a bounding box for the offline region
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(new LatLng(6, 50))
.include(new LatLng(8, 52))
.build();
// Define the offline region
OfflineTilePyramidRegionDefinition definition = new OfflineTilePyramidRegionDefinition(
mapView.getStyleUrl(),
latLngBounds,
0,
9, // also tried other zoom levels
context.getResources().getDisplayMetrics().density);
// Set the metadata
byte[] metadata;
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put(JSON_FIELD_REGION_NAME, "Cologne");
String json = jsonObject.toString();
metadata = json.getBytes(JSON_CHARSET);
} catch (Exception exception) {
Log.e("Failed to encode metadata: " + exception.getMessage());
metadata = null;
}
// Create the region asynchronously
offlineManager.createOfflineRegion(
definition,
metadata,
new OfflineManager.CreateOfflineRegionCallback() {
@Override
public void onCreate(OfflineRegion offlineRegion) {
offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE);
// Monitor the download progress using setObserver
offlineRegion.setObserver(new OfflineRegion.OfflineRegionObserver() {
@Override
public void onStatusChanged(OfflineRegionStatus status) {
// Calculate the download percentage and update the progress bar
double percentage = status.getRequiredResourceCount() >= 0
? (100.0 * status.getCompletedResourceCount()/status.getRequiredResourceCount()) :
0.0;
if (status.isComplete()) {
// Download complete
Log.d("Region downloaded successfully.");
ReadOSRMRouteTask readOSRMRouteTask = new ReadOSRMRouteTask();
readOSRMRouteTask.execute();
} else if (status.isRequiredResourceCountPrecise()) {
// Switch to determinate state
Log.d((int) Math.round(percentage) + "% downloaded");
}
}
@Override
public void onError(OfflineRegionError error) {
// If an error occurs, print to logcat
Log.e("onError reason: " + error.getReason());
Log.e("onError message: " + error.getMessage());
}
@Override
public void mapboxTileCountLimitExceeded(long limit) {
// Notify if offline region exceeds maximum tile count
Log.e("Mapbox tile count limit exceeded: " + limit);
}
});
}
@Override
public void onError(String error) {
Log.e("Error: " + error);
}
});
Lors du téléchargement des données de la carte, le journal spammed essentiellement beaucoup de HTTP 200, donc tout semble bien à cette fin. De plus, les paquets hors ligne sont rapportés complets et le sqlite-db semble bien aussi.
Lors du démarrage de l'application en mode hors-ligne, cela est essentiellement le journal:
D/mbgl: [JNI]: nativeCreate
/com.mapbox.mapboxsdk.maps.MapView: MapView start Telemetry...
/MapboxEventManager: Telemetry initialize() called...
/MapboxEventManager: Mapbox Telemetry has already been initialized.
D/mbgl: [JNI]: nativeInitializeDisplay
D/mbgl: [JNI]: nativeInitializeContext
I/MapboxEventManager: flushEventsQueueImmediately() called...
D/MapboxEventManager: turnstile event pushed.
W/MapboxEventManager: Not connected to network, so empty events cache and return without attempting to send events
I/com.mapbox.mapboxsdk.http.HTTPRequest: Request failed due to a connection error: No Internet connection available.
D/mbgl: [JNI]: nativeViewResize
D/mbgl: [JNI]: nativeCreateSurface
D/mbgl: [JNI]: nativeFramebufferResize
I/TelemetryService: onStartCommand() called
D/mbgl: [JNI]: nativeViewResize
D/mbgl: [JNI]: nativeFramebufferResize
I/Timeline: Timeline: Activity_idle id: [email protected] time:609768
W/MapboxEventManager: Not connected to network, so empty events cache and return without attempting to send events
Je pense que j'ai aussi eu ce problème et je vais revenir sur le projet, mais je pense que vous devez vous assurer que vous téléchargez le même style dans vos régions hors-ligne. – dazza5000
Merci pour votre vérification! MapView.getStyleUrl() ne devrait-il pas déjà s'assurer que le même style est téléchargé, car il est déjà utilisé? Je ne change pas le style de la carte après l'avoir défini dans le layout-XML. –