martedì 27 dicembre 2011

Open Street Map - Java - Routing

Ero alla ricerca di un metodo semplice per il calcolo delle distanze km stradali tra un due punti.  Dopo varie ricerche arrivo ad una prima soluzione quella di utilizzare osm2po.

Per fare un test ho scaricato il file del Piemonte di OSM da questa cartella.

Successivamente ho eseguito (dopo aver decompresso il file bz2 e le varie lib osm2po)

java -jar osm2po-core-4.2.30-signed.jar prefix=hh piemonte.osm

dopo varie elaborazioni da questa app ottengo la cartella hh che contiene tutti i dati elaborati per eseguire un navigatore. Sempre seguendo i sample sul sito :

package osmtest;

import de.cm.osm2po.routing.DefaultRouter;
import de.cm.osm2po.routing.Graph;
import de.cm.osm2po.routing.Graph.SegmentHolder;
import de.cm.osm2po.routing.SingleTargetRouter;
import java.io.File;
import java.util.Properties;

public class OsmTest {

    public static void main(String[] args) throws Exception {
        
        File dir = new File("C:\\Documents and Settings\\marco\\Documenti\\Downloads\\hh"); // path to g*.2po Files
        Graph graph = new Graph(dir); // CTOR loads graph into memory
        SingleTargetRouter router = new DefaultRouter(); // Dijkstra with specials

        // via palestro n.8 santhià
        int sourceId = graph.findClosestVertexId(45.367874f, 8.177251f);
        // piazza cavour vercelli
        int targetId = graph.findClosestVertexId(45.2693237f, 8.3586324f);

        // Possible params for DefaultRouter
        Properties params = new Properties();
        params.put("findShortestPath", false);
        params.put("ignoreRestrictions", false);
        params.put("ignoreOneWays", false);
        params.put("heuristicFactor", "1.0"); // 0.0 Dijkstra, 1.0 good A*

        router.traverse(graph, sourceId, targetId, Float.MAX_VALUE, params);
        
        if (router.isVisited(targetId)) { // Found!
            int[] path = router.makePath(targetId);
            float tot_km = 0;
            for (int i = 0; i < path.length; i++) {
                SegmentHolder sh = graph.lookupSegment(path[i]);
                int segId = sh.getConstPart().getId();
                String segName = sh.getVarPart().getName().toString();
                float km = sh.getConstPart().getKm();
                System.out.println(segId + "\t" + segName + "\t" + km);
                tot_km += km;
                
            }
            System.out.println();
            System.out.println("tot km: " + tot_km);
            
        }
        
        graph.close();
    }
}

-- RUNNING --


INFO   Loading Graph from C:\Documents and Settings\marco\Documenti\Downloads\hh
INFO   Loading Vertices from gv_fwd.2po
INFO   92.523 Vertices loaded. - 252.219k
INFO   Loading Coordinates from gc_all.2po
INFO   92.523 Coords loaded. - 251.465k
INFO   Loading Edges from ge_fwd.2po
INFO   249.174 Edges loaded. - 246.669k
INFO   Graph is in memory - 246.754k free
29622 Via Fratelli Cervi 0.043157257
29621 Via Fratelli Cervi 0.056928575
29620 Via Fratelli Cervi 0.14821757
29619 Via Fratelli Cervi 0.013569439
26519 Via Tagliamento 0.0052738246
51988 Via Tagliamento 0.02373628
25153 Corso 25 Aprile 0.009190599
51981 Corso 25 Aprile 0.03348493
54642 Corso 25 Aprile 0.06539526
27074 Corso 25 Aprile 0.34717533
54771 Corso 25 Aprile 0.050330035
54644 Corso 25 Aprile 0.15120597
54643 Corso 25 Aprile 0.021295577
27073 Corso 25 Aprile 0.20046103
34253 Corso 25 Aprile 0.025631124
34252 Corso 25 Aprile 0.017132074
34251 Corso 25 Aprile 0.015333741
34250 Corso 25 Aprile 0.13944228
50410 Corso Vercelli 0.13845648
34254 Corso Vercelli 2.1409712
40898 Strada Provinciale 143 Vercellese 1.6996256
40897 Strada Provinciale 143 Vercellese 0.073485486
26505 Strada Provinciale 143 Vercellese 0.027207151
26510 Via per Torino 0.010309117
26511 Via per Torino 0.018367754
26512 Via per Torino 0.020955488
46939 Via per Torino 0.050319146
46942 Via per Torino 0.2733953
46943 Via per Torino 0.04208151
46944 Via per Torino 0.09343862
46945 Via per Torino 0.0420112
50046 Corso Giacomo Matteotti 0.0526508
50047 Corso Giacomo Matteotti 0.05815405
50048 Corso Giacomo Matteotti 0.10033821
50049 Corso Giacomo Matteotti 0.112137705
50420 Corso Giacomo Matteotti 0.08796594
50421 Corso Giacomo Matteotti 0.0055127908
50417 Corso Giacomo Matteotti 0.14630358
50413 Corso Giacomo Matteotti 0.015465715
50045 Strada Statale 11 Padana Superiore 0.63335454
50422 Strada Statale 11 Padana Superiore 0.087082945
50415 Strada Statale 11 Padana Superiore 2.1165488
50416 Strada Statale 11 Padana Superiore 1.9363447
50424 Strada Statale 11 Padana Superiore 0.067266665
50425 Strada Statale 11 Padana Superiore 1.5284381
50426 Strada Statale 11 Padana Superiore 0.37070882
50427 Strada Statale 11 Padana Superiore 0.274278
50428 Strada Statale 11 Padana Superiore 0.06099027
50429 Strada Statale 11 Padana Superiore 0.051663306
50430 Strada Statale 11 Padana Superiore 0.09464438
50431 Strada Statale 11 Padana Superiore 0.622247
50432 Strada Statale 11 Padana Superiore 1.9672685
50433 Strada Statale 11 Padana Superiore 0.020940712
50434 Strada Statale 11 Padana Superiore 0.019205108
50435 Strada Statale 11 Padana Superiore 1.1245883
31369 Strada Statale 11 Padana Superiore 0.020982204
27430  0.019469375
31366 Strada Statale 31 del Monferrato 0.041809272
31365 Strada Statale 31 del Monferrato 0.8612228
31371 Strada Statale 31 del Monferrato 0.019620165
27935 SP31 0.06312612
31372 Strada Statale 31 del Monferrato 0.021187807
31374 Strada Statale 31 del Monferrato 0.16272391
50462 Strada Statale 31 del Monferrato 0.005521775
50449 Strada Statale 31 del Monferrato 0.66337603
26054  0.16612104
26531  0.16449298
26529  0.12807508
30301 Via Trino 0.106118426
30300 Via Trino 1.1253898
42838 SS455 0.06568793
25744  0.028293554
25738  0.041163616
42827 SS455 0.049763422
42836 Strada statale Vercelli-Trino 0.14589156
42837 Strada statale Vercelli-Trino 0.047293313
33927 Strada statale Vercelli-Trino 0.3165596
43957 Strada statale Vercelli-Trino 0.056310877
43946 Strada statale Vercelli-Trino 0.3662844
33926 Strada statale Vercelli-Trino 0.3887234
43958 SS455 0.011191902
33042 Strada statale Vercelli-Trino 0.8628093
33043 Strada statale Vercelli-Trino 0.23586215
49910  0.0446586
27271  0.04874075
52907 Via Vercelli 0.030868573
52908 Via Vercelli 0.5514064
52909 Via Vercelli 0.007921268
52910 Via Vercelli 0.041300017
52911 Via Vercelli 0.02520492
52912 Via Vercelli 0.008553665
52913 Via Vercelli 0.06177261
52914 Via Vercelli 0.04884419
52915 Via Vercelli 0.21045697
54341 Corso Marconi 0.23005071
54342 Corso Marconi 0.060422346
54343 Corso Marconi 0.053981215
49908 Piazza Cavour 0.018594721

tot km: 25.179537
tot time execution:468





ottimo i 468 millisecondi il percorso completo, potrebbe essere quello che mi serve.

giovedì 1 dicembre 2011

MongoDB : Doctrine ODM vs. Mandango

MongoDB Doctine ODM:

pro:
  • semplice e intuitivo
  • i field di tipo array si dichiarano in modo semplice
  • possibilità di _id autogenerati negli embed 
  • Nessun problema con Embed dentro embed e Reference dentro ad embed etc.
  • Id generati anche negli embed in modo semplice

contro:
  • definisco gli indici negli object ma questi non vengono effettivamente creati
  • è lento rispetto a Mandango altri ODM
  • E' in Beta
  • E' difficile trovare documentazione.
da capire:

  • Devo capire se la velocità aumenta configurando gli object in xml.
Mandango

pro:

  • Molta velocità rispetto a Doctine
  • con Mandator crea automaticamente i modelli partendo da un array().
  • i modelli base vengono rigenerati quelli che devono essere estesi da noi no. (ottima cosa)
  • una volta presa la mano con le conf degli object diventa molto veloce.
  • molto utile la funzionalità references/relations
contro:
  • ReferenceOne non molto chiara in db.
  • E' difficile trovare documentazione.
  • Per definire un tipo di dato array bisogna definirlo di tipo 'raw'.
  • Per la definizione dei campi sulle reference bisogna definire un polymorphic per comodità (vedi sotto l'esempio)
  • Non sono riuscito a trovare il metodo per configurare un campo Data a default now().
  • Comportamento strano con gli embed, es : creo un embed di tipo indirizzo e lo salvo in una collection nel field via1, riuso sempre nello codice qualche riga sotto  l'embed salvandolo sempre nella collection indirizzo ma nel campo via2. l'Embed non viene salvato, come se fosse flushato quando è stato agganciato al primo campo.
  • Problemi segnalati con il GridFS
  • Poco supporto sul gruppo 
  • Ho riscontrato un problema nelle reference contenuti negli embed.



ReferenceOne:

Doctrine : definizione molto completa nella collection.



 Mandango: definizione meno accurata.



a mio avviso è meglio usare il field di tipo polymorphic in modo da avere la definizione esatta della classe collegata per facilitare l'eventuale consultazione del db:


è ridondante ma più comprensibile.



altri..

Morph : mancano diversi parti (embed, etc.)
Shanty-Mongo: da verificare sembra valido ad una prima occhiata.

Questo post sarà in aggiornamento continuo.