5

Ok. Man könnte meinen, das wäre relativ einfach, aber nein.osmdroid, Maps API v2 und Fragmente

Ich verwende offene Straßenkarten auf meiner Website, da die Daten frei zu verwenden, zu bearbeiten und zu aktualisieren sind - mein Projekt folgt diesem Mantra, und neben Googles API Nutzungsbeschränkungen/Datenbeschränkungen, war Google Maps einfach nicht geeignet für mich .. zumindest im Internet.

Angesichts dieser dachte ich, ich würde folgen mit meiner Android-App, und so habe ich osmdroid mit offenen Straßenkarten Daten eingerichtet.

Ich kann eine schöne Karte in meiner Aktivität haben .. Ich folgte auch einem Tutorial, und es schien zumindest so zu funktionieren, dass ich eine Kartenansicht in einem Fragment innerhalb eines Tabhost/Viewpager haben kann. Was ich aber wirklich will (für Tablets), ist eine Liste von Betrieben in einem Fragment auf der linken Seite, und ein Kartenfragment auf der rechten Seite zeigt, wo sich diese Einrichtungen befinden.

Einfach genug ich hätte gedacht, aber viele Stunden der Forschung legen nahe, dies nicht möglich ist, wenn Sie einige komplex Code und einige veralteten Methoden verwenden ..

Also .. das Fragment (eine Kartenansicht enthält) Lasten und läuft perfekt in einem tabhost .. ich kann auf methoden innerhalb des fragments von meiner aktivität usw .. noch nichts haben einfach nur zwei fragmente nebeneinander.

Jetzt .. Ich weiß google haben gerade mit ihrer API v2 .. Ich habe es installiert und hatte ein Spiel .. nicht wirklich wissen, wie Osmdroid funktioniert, ich dachte, ich könnte aktualisieren, so habe ich MapFragment anstelle von SherlockFragment (I Verwenden Sie ABS) .. das warf dann nur Logcat Fehler nach API-Schlüssel fragen etc .. und da ich nicht Google Kartendaten verwenden möchte, nahm ich an, dass ich falsch gegangen war.

Also ... könnte jemand beraten, wie ich ein Listenfragment bekommen kann, und ein Kartenfragment Seite an Seite mit allem, was auf dem Markt verfügbar ist, aber vorzugsweise mit Open-Source-Kartendaten, so dass sie keine Nutzungseinschränkungen sind.

Ich bin mir sicher, dass ein Gesamtüberblick über "was ist verfügbar und wie es funktioniert" würde sehr geschätzt von vielen Benutzern .. also wenn jemand beraten könnte, wäre es erstaunlich!

+0

Es gibt keinen Schaden, wenn Ihr ihre Daten nicht überprüfen verwenden würde. aus diesem Überlauf http://stackoverflow.com/questions/13695393/open-street-maps-with-android-google-maps-api-v2 – qubz

+0

Es scheint wie der Weg zu gehen, aber ich suche nach einer tiefer gehenden Erklärung B. wie würde ich eine Karte mit Open-Source-Kacheln in ihrer einfachsten Form implementieren? und wie in dieser Frage erwähnt - gelten Einschränkungen der API-Nutzung weiterhin. Im Wesentlichen möchte ich eine ausführlichere Erklärung mit dieser Frage als eine Basis .. Prost. –

+0

Da es mit dieser neuen API schon früh losgeht, ist es höchst unwahrscheinlich, dass ein Leitfaden/Beispiel/Tutorial über die osm/osmdroid-Integration geschrieben wurde. Dies wird sich wahrscheinlich mit der Zeit ändern. – qubz

Antwort

11

Bevor das neue Google Maps-API herauskam, war ich gezwungen, OSMDroid für meine Zwecke zu verwenden. Aber nachdem ich mehrere Male durch die Quelle gegraben hatte, um herauszufinden, warum es das tat, was es war (oft falsch), starb ich für eine neue Bibliothek.

Zum Glück passt das neue Google Maps API. Sie können das Google Maps API v2 in Ihrer Anwendung verwenden und müssen niemals Google Grundkarten verwenden, aber ja, Sie müssen zuerst einen API-Schlüssel erhalten.

Ich gehe davon aus, dass Sie OpenStreetMap als Online-Kartenquelle verwenden möchten, daher wird der folgende Code darauf zugeschnitten sein.

GoogleMap map = <get-map-instance>; 

map.setMapType(GoogleMap.MAP_TYPE_NONE); 

TileOverlayOptions options = new TileOverlayOptions(); 

options.tileProvider(new UrlTileProvider(256, 256) { 
    @Override 
    public URL getTileUrl(int x, int y, int z) { 
     try { 
      String f = "http://tile.openstreetmap.org/%d/%d/%d.png"; 
      return new URL(String.format(f, z, x, y)); 
     } 
     catch (MalformedURLException e) { 
      return null; 
     } 
    } 
}); 

map.addTileOverlay(options); 

Sie können here eine formalisierte Version dieser Code in meinem Google Maps-API v2 Add-ons Bibliothek.

Wenn Sie Pre-Fragment-Android-Versionen verwenden, von denen ich glaube, dass Sie auf ABS basieren, anstatt MapFragment zu verwenden, stellen Sie sicher, dass Sie SupportMapFragment verwenden.

+0

So .. es hat mich 4 Stunden Spielzeit - aber das funktioniert :) Nur etwas falsch ist AddTileProvider sollte addTileOverlay sein .. Könnten Sie vielleicht auf Ihre Osmdroid Entscheidung/Fragen näher ausführen? Auch - Ich habe OSM-Overlays, aber das Google-Logo wird immer noch in der Ecke angezeigt. Wissen Sie, was in Bezug auf die Zuordnung zu OSM erforderlich ist, da ich immer noch Google Maps verwende? Außerdem würde ich annehmen, dass ich noch an ihre Nutzungsbeschränkungen gebunden bin? Negation eines der wichtigsten Vorteile von OSM Egal, sehr geschätzt - vielen Dank !! –

+1

Das Google-Logo ist meiner Meinung nach ein Fehler, und ich habe hier ein Problem gemeldet: http://code.google.com/p/gmaps-api-issues/issues/detail?id=4648. In Bezug auf, warum nicht OSMDroid, im Grunde auf Leistung, Fehler und fehlende Dokumentation gekürzt. Wenn Sie wissen wollen, warum Sie selbst, durchsuchen Sie die Quelle und sehen Sie, wie viele No-Ops Sie finden, mit einem // TODO Kommentar in ihnen. ;) – cocoahero

+1

Habe mich auch mit Problemen mit OSMdroid beschäftigt und überlege mir diese Nutzung an. Wie funktioniert das jetzt, wo du etwas Zeit gehabt hast? – Patrick

3

Die mit Google Maps Android API v2 ausgelieferte Sample Code enthält die Klasse com.example.mapdemo.TileOverlayDemoActivity. Ein kleines Update für diese Klasse zeigt OpenStreetMap-Kacheln innerhalb des neuen v2-Frameworks. Cool! Keine Notwendigkeit, Osmdroid oder Sherlock-Fragmente mehr zu verwenden. Jedoch...Die Fliesen werden nicht zwischengespeichert :(

, sowieso alle Ergänzungen/Aktualisierungen der TileOverlayDemoActivity Klasse sind unten dargestellt:

in immer einen API-Schlüssel
private static final String OPEN_STREET_MAP_URL_FORMAT = 
     "http://tile.openstreetmap.org/%d/%d/%d.png"; 

private void setUpMap() { 
    mMap.setMapType(GoogleMap.MAP_TYPE_NONE); 
    mMap.setMyLocationEnabled(true); 

    TileProvider tileProvider = new UrlTileProvider(256, 256) { 
     @Override 
     public synchronized URL getTileUrl(int x, int y, int zoom) { 
      String s = String.format(Locale.US, OPEN_STREET_MAP_URL_FORMAT, zoom, x, y); 
      URL url = null; 
      try { 
       url = new URL(s); 
      } catch (MalformedURLException e) { 
       throw new AssertionError(e); 
      } 
      return url; 
     } 
    }; 

    mMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider)); 
}