2016-06-29 49 views
1

我使用火力(機器人)來存儲數據尋找其他用戶,我節省用戶象下面這樣:根據我的位置

users{ 
    abcdefghi{ 
     name:"abc", 
     lat:"12.988", 
     long:-0.123, 
     desc:"all other desc" 
    },KLMNGHT{ 
     name:"def", 
     lat:"11.988", 
     long:-1.123, 
     desc:" other desc" 
    } 
} 

我想顯示誰進入我的半徑區域內的所有用戶(接近區),由我根據我的位置定義。我沒有想法。我看了Haversine公式。但我不知道要實現這一點。

尋找用戶的最佳算法是什麼?

+0

可以使用geofire查看 - https://github.com/firebase/geofire-java – michaelcarrano

+0

請考慮添加更多步驟以實現預期結果。從經緯度走向完整的算法顯示用戶是相當的問題。 – FishStix

+0

@michaelcarrano無法使用geofire bec現在它支持較舊版本的firebase – Davin

回答

1
private const double EARTH_RADIUS = 6378.137; 
private static double rad(double d) 
{ 
    return d * Math.PI/180.0; 
} 

public static double GetDistance(double lat1, double lng1, double lat2, double lng2) 
{ 
    double radLat1 = rad(lat1); 
    double radLat2 = rad(lat2); 
    double a = radLat1 - radLat2; 
    double b = rad(lng1) - rad(lng2); 

    double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) + 
    Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2))); 
    s = s * EARTH_RADIUS; 
    s = Math.Round(s * 10000)/10000; 
    return s; 
} 

也許這段代碼可以幫到你。

+0

會嘗試這一個 – Davin

1

所以嚴格的問題是:給定地球上的兩點A(lan1,lon1)B(lan2,lon2)找到A和B之間的距離?當你說'最好的算法'時,你的意思是在開發時間,時間,記憶方面最好?

不管怎麼說,假設「最佳」在開發時間上,你可以使用: 1.Google的API這裏解釋:https://developers.google.com/maps/documentation/distance-matrix/intro#DistanceMatrixRequests

2.Here是一個簡單的implementation-但我還沒有測試它自己yet- https://www.geodatasource.com/developers/java

+0

@Yoni可人最好的算法是說最好的方法。就像過濾用戶一樣。在2點的例子中,我需要把其他用戶長,拉特每次計算距離。根據我的位置,只有最好的方法來過濾用戶嗎?無論如何,謝謝 – Davin

+0

哦,我明白了,這是最天真的方式。如果你將有數千萬用戶,因爲這將通過其中的每一個,它可能不是最有效的。考慮到你自己的位置,說(lan1,lon1),如果你想找到所有的用戶,使他們的位置(lan2,lon2)在你所在位置的X kms附近,從我頭頂開始,你可以對他們進行排序表,以便lan2在兩個值之間AND lon2在兩個值之間。請記住,除非你有許多用戶,否則現在可​​能不值得你花時間。這是一個服務器端代碼 - 稍後您可以使用它。 –

+0

要有效地做到這一點,您可能希望根據lan將用戶存儲在某個平衡二叉樹中,並根據lon將另一個用戶存儲,然後在這些值之間找到用戶將採用log(N),其中N是用戶數。 –