2017-02-12 11 views
1

컨텍스트Geofire는 Firebase 쿼리에 대한 경계 geohashes를 어떻게 계산합니까?

지금은 잠시 동안 중포 기지와 함께 Geofire를 사용했습니다 나는 Geofire가 쿼리를 수행하는 방법을 정말 호기심이 있어요. 의미 론적으로 이해할 수있는 것은 최소 및 최대 해시가되는 좌표와 반지름의 함수입니다. 그래서 내가 생각하는 방식이 두 가지 (최소 및 최대) geohashes이 주어진 입력 떨어져 계산이

ref.child("users").orderByChild("g").startAt(minHash).endAt(maxHash).on('child_added', function(snapshot) { /* retrieved snapshot contains the geohashes in range */ }); 

과 같을 것이다 중포 기지로 국면에서 작동합니다. 이제 여기에 질문

질문 (들) 내가 위에서 언급 한 무엇이 올바른지 가정

, 어떻게이 두 geohashes가 계산 온다? geohashes가 일반적으로 경계 사각형을 나타내는 경우 특정 원형 영역 내에서 결과를 어떻게 반환합니까? 그리고 마지막으로, 크기가 다른 두 개의 거칠은 어떻게 같은 중심을 가질 수 있습니까?

그 마지막 부분에 명확하게

이 : 작은 지역으로 영역을 절반으로하여 작품을 geohashing 때문에 다음 이미지

Typical geohashing steps

을 고려, 어떻게 다른 크기 (최소 및 최대)의 두 해시는 같은 중심을 가질 수있다 전철기?

가정

나는 아마 해시의 원시 값을 증가/감소로 간단하게 생각하지만, 증가/감소가의 크기를 기준으로해야하기 때문에 그 많은 이해가되지 않습니다 내가 잘못하지 않았다면 해쉬 (말할 수있는 "확대"수준)와 쿼리 반경.

답변

3

GeoFire는 실제로 데이터베이스에 대해 사각형 영역의 범위 쿼리를 수행합니다. 이 범위는 쿼리에 표시된 범위를 포함하는 가장 작은 사각형입니다.

그러므로, 클라이언트 측 코드에서 쿼리의 중심에 각 키의 실제 거리를 확인하고 만 쿼리 안에 상품 대한 key_entered/key_moved 이벤트가 발생.

관련 코드는 here입니다 :

// Determine if the location is within this query 
distanceFromCenter = GeoFire.distance(location, _center); 
isInQuery = (distanceFromCenter <= _radius); 

... 

// Fire the "key_entered" event if the provided key has entered this query 
if (isInQuery && !wasInQuery) { 
    _fireCallbacksForKey("key_entered", key, location, distanceFromCenter); 
} else if (isInQuery && oldLocation !== null && (location[0] !== oldLocation[0] || location[1] !== oldLocation[1])) { 
    _fireCallbacksForKey("key_moved", key, location, distanceFromCenter); 
} else if (!isInQuery && wasInQuery) { 
    _fireCallbacksForKey("key_exited", key, location, distanceFromCenter); 
}