Spec-Zone.ru › RethinkDB java

Географические запросы

RethinkDB поддерживает пространственные и географические запросы благодаря поддержке объектов геометрии.

  • Начало работы
  • Система координат
  • Линии и расстояния
  • Типы данных
  • Пространственные индексы
  • Использование GeoJSON
  • ЧАВО
  • Команды геопространственного поиска

Объекты геометрии реализованы с помощью географической системы координат, при этом точки и фигуры наносятся на поверхность сферы в трехмерном пространстве. Кроме того, объекты геометрии ReQL могут быть преобразованы в GeoJSON и из GeoJSON с некоторыми ограничениями.

Это обзор системы. Для получения более подробной информации см. документацию API для отдельных команд геопространственного поиска.

Начало работы

Создайте новую таблицу:

r.tableCreate("geo").run(conn);

Добавьте несколько точек:

r.table("geo").insert(r.array(
    r.hashMap("id", 1)
     .with("name", "San Francisco")
     .with("location", r.point(-122.423246, 37.779388)),
    r.hashMap("id", 2)
     .with("name", "San Diego")
     .with("location", r.point(-117.220406, 32.719464))
)).run(conn);

Получите расстояние между двумя точками в Сан-Франциско и Сан-Диего:

r.table("geo").get(1).g("location").distance(
    r.table("geo").get(2).g("location")
).run(conn);

Добавьте пространственный индекс в таблицу (необходимый для определенных операций, таких как getNearest):

r.table("geo").indexCreate("location").optArg("geo", true);

Получите ближайшую точку в таблице к заданной на основе индекса:

import com.rethinkdb.gen.ast.Point;

Point point = r.point(-122.422876,37.777128);  // San Francisco
r.table("geo").getNearest(point).optArg("index", "location").run(conn);

Система координат

Координаты точек на поверхности сферы задаются парой чисел с плавающей точкой, обозначающих долготу и широту. Диапазон долготы составляет от −180 до 180, что охватывает всю сферу: −180 и 180 обозначают одну и ту же линию. Диапазон широты составляет от −90 (южный полюс) до 90 (северный полюс).

Для более подробного объяснения см. статью в Википедии о географической системе координат.

Линии и расстояния

Учитывая две конечные точки, линия в ReQL представляет собой кратчайший путь между этими конечными точками по поверхности сферы, известный как геодезическая линия. Линии могут быть определены с помощью нескольких точек, в этом случае каждый отрезок линии будет геодезическим; аналогичным образом, стороны многоугольника будут геодезическими. Геодезические линии рассчитываются, предполагая идеальную сферу.

Обратите внимание, что линию между северным и южным полюсами (от широты −90 до широты 90) нельзя вычислить, поскольку все возможные пути между ними являются «кратчайшими»; это может вызвать ошибку в ReQL или оно может выбрать произвольный (но технически правильный) путь.

Расстояния в ReQL (по умолчанию) рассчитываются не для идеальной сферы, а для эллипсоида, используя точный и относительно быстрый алгоритм, разработанный Чарльзом Карни. Использованный эталонный эллипсоид — WGS84, стандарт, используемый для GPS. По умолчанию расстояния указываются в метрах, но вы можете передать необязательный аргумент функциям расстояния, чтобы указать километры, мили, морские мили и футы.

Типы данных

Функции геопространственного поиска реализованы с помощью набора новых типов данных для объектов геометрии:

  • Точки: одна пара координат
  • Линии: последовательность из двух или более пар координат
  • Многоугольники: многоточечная линия (по крайней мере три пары координат), которая не пересекает себя и у которой первая и последняя пары координат совпадают. Внутренняя область многоугольника считается заполненной, то есть частью многоугольника. Многоугольники с «дырами» в них, где дыра — это другой многоугольник, содержащийся в первом, можно создать с помощью команды [polygonSub].

Кроме того, существует «псевдотип» под названием геометрия, который встречается в документации, чтобы указать, что любой из геометрических объектов может быть использован с этими командами.

Линии и многоугольники можно задавать, используя либо объекты точек, либо последовательности массивов из двух чисел:

r.line(r.point(0, 0), r.point(0, 5), r.point(5, 5), r.point(5, 0), r.point(0, 0));
r.line(r.array(0, 0), r.array(0, 5), r.array(5, 5), r.array(5, 0), r.array(0, 0));

Оба этих определения представляют собой квадрат. Если polygon было указано вместо line, они определили бы заполненный квадрат.

Хотя есть команда [circle], она аппроксимирует окружность, определяя либо линию, либо многоугольник. Нет истинного кругового типа данных.

Пространственные индексы

Чтобы создать индексы по полям, содержащим объекты геометрии, просто используйте стандартную команду indexCreate, установив необязательный аргумент geo в значение true. В Java это будет:

r.table("sites").indexCreate("locations").optArg("geo", true);

Как и другие индексы ReQL, вы можете создать индекс, используя анонимную функцию вместо простого имени поля, а также создать многоуровневые индексы, используя флаг multi с geo. Подробнее см. в документации API indexCreate.

Использование GeoJSON

Объекты геометрии ReQL не являются объектами GeoJSON, но вы можете преобразовывать между ними с помощью команд geojson и toGeojson.

RethinkDB позволяет преобразовывать только объекты GeoJSON, которые имеют эквиваленты в ReQL: Point, LineString и Polygon; MultiPoint, MultiLineString и MultiPolygon не поддерживаются. (Однако вы можете хранить несколько точек, линий и многоугольников в массиве и использовать с ними многоуровневый пространственный индекс.)

Поддерживаются только координаты долготы/широты. Объекты GeoJSON, использующие декартовы координаты, задающие высоту или свою систему координат, будут отклонены.

ЧАВО

  • Сколько измерений поддерживается?

    Два (широта и долгота). Высота не поддерживается.

  • Какие проекции поддерживаются?

    RethinkDB поддерживает эталонный эллипсоид WGS84 и географическую систему координат (GCS). Он не поддерживает непосредственно никакую проекцию координат (PCS), но существует множество инструментов для выполнения таких проекций.

  • RethinkDB корректно интерполирует градусы в метры вдоль пути?

    Да. Расчеты расстояний выполняются по геодезической линии (либо по эталонному эллипсоиду WGS84, либо по единичной сфере).

  • Можно ли экспортировать в WKT или WKB?

    Нет. Однако вы можете экспортировать в GeoJSON и обработать его с помощью других инструментов.

Команды геопространственного поиска

  • geojson: преобразование объекта GeoJSON в объект геометрии
  • toGeojson/to_geojson: преобразование объекта геометрии в объект GeoJSON
  • point: создание объекта точки
  • line: создание объекта линии
  • polygon: создание объекта многоугольника
  • circle: создание линии или многоугольника, аппроксимирующего окружность
  • distance: вычисление расстояния между точкой и другим объектом геометрии
  • intersects: определение пересечения двух объектов геометрии
  • includes: определение того, полностью ли один геометрический объект содержится в полигональном объекте
  • getIntersecting: возвращение документов из последовательности, у которых геопространственное индексированное поле значения которого пересекаются с заданным объектом геометрии
  • getNearest: возвращение документов из последовательности, у которых геопространственное индексированное поле значения которого находятся в заданном расстоянии от заданной точки
  • polygonSub: использование одного многоугольника, полностью содержащегося в другом, для вырезания «дыры» в окружающем многоугольнике

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/geo-support/java/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API