2011-04-30 4 views
7

R 트리 주어진 데이터 포인트를 사용하여 구성해야합니다 .R tree.All 구현의 구현을 검색했습니다. . 나는 주어진 데이터 포인트 자체 (1 차원 일 수있다)가있을 때 r 트리를 만들 필요가있다.이 코드는이 데이터 포인트를 둘러싸고 직사각형을 만들어 트리를 만들어야한다.주어진 데이터 포인트를 사용하여 RTree를 구성하는 방법

답변

5

최소 = 최대 = 좌표의 MBR (Minimum bounding rectangle)을 사용하십시오. 그들은 모두 이렇게합니다. 그러나 좋은 구현은 잎 노드의 용량이 디렉토리 노드보다 약 2 배 큰 포인트 데이터를 저장합니다.

+0

조금 정교하게 수 : 명백한 장점은 나무의 잎의 데이터가 사용이 보이는 등, 캐싱이 더 나은, 더 적은 메모리를 사용하는 것을 의미 중복되지 않는 것입니다? 대부분의 R-tree 코드에서, 오른쪽 아래와 오른쪽 위의 점으로 사각형을 만들고 R-tree에 사각형을 추가합니다. 단일 점을 저장하려면 두 점 (오른쪽 아래와 오른쪽 위)이 동일한 단일 점이어야한다고 말하는 것입니까? – stackoverflowuser2010

+0

단일 점의 MBR은 물론 'min = max = coordinate'입니다. 리프 레벨에서 MBR 대신 점을 저장하면 디스크 공간을 거의 2 배나 줄이는 두 배의 오브젝트가 생성됩니다. –

+0

감사합니다. 따라서 답을 해독하여 "예, 한 점을 저장하려면 두 점 (오른쪽 아래와 오른쪽 위)이 동일한 단일 점이어야합니다"를 의미해야한다고 가정합니다. point-region quadtree와 같은 다른 데이터 구조보다 점을 저장하는 데 R-tree가 더 좋습니까? – stackoverflowuser2010

-1

포인트를 저장하기 위해 Rtree를 사용하는 것은 오용처럼 보입니다. 이런 종류의 구조가 공간 데이터를 저장하기 위해 표시되었지만 일부 연구 후에 방금 찾은 공간이 영 (0)이 아닌 영역을 저장하는 데 가장 적합하다는 것을 알았습니다 (이름의 R은 Region 또는 Rectangle 용이므로). 멋진 인덱스가있는 간단한 테이블을 작성하면 데이터를 업데이트하고 검색하는 데 더 우수한 성능을 제공해야합니다. 아래에있는 내 예를 고려해

CREATE TABLE locations (id, latitude, longitude); 
CREATE INDEX idx_locations ON locations (latitude, longitude); 

바람직하다 그냥 지점이 아닌 사각형을 대표하는 것처럼 모든 행에 대해 maxLongitude 이상 maxLatitude 및 minLongitude 이상 minLatitude을 반복하려는 경우

CREATE VIRTUAL TABLE locations USING rtree(id, minLatitude, maxLatitude, minLongitude, maxLongitude); 

이상. 후자의 접근 방식은 예상대로 작동하지만 Rtrees는 사각형 영역을 인덱싱하는 데 적합하며 점을 저장하는 데 사용하면 최악의 성능으로 오용됩니다. 위와 같이 복합 색인을 선호하십시오.

추가 읽기 : http://www.deepdyve.com/lp/acm/r-trees-a-dynamic-index-structure-for-spatial-searching-ZH0iLI4kb0?key=acm

+1

동의 할 수 없습니다. 포인트 인덱스와 R 트리 쿼리는 복합 인덱스 (SQLite)보다 빠릅니다. Spatiality는 데이터뿐 아니라 쿼리에 관한 것입니다. 사각형 (쿼리)에 포함 된 모든 점 (데이터)을 알고 싶다면 R 트리를 사용해보십시오. – pwes

2

당신이 C++ 구현을 찾고 있다면, 하나는 현재 Boost.Geometry에 포함 (. 부스트 1.57) 점, 박스 및 세그먼트를 저장할 수있다.

#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/geometries.hpp> 
#include <boost/geometry/index/rtree.hpp> 

#include <vector> 

namespace bg = boost::geometry; 
namespace bgi = boost::geometry::index; 

int main() 
{ 
    typedef bg::model::point<float, 2, bg::cs::cartesian> point; 
    typedef bg::model::box<point> box; 

    // a container of points 
    std::vector<point> points; 

    // create the rtree 
    bgi::rtree< point, bgi::linear<16> > rtree(points.begin(), points.end()); 

    // insert some additional points 
    rtree.insert(point(/*...*/)); 
    rtree.insert(point(/*...*/)); 

    // find points intersecting a box 
    std::vector<point> query_result; 
    rtree.query(bgi::intersects(box(/*...*/)), std::back_inserter(query_result)); 

    // do something with the result 
} 
+0

다음은 어설 션이있는 숫자로 된 몇 가지 예입니다. https://github.com/cirosantilli/cpp-cheat/blob/160e96ec04df93c4ad227d63af5e651498bca834/boost/rtree.cpp –