2011-04-02 23 views
1

我正在研究一個GPS應用程序,並且想要在用戶周圍放置標記像Zombie RunSpecTrek,但我對如何找出位置感到十分困惑圍繞用戶。把位置放在某個半徑的用戶周圍的地圖上 - android

我一直在尋找Location類的文檔,並使用distanceTo()函數以及MapView的latitudeSpan(),longitudeSpan()和getProjection()函數,但我想不出如何決定例如用戶周圍100米的位置。

因爲我知道用戶的位置,我只會放置距離用戶約1公里的標記,我最多可以將該區域視爲平面而不是橢圓形,因此可以將用戶的位置經度和緯度以及從他們+/-來繪製標記周圍的標記(使用一些基本的三角函數,例如x = cos(radius)和y = sin(radius)將它保持在玩家周圍的半徑大小的圓內)?

我不明白多長時間/緯度對應於實際標量距離,因爲在100英尺100點距離90英尺100點距離10米處會有多長? (我知道這些值是完全錯誤的,只是用它們來說明我的問題)。

感謝您的時間,

Infinitifizz

回答

2

2經度/緯度點之間的距離與haversine公式計算。這裏是與理論的鏈接: http://www.movable-type.co.uk/scripts/latlong.html

我會使用你已經提到的distanceTo方法來達到你的目的。你有你的當前位置和所有的興趣點。只需爲每個興趣點調用Location.distanceTo(Poi),並且如果距離大於1000米,則可以將該點繪製到地圖上。

如果你沒有你的興趣點作爲定位對象只是建立他們是這樣的:

poiLocation = new Location(LocationManager.PASSIVE_PROVIDER); 
poiLocation.setLatitude(latitude); 
poiLocation.setLongitude(longitude); 

我喜歡的應用程序雷達所使用的distanceTo方法和工作得很好。

+0

您好,感謝您的答覆,但是這確實是我的問題,我沒有興趣點,我想隨意把「項目」在地圖上,供用戶瀏覽就像殭屍跑和Spec Trek一樣。 說用戶啓動應用程序,它顯示了他們在mapview中的位置以及他們必須訪問的3個標記或周圍的標記,我不知道如何放置這些標記,因爲我不知道如何工作從用戶那裏說出10米,然後在那裏放置一個標記。所以我需要一個distanceTo()類型的函數反向,讓我指定的距離,它創建一個標記點​​在這一點長/拉特。 – 2011-04-02 20:44:13

+1

我不認爲有一種方法可以爲您提供定義半徑內的每個GeoPoint或位置,但您可以自己計算這些點。只要看看我提供的鏈接。有一個部分叫做「從起點到目的地點的距離和方位」。在那裏,您有一個具有給定地理座標的公式(您當前的位置),並以度爲單位提供距離和方位。利用該公式,您可以計算特定的地理座標並將其顯示在您的地圖上。 – 2011-04-02 20:54:41

+0

啊,非常感謝。我仍然無法使它工作,無論是在我的應用程序還是在網站上,如果我改變了這些值。該網站的問題是,它沒有說出地球半徑的價值。所以把用戶的位置(我在英格蘭)和地球的半徑作爲從維基百科獲取的平均半徑爲6371,距離爲1km,方位爲2(不知道這是否應該是一個整數,但這就是我所做的)它決定了一個點在祕魯的1公里,這顯然不是這樣的:-)任何幫助將遇到極端的感激 – 2011-04-02 23:02:18

1

稍微靠近頁面底部的形式被描述的更好一點。在那裏你可以看到他在計算之前轉換爲弧度。另外,使用正確的數據類型以避免錯誤的數字舍入至關重要。這裏是一個小的代碼片段應該工作:

double lat1 = 52.104636; 
double lon1 = 0.356324; 

double R = 6371.0; 
double d = 1.0; 
double dist = d/R; 
double brng = Math.toRadians(1.0); 
lat1 = Math.toRadians(lat1); 
lon1 = Math.toRadians(lon1); 

double lat2 = Math.asin(Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng)); 
double lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1),   Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2)); 
lon2 = (lon2+3*Math.PI)%(2*Math.PI) - Math.PI; 

System.out.println("lat2: " + Math.toDegrees(lat2)); 
System.out.println("lon2: " + Math.toDegrees(lon2)); 
+0

啊耶謝謝馬里奧,我看到下面,並得到它很多工作(除了它是四捨五入,因爲我使用浮動不是雙打),但我已經離開了一個星期,我會盡力讓它明天工作。非常感謝您的幫助。 – 2011-04-11 23:20:46

相關問題