Autore Topic: Consigli su parser gpx  (Letto 611 volte)

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Consigli su parser gpx
« il: 17 Dicembre 2013, 14:29:05 CET »
0
Salve. Volevo sapere qual è il metodo più efficiente per fare il parsing di un file gpx. Dom? Sax? Devo usare XmlPullParser?
Io ne ho creato uno utilizzando Dom + XPath (in Eclipse, fuori da ambiente android). Posto il codice così oltre a dirmi se va bene
per android potrebbe sempre essere utile a qualcuno :)

Codice: [Seleziona]
public static void buildTrack(ArrayList<Posizione> track) {
               
                try {

                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                        dbf.setNamespaceAware(true);
                        DocumentBuilder builder = dbf.newDocumentBuilder();

                        Document document = builder.parse("prova.gpx");

                        XPathFactory xpf = XPathFactory.newInstance();
                        XPath xpath = xpf.newXPath();
                        xpath.setNamespaceContext(new GpxNamespaceContext());

                        Object result = xpath.evaluate(
                                        "/gpx:gpx/gpx:trk/gpx:trkseg/gpx:trkpt", document,
                                        XPathConstants.NODESET);

                        NodeList list = (NodeList) result;

                        for (int i = 0; i < list.getLength(); i++) {
                                Node node = list.item(i);
                                NamedNodeMap nnm = node.getAttributes();
                                Node latitudine = nnm.getNamedItem("lat");
                                Node longitudine = nnm.getNamedItem("lon");
                                Object altitudine = xpath.evaluate("gpx:ele/text()", node,
                                                XPathConstants.STRING);
                                double lat = Double.parseDouble(latitudine.getNodeValue());
                                double lon = Double.parseDouble(longitudine.getNodeValue());
                                double alt = Double.parseDouble(altitudine.toString());
                                track.add(new Posizione(lat,lon,alt));
                        }
                }

                catch (Exception e) {
                        System.err.println(e);
                }
        }

Codice: [Seleziona]
import java.util.Iterator;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;

public class GpxNamespaceContext implements NamespaceContext {
       
    public String getNamespaceURI(String prefix) {
           
        if (prefix == null) {
            throw new IllegalArgumentException("prefix cannot be null");
        } else if (prefix.equals("gpx")) {
            return "http://www.topografix.com/GPX/1/1";
        } else {
            return XMLConstants.NULL_NS_URI;
        }
    }

    public String getPrefix(String namespaceURI) {
        return null;   // getPrefix non serve in questo caso
    }

    public Iterator getPrefixes(String namespaceURI) {
        return null;   // getPrefixes non serve in questo caso
    }
}

Devo per caso inserirlo in un AsyncTask?

Per questa ultima domanda mi rispondo da solo. Si, serve, poiché l'app si freeza per qualche secondo mentre fa il parsing. Dato che ci mette qualche secondo, magari gli altri tipi di parser potrebbero essere più veloci?
« Ultima modifica: 17 Dicembre 2013, 15:02:40 CET da Elmvor »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Consigli su parser gpx
« Risposta #1 il: 17 Dicembre 2013, 15:07:15 CET »
0
non sono espertissimo, ma se non ricordo male DOM Parser si prende subito in memoria tutto il file, mentre XMLpull è piu "a stream".
se quello che ho detto non è una cazzata, io userei il secondo tipo, visto che un file gpx è scritto in ordine e puoi parsarlo segmento per segmento...
Certo che se ti va il parser con DOM è non è lento (o almeno non ti pare), puoi evitare di rifarlo da capo...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Consigli su parser gpx
« Risposta #2 il: 17 Dicembre 2013, 15:14:12 CET »
0
Ho adattato il codice soprastante nella mia app. Ci mette circa 12 secondi per fare il parsing e il mio cell ha un dual core da 1.5 ghz. Forse è un po troppo, senza contare che questo parsing mi serve per disegnare il percorso sulla mappa. Il processo di disegno utilizzerà altro tempo.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Consigli su parser gpx
« Risposta #3 il: 17 Dicembre 2013, 15:44:57 CET »
0
beh dipende quanti punti ha il gpx, se hai un 100 punti è troppo, se i punti sono decine di migliaia è diverso...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Consigli su parser gpx
« Risposta #4 il: 17 Dicembre 2013, 20:03:23 CET »
0
Non so, i percorsi hanno lunghezze molto variabili. Quello che sto usando io come prova avrà 300-400 elementi <trkpt>. Ho
provado di nuovo l'app e ci ha messo 20 secondi. Provo ad avviarlo dentro l'AsyncTask per vedere se migliora. Se non migliora
provo un altro parser..

Post unito: 17 Dicembre 2013, 21:06:31 CET
Ma dentro l'AsyncTask ci mette più tempo .-. 30 secondi tipo..  :-(

Ps: Per la precisione sono 459 elementi.
« Ultima modifica: 17 Dicembre 2013, 21:10:50 CET da Elmvor »