Spec-Zone.ru › RethinkDB python

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

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

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

Объекты геометрии реализуются с помощью географической системы координат, где точки и фигуры наносятся на поверхность сферы в трехмерном пространстве. Кроме того, объекты геометрии 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/

Spec-Zone.ru

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