CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: megthebest con ben 3 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: megthebest con ben 14 Thanks ricevuti negli ultimi sette giorni
Utente del mese: megthebest con ben 26 Thanks ricevuti nell'ultimo mese

Pagina 1 di 3 123 ultimoultimo
Ultima pagina
Visualizzazione dei risultati da 1 a 10 su 29
Discussione:

Calcola percorso Google Maps

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Mar 2010
    Messaggi
    21

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Calcola percorso Google Maps

    Ciao a tutti,
    volevo sapere se c'è un modo di utilizzare su android la disponibilità di calcola percorse e poi visualizzarlo esattamente come avviene nell'applicazione Google Maps di Android, però non usando esattamente quell'applicazione, perchè quello che a me serve è costruire una mia applicazione che lo faccia per poi integrarla con altre cose.
    Spero in un vostro aiuto
    Grazie mille
    Ciao ciao
    Laura

  2.  
  3. #2
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Ciao, non ci ho mai guardato dentro però credo che le api di google maps lo prevedano.

    Prova a dare un occhio qui:
    Google Driving Directions - MapView overlayed :: anddev.org - Android Development Community | Android Tutorials

    Twitter @veke87

  4. #3
    Baby Droid


    Registrato dal
    Mar 2010
    Messaggi
    21

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Ti ringrazio....alla fine ho risolto!Curiosando tra le api di google maps e un pò in giro sul web ho capito che in realtà non è altro che una connessione http al sito si google maps con dei parametri e ti ritorno un file kml che quindi devi parsare e poi magari visualizzare su mappa attraverso le canvas. Il risoltato è favoloso! eheheheh
    Grazie ancora!

  5. #4
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    hai provatoo a vedere anche il mio link ? Mi sembrava piu semplice :P

    Twitter @veke87

  6. #5
    Baby Droid


    Registrato dal
    Mar 2010
    Messaggi
    21

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Si ho già visto e ho anche provato con l'esempio fornito sul sito, ma purtroppo sembra che le api com.google.googlenav siano state rimosse dopo la versione sdk 1.1 almeno a quanto ho notato da discussioni varie sui vari forum che parlavano di questa libreria. Ho cercato un pò dappertutto e neanche sul sito di google ve ne è traccia...se poi te sai come risolvere magari fammi sapere qualcosa! Sai la mia curiosità supera ogni limite...ahahhaha
    Grazie comunque, sei stato davvero gentile!
    ciao ciao
    Laura

  7. #6
    Baby Droid


    Registrato dal
    Apr 2010
    Messaggi
    24

    Ringraziamenti
    1
    Ringraziato 1 volta in 1 Post
    Predefinito

    Visto che si parla della stessa cosa scrivo qua.

    Allora io ho utilizzato la seguente guida: ???: Android - Driving Direction (Route Path)

    Ecco il codice che ho generato seguendo la guida precedente


    Classe che utilizzo per scaricare il file KML in base alle coordinate dei due punti di arrivo
     
    1
    import java.net.HttpURLConnection;
    2
    import java.net.URL;
    3
    import java.util.ArrayList;
    4
    import java.util.regex.Matcher;
    5
    import java.util.regex.Pattern;
    6
    7
    import javax.xml.parsers.DocumentBuilder;
    8
    import javax.xml.parsers.DocumentBuilderFactory;
    9
    10
    import org.w3c.dom.Document;
    11
    12
    import android.content.Context;
    13
    import android.location.Location;
    14
    15
    import com.google.android.maps.GeoPoint;
    16
    17
    public class PathDownloader
    18
    {
    19
    public static ArrayList<GeoPoint> getPath(Context baseContext, Location src, Location dst)
    20
    {
    21
        ArrayList<GeoPoint> points = new ArrayList<GeoPoint>(0);
    22
        
    23
        String link = String.format
    24
        (
    25
            "http://maps.google.com/maps?f=d&hl=en&saddr=%f,%f&daddr=%f,%f&ie=UTF8&0&om=0&output=kml",
    26
            src.getLatitude(),
    27
            src.getLongitude(),
    28
            dst.getLatitude(),
    29
            dst.getLongitude()
    30
        );
    31
        
    32
        Document doc = null;
    33
        HttpURLConnection urlConnection= null;
    34
        URL url = null;
    35
        
    36
        try
    37
        {
    38
            url = new URL(link);
    39
            urlConnection = (HttpURLConnection)url.openConnection();
    40
            urlConnection.setRequestMethod("GET");
    41
            urlConnection.setDoOutput(true);
    42
            urlConnection.setDoInput(true);
    43
            urlConnection.connect();
    44
            
    45
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    46
            DocumentBuilder db = dbf.newDocumentBuilder();
    47
            doc = db.parse(urlConnection.getInputStream());
    48
        }
    49
        catch (Exception e)
    50
        {
    51
            return null;
    52
        }
    53
        
    54
        if(doc.getElementsByTagName("GeometryCollection").getLength() > 0)
    55
        {
    56
            String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue();
    57
                
    58
            Pattern pattern = Pattern.compile("(\\d+\\.\\d+),(\\d+\\.\\d+),\\d+\\.\\d+\\ ");            
    59
            Matcher matcher = pattern.matcher(path);
    60
                
    61
            while (matcher.find())
    62
            {
    63
                points.add
    64
                (
    65
                    new GeoPoint
    66
                    (
    67
                        (int)(Double.parseDouble(matcher.group(2))*1E6),
    68
                        (int)(Double.parseDouble(matcher.group(1))*1E6)
    69
                    )
    70
                );
    71
            }
    72
        }
    73
        else
    74
            return null;
    75
        
    76
        return points;
    77
    }
    78
    }
    79


    Classe crea il percorso sulla mappa. Cosa fa: prende due punti alla volta e traccia una linea per unirli
    60
     
    1
    import java.util.ArrayList;
    2
    3
    import android.graphics.Canvas;
    4
    import android.graphics.Color;
    5
    import android.graphics.Paint;
    6
    import android.graphics.Point;
    7
    8
    import com.google.android.maps.GeoPoint;
    9
    import com.google.android.maps.MapView;
    10
    import com.google.android.maps.Overlay;
    11
    import com.google.android.maps.Projection;
    12
    13
    14
    public class Overlay_DrawPath extends Overlay
    15
    {   
    16
    private ArrayList<GeoPoint> pathPoints;
    17
    18
    public Overlay_DrawPath(ArrayList<GeoPoint> pathPoints)
    19
    {
    20
        this.pathPoints = pathPoints;
    21
    }
    22
    23
    @Override
    24
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
    25
    {
    26
        super.draw(canvas, mapView, shadow);
    27
        Projection projection = mapView.getProjection();
    28
        
    29
        GeoPoint srcGeo;
    30
        GeoPoint dstGeo;
    31
        Paint paint = new Paint();
    32
        paint.setColor(Color.BLUE);
    33
        paint.setAntiAlias(true);
    34
        paint.setStrokeWidth(5);
    35
        paint.setAlpha(120);
    36
        
    37
        for (int i=0 ; i<pathPoints.size()-1 ; i++)
    38
        {
    39
            srcGeo = pathPoints.get(i);
    40
            dstGeo = pathPoints.get(i+1);
    41
            
    42
            Point srcPoint = new Point();
    43
            projection.toPixels(srcGeo, srcPoint);
    44
            
    45
            Point dstPoint = new Point();
    46
            projection.toPixels(dstGeo, dstPoint);      
    47
            
    48
            canvas.drawLine
    49
            (
    50
                srcPoint.x, 
    51
                srcPoint.y, 
    52
                dstPoint.x, 
    53
                dstPoint.y, 
    54
                paint
    55
            );
    56
        }
    57
        
    58
        return true;
    59
    }
    60
    }


    E nella classe che estende MapActivity ho
    10
     
    1
    List<Overlay> mapOverlays = mappa.getOverlays();
    2
    ArrayList<GeoPoint> pathPoints = PathDownloader.getPath
    3
    (
    4
        getBaseContext(), 
    5
        srcLoc, 
    6
        dstLoc
    7
    );
    8
    9
    if (pathPoints != null && pathPoints.size() > 1)
    10
        mapOverlays.add(new Overlay_DrawPath(pathPoints));


    Il codice funziona e visualizza correttamente il percorso da punto a punto ma c'è un problema grafico: tra una linea e la successiva, non essendo nello stesso verso, si vede lo spigolo (spero si capisca non ho uno screenshot sottomano).
    C'è modo di smussare agendo sull'oggetto Paint le due linee congiunte per uniformare il punto dov si uniscono?

  8. #7
    Baby Droid


    Registrato dal
    Mar 2010
    Messaggi
    21

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Esattamente ciò che ho fatto io...ovvero ottenere il kml e poi parsarlo per ottenere tutte le coordinate. Po tramite le canvas e metodo draw disegno le varie rette tra le coordinate. Chiaramente come dicevi te vengono visti gli spigoli..e non ho trovato ancora come unirli con una curva..ma vabbè alla fine ha comunque un bell'aspetto!
    ciao ciao

  9. #8
    Baby Droid


    Registrato dal
    Apr 2010
    Messaggi
    24

    Ringraziamenti
    1
    Ringraziato 1 volta in 1 Post
    Predefinito

    Ho in parte risolto utilizzando il drawPath anzichè il drawLine



    Ho messo un paio di configurazioni sul paint per "smoothare" la linea e il risultato non è male

    63
     
    1
    import java.util.ArrayList;
    2
    3
    import android.graphics.Canvas;
    4
    import android.graphics.Color;
    5
    import android.graphics.Paint;
    6
    import android.graphics.Path;
    7
    import android.graphics.Point;
    8
    9
    import com.google.android.maps.GeoPoint;
    10
    import com.google.android.maps.MapView;
    11
    import com.google.android.maps.Overlay;
    12
    import com.google.android.maps.Projection;
    13
    14
    15
    public class Overlay_DrawPath extends Overlay
    16
    {   
    17
        private ArrayList<GeoPoint> pathPoints;
    18
    19
        public Overlay_DrawPath(ArrayList<GeoPoint> pathPoints)
    20
        {
    21
            this.pathPoints = pathPoints;
    22
        }
    23
    24
        @Override
    25
        public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
    26
        {
    27
            super.draw(canvas, mapView, shadow);
    28
            Projection projection = mapView.getProjection();
    29
            
    30
            GeoPoint srcGeo;
    31
            GeoPoint dstGeo;
    32
    33
            Paint mPaint = new Paint();
    34
            mPaint.setDither(true);
    35
            mPaint.setAntiAlias(true);
    36
            mPaint.setColor(Color.MAGENTA);
    37
            mPaint.setAlpha(100);
    38
            mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    39
            mPaint.setStrokeJoin(Paint.Join.ROUND);
    40
            mPaint.setStrokeCap(Paint.Cap.ROUND);
    41
            mPaint.setStrokeWidth(5);
    42
            
    43
            Path path = new Path();
    44
            
    45
            for (int i=0 ; i<pathPoints.size()-1 ; i++)
    46
            {
    47
                srcGeo = pathPoints.get(i);
    48
                dstGeo = pathPoints.get(i+1);
    49
                
    50
                Point srcPoint = new Point();
    51
                projection.toPixels(srcGeo, srcPoint);
    52
                
    53
                Point dstPoint = new Point();
    54
                projection.toPixels(dstGeo, dstPoint);      
    55
                
    56
                path.moveTo(dstPoint.x, dstPoint.y);
    57
                path.lineTo(srcPoint.x, srcPoint.y);
    58
    59
                canvas.drawPath(path, mPaint);
    60
            }   
    61
            return true;
    62
        }
    63
    }

  10. #9
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Chefigoooo

    Twitter @veke87

  11. #10
    Baby Droid


    Registrato dal
    Mar 2010
    Messaggi
    21

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Beh ho provato anche io ad usare i settaggi che hai consigliato per le linee e ad usare il drawPath anzichè drawLine ed il risultato è decisamente migliore del precedente, perlomeno ora non si vedono spigoli e buchetti negli angoli...
    Grandeeeeeeee! Grazie!

Pagina 1 di 3 123 ultimoultimo
Ultima pagina

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy