Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [Android-GoogleMap-Coordinate] capire se un terzo punto gps appartiene ad una rotta traccia su una mappa

    Salve a tutti,
    Avrei 2 questioni da porre:

    1)Durante lo sviluppo di una app con google map, mi sono imbattuto in un problema poco comune. Sarebbe il calcolo se un terzo punto gps(lat,lng) appartiene ad un percorso stradale(cioe modalità/type:ROAD di google map) calcolato precedentemente x1(lat1,lng1),x2(lat2,lng2). Qualcuno sa se esiste qualche funzione oppure conosce qualche metodo per controllare se questo punto appartiene al percorso?

    2) avendo 2 punti gps x1(lat1,lng1),x2(lat2,lng2) e tracciati su google map, usato sempre la modalità road( quindi un percorso stradale). E' possibile farsi restituire da google map tutti o una parte dei punti gps che compongono quel percorso?

    ps: va bene pure una soluzione in JS.

    Grazie in anticipo
    Ultima modifica di orphenix; 27-03-2014 a 20:28

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non sono pratico delle api di google maps, per cui mi rifaccio a quanto letto in alcuni thread (per esempio):
    https://groups.google.com/forum/#!to...v3/sdDLskc3rb0

    mi pare di capire che non vi sia un'implementazione a livello API di un qualcosa tipo

    codice:
    my_point.pointBelongsTo(path)
    or roba del genere, per cui la soluzione che viene suggerita è quella a cui probabilmente sei giunto anche tu (e che magari vorresti evitare): farsi restituire la lista dei punti intermedi del percorso (questo credo sia messo a disposizione, altrimenti non si potrebbe implementare il servizio di direzione), considerare ciascun tratto e verificare se il punto (x,y) appartenga ad un tratto. Poi magari puoi sviluppare ulteriormente introducendo una soglia di tolleranza, tipo: (x,y) dista meno di z metri da un tratto del percorso.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Grazie andrea del tuo aiuto.... infatti sto cercando una soluzione facendo restituire la lista del punti.

    avrei trovato un servizio su internet che fa proprio al mio caso, solo che non so come collegarmi a questo sito web per richiedere questo servizio.
    la soluzione è:
    1) chiedere a google map di tracciare la rotta questo restituisce un json , e da questo json mi posso creare un link simile a questo:
    https://maps.google.it/maps?saddr=co...ra=ls&t=m&z=14
    Questo sarebbe il link ad una mappa creato sul sito di googlemap.
    Questo link ora lo do in pasto ad un altro sito web che è gpsvisualizer:
    http://www.gpsvisualizer.com/map?output_googleearth
    che mi restituisce un file kml o kmz di nome " 20140328043840-47030-map.kmz". il file contiene tutti i punti gps del percorso che gli ho passato, calcolato con gogolemap(cioe il link precendemente citato).Il contenuto del file è questo:
    codice:
        1 1 GPS Visualizer]]>  Tracks 1 0        1 clampToGround 16.25373,39.29854 16.25507,39.29881 16.2547,39.29983 16.25389,39.30176 16.25357,39.30298 16.2552,39.30307 16.25594,39.30314 16.25652,39.30334 16.25703,39.30344 16.25664,39.30661 16.25669,39.30825 16.25666,39.30915 16.25644,39.31156 16.25679,39.3117 16.25758,39.31224 16.25799,39.31244 16.25812,39.31244 16.25821,39.31248 16.25825,39.31264 16.25811,39.31273 16.25793,39.3127 16.25781,39.31281 16.25753,39.31317 16.25753,39.31342 16.25787,39.31362 16.25898,39.31421 16.25875,39.31467 16.2584,39.31569 16.25775,39.31797 16.25732,39.31927 16.25738,39.31943 16.25731,39.31954 16.25704,39.32069 16.25537,39.32628 16.25495,39.3269 16.25474,39.32712 16.25467,39.32713 16.25428,39.32745 16.25353,39.32776 16.24718,39.32971 16.24649,39.33012 16.2455,39.33098 16.24455,39.33168 16.24391,39.33197 16.24332,39.33215 16.24283,39.3322 16.24142,39.33212 16.24051,39.33216 16.24002,39.33228 16.23835,39.33294 16.23797,39.33303 16.23759,39.33304 16.23611,39.33292 16.2329,39.33237 16.23213,39.33229 16.23167,39.33249 16.23144,39.33283 16.23136,39.33288 16.23068,39.33286 16.23047,39.3329 16.23024,39.33312 16.23016,39.3333 16.23021,39.33339 16.23011,39.33346 16.22999,39.3334 16.22965,39.33339 16.22961,39.33335 16.22864,39.33321 16.22783,39.33301 16.22642,39.33276 16.22593,39.33264 16.22546,39.33244 16.22495,39.33214 16.22419,39.33134 16.22356,39.33093 16.22306,39.33076 16.22217,39.33061 16.22173,39.33048 16.21984,39.32941 16.21932,39.32902 16.2189,39.32878 16.2175,39.32813 16.21743,39.32819 16.21732,39.3282 16.21724,39.32814 16.21725,39.32804 16.21676,39.32785 16.21624,39.32772 16.21585,39.32768 16.21206,39.32756 16.20835,39.32728 16.20805,39.32734 16.20749,39.32758 16.20468,39.32752 16.2039,39.32778 16.20355,39.32795 16.20223,39.32886 16.20208,39.32904 16.20186,39.33176 16.20191,39.33202 16.20207,39.33225 16.20279,39.33285 16.20279,39.33301 16.20268,39.33311 16.20244,39.33318 16.20222,39.33314 16.2021,39.33308 16.20173,39.33269 16.20154,39.33255 16.20136,39.33249 16.2011,39.33266 16.20064,39.33328 16.20041,39.33343 16.20004,39.33348 16.19882,39.33341 16.19843,39.33351 16.19762,39.33387 16.19722,39.33393 16.19647,39.33369 16.1961,39.33365 16.19534,39.33375 16.19439,39.33402 16.19414,39.33404 16.19311,39.3337 16.19247,39.33368 16.19143,39.33358 16.19119,39.33348 16.19107,39.33334 16.19061,39.33213 16.1903,39.3319 16.18912,39.33126 16.18892,39.3312 16.18791,39.33139 16.18602,39.33202 16.18584,39.33201 16.18477,39.3317 16.1845,39.33172 16.18403,39.3315
    questo risultato sarebbe proprio quello che serve a me. poi con qualche funzione controllo se il punto si trova in queste coordinate utilizzando pure una funzione di approssimazione.

    Ora il mio problema è, come mi collego con un applicazione in java a questo sito chiedendo il servizio usato via web? come mi prendo il file creato dal sito?qualcuno ha qualche soluzione?

    grazie
    Ultima modifica di orphenix; 28-03-2014 a 14:00

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Allora, giochicchiando con l'esempio delle API "Directions" di Google Maps, ed immettendo i dati del tuo percorso:

    Rende (CS) -> Cosenza (CS)

    si ottiene il seguente JSON:

    codice:
    {
       "routes" : [
          {
             "bounds" : {
                "northeast" : {
                   "lat" : 39.334038,
                   "lng" : 16.2572583
                },
                "southwest" : {
                   "lat" : 39.297059,
                   "lng" : 16.1840381
                }
             },
             "copyrights" : "Map data ©2014 Google",
             "legs" : [
                {
                   "distance" : {
                      "text" : "11,7 km",
                      "value" : 11692
                   },
                   "duration" : {
                      "text" : "22 min",
                      "value" : 1344
                   },
                   "end_address" : "Cosenza CS, Italia",
                   "end_location" : {
                      "lat" : 39.2985421,
                      "lng" : 16.253738
                   },
                   "start_address" : "87036 Rende CS, Italia",
                   "start_location" : {
                      "lat" : 39.33150759999999,
                      "lng" : 16.1840381
                   },
                   "steps" : [
                      {
                         "distance" : {
                            "text" : "47 m",
                            "value" : 47
                         },
                         "duration" : {
                            "text" : "1 min",
                            "value" : 4
                         },
                         "end_location" : {
                            "lat" : 39.3317272,
                            "lng" : 16.1845031
                         },
                         "html_instructions" : "Procedi in direzione \u003cb\u003enordest\u003c/b\u003e",
                         "polyline" : {
                            "points" : "}|`oFg}waBAIWs@Q]"
                         },
                         "start_location" : {
                            "lat" : 39.33150759999999,
                            "lng" : 16.1840381
                         },
                         "travel_mode" : "DRIVING"
                      },
                      {
                         "distance" : {
                            "text" : "24 m",
                            "value" : 24
                         },
                         "duration" : {
                            "text" : "1 min",
                            "value" : 4
                         },
                         "end_location" : {
                            "lat" : 39.3317079,
                            "lng" : 16.1847729
                         },
    
    // OMISSIS
    // OMISSIS
    // OMISSIS
                         "html_instructions" : "Alla rotonda prendi la \u003cb\u003e1ª\u003c/b\u003e uscita e imbocca \u003cb\u003eVia Paul Harris\u003c/b\u003e",
                         "maneuver" : "roundabout-right",
                         "polyline" : {
                            "points" : "chznFsefbB@@?@@??@@?@@@?@?@??@@AJ`@Pv@F^XfC"
                         },
                         "start_location" : {
                            "lat" : 39.2974583,
                            "lng" : 16.2570594
                         },
                         "travel_mode" : "DRIVING"
                      },
                      {
                         "distance" : {
                            "text" : "0,2 km",
                            "value" : 203
                         },
                         "duration" : {
                            "text" : "1 min",
                            "value" : 51
                         },
                         "end_location" : {
                            "lat" : 39.2988111,
                            "lng" : 16.2550745
                         },
                         "html_instructions" : "Svolta a \u003cb\u003edestra\u003c/b\u003e e imbocca \u003cb\u003eVia XXIV Maggio\u003c/b\u003e",
                         "maneuver" : "turn-right",
                         "polyline" : {
                            "points" : "seznFi}ebB_AVmA\\sA`@eAXu@P"
                         },
                         "start_location" : {
                            "lat" : 39.297059,
                            "lng" : 16.2557275
                         },
                         "travel_mode" : "DRIVING"
                      },
                      {
                         "distance" : {
                            "text" : "0,1 km",
                            "value" : 119
                         },
                         "duration" : {
                            "text" : "1 min",
                            "value" : 20
                         },
                         "end_location" : {
                            "lat" : 39.2985421,
                            "lng" : 16.253738
                         },
                         "html_instructions" : "Svolta a \u003cb\u003esinistra\u003c/b\u003e e imbocca \u003cb\u003eVia Adua\u003c/b\u003e\u003cdiv style=\"font-size:0.9em\"\u003eStrada a traffico limitato\u003c/div\u003e",
                         "maneuver" : "turn-left",
                         "polyline" : {
                            "points" : "qpznFeyebBt@hG"
                         },
                         "start_location" : {
                            "lat" : 39.2988111,
                            "lng" : 16.2550745
                         },
                         "travel_mode" : "DRIVING"
                      }
                   ],
                   "via_waypoint" : []
                }
             ],
             "overview_polyline" : {
                "points" : "}|`oFg}waBY}@Q]BE@QASQmAWuAQ{@Ac@L{@jA{Eb@aBb@uD?_@EQ_@}@cBwD]o@QMKEg@O}DeA[WM_@Ik@OcF?aAEY]eBQ_@Kc@Co@Hy@\\_BViBJwA@i@Is@U_AOs@Ia@Fm@Dc@Lg@r@mBR}@Dy@CsAIqB?g@Bc@J[T]zB}AZ]FSCSMYU[_@]m@k@MWE_@@]H]TUJCP@JFx@hAr@~@l@\\p@JtCIfI[n@AZGZ[lCkEZi@^w@XaA`@qBBE?WEgG?eBEuAAkABUl@eBJy@YmKEqAWmIQyMEuEOsBO}@e@eBBCBIASKMEAC?C@e@oAw@eCa@aAq@uAmAeByCwGY_@_@cAYuAKcASmBa@eBu@wA[e@}@}@q@g@m@o@Sa@g@eAg@}AW_BYqC[uCc@uCUaCG}@DO?M@s@@ABE?MEKIEC?Oi@_@_E?qCN{BZsC@{@TuCRyBTsB?k@McC@UHQJKJEb@IPBbBz@RR\\T`@d@sCz@Y@MASQSUQsDG_B?SBiANmAz@oCd@}An@kCP}A?yAA}ACgAEmAAs@@mAFw@Hg@RaAXaAb@kAz@qApAiBjAuAv@_Af@q@Zm@N[b@_AT}@FUd@{Bp@gD~@oErDeQ\\gBz@sCl@y@PSJ?j@_@TIdAQpD{@dVaEbMgC@@DBFBH@H`Bh@pGtI}A|AY`AKLHVEvCc@bIaAjBK^IXEdA@X?nGc@`CI|H]tDElEBvBB~DSnDYjG]xGQpEQpCIzCHfBJ~D\\z@?l@K@@@@@@D@@@L^XvAXfC_AVaD~@{Bj@t@hG"
             },
             "summary" : "SS107",
             "warnings" : [],
             "waypoint_order" : []
          }
       ],
       "status" : "OK"
    }
    Quindi hai già a disposizione le coordinate di start_location e end_location per ciascun segmento del percorso, senza dover quindi interrogare un servizio esterno.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    grazie andrea per l'aiuto...ma con solo con il json di google non riesco a fare cioè che ho bisogno io.poi le coordinate inizio e fine di un segmento gia c'è lo nel mio db, poiché vengono fornite dal mio docente.

    grazie ad un amico credo di aver trovato una soluzione utilizzando quel servizio esterno, utilizzando questa api java:
    http://docs.oracle.com/javase/tutori...ngWriting.html
    una volta scritta credo inserirò il codice qua.grazie della tua disponibilità.

  6. #6
    Io ho fatto quasi tutto ciò nella mia tesi. Per costruire un percorso tra due o più punti è sufficiente utilizzare le Google Directions Api.

    In sostanza componi un URL che ha questa struttura:

    http://maps.googleapis.com/maps/api/...put?parameters

    output indica in che formato vuoi la risposta, XML o JSON. Io ti consiglio il formato JSON, facilmente leggibile e dalla quale puoi estrarre facilmente le informazioni che vuoi senza creare dei parser complicati. I parameters sono origin, destination, e sensor.
    Puoi aggiungere anche il mode ossia la modalità di viaggio (piste ciclabili, automobile, mezzi pubblici o a piedi).

    Effettui la richiesta http (in un AsyncTask mi raccomando!) passando l'URL composto ed estrai la risposta:

    codice:
    public String getJSONFromUrl(String url) {
    
    
            try {
                HttpParams httpParams = new BasicHttpParams();
                //timeout per la connessione
                int connectionTimeout = 10000; //10 secondi
                HttpConnectionParams.setConnectionTimeout(httpParams,connectionTimeout);
                //timeout per i dati
                int dataTimeout = 20000; //20 secondi
                HttpConnectionParams.setSoTimeout(httpParams, dataTimeout);
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParams);
                //Effettuo la richiesta tramite POST
                HttpPost httpPost = new HttpPost(url);
                HttpResponse httpResponse = httpClient.execute(httpPost);
                //Ottengo il responso
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
    
    
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                //Leggo il responso (JSON)
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
    
    
                json = sb.toString();
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            //Ritorno il responso al chiamante
            return json;
        }
    Nella classe chiamante l'obiettivo sarà quello di ottenere una lista di oggetti LatLng dal JSON che puoi iterare per disegnare il percorso e vedere se il terzo punto è abbastanza vicino ad almeno uno di essi per essere considerato parte del percorso:

    codice:
     //Creo l'oggetto JSON
     final JSONObject json = new JSONObject(result);
     //Otteniamo l'array "routes" dall'oggetto json
     JSONArray routeArray = json.getJSONArray("routes");
    //Prendo il primo (ed unico) risultato
    JSONObject routes = routeArray.getJSONObject(0);
    //Ottengo un oggetto che possiede un array di punti codificati che rappresentano
    //il percorso approssimato
    JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
    //Ottengo la stringa dei punti codificati
    String encodedString = overviewPolylines.getString("points");
    //Decodifico la stringa per ottenere una lista di LatLng
    List<LatLng> list = decodePoly(encodedString); //Ecco la lista che ti serve!
    decodePoly(encodedString) utilizza un algoritmo di decodifica che puoi facilmente trovare in rete.

    Distanza tra due oggetti LatLng:

    codice:
    private float getDistance(LatLng first, LatLng second) {
            float [] dist = new float[1];
            Location.distanceBetween(first.latitude, first.longitude, second.latitude, second.longitude, dist);
            return dist[0];
        }

  7. #7
    grazie javino quella funzione mi sara utile hai fine della mia tesi..... pero credo che che ormai ho risolto utilizzando il servizio esterno che e molto utile, tanto poi i dati me li salvo nel mio db, quindi va utilizzando solo una volta alla creazione di un nuovo segmento.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.