İki Koordinat Arasında Mesafe ve İstikamet Hesabı

Yazar: Sercan Fidan · Yayın: 31 Temmuz 2026 · Güncelleme: 2026-08-14 · Harita ve Koordinatlar

Konumlama sistemleriyle uğraşırken en sık önüme gelen hesaplardan biri şu: elimde iki enlem-boylam çifti var, aralarındaki mesafe kaç metre ve hangi yöne gitmem gerekiyor? Soru basit görünüyor ama cevabı, hangi Dünya modelini kabul ettiğinize bağlı. Düz bir kâğıt mı, küre mi, elipsoit mi? Bu yazıda küre kabulüyle çalışan haversine formülünü ve başlangıç istikameti hesabını anlatacağım; ardından düzlem yaklaşımının ne zaman yeterli olduğuna, ne zaman sizi yanılttığına değineceğim. Sonda da her iki hesabı yapan, test edilmiş bir Python kodu var.

Haversine ile büyük daire mesafesi

Küre üzerinde iki nokta arasındaki en kısa yol, ikisinden de geçen büyük dairenin yayıdır. Haversine formülü bu yayın uzunluğunu verir: enlem ve boylam farklarının yarım açılarının sinüs karelerinden bir ara değer hesaplanır, mesafe 2·R·asin(√a) ile bulunur. R için Dünya'nın ortalama yarıçapı olan 6371 km kullanılır. Formülün güzel tarafı sayısal kararlılığı; kosinüs tabanlı küresel kosinüs teoremi çok kısa mesafelerde hassasiyet kaybederken, haversine birkaç metrelik farklarda bile düzgün çalışır. Bedeli ise model hatası: Dünya küre değil, WGS84 elipsoidi. Bu yüzden haversine binde birkaç mertebesinde hata taşır; 350 kilometrelik bir hatta bu, kilometre mertebesine ulaşabilir. Görselleştirme ve navigasyon için fazlasıyla yeterli; jeodezik hassasiyet gerekiyorsa Vincenty ya da Karney (GeographicLib) yöntemlerine geçerim.

Başlangıç istikameti: yön tek bir sayı değil

Büyük daire boyunca ilerlerken pusula yönünüz sürekli değişir; Londra'dan Tokyo'ya giden uçak kuzeydoğu doğrultusunda kalkar, güneydoğu doğrultusunda iner. Bu yüzden iki nokta arasındaki yön aslında tek bir sayı değildir. Hesapladığımız şey başlangıç istikameti, yani yola çıktığınız andaki yön. Formülde atan2(y, x) kullanılır; y boylam farkının, x ise enlemlerin trigonometrik bileşimidir. Buradaki kritik ayrıntı, atan2'nin radyan cinsinden -π ile +π arasında değer döndürmesi; math.degrees ile çevirince bu, -180 ile +180 derece aralığına düşer. Harita uygulamalarında ise istikamet kuzeyden saat yönünde 0-360 aralığında beklenir. Dönüşüm tek satır: (derece + 360) % 360. Bu normalizasyonu unutursanız batıya giden her rota negatif çıkar ve arayüzün bir köşesinde -73° gibi bir değer belirir.

Düzlem yaklaşımı ne zaman yeterli

Küçük ölçekte Dünya'nın eğriliği hissedilmez. İki nokta aynı UTM diliminde ise doğu ve kuzey koordinatları zaten metre cinsindendir; farklarını alıp Pisagor uygularsınız, istikamet için de atan2(ΔE, ΔN) yeterlidir. Birkaç kilometrelik mesafelerde bu yaklaşım haversine ile pratik olarak aynı sonucu verir; üstelik okunması ve hata ayıklaması çok daha kolaydır. Çalıştığım masaüstü araçlarında kısa mesafeler için genellikle bu yolu seçerim.

Sınırları da net. Noktalar farklı UTM dilimlerine düşüyorsa koordinatları doğrudan karşılaştıramazsınız; mesafe onlarca kilometreye çıktıkça projeksiyon distorsiyonu büyür; ve UTM'nin grid kuzeyi ile gerçek kuzey aynı şey değildir. Meridyen yakınsaması denen bu fark, orta enlemlerde dilim kenarına doğru 1-2 dereceyi bulur. Mesafede binde birlik, istikamette bir derecelik hata sizin uygulamanız için önemliyse, düzlemden küresel hesaba dönme vakti gelmiş demektir.

Bir formülün doğru olması yetmez; hangi Dünya modelini kabul ettiğini ve o kabulün nerede bozulduğunu da bilmek gerekir.

mesafe_istikamet.py
import math
R = 6371000.0  # Dünya ortalama yarıçapı (metre)

def haversine(lat1, lon1, lat2, lon2):
    # Dereceleri radyana çevir, enlem ve boylam farklarını al
    f1, f2 = math.radians(lat1), math.radians(lat2)
    dfi, dlm = math.radians(lat2 - lat1), math.radians(lon2 - lon1)
    a = math.sin(dfi / 2) ** 2 + math.cos(f1) * math.cos(f2) * math.sin(dlm / 2) ** 2
    return 2 * R * math.asin(math.sqrt(a))  # büyük daire mesafesi, metre

def initial_bearing(lat1, lon1, lat2, lon2):
    # atan2 radyan döndürür (-pi..+pi); dereceye çevrilince -180..+180 olur, 0-360'a normalize ediyoruz
    f1, f2, dlm = math.radians(lat1), math.radians(lat2), math.radians(lon2 - lon1)
    y = math.sin(dlm) * math.cos(f2)
    x = math.cos(f1) * math.sin(f2) - math.sin(f1) * math.cos(f2) * math.cos(dlm)
    return (math.degrees(math.atan2(y, x)) + 360.0) % 360.0  # kuzeyden saat yönünde

Bu iki fonksiyonu yazdıktan sonra bilinen değerlerle mutlaka test ederim: ekvator üzerinde bir derecelik boylam farkı yaklaşık 111,2 km vermeli; tam kuzey-güney hattı 0° ya da 180°, tam doğuya giden hat 90° çıkmalı. Ankara-İstanbul arası da kabaca 349 km ve 291° civarında olmalı. Bu kontrolleri geçmeyen koda güvenmem; geçenine de körü körüne değil, modelinin sınırlarını bilerek güvenirim. Mesafe ve istikamet hesabı küçük bir yapı taşı, ama üzerine rota takibi, hız kestirimi ve konum doğrulama gibi koca katmanlar kuruluyor. Temeli sağlam atmakta fayda var.

{{ T.nav.icerigeAtla }}
sercan ◆
© 2026

{{ T.palet.sonucYok }}

{{ T.palet.baskaAra }}

{{ it.label }}

{{ it.label }} {{ it.hint }}
↑↓ {{ T.palet.gezin }} ↵ {{ T.palet.sec }} esc {{ T.palet.kapat }}

{{ T.hero.kicker }}

{{ T.hero.baslikOn }}{{ T.hero.baslikVurgu }}{{ T.hero.baslikSon }}

{{ T.hero.altyazi }}

{{ T.home.tanitim1 }}

{{ T.home.tanitim2 }}

{{ T.home.oneCikanlar }}

{{ buyuk.tarih }} · {{ buyuk.dkOkuma }}

{{ buyuk.baslik }}

{{ buyuk.ozet }}

{{ T.kart.yaziyiOku }}
{{ p.katAd }}

{{ p.baslik }}

{{ p.ozet }}

{{ p.tarih }} · {{ p.dkText }}

{{ T.home.seciliProjeler }}

{{ pr.gorselAlt }}
{{ pr.durumGorunen }} {{ pr.yil }}

{{ pr.ad }}

{{ pr.ozet }}

{{ pr.tekno }}

{{ T.home.simdiBaslik }}

{{ T.home.guncelleme }}{{ simdiGuncel }}

{{ k.etiket }}

  • {{ m }}

{{ simdiNot }}

{{ T.home.bultenEtiket }}

{{ T.home.bultenBaslik }}

{{ T.home.bultenAciklama }}

{{ T.home.bultenGecerliOn }}sercanfidan06@gmail.com

{{ T.home.bultenBasarili }}

{{ T.home.bultenBasariAciklama }}

{{ T.blog.etiket }}

{{ T.blog.baslik }}

{{ T.blog.aciklama }}

{{ T.blog.etiketEtiket }} {{ tagChip }}

{{ sonucText }}

{{ p.katAd }}

{{ p.baslik }}

{{ p.ozet }}

{{ p.tarih }} · {{ p.dkText }}

{{ T.blog.sonucYokEtiket }}

{{ T.blog.sonucYokBaslik }}

{{ T.blog.sonucYokAciklama }}

{{ yukleMetni }}

{{ pp.katAd }} {{ T.yazi.yazarEtiket }}: {{ pp.yazar }} · {{ pp.tarih }} · {{ pp.dkOkuma }}

{{ pp.baslik }}

{{ pp.lede }}

{{ pp.gorselAlt }}

{{ b.x }}

{{ b.x }}

{{ b.x }}

{{ b.dosya }}
{{ b.dil }}
{{ b.kod }}
  • {{ m }}
{{ b.alt }}
{{ b.altyazi }}

{{ T.yazi.paylasEtiket }}

{{ T.yazi.yorumlarEtiket }} ({{ yorumN }})

{{ T.yazi.yukleniyor }}

{{ T.yazi.yorumHata }}

{{ T.yazi.yorumYok }}

  • {{ y.ad }} {{ y.tarih }}

    {{ y.govde }}

{{ T.yazi.yorumBasarili }}

{{ yAdHata }}

{{ yEmailHata }}

{{ yMetinHata }}

{{ yKvkkHata }}

{{ T.yazi.ilgiliYazilar }}

{{ p.katAd }}

{{ p.baslik }}

{{ p.tarih }} · {{ p.dkText }}

{{ yukleMetni }}

{{ prp.durumGorunen }} {{ prp.yil }}

{{ prp.ad }}

{{ prp.ozet }}

{{ prp.gorselAlt }}

{{ T.proje.calismaKapsami }}

  • {{ d }}
{{ tk.t }}

{{ T.yazi.paylasEtiket }}

{{ T.yazi.yorumlarEtiket }} ({{ yorumN }})

{{ T.yazi.yukleniyor }}

{{ T.yazi.yorumHata }}

{{ T.yazi.yorumYok }}

  • {{ y.ad }} {{ y.tarih }}

    {{ y.govde }}

{{ T.yazi.yorumBasarili }}

{{ yAdHata }}

{{ yEmailHata }}

{{ yMetinHata }}

{{ yKvkkHata }}

{{ T.projeListe.etiket }}

{{ T.projeListe.baslik }}

{{ T.projeListe.aciklama }}

{{ pr.gorselAlt }}
{{ pr.durumGorunen }} {{ pr.yil }}

{{ pr.ozet }}

{{ pr.tekno }}

  • {{ d }}

{{ T.kaynak.etiket }}

{{ T.kaynak.baslik }}

{{ T.kaynak.aciklama }}

{{ T.kaynak.favoriAraclarim }}

{{ g.grup }}

{{ g.aciklama }}

{{ T.kaynak.oneriVarMi }}{{ T.kaynak.iyiKaynak }}

{{ T.hakkimda.etiket }}

Merhaba, ben Sercan.

{{ pa }}

{{ dg }}

{{ T.hakkimda.nasilCalisirim }}

{{ c.baslik }}

{{ c.not }}

{{ T.hakkimda.zamanCizelgesi }}

{{ z.yil }}

{{ z.baslik }}

{{ z.not }}

Sercan Fidan — portre

{{ T.hakkimda.uzmanlik }}

{{ u.alan }} {{ u.seviye }}

{{ T.hakkimda.etiketCumlesi }}

{{ T.hakkimda.iletisimEtiket }}

{{ T.hakkimda.iletisimBaslik }}

{{ T.hakkimda.iletisimAciklama }}

{{ adHata }}

{{ emailHata }}

{{ mesajHata }}

{{ kvkkHata }}

{{ T.iletisim.ulastiBaslik }}

{{ T.iletisim.ulastiAciklama }}

{{ T.kayip.etiket }}

{{ T.kayip.baslik }}

{{ T.kayip.aciklama }}