Proje defteri / 2025
Şehir Asistanım
Vatandaşların kentsel altyapı sorunlarını ve belediye taleplerini harita üzerinde koordinat bazlı ilettiği, şeffaf takip sağlayan çok katmanlı platform.
Proje Tanımı ve Hedefler
Şehir Asistanım, vatandaşlar ile yerel yönetimler arasındaki iletişimi dijitalleştiren, harita tabanlı ve konumsal veriye dayalı bir kentsel talep ve şikayet yönetim platformudur.
Geleneksel çağrı merkezi ve başvuru hatlarının aksine, sorunların harita üzerinde net koordinatlarla işaretlenmesini, fotoğraflanmasını ve çözüm sürecinin vatandaş tarafından şeffaf biçimde takip edilmesini sağlar.
Proje, Elif Eryıldırım, Fatma Buse Özmen ve Umut Güven Uslu tarafından çok disiplinli bir ekip çalışması olarak geliştirilmiştir.

Sistem Mimarisi
Sistem üç ana bileşenden oluşur:
- Mobil İstemci (Flutter): Vatandaşların sahada GPS konumunu alarak fotoğraf çekmesini ve anlık talep oluşturmasını sağlar.
- Web Konsolu (React, TypeScript): Belediye personelinin harita üzerinde gelen şikayetleri filtrelemesini, birimlere atamasını ve durum güncellemesini sağlar.
- Merkezi Web API (ASP.NET Core, C#): Kimlik doğrulama, coğrafi veri doğrulama ve veritabanı işlemlerini yürüten REST API katmanıdır.
- Coğrafi Veritabanı (PostgreSQL, PostGIS): Şikayetlerin enlem ve boylam koordinatlarını uzamsal veri tipleriyle saklar ve bölgesel sorgulamaları yönetir.

Mobil Arayüz
Mobil istemci, sahada pratik kullanım için tasarlanmıştır. Kullanıcı haritada raptiye kaydırarak veya otomatik GPS koordinatıyla konumu doğrular, ilgili belediye birimini seçer ve fotoğraf yükler.

Arka Plan Servisleri ve Kod Yapısı
Backend katmanında ASP.NET Core Web API kullanılmıştır. Kullanıcı taleplerinin alınması, yetkilendirme doğrulaması ve şikayetlerin birimlere dağıtımı SikayetController üzerinden yönetilir.
Aşağıdaki kod parçası, projenin gerçek backend API katmanındaki kimlik denetimi ve veri işleme yapısını göstermektedir:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
[ApiController]
[Route("[controller]/[action]")]
public class SikayetController : ControllerBase
{
private readonly ISikayetService _service;
private readonly ISikayetLoglariService _logService;
public SikayetController(ISikayetService service, ISikayetLoglariService logService)
{
_service = service;
_logService = logService;
}
private int? GetUserIdFromClaims()
{
if (User.Identity != null && User.Identity.IsAuthenticated)
{
var userIdClaim = User.FindFirst(ClaimTypes.NameIdentifier);
if (userIdClaim != null && int.TryParse(userIdClaim.Value, out int userId))
{
return userId;
}
}
return null;
}
[HttpGet]
public async Task<List<SikayetDetayDto>> GetAll()
{
return await _service.GetAllSikayetlerAsync();
}
[HttpPost]
[Authorize]
public async Task<IActionResult> Create([FromBody] SikayetEkleDto dto)
{
var userId = GetUserIdFromClaims();
if (userId == null) return Unauthorized();
var result = await _service.SikayetKaydetAsync(dto, userId.Value);
return Ok(result);
}
}Teknik Zorluklar ve Çözümler
- Haritada Pin Kümeleme (Clustering): Çok sayıda şikayetin harita üzerinde aynı anda render edilmesi performans kaybına yol açtığı için istemci tarafında Leaflet ve Google Maps kümeleme kütüphaneleri kullanıldı.
- Coğrafi Veri Sorgulama: Veritabanında belirli bir mahalle veya mesafe yarıçapındaki şikayetlerin çekilmesi için PostGIS mekansal indeksleme (R-Tree / GIST) yöntemleri uygulandı.