Autore Topic: Distanza da punto A a punto B effettiva  (Letto 762 volte)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Distanza da punto A a punto B effettiva
« il: 04 Dicembre 2014, 16:29:02 CET »
0
Salve a tutti!

Il mio problema è molto semplice:
vorrei ottenere la distanza effettiva da un punto A ad un punto B, quindi non la distanza in linea d'aria ma quella "per strada".

C'è un modo per farlo ?

Grazie mille a tutti^^

Offline Nicola_D

  • 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:Distanza da punto A a punto B effettiva
« Risposta #1 il: 04 Dicembre 2014, 19:44:54 CET »
0
devi prima calcolarti il percorso, una volta che hai il percorso puoi fare la somma dei punti "in linea d'aria" a coppie.
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 ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Distanza da punto A a punto B effettiva
« Risposta #2 il: 15 Dicembre 2014, 13:09:24 CET »
0
Eccomi tornato!

Per ottenere la distanza effettiva tra un punto A ed uno B ho usate le Directions APi di google.
Però ,siccome mi dava come errore "android.os.NetworkOnMainThreadException", ho dovuto integrare tale metodo in un AsyncTask.
L'app funzione quasi correttamente, nel senso che invece della distanza mi da una riga "strana" (come si può vedere dallo screenshot che ho allegato).

qui sotto posto il codice java:
Codice (Java): [Seleziona]
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;


public class Ristoranti extends Activity {

    ListView listView;
    ImageButton back;
    String distanza;
    private Location mylocation = null;
    Double  lat1=44.572106,lng1=10.369672,lat2=0.0,lng2=0.0;
    String dist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ristoranti);


        // Get ListView object from xml
        listView = (ListView) findViewById(R.id.listView);
        back = (ImageButton) findViewById(R.id.Back);
        TextView title = (TextView) findViewById(R.id.Titolo);

        if (Lingua.ita == 1 || Lingua.eng == 0) {
            title.setText("Ristoranti");
        }
        if (Lingua.ita == 0 || Lingua.eng == 1) {
            title.setText("Restaurants");
        }


        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        // Defined Array values to show in ListView
        String[] values = new String[]{"Il Capriolo", "Chalet Pineta", "Trattoria Corradi",
                "Agriturismo La Piana dei Sambuchi", "Trattoria Mazzini", "Trattoria Tarasconi"
                , "Locanda Sport", "Bar Trattoria da Poldo", "Ristorante Pizzeria La Cava",
                "Trattoria La Pieve", "Trattoria Pizzeria La Corte", "Tana del Luppolo",
                "Ristorante del Parco Monte Fuso", "Agriturismo Da Redeo", "Agriturismo Airone Blu", "Il Filare"};

        BubbleSort(values);


        // Define a new Adapter
        // First parameter - Context
        // Second parameter - Layout for the row
        // Third parameter - ID of the TextView to which the data is written
        // Forth - the Array of data


        // Construct the data source
        ArrayList<User> arrayOfUsers = new ArrayList<User>();
        // Create the adapter to convert the array to views
        UsersAdapters adapter = new UsersAdapters(this, arrayOfUsers);
        // Attach the adapter to a ListView
        final ListView listView = (ListView) findViewById(R.id.listView);

        User newUser;

        dist= String.valueOf(new GetInfo().execute());



        newUser = new User(values[1], dist);
        adapter.add(newUser);


        //ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowristoranti,
        //R.id.Nome, values);

        // Assign adapter to ListView
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                // ListView Clicked item index
                int itemPosition = position;

                // ListView Clicked item value
                String itemValue = (String) listView.getItemAtPosition(position);

                Intent SingleRistoranti = new Intent(Ristoranti.this, Ristorante.class);
                SingleRistoranti.putExtra("Nome", itemValue);
                startActivity(SingleRistoranti);
            }
        });
    }

    private static void BubbleSort(String[] array) {
        String t;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j].compareTo(array[j + 1]) > 0) {
                    t = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = t;
                }
            }
        }
    }


    public class User {

        public String nome;

        public String Distanza;
        public ImageView icona;

        public User(String nome, String distanza) {
            this.nome = nome;
            this.Distanza = distanza;

        }
    }



    private class GetInfo extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... params) {

            Double dist=0.0;
            String distanza="";

            StringBuilder stringBuilder = new StringBuilder();

            try {

            String url="http://maps.googleapis.com/maps/api/directions/json?origin=" + lat1 + "," + lng1 + "&destination=" + lat2 + "," + lng2 + "&mode=driving&sensor=false";

            HttpPost httppost = new HttpPost(url);

            HttpClient client = new DefaultHttpClient();
            HttpResponse response;
            stringBuilder = new StringBuilder();


            response = client.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }

        } catch (ClientProtocolException e) {
        } catch (IOException e) {
        }


            JSONObject jsonObject = new JSONObject();
            try {

                jsonObject = new JSONObject(stringBuilder.toString());

                JSONArray array = jsonObject.getJSONArray("routes");

                JSONObject routes = array.getJSONObject(0);

                JSONArray legs = routes.getJSONArray("legs");

                JSONObject steps = legs.getJSONObject(0);

                JSONObject distance = steps.getJSONObject("distance");

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            Log.d("distance.........", Double.toString(dist));

            distanza =Double.toString(dist);

            return distanza;
        }
    }
}

sto cercando di usare un array adapter personalizzato perché devi modificare 2 textView per riga (nome del ristorante e distanza) e per completezza posto anche l'user adapter:

Codice (Java): [Seleziona]
package com.example.adorni.turisticapp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;


public class UsersAdapters extends ArrayAdapter<Ristoranti.User> {

    public UsersAdapters(Context context, ArrayList<Ristoranti.User> users) {
        super(context, 0, users);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        Ristoranti.User user = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.rowristoranti, parent, false);
        }
        // Lookup view for data population
        TextView tvName = (TextView) convertView.findViewById(R.id.Nome);
        TextView tvHome = (TextView) convertView.findViewById(R.id.Distanza);
        ImageView tvIcon =(ImageView) convertView.findViewById(R.id.icona);
        // Populate the data into the template view using the data object
        tvName.setText(user.nome);
        tvHome.setText(user.Distanza);
        // Return the completed view to render on screen
        return convertView;
    }
}

Unica cosa che ho da aggiungere è che prima di darmi quella riga "strana" il dispositivo fisico mi permetteva di visualizzare l'elemento della lista , mi dava la stringa della distanza vuota e poi crascava (probabilmente per colpa dell'asyncTask) quindi posso dire che almeno per me è un piccolo passi avanti  ;-)

Consigli su come risolvere la cosa?

grazie mille a tutti!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Distanza da punto A a punto B effettiva
« Risposta #3 il: 15 Dicembre 2014, 13:32:30 CET »
0
Non è strana è il nome di una
inner class seguita dall'indirizzo in memoria di una sua istanza.

Inviato dal mio Nexus 5 utilizzando Tapatalk
« Ultima modifica: 15 Dicembre 2014, 13:34:43 CET da iceweasel »
adb logcat | tee /tmp/logcat | grep TAG

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Distanza da punto A a punto B effettiva
« Risposta #4 il: 15 Dicembre 2014, 14:28:30 CET »
0
ok ma come faccio ad ottenere  il contenuto dell'indirizzo di memoria? in cui dovrebbe esserci la distanza dal punto A al punto B

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Distanza da punto A a punto B effettiva
« Risposta #5 il: 15 Dicembre 2014, 14:32:31 CET »
0
Leggendo i ristoranti forse sei mio paesano. Di dove sei

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Distanza da punto A a punto B effettiva
« Risposta #6 il: 15 Dicembre 2014, 14:40:16 CET »
0
Leggendo i ristoranti forse sei mio paesano. Di dove sei

haha ^^ come penso avrai capito sono di Parma ^^ i posti li ho scelti col primo paese che mi è venuto in mente, e poi mi servivano dati geografici reali e precisi per testare la distanza

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Distanza da punto A a punto B effettiva
« Risposta #7 il: 17 Dicembre 2014, 12:08:21 CET »
0
ok ho cambiato il metodo con cui ottengo la distanza , ora un poco più leggibile/facile:

Codice (Java): [Seleziona]
  private class GetInfo extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... params) {

            String dist="";

            Double  lat1=44.572106,lng1=10.369672,lat2=44.519423,lng2=10.298754;

            String url="http://maps.googleapis.com/maps/api/directions/json?origin="+lat1+","+lng1+"&destination="+lat2+","+lng2+"&sensor=false&units=metric";

            try {
                HttpClient httpClient = new DefaultHttpClient();
                HttpContext localContext = new BasicHttpContext();
                HttpPost httpPost = new HttpPost(url);
                HttpResponse response = httpClient.execute(httpPost, localContext);
                InputStream in = response.getEntity().getContent();

                DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                Document doc = builder.parse(in);

                NodeList nl1 = doc.getElementsByTagName("distance");
                Node node1 = nl1.item(nl1.getLength() - 1);
                NodeList nl2 = node1.getChildNodes();
                Node node2 = nl2.item(getNodeIndex(nl2, "text"));
                Log.i("DistanceText", node2.getTextContent());

                dist=node2.getTextContent();


            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            }


            return dist;
        }
    }

così invece è come dichiaro e uso le variabili per usarle:
Codice (Java): [Seleziona]
 AsyncTask<String, Void, String> dist1;
    String dist2="Distaza:";
.....

  User newUser;

       dist1= new GetInfo().execute();
       dist2= String.valueOf(dist1);

       newUser = new User(values[1], dist2);
        adapter.add(newUser);

ma ancora ottengo la cella di memoria dove è presente la distanza....

suggerimenti?