OSM Android entwicklung karte lädt nicht

Hallo leute,

ich weiß nicht ob ich hier richtig bin. falls nicht bitte ich um entschuldigung.

ich hoffe ihr könnt mir helfen. ich möchte nur eine mapview von openstreetmaps auf dem display angezeigt bekommen. aber irgendwie erscheint keine karte sondern nur quadrate (siehe hier http://s1.directupload.net/file/d/3082/dz7tm4ei_jpg.htm). die angaben für longitude und latitude ist nicht zu berücksichtigen. es geht lediglich nur um die anzeige der karte.
was ich bisher habe:

java klasse:


import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ScaleBarOverlay;
import org.osmdroid.views.overlay.SimpleLocationOverlay;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

        TextView longitude, latitude;
        private MapView mapView;
        private MapController mapController;
        private ScaleBarOverlay mScaleBarOverlay;
        private SimpleLocationOverlay mMyLocationOverlay;
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        longitude = (TextView)findViewById(R.id.textViewLong);
        latitude = (TextView)findViewById(R.id.textViewLat);
        
        mapView = (MapView) this.findViewById(R.id.mapview);
        mapView.setClickable(true);
        mapView.setBuiltInZoomControls(true);              
        mapView.getController().setZoom(15);
        mapView.getController().setCenter(new GeoPoint(52.221,6.893));
        
        LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        LocationListener ll = new myLocationListener();
        
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
    }
    
    class myLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            if(location != null)
            {
                double pLong = location.getLongitude();
                double plat = location.getLatitude();
                
                longitude.setText(Double.toString(pLong));
                latitude.setText(Double.toString(plat));
            }
            
        }

        @Override
        public void onProviderDisabled(String provider) {
            Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);                
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            // TODO Auto-generated method stub
            
        }
        
    }
    
    public void ExitKlick(View v){
        this.finish();
    }

  
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

layout.xml:


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" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="30dp" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Longitude:"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/textViewLong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="2dp"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/linearLayout1"
        android:layout_marginTop="5dp" >

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Latitude:"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/textViewLat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="2dp"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Your Position via OSM"
            android:textStyle="bold" />
    </LinearLayout>

    
    <org.osmdroid.views.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/buttonExit"
        android:layout_below="@+id/linearLayout2">

    </org.osmdroid.views.MapView>
    
    <Button
        android:id="@+id/buttonExit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:onClick="ExitKlick"
        android:text="Exit" />

</RelativeLayout>

folgende bibliotheken wurden in das projekt geaddet:
osmdroid-android-3.0.8 und
slf4j-android-1.5.8

ich hänge hier schon seit mehr als ein tag und da frag ich lieber jetzt. komme so nicht weiter. hoffe ihr könnt mir helfen. danke im voraus.

Moin,

hab mal 20 Minuten mit deinem Coding rumgespielt, läuft hier ohne Probleme auf meinem Telefon, angezeigt wird eine Mapnik-Karte mit Enschede drauf. Vermutlich fehlen in deinem AndroidManifest.xml noch ein paar Berechtigungen. Die hier habe ich nach etwas stackoverflow-Suche eingebaut:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

In der Java-Klasse habe ich noch ein removeUpdates eingebaut, damit GPS nach dem Exit nicht mehr weiterrennt.

public void ExitKlick(View v){
	lm.removeUpdates(ll);
    this.finish();
}

Gruß,

hallo mmd,

voll korrekt das du antwortest. das gibt mir hoffnung, dass doch jmd versucht mir zu helfen, danke nochmals. :wink:

hmm… ich habe das so in erinnerung das ich die berechtigungen festgelegt hatte, muss da nochmal schauen.
Aufm smarthpone habe ich es noch nicht versucht, nur auf dem pc via emulator. dachte da wurde die karte auch erscheinen. aber es funktioniert auf dem telefon?? o_o (coole sache) :smiley:
das überrascht mich wirklich. das werde ich gleich morgen früh ausprobieren.

ja enschede wird angezeigt, da ich GeoPoint(52.221,6.893) so im code festgelegt habe.

wie gesagt, werde ich gleich morgen damit weiter machen. mal eine ganz andere frage mmd: kann man die parameter die von osm angezeigt werden extrahieren? also ohne eine karte zu verwenden nur die informationen über die gegend in dem man sich aufhält abfragen?z.b. straße, ort, keine ahnung… alle möglichen informationen.

Mit den Koordinaten, die du von der Android-API erhältst könntest du die Overpass-API füttern, die dir die Objekte im Umkreis einer Position liefern kann und diese auch direkt filtern. Details finden sich im Wiki-Artikel Overpass-API/Language Guide.

mfg~ray

Hallo leute, danke für eure posts.

also ich habe das auf meinem smartphone installiert und siehe da, es geht tatsächlich. danke mmd :wink:
ich bin dann ein schritt weiter gegangen und wollte dann keine fixen koordinaten, sondern die verwenden, wo ich mich gerade befinde. habe daher die zeile vom code
…new GeoPoint(52.221,6.893)); in …new GeoPoint(plat,plong)); geändert. komischerweise weißt er mich mit den vom gps entnommen latitute und longitute werte mitten auf das meer bei afrika. :open_mouth: lol!?
weiß jmd. warum das so ist?

@rayquaza: danke man. genau sowas habe ich gesucht. werde mich als nächstes, wenn ich mein kleines problem gemeistert habe mich damit beschäftigen. eine weitere frage hätte ich nocht: kann man denn auch abfragen machen, in was für einer gegend man sich befindet? also sprich, ist man in einer stadt, dorf, wald, auf einem landwirtschaftlichen gebiet, autobahn etc? muss man dafür spezielle karten haben?

Das Meer bei Afrika liegt vermutlich bei (0,0), eine oder beide Koortdinaten sind also nicht belegt oder sonst irgendwie=0. Kanns daran liegen, dass Du manchmal plong und manchmal pLong schreibst? Ansonsten würde ich mal schaun, was in plong und plat drinsteht…

So klappt es:


        public void onLocationChanged(Location location) {
            if(location != null)
            {
                double pLong = location.getLongitude();
                double plat = location.getLatitude();
                mapView.getController().setCenter(new GeoPoint(plat, pLong));
...

das Meer vor Afrika ist klares Zeiches dafür, dass lat und long vertauscht wurden, bei Orten in unseren Breiten.

Nein, das war in diesem Fall nicht das Problem. Ausnahmsweise.

@maxbe: nein, habe pLong in plong geändert. lag nicht daran.

@mmd: suuuper. es funzt. bin dir was schuldig :wink:

ich möchte mich noch etwas genauer mit der materie beschäftigen. falls ich weitere fragen haben sollte, dann melde ich mich. ich bedanke mich für die hilfen. ihr seid super :wink:

hallo leute,

ich bin es nochmal. Ich beschäftige mich gerade damit, wie ich nun bestimmte daten/parameter von osm bekommen bzw. filtern kann, wie z.b. straßennamen, poi’s etc. bin daher dem ratschlag von rayquaza gefolgt (seinen beitrag siehe oben) und mich erstmal über die overpass-api schlau gemacht. scheint nicht sooo einfach zu sein. hänge seit meinen letzten beitrag bei der sache dran, ohne ergebnis.
nun, mit der api können die OSM Kartendaten gelesen und in Form von RAW XML gefiltert werden. es gibt zwar sämtliche request anfrage beispiele, aber ich weiß und verstehe nicht, wie ich das mit der android app verknüpfen soll. ich habe das so verstanden: ch müsste einen webservice erstellen womit die anfragen im hintergrund an die online osm datenbank geschickt werden, diese mir die antworten, also die geforderten daten als xml zurückliefert. die app wertet aus der xml die ergebnisse und gibt sie schließlich auf dem display aus. ist das das prinzip und die vorgehensweise? das scheint mir nicht ganz so effizient zu sein. wenn man sich ständig bewegt, müssten immer xml datein erstellt downgeloaded und ausgewertet werden. kann mir einer bestätigen ob ich falsch liege? bzw. erläutern wie das ganze funktioniert? habe schon fleißig gegoogelt, aber keine gebräuchlichen anleitungen/tutorials und erläuterungen gefunden. wäre für jede kleine hilfreiche idee/tipp sehr dankbar.

Wenn du unbedingt ständig überprüfen willst, was das näheste Objekt ist: ja.
Alternativ könntest du nur eine neue Anfrage senden, wenn die Positionsänderung > n Meter ist und bis dahin aus dem Ergebnis der letzten Anfrage ein neues nähestes Objekt berechnen. Ich würde dabei je nach Anwendung im Bereich von 24 bis 256 Meter einen Wert suchen, bei dem nicht ständig neue Daten übermittelt werden (belastet API-Server und Volumentarife) aber nicht zu viel als Antwort kommt (belastet Arbeitsspeicher und Volumentarife etwas).
Ansonsten bleiben noch direkt Kartendaten, die allerdings vor Nutzung heruntergeladen werden müssten und dann gerendert werden (also keine fertigen Kacheln). Besonders bei letzterem solltest du imo versuchen, die Daten so zu speichern, dass auch andere Anwendungen sie nutzen können (auf meinem Telefon sammeln z.B. mehrere Anwendungen in etwa genausovielen Verzeichnissen die selben gecachten Mapnik-Kacheln…).

mfg~ray

Morgen rayquaza :slight_smile:

da gebe ich dir recht. ständig bei jeder bewegung daten zu ziehen wäre nicht die gute und effiziente lösung. Ich dachte dann eher an eine boundingbox. habe einen geocoder in den code von oben eingebaut mit der der folgenden public methode: public List getFromLocation (double latitude, double longitude, int maxResults)
nun konnte ich auch die adresse anzeigen lassen. hat auch schön geklappt. woher kommen denn diese parameter für die adressen? kann man auch andere parameter mittels geocoder abfragen? wenn ja, dann bräuchte ich die overpass-api gar nicht.

woher bekomme ich die karten? gibt es viele karten mit verschiedenen kartenkategorien, also mit verschiedenen ansichten? z.b. straßen mehr in den vordergrund rücken durch bestimmte farben, oder nur städte und landschaften?

Ich meinte damit reine Kartendaten (also z.B. osm-Dateien) die zur Laufzeit von deiner Anwendung gezeichnet werden (wie z.B. bei OsmAnd). Um Platz zu sparen sollten die Daten auf jeden Fall vorher gefiltert werden, um alles, was von deiner Anwendung nicht ausgewertet wird rauszuwerfen (z.B. fixme=, detail=, tracks=, source=, …), und vermutlich gibt es auch effizientere Formate für OSM-Daten als XML. Eine Mischung von Kacheldarstellung für die Anzeige und Rein-Daten für Berechnungen ist natürlich auch möglich, würde aber ein paar Vorteile der “Roh”-Daten nicht nutzen und mehr Speicherplatz benötigen.

Für den Rest solltest du besser hoffen, dass sich noch jemand anderes meldet aber ich versuch’s mal mit 'nen paar “blöden Kommentaren”, vielleicht reicht’s ja:

Wenn du nur die Adresse zu einer Position willst (oder andersrum) reicht eventuell auch Nominatim.

Die Frage verstehe ich leider noch nicht: Welche “Parameter” meinst du?

Falls sich sonst niemand mehr meldet: Was ist dieses “geocoder”-Ding (ich kann weder Java noch Android-API besonders gut und hab’ auch nicht soviel Ahnung vom Aufbereiten von Geo-Informationen :wink: )?

Und dann noch die ganz böse Frage: Was soll das ganze denn am Ende machen? (Kannst mir darauf auch per PN antworten, wenn du es nicht öffentlich hier stehen haben magst, aber sei nicht böse, wenn ich trotzdem keinen besseren Tipp habe.)

mfg~ray

Hi ray,

der geocoder ist eine klasse der android.location. Mit den enthaltenen mehtoden der klasse kann man halt anhand des GPS die adresse anzeigen lassen. sie wandelt sozusagen die adresse in GPS um und umgekehrt.

Mit parameter meine ich die adressinformationen, z.b. Königsstraße 32, 484848 Berlin (spontan ausgedacht :))

Nun was ich möchte ist einfach nur, das die app mir die adressinformationen zeigt (das tut sie ja (manchmal)) UND z.b. bestimmte POI’s. mehr nicht :roll_eyes:
die POI möchte ich nicht unbedingt auf der karte haben, sondern als eine string-ausgabe, z.b. “Kino - Cinemaxx” .

Die app:

Long:
Lat:
Adresse:
POI:

Kartenansicht

so in der art ist/soll meine app am ende sein. es geht lediglich um die poi abfragen. da hapert es :frowning:

Wenn ich das richtig sehe, dann läuft das über die “Google Maps API” und damit sollte gelten:

Quelle: https://developers.google.com/maps/terms

Gruß,
Mondschein

Für die Adresse wäre dann wohl Nominatim am geeignetsten.
Für die POI: Zur Minimierung der zu übertragenden Datenmenge würde ich die Liste gleich durch die Overpass-API filtern lassen und eine BB von etwa 50²m bis 100²m um den Standort abfragen, davon jeweils bereits vorhandene BBs abziehen und nur anfragen, wenn die verbleibende Fläche grösser als x m² ist - Für wirklich sinnvolle Flächenwerte musst du wohl etwas experimentieren. Speichere das Ergebnis dann noch in einer lokalen Datenbank, dass wenn man ständig die selbe Strecke abläuft auch nach Neustarts nicht ständig dieselben Daten abgefragt werden, dann sollten das hoffentlich nicht zu viele zu übertragende Daten werden. Aus diesen Daten kann man dann recht einfach mit etwas Magie (und ein wenig Mathematik) den nähesten POI ermitteln.

Wenn’s offline sein soll müsstest du halt irgendwas an Kartendaten haben, das einlesen und ähnlich obigem verarbeiten.

Hab’ ich sonst noch was verpasst (aka “Noch was unklar?”)?

mfg~ray

@Mondschein: jupp, danke. jetzt weiß ich bescheid :slight_smile:

@ray: ja so hatte ich mir das auch überlegt. mein problem ist nur wie und wo ich beginnen soll mit dem overpass-api. kenn mich mit dem api sachen gar nicht aus. da stehe ich echt auf dem schlauch. :confused:

ich google weiter und poste das sofort hier rein wenn ich das weiß.

Guckst du hier für die Overpass_API.

Edbert (EvanE)