Flutter’da Harita Entegrasyonu Nasıl Yapılır — 2

Berkay Oruç
İyi Programlama
Published in
4 min readDec 5, 2021

Giriş

Herkese merhaba. Bir önceki yazıda giriş yaptığımız Flutter için açık kaynak harita bileşeni konusuna biraz daha derinlik katarak devam ediyoruz. Bir önceki yazıya göz atmak isterseniz şuradan ulaşabilirsiniz;

Günümüzde açık kaynak veri ve teknolojilerinin önemi gün geçtikçe daha da anlaşılmakta. Bu kapsamda İBB Açık Veri Portalı’ndan yararlanarak İstanbul Halk Ekmek Büfelerinin konumlarını harita üzerinde göstereceğiz. Başlıktan da anlayabileceğiniz gibi uygulamayı Flutter kullanarak inşa edeceğiz.

Uygulamanın Oluşturulması

Öncelikle bilgisayarınızda Flutter ve ilgili SDK’ların yüklü olduğunu varsayıyoruz. Eğer yüklü değilse şuradan yükleme adımlarını takip edebilirsiniz;

İlk olarak uygulamamızı aşağıdaki kodu çalıştırarak oluşturuyoruz;

Flutter uygulamamızı oluşturuyoruz

Uygulamamızı oluşturduktan sonra kullanacağımız Flutter paketleri olan

paketlerini ‘pubspec.yaml’ dosyamıza ekliyoruz.

Klasör Yapısı

Paketlerimizi projeye eklediğimize göre klasör yapımızı kurup, uygulamayı kodlamaya başlayabiliriz. Projeyi daha iyi yönetebilmek adına sayfaların bulunacağı ‘page’, kendi yazacağımız bileşenler için ‘components’ ve servis, sabit, model gibi dosyalarımızın bulunacağı ‘core’ klasörlerini oluşturuyoruz.

Klasör yapısı
Uygulamamızın klasör yapısı

Yazılım İçeriği

Kod bloklarını anlatmaya başlamadan önce projenin kodlarına github repositorysi üzerinden ulaşabilirsiniz.

OOP prensiplerini uygulamak için öncelikle API’dan aldığımız verinin modelini oluşturuyoruz.

Halk Ekmek Büfesi verisinde kullanılacak model

API’dan aldığımız veriyi ‘http’ paketini kullanarak kaynaktan çekiyoruz ve aşağıdaki fonksiyonlar ile parse ediyoruz. Burada ‘getBuffets’ fonksiyonumuzu daha sonra FutureBuilder widgetımızda future olarak kullanacağız.

Büfe modeline uygun şeklide verilerin işlenmesi

Veriyi de çektiğimize göre yavaş yavaş harita bileşenini oluşturmaya başlayabiliriz. FlutterMap bileşenini Scaffold body parametresine ekliyoruz. Öncelikle yapmamız gereken harita bileşenine ‘options’ tanımlamak olacak. Büfe verisini cluster şeklinde göstereceğimiz için ‘plugins’ listesine ‘MarkerClusterPlugin()’ ekliyoruz. Ayrıca haritayı döndürme işlevinin olmasını istemiyoruz. Bu yüzden ‘interactiveFlags’ parametresine ‘InteractiveFlag.all & ~InteractiveFlag.rotate’ söz dizimini tanımlıyoruz.

Harita altyapısı

Verilerin Görselleştirilmesi

Harita bileşenimizin altyapısı oluşturduğumuza göre Açık Veri Portalı’ndan aldığımız verileri görselleştirme kısmına geçebiliriz. Harita teknolojilerinde yoğun nokta gösterimleri malesef performans kayıplarına neden olmakta. Bu kaybın önüne geçebilmek için büfe verimizi cluster şeklinde render edeceğiz.

İstanbul Büyükşehir Belediyesi Wifi Noktaları
Şehir haritasında bulunan cluster görünümü (Wifi Noktaları)

List<Buffet> şeklinde dönen API isteğimizi öncelikle ‘map’leyerek işlemlerimize başlıyoruz. Burda ‘Marker’ classından türettiğimiz ‘BuffetMarker’ classını kullanacağız.

Harita üzerinde göstereceğimiz büfeler

‘Marker’ classı ile ekstra bilgi taşıyamadığımız için ‘BuffetMarker’ classını türetiyoruz. Daha sonra bu ekstra bilgileri harita üzerinde açacağımız ‘popup’ içinde kullanacağız.

BuffetMarker modeli

Büfe noktalarını da ürettiğimize göre bu noktaları cluster görünümüne çevirebiliriz. ‘MarkerClusterLayerWidget’ içine vereceğimiz seçeneklerde öncelikle ürettiğimiz noktalar var. Ayrıca ‘Marker’ classından türetilmiş ‘BuffetMarker’ sayesinde noktalara tıklandığında açılacak popup içine büfenin ismini yazdırabileceğiz.

Cluster seçenekleri
Cluster görünümü

Popup seçeneklerinde bulunan ‘popupBuilder’ parametresi marker olarak yalnızca ‘Marker’ classını kabul etmekte, biz ise ‘BuffetMarker’ classını kullanıyoruz. Bu durumu ise yukarıda bahsettiğim gibi ‘BuffetMarker’ classını ‘Marker’ classından türettiğimiz için aşabiliyoruz. ‘popupBuilder’ içinden ise ‘marker as BuffetMarker’ söz dizimi sayesinde eklediğimiz ekstra verilere ulaşabiliyoruz. Yoksa yalnızca ‘Marker’ classına sahip özelliklere erişimimiz oluyor.

Popup seçenekleri
Popup

Bonus: Map Launcher

Tüm fonksiyonları tamamladıktan sonra bonus olarak bir paket eklemek istedim. Harita uygulamaları günümüzde sadece konum göstermek için değil ilgili noktaya navigasyon yapmak için de kullanılmaya evrilmekte. Tabi bu aşamada geliştirdiğimiz uygulamaya navigasyon fonksiyonu eklemek maliyetli bir işlem olacaktır. Flutter için yazılmış güzel bir paket olan ‘map_launcher’ projemize dahil oluyor. Paketin amacı telefonumuzda yüklü olan harita uygulamalarını verdiğimiz nokta koordinatları ile açmak. Birkaç satır kod ile bunu başarabiliyoruz.

Kullandığım simülatörde yalnızca Apple Haritalar yüklü olduğu için popup’a tıklanıldığında harita uygulamaları listesinde o görünüyor. Uygulama seçildiğinde ilgili uygulamada başlığını verdiğiniz bir pin atılarak uygulama açılır.

İlgili uygulamada noktanın pini atılı bir şekilde açılır

Sonuç

Günümüzde her ne kadar Google Maps gibi servisler çok güçlü harita özellikleri sağlasa da özellikle yüksek kullanımlarda ciddi maddi yükler geliştiricileri yormaktadır. Buna karşın açık kaynak olarak geliştirilen projeler veri anlamında geliştiricilere çok geniş alanlar sunmasa da fonksiyonellik açısından ticari rakiplerinden eksik kalmıyorlar. Bu yazıda da harita fonksiyonlarına ihtiyacı olan ve bir veri bağımlılığı kısmen az olan geliştiriciler için ‘flutter_map’ paketini ilk yazıma göre derinlemesine incelemeye çalıştım.

İBB’nin sağlamış olduğu açık veri portalından ulaştığımız verileri harita üzerinde verimli bir şekilde görselleştirmeye çalıştım. Uygulamayı github hesabımdan açık kaynak olarak bulabilir, geliştirmeme yardımda bulunabilirsiniz. Görüş, istek ve önerilerinizi de sosyal medya ve eposta kanalları ile iletebilirsiniz. Herkese mutlu günler, hatasız kodlar :)

Uygulamanın ekran kaydı

--

--