Google Harita ile Yer İşaretleri

Fatih Kurçenli
CNK Tech
Published in
4 min readSep 1, 2021

Merhabalar arkadaşlar bu yazımda mobil dünyasında çokça kullandığımız haritalardaki işaretlerden bahsedeceğim. Bildiğiniz üzere konum adresimiz gönderirken veya bir konumu bulmak için işaretler kullanırız ve o adrese doğru yolculuk ederiz. Bazen ise bu adresler bir banka ATM’si, bazen bir restoran, bazen bir hastane gibi devam etmekte. Bazı yerlerde düşünüldüğünde birden fazla ATM bankasını işaretlemek zorunda kalıyoruz ve burada işaretler iç içe giriyor ve kaç ATM bankası sayısını bilmekte zorlanıyoruz. Haritalarda bu kısmı düzeltmek için Google Maps’te kullandığımız Cluster yapısını bugün değineceğim.

💻 İşaretçilerimizden önce google maps’imizi kuralım ve ekranımızda gösterlim. Eklememiz gereken iki kütüphaneyi app modulü altında dependency kısmında ekliyoruz. Birincisi Google Maps servisimiz ikincisi ise Cluster yapımız için kullanacağız. Eğer bu yazı tarihinden sonra güncellemeler geldiyse güncel değerlerini giriniz.

//Google Maps
implementation 'com.google.android.gms:play-services-maps:17.0.1'
implementation 'com.google.maps.android:android-maps-utils:2.2.5'

Kütüphanelerimizi eklediğimize göre diğer bir kısım olan Google Map API key alıyoruz ve local.properties MAPS_API_KEY=? yazıyoruz ve manifest dosyamızda meta data olarak ve google gms version meta datamızı ekliyoruz. İnternet izni ve lokasyon bilgisini almak için izinlerimizi ekliyoruz. Meta datamız <application... tagın içerisinde olmasına dikkat ediyoruz. Eğer uygulamamız API leveli 28 ve üstü ve kütüphanemiz 16.0.0 üstü ise Google apache.http.legacy metadatamızı eklememizi istiyor aksi takdirde eklememize gerek olmadığı yazmakta.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<application...<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<!-- Eğer api levelimiz 28 ve üstüyse eklememiz gerekiyor-->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
</application>

Kullanıcıdan lokasyon iznini isteyeceğiz neden kabul etmesi gerek hakkında bilgi vereceğiz. İzinler hakkında çok yakında bir yazı daha gelecek. Şimdilik izin için istenen kodu aşağıdaki gibi yazıyoruz.

Şimdi xml dosyamızı düzenleyelim main sayfamızda bir framelayout koyarak fragmentımızı koyacağız.

Fragment yapımızı tasarımını yapalım.

MainActivity’de fragmentımızı ekliyoruz.

Tasarımlarımız tamamladıktan sonra fragment yapımızı yazalım.Boş bir fragment yapısı oluşturuyoruz. Maps koyacağımız fragment view supportMapFragment sayesinde fragment yapımızı setliyoruz.

//onCreatedView kısmında view layoutumuzu setleyip dönüyoruz.
View view = inflater.inflate(R.layout.fragment_map, container, false);
//initialize map fragment
SupportMapFragment supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.google_map);

Artık nesnesini ürettiğimizin supportMapFragment yapısında getAsyncMap fonksiyonumuzu çağırıyoruz. Asenkron fonksiyonlar uygulamamız açılırken yeni bir thread açarak asenkron bir şekilde çalışmasını sağlar bu sayede kullanıcı UI ekranında kasma görmemekte ve stabil bir şekilde arka tarafta isteklerimizi atarken kullanıcı uygulamada gezinebilmeyi sağlamakta.

private GoogleMap mMap;
private ClusterManager<MyClusterItem> clusterManager;
supportMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
mMap = googleMap;
}
});

onMapReady fonksiyonumuz override ederek artık googleMap nesnemize erişebilmekteyiz. Private olarak sınıfımızın içerisinde fonksiyonlarımız erişmesi için GoogleMap’ten mMap nesnesine eşitliyoruz.

Sırada Cluster’larımızı yerleştirmekte. Öncelikle MyClusterItem adlı bir sınıf kuruyoruz ve ClusterItem’dan impelements almasını sağlıyoruz. ClusterItem kütüphanesi import ediyoruz.

import com.google.maps.android.clustering.ClusterItem;

MyClusterItem yapımızda new bir position için latitude and longitude değerlerini constructor yapımızda alıyoruz ayrıca her bir yer işareti için title ve snippet alanı alıyoruz. ve ClusterItem’dan implements aldığımız fonksiyonlarımızı override ediyoruz. Pozisyon değeri null bir değer olamaması için NonNull annotation yazıyoruz. Şimdi setupCluster() fonksiyonumuzu oluşturuyoruz. Bu fonksiyonumuzda ClusterManager nesnemizi setliyoruz. Ayrıca başlangıç olarak İstanbul kordinatlarını veriyorum ve açıldığı zaman map ilk olarak İstanbul açılmasını sağlıyoruz

ClusterManager nesnesi oluşturuyoruz ve bu nesnemize context ve oluşturduğumuz mMap(GoogleMap) nesnesini consturctora veriyoruz. Eğer activity kullanıyorsak thisdiyerek context yapısına erişebiliriz. mMap yapımıza setOnCameraIdleListener() yapısına oluşturduğumuz clusterManager nesnemizi veriyoruz. Bu sayede clusterManager yapımız map hareketliliklerini dinleyerek işlem yapacaktır. Ayrıca Mapte tıklama hareketlerini de setliyoruz. Yer işaretlerimizi oluşturmak için setMarkerList() fonksiyonumuzu yazıyoruz.

Datalarımızı yüklüyoruz. Buradaki değerleri ben Mock data olarak ekledim. Eğer servisten gelen verileriniz var ise burada setlemeniz gerekmektedir. Son olarak Fragment yapımız aşağıdaki gibi olmaktadır.

Sonuç olarak belli bir alanda birden fazla yer işaretleri olduğu zaman eğer haritayı büyüttüğümüzde yer işaretleri toplanarak kaç tane yer işareti olduğunu gösteren haritamızı elde etmiş oluyoruz.

Cluster Markers

Uygulamanın github linki;

--

--