2010-09-09 137 views
5

我正在編寫需要位置感知的Windows Phone 7應用程序。具體而言,我希望某些(c#)代碼在電話進入特定位置(固定)範圍內時運行,例如說0.5英里。我擁有存儲器中所有物理位置的緯度/經度數據。我將使用Geo Coordinate Watcher class來獲取設備的當前座標。現在唯一的技巧是計算用戶是否在任何位置的範圍內。計算一個座標是否在另一個範圍內

謝謝!

更新:作爲承諾這裏的小C#功能,它使用Spherical Law of Cosines計算距離的方法。希望它可以幫助別人。注意:我正在編寫Windows Phone 7應用程序,因此使用了GeoLocation類。如果你使用「regular」c#,那麼你可以改變函數來接受函數需要的兩個座標對。

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

出於好奇,爲什麼不使用在同一頁上呈現的更簡單(更快)的餘弦定律?作者指出,對於大於1米的距離,建議和準確。 – ctacke 2010-09-20 01:30:20

+0

我剛剛重新閱讀文章,你說得對,Cosines的球形法更簡單。實際上,我實現了這兩個方法來看看它是如何完成的 - 我也會發布該代碼。謝謝... – will 2010-09-20 16:24:44

回答

4

既然您正在使用GeoCoordinate,那麼爲什麼當它已經存在於該類中時自己實現呢?

var distance = coordinateA.GetDistanceTo(coordinateB); 

(其中coordinateA和B型的會有地理座標)

MDSN documentation

+0

我不知道這是在那裏。我愛stackoverflow ...謝謝! – will 2011-02-03 04:06:44

+0

哇!我不知道這是在那裏! – 2012-01-05 03:11:39

2

一個快速搜索帶來了this page與一個公式計算地球上兩點之間的距離。直接從鏈接頁面引用:

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). 

在緯度/長值,只需將您的當前位置,另一個位置,你應該得到d,這是這兩個點之間的千米的距離。

+1

這種方法很紮實,只要確定瞭解它的侷限即可。這是不確切的,如果你在山區,那麼劇烈的海拔變化也會發揮作用。不過,對於大多數用途而言,這應該會很好。 – Brad 2010-09-09 23:40:59

+0

謝謝你們。無視高程問題一分鐘,對準確度有什麼限制?你是否說我想要的精細粒子精確度不高?即50英里的範圍相當準確,但是50米的範圍不是很準確? – will 2010-09-10 01:11:34

+1

這是一個大圓計算。計算本身沒有錯誤,你的估計位置確實如此。你的GPS接收器知道你在哪裏+/-某些數量(取決於接收器,衛星數量等)。比方說,例如,它是+/- 25米。好吧,如果你說的是50英里的距離,那麼百分比就不會太遠。如果你說的是50米的距離,那麼這是一個非常大的數字。 – ctacke 2010-09-10 01:26:15

相關問題