Teknoloji
Nasıl çalışır
Bu sayfa, sitedeki her sayının nereden geldiğini anlatıyor. Gizli bir formül veya özel bir veri kaynağı yok; kullandığımız yöntemlerin hepsi yayımlanmış matematik. Bir iddiada bulunuyorsak, o iddianın nasıl doğrulandığını da doğruluk sayfasında ölçülmüş sayılarla gösteriyoruz.
Mimari
Tek bir yön motoru
Sitenin tamamı tek bir fonksiyona dayanır: iki koordinat al, aralarındaki bütün yön ilişkilerini döndür. Kıble bu motorun ayrı bir özelliği değil; hedefi Kâbe olan bir çağrısıdır. Şehir sayfaları, ilçe sayfaları, yön çifti sayfaları, canlı pusula, harita ve güneş yöntemi — hepsi aynı fonksiyonu çağırır.
Bu karar sıradan görünse de sonuçları büyük. Bir kere motoru test etmek bütün sayfaları test etmek anlamına geliyor. Kıble için özel, şehirler için ayrı bir kod yolu olmadığından ikisinin ayrışması mümkün değil. Ve yeni bir hedef eklemek yalnızca yeni bir koordinat eklemek demek.
Motorun döndürdüğü değerler:
- Büyük daire başlangıç azimutu — kıble açısı budur
- Varış azimutu — yolun bittiği andaki yön
- Ters azimut — hedeften bakan biri için bizim yönümüz (180 eklemekle bulunmaz)
- Manyetik azimut ve sapma değeri
- Jeodezik mesafe (Vincenty) ve küresel mesafe (Haversine)
- Loksodrom açısı, uzunluğu ve fazladan yol
- Antipod ve antipodal belirsizlik uyarısı
- Yön adı — 8 ve 16 yönlü, Türkçe
Adım 1
Kâbe'nin koordinatı
Her şey tek bir referans noktasıyla başlıyor: 21.4224779°K, 39.8251832°D (WGS-84). Bu değer sistemde tek bir yerde tanımlıdır ve hiçbir dosyada kopyalanmaz. Sebebi şu: bu ürünün yapabileceği en kötü hata, Kâbe koordinatının iki farklı değerinin dolaşımda olması olurdu.
Koordinattaki otuz metrelik bir belirsizlik, Türkiye mesafelerinde açıya derecenin binde biri kadar etki eder — yani pusula hassasiyetinin çok altında. Yine de tek değer kullanmak tutarlılık için şart: aynı konumun iki sayfada farklı açı göstermesi, hatanın büyüklüğünden bağımsız olarak güveni yok eder.
Mescid-i Haram. Görsel: Haidan / Unsplash
Adım 2
Büyük daire: küre üzerinde "düz" ne demek
Bir düzlemde iki nokta arasındaki en kısa yol bir doğru parçasıdır. Küre üzerinde ise doğru diye bir şey yok; en kısa yol, kürenin merkezinden geçen bir düzlemin yüzeyle kesiştiği daireden — büyük daireden — bir yaydır. Kıble, bu yayın çıkış anındaki azimutudur.
Formül tek satır: iki noktanın enlem ve boylamları verildiğinde başlangıç azimutu, iki bileşenin ters teğetiyle bulunur. Kodda da tam olarak bir satır. Ama sonucu sık sık sezgiye aykırıdır ve işin ilginç kısmı burada başlıyor.
New York örneği
Duvardaki dünya haritasına bakan biri, Mekke New York'un güneydoğusunda göründüğü için kıblenin de güneydoğu olduğunu düşünür. Hesap ise 58.4 derece diyor: yani kuzeydoğu. Aynı konumun loksodrom açısı 101.3 derece — gerçekten güneydoğu. İkisi arasında 43 derecelik fark var.
Doğru cevap kuzeydoğudur ve Kuzey Amerika'daki camilerin mihrapları da kuzeydoğuya bakar. Sebep şu: yeryüzündeki en kısa yol Atlantik'in kuzeyinden geçer. Mercator projeksiyonu yüksek enlemleri aşırı genişlettiği için bu yolu haritada yukarıya doğru kıvrılan bir eğri olarak gösterir. Eğri olan yol değil, haritanın kendisidir.
Aynı olgu daha yumuşak biçimde Türkiye'de de var. İstanbul'dan kıble 151.5 derece, loksodrom 154.8 derece — 3.3 derecelik fark, uygulamada önemsiz. İstanbul'dan Tokyo'ya bakıldığında ise fark 43 dereceye çıkıyor ve loksodrom yolu 698 kilometre daha uzun oluyor.
Adım 3
Elipsoid: Dünya tam bir küre değil
Dünya kutuplardan basıktır. Ekvatoral yarıçap 6.378,137 kilometre, kutupsal yarıçap 6.356,752 kilometre; aradaki fark yirmi bir kilometreyi aşıyor. Küresel varsayım bu yüzden mesafede yaklaşık yüzde yarım hata üretir.
Bunu düzeltmek için WGS-84 elipsoidi üzerinde Vincenty ters çözümünü kullanıyoruz. Yöntem özyinelemeli: bir başlangıç tahmininden başlayıp yardımcı boylam farkı yakınsayana kadar dönüyor, sonra kapalı formüllerle mesafeyi ve iki uçtaki azimutları hesaplıyor.
Etkiyi doğrudan gözlemleyebilirsiniz: ekvatorda 1 derecelik meridyen yayı 110.574 metre, kutupta 111.694 metredir. Küresel bir modelde bu ikisi eşit çıkardı. İki değerin farklı çıkması, elipsoid modelinin doğru uygulandığının en basit kanıtı ve bu sağlama doğruluk sayfasında ölçülmüş hâlde duruyor.
Vincenty'nin bilinen bir zayıflığı var: antipodal noktalarda yakınsamaz. Bunu sessizce yanlış sayı döndürerek değil, açıkça bildirerek ele alıyoruz — o durumda motor küresel çözüme düşer ve sonucu "hassas değil" olarak işaretler. Geliştirme sırasında bu bölge gerçek bir hata yakalattı: sinüs sıfıra gittiğinde iki farklı durum (aynı nokta ve tam karşıt nokta) karışıyor ve dünyanın öbür ucu için sıfır metre dönüyordu. Test bunu buldu, düzeltildi ve regresyon testi olarak kaldı.
Adım 4
Manyetik sapma
Buraya kadar her şey coğrafi kuzeye göre. Ama pusula iğnesi coğrafi kuzeyi göstermez; Dünya'nın manyetik alanının yerel doğrultusunu gösterir. İkisi arasındaki açıya manyetik sapmadenir ve Türkiye'de bu on yılda yaklaşık altı derece doğu yönündedir.
Sapmayı NOAA/NCEI'nin WMM-2025 modelinden hesaplıyoruz. Model, manyetik potansiyeli 12. dereceye kadar küresel harmoniklerle tanımlar: 90 Gauss katsayısı ve her biri için bir yıllık değişim oranı. Hesap adımları jeodezik enlemin jeosentriğe çevrilmesi, Schmidt yarı-normalize Legendre fonksiyonlarının özyinelemeyle üretilmesi, alan bileşenlerinin toplanması ve sonuçların jeodezik çerçeveye döndürülmesinden oluşuyor.
Katsayıların hiçbiri elle girilmemiştir. NOAA'nın resmî katsayı dosyası bir üretim betiğiyle TypeScript modülüne çevriliyor. Model 2025–2030aralığı için geçerli; pencere dışında sonuç "geçerlilik dışı" işaretlenir ve arayüz bunu bildirir.
Sapma yavaş ama sürekli değişiyor. Her şehir sayfasında yıllık değişim hızını da yazıyoruz, böylece pusula değerinin ne zaman güncellenmesi gerektiğini kendiniz hesaplayabilirsiniz. Gerçek kuzeye göre verdiğimiz açı ise hiç değişmez — coğrafya sabittir.
Adım 5
Cihazdan yönü okumak — en kirli kısım
Buraya kadarki her şey matematik: kesin, test edilebilir, tekrarlanabilir. Bundan sonrası ise donanım gerçekliği ve işin en zor kısmı burada.
Referans kuzey sorunu
Tarayıcıların pusula davranışı standart değil. iOS Safari, webkitCompassHeading ile gerçek kuzeye göre bir değer verir — cihaz sapma düzeltmesini kendisi uygular. Android Chrome ise deviceorientationabsolute olayı üzerinden manyetik kuzeyegöre bir değer verir. Bu ikisini aynı sanmak, Türkiye'de altı derecelik sessiz bir hata demektir. Biz okuduğumuz değerin hangi referansa ait olduğunu taşıyor, sapmayı yalnızca manyetik kaynaklı okumalara uyguluyor ve hangi durumda olduğumuzu kadranın altında yazıyoruz.
Ekran döndürme düzeltmesi
Telefonu yatay çevirdiğinizde sensör çerçevesi ile ekran çerçevesi ayrışır. Düzeltme yapılmazsa pusula tam doksan derece yanlış gösterir — ve kullanıcının bunu fark etmesi neredeyse imkânsızdır, çünkü iğne kararlı biçimde yanlış bir yeri gösterir. Ekran açısını okuyup her ölçüme ekliyoruz.
Yumuşatma ve sarmalama
Ham manyetometre verisi titrer. Ama açı değerleri üzerinde ortalama almak burada tuzak: 359 derece ile 1 derecenin aritmetik ortalaması 180 çıkar, yani iğne bir anda ters yöne fırlar. Bu yüzden filtreyi açı üzerinde değil birim vektör üzerinde uyguluyoruz. Açının sinüs ve kosinüsünü ayrı ayrı yumuşatıp sonucu geri açıya çeviriyoruz; sarmalama sorunu kendiliğinden ortadan kalkıyor ve iğne akıcı dönüyor.
Doğruluğu ölçmek
iOS pusula doğruluğunu derece cinsinden bildirir ve biz onu doğrudan gösteririz. Android tarayıcıları böyle bir alan sunmaz; o durumda son yirmi dört okumanın dairesel dağılımındankendi tahminimizi üretiyoruz. İki kaynak da varsa kötü olanı alıyoruz — iyimser tarafı seçmek daha güzel görünürdü ama kullanıcıyı yanıltırdı. Hiçbir sinyal yoksa bunu uydurmuyor, "cihaz doğruluk bilgisi vermiyor" yazıyoruz.
Parazit dedektörü
Dünya'nın manyetik alanı yeryüzünde 22 ile 68 mikrotesla arasındadır. Cihazın manyetometresi bu aralığın belirgin dışında bir büyüklük okuyorsa, ölçtüğü şey Dünya değil; yakındaki bir hoparlör, dizüstü bilgisayar, çelik masa, mıknatıslı kılıf veya aracın gövdesidir. O anda uyarı basıyoruz. Bu, pusulanın "çalışıyor görünürken tamamen yanlış göstermesini" yakalayan tek sinyaldir. Özellik yalnızca manyetometre erişimi veren tarayıcılarda çalışır; olmadığında sessizce devre dışı kalır ve sahte bir güvence vermez.
Sık sorulan sorular
Büyük daire ile loksodrom arasındaki fark tam olarak ne?
Büyük daire, iki nokta arasındaki en kısa yoldur ama boyunca pusula açınız sürekli değişir. Loksodrom ise sabit pusula açısıyla gidilen yoldur; daha uzundur ama yönetmek kolaydır. Denizciler yüzyıllarca loksodrom kullandı çünkü sürekli açı düzeltmek pratik değildi. Kıble için doğru olan büyük dairedir: yönelme, en kısa yolun çıkış açısıdır.
Neden Vincenty kullanıyorsunuz, Haversine yetmez mi?
Haversine çoğu amaç için yeterli — hata payı yaklaşık yüzde yarım. Ama Vincenty kullanmanın maliyeti de yok: aynı hesap, birkaç satır daha uzun kod. Dünya kutuplardan basık bir elipsoid olduğu için elipsoidal çözüm gerçeğe daha yakın. Vincenty'nin tek zayıf noktası antipodal noktalarda yakınsamamasıdır; o durumda motor küresel çözüme düşer ve bunu precise: false ile açıkça bildirir.
Manyetik sapma modeli nasıl çalışıyor?
Dünya'nın manyetik alanı, kürenin etrafındaki bir potansiyel alanın gradyanı olarak modellenir. WMM-2025, bu potansiyeli 12. dereceye kadar küresel harmonik açılımıyla tanımlar — toplam 90 katsayı artı her biri için bir yıllık değişim oranı. Hesapta jeodezik enlem jeosentrik enleme çevrilir, Schmidt yarı-normalize Legendre fonksiyonları özyinelemeyle üretilir, alan bileşenleri toplanır ve sonuçlar jeodezik çerçeveye döndürülür.
Pusula verisini neden filtreliyorsunuz?
Ham manyetometre verisi titrer; filtresiz bir iğne okunamayacak kadar oynar. Ama basit bir ortalama almak burada işe yaramaz: 359 derece ile 1 derecenin ortalaması 180 çıkar, yani iğne bir anda ters yöne fırlar. Bu yüzden filtreyi açı üzerinde değil birim vektör üzerinde uyguluyoruz — açının sinüs ve kosinüsünü ayrı ayrı yumuşatıp sonra geri açıya çeviriyoruz. Böylece sarmalama sorunu kendiliğinden ortadan kalkıyor.
iOS ve Android arasındaki fark neden önemli?
Çünkü iki platform farklı şeyi ölçüyor. iOS Safari webkitCompassHeading ile gerçek kuzeye göre bir değer verir — cihaz sapmayı kendisi uygular. Android Chrome ise deviceorientationabsolute üzerinden manyetik kuzeyegöre bir değer verir. Bu ikisini aynı sanmak Türkiye'de altı derecelik sessiz bir hata demek. Biz okuduğumuz değerin hangi referansa ait olduğunu taşıyor, sapmayı yalnızca gerekliyse uyguluyor ve hangi durumda olduğumuzu ekranda yazıyoruz.