Autore Topic: GPS + maps + strada piu' veloce  (Letto 2182 volte)

Offline ROS

  • Utente normale
  • ***
  • Post: 196
  • Respect: +5
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 10.04
GPS + maps + strada piu' veloce
« il: 11 Settembre 2011, 23:07:10 CEST »
0
Ciao a tutti,
dovrei realizzare questo "giochino" per capire un po' come usare il gps insieme a maps, sperando che cio' che vorrei fare sia fattibile :)

Quello che vorrei fare e' innanzitutto in base al gps restituire il nome della via in cui mi trovo e poi, dati due indirizzi, calcolare e restituire la distanza dal punto in cui mi trovo ai due indirizzi...

In secondo luogo vorrei anche visualizzare la mappa in cui e' mostrato dove sono io e la strada da percorrere per arrivare al punto piu' vicino.

E' possibile fare cio' senza tante difficolta'?
Avete qualche link da leggere e che mi aiuti?

Offline ROS

  • Utente normale
  • ***
  • Post: 196
  • Respect: +5
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 10.04
Re:GPS + maps + strada piu' veloce
« Risposta #1 il: 12 Settembre 2011, 16:42:30 CEST »
0
Sono riuscito ad buttare giu' qualche riga, ma mi fermo inesorabilmente su
Codice: [Seleziona]
W/System.err(  427): java.io.IOException: Service not Available
W/System.err(  427):    at android.location.Geocoder.getFromLocationName(Geocoder.java:178)
e nemmeno google sa come risolvere la faccenda...Lavoro su un emulatore android 2.2 e proprio non riesco ad evitare questo errore, per quanto abbia creato key per maps, inserito librerie nel manifest ecc...

Suggerimenti?

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:GPS + maps + strada piu' veloce
« Risposta #2 il: 25 Novembre 2011, 10:46:31 CET »
+1
Ciao ROS,
anche io mi sono imbattutto in questo problema non molto tempo fa.
Prova ad usare un emulatore con api level 7 o un dispositivo reale, perche l'emualtore con api level 8 presentano qualche bug, e cambiando emulatore con uno con api di livello 7 funziona tutto  ;-)

Ho trovato il link che forse puo fare al caso tuo http://code.google.com/p/j2memaprouteprovider/source/browse/#svn%253Fstate%253Dclosed

in questa applicazione, gli passo le coordinate di due punti, e mi calcola distanza in km, il tempo impiegato e mi disegna il percorso sulla mappa  :-)

Spero proprio che faccia il caso tuo  :-)

Offline Jarod56

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Lg Dual
  • Sistema operativo:
    Ubuntu 11.04 / Windows 7
Re:GPS + maps + strada piu' veloce
« Risposta #3 il: 25 Novembre 2011, 17:16:00 CET »
0
Interessa anche a me questa funzione, ma seguendo il tuo link e copiando tutti i file non riesco proprio a farla funzionare...
Riusciresti a mettere direttamente un archivio con il progetto?

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:GPS + maps + strada piu' veloce
« Risposta #4 il: 25 Novembre 2011, 17:34:11 CET »
+2
No problema, ecco qui il progetto completo e funzionante  ;-)

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:GPS + maps + strada piu' veloce
« Risposta #5 il: 25 Novembre 2011, 18:07:51 CET »
+1
Spero che ti sia stato di aiuto  :-)

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:GPS + maps + strada piu' veloce
« Risposta #6 il: 28 Novembre 2011, 16:52:02 CET »
0
Ho un piccolo problema relativo al progetto che ho postato qui sopra.
Sto cercando di realizzare un applicazione che mi permette di calcolare la distanza tra il punto rilevato dal gps e dei punti da me stabiliti.
Non e del tutto completo ancora, ma purtroppo mi sono bloccato il un punto, ovvero quello di estrarre da una stringa la distanza chilometrica e convertirla in double.
Mi da errore appunto quando cerco di convertirla.
c'e qualcuno che riuscirebbe a darmi una mano?  :-)

posto un po di codice.

Questa è l'activity principale:

Codice (Java): [Seleziona]
public class MapRouteActivity extends MapActivity {

        LinearLayout linearLayout;
        MapView mapView;
        private Road mRoad;
        public double tooLat[]={41.89547, 45.46368, 44.49358};
        public double tooLon[]={12.48232, 9.18817, 11.34615};
        int n = tooLat.length;
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                mapView = (MapView) findViewById(R.id.mapview);
                mapView.setBuiltInZoomControls(true);

                new Thread() {
                        @Override
                        public void run() {
                               
                                for(int i = 0;i<n;++i){
                                double fromLat = 44.69623, fromLon = 10.62779, toLat = tooLat[i], toLon = tooLon[i];
                                String url = RoadProvider
                                                .getUrl(fromLat, fromLon, toLat, toLon);
                                InputStream is = getConnection(url);
                                mRoad = RoadProvider.getRoute(is);
                                mHandler.sendEmptyMessage(0);
                                }    
                        }
                }.start();
        }

        Handler mHandler = new Handler() {
                public void handleMessage(android.os.Message msg) {
                                double dati[];
                                dati = new double[n];
                               
                                for (int i = 0;i<n;++i){
                                        try{
                                                double dato = Double.parseDouble(mRoad.mDescription.substring(0, mRoad.mDescription.indexOf("k")).replace(" ","").replace(".",","));
                                                dati[i]=dato;
                                                System.out.println("inserimento e conversione avvenuta");
                                        }
                                        catch(ArithmeticException e){
                                        System.out.println("errore: "+ e.getMessage());
                                }
                                }
                               
                       /* TextView textView = (TextView) findViewById(R.id.description);
                        textView.setText(mRoad.mName + " " + mRoad.mDescription);*/

                                System.out.println(mRoad.mDescription);
                        MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
                        List<Overlay> listOfOverlays = mapView.getOverlays();
                        listOfOverlays.clear();
                        listOfOverlays.add(mapOverlay);
                        mapView.invalidate();
                };
        };

        private InputStream getConnection(String url) {
                InputStream is = null;
                try {
                        URLConnection conn = new URL(url).openConnection();
                        is = conn.getInputStream();
                } catch (MalformedURLException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return is;
        }

        @Override
        protected boolean isRouteDisplayed() {
                return false;
        }
}

class MapOverlay extends com.google.android.maps.Overlay {
        Road mRoad;
        ArrayList<GeoPoint> mPoints;

        public MapOverlay(Road road, MapView mv) {
                mRoad = road;
                if (road.mRoute.length > 0) {
                        mPoints = new ArrayList<GeoPoint>();
                        for (int i = 0; i < road.mRoute.length; i++) {
                                mPoints.add(new GeoPoint((int) (road.mRoute[i][1] * 1000000),
                                                (int) (road.mRoute[i][0] * 1000000)));
                        }
                        int moveToLat = (mPoints.get(0).getLatitudeE6() + (mPoints.get(
                                        mPoints.size() - 1).getLatitudeE6() - mPoints.get(0)
                                        .getLatitudeE6()) / 2);
                        int moveToLong = (mPoints.get(0).getLongitudeE6() + (mPoints.get(
                                        mPoints.size() - 1).getLongitudeE6() - mPoints.get(0)
                                        .getLongitudeE6()) / 2);
                        GeoPoint moveTo = new GeoPoint(moveToLat, moveToLong);

                        MapController mapController = mv.getController();
                        mapController.animateTo(moveTo);
                        mapController.setZoom(7);
                }
        }

        @Override
        public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
                super.draw(canvas, mv, shadow);
                drawPath(mv, canvas);
                return true;
        }

        public void drawPath(MapView mv, Canvas canvas) {
                int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
                Paint paint = new Paint();
                paint.setColor(Color.BLACK);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(3);
                for (int i = 0; i < mPoints.size(); i++) {
                        Point point = new Point();
                        mv.getProjection().toPixels(mPoints.get(i), point);
                        x2 = point.x;
                        y2 = point.y;
                        if (i > 0) {
                                canvas.drawLine(x1, y1, x2, y2, paint);
                        }
                        x1 = x2;
                        y1 = y2;
                }
        }
}

Questo e il logcat:

W/dalvikvm(  967): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime(  967): Uncaught handler: thread main exiting due to uncaught exception
D/dalvikvm(  967): GC freed 13725 objects / 700816 bytes in 138ms
E/AndroidRuntime(  967): java.lang.NumberFormatException: Distance:445
E/AndroidRuntime(  967):        at org.apache.harmony.luni.util.FloatingPointParser.initialParse(FloatingPointParser.java:13
E/AndroidRuntime(  967):        at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:281
E/AndroidRuntime(  967):        at java.lang.Double.parseDouble(Double.java:285)
E/AndroidRuntime(  967):        at com.googledrivingdirection.MapRouteActivity$1.handleMessage(MapRouteActivity.java:64)
E/AndroidRuntime(  967):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  967):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  967):        at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime(  967):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  967):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  967):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(  967):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(  967):        at dalvik.system.NativeStart.main(Native Method)
I/Process (  573): Sending signal. PID: 967 SIG: 3
I/dalvikvm(  967): threadid=7: reacting to signal 3
I/dalvikvm(  967): Wrote stack trace to '/data/anr/traces.txt'
W/ExpatReader(  967): DTD handlers aren't supported.
W/ExpatReader(  967): DTD handlers aren't supported.

Please help me :'(
Vi ringrazio in anticipo!!

Offline ROS

  • Utente normale
  • ***
  • Post: 196
  • Respect: +5
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 10.04
Re:GPS + maps + strada piu' veloce
« Risposta #7 il: 28 Novembre 2011, 18:23:55 CET »
+1
Citazione
Distance:445
Stai cercando di convertire in Double questo valore, non solo 445?

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:GPS + maps + strada piu' veloce
« Risposta #8 il: 29 Novembre 2011, 09:34:36 CET »
0
Si esatto, grazie per avermi fatto notare quell'errore  :-)
Adesso ho aggiustato il tutto in questa maniera:

Codice (Java): [Seleziona]
public void handleMessage(android.os.Message msg) {
                                double dati[];
                                dati = new double[n];
                                NumberFormat f = new DecimalFormat("####.##");
                               
                                try{
                                        for (int i = 0;i<n;++i){
                                                String dato = mRoad.mDescription.substring(mRoad.mDescription.indexOf(":"),mRoad.mDescription.indexOf("k")).replace(" ","");
                                                String conv = f.format(dato);
                                                dati[i]=Double.parseDouble(conv);
                                                System.out.println("inserimento e conversione avvenuta");
                                        }
                                }
                                catch(ArithmeticException e){
                                System.out.println("errore: "+ e.getMessage());
                        }
                               
                };

Adesso però l'errore e diverso:
(logcat)

W/ExpatReader(  462): DTD handlers aren't supported.
D/AndroidRuntime(  462): Shutting down VM
W/dalvikvm(  462): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime(  462): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(  462): java.lang.IllegalArgumentException
E/AndroidRuntime(  462):        at java.text.DecimalFormat.format(DecimalFormat.java:801)
E/AndroidRuntime(  462):        at java.text.Format.format(Format.java:147)
E/AndroidRuntime(  462):        at com.googledrivingdirection.MapRouteActivity$1.handleMessage(MapRouteActivity.java:68)
E/AndroidRuntime(  462):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  462):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  462):        at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime(  462):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  462):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  462):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(  462):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(  462):        at dalvik.system.NativeStart.main(Native Method)

dice che l'argomento del format non va bene, pero a me sembra corretto  :-)

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:GPS + maps + strada piu' veloce
« Risposta #9 il: 29 Novembre 2011, 09:45:47 CET »
0
Sono riuscito a risolvere, ho eliminato il pezzo di stringa che era in piu, e poi ho tolto il DecimalFormat, perche dava errore su quello, e togliendolo mi converte tutto in modo corretto  ;-)

Offline Jarod56

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Lg Dual
  • Sistema operativo:
    Ubuntu 11.04 / Windows 7
Re:GPS + maps + strada piu' veloce
« Risposta #10 il: 07 Dicembre 2011, 16:35:21 CET »
0
Se vi può essere d'aiuto ho trovato una raccolta di comandi da dare in pasto al service di google...
http://mapki.com/wiki/Google_Map_Parameters

Con questi si può fare veramente di tutto (io volevo il percorso a piedi/bici e ho dovuto solo aggiungere un semplice comando) :D