Простейший просмотрщик карт Mapsforge - карта не отображается с темой по умолчанию

Я пытаюсь запустить пример самого простого вьювера карт из проекта mapsforge: Очень простой пример приложения для Android — GitHub с Android Studio.
Во время запуска приложения я столкнулся с проблемой — карта не отображается: http://i.stack.imgur.com/bVNUZ.jpg
Есть сообщение от моего logcat:

01-08 15:46:45.273 32331-32359/com.maptests.mapsforgetest E/DatabaseRenderer: Error to retrieve render theme from future
java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: com.caverock.androidsvg.SVG
at java.util.concurrent.FutureTask.report(FutureTask.java:93)
at java.util.concurrent.FutureTask.get(FutureTask.java:163)
at org.mapsforge.map.layer.renderer.DatabaseRenderer.executeJob(DatabaseRenderer.java:124)
at org.mapsforge.map.layer.renderer.MapWorkerPool$MapWorker.run(MapWorkerPool.java:121)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NoClassDefFoundError: com.caverock.androidsvg.SVG
at org.mapsforge.map.android.graphics.AndroidSvgBitmap.getResourceBitmap(AndroidSvgBitmap.java:49)
at org.mapsforge.map.android.graphics.AndroidSvgBitmap.<init>(AndroidSvgBitmap.java:107)
at org.mapsforge.map.android.graphics.AndroidGraphicFactory.renderSvg(AndroidGraphicFactory.java:302)
at org.mapsforge.map.rendertheme.XmlUtils.createBitmap(XmlUtils.java:64)
at org.mapsforge.map.rendertheme.renderinstruction.RenderInstruction.createBitmap(RenderInstruction.java:131)
at org.mapsforge.map.rendertheme.renderinstruction.Symbol.getBitmap(Symbol.java:62)
at org.mapsforge.map.rendertheme.renderinstruction.Caption.<init>(Caption.java:96)
at org.mapsforge.map.rendertheme.rule.RenderThemeHandler.startElement(RenderThemeHandler.java:186)
at org.mapsforge.map.rendertheme.rule.RenderThemeHandler.processRenderTheme(RenderThemeHandler.java:107)
at org.mapsforge.map.rendertheme.rule.RenderThemeHandler.getRenderTheme(RenderThemeHandler.java:67)
at org.mapsforge.map.rendertheme.rule.RenderThemeFuture$RenderThemeCallable.call(RenderThemeFuture.java:60)
at org.mapsforge.map.rendertheme.rule.RenderThemeFuture$RenderThemeCallable.call(RenderThemeFuture.java:43)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.lang.Thread.run(Thread.java:841) 

Основной код активности (почти не изменился, только существенные изменения по сравнению с исходным кодом):

package com.maptests.mapsforgetest;
import java.io.File;
import org.mapsforge.core.model.LatLong;
import org.mapsforge.map.android.graphics.AndroidGraphicFactory;
import org.mapsforge.map.android.util.AndroidUtil;
import org.mapsforge.map.android.view.MapView;
import org.mapsforge.map.layer.cache.TileCache;
import org.mapsforge.map.layer.renderer.TileRendererLayer;
import org.mapsforge.map.datastore.MapDataStore;
import org.mapsforge.map.reader.MapFile;
import org.mapsforge.map.rendertheme.InternalRenderTheme;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Environment;

public class MainActivity extends AppCompatActivity {
    // name of the map file in the external storage
    private static final String MAPFILE = "germany.map";
    private MapView mapView;
    private TileCache tileCache;
    private TileRendererLayer tileRendererLayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidGraphicFactory.createInstance(this.getApplication());
        this.mapView = new MapView(this);
        setContentView(this.mapView);
        this.mapView.setClickable(true);
        this.mapView.getMapScaleBar().setVisible(true);
        this.mapView.setBuiltInZoomControls(true);
        this.mapView.getMapZoomControls().setZoomLevelMin((byte) 10);
        this.mapView.getMapZoomControls().setZoomLevelMax((byte) 20);
        // create a tile cache of suitable size
        this.tileCache = AndroidUtil.createTileCache(this, "mapcache",
                mapView.getModel().displayModel.getTileSize(), 1f,
                this.mapView.getModel().frameBufferModel.getOverdrawFactor());
    }
    @Override
    protected void onStart() {
        super.onStart();
        this.mapView.getModel().mapViewPosition.setCenter(new LatLong(52.229081, 21.068434));
        this.mapView.getModel().mapViewPosition.setZoomLevel((byte) 12);
        // tile renderer layer using internal render theme
        MapDataStore mapDataStore = new MapFile(getMapFile());
        this.tileRendererLayer = new TileRendererLayer(tileCache, mapDataStore,
                this.mapView.getModel().mapViewPosition, false, true, AndroidGraphicFactory.INSTANCE);
        tileRendererLayer.setXmlRenderTheme(InternalRenderTheme.OSMARENDER);
        // only once a layer is associated with a mapView the rendering starts
        this.mapView.getLayerManager().getLayers().add(tileRendererLayer);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.mapView.destroyAll();
    }

    private File getMapFile() {
        File file = new File(Environment.getExternalStorageDirectory(), MAPFILE);
        return file;
    }
}

И мой файл дизайна XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.maptests.mapsforgetest.MainActivity">

    <org.mapsforge.map.android.view.MapView
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</RelativeLayout>

Думаю, я добавил также все необходимые .jar-s:
mapsforge-core-0.6.0.jar,
mapsforge-map-0.6.0.jar,
mapsforge-map-android,< br> mapsforge-map-awt-0.6.0.jar,
mapsforge-map-reader-0.6.0.jar.

Есть ли какие-либо другие библиотеки, которые я должен добавить?

Согласно сообщению от logcat и тому, что я прочитал, есть проблема с темой карты по умолчанию, как я могу решить эту проблему?


person N. Cichocki    schedule 08.01.2016    source источник


Ответы (3)


Cichocki, это случилось и со мной, так что давайте начнем, да, отсутствует этот класс из библиотеки mapsforge 0.6, тот и другие, вам нужно скачать этот исходный код, это библиотека svg: https://github.com/senkir/androidsvg Загрузите этот репозиторий, импортируйте в свое рабочее пространство и добавьте в свой проект. Я сделал это в eclipse, добавил как библиотеку и запустите этот код, не нужно ничего добавлять, вы должны увидеть карту, удачи

person unidimensional    schedule 02.02.2016

Вы должны добавить библиотеку тем, добавив ее в свой build.gradle или используя эквивалентную банку:

implementation 'org.mapsforge:mapsforge-themes:[CURRENT-VERSION]'

см. руководство по интеграции.

person Jannis    schedule 17.08.2019

Согласно руководству по интеграции вам необходимо дополнительно импортировать:

implementation 'com.caverock:androidsvg:1.4'
person le chiffre    schedule 02.10.2019