Java Android - osmdroid nur bestimmte "Ebenen" anzeigen?

dsTny

Ensign
Registriert
März 2009
Beiträge
154
Hallo an alle :)

Ich brauche mal eure Hilfe für eine App, die unsere Gruppe im Studium entwickelt. Es geht darum, dass eine Karte mittels osmdroid angezeigt wird (also auf OSM basiert).

Wenn ich richtig informiert bin, gibt es in OSM die Möglichkeit, sich nur bestimmte "Ebenen" (zum Beispiel Wälder, Straßen, usw.) zu holen und nicht immer alles in einer Karte anzeigen zu lassen.
Geht das mit osmdroid und wenn ja, wie? Wenn es mit osmdroid nicht funktioniert, geht das mit einer anderen API (die jedoch das Kartenmaterial von OSM haben muss)?

Ich hoffe, die Problematik ist soweit verständlich.


Danke im Voraus für alle hilfreichen Antworten :)
 
Overlay ist hier das Zauberwort. Zu diesem Zweck gibt es eine eigene Klasse mit der Bezeichnung OverlayManager. Dort existiert unter anderem die Funktion:
Code:
public void addOverlay(Overlay overlay) {
   ...
}

Ich denke das reicht als Einstieg aus, um sich selbstständig weiter in die Materie einzuarbeiten. Immerhin seid ihr ja Studenten ;)
 
Hallo und herzlichen Dank für deine Antwort.

Den OverlayManager benutzen wir bereits für unsere eigenen Icons (die für Ressourcen stehen), die wir auf der Map darstellen (siehe Beispielbild unten). Diese Icons wurden auf den Server mit hardgecodeten long/lat-Angaben auf MySql eingepflegt. Dies soll nun aber verändert werden, indem die Icons dynamisch gesetzt werden. Deshalb müssen wir automatisiert erkennen, was auf der momentan im Screen angezeigten Map-Ausschnitt ein Wald, ein Fluss, usw. ist. Und meine Frage dazu ist, wie ich sowas machen kann? Kann ich OSM bitten, mir nur bestimmte "Layer" zu geben oder kann ich auf der "Map" die einzelnen "Layer" rausfiltern lassen?
Falls dieses Problem auch mit dem OverlayManager zu lösen ist, bitte ich nochmals um etwas Nachhilfe. Denn mit Google und Tutorials durchlesen komme ich nicht auf die Lösung des Problems :/

Danke nochmals!

Anhang anzeigen 332248
 
OK, hier habe ich mal einen Code-Ausschnitt von Stackoverflow:

Code:
//create the first tilesOverlay
final MapTileProviderBasic tileProvider = new MapTileProviderBasic(getApplicationContext());
final ITileSource tileSource = new XYTileSource("MyCustomTiles", null, 1, 16, 256, ".png",
        "http://a.url.to/custom-tiles/");
tileProvider.setTileSource(tileSource);
final TilesOverlay tilesOverlay = new TilesOverlay(tileProvider, this.getBaseContext());
tilesOverlay.setLoadingBackgroundColor(Color.TRANSPARENT);

//create the second one
final MapTileProviderBasic anotherTileProvider = new MapTileProviderBasic(getApplicationContext());
final ITileSource anotherTileSource = new XYTileSource("MyCustomTiles", null, 1, 16, 256, ".png",
        "http://a.secondurl.to/custom-tiles/");
anotherTileProvider.setTileSource(anotherTileSource);
final TilesOverlay secondTilesOverlay = new TilesOverlay(anotherTileProvider, this.getBaseContext());
secondTilesOverlay.setLoadingBackgroundColor(Color.TRANSPARENT);

// add the first tilesOverlay to the list
osmv.getOverlays().add(tilesOverlay);

// add the second tilesOverlay to the list
osmv.getOverlays().add(secondTilesOverlay);

So könnt ihr eine eigene Karte aus mehreren transparenten Layern zusammenbasteln. Das eigentliche Problem ist allerdings, die dafür notwendigen Layer irgendwo zu finden (in dem Beispiel steht ja nur http://a.url.to/custom-tiles/) -- ihr braucht also quasi für jeden Layer eine eigene URL. Da kann ich euch persönlich nicht weiter helfen. Das beste was ich gefunden habe, ist diese Übersicht. Außerdem kommt das Problem hinzu, dass diese Art der Darstellung wohl sehr viel Speicher und Performance benötigen wird. Evtl. bekommt ihr dann OutOfMemory Exceptions.

Nun zu der Thematik: "Automatisch erkennen, was wo ist". Kurz gefasst: Sehr schwierig. Diese Art der Darstellung per Tile Map Server wurde extra mit dem Gedanken entwickelt, die "Arbeit" auf den Server auszulagern und dem Client -- der meißt nur über beschränkte Speicher-/Rechenkapazität verfügt -- nur fertige Bilddateien (die Tiles) zu schicken (im Gegensatz zu vektorbasierten Daten, die vom Client erst selbst gezeichnet werden müssten). Die einzige Möglichkeit, herauszufinden welcher Objekttyp bei Koordinatenpaar (x,y) ist, wäre in jedem Layer nacheinander zu schauen, ob der Pixel der an dieser Stelle ist, transparent ist oder nicht. Ihr könntet dann ein Punktegitter mit bspw. 50 Pixeln Abstand definieren und jeweils diesen beschriebenen Test machen. Das kommt dann darauf an, wie exakt ihr arbeiten wollt, bzw. wird es auch eine Frage der Performance sein. Grundsätzlich ist das nicht wirklich eine schöne Lösung, aber die einzige, die mir momentan dazu einfällt.
 
Zurück
Oben