Kompass auf osmdroid Karte anzeigen

  • Antworten:20
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 609

17.04.2019, 15:20:37 via Website

Hallo zusammen

Hat Jemand Erfahrung mit der osmdroid Karte. In der Beispiel app wird ein Kompass auf der Karte gezeigt. Dieser kann man über die Optionen ein und ausschalten.

In meiner app verwende ich ebenfalls die Karte von osmdroid. Ich möchte auf meiner Karte ebenfalls ein Kompass anzeigen. Hat jemand Erfahrung mit der Karte von osmdroid und kann mir sagen, wie ich den Kompass in meiner Karte anzeigen kann?

Ich habe im wiki von osmdroid gesucht, aber nichts in dieser Richtung gefunden. Kann mir Jemand weiter helfen?

Gruss Renato

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

21.04.2019, 13:27:44 via Website

So hier ein Beispiel was bei mir ohne Propleme läuft.

Activity

import android.content.Context;

import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.compass.CompassOverlay;
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;

public class MainActivity extends AppCompatActivity {

MapView mapView = null;
Context ctx;
CompassOverlay compassOverlay;

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ctx = getApplicationContext();
    Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));


    mapView = (MapView) findViewById(R.id.map);
    mapView.setTileSource(TileSourceFactory.MAPNIK);

    compassOverlay = new CompassOverlay(ctx, new InternalCompassOrientationProvider(ctx), mapView);
    compassOverlay.enableCompass();
    mapView.getOverlays().add(compassOverlay);
}

public void onResume(){
    super.onResume();
    mapView.onResume();
}

public void onPause(){
    super.onPause();
    mapView.onPause();
}

}

Layout Datei

<?xml version="1.0" encoding="utf-8"?>

android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

Gradle File

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

implementation 'org.osmdroid:osmdroid-android:6.1.0'

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

18.04.2019, 18:00:38 via Website

Eigentlich sollte es ganz einfach sein. Gemäss Beispiel:

        compassOverlay = new CompassOverlay(getApplicationContext(), new InternalCompassOrientationProvider(getApplicationContext()), mapView);
    compassOverlay.enableCompass();

    mapView.getOverlays().add(compassOverlay);

Nur bei mir funktioniert es einfach nicht. Der Kompass wird in der Karte nicht angezeigt. Weiss jemand weiter?

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

18.04.2019, 19:34:21 via Website

Versuche mal

CompassOverlay mCompassOverlay = new CompassOverlay(getContext(),
new InternalCompassOrientationProvider(getContext()),
mMapView);
mCompassOverlay.enableCompass();
mMapView.getOverlays().add(this.mCompassOverlay);

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

20.04.2019, 17:45:16 via Website

Ciao Jokel

So steht es auch im Beispiel aus. Aber ich habe Probleme mit der Methode "getContext()". Die wird bei mir rot unterlegt und ich weiss nicht was ich machen muss. Muss ich was importieren oder selber was schreiben. Im Beispiel aus dem wiki ist es auch so geschrieben aber ich finde nirgends ein Hinweis auf diese öminöse Methode.

Kannst du mir da weiter helfen?

Gruss Renato

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

20.04.2019, 17:54:59 via Website

Ich habe nun folgendes ausprobiert

Import static method 'java.security.AccessController.getContext'

dann verschwindet die rote Linie vom vorderen "getContext". Aber beim zweiten Aufruf bleibt der Fehler und ich kann machen was ich will, es geht einfach nicht.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.04.2019, 18:20:12 via Website

Ne der Context muss von einer Activity oder Fragment kommen.
Wo wird denn das ganze ausgeführt.
In einer separaten Klasse oder in einer Activity oder in einem Fragment?

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

20.04.2019, 18:25:39 via Website

Ciao Pascal

Das ganze läuft in der Activity main.

Was meinst du mit Fragment?

Gruss Renato

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.04.2019, 18:34:54 via Website

Ein Fragment ist das hier: https://developer.android.com/guide/components/fragments

In einer Activity kannst du für den Context auch 'this' nehmen:

CompassOverlay mCompassOverlay = new CompassOverlay(getContext(),
new InternalCompassOrientationProvider(this),
mMapView);
mCompassOverlay.enableCompass();
mMapView.getOverlays().add(this.mCompassOverlay);

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
scofficial
  • Forum-Beiträge: 2

20.04.2019, 19:37:45 via Website

Try this one,

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

20.04.2019, 20:17:40 via Website

Hallo also getContext benutzt man wenn man sich in einem Fragment befindet. Dachte das währe so, sorry .

Wen du in der Activity bist kannst du auch this nehmen so wie Pascal es bereits sagte.

Nur mit mit dieser zeile von Pascal denke ich ist nicht ganz richtig.
CompassOverlay mCompassOverlay = new CompassOverlay(getContext(),
new InternalCompassOrientationProvider(this),
mMapView);

Den ersten Context müsstest du auch durch this ersetzen.

CompassOverlay mCompassOverlay = new CompassOverlay(this, new InternalCompassOrientationProvider(this),
mMapView);

Bemerken möchte ich aber noch wenn du dich in eine callback Methode befinden solltest ist this meist nicht richtig.

Speicher dir den Context am besten in einer globalen Klassen Variablen setze die in der onCreate und benutze diese wenn du den Context brauchst.

Hilfreich?
Pascal P.
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

20.04.2019, 20:48:56 via Website

Frage welches Beispiel hast du benutzt?

Hilfreich?
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

21.04.2019, 13:27:44 via Website

So hier ein Beispiel was bei mir ohne Propleme läuft.

Activity

import android.content.Context;

import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.compass.CompassOverlay;
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;

public class MainActivity extends AppCompatActivity {

MapView mapView = null;
Context ctx;
CompassOverlay compassOverlay;

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ctx = getApplicationContext();
    Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));


    mapView = (MapView) findViewById(R.id.map);
    mapView.setTileSource(TileSourceFactory.MAPNIK);

    compassOverlay = new CompassOverlay(ctx, new InternalCompassOrientationProvider(ctx), mapView);
    compassOverlay.enableCompass();
    mapView.getOverlays().add(compassOverlay);
}

public void onResume(){
    super.onResume();
    mapView.onResume();
}

public void onPause(){
    super.onPause();
    mapView.onPause();
}

}

Layout Datei

<?xml version="1.0" encoding="utf-8"?>

android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

Gradle File

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

implementation 'org.osmdroid:osmdroid-android:6.1.0'

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

21.04.2019, 17:48:31 via Website

Danke für die vielen Tips. Ich schaue sie mir alle mal in ruhe an. Was ich bereits jetzt sagen kann ist, das mit "this" funktioniert nicht. Das habe ich bereits versucht.
Nun ich habe ja da einiges zum Experimentieren. Ich melde mich wieder wenn ich mehr weis.

Gruss Renato

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

27.04.2019, 22:17:02 via Website

Mir kommt alles komisch vor. Normaler weise entwickle ich unter Linux. Da erscheint der Kompass auf keine Art und Weise. Wenn ich aber das Projekt auf einem Windows Rechner nachbaue, dann geht es.

Weiss der Kuckuck warum!

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

28.04.2019, 10:11:30 via Website

tesest du mit dem emulator oder ein echtes Gerät?

Emulator könnte unter linux anders sein als Windows , bei einem echten Handy solte das nicht sein.

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

28.04.2019, 15:57:21 via Website

Ciao Jokel

Nein, ich teste auf einem Samsung Galaxy note 3. Gerne würde ich das Projekt von Linux auf Windows kopieren. Aber ich habe noch nicht gefunden was ich im Projekt ändern muss damit es läuft. Denn beim Kompilieren tauchen Fehler auf. Da bin ich noch daran am schauen. Vielleicht kommt es mal zum Fliegen.

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

28.04.2019, 16:29:06 via Website

Wo bei was kommen den Fehlermeldungen?
Bei Linux, Windows bitte genauer sonst ist Hilfe nicht möglich solltest du mittlerweile auch wissen.

Auf Linux läuft es oder wie ?
Welche Fehlermeldungen auf welchen System?
Wie hast du es übertragen ....?

— geändert am 28.04.2019, 16:32:02

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

28.04.2019, 18:23:54 via Website

Ciao Jokel

Bitte entschuldige meine Ungeduld.

Also ich habe mein Projekt von Windows nach Linux gezügelt und zwar mittels eines USB Stickt. Danach habe ich in der Datei "local.properties" den Pfad geändert. Wenn ich nun das Projekt starte kommt beim Kompilieren folgender Fehler:

/home/renato/AndroidStudioProjects/Karte/app/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_0/resources_ap

Vielleicht weiss jemand was man noch am Projekt ändern muss damit man es ausführen kann.

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

28.04.2019, 20:02:39 via Website

Also wenn ich ein Projekt neu in as importire. Auch bei einem wo ich gar nicht weiß wo entwickl wurde.
Lösche ich immer die *.iml Dateien, local.properties, Ordner /build , /.idea .

Schaue dir mal die .gitignore Datei an in der steht welche Dateien und Ordner nicht mit in ein repository zb github übertragen werden. In solchen repositorys sind diese Dateien auch meistens nicht enthalten. Somit sollte es ohne Probleme möglich sein das Projekt in AS zu importieren.

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

29.04.2019, 20:46:36 via Website

Ich habe mal das Projekt unter Linux neu angelegt und danach nur das Verzeichnis "src" überschrieben. Leider immer noch denselben Fehler. Ich denke, dass es wegen der "mapView" nicht geht. Mal schauen vielleicht finde ich noch den Problem.

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

20.05.2019, 21:48:48 via Website

Hallo zusammen

Nur so für die es Interessiert. Der Kompass wird nun angezeigt. Mann muss die Kompassoverlay auch dazutun wenn man einen Weg aufzeichnet.

   private void zeigeWeg() {
    mapView.getOverlayManager().clear();
    List<Location> weg = WegAufzeichnungsService.weg;
    if( weg.size() > 1 ) {
        Polyline overlay = new Polyline(mapView);
        overlay.setColor(Color.BLUE);
        for( int i=0; i < weg.size(); i++){
            GeoPoint point = new GeoPoint(weg.get(i));
            overlay.addPoint(point);
            if(i == weg.size() - 1){
                mapView.getController().setCenter(point);
            }
        }
        mapView.getOverlayManager().add(overlay);
    }
    mapView.getOverlays().add(myLocationOverlay);
    mapView.getOverlays().add(compassOverlay);
}

Gruss Renato

Hilfreich?
swa00
Kommentieren