2013-06-03 65 views
4

在mysql中,我使用了haversine公式來查詢附近的對象。Firebase查詢附近的對象

使用這個公式 式

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance 
FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

哪個

  • 3959:以英里
  • 37,-122地球的半徑:指定緯度經度
  • 25:25英里

在Firebase中, 我可以像MySQL中那樣存儲用戶經驗嗎? 創建一個標記表。 ID,緯度,經度列,然後用公式查詢

更新

我要問,什麼是查詢附近使用這個公式火力的方式。

回答

8

簡短的回答,不像你想要的那樣。

firebase本質上有兩種查詢數據的方式:按路徑和按優先級排序。這比SQL更有限,並且有一個非常好的原因 - 我們的API被精心設計爲只允許 操作,我們可以保證快速。 Firebase是一個實時和可擴展的後端,我們希望讓您能夠構建優質的應用程序,這些應用程序可以在不影響響應的情況下爲數百萬用戶提供服務。

見,what is firebase and deNormalizing data 此外,這SO question是相似的。

對評論的迴應: Firebase不會爲您計算sin(radians(X))。這是一個'緩慢'的操作。所以,當您保存時,您需要將這些信息存儲到數據中。 我不是100%確定的,但是您可以存儲標記,也可以將經度/緯度存儲在單獨的父級中。

Root 
    -> Markers 
    -> longitude (Use the value as priority) -> MarkerId 
    -> latitude (Use the value as priority) -> MarkerId 

然後,您應該可以使用邊界來查找最大和最小經度和緯度。 使用它通過優先級查詢經度和緯度路徑。如果MarkerId同時存在,則使用它。

研究快速位發現Latitude Longitude Bounding Coordinates

+0

什麼他的建議是,你把經度優先級標記列表,並通過緯度優先另一個列表。然後,您查詢兩個列表,並查看列表相交的位置。 –

3

嘿,我剛剛完成建設用火力和GeoFire實時谷歌地圖這篇文章。 GeoFire非常酷且易於使用。它允許你使用lon lat和radius來查詢。它返回一個可用於查詢您的Firebase數據庫的密鑰。您可以在創建geoFire對象時設置密鑰,以滿足您的需求。它通常是一個可以用來獲取與該距離相關聯的對象的引用。

這裏是geoFire鏈接: https://github.com/firebase/geofire-js

下面是一個例子使用案例:

你有一個經度緯度,你得到了使用導航:

var lon = '123.1232'; 
var lat = '-123.756'; 
var user = { 
    name: 'test user', 
    longitude: lon, 
    latitude: lat 
} 
usersRef.push(user).then(function(response) { 
    var key = response.key; 
    var coords = [lon, lat]; 
    geoFire.set(key, coords, function(success){ 
     console.log('User and geofire object has been created'); 
    }); 
}) 

現在你可以查詢用戶使用:

// Set your current lon lat and radius 
var geoQuery = geoFire.query({ 
    center: [latitude, longitude], 
    radius: radiusKm 
}); 
geoQuery.on('key_entered', function(key, location, distance) { 
    // You can now get the user using the key 
    var user = firebaseRefUrl + '/' + key; 

    // Here you can create an array of users that you can bind to a scope in the controller 
}); 

如果你正在使用谷歌地圖。我建議你使用角度谷歌地圖。 它是一個非常酷的谷歌地圖指令,需要一系列標記和圓圈。因此,當控制器中的$ scope.markers或$ scope.circles發生變化時,它將自動應用到地圖上,而不會有任何雜亂的代碼。他們有很好的文檔。

這裏是一個鏈接: http://angular-ui.github.io/angular-google-maps/

+0

[您發佈了與另一個問題完全相同的答案](https://stackoverflow.com/a/29310763)。請不要在多個問題上發佈相同的答案。如果問題重複,請選擇最好的答案,然後將其他答案標記爲重複。如果它們不重複,則必須[*針對每個問題調整回答*](http://meta.stackexchange.com/q/104227/311792)。我承認我不是這些技術方面的專家,但看起來這不是對被問到的問題的直接回答。他不問如何查詢經緯度。 (另外,我知道這是舊的,但它被標記...) –