Географические запросы
RethinkDB поддерживает пространственные и географические запросы благодаря поддержке объектов геометрии.
Объекты геометрии реализуются с помощью географической системы координат, где точки и фигуры наносятся на поверхность сферы в трехмерном пространстве. Кроме того, объекты геометрии ReQL можно преобразовывать в GeoJSON и из него, с некоторыми ограничениями.
Это обзор системы. Более подробную информацию см. в документации API для отдельных команд пространственной геометрии.
Начало работы
Создайте новую таблицу:
r.table_create('geo').run(conn)
Добавьте несколько точек:
r.table('geo').insert([
{
'id': 1,
'name': 'San Francisco',
'location': r.point(-122.423246,37.779388)
},
{
'id': 2,
'name': 'San Diego',
'location': r.point(-117.220406,32.719464)
}
]).run(conn)
Получите расстояние между двумя точками в Сан-Франциско и Сан-Диего:
r.table('geo').get(1)['location'].distance(
r.table('geo').get(2)['location']).run(conn)
Добавьте пространственный индекс в таблицу (необходимый для определенных операций, таких как getNearest):
r.table('geo').index_create('location', geo=True)
Получите ближайшую точку в таблице к заданной точке на основе индекса:
point = r.point(-122.422876,37.777128) # San Francisco
r.table('geo').get_nearest(point, index='location')
Система координат
Координаты точек на поверхности сферы задаются парой чисел с плавающей точкой, обозначающих долготу и широту. Диапазон долготы составляет от −180 до 180, который охватывает всю сферу: −180 и 180 обозначают одну и ту же линию. Диапазон широты составляет от −90 (южный полюс) до 90 (северный полюс).
Для более подробного объяснения см. статью в Википедии о географической системе координат.
Линии и расстояния
При заданных двух конечных точках линия в ReQL представляет собой кратчайший путь между этими конечными точками на поверхности сферы, называемый геодезической линией. Линии могут быть определены с помощью нескольких точек, в этом случае каждый отрезок линии будет геодезической линией; аналогично, стороны многоугольника будут геодезическими. Геодезические линии рассчитываются, предполагая идеальную сферу.
Обратите внимание, что линию между северным и южным полюсами (от широты −90 до широты 90) рассчитать нельзя, так как все возможные пути между ними являются «кратчайшими»; это может вызвать ошибку в ReQL или оно выберет произвольную (но технически правильную) траекторию.
Расстояния в ReQL (по умолчанию) рассчитываются, предполагая не идеальную сферу, а эллипсоид, используя точный и относительно быстрый алгоритм, разработанный Чарльзом Карни. Используемый эталонный эллипсоид — WGS84, стандарт, используемый в GPS. По умолчанию расстояния задаются в метрах, но вы можете передать необязательный аргумент в функции вычисления расстояний, чтобы указать километры, мили, морские мили и футы.
Типы данных
Функции пространственной геометрии реализуются с помощью набора новых типов данных геометрических объектов:
- Точки: пара координат
- Линии: последовательность из двух или более пар координат
- Многоугольники: линия, состоящая из нескольких точек (как минимум три пары координат), которая не пересекает себя, и первая и последняя пары координат равны. Внутренняя часть многоугольника считается заполненной, то есть частью многоугольника. Многоугольники с «дырами», где дыра — это другой многоугольник, содержащийся в первом, можно создать с помощью команды polygon_sub.
Кроме того, существует «псевдотип» геометрия, который появляется в документации, чтобы указать, что любой из геометрических объектов может быть использован с этими командами.
Линии и многоугольники можно задавать с помощью точек или последовательностей массивов из двух чисел:
r.line(r.point(0,0), r.point(0,5), r.point(5,5), r.point(5,0), r.point(0,0))
r.line([0,0], [0,5], [5,5], [5,0], [0,0])
Оба эти варианта определяют один и тот же квадрат. Если бы polygon было указано вместо line, они бы определили заполненный квадрат.
Хотя существует команда [circle], она приближает круг, определяя либо линию, либо многоугольник. Не существует истинного кругового типа данных.
Пространственные индексы
Чтобы создать индексы на полях, содержащих объекты геометрии, просто используйте стандартную команду index_create, установив необязательный аргумент geo в значение True. В Python это будет выглядеть так:
r.table('sites').index_create('locations', geo=True)
Как и другие индексы ReQL, вы можете создать индекс, используя анонимную функцию вместо простого имени поля, а также создать составной индекс, используя флаг multi с geo. Подробнее см. документацию API index_create.
Использование GeoJSON
Объекты геометрии ReQL не являются объектами GeoJSON, но вы можете преобразовывать их друг в друга с помощью команд geojson и to_geojson.
RethinkDB допускает преобразование только объектов GeoJSON, имеющих эквиваленты в ReQL: Point, LineString и Polygon; MultiPoint, MultiLineString и MultiPolygon не поддерживаются. (Вы можете, однако, хранить несколько точек, линий и многоугольников в массиве и использовать пространственный составной индекс с ними.)
Поддерживаются только координаты долготы/широты. Объекты GeoJSON, использующие декартовы координаты, задающие высоту или задающие свою систему координат, будут отклонены.
ЧАВО
-
Сколько измерений поддерживается?
Два (широта и долгота). Высота не поддерживается.
-
Какие проекции поддерживаются?
RethinkDB поддерживает эталонный эллипсоид и географическую систему координат (GCS) WGS84. Он напрямую не поддерживает никакие проекции систем координат (PCS), но существует множество инструментов для выполнения таких проекций.
-
RethinkDB корректно интерполирует градусы в метры вдоль пути?
Да. Вычисления расстояний выполняются по геодезической линии (либо эталонному эллипсоиду WGS84, либо единичной сфере).
-
Можно ли экспортировать в WKT или WKB?
Нет. Однако вы можете экспортировать в GeoJSON и обработать его с помощью других инструментов.
Команды пространственной геометрии
- geojson: преобразование объекта GeoJSON в объект геометрии
- to_geojson/to_geojson: преобразование объекта геометрии в объект GeoJSON
- point: создание объекта точки
- line: создание объекта линии
- polygon: создание объекта многоугольника
- circle: создание линии или многоугольника, приближающего круг
- distance: вычисление расстояния между точкой и другим геометрическим объектом
- intersects: определение, пересекаются ли два геометрических объекта
- includes: определение, полностью ли один геометрический объект содержится в многоугольнике
- get_intersecting: возвращает документы из последовательности, у которых поле с индексом пространственной геометрии пересекается с заданным геометрическим объектом
- get_nearest: возвращает документы из последовательности, у которых поле с индексом пространственной геометрии находится на заданном расстоянии от заданной точки
- polygon_sub: использование одного многоугольника, полностью содержащегося в другом, для вырезания «дыры» во внешнем многоугольнике
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/geo-support/python/