SlideShare a Scribd company logo
1 of 33
Download to read offline
Работа с геоданными в MongoDb
Марк Заславский, mark.zaslavskiy@gmail.com
О чем будет доклад
● Обзор:
– Короткое знакомство с Mongo
– Коротко про GeoJson
– Какие данные можно хранить в Mongo
– Как хранить геоданные в Mongo
– Как индексировать геоданные
– Как выполнять запросы к данным (поиск объектов
рядом/внутри/на пересечении с областями)
● Примеры использования геовозможностей
MongoDb в Geo2Tag
Примеры к докладу
● Ссылка для скачивания:
http://bit.ly/1OHMY0N
● В архиве текстовые файлы со
списками комманд для каждого
примера
● Решетки (#) это не комментарий в
Mongo, их нужно удалить
● Примеры проверялись на MongoDb
2.4.9
(Вопросы в зал)
Введение и мотивация
● Геоданные:
– часто (но не всегда) = bigdata,
– имеют сложные алгоритмы анализа/обработки,
– могут иметь сложную структуру (границы областей,
маршруты).
● Mongo
– из коробки умеет работать с геоданными,
– хорошо масштабируется,
– представление геоданных стандартизовано
(GeoJSON).
Короткое введние в Mongo
● MongoDb – документо-
ориентированная СУБД
● Данные хранятся в BSON (почти
JSON)
● Документы объединяются в
коллекции
● У коллекций нет обязательной
схемы
● MapReduce
● Полнотекстовый поиск
Коллекции и документы
● Примерное соответствие с
SQL СУБД:
– Коллекция = таблица
– Документ = запись в таблице
– Идентификатор _id
(обязательное поле документа)
= первичный ключ
● Коллекции и базы данных
создаются “ленивым
образом”
Пример CRUD 1mongo_crud.txt
$ mongo test_db
> db.test_collection.insert({key1:'val1', key2:'val2'})
> db.test_collection.insert({key3:'val3'})
> db.test_collection.find({key3:'val3'})
> db.test_collection.find()
> db.test_collection.remove({key3:'val3'})
> db.test_collection.find()
> db.test_collection.update({ "key1" : "val1", "key2" :
"val2" }, {$set: {"key1" : "val2"}})
Формат GeoJSON
● Надмножество JSON для хранения точек,
ломаных и многоугольников (а также их
совокупностей (гладких кривых нет:)).
● Не накладывает ограничение на тип
координат (плоские, сферические,
параболические ...).
● Координаты точки задаются в виде массива
[x , y]
Или
[долгота, широта]
Наглядные примеры
● https://ru.wikipedia.org/wiki/GeoJSON#.D0.9E.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D1.8B
Наглядные примеры
● https://ru.wikipedia.org/wiki/GeoJSON#.D0.9E.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D1.8B
GeoJSON - инструменты
● Генерация GeoJSON по карте -
http://geojson.io/
● Валидатор - http://geojsonlint.com/
● Бьютификатор -
https://jsonformatter.curiousconcept.c
om/
● Описание стандарта –
http://geojson.org/
Как сохранить геоданные в БД
● Форматы:
– legacy coordinate pairs
(только точки) [x,y]
– GeoJson (точки, линии,
полигоны ...)
● Нет контроля типов у
полей координат
● Одно поле = один формат
представления
● Можно сохранять как в
отдельное поле, так и во
вложенное
Сохранение геоданных в БД –
пример 2location_writing.txt
$ mongo test_db
> db.test_collection1.insert({
name: '1',
location : {
"type" : "Point",
"coordinates" : [ 1.0, 1.0 ]
}
})
> db.test_collection2.insert({
name: '2',
location : [ 1.0, 1.0 ]
})
Пространственные индексы -
преамбула
● Индексы – ускорение запросов.
● Разные геометрии:
– Плоская (евклидово расстояние)
– Сферическая WGS84,
http://spatialreference.org/ref/epsg/4326/)
http://www.colorado.edu/geography/gcraft/notes/datum/gif/geoid2.gif
Пространственные индексы
● 2dsphere
– Сферическая геометрия, GeoJSON или legacy
coordinate pairs
– Можно делать связанный индекс с несколькими
полями
● 2d
– Плоская геометрия, legacy coordinate pairs
– Связанный индекс только с одним полем
● geoHaystack
– 2d + одно не геополе, быстрее на малых площадях
чем 2d
Пример - Создаем индекс
3indexes_creation.txt
> db.test_collection1.createIndex({
location: '2dsphere'})
> db.test_collection2.createIndex({
location: '2d'})
# Проверяем индексы
> db.system.indexes.find()
$geoWithin и $geoIntersects
● Что это:
– Критерии для поиска (могут быть частью сложного
запроса)
– Поиск либо объектов внутри (geoWithin), либо на
пересечении с областью (geoIntersects)
– Работает для всех геометрий и типов задания
координат
● Особенности
– Индекс не нужен
– Есть проблема с ооочень большими областями
фильтрации
$geoWithin и $geoIntersects
● Что приходит в ответ - список документов
без сортировки
● Как можно искать:
– Сферическая геометрия: $geometry,
$centerSphere
– Плоская геометрия: $box, $polygon, $center
Пример про $geoWithin
4geowithin.txt
db.test_collection1.find( { location :
{ $geoWithin :
{ $geometry :
{ type : "Polygon" ,
coordinates : [ [
[ 0 , 0 ] ,
[ 3 , 6 ] ,
[ 6 , 1 ] ,
[ 0 , 0 ] # Замыкаем фигуру
] ]
} } } } )
Пример про $geoWithin
4geowithin.txt
db.test_collection1.find( { location :
{ $geoWithin :
{ $centerSphere:
[ [1, 1], # Центр
2] # Радиус в радианах
}}})
Пример про $geoIntersects
4geointersects.txt
db.test_collection1.find( { location :
{ $geoIntersects :
{$geometry:
{"type": "LineString",
"coordinates": [ [0, 1], [1, 1] ]
}
}
}
})
$near и $nearSphere
● Что это: операторы поиска объектов, близких к
точке.
● Особенности
– Near – использует евклидово расстояние,
nearSphere – сферическое.
– Требует наличия любого геоиндекса.
– Нельзя комбинировать со сложными запросами,
требующими специальный индекс
– Можно задать пределы расстояний.
$near и $nearSphere
● Что приходит в ответ: отсортированные по
расстоянию документы
● Единицы измерения расстояний зависят от
того, как задана точка отсчета:
– GeoJSON – метры
– Legacy pair - радианы
Пример - поиск точек по
расстоянию 5nearsphere.txt
db.test_collection1.find( { location :
{ $nearSphere:
{ $geometry :
{ type : "Point",
coordinates : [ 0, 0 ]}, # Точка отсчета
$maxDistance : 190000} # В метрах
}
})
Операции аггрегирования
● примерный аналог группировки в SQL базах
данных
● выбираем данные по критерию и работаем с
ними:
– группируем дальше ( можно делать
многоступенчатую аггрегацию)
– меняем формат
– создаем новые поля на основании вычислений в
текущих (минимум, среднее, максимум и тд)
$geoNear
● Аналог near/nearSphere – но на этапе
аггрегации
● Требует наличия одного геоиндекса
● Не нужно указывать поле с координатами
● Может быть только первым этапом
аггрегирования
● Нельзя использовать одновременно с near*,
но можно geoWithin/Intersect
$geoNear пример – 6geonear.txt
db.test_collection1.aggregate([ {
$geoNear: {
near: { type: "Point", coordinates: [ 1 , 1.0000001 ] },
distanceField: "dist.calculated", # Название нового поля
для записи расстояния
maxDistance: 2, # Максимальное расстояние до точки
query: {name:"1"} , # ЗАпрос с дополнительной
фильтрацией
includeLocs: "dist.location", # Новое поле, где будут
дополнительно выведены координаты
spherical: true
}
} ])
GeoHaystack Index + geoSearch
● GeoHaystack ориентирован на:
– Запросы сначала по непространственному полю,
а затем по пространственному
– Данные из ограниченной области
● команда geoSearch - аналог geoNear для
коллекций с geoHaystack индексом
Пример использования GeoSearch
7geosearch.txt
> db.test_collection3.insert({ _id : 100, pos: { lng :
126.9, lat : 35.2 } , type : "restaurant"})
> db.test_collection3.insert({ _id : 200, pos: { lng :
127.5, lat : 36.1 } , type : "restaurant"})
> db.test_collection3.insert({ _id : 300, pos: { lng :
128.0, lat : 36.7 } , type : "national park"})
Пример использования GeoSearch
7geosearch.txt
db.test_collection3.createIndex( { pos :
"geoHaystack", type : 1 } ,{ bucketSize : 1 } )
db.runCommand( { geoSearch : "test_collection3" ,
search : { type: "restaurant" } ,
near : [-74, 40.74] ,
maxDistance : 1000 } )
Реальное использование в
Geo2Tag
● Geo2Tag – платформа для создания
геоконтекстных сервисов
● Геоданные – отдельные точки (широта,
долгота, высота) с привязанным
описанием/ссылкой
● REST интерфейс для поиска точек по
вхождению в пространственную область
● Индексирование через 2dSphere
● Запрос GeoWithin + запросы поиска по
высоте и параметрам описания
Что почитать
● Хороший туториал от создателей БД по
геовозможностям
https://docs.mongodb.org/manual/tutorial/geospat
ial-tutorial/
● Индексы, типы геометрий
https://docs.mongodb.org/manual/applications/g
eospatial-indexes/
● Введение в Mongo
http://jsman.ru/mongo-book/
● Формат GeoJSON http://geojson.org/

More Related Content

Viewers also liked

OLPC Mesh networking improvements
OLPC Mesh networking improvementsOLPC Mesh networking improvements
OLPC Mesh networking improvements
OSLL
 
SVG-player plugin for ns2 simulations
SVG-player plugin for ns2 simulationsSVG-player plugin for ns2 simulations
SVG-player plugin for ns2 simulations
OSLL
 
Fruct4 n8xx olpc-connectivity
Fruct4 n8xx olpc-connectivityFruct4 n8xx olpc-connectivity
Fruct4 n8xx olpc-connectivity
OSLL
 
Open Source implementation of ZigBee
Open Source implementation of ZigBeeOpen Source implementation of ZigBee
Open Source implementation of ZigBee
OSLL
 
Потоковая обработка событий клиентов и их отображение на интерактивной карте
Потоковая обработка событий клиентов и их отображение на интерактивной картеПотоковая обработка событий клиентов и их отображение на интерактивной карте
Потоковая обработка событий клиентов и их отображение на интерактивной карте
Voximplant
 
DUMP-2012 - Базы данных - "Идеальное хранилище геоданных для вашего приложени...
DUMP-2012 - Базы данных - "Идеальное хранилище геоданных для вашего приложени...DUMP-2012 - Базы данных - "Идеальное хранилище геоданных для вашего приложени...
DUMP-2012 - Базы данных - "Идеальное хранилище геоданных для вашего приложени...
it-people
 
Geo2tag LBS platform training at FRUCT12
Geo2tag LBS platform training at FRUCT12Geo2tag LBS platform training at FRUCT12
Geo2tag LBS platform training at FRUCT12
OSLL
 

Viewers also liked (20)

Implementation of the new REST API for Open Source LBS-platform Geo2Tag
Implementation of the new REST API for Open Source LBS-platform Geo2TagImplementation of the new REST API for Open Source LBS-platform Geo2Tag
Implementation of the new REST API for Open Source LBS-platform Geo2Tag
 
MOOCs Virtual Lab in Modern Education
MOOCs Virtual Lab in Modern EducationMOOCs Virtual Lab in Modern Education
MOOCs Virtual Lab in Modern Education
 
Обзор файловой системы GlusterFS
Обзор файловой системы GlusterFSОбзор файловой системы GlusterFS
Обзор файловой системы GlusterFS
 
OLPC Mesh networking improvements
OLPC Mesh networking improvementsOLPC Mesh networking improvements
OLPC Mesh networking improvements
 
Обзор Btrfs
Обзор BtrfsОбзор Btrfs
Обзор Btrfs
 
SVG-player plugin for ns2 simulations
SVG-player plugin for ns2 simulationsSVG-player plugin for ns2 simulations
SVG-player plugin for ns2 simulations
 
E.Kalishenko, K.Krinkin, S.P.Shiva Prakash. Process Mining Approach for Traff...
E.Kalishenko, K.Krinkin, S.P.Shiva Prakash. Process Mining Approach for Traff...E.Kalishenko, K.Krinkin, S.P.Shiva Prakash. Process Mining Approach for Traff...
E.Kalishenko, K.Krinkin, S.P.Shiva Prakash. Process Mining Approach for Traff...
 
Fruct4 n8xx olpc-connectivity
Fruct4 n8xx olpc-connectivityFruct4 n8xx olpc-connectivity
Fruct4 n8xx olpc-connectivity
 
Обзор архитектуры [файловой] системы Ceph
Обзор архитектуры [файловой] системы CephОбзор архитектуры [файловой] системы Ceph
Обзор архитектуры [файловой] системы Ceph
 
Testing with Selenium
Testing with SeleniumTesting with Selenium
Testing with Selenium
 
Open Source implementation of ZigBee
Open Source implementation of ZigBeeOpen Source implementation of ZigBee
Open Source implementation of ZigBee
 
Обзор Linux Control Groups
Обзор Linux Control GroupsОбзор Linux Control Groups
Обзор Linux Control Groups
 
Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)
 
Virtual-HSM: Virtualization of Hardware Security Modules in Linux Containers
Virtual-HSM: Virtualization of Hardware Security Modules in Linux ContainersVirtual-HSM: Virtualization of Hardware Security Modules in Linux Containers
Virtual-HSM: Virtualization of Hardware Security Modules in Linux Containers
 
Кратчайшее введение в docker по-русски
Кратчайшее введение в docker по-русскиКратчайшее введение в docker по-русски
Кратчайшее введение в docker по-русски
 
Потоковая обработка событий клиентов и их отображение на интерактивной карте
Потоковая обработка событий клиентов и их отображение на интерактивной картеПотоковая обработка событий клиентов и их отображение на интерактивной карте
Потоковая обработка событий клиентов и их отображение на интерактивной карте
 
DUMP-2012 - Базы данных - "Идеальное хранилище геоданных для вашего приложени...
DUMP-2012 - Базы данных - "Идеальное хранилище геоданных для вашего приложени...DUMP-2012 - Базы данных - "Идеальное хранилище геоданных для вашего приложени...
DUMP-2012 - Базы данных - "Идеальное хранилище геоданных для вашего приложени...
 
Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015
 
Fast Artificial Landmark Detection for indoor mobile robots AIMAVIG'2015
Fast Artificial Landmark Detection for indoor mobile robots AIMAVIG'2015Fast Artificial Landmark Detection for indoor mobile robots AIMAVIG'2015
Fast Artificial Landmark Detection for indoor mobile robots AIMAVIG'2015
 
Geo2tag LBS platform training at FRUCT12
Geo2tag LBS platform training at FRUCT12Geo2tag LBS platform training at FRUCT12
Geo2tag LBS platform training at FRUCT12
 

Similar to Работа с геоданными в MongoDb

MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
phpdevby
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 
Алексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Алексей Чернигин — Магия метапрограммирования на примере Boost.GeometryАлексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Алексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Yandex
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
Alexey Tokar
 
Big Data - первые шаги
Big Data - первые шагиBig Data - первые шаги
Big Data - первые шаги
Anton Gorokhov
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
Oleg Churkin
 
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Nikolay Samokhvalov
 
Олег Бартунов (ГАИШ МГУ), Александр Коротков (Интаро-Софт)
Олег Бартунов (ГАИШ МГУ), Александр Коротков (Интаро-Софт)Олег Бартунов (ГАИШ МГУ), Александр Коротков (Интаро-Софт)
Олег Бартунов (ГАИШ МГУ), Александр Коротков (Интаро-Софт)
Ontico
 
Использование связанных пространственных данных в геоинформационных системах
Использование связанных пространственных данных в геоинформационных системахИспользование связанных пространственных данных в геоинформационных системах
Использование связанных пространственных данных в геоинформационных системах
Stepan Kuzmin
 
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
it-people
 

Similar to Работа с геоданными в MongoDb (20)

Новое в Mongodb 2.4
Новое в Mongodb 2.4Новое в Mongodb 2.4
Новое в Mongodb 2.4
 
Основы MongoDB + NodeJS
Основы MongoDB + NodeJSОсновы MongoDB + NodeJS
Основы MongoDB + NodeJS
 
Как модуль geoQuery упрощает работу с API Яндекс.Карт.
Как модуль geoQuery упрощает работу с API Яндекс.Карт.Как модуль geoQuery упрощает работу с API Яндекс.Карт.
Как модуль geoQuery упрощает работу с API Яндекс.Карт.
 
Сергей Константинов — Простая обработка групп геообъектов на карте
Сергей Константинов — Простая обработка групп геообъектов на картеСергей Константинов — Простая обработка групп геообъектов на карте
Сергей Константинов — Простая обработка групп геообъектов на карте
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORM
 
Алексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Алексей Чернигин — Магия метапрограммирования на примере Boost.GeometryАлексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Алексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 
Big Data - первые шаги
Big Data - первые шагиBig Data - первые шаги
Big Data - первые шаги
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
 
Место Postgres/PostGIS в экосистеме открытого ПО
Место Postgres/PostGIS в экосистеме  открытого ПОМесто Postgres/PostGIS в экосистеме  открытого ПО
Место Postgres/PostGIS в экосистеме открытого ПО
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
 
Олег Бартунов (ГАИШ МГУ), Александр Коротков (Интаро-Софт)
Олег Бартунов (ГАИШ МГУ), Александр Коротков (Интаро-Софт)Олег Бартунов (ГАИШ МГУ), Александр Коротков (Интаро-Софт)
Олег Бартунов (ГАИШ МГУ), Александр Коротков (Интаро-Софт)
 
Использование связанных пространственных данных в геоинформационных системах
Использование связанных пространственных данных в геоинформационных системахИспользование связанных пространственных данных в геоинформационных системах
Использование связанных пространственных данных в геоинформационных системах
 
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
 
MongoDB. Как готовить, с чем едят?
MongoDB. Как готовить, с чем едят?MongoDB. Как готовить, с чем едят?
MongoDB. Как готовить, с чем едят?
 

More from OSLL

Fruct14 sholokhova
Fruct14 sholokhovaFruct14 sholokhova
Fruct14 sholokhova
OSLL
 
SECR'13 Lightweight linux shared libraries profiling
SECR'13 Lightweight linux shared libraries profilingSECR'13 Lightweight linux shared libraries profiling
SECR'13 Lightweight linux shared libraries profiling
OSLL
 
Smart-M3 and Geo2Tag integration
Smart-M3 and Geo2Tag integrationSmart-M3 and Geo2Tag integration
Smart-M3 and Geo2Tag integration
OSLL
 
HTML5 Intro and Tizen Web API
HTML5 Intro and Tizen Web APIHTML5 Intro and Tizen Web API
HTML5 Intro and Tizen Web API
OSLL
 
Json protocol, Geo2tag REST API fundamentals
Json protocol, Geo2tag REST API fundamentalsJson protocol, Geo2tag REST API fundamentals
Json protocol, Geo2tag REST API fundamentals
OSLL
 
Introduction to geo-tagging and geo2tag platform
Introduction to geo-tagging and geo2tag platformIntroduction to geo-tagging and geo2tag platform
Introduction to geo-tagging and geo2tag platform
OSLL
 
Detection pulse by video
Detection pulse by video Detection pulse by video
Detection pulse by video
OSLL
 
Using Intel NAS-PT for testing NAS disks
Using Intel NAS-PT for testing NAS disksUsing Intel NAS-PT for testing NAS disks
Using Intel NAS-PT for testing NAS disks
OSLL
 
Geo2Tag LBS Platform Architecture Overview
Geo2Tag LBS Platform Architecture OverviewGeo2Tag LBS Platform Architecture Overview
Geo2Tag LBS Platform Architecture Overview
OSLL
 

More from OSLL (16)

SLAM Constructor Framework for ROS
SLAM Constructor Framework for ROSSLAM Constructor Framework for ROS
SLAM Constructor Framework for ROS
 
Студентам и не только. Как выступить с докладом по своей научной работе
Студентам и не только. Как выступить с докладом по своей научной работеСтудентам и не только. Как выступить с докладом по своей научной работе
Студентам и не только. Как выступить с докладом по своей научной работе
 
Full Automated Continuous Integration and Testing Infrastructure for Maxscale...
Full Automated Continuous Integration and Testing Infrastructure for Maxscale...Full Automated Continuous Integration and Testing Infrastructure for Maxscale...
Full Automated Continuous Integration and Testing Infrastructure for Maxscale...
 
Block-level compression in Linux. Pro et contra
Block-level compression in Linux. Pro et contraBlock-level compression in Linux. Pro et contra
Block-level compression in Linux. Pro et contra
 
Raspberry Pi robot with ROS
Raspberry Pi robot with ROSRaspberry Pi robot with ROS
Raspberry Pi robot with ROS
 
Source code analyzer
Source code analyzer Source code analyzer
Source code analyzer
 
Fruct14 sholokhova
Fruct14 sholokhovaFruct14 sholokhova
Fruct14 sholokhova
 
SECR'13 Lightweight linux shared libraries profiling
SECR'13 Lightweight linux shared libraries profilingSECR'13 Lightweight linux shared libraries profiling
SECR'13 Lightweight linux shared libraries profiling
 
Smart-M3 and Geo2Tag integration
Smart-M3 and Geo2Tag integrationSmart-M3 and Geo2Tag integration
Smart-M3 and Geo2Tag integration
 
HTML5 Intro and Tizen Web API
HTML5 Intro and Tizen Web APIHTML5 Intro and Tizen Web API
HTML5 Intro and Tizen Web API
 
Fruct13 geo2tag-training
Fruct13 geo2tag-trainingFruct13 geo2tag-training
Fruct13 geo2tag-training
 
Json protocol, Geo2tag REST API fundamentals
Json protocol, Geo2tag REST API fundamentalsJson protocol, Geo2tag REST API fundamentals
Json protocol, Geo2tag REST API fundamentals
 
Introduction to geo-tagging and geo2tag platform
Introduction to geo-tagging and geo2tag platformIntroduction to geo-tagging and geo2tag platform
Introduction to geo-tagging and geo2tag platform
 
Detection pulse by video
Detection pulse by video Detection pulse by video
Detection pulse by video
 
Using Intel NAS-PT for testing NAS disks
Using Intel NAS-PT for testing NAS disksUsing Intel NAS-PT for testing NAS disks
Using Intel NAS-PT for testing NAS disks
 
Geo2Tag LBS Platform Architecture Overview
Geo2Tag LBS Platform Architecture OverviewGeo2Tag LBS Platform Architecture Overview
Geo2Tag LBS Platform Architecture Overview
 

Работа с геоданными в MongoDb

  • 1. Работа с геоданными в MongoDb Марк Заславский, mark.zaslavskiy@gmail.com
  • 2. О чем будет доклад ● Обзор: – Короткое знакомство с Mongo – Коротко про GeoJson – Какие данные можно хранить в Mongo – Как хранить геоданные в Mongo – Как индексировать геоданные – Как выполнять запросы к данным (поиск объектов рядом/внутри/на пересечении с областями) ● Примеры использования геовозможностей MongoDb в Geo2Tag
  • 3. Примеры к докладу ● Ссылка для скачивания: http://bit.ly/1OHMY0N ● В архиве текстовые файлы со списками комманд для каждого примера ● Решетки (#) это не комментарий в Mongo, их нужно удалить ● Примеры проверялись на MongoDb 2.4.9
  • 5. Введение и мотивация ● Геоданные: – часто (но не всегда) = bigdata, – имеют сложные алгоритмы анализа/обработки, – могут иметь сложную структуру (границы областей, маршруты). ● Mongo – из коробки умеет работать с геоданными, – хорошо масштабируется, – представление геоданных стандартизовано (GeoJSON).
  • 6. Короткое введние в Mongo ● MongoDb – документо- ориентированная СУБД ● Данные хранятся в BSON (почти JSON) ● Документы объединяются в коллекции ● У коллекций нет обязательной схемы ● MapReduce ● Полнотекстовый поиск
  • 7. Коллекции и документы ● Примерное соответствие с SQL СУБД: – Коллекция = таблица – Документ = запись в таблице – Идентификатор _id (обязательное поле документа) = первичный ключ ● Коллекции и базы данных создаются “ленивым образом”
  • 8. Пример CRUD 1mongo_crud.txt $ mongo test_db > db.test_collection.insert({key1:'val1', key2:'val2'}) > db.test_collection.insert({key3:'val3'}) > db.test_collection.find({key3:'val3'}) > db.test_collection.find() > db.test_collection.remove({key3:'val3'}) > db.test_collection.find() > db.test_collection.update({ "key1" : "val1", "key2" : "val2" }, {$set: {"key1" : "val2"}})
  • 9. Формат GeoJSON ● Надмножество JSON для хранения точек, ломаных и многоугольников (а также их совокупностей (гладких кривых нет:)). ● Не накладывает ограничение на тип координат (плоские, сферические, параболические ...). ● Координаты точки задаются в виде массива [x , y] Или [долгота, широта]
  • 12. GeoJSON - инструменты ● Генерация GeoJSON по карте - http://geojson.io/ ● Валидатор - http://geojsonlint.com/ ● Бьютификатор - https://jsonformatter.curiousconcept.c om/ ● Описание стандарта – http://geojson.org/
  • 13. Как сохранить геоданные в БД ● Форматы: – legacy coordinate pairs (только точки) [x,y] – GeoJson (точки, линии, полигоны ...) ● Нет контроля типов у полей координат ● Одно поле = один формат представления ● Можно сохранять как в отдельное поле, так и во вложенное
  • 14. Сохранение геоданных в БД – пример 2location_writing.txt $ mongo test_db > db.test_collection1.insert({ name: '1', location : { "type" : "Point", "coordinates" : [ 1.0, 1.0 ] } }) > db.test_collection2.insert({ name: '2', location : [ 1.0, 1.0 ] })
  • 15. Пространственные индексы - преамбула ● Индексы – ускорение запросов. ● Разные геометрии: – Плоская (евклидово расстояние) – Сферическая WGS84, http://spatialreference.org/ref/epsg/4326/) http://www.colorado.edu/geography/gcraft/notes/datum/gif/geoid2.gif
  • 16. Пространственные индексы ● 2dsphere – Сферическая геометрия, GeoJSON или legacy coordinate pairs – Можно делать связанный индекс с несколькими полями ● 2d – Плоская геометрия, legacy coordinate pairs – Связанный индекс только с одним полем ● geoHaystack – 2d + одно не геополе, быстрее на малых площадях чем 2d
  • 17. Пример - Создаем индекс 3indexes_creation.txt > db.test_collection1.createIndex({ location: '2dsphere'}) > db.test_collection2.createIndex({ location: '2d'}) # Проверяем индексы > db.system.indexes.find()
  • 18. $geoWithin и $geoIntersects ● Что это: – Критерии для поиска (могут быть частью сложного запроса) – Поиск либо объектов внутри (geoWithin), либо на пересечении с областью (geoIntersects) – Работает для всех геометрий и типов задания координат ● Особенности – Индекс не нужен – Есть проблема с ооочень большими областями фильтрации
  • 19. $geoWithin и $geoIntersects ● Что приходит в ответ - список документов без сортировки ● Как можно искать: – Сферическая геометрия: $geometry, $centerSphere – Плоская геометрия: $box, $polygon, $center
  • 20. Пример про $geoWithin 4geowithin.txt db.test_collection1.find( { location : { $geoWithin : { $geometry : { type : "Polygon" , coordinates : [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] # Замыкаем фигуру ] ] } } } } )
  • 21. Пример про $geoWithin 4geowithin.txt db.test_collection1.find( { location : { $geoWithin : { $centerSphere: [ [1, 1], # Центр 2] # Радиус в радианах }}})
  • 22. Пример про $geoIntersects 4geointersects.txt db.test_collection1.find( { location : { $geoIntersects : {$geometry: {"type": "LineString", "coordinates": [ [0, 1], [1, 1] ] } } } })
  • 23. $near и $nearSphere ● Что это: операторы поиска объектов, близких к точке. ● Особенности – Near – использует евклидово расстояние, nearSphere – сферическое. – Требует наличия любого геоиндекса. – Нельзя комбинировать со сложными запросами, требующими специальный индекс – Можно задать пределы расстояний.
  • 24. $near и $nearSphere ● Что приходит в ответ: отсортированные по расстоянию документы ● Единицы измерения расстояний зависят от того, как задана точка отсчета: – GeoJSON – метры – Legacy pair - радианы
  • 25. Пример - поиск точек по расстоянию 5nearsphere.txt db.test_collection1.find( { location : { $nearSphere: { $geometry : { type : "Point", coordinates : [ 0, 0 ]}, # Точка отсчета $maxDistance : 190000} # В метрах } })
  • 26. Операции аггрегирования ● примерный аналог группировки в SQL базах данных ● выбираем данные по критерию и работаем с ними: – группируем дальше ( можно делать многоступенчатую аггрегацию) – меняем формат – создаем новые поля на основании вычислений в текущих (минимум, среднее, максимум и тд)
  • 27. $geoNear ● Аналог near/nearSphere – но на этапе аггрегации ● Требует наличия одного геоиндекса ● Не нужно указывать поле с координатами ● Может быть только первым этапом аггрегирования ● Нельзя использовать одновременно с near*, но можно geoWithin/Intersect
  • 28. $geoNear пример – 6geonear.txt db.test_collection1.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ 1 , 1.0000001 ] }, distanceField: "dist.calculated", # Название нового поля для записи расстояния maxDistance: 2, # Максимальное расстояние до точки query: {name:"1"} , # ЗАпрос с дополнительной фильтрацией includeLocs: "dist.location", # Новое поле, где будут дополнительно выведены координаты spherical: true } } ])
  • 29. GeoHaystack Index + geoSearch ● GeoHaystack ориентирован на: – Запросы сначала по непространственному полю, а затем по пространственному – Данные из ограниченной области ● команда geoSearch - аналог geoNear для коллекций с geoHaystack индексом
  • 30. Пример использования GeoSearch 7geosearch.txt > db.test_collection3.insert({ _id : 100, pos: { lng : 126.9, lat : 35.2 } , type : "restaurant"}) > db.test_collection3.insert({ _id : 200, pos: { lng : 127.5, lat : 36.1 } , type : "restaurant"}) > db.test_collection3.insert({ _id : 300, pos: { lng : 128.0, lat : 36.7 } , type : "national park"})
  • 31. Пример использования GeoSearch 7geosearch.txt db.test_collection3.createIndex( { pos : "geoHaystack", type : 1 } ,{ bucketSize : 1 } ) db.runCommand( { geoSearch : "test_collection3" , search : { type: "restaurant" } , near : [-74, 40.74] , maxDistance : 1000 } )
  • 32. Реальное использование в Geo2Tag ● Geo2Tag – платформа для создания геоконтекстных сервисов ● Геоданные – отдельные точки (широта, долгота, высота) с привязанным описанием/ссылкой ● REST интерфейс для поиска точек по вхождению в пространственную область ● Индексирование через 2dSphere ● Запрос GeoWithin + запросы поиска по высоте и параметрам описания
  • 33. Что почитать ● Хороший туториал от создателей БД по геовозможностям https://docs.mongodb.org/manual/tutorial/geospat ial-tutorial/ ● Индексы, типы геометрий https://docs.mongodb.org/manual/applications/g eospatial-indexes/ ● Введение в Mongo http://jsman.ru/mongo-book/ ● Формат GeoJSON http://geojson.org/