hkucuk

Elipsoidal Mesafe Algoritması: Hassas Coğrafi Mesafe Hesaplama

9 Şubat 2024 • ☕️ 4 dk okuma • 🏷 bilgisayar, yazılım, algoritma

Yazar tarafından şu dillere çevrildi: English


Coğrafi mesafe hesaplamaları, dünya yüzeyinin karmaşıklığını ve eğriliğini dikkate alarak noktalar arasındaki mesafeyi doğru bir şekilde hesaplamak için önemlidir. Bu tür hassas hesaplamalar için Lambert’ın ellipsoidal mesafe algoritması sıklıkla tercih edilir. Lambert’ın algoritması, dünya yüzeyinin elipsoidal şeklini hesaba katarak iki nokta arasındaki mesafeyi hesaplar. Bu algoritma coğrafi bilgi sistemleri (GIS), harita projeleri, navigasyon yazılımları ve uzay teknolojileri gibi birçok alanda kullanılır.

Lambert’ın ellipsoidal mesafe algoritması, iki nokta arasındaki mesafeyi ve yönü hesaplamak için matematiksel formüller kullanır. Bu formüller dünya yüzeyinin eğrisini ve elipsoid şeklini dikkate alarak mesafeyi daha doğru bir şekilde hesaplar. Algoritmanın karmaşıklığı genellikle sabittir ve hesaplanan mesafe çeşitli uygulamalarda kullanılabilir. Örneğin, Google Haritalar ve ArcGIS gibi popüler haritalama platformları bu algoritmayı mesafe hesaplamalarında kullanabilir. Ayrıca, gemi ve uçak rotalarının planlanması, arazi haritalama ve jeodezi çalışmaları gibi alanlarda da kullanımı yaygındır.

Çalışma Adımları

  1. Noktaların Koordinatlarının Alınması:
    İki noktanın enlem ve boylam koordinatları alınır. Bu koordinatlar genellikle derece cinsinden ifade edilir ve ardından radyan cinsine dönüştürülür.
  2. Meridyen Çemberleri Arası Uzaklığın Hesaplanması:
    İki noktanın meridyen çemberleri arasındaki uzaklık hesaplanır. Bu iki noktanın boylam farkının mutlak değerini almakla başlar.
  3. Azimut Açılarının Hesaplanması:
    İki noktanın azimut açıları hesaplanır. Bu iki noktanın koordinatlarından türetilir ve genellikle trigonometrik formüller kullanılarak hesaplanır.
  4. Mesafenin Hesaplanması:
    Belirli bir elipsoid modeline göre iki nokta arasındaki mesafe hesaplanır. Bu Vincenty formülü gibi karmaşık matematiksel formüller kullanılarak gerçekleştirilir. Bu formüller dünya yüzeyinin eğrisini ve elipsoid şeklini dikkate alarak daha doğru sonuçlar sağlar.
  5. Sonuçların Dönüştürülmesi:
    Elde edilen mesafe istenilen formatta sunulmak üzere gerekirse dönüştürülür. Örneğin mesafe metre cinsinden hesaplanmış olabilir ancak kilometre cinsine dönüştürülerek kullanıcıya sunulabilir.

Algoritma Karmaşıklığı

Lambert’ın ellipsoidal mesafe algoritmasının karmaşıklığı genellikle O(1) veya sabittir. Bu algoritmanın girdi boyutundan bağımsız olarak sabit bir zaman alması anlamına gelir. Ancak bazı hesaplama adımları sabit olmayabilir, özellikle noktalar arasındaki azimut açılarının hesaplanması gibi.

Kullanım Alanları

Lambert’ın algoritması coğrafi bilgi sistemleri (GIS), harita projeleri, navigasyon yazılımları ve uzay teknolojileri gibi çeşitli alanlarda kullanılır.

GoLang’de Elipsoidal Mesafe Algoritması uygulaması:

package main

import (
    "fmt"
    "math"
)

const (
    a = 6378137.0      // semi-major axis (in meters)
    f = 1 / 298.257223563 // flattening
    b = a * (1 - f)    // semi-minor axis (in meters)
)

func main() {
    lat1 := 40.7128  // latitude of New York City
    lon1 := -74.0060 // longitude of New York City
    lat2 := 34.0522  // latitude of Los Angeles
    lon2 := -118.2437 // longitude of Los Angeles

    distance := calculateDistance(lat1, lon1, lat2, lon2)
    fmt.Printf("Distance between New York City and Los Angeles: %.2f km\n", distance/1000)
}

func calculateDistance(lat1, lon1, lat2, lon2 float64) float64 {
    phi1 := toRadians(lat1)
    lambda1 := toRadians(lon1)
    phi2 := toRadians(lat2)
    lambda2 := toRadians(lon2)

    deltaLambda := math.Abs(lambda1 - lambda2)
    sigma := math.Atan(math.Sqrt(math.Pow(math.Cos(phi2)*math.Sin(deltaLambda), 2) +
        math.Pow(math.Cos(phi1)*math.Sin(phi2)-math.Sin(phi1)*math.Cos(phi2)*math.Cos(deltaLambda), 2)) /
        (math.Sin(phi1)*math.Sin(phi2) + math.Cos(phi1)*math.Cos(phi2)*math.Cos(deltaLambda)))

    alpha := math.Atan2(math.Cos(phi1)*math.Sin(phi2)-math.Sin(phi1)*math.Cos(phi2)*math.Cos(deltaLambda),
        math.Sin(deltaLambda)*math.Cos(phi2))

    if alpha < 0 {
        alpha += 2 * math.Pi
    }

    u2 := math.Pow(math.Cos(alpha), 2) * ((math.Pow(a, 2) - math.Pow(b, 2)) / math.Pow(b, 2))
    A := 1 + (u2 / 16384) * (4096 + u2 * (-768 + u2 * (320 - 175 * u2)))
    B := (u2 / 1024) * (256 + u2 * (-128 + u2 * (74 - 47 * u2)))
    deltaSigma := B * math.Sin(sigma) * (math.Cos(2 * sigma) + (B / 4) * (math.Cos(sigma) * (-1 + 2 * math.Pow(math.Cos(2 * sigma), 2)) -
        (B / 6) * math.Cos(4 * sigma) * (-3 + 4 * math.Pow(math.Sin(sigma), 2)) * (-3 + 4 * math.Pow(math.Cos(2 * sigma), 2))))

    s := b * A * (sigma - deltaSigma)

    return s
}

func toRadians(degrees float64) float64 {
    return degrees * (math.Pi / 180)
}

Program çalıştırıldığında çıktısı aşağıdaki gibi olacaktır.

Distance between New York City and Los Angeles: 3931.50 km

Programın çalışır haline şuradan erişilebilir.


Algoritma, dünya yüzeyinin eğriliğini ve elipsoid şeklini dikkate alarak mesafe hesaplamalarını gerçekleştirir. İki nokta arasındaki mesafeyi hesaplarken Vincenty formülü gibi matematiksel formülleri kullanır. Bu formüller dünya yüzeyinin eğrisini daha doğru bir şekilde hesaplamak için çeşitli trigonometrik ve geometrik hesaplamaları içerir.

Kullanım alanları arasında coğrafi bilgi sistemleri (GIS), harita projeleri, navigasyon yazılımları ve uzay teknolojileri bulunur. Örneğin; gemilerin ve uçakların rotalarını planlarken, arazi haritalama ve jeodezi çalışmalarında bu algoritma kullanılabilir. Ayrıca coğrafi mesafelerin doğru bir şekilde hesaplanması gereken herhangi bir alanda bu algoritma değerlidir.


Kaynaklar