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
0 Beğeni
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