Autore Topic: Collegare 2 Marker in una mappa  (Letto 1200 volte)

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Collegare 2 Marker in una mappa
« il: 05 Marzo 2014, 10:59:34 CET »
0
Salve
in una mappa ho inserito 2 Marker. Adesso è possibile collegarli con un percorso ad esempio quello via macchina? o via a piedi?

Offline white$hark

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Windows 7
Re:Collegare 2 Marker in una mappa
« Risposta #1 il: 05 Marzo 2014, 13:02:53 CET »
0

Offline FrancescoAndroid

  • Utente junior
  • **
  • Post: 69
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    GiMiSiS Interactive
  • Sistema operativo:
    Android 2.3.3
Re:Collegare 2 Marker in una mappa
« Risposta #2 il: 07 Marzo 2014, 12:02:39 CET »
0
Salve
in una mappa ho inserito 2 Marker. Adesso è possibile collegarli con un percorso ad esempio quello via macchina? o via a piedi?

servirebbe qualche informazioni in più per poterti aiutare

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Collegare 2 Marker in una mappa
« Risposta #3 il: 07 Marzo 2014, 16:12:32 CET »
0
servirebbe qualche informazioni in più per poterti aiutare

ho risolto grazie ;-)

Offline white$hark

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Windows 7
Re:Collegare 2 Marker in una mappa
« Risposta #4 il: 07 Marzo 2014, 16:34:07 CET »
0
potresti postare il codice? sto cercando una soluzione funzionante ma non riesco ad avere il percorso.

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Collegare 2 Marker in una mappa
« Risposta #5 il: 07 Marzo 2014, 21:08:54 CET »
0
potresti postare il codice? sto cercando una soluzione funzionante ma non riesco ad avere il percorso.

Ti posto le 2 classi che fanno il lavoro!  mMode si riferisce a Auto o a Piedi

Codice (Java): [Seleziona]
public class GetRotueListTask extends AsyncTask<Void, Void, Void> {
        private final Context mContext;
        GMapV2Direction mGMDirection = new GMapV2Direction();
        LatLng fromPosition;
        LatLng toPosition;
        List<LatLng> mPointList;
        private ProgressDialog dialog;
        private int mDirectionMode;

        DirecitonReceivedListener mListener;
 
        public GetRotueListTask(Context context, LatLng fromPosition,
                        LatLng toPosition, int mDirectionMode,
                        DirecitonReceivedListener mListener) {
                this.mContext = context;
                this.fromPosition = fromPosition;
                this.toPosition = toPosition;
                this.mDirectionMode = mDirectionMode;
                this.mListener = mListener;
        }

        @Override
        protected Void doInBackground(Void... params) {
                mGMDirection.setParams(fromPosition, toPosition, mDirectionMode);
                mPointList = mGMDirection.getPointList(this.mContext);
                return null;
        }

        @Override
        protected void onPostExecute(Void result) {
       
                if (mPointList != null) {
                        mListener.OnDirectionListReceived(mPointList);
                } else {
                        Toast.makeText(this.mContext, "Error downloading direction!",
                                        Toast.LENGTH_LONG).show();
                }
        }


Codice (Java): [Seleziona]
public class GMapV2Direction {

        LatLng src, dest;
        public List<LatLng> pointToDraw;

        public static final int MODE_DRIVING = 1;
        public static final int MODE_WALKING = 2;

        public int mDirectionMode;

        public void setParams(LatLng src, LatLng dest, int mMode) {
                this.src = src;
                this.dest = dest;
                this.mDirectionMode = mMode;
        }

        public List<LatLng> getPointList(Context mContext) {
                if (src != null || dest != null) {
                        // connect to map web service
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost(makeUrl(src, dest));
                        HttpResponse response;
                        try {
                                response = httpclient.execute(httppost);

                                HttpEntity entity = response.getEntity();
                                InputStream is = null;

                                is = entity.getContent();
                                BufferedReader reader = new BufferedReader(
                                                new InputStreamReader(is, "iso-8859-1"), 8);
                                StringBuilder sb = new StringBuilder();
                                sb.append(reader.readLine() + "\n");
                                String line = "0";
                                while ((line = reader.readLine()) != null) {
                                        sb.append(line + "\n");
                                }
                                is.close();
                                reader.close();
                                String result = sb.toString();
                                JSONObject jsonObject = new JSONObject(result);
                                JSONArray routeArray = jsonObject.getJSONArray("routes");
                                JSONObject routes = routeArray.getJSONObject(0);
                                JSONObject overviewPolylines = routes
                                                .getJSONObject("overview_polyline");
                                String encodedString = overviewPolylines.getString("points");
                                pointToDraw = decodePoly(encodedString);
                        } catch (ClientProtocolException e) {
                                e.printStackTrace();
                        } catch (IOException e) {
                                e.printStackTrace();
                        } catch (Exception e) {
                                e.printStackTrace();
                        }

                        return pointToDraw;
                } else {
                        throw new NullPointerException(
                                        "Source or Destination coordinate is null. You must call \"setParams(LatLng,LatLng)\" method first!");
                }
        }

        private List<LatLng> decodePoly(String poly) {

                int len = poly.length();
                int index = 0;
                List<LatLng> decoded = new LinkedList<LatLng>();
                int lat = 0;
                int lng = 0;

                while (index < len) {
                        int b;
                        int shift = 0;
                        int result = 0;
                        do {
                                b = poly.charAt(index++) - 63;
                                result |= (b & 0x1f) << shift;
                                shift += 5;
                        } while (b >= 0x20);
                        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
                        lat += dlat;

                        shift = 0;
                        result = 0;
                        do {
                                b = poly.charAt(index++) - 63;
                                result |= (b & 0x1f) << shift;
                                shift += 5;
                        } while (b >= 0x20);
                        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
                        lng += dlng;

                        decoded.add(new LatLng((lat / 1E5), (lng / 1E5)));
                }

                return decoded;
        }

        private String makeUrl(LatLng src, LatLng dest) {

                StringBuilder urlString = new StringBuilder();

                urlString.append("http://maps.googleapis.com/maps/api/directions/json");
                //http://maps.googleapis.com/maps/api/directions/json?
                // from
                urlString.append("?origin=");
                urlString.append(Double.toString((double) src.latitude));
                urlString.append(",");
                urlString.append(Double.toString((double) src.longitude));
                // to
                urlString.append("&destination=");
                urlString.append(Double.toString((double) dest.latitude));
                urlString.append(",");
                urlString.append(Double.toString((double) dest.longitude));
                urlString.append("&sensor=false&units=metric");

                if (mDirectionMode == MODE_DRIVING) {
                        urlString.append("&mode=driving");
                } else if (mDirectionMode == MODE_WALKING) {
                        urlString.append("&mode=walking");
                }

                Log.d("Request URL", "URL=" + urlString.toString());
                return urlString.toString();
        }

        public interface DirecitonReceivedListener {
                public void OnDirectionListReceived(List<LatLng> mPointList);
        }

Offline white$hark

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Windows 7
Re:Collegare 2 Marker in una mappa
« Risposta #6 il: 08 Marzo 2014, 11:48:09 CET »
0
Ti ringrazio per le classi, però non riesco a capire dove impostare i parametri di partenza e arrivo e come passarli alla classe che crea la richiesta.

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Collegare 2 Marker in una mappa
« Risposta #7 il: 08 Marzo 2014, 12:53:06 CET »
0
Ti ringrazio per le classi, però non riesco a capire dove impostare i parametri di partenza e arrivo e come passarli alla classe che crea la richiesta.

nella activity principale metti questo

Codice (Java): [Seleziona]
private void setUpMapIfNeeded() {
                // Do a null check to confirm that we have not already instantiated the
                // map.
                if (mMap == null) {
                        // Try to obtain the map from the SupportMapFragment.
                        mMap = ((SupportMapFragment) getSupportFragmentManager()
                                        .findFragmentById(R.id.map)).getMap();
                        // Check if we were successful in obtaining the map.
                        if (mMap != null) {
                                setUpMap();
                        }
                }
        }
       
        private void setUpMap() {

                mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                mMap.setMyLocationEnabled(true);
                //mMap.setIndoorEnabled(true);
                /*mMap.getUiSettings().setZoomControlsEnabled(true);
                mMap.getUiSettings().setMyLocationButtonEnabled(true);
                mMap.getUiSettings().setCompassEnabled(true);
                mMap.getUiSettings().setAllGesturesEnabled(true);*/

               
                mMap.setMyLocationEnabled(true);

                // Enable / Disable zooming controls
                mMap.getUiSettings().setZoomControlsEnabled(false);

                // Enable / Disable my location button
                mMap.getUiSettings().setMyLocationButtonEnabled(true);

                // Enable / Disable Compass icon
                mMap.getUiSettings().setCompassEnabled(true);

                // Enable / Disable Rotate gesture
                mMap.getUiSettings().setRotateGesturesEnabled(true);

                // Enable / Disable zooming functionality
                mMap.getUiSettings().setZoomGesturesEnabled(true);

                mMap.setOnInfoWindowClickListener(this);

        }

        public void clearMap() {
                mMap.clear();
        }

        @Override
        public void onClick(View v) {
                if (v == btnDirection) {
                        clearMap();

                        MarkerOptions mDestination = new MarkerOptions()
                                        .position(destinationPosition)
                                        .title(destinationPositionTitle)
                                        .snippet(destinationPositionSnippet)
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_mensamaps));

                        MarkerOptions mStart = new MarkerOptions()
                                        .position(startPosition)
                                        .title(startPositionTitle)
                                        .snippet(startPositionSnippet)
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_usermaps));

                        mMap.addMarker(mDestination);
                        mMap.addMarker(mStart);

                        if (tbMode.isChecked()) {
                                new GetRotueListTask(MapsMensa.this, startPosition,
                                                destinationPosition, GMapV2Direction.MODE_DRIVING, this)
                                                .execute();
                        } else {
                                new GetRotueListTask(MapsMensa.this, startPosition,
                                                destinationPosition, GMapV2Direction.MODE_WALKING, this)
                                                .execute();
                        }
                }
        }

        @Override
        public void OnDirectionListReceived(List<LatLng> mPointList) {
                if (mPointList != null) {
                        PolylineOptions rectLine = new PolylineOptions().width(10).color(
                                        Color.RED);
                        for (int i = 0; i < mPointList.size(); i++) {
                                rectLine.add(mPointList.get(i));
                        }
                        mMap.addPolyline(rectLine);

                        CameraPosition mCPFrom = new CameraPosition.Builder()
                                        .target(startPosition).zoom(15.5f).bearing(0).tilt(25)
                                        .build();
                        final CameraPosition mCPTo = new CameraPosition.Builder()
                                        .target(destinationPosition).zoom(15.5f).bearing(0)
                                        .tilt(50).build();

                        changeCamera(CameraUpdateFactory.newCameraPosition(mCPFrom),
                                        new CancelableCallback() {
                                                @Override
                                                public void onFinish() {
                                                        changeCamera(CameraUpdateFactory
                                                                        .newCameraPosition(mCPTo),
                                                                        new CancelableCallback() {

                                                                                @Override
                                                                                public void onFinish() {

                                                                                        LatLngBounds bounds = new LatLngBounds.Builder()
                                                                                                        .include(startPosition)
                                                                                                        .include(
                                                                                                                        destinationPosition)
                                                                                                        .build();
                                                                                        changeCamera(
                                                                                                        CameraUpdateFactory
                                                                                                                        .newLatLngBounds(
                                                                                                                                        bounds, 50),
                                                                                                        null, false);
                                                                                }

                                                                                @Override
                                                                                public void onCancel() {
                                                                                }
                                                                        }, false);
                                                }

                                                @Override
                                                public void onCancel() {
                                                }
                                        }, true);
                }
        }

        /**
         * Change the camera position by moving or animating the camera depending on
         * input parameter.
         */

        private void changeCamera(CameraUpdate update, CancelableCallback callback,
                        boolean instant) {

                if (instant) {
                        mMap.animateCamera(update, 1, callback);
                } else {
                        mMap.animateCamera(update, 4000, callback);
                }
        }

        @Override
        public void onInfoWindowClick(Marker selectedMarker) {

                if (selectedMarker.getTitle().equals(startPositionTitle)) {
                        Toast.makeText(this, "Marker Clicked: " + startPositionTitle,
                                        Toast.LENGTH_LONG).show();
                } else if (selectedMarker.getTitle().equals(destinationPositionTitle)) {
                        Toast.makeText(this, "Marker Clicked: " + destinationPositionTitle,
                                        Toast.LENGTH_LONG).show();
                }
                selectedMarker.hideInfoWindow();

        }

Offline white$hark

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Windows 7
Re:Collegare 2 Marker in una mappa
« Risposta #8 il: 08 Marzo 2014, 17:26:32 CET »
0
niente, non riesco a visualizzare un percorso anche cercando di adattare il tuo codice al mio.  :-[

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Collegare 2 Marker in una mappa
« Risposta #9 il: 08 Marzo 2014, 17:34:25 CET »
0
niente, non riesco a visualizzare un percorso anche cercando di adattare il tuo codice al mio.  :-[

quel è l'errore?

Offline white$hark

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Windows 7
Re:Collegare 2 Marker in una mappa
« Risposta #10 il: 08 Marzo 2014, 17:52:15 CET »
0
nullPointerException. posto la mia activity

Codice (Java): [Seleziona]
public class MapView extends FragmentActivity {

        private final LatLng STARTING_POINT = new LatLng(41.9100711,12.5359979);

        private GoogleMap map;

        CameraPosition cameraPosition = new CameraPosition.Builder()
                        .target(STARTING_POINT).zoom(15).bearing(90)
                        .tilt(30).build();

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

                anima();

                map.getUiSettings().setMyLocationButtonEnabled(true);
                map.setMyLocationEnabled(true);

                map.addMarker(new MarkerOptions()
                                .position(STARTING_POINT)
                                .title("Start")
                                .icon(BitmapDescriptorFactory
                                                .defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

                LatLng camp = new LatLng(45.4640704,9.1719064);
                map.addMarker(new MarkerOptions().position(camp).title("End"));

                map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

                        @Override
                        public void onInfoWindowClick(Marker marker) {

                                double latitude = marker.getPosition().latitude;
                                double longitude = marker.getPosition().longitude;
                                String label = "Mio punto";
                                String uriBegin = "geo:" + latitude + "," + longitude;
                                String query = latitude + "," + longitude + "(" + label + ")";
                                String encodedQuery = Uri.encode(query);
                                String uriString = uriBegin + "?q=" + encodedQuery + "&z=16";
                                Uri uri = Uri.parse(uriString);
                                Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                                                uri);
                                startActivity(intent);

                        }
                });
/*
                map.setOnMyLocationButtonClickListener(new OnMyLocationButtonClickListener() {

                        @Override
                        public boolean onMyLocationButtonClick() {

                                map.getMyLocation();

                                // Toast.makeText(getApplicationContext(),
                                                                                // "click",
                                // Toast.LENGTH_SHORT).show(); // verifica gps ecc

                                return true;
                        }
                });
*/

                Button cambia = (Button) findViewById(R.id.cambiatipo);

                cambia.setOnClickListener(new OnClickListener() {

                        public void onClick(View v) {

                                map.setMapType(GoogleMap.MAP_TYPE_HYBRID);

                        }

                });

                Button cambia1 = (Button) findViewById(R.id.cambia);
                cambia1.setOnClickListener(new OnClickListener() {

                        public void onClick(View v) {

                                map.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                        }

                });

                Button anima = (Button) findViewById(R.id.end);
                anima.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) { // TODO Auto-generated method
                                CameraPosition cameraPosition = new CameraPosition.Builder()
                                                .target(new LatLng(45.4640704,9.1719064)).zoom(18)
                                                .bearing(90).tilt(20).build();

                                map.animateCamera(CameraUpdateFactory
                                                .newCameraPosition(cameraPosition));

                        }
                });

        }

        private void animazione() { // TODO Auto-generated method stub

                map.moveCamera(CameraUpdateFactory.newLatLngZoom(STARTING_POINT, 5));

                map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

        }

è una classe di prova per iniziare a vedere come funzionano le maps api, implementata nel modo più sbagliato possibile, ma per delle prove basta.
Adesso, se inserissi un Button in modo che al click su questo mi venga mostrato il percorso tra i miei 2 marker come dovrei procedere?

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Collegare 2 Marker in una mappa
« Risposta #11 il: 08 Marzo 2014, 18:23:38 CET »
0
ti copio anche quello che ho in OnCreate nella Activity principale..

Codice (Java): [Seleziona]
@Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_maps_mensa);
               
               
                double latitude=0;
                double longitude=0;
                 double latitude1=0;
                 double longitude1=0;
                Bundle bundle = getIntent().getExtras();
               
                nome = bundle.getString(Mense.ROW_ID6);
                via = bundle.getString(Mense.ROW_ID7);
                indirizzo = bundle.getString(Mense.ROW_ID8);
               
                Geocoder geoCoder = new Geocoder(this, Locale.getDefault());    
                List<Address> address;
                try {
                        address = geoCoder.getFromLocationName("Florence"+" "+via, 1);
                         latitude = address.get(0).getLatitude();
                 longitude = address.get(0).getLongitude();
               
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }    
               
                 Address ad;
                try {
                        ad = geoCoder.getFromLocationName(indirizzo, 1).get(0);
                     latitude1 = ad.getLatitude();
                 longitude1 = ad.getLongitude();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }    
             
           
       
               
                startPosition = new LatLng(latitude1, longitude1);
                startPositionTitle = "Utente";
                startPositionSnippet = "";

                destinationPosition = new LatLng(latitude,longitude);
                destinationPositionTitle = nome;
                destinationPositionSnippet = "";
               
                btnDirection = (Button) findViewById(R.id.btnDirection);
                btnDirection.setOnClickListener(this);

                tbMode = (ToggleButton) findViewById(R.id.tbMode);

                tbMode.setChecked(true);

                setUpMapIfNeeded();

dove il layout è:

Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:layout_alignParentLeft="true"
   android:layout_alignParentTop="true"
   android:orientation="vertical" >

    <fragment
       android:id="@+id/map"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_margin="5dp"
       class="com.google.android.gms.maps.SupportMapFragment" />

        <ToggleButton
           android:id="@+id/tbMode"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignTop="@+id/map"
           android:layout_toRightOf="@+id/btnDirection"
           android:textOff="Piedi"
           android:textOn="Auto" />

        <Button
           android:id="@+id/btnDirection"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignLeft="@+id/map"
           android:layout_alignTop="@+id/map"
           android:layout_marginLeft="62dp"
           android:text="@string/getdirection" />

</RelativeLayout>