R 트리 주어진 데이터 포인트를 사용하여 구성해야합니다 .R tree.All 구현의 구현을 검색했습니다. . 나는 주어진 데이터 포인트 자체 (1 차원 일 수있다)가있을 때 r 트리를 만들 필요가있다.이 코드는이 데이터 포인트를 둘러싸고 직사각형을 만들어 트리를 만들어야한다.주어진 데이터 포인트를 사용하여 RTree를 구성하는 방법
답변
최소 = 최대 = 좌표의 MBR (Minimum bounding rectangle)을 사용하십시오. 그들은 모두 이렇게합니다. 그러나 좋은 구현은 잎 노드의 용량이 디렉토리 노드보다 약 2 배 큰 포인트 데이터를 저장합니다.
포인트를 저장하기 위해 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는 사각형 영역을 인덱싱하는 데 적합하며 점을 저장하는 데 사용하면 최악의 성능으로 오용됩니다. 위와 같이 복합 색인을 선호하십시오.
동의 할 수 없습니다. 포인트 인덱스와 R 트리 쿼리는 복합 인덱스 (SQLite)보다 빠릅니다. Spatiality는 데이터뿐 아니라 쿼리에 관한 것입니다. 사각형 (쿼리)에 포함 된 모든 점 (데이터)을 알고 싶다면 R 트리를 사용해보십시오. – pwes
당신이 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
}
다음은 어설 션이있는 숫자로 된 몇 가지 예입니다. https://github.com/cirosantilli/cpp-cheat/blob/160e96ec04df93c4ad227d63af5e651498bca834/boost/rtree.cpp –
조금 정교하게 수 : 명백한 장점은 나무의 잎의 데이터가 사용이 보이는 등, 캐싱이 더 나은, 더 적은 메모리를 사용하는 것을 의미 중복되지 않는 것입니다? 대부분의 R-tree 코드에서, 오른쪽 아래와 오른쪽 위의 점으로 사각형을 만들고 R-tree에 사각형을 추가합니다. 단일 점을 저장하려면 두 점 (오른쪽 아래와 오른쪽 위)이 동일한 단일 점이어야한다고 말하는 것입니까? – stackoverflowuser2010
단일 점의 MBR은 물론 'min = max = coordinate'입니다. 리프 레벨에서 MBR 대신 점을 저장하면 디스크 공간을 거의 2 배나 줄이는 두 배의 오브젝트가 생성됩니다. –
감사합니다. 따라서 답을 해독하여 "예, 한 점을 저장하려면 두 점 (오른쪽 아래와 오른쪽 위)이 동일한 단일 점이어야합니다"를 의미해야한다고 가정합니다. point-region quadtree와 같은 다른 데이터 구조보다 점을 저장하는 데 R-tree가 더 좋습니까? – stackoverflowuser2010