Soru & Cevap

Harita Üzerinde Yol Çizmek

18.05.2015 - 11:37

Merhabalar Arkadaşlar, Harita üzerinde iki konum arasında yol çizmem için ne kullanmam gerekiyor acaba?

864 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-66405-1449241617.jpg
murat34can52
11.02.2016 - 08:44

Gülşah çok güzel anlatmışsın ya :D
Herneyse gelelim konumuza..

Google maps v2 üzerinde harita çizmek nasıl olur. Aradan baya zaman geçmiş ama bende şuan 8 ay 4 hafta diyor

internette çok fazla türkçe kaynak yok daha doğrusu yeni yok. bende stackover üzerinden genelde gittiğim için sizlere anlatıcağım birde kaynakları belirteceğim.

ben fonksiyon üzerinden yaptım çünkü kod kalabalığı oluyor.

Bir class oluşturalım adı rota.class içerisine verdiğim kodları yapıştırın.

import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Color;
import android.os.AsyncTask;
import android.util.Log;

import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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 java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ProgrammerDky on 11.02.2016.
 */
public class rota {

    private Context cnt;
    public rota(Context c)
    {
        this.cnt = c;
    }

    public String makeURL (double sourcelat, double sourcelog, double destlat, double destlog){
        StringBuilder urlString = new StringBuilder();
        /*
        if(mode == null)
            mode = "driving";*/

        urlString.append("http://maps.googleapis.com/maps/api/directions/json");
        urlString.append("?origin=");// from
        urlString.append(Double.toString(sourcelat));
        urlString.append(",");
        urlString
                .append(Double.toString( sourcelog));
        urlString.append("&destination=");// to
        urlString
                .append(Double.toString( destlat));
        urlString.append(",");
        urlString.append(Double.toString( destlog));
        urlString.append("&sensor=false&mode=driving&alternatives=true&language=tr");
        return urlString.toString();
    }

    public static class JSONParser {

        static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";
        // constructor
        public JSONParser() {
        }
        public String getJSONFromUrl(String url) {

            // Making HTTP request
            try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }

                json = sb.toString();
                is.close();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }
            return json;

        }
    }

    public void drawPath(String  result) {

        try {
            //Tranform the string into a json object
            final JSONObject json = new JSONObject(result);
            JSONArray routeArray = json.getJSONArray("routes");
            JSONObject routes = routeArray.getJSONObject(0);
            JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
            String encodedString = overviewPolylines.getString("points");
            List<LatLng> list = decodePoly(encodedString);
            Polyline line = harita.googleHarita.addPolyline(new PolylineOptions()
                            .addAll(list) // tüm listeyi tek seferde ekleme.
                            .width(12)
                            .color(Color.parseColor("#05b1fb"))//Google maps blue color
                            .geodesic(true)
            );
           /* tek tek ekler ama gerek yok.
           for(int z = 0; z<list.size()-1;z++){
                LatLng src= list.get(z);
                LatLng dest= list.get(z+1);
                Polyline line = mMap.addPolyline(new PolylineOptions()
                .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude,   dest.longitude))
                .width(2)
                .color(Color.BLUE).geodesic(true));
            }
           */
        }
        catch (JSONException e) {

        }
    }

    public List<LatLng> decodePoly(String encoded) {

        List<LatLng> poly = new ArrayList<LatLng>();
        int index = 0, len = encoded.length();
        int lat = 0, lng = 0;

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

            LatLng p = new LatLng( (((double) lat / 1E5)),
                    (((double) lng / 1E5) ));
            poly.add(p);
        }

        return poly;
    }

    public class rotaCizAsyncTask extends AsyncTask<Void, Void, String> {
        private ProgressDialog progressDialog;
        String url;
        rotaCizAsyncTask(String urlPass){
            url = urlPass;
        }
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            progressDialog = new ProgressDialog(cnt);
            progressDialog.setMessage("Rota hesaplanıyor lütfen bekleyiniz...");
            progressDialog.setIndeterminate(true);
            progressDialog.show();
        }
        @Override
        protected String doInBackground(Void... params) {
            JSONParser jParser = new JSONParser();
            String json = jParser.getJSONFromUrl(url);
            return json;
        }
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            progressDialog.hide();
            if(result!=null){
                drawPath(result);
            }
        }
    }

}

Classta tek bi yerde değişiklik yapıcaksınız.
harita.googleHarita  Yazan kısımda harita benim activity class mın adı yani orayada hangi activityde göstermek istiyorsanız o class ın adını yazıcaksınız.
bu sayede aşağıda göstermiş oldugum kullanımda static GoogleMaps googleHarita dan anlarsanız sınız ztn.

Evet şimdik örnek kullanım kodlarını vericeğim.

// global olarak ekleyelim static olma sebebi class üzerinden haritaya değişiklik verdiğimiz içindir.
static GoogleMap googleHarita;
rota rt = new rota(this); // global olarak tanımlayın


// ONCREATE kısmında google haritamızı harita ayarlarını v.s şeylerini yapalım 
// bunları ekstra olarak koyuyorum birilerinin işine yarar diye

googleHarita = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.haritafragment)).getMap();
googleHarita.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

}
googleHarita.getUiSettings().setZoomControlsEnabled(true);
googleHarita.getUiSettings().setZoomGesturesEnabled(true);
googleHarita.setMyLocationEnabled(true);
googleHarita.getUiSettings().setMyLocationButtonEnabled(true);
googleHarita.getUiSettings().setMapToolbarEnabled(false);
googleHarita.getUiSettings().setMyLocationButtonEnabled(true);
googleHarita.setTrafficEnabled(true);
googleHarita.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(41.01, 28.58), 8));

//////////////////////////////////////////////////////////////

// ÖRNEK bir button eventinin içine yazdığınızı varsayıyorum.

locationManager = (LocationManager)getSystemService(LOCATION_SERVICE); // gps ve internet kontrolü için gerekli. kendi konumuzun servisini kullanmamız gerekiyor.

boolean isGPSEnabled = locationManager
		.isProviderEnabled(LocationManager.GPS_PROVIDER); // gps durumu kontrolü

// getting network status
boolean isNetworkEnabled = locationManager
		.isProviderEnabled(LocationManager.NETWORK_PROVIDER); // internet durumu kontrolü

if (isGPSEnabled && isNetworkEnabled) { // 2 side açık ise girecek.
	Location lc =googleHarita.getMyLocation(); // google maps üzerinden kendi konumunu alma.

	if(lc != null) {
		double lat = lc.getLatitude(); // enlem
		double lng = lc.getLongitude(); // boylam
		googleHarita.clear(); // önceden oluşturulmuş markerleri temizlemek için.
		googleHarita.addMarker(new MarkerOptions().position(new LatLng(lat, lng)).title("Ben")); // bulundugum yeri işaretliyorum yani marker koyuyoruz.
		googleHarita.addMarker(new MarkerOptions().position(new LatLng(gidilecekEnlem,gidilecekBoylam).title("Gideceğim Yer")); // gideceğim yeri işaretliyorum yani marker koyuyoruz.
		

		String url = rt.makeURL(lat, lng, gidilecekEnlem, gidilecekBoylam); // googleden rota bilgilerini almak için url oluşturuyoruz.
// örnek test yapmak istiyorsanız.
//http://maps.googleapis.com/maps/api/directions/json?origin=40.90%2C29.90&destination=40.85%2C29.80&sensor=false&mode=driving&alternatives=true&language=tr
// tarayıcıya yapıştırın örnek gidişatın kodlarını görün.

		rt.new rotaCizAsyncTask(url).execute(); // bu kısım rota class kısmı url gönderiyoruz ve rotamız oluşturulucak.

		googleHarita.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 8)); // kamerayı bulunduğumuz yere getiriyoruz.
        
	}
	else
		Toast.makeText(getApplicationContext(), "Seni bulamadık lütfen tekrar dene.", Toast.LENGTH_SHORT).show();
}
else
	Toast.makeText(getApplicationContext(), "GPS kapalı", Toast.LENGTH_SHORT).show();




Kullandıgım kaynaklar:
Daha çok var ama sağlam olanları bunlar.

http://stackoverflow.com/questions/14702621/answer-draw-path-between-two-points-using-google-maps-android-api-v2

https://github.com/tato469/Android/blob/master/routes%20googleMaps%20v2/Route.java

picture-14630-1392671719.jpg
gulsahgul
18.05.2015 - 11:45
Google Directions API