Codeoptimierung um die Effizienz zu erhöhen

  • Ich habe eine generelle Verständnisfrage. Und zwar, ist es ressourcenfreundlicher und effizienter bei der implementierung einer App, wenn man extra Klassen für Methoden (es sind jetzt nicht alle Methoden gemeint) erstellt (also die aufgaben in klassen aufteilen)? Also ich habe nämlich eine App programmiert, die aus 9 Klassen besteht. Eine der Klassen ist die MainActivity. Diese enthält die meisten Methoden. Die app nutzt einen Mediaplayer bzw. google maps v2 für eine ortsbestimmung, gesteuert alles durch die MainActivity. Hinzukommt, dass aus der MainActivity ein Thread im hintergrund parallel ausgeführt wird (für internetabfragen und zwar jede sekunde, da ich requestLocationUpdates auf 0 gesetzt habe, jetzt habe ich aus auf 5 sekunden eingestellt). Das ist sehr rechenintensiv und nutzt viel energie, was verständlich ist. Aber es gibt andere Apps, wie z.b. navigon, welches auch jede sekunde die ortspositionen aktualisiert, warnungen gibt etc. etc. Solche apps laufen ziemlich gut und flüssig auf meinem smartphone. Und obwohl ich für das Testen meines apps auch den Galaxy S2 nutze, dessen Rechenleistung ziemlich gut ist, laggt es wie sau. Daher meine Frage. Kann das daran liegen, das alles aus der einen Klasse gesteuert wird oder macht das keinen unterschied? Kann natürlich auch an meiner Programmierung selbst liegen. Ich bin ja nicht so der programmier-experte (das habt ihr bestimmt an meinen erstellten themen bereits festgestellt :) ) und weiß daher nicht ob ich das so gut hingekriegt habe. Funktionieren tut es zumindestens, aber ist halt seeeehr rechenintensiv was das interagieren mit dem user beeinträchtigt. Wie könnte man dagegen vorgehen? Gibt es eventuell irgendwelche Tipps, tutorial etc. für die Programmierung der oben genannten Funktionen, die die Rechenleisung nicht auf ein maximum stellen?


    Danke im Voraus

  • Hallo CdWechsler,

    Zitat

    Die app nutzt einen Mediaplayer bzw. google maps v2 für eine ortsbestimmung,

    dass du einen Mediaplaver für die Ortsbestimmung nutzt hat mich sehr erstaunt.


    Für die Ortsbestimmung würde ich mit einem LocationProvider nur dann reagieren, wenn sie die GPS Daten ändern, also über onLocationChanged(). Dann könne man darin auch noch einen einfache Zeitspannenabfrage setzen, (keinen Timer) so dass man die Daten nur alle etwa 10 Sekunden überhaupt anschaut un berechnet.


    Hoffe, dir etwa geholfen zu haben, schymura ^^

  • hally schymura,


    danke für deinen post. Ne ne... ich habe mich falsch ausgedrückt. was ich sagen wollte ist, dass die app generell musik abspielt als auch den standort über eine karte anzeigt. der standort wird natürlich über onLocationChanged() aktualisiert, das ist standart :) . Was ich sagen wollte ist, das wenn die app läuft, 1. der standort über eine karte angezeigt zudem 2. musik abspielt und 3. eine internetabfrage gemacht wird. Alles parallel. ich nutzte auch eine swipeview, womit ich zwischen zwei ansichten, indem fall einer karte und einem mediaplayer, wechseln kann. der mediaplayer enthält auch eine seekbar, welches beim abspielen eines musikstückes sich bewegt. wie gesagt, geschieht das alles parallel. Daher ist mir auch klar warum das so rechenintensiv ist. Aber bestimmt könnte man hier und da noch etwas schleifen.

  • Hallo CdWechsler,
    vielleicht bin ich ja zu sehr Minimalist, aber als erstes würde ich darauf verzichten darzustellen wie weit der Mediaplayer das Muskstück abgesielt hat. Finde ich nicht gerade intressant, denn wenn ich Musik höre, dann weiss ich ja, wann ein neuer Titel beginnt.
    Zweitens würde ich nicht auf jedes onLocationChanged() reagieren, sondern erst nach einer bestimmten Zeitspanne, das vermindet die CPU-Belastung enorm und auch das erneute Darstellen der Position auf dem Screen bringt Erleichterung.
    Die Internetabfrage fällt da schon nicht mehr so sehr ins Gewicht, wenn sie nicht bei jedem onLocationChanged() erneut gemacht wird......


    Schöne Grüße, schymura ^^

  • Hallo schymura,


    da wir jetzt von der onlocationchanged()-Methode reden, wie würde denn diese reagieren, wenn ich in die lochationmanager.requestLocationUpdates(provider, 0, 0, locationlistener) - methode für die erste null 6000 und für zweite 30 eintrage? die 1. zahl ist ja long minTime (in millisekunden). die 2. float minDistance (in metern). Wenn ich jetzt nur die 6000 eintrage, dann reagiert der locationmanager alle 6 sekunden. Wenn ich nur die 30 eintrage alle 30 meter. Und was passiert wenn ich beides eintrage? Wird dann gecheckt, welches der beiden zutrifft?

  • Hoi,


    also grundsätzlich sollte alles, was rein logisch zusammen gehört, natürlich auch in einer eigenen Klasse sein. Falls das Vorhaben etwas größer wird lohnt es ein Package zu machen und dort noch weiter zu zerteilen, z.B. eine Bean um die Daten zu halten und einen Handler um bequem damit zu arbeiten. So würde man das simple halten der Daten von der Logik trennen und es ist übersichtlicher.


    Ich baue alle meine Apps und Anwendungen nach so einem Schema auf und fahre damit recht gut. Ineffizient wird es erst dann, wenn man Objekte hat, die recht große Daten halten oder lange Listen von Objekten entstehen, die über ein paar Hundert hinaus gehen. Da wirds halt dann etwas eng mit dem RAM ;)



    Wenn man wie du mehrere Sachen parallel machen will, lohnt es glaub ich sich mal so ganz allgemein und grundsätzlich über Services zu informieren, vielleicht lässt sich da ja noch was verbessern.


    Das Ganze hat natürlich auch seine Grenzen, denn wenn man ein Gerät mit nur einem Kern hat, kann man nicht 3 Sachen parallel machen. Hier könnte man evtl. drauf abfragen und vll. sogar einen ThreadPool einbauen und mittels Executor die Arbeit erledigen. Könntest z.B. deine Internet-Zugriffe in den Executor werfen und der macht dann, wenn er Zeit dafür hat.



    Gruß,
    matze

  • Hallo CdWechsler,

    Zitat

    wie würde denn diese reagieren, wenn ich in die lochationmanager.requestLocationUpdates(provider, 0, 0, locationlistener) - methode für die erste null 6000 und für zweite 30 eintrage?

    das kann ich dir nicht sagen, denn bisher habe ich noch keine GPS App gemacht, interssiert mich nur, weil ich auch mal eine machen möchte.
    Aber vermutlich würde ich garnicht so einen großen Ansatz machen, sondern einfach vorher eine Long Vaiable setzen,

    Code
    long  ablauf_Millisekunden=System.currentTimeMillis()+10000; // 10 Sekunden


    die ich dann in der onLocationChanged() abfragen würde und nur dann reagieren, wenn die Zeit abgelaufen ist, ansonsten ohne Reaktion zurück.
    Falls die Zeit um ist kann ich dann ja auf räumliche Änderung prüfen wenn ich will usw.
    Aber auf jeden Fall die ablauf_Millisekunden neu setzen.


    Nach dem Lesen von
    http://developer.android.com/r…tion/LocationManager.html

    Zitat

    The minDistance parameter can also be used to control the frequency of location updates. If it is greater than 0 then the location provider will only send your application an update when the location has changed by at least minDistance meters, AND at least minTime milliseconds have passed. However it is more difficult for location providers to save power using the minDistance parameter, so minTime should be the primary tool to conserving battery life.

    meine ich nun, das die Mindestdistanz und die Mindestzeit eingeht.


    Schöne Grüße, schymura ^^

  • Moin,


    also ich persönlich habe die Feststellung gemacht, dass Performanceprobleme immer und ausschließlich an mir liegen. ;)
    Und auch bei dir würde ich behaupten, dass das Problem nicht die Aufteilung der Klassen ist.
    Ich persönlich versuche ja, die Apps auf den langsamsten und grottigsten Geräten zügig zum Laufen zu bekommen und dem User möglichst nicht mit irgendwelchen Dingen auf die Nerven zu gehen.


    Insofern sehe ich in deinem Konzept schon einmal mindestens zwei Fallstricke, die ich meinen Usern nicht zumuten möchte.


    1) Du machst viel über das Internet. Sehr viel. Verdammt viel. Viel zu viel.
    Wenn ich deinen Mediaplayer jetzt im Ausland nutzen möchte, dann werde ich dabei vermutlich arm. Die Kosten für Auslandsroaming werden mich auffressen.


    2) Weiterhin ist das Gerät nur am Arbeiten, permanent. Wenn der wirklich 1x je Sekunde $irgendwas im Netz macht, dann braucht er dafür Strom (den Datenteil des GSM-Modems starten und verwalten), RAM (die Connection speichern, Daten holen, die noch verarbeiten) und CPU Leistung. Alles in Allem also alles Andere als performant.


    Navigon und Konsorten rufen die Ortsbestimmung ab, doch das geschieht über Location Services, nicht über das Internet. Generell ist es so, dass das GPS Modem im Hintergrund agiert, sobald eine App darauf zugreift. Das ist völlig okay und der Stromverbrauch ist konstant hoch. Das wird nicht weniger, wenn du einen Zeitintervall einstellst. GPS funktioniert nur mit permanenter Verbindung. Die Timeouts, die du einstellst, sind lediglich Schwellwerte an denen das Betriebssystem dir die neuen Daten mitteilt. Ob du jetzt jede geänderte Location mitnimmst oder dich nur alle 15 Minuten informieren lässt ist irrelevant für den Stromverbrauch des GPS Modems.

    Doch natürlich sieht das Ganze komplett anders aus, wenn du nur alle 15 Minuten mal mit Google quatscht um die Position anzeigen zu lassen oder ob du das jede Sekunde tust. Deine Internetlastigkeit dürfte hier das Hauptproblem sein.


    Was bezweckst du eigentlich genau mit dieser App?
    Mein erster Gedanke wäre, eine Art Kombiapp für Jogger anzubieten. Einerseits ein Musikplayer und andererseits können sie ihre Laufstrecke per GPS tracken.
    In dem Fall wäre natürlich der Medienplayer als Service eine gute Idee. Gibt es da keine fertige Komponente im OS?
    Und in dem Fall bräuchtest du auch überhaupt keine Map mitlaufen lassen. Das wird den Jogger ebenso wenig interessieren wie die Position des aktuellen Titels.
    (Auf seiner Strecke sieht er ungefähr wie weit er ist und bei seinem Titel hört er es vermutlich ungefähr, da er ja seine bekannte Joggingliste abspielt.)
    Das Speichern der GPS-Koordinaten würde trotzdem funktionieren und am Ende kann er das ja meinetwegen als GPX oder KML exportieren und sich online oder mit Google Earth anschauen.


    Wie dem auch sei, hier Tipps zu geben wird schwierig, wenn man das Anwendungsgebiet deiner App nicht kennt. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo leude,


    danke für eure posts :)


    Also den MediaPlayer als Service zu nutzen ist wahrscheinlich eine bessere Idee. Müsste mich mal in Services reinarbeiten. Und der Mediaplayer greift auf ressourcen-interne datein zu. Also kein musikstreaming aus dem internet oder sowas und auch kein zugriff auf sdcard-datein. Habe jetzt grob nur zum testen im res/raw-ordner ein paar Musikstücke (10 tracks) gepackt, auf die der Mediaplayer zugreift. Aus dem Internet hole ich mir lediglich nur Umfeldinformationen. In welchen Abständen diese Abfragen gemacht werden, hängt von der Einstellung der requestLocationUpdates()-Methode ab. Am anfang hatte ich es halt auf 0 gesetzt, d.h. jede Sekunde eine Anfrage. Ok, das war eigentlich nicht nötig und überlüssig zugleich, weil die App sozusagen erst Musikstücke automatisch abspielt, wenn die Informationen aus dem Netz abgerufen wurden. Und wenn ich am einem Punkt verharre, ist es auch nicht nötig die gleichen parameter aus dem Netz zu ziehen. Daher habe ich jetzt minDistance eingestellt (werde ich später mal testen :) ).


    @lucas:

    Zitat

    Navigon und Konsorten rufen die Ortsbestimmung ab, doch das geschieht über Location Services, nicht über das Internet.

    das tue ich doch auch. Also kein Internet. Daher habe ich mich doch gewundert.


    Aber das du folgendes gemeint hast ist doch ein interessanter Punkt:

    Klingt eingentlich nachvollziehbar und logisch. Weil aus einem Buch habe ich entnommen, dass der stromverbrauch auf ein maximum ist, wenn die werte auf 0 gesetzt sind, weil die aktuelle position so oft wie möglich gegeben wird. Jetzt wird mir doch einigeres deutlicher ;)


    danke danke danke. Ich werde es mal ausprobieren und poste meine resultate ;)

  • Also ich habe folgendes mal ausprobiert. Wie ihr bereits gesagt habt, habe ich in der onLocationChanged()-Methode viel zu viele aufgaben bzw. aufrufe gehabt, die so oft wie möglich durchgeführt wurden. der UI-thread war daher zu sehr ausgelastet und deshalb ziemlich laggy. Habe daher einiges in AsyncTasks eingebaut um den uithread zu entlasten bzw. das diese dann auch parallel laufen. die updates sollten zudem alle 6 sekunden gemacht werden. Bin dann etwas durch die gegend gecruiset um zu testen, ob es immer noch laggy ist. Und siehe dar, es funzte diesmal ziemlich gut und viiieeel flüssiger. Das Resultat hat mich sehr erfreut. Zudem muss ich sagen, dass asynctasks generell doch eine bessere Variante sind als threads. Mit besser meine ich jetzt die IMplementierung. Finde ich einfacher :) . Ich werde es mal noch den Mediaplayer in einen service packen. vielleicht kann man von der effizienz noch etwas mehr rausholen. Danke auf jeden fall für die tipps, ratschläge und hilfsbereitschaften. Alter.. ihr seid die besten. (yippi ya yeah) ;)

  • Hallo CdWechsler,

    Zitat

    Das Resultat hat mich sehr erfreut.

    freut micht auch.


    Im Zusammenhang mit GPS mal eine Frage:
    Was für ein Kartenmaterial sollte man benutzen? Google Map oder OpenStreetMap?
    Wie berechnet man bei Vektorkarten was und wie man den Kartenauschnitt(Tiles) anzeigt?


    Schöne Grüße, schymura ^^

  • [CdWechsler]
    Das sind doch gute Nachrichten. :)


    [schymura]
    Nun, das Hauptproblem bei deiner Frage ist, dass es sich rein rechtlich nicht um GPS handelt.
    Die Kartendarstellung ist halt so ein spezielles Problem.


    Google Maps bietet seinen Kartenservice soweit ich informiert bin nur über die eigenen Apps an. Wer sonst irgend welche Karten benötigt, darf sie nicht einfach rauskopieren und woanders benutzen.
    Noch ein bisschen härter ist der Fall bei OpenStreetMaps. Dort sind nur die Geodaten offen, die Karten unterliegen anderen und je nach Hersteller speziellen Bedingungen. Leider habe ich grad 0 Übersicht, welcher Kartenanbieter welche Lizenz bedingt.


    Was die Umrechnung betrifft:
    zumindest für OpenStreetMap gibt es da eine Anleitung, wie aus den Positionsdaten die Pfade zu den Bildern erstellt werden können.
    http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Java

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Also ich zitiere mal aus einem Buch:

    Man kann beide Karten nutzen. Ich habe es mal mit osm versucht und auch hingekriegt und nun auch mit google maps v2. Wie im Zitat steht braucht man für die Nutzung des google maps einen API-KEy. Diesen bekommst du bei googel-apis-console. Dafür brauchst du wiederum einen google-account. Dort wird ein key generiert, indem du einen SHA1-Zertifikat Fingerabdruck und dem paketnamen deines android-projektes einträgst. Diesen key musst du dann in die manifest.xml eintragen etc. etc. etc.
    hier gibt es eine step-by-step anleitung:

    HTML
    http://android-er.blogspot.de/2012/12/a-simple-example-using-google-maps.html


    HTML
    https://developers.google.com/maps/documentation/android/


    Dort stehen auch die Bedingungen für die Nutzung von GoogleMaps.
    Für mich war es am Anfang voll kompliziert, bis man das alles konfiguriert hat und so... voll der Film. Bei OSM machst du solche sachen nicht und benötigst lediglich nur eine Bibliothek des kartenmaterials. Da gibt es halt z.b. mapsforge, osmdroid... Von der Implementierung her war es für mich für die darstellung einer karte mit osm vieeeel einfacher. Der Aufwand ist auf jeden fall geringer (meine meinung). Bei osm brauchst du soweit ich weis keine lizenz. Musst du auf jeden mall testen. Mal mit osm und mal mit google maps v2 um selber einen Eindruck zu gewinnen. Im Internet gibt es etliche (video-)tutorials.


    Zitat

    Wie berechnet man bei Vektorkarten was und wie man den Kartenauschnitt(Tiles) anzeigt?

    was für berechnungen meinst du?


    grüße

  • Hallo Lucas de Vil und CdWechsler,


    Lucas de Vil:

    Zitat

    Dort sind nur die Geodaten offen, die Karten unterliegen anderen und je nach Hersteller speziellen Bedingungen.

    Ja, die Geodaten sind frei, und die Kacheln (Tiles) snd es auch. Nur wenn man sie irgendwo als Bild veröffentlicht, muss man das Copyrigth reinschreiben.


    Der Link von dir ist gut, die Rechnung funktioniert auch sehr gut! Hatte ich auch 2010 schon so gemacht, nur leider sind das die Kartenteile........
    Und ich möchte zumindest auf nem Smartphone mit Kacheln abrbeiten, denn die brauche viel zu viel Speicherplatz....
    Und online ist auch keine gute Idee für mich, denn ich möchte die App, die mir vorschwebt vor allem im Wald und in Tälern benutzen, allerdings auch in Ortschaften.



    CdWechsler:

    Zitat

    was für berechnungen meinst du?

    ich meine, wie komme ich bei Vektorkarten, die es ja etwa bei http://download.geofabrik.de/ als osm.pbf-Dateien gibt frei und die nur etwa 10% des Speicherplatzes wegnehmen aus der GPS-long, bzw. lat Angabe erstnes zu der betreffeden PBF-Datei und zweitens, wie muss ich mit den Daten dann ev. noch die Karte rendern????


    Wie gesagt, online ist keine Alternative.
    Bisher habe ich mit OSMAND gearbeitet (beim wandern). Gefällt mir auch sehr gut, man kann es wirklich offline benutzen (selbst im Fluzeugmodus), wenn man vorher die Vektorkarten vom PC aus Smartphone geschoben hat. Der GPS-Empfänger verbraucht nicht viel Strom, dumm ist nur, da ja OSMAND ein Navi ist, dass die ganze Zeit der Screen an bleibt, außer man schaltet das Programm ab.


    Dankbare Grüße, schymura ^^

  • Hallo Lucas de Vil und CdWechsler,


    Lucas de Vil:

    Ja, die Geodaten sind frei, und die Kacheln (Tiles) snd es auch. Nur wenn man sie irgendwo als Bild veröffentlicht, muss man das Copyrigth reinschreiben.


    Ich fürchte, wir reden hier aneinander vorbei.
    Die Kacheln gibt es in unterschiedlichen Ausführungen. Die einen Tiles sind Graphiken, Images, Bilder... was auch immer. Also binäre Datenformate mit Repräsentationen der OSM Daten. Und diese sind nicht frei.


    Deine PBF Dateien sind nichts weiter als die reinen OSM Daten im Protocollbinary Buffer Format.
    http://wiki.openstreetmap.org/wiki/DE:PBF_Format


    Es gibt keine Vectorgraphiken. Du hast nichts weiter als die XML-Daten von OSM stark komprimiert.


    Und ich möchte zumindest auf nem Smartphone mit Kacheln abrbeiten, denn die brauche viel zu viel Speicherplatz....
    Und online ist auch keine gute Idee für mich, denn ich möchte die App, die mir vorschwebt vor allem im Wald und in Tälern benutzen, allerdings auch in Ortschaften.


    Sehr löblich. Ich habe allerdings keine 64GB µSD Karte, auf der ich die Kacheln unterbringen könnte. ;)
    Genau genommen habe ich nicht einmal eine 8GB µSD Karte... :-/


    ich meine, wie komme ich bei Vektorkarten, die es ja etwa bei http://download.geofabrik.de/ als osm.pbf-Dateien gibt frei und die nur etwa 10% des Speicherplatzes wegnehmen aus der GPS-long, bzw. lat Angabe erstnes zu der betreffeden PBF-Datei und zweitens, wie muss ich mit den Daten dann ev. noch die Karte rendern????


    Ich wiederhole mich an dieser Stelle gern, weil es so wichtig ist.
    1) Du hast keine Vektorkarten. Bei dem Link gibt es keine freien Vektorkarten. Du bekommst die OpenStreetMap Daten in einem stärker komprimierten Format als XML. Dennoch bekommst du nur und ausschließlich die OpenStreetMap Daten!


    2) Daraus folgt: du kannst nicht an Hand einer Latitude/Longitude Angabe irgendwelche Dinge aus den Daten ziehen. Vielmehr müsstest du die Datei komplett parsen (Das wird bei 10GB allein für Deutschland ein weniglich dauern...) und dann on-the-fly Bilder daraus rendern.
    Das wird sicherlich keine Hardware mitmachen.


    Bisher habe ich mit OSMAND gearbeitet (beim wandern). Gefällt mir auch sehr gut, man kann es wirklich offline benutzen (selbst im Fluzeugmodus), wenn man vorher die Vektorkarten vom PC aus Smartphone geschoben hat. Der GPS-Empfänger verbraucht nicht viel Strom, dumm ist nur, da ja OSMAND ein Navi ist, dass die ganze Zeit der Screen an bleibt, außer man schaltet das Programm ab.


    OSMAND klingt erst einmal gut. Welche Vektorkarten hast du denn vom PC aus aufs Smartphone geschoben?
    Ebenfalls die unglaublich große OSM-Daten beinhaltende .pbf Datei? Oder hast du mit zusätzlichen Programmen daraus Karten rendern lassen?


    Also wenn du eh ~10GB Platz auf der SD-Karte voraussetzt (um die .pbf darauf zu bekommen), dann kannst du dich auch an TileMill setzen und die Tiles selbst erstellen sowie auf die SD packen lassen.
    Da kommt dann wieder die Betitelung der Ordner an die Oberfläche und schon kann man mit vorhin verlinktem Algorithmus die Daten herausfinden.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Lucas de Vil,


    Zitat


    Sehr löblich. Ich habe allerdings
    keine 64GB µSD Karte, auf der ich die Kacheln unterbringen könnte.
    ;)
    Genau genommen habe ich nicht einmal eine 8GB µSD Karte... :-/


    Der Gedanke war mal schneller als die
    Finger bei meiner Aussage:
    "Und ich möchte zumindest auf nem
    Smartphone mit Kacheln abrbeiten, denn die brauche viel zu viel
    Speicherplatz...."
    Ich hatte tatsächlich ein wichtige
    Wort vergessen: NICHT!



    Ich habe bei http://code.google.com/p/osmand/downloads/list alle Germany_........obf.zip
    Dateien heruntergeladen, diese dann entpackt, alle *.obf Dateien auf
    die SD-Karte vom Smartphone ins Verzeichnis OsmAnd kopiert (zusammen
    etwa 2,76 GB) und anschließende dann OSMAND gestartet. Die App
    „indizierte“ dann alle 16 Dateien, dauerte etwa 10 Sekunden).
    Solange es keine neuen obf - Dateien dort gibt entfällt das „indizieren“.


    Das ist dann die Daten der Vektorkarte für ganz Deutschland.........


    OSMAND arbeitet mit diesen Daten ohne
    jeglichen Versuch irgendwas nachzuladen.


    Noch eine Info: Nach Aussage der Leute
    von geofabrik.de sind
    diese obf-Dateien nichts anderes als die .pbf- Dateien, die ein wenig
    angepasst sind.



    Also muss es eine Möglichkeit geben
    aus den Daten (im Fluge) die Karten zu erstellen. Nur wie das geht,
    das weiß ich noch nicht........

    Zitat

    Die einen Tiles sind Graphiken, Images, Bilder... was auch immer. Also
    binäre Datenformate mit Repräsentationen der OSM Daten. Und diese sind
    nicht frei.

    Hier nur kurz der Text bei http://wiki.openstreetmap.org/wiki/DE:OpenStreetMap_License


    Schöne Grüße, schymura ^^

  • Die pbf von Deutschland sind aber schon mal 10GB, die bekomme ich auf meiner externen Karte nicht unter.
    Vom internen Speicher reden wir mal gar nicht erst.


    Leider sind die Wiki–Seiten gerade nicht erreichbar.
    Nichts desto weniger ist dieses obf dann auch nur ein optimiertes Binärformat der OpenStreetMap Daten und erst einmal keine Vektorkarte. ;)


    Vermutlich wird OsmAnd die Karten on-the-fly durchrendern, da zumindest gemäß Exportlog diverse Informationen mit in dieses Format eingeflossen sind.
    Zum Beispiel sieht man, dass diversen Stadtteilen Polygone zugeordnet wurden, welche im pbf vermutlich nicht vorkommen.


    Wie geschrieben habe ich leider keinen Zugriff auf die WiIki-Seiten von OpenStreetMap. Insofern kann ich auch das Datenformat nicht überblicken.
    Ich habe gerade mal den OsmAndMapCreator ausprobiert und was soll ich sagen?
    Der legt mir dann einen Tiles-Ordner neben der .obf an, welche MapNik Render in der bereits zu Anfang genannten Ordnerstruktur aufweist.
    Mapnik/zoom/x/y.png.tile


    Guatemala war jetzt vielleicht nicht die beste Wahl, aber dafür recht klein und die Tiles sind im PNG-Format 780kB groß (während die osm.pbf 3,9MB groß war)


    Dass es jetzt nur die Dateien 'indiziert' hat, und dann auch noch so schnell, spricht gegen die Live-Rendering-Theorie.
    Andererseits berechnet sich vielleicht ein Algorithmus Größe und Zoomlevel der aktuellen Karte und rendert es dann heraus. Mit einer Bounding Box über meinetwegen 700 Einzelkoordinaten und einem vernünftigen Parser könnte das ziemlich zügig gehen und vernünftige Ergebnisse liefern.


    Leider habe ich keine Zeit da etwas auszuprobieren. -.-
    Und obwohl OsmAnd eine Google Code Seite hat gibt es kein sichtbares Repository zum Schnüffeln.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Lucas de Vil

    Zitat

    Die pbf von Deutschland sind aber schon mal 10GB, die bekomme ich auf meiner externen Karte nicht unter.

    die 16 pdf-dDateien aller deutschen Bundesländer, die ich am 4.4.13 von geofabrik.de runter geladen habe sind zusammen wirklich 1,52 GB groß, jedoch keine 10 GB.

    Zitat

    Vermutlich wird OsmAnd die Karten on-the-fly durchrendern, da zumindest gemäß Exportlog diverse Informationen mit in dieses Format eingeflossen sind.

    Das vermute ich auch...
    Da OsmAnd jedoch auch ein Opersoure ist werde ich mir mal deren Code genauer anschauen, um zu sehen, was die da so machen....


    Hier dann noch ein Link ftp://ftp.informatik.uni-stutt…_fi/DIP-3328/DIP-3328.pdf zur .osm.pdf Datestruktur.


    Schöne Grüße, schmyura ^^

  • Oops, hatte statt Deutschland Europa genommen. +hust+
    Dass auch die kleineren Daten weder in meinen internen Speicher noch auf meine µSD passen, lasse ich jetzt mal außer Acht.
    (900MB/500MB)


    Na, das Dokument zeigt es doch ganz eindrucksvoll und liefert sogar Beispiele zu Bibliotheken, mit deren Hilfe man sich seine Kärtchen rendern kann.
    Sehr bookmarkwürdig, dieses Dokument. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!