Şimdi yükleniyor

.NET MAUI 11 Harita Pin Kümeleme: Sahadan Rehber

.NET MAUI 11 Harita Pin Kümeleme: Sahadan Rehber

Bir harita üstüne 50 pin atıyorsun, ekran bir anda okunmaz hâle geliyor. 200 pin olunca iş iyice dağılıyor. Bunu hepimiz yaşadık. Ben geçen yıl bir lojistik firmasının araç takip uygulamasında tam olarak bununla uğraştım — İstanbul haritasında 400+ araç pini üst üste binmişti ve müşteri “bu ne biçim uygulama” dedi, haklıydı da (yanlış duymadınız). Neyse, artık.NET MAUI 11 Preview 3 ile pin clustering özelliği kutudan çıkıyor. Tek satır kod. Ciddi ciddi.

İlginç olan şu ki, Bu yazıda sadece “bu özellik geldi, şöyle açılıyor” demeyeceğim. Bunu zaten herkes yazar. Ben daha çok gerçek projelerde nasıl davranır, hangi yerde tökezler, Türkiye’deki mobil ekipler bunu nasıl değerlendirmeli, biraz önü konuşmak istiyorum.

Pin Clustering Nedir, Neden Bu Kadar Beklendi?

Tuhaf ama, Pin clustering dediğimiz şey aslında basit: haritadaki birbirine yakın pinleri tek bir küme işaretçisi altında topluyor. Zoom out yaptığında pinler birleşiyor, zoom in yaptığında tekrar açılıyor. Kağıt üstünde kolay dürüyor ama pratikte baya işe yarıyor;.NET MAUI tarafında bu parçanın eksik olması açıkçası can sıkıcıydı. GitHub issue’su #11811 yıllardır açık kaldı, yorumlar birikti, “+1” yağdı, yanı konu epey uzadı da uzadı.

Açıkçası, Platform tarafına bakınca işin garip kısmı şuydu: iOS MapKit zaten clustering destekliyordu, Android tarafında da benzer çözümler vardı ama.NET MAUI wrapper bunu düzgün vermiyordu. Yanı altyapı varmış gibi dürüyor, ama aradaki katmanda delik kalıyordu. Şey… sınır bozucu olan da tam buydu.

Gerçek Hayatta Ne İşe Yarıyor?

Düşün bir emlak uygulaması yapıyorsun. İstanbul’da 3000 ilan var ve hepsini haritada göstermen gerekiyor. Clustering olmadan ekran resmen pin çöplüğüne dönüyor; kullanıcı tıklayacak yer bulamıyor, performans düşüyor, uygulama ağırlaşıyor. Clustering ile zoom seviyesine göre “bu bölgede 47 ilan var” gibi tek bir küme görünüyor, kullanıcı yakınlaştırdıkça detaylar açılıyor. Basit ama etkisi büyük.

2024 başında bir sağlık uygulaması projesinde Ankara’daki eczaneleri haritada gösteriyorduk ve üçüncü parti bir clustering kütüphanesi kullanmak zorunda kalmıştık. Kütüphane güncellenmiyordu, yeni.NET MAUI sürümleriyle uyumsuzluk çıkarıyordu; her release’te ufak ufak patlıyordu resmen. Şimdi bunun native gelmesiyle o bağımlılıklardan kurtuluyoruz. Benim için en sevindirici taraf bu öldü.

İşte tam da bu noktada devreye giriyor.

Tek Satırla Kümelemeyi Açmak

İtiraf edeyim, İşin güzel yanı şu: ortada karmaşık bir kurulum yok. Tek property yeterli:

<maps:Map IsClusteringEnabled="True" />

Bitti gerçekten. Yakın pinler otomatik gruplanıyor ve her kümenin üstünde kaç pin olduğunu gösteren küçük bir badge çıkıyor. İlk gördüğümde “bu kadar mı?” dedim, sonra “iyi ya, böyle sade olsun zaten” diye düşündüm kendi kendime.

Ama dur bir saniye — sadelik güzel de her zaman yetmiyor. Mesela küme ikonunun rengini ya da şeklini değiştirmek istersen ne olacak? Preview aşamasında bu tarz özelleştirmeler biraz sınırlı dürüyor. Platform tarafında iOS MapKit’in native küme animasyonları gayet düzgün çalışıyor, Android tarafı işe custom grid-based algoritma kullanıyor; yanı iki platformda da harici bağımlılık yok ve bu bence önemli artı.

Farklı Pin Tiplerini Ayrı Ayrı Kümelemek

Hani her pin aynı kategoriye ait olmuyor ya. Mesela turizm uygulamasında otelleri ayrı, restoranları ayrı, müzeleri ayrı kümelersin; işte ClusteringIdentifier tam burada devreye giriyor.

map.Pins.Add(new Pin
{
Label = "Taksim Kahvecisi",
Location = new Location(41.0370, 28.9850),
ClusteringIdentifier = "kahve"
});
map.Pins.Add(new Pin
{
Label = "Gulhane Parki",
Location = new Location(41.0130, 28.9815),
ClusteringIdentifier = "park"
});
map.Pins.Add(new Pin
{
Label = "Sultanahmet Camii",
Location = new Location(41.0054, 28.9768),
ClusteringIdentifier = "tarihi"
});

Aynı identifier’a sahip pinler kendi içinde kümeleniyor.

Farklı identifier’lar coğrafi olarak yakın olsalar bile ayrı kümeler oluşturuyor.

Identifier vermeyen pinler işe varsayılan gruba düşüyor.

Mantıklı mı? Evet, baya mantıklı.

Pratikte Bunu Nasıl Organize Ediyorum?

Kendi deneyimimden konuşuyorum, Benim önerim şu: identifier’ları string literal olarak etrafa saçmayın.

Bir constants sınıfı yapın.

Yoksa 6 ay sonra “kahve” mi yazmıştınız “kafe” mi yazmıştınız kimse hatırlamaz.

Güvenin bana; başıma geldi (yanlış duymadınız)

public static class ClusterIds
{
public const string Coffee = "coffee";
public const string Park = "park";
public const string Historical = "historical";
public const string Hotel = "hotel";
}

Küçük gibi görünüyor ama büyük projelerde insanın elini rahatlatıyor. GitHub’da Deployment Context: Repo ve Alert Yön… yazımızda bu konuya da değinmiştik.

Küme Tıklama Olayını Yönetmek

Şöyle ki, Kullanıcı bir kümeye tıklayınca ne olacak? Varsayılan davranış haritayı o kümeye zoom etmek.

Ama bazen bunu kendin yönetmek istersin; mesela liste göstermek istersin, bottom sheet açarsın ya da direkt başka ekrana geçersin.

İşte burada olay biraz şekil değiştiriyor.

map.ClusterClicked += async (sender, e) =>
{
string isimler = string.Join("
", e.Pins.Select(p => p.Label));
await DisplayAlert(
$"Kume ({e.Pins.Count} pin)",
isimler,
"Tamam");
// Varsayılan zoom davranışını iptal etmek için:
// e.Handled = true;
};

ClusterClickedEventArgs içinde şunlar var:

Özellik Tip Açıklama
Pins IReadOnlyList<Pin> Kumedeki tüm pinlerin listesi
Location Location Kumenin coğrafi merkez noktası
Handled bool true yaparsanız varsayılan zoom davranışı iptal olur

Hmm… e.Handled = true kısmı önemli.

Bunu true yapmazsanız harita otomatik zoom ediyor.

Ama bazen — özellikle kullanıcıya seçenek listesi göstermek istediğinizde — zoom’u kapatıp kendi UI’ınızı açmak çok daha iyi hissettiriyor.

Peki neden?

Çünkü kullanıcıya karar alanını sız veriyorsunuz.

ClusterClicked olayı sadece kümelere tıklandığında tetikleniyor.
Bireysel pin tıklamaları için hâlâ MapClicked veya Pin.MarkerClicked kullanmanız gerekiyor.
Bunu karıştıran çok oluyor; dikkat edin.

Platform Farklılıkları: Android vs iOS

İtiraf edeyim, Bak şimdi, bu bölüm önemli çünkü iki platform aynı şeyi aynı şekilde yapmıyor.

Aynı API var diye aynı davranış beklemeyin; o kadar temiz değil işte (ciddiyim) azd update Komutu: Paket Yöneticisi Derdine Son yazımızda bu konuya da değinmiştik. Bu konuyla ilgili .NET ve .NET Framework Nisan 2026 Güvenlik Yama… yazımıza da göz atmanızı tavsiye ederim.

Ve işler burada ilginçleşiyor.

Android tarafı: Özel bir grid-based algoritma kullanıyor. Zoom seviyesi değişince kümeleri yeniden hesaplıyor.

Harici kütüphane gerekmemesi güzel ama animasyonlar iOS’a kıyasla biraz sert kalabiliyor.

Kümelerin açılıp kapanması sırasında o akıcılık hissi Android’de azıcık eksik dürüyor.

Preview aşaması tabi; belki sonraki sürümde toparlanır.

iOS ve Maç Catalyst tarafı:
Native MKClusterAnnotation
desteğini kullanıyor.

MapKit’in clustering mekanizması zaten oturmuş durumda ve animasyonlar daha pürüzsüz gidiyor.

Bu tarafta ben pek sorun görmedim açıkçası. Bu konuyla ilgili Azure MCP Araçları Visual Studio 2022’de Yerleş… yazımıza da göz atmanızı tavsiye ederim.

Bazı testlerde ilginç şeylerle karşılaştık.

Logosoft’ta bir müşteri projesinde iOS ve Android harita performansını kıyaslarken şunu fark ettik: 500+ pin olduğunda Android’de ilk render süresi iOS’a göre yaklaşık %30 daha yavaştı.

Clustering açılınca fark biraz kapanıyor çünkü ekranda çizilen öğe sayısı azalıyor ama yine de akılda tutmak lazım; özellikle yoğun veri varsa lazy loading düşünmek kötü fikir değil.

Türkiye’deki Ekipler Için Pratik Değerlendirme

Neyse uzatmayayım; Türkiye’deki mobil ekiplerin çoğu hâlâ Xamarin’den.NET MAUI’ye geçişle uğraşıyor.

Hele bir de İstanbul ve Ankara’daki yazılım evlerinde bu geçiş bazen düz gitmiyor.

Harita bileşeni de genelde en sancılı parçalardan biri oluyor.

Üçüncü parti bağımlılıklar, sürüm uyuşmazlıkları, platform-specific workaround’lar derken iş büyüyor.

Clustering’in native gelmesi bu geçişi biraz daha cazip hâle getiriyor.
Itirazım yok buna.

Bunu biraz açayım. Daha fazla bilgi için Ingress2Gateway 1.0: Ingress’ten Gateway API’ye… yazımıza bakabilirsiniz.

Vallahi, “Bir de lokasyon bazlı uygulamalar Türkiye’de oldukça yaygın. Kurye takip var,
araç filo yönetimi var,
emlak var,
market bulma var… Hepsinde harita kullanılıyor ve hepsinde pin yoğunluğu sorunu çıkıyor. O yüzden bu özellik Türkiye pazarı için baya değerli.”

💡 Bilgi: .NET MAUI 11 Preview 3 kullanmak için.NET 11 SDK’yI yuklemeniz ve MAUI workload’ünü güncellemeniz gerekiyor.
dotnet workload update
komutuyla halledebilirsiniz.
Preview olduğunu unutmayın — production’a direkt atmayın.

Küçük Ekip vs Büyük Kurumsal: Farklı Yaklaşımlar

Eğer
3-5 kişilik
bir startup ekibiyseniz ve hızlı hareket etmeniz gerekiyorsa,
clustering’i açın,
identifier’larla kategorileri ayırın,
varsayılan davranışla gidin.

Ozellestirmeyle vakit kaybetmeyin;
önce ürünü çıkarın.”

Ama enterprise seviyede
bir filo yönetim uygulaması yapıyorsanız,
işler değişir.

Custom cluster renderer gerekebilir.
Küme ikonlarinin renk kodlu olmasını,
üstünde kategori bilgisi gostermesini isteyebilirsiniz.

Su anki API buna tam cevap vermiyor;
platform-specific handler yazmanız gerekebilir.

Bu da.NET MAUI’nın handler mimarisiyle mümkün. Kolay değil.”

Kısa bir not düşeyim buraya.

Ha bu arada,
.NET ekosistemindeki güncel gelişmeleri takip ediyorsanız,

.NET ve.NET Framework Nisan 2026 Güvenlik Yamaları

yazıma da göz atmanızı tavsiye ederim — güvenlik güncellemelerini kaçırmamak önemli.”

Eksik Bulduğum Noktalar ve Beklentilerim

Açik konuşayım:
bu özellik fena değil,
hatta bayağı iş görüyor.

Ama preview aşamasında birkaç şey eksik kalmış:”

  • Küme gorunumunu özelleştirme (renk,
    ikon,
    boyut) için henüz resmî API yok — platform handler’larıyla ugrasmAnIz lazım

  • windows desteği yok.
    Sadece Android. IOS/Mac Catalyst.
    Windows’ta Maps kullanıyorsanız clustering calismayacak

  • Ccluster animasyonlari Android’de iOS kadar akıcı değil
  • DinamIc pin ekleme/cIkartma durumunda kumelerin ne kadar hızlı güncellendiği benim test ettiğim kadarıyla biraz değişken — bazen bir zoom in/out gerekiyor güncelleme için
  • /ul>

    Beklediğim kadar esnek değil henüz.
    Ama ilk adım olarak sağlam.
    Kağıt üstünde süper dursa da pratikte GA (General Availability) sürümünde asıl performansı göreceğiz.”


    DevOps süreçlerinizi bu tarz preview SDK’larla test ederken CI/CD pipeline’larınızı da gözden gecirmenizde fayda var.
    Bu konuda
    azd update Komutu:
    Paket Yöneticisi Derdine Son

    yazım işinize yarayabilir.”

    İhemen Başlamak Isteyenler Için Adımlar


    Denemek istiyorsanız,
    su sirayi takip edin:”

    1. .NET 11 Preview 3 SDK’yI indirip kurun
    2. dOTnet workload install maui
      veya dOTnet workload update
      çalıştırın
    3. Mevcut MAUI projenizde Maps NuGet paketini güncelleyin
    4. XAML’de IscLustEringEnabled=\”True\”
      ekleyin
    5. PIn’lerinize uygun ClusteringIdentifier
      değerleri atayın
    6. EEmulatorde veya fiziksel cihazda test edin — emulatorde bazen küme animasyonlari düzgün gözükmüyor,
      fiziksel cihaz daha güvenilir

    İlk denememde Android emulatorde kumelerin bazen takıldığını gördüm.
    Fiziksel cihaza geçince sorun yoktu.
    Yanı emulatorde garip davranişlar gorurseniz hemen panik yapmayın — önce gerçek cihazda test edin.

    Ayrıca Microsoft’un maui-samples
    reposundaki Clustering sayfası güzel bir başlangıç noktası.
    Oradan kod kopyalayip kendi projenize adapte edebilirsiniz.

    >

    Sıkça Sorulan Sorular

    Pin clustering hangi platformlarda çalışıyor?

    Şu an sadece Android ve iOS/Mac Catalyst’te çalışıyor. Windows tarafında henüz destek yok. iOS native MapKit MKClusterAnnotation kullanıyor, Android işe custom grid-based bir algoritmayla hallediyor.

    Her pin kategorisini ayrı kümeleyebilir mıyım?

    Yanı, Evet, yanı bu oldukça kullanışlı bir özellik. Pin nesnesindeki ClusteringIdentifier property’sine farklı değerler vermeniz yeterli. Kısacası, aynı identifier’a sahip pinler kendi aralarında bir düşüneyim… kümeleniyor, farklı olanlar işe ayrı ayrı. Mesela “restoran” ve “otel” pinlerini bağımsız olarak kümeleyebilirsiniz.

    Küme görünümünü özelleştirebilir mıyım?

    İtiraf edeyim, Açıkçası, Preview 3 itibarıyla resmî API ile doğrudan özelleştirme oldukça kısıtlı. Platform-specific handler yazarak native tarafta küme görünümünü değiştirebilirsiniz, ama bence bu biraz can sıkıcı (evet, doğru duydunuz). GA sürümünde bu konuda daha fazla seçenek geleceğini umuyorum.

    Çok sayıda pinle performans nasıl?

    Kısacası, i̇lginç olan şu ki, 500-1000 pin arasında gayet akıcı çalışıyor. 2000’in üzerine çıkınca Android’de ilk yükleme süresi biraz uzayabiliyor. Tecrübeme göre bu noktada viewport-based lazy loading stratejisi işleri ciddi ölçüde düzeltiyor (en azından benim deneyimim böyle). iOS işe native altyapısı sayesinde genelde daha pürüzsüz.

    .NET MAUI 11 Preview 3’ü production’da kullanabilir mıyım?

    Bence tavsiye etmem. Preview sürümler hani test ve değerlendirme içindir; API’ler değişebilir, buglar çıkabilir. Production için GA’yı bekleyin. Ama aslında şimdiden test ortamınızda deneyip geri bildirim verirseniz hem kendiniz hazır olursunuz hem de Microsoft’a katkı sağlamış olursunuz.

    Kaynaklar ve İleri Okuma

    Pin Clustering in.NET MAUI Maps —.NET Blog

    .NET MAUI Map Control — Microsoft Learn

    .NET MAUI Samples — GitHub

İçeriği paylaş:

Aşkın KILIÇ

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için beni sosyal medyada takip edin.

Haftalık Bülten

Her pazar özenle seçilmiş teknoloji yazıları doğrudan e-postanıza gelsin.

Yorum gönder

Microsoft Azure Çözüm Uzmanı | Bulut Bilişim, Yapay Zekâ, DevOps ve Kurumsal Güvenlik alanlarında 15+ yıl deneyim. Azure, Kubernetes, AI/ML ve modern altyapı mimarileri üzerine yazılar yazıyorum.

Haftalık Bülten

Azure, DevOps ve Yapay Zeka dünyasındaki en güncel içerikleri her hafta doğrudan e-postanıza alın.

Spam yok. İstediğiniz zaman iptal edebilirsiniz.
📱
Uygulamayı Yükle Ana ekrana ekle, çevrimdışı oku
Paylaş
İçindekiler
    ← Azure MCP Araçları Visual Stud...
    VS Debugger Agent: Bug Avı Art... →
    📩

    Gitmeden önce!

    Her pazar özenle seçilmiş teknoloji yazıları ve AI haberleri doğrudan e-postanıza gelsin. Ücretsiz, spam yok.

    🔒 Bilgileriniz güvende. İstediğiniz zaman ayrılabilirsiniz.

    📬 Haftalık bülten: Teknoloji + AI haberleri