2010-09-09 30 views
5

aralığında olup olmadığını hesaplayın Konum farkında olması gereken bir Windows Phone 7 uygulaması yazıyorum. Özellikle, telefonun belirli bir konumdaki (sabit) bir menzil dahilinde (0,5 mil) geldiğinde bazı (C#) kodlarının çalışmasını istiyorum. Bellekteki fiziksel konumlar için tüm lat/long verilere sahibim. Cihazların mevcut koordinatlarını almak için Geo Coordinate Watcher class kullanıyorum. Şimdi tek numara, kullanıcının herhangi bir konumun aralığında olup olmadığını hesaplamaktır.Bir koordinatın başka bir

Teşekkürler!

Güncelleme: Burada söz verdiği gibi mesafeleri hesaplamak Spherical Law of Cosines yöntemini kullanan küçük C# fonksiyondur. Umarım başka birine yardım edebilir. Not: Bir Windows Phone 7 uygulaması yazıyorum, bu yüzden GeoLocation sınıfını kullandım. Eğer "normal" C# kullanıyorsanız, fonksiyonu ihtiyaç duyulan iki koordinat çiftini kabul etmek için işlevi değiştirebilirsiniz.

internal const double EarthsRadiusInKilometers = 6371; 

    /// <summary> 
    /// The simple spherical law of cosines formula 
    /// gives well-conditioned results down to 
    /// distances as small as around 1 metre. 
    /// </summary> 
    /// <returns>Distance between points "as the crow flies" in kilometers</returns> 
    /// <see cref="http://www.movable-type.co.uk/scripts/latlong.html"/> 
    private static double SpericalLawOfCosines(GeoCoordinate from, GeoCoordinate to) 
    { 
     return (Math.Acos (
       Math.Sin(from.Latitude) * Math.Sin(to.Latitude) + 
       Math.Cos(from.Latitude) * Math.Cos(to.Latitude) * 
       Math.Cos(to.Longitude - from.Longitude) 
      ) * EarthsRadiusInKilometers) 
      .ToRadians(); 
    } 

    /// <summary> 
    /// To a radian double 
    /// </summary> 
    public static double ToRadians(this double d) 
    { 
     return (Math.PI/180) * d; 
    } 
+0

Merak etme, neden haversinin java kaynağına gittiğiniz aynı sayfada sunulan daha basit (ve daha hızlı) spiner kanunu kullanmadınız? Yazar,> 1m mesafeler için tavsiye edildiğini ve doğru olduğunu belirtir. – ctacke

+0

Sadece makaleyi yeniden okuyordum ve haklısınız, Cosines'in Küresel Yasası daha basittir. Aslında nasıl yapıldığını görmek için ikisini de uyguladım - bu kodu da göndereceğim. Teşekkürler ... – will

cevap

4

GeoCoordinate'i kullandığınız için, o sınıfta zaten bulunduğunda neden kendiniz uygulayın?

MDSN documentation (Bkz coordinateA ve B tipi coğrafi koordinat vardır)

var distance = coordinateA.GetDistanceTo(coordinateB); 

.

+0

Ben orada olduğunu bilmiyordum. Stackoverflow'u seviyorum ... Teşekkürler! – will

+0

Whoa! Ben de orada olduğunu bilmiyordum! –

2

bir hızlı arama toprak üzerinde iki nokta arasındaki mesafeyi hesaplamak için, bir formül ile this page getirildi. bağlantılı sayfadan doğrudan Alıntı:

Haversine formula: 

R = earth’s radius (mean radius = 6,371km) 
Δlat = lat2− lat1 
Δlong = long2− long1 
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2) 
c = 2.atan2(√a, √(1−a)) 
d = R.c 

(Note that angles need to be in radians to pass to trig functions). 

Sadece mevcut konumunu ve başka bir yer için enlem/boylam değerleri takın ve bu iki nokta arasındaki Km mesafedir d, almalısınız.

+1

Bu yöntem sağlam, sadece sınırlarını anladığınızdan emin olun. Hiçbir şekilde kesin değildir ve dağlık bir bölgede iseniz, o zaman şiddetli yükselme değişiklikleri de devreye girer. Ancak çoğu amaç için, bu sadece iyi olmalıdır. – Brad

+0

Teşekkürler çocuklar. Bir dakika için yükseklik sorusu dikkate alınmadığında, doğrulukla ilgili sınırlamalar nelerdir? Daha az hassas olmasını istediğim daha ince tahıl olduğunu mu söylüyorsun? yani 50 mil menzili oldukça hassastır ancak 50 metrelik bir mesafe çok doğru değildir? – will

+1

Harika bir daire hesabı. Hesaplamanın kendisinde bir hata yok, tahmini konumunuz var. GPS alıcınız +/- nerede olduğunuzu bilir (alıcıya, uydu sayısına vb. Bağlı olarak). Örneğin, örneğin, +/- 25m diyelim. Eh, eğer 50 mil mesafeden konuşuyorsanız, o zaman yüzde o kadar uzak değil. 50 metre mesafeden konuşuyorsanız, o zaman çok büyük bir miktardır. – ctacke