SlideShare a Scribd company logo
Сергей Константинов
Руководитель группы разработки API Карт
Я.Субботник, Екатеринбург, 06.07.2013
Простая обработка
групп геообъектов
на карте
2
API Яндекс.Карт – это
инструмент для размещения
карт на сайтах
3
4
5
6
7
8
Типичные операции
Многие сайты реализуют одни и те же
действия:
•  Показать/скрыть группу объектов
•  Выбрать все объекты с определённым
свойством
•  Отсортировать объекты по критерию
•  Найти ближайшие объекты
•  Найти все объекты, попадающие в область
(прямоугольник, круг, границы региона и т.д.)
9
Типичные операции
Однако операции
с географическими
сущностями – непростая штука.
•  Как посчитать
расстояния на сфере?
•  Как посчитать попадание
точки в сферический
треугольник?
А в многоугольник?
10
Типичные операции
В итоге мы получаем:
•  кучу одинакового кода,
•  который всё равно работает неправильно.
11
Что делать?
12
Что делать?
13
Исследования
Мы перебрали самые популярные вопросы,
касающиеся работы с географическими
объектами:
•  Наш собственный клуб
http://clubs.ya.ru/mapsapi
•  Stack Overflow
•  Форумы MSDN
•  Experts Exchange
14
Исследования
А также руками просмотрели несколько сотен
крупных и средних сайтов с нашим API
15
Use-Cases
В итоге мы получили набор из 2 групп кейсов
•  Геометрические операции
•  Манипуляции над данными
16
Геометрические операции
•  Вычисление границ и масштабов
•  Пересечения геометрий
•  Выборки: по типу геометрии, по
ограничивающей области
•  Сортировка по удалённости
•  Центры и крайние точки геометрий
•  Поиск ближайших к данной геометрии
объектов
17
Манипуляции над данными
•  Поиск по полям данных
•  Фильтрация
•  Сортировка
•  Перебор
•  Кластеризация
•  Подписка на события
•  Смена опций
ymaps.geoQuery
Выборки
Сортировки
Манипуляции
Геометрические операции
19
Инициализация
Конструируем выборку из:
•  геообъектов карты
•  JSON
•  произвольной геометрии
•  результата геокодирования или xml-
файла (YMapsML, KML, GPX)
ymaps.geoQuery(что-то);
20
Выборка
Результат – объект типа ymaps.GeoQueryResult
•  Набор геообъектов
•  Можно итерироваться (.each), выбирать
объекты (.get), добавлять и удалять объекты
(.add, .remove)
•  Можно добавлять объекты на карту и удалять
их с карты
•  Можно делать всякие крутые штуки!
var geoQueryResult =
ymaps.geoQuery(что-то);
21
Выборка
И ещё несколько интересных особенностей:
•  Набор объектов неизменяем
•  Операции асинхронны
•  Операции чайнятся
var geoQueryResult =
ymaps.geoQuery(что-то);
22
Immutable
•  Ни одна операция не изменяет состав
исходного geoQueryResult
•  Каждая операция, изменяющая набор
результатов, возвращает новый экземпляр
ymaps.GeoQueryResult
var geoQueryResult1 = ymaps.geoQuery(что-то),
geoQueryResult2 =
geoQueryResult1.filter(что-то),
geoQueryResult3 =
geoQueryResult2.remove(что-то);
// в итоге geoQueryResult1 не изменился
23
Async
•  Некоторые операции асинхронны всегда
(геокодирование, загрузка xml)
•  Некоторые операции синхронны, но не стоит
на это полагаться
•  Для выполнения кода после завершения всех
действий используйте .then
var geoQueryResult =
ymaps.geoQuery(ymaps.geoXml.load(<url>))
// Фильтр сработает после загрузки
.filter(<expression>)
// Сработает после выполнения
// всех предыдущих операций
.then(function (res) { soSomething() });
24
Promises
•  Promises – замена обычным callback-ам. Они
удобнее и функциональнее
•  Мы имплементируем стандарт Promises/A в
нашем ymaps.util.Promise
•  ymaps.GeoQueryResult.then вернёт promise,
который будет подтвержден после
выполнения всех операций
ymaps.geoXml.load(<url>)
.then(
// обработчик положительного ответа
function (res) { doSomething(); },
// обработчик отрицательного ответа
function (err) { doSomething(); }
);
25
Chaining
•  Все операции, которые имеет смысл чайнить
– чайнятся
•  Чайнинг работает даже для асинхронных
операций
var geoQueryResult1 =
ymaps.geoQuery(map)
.filter(…)
.setOptions(…)
.addToMap(…)
// Продолжать до полного удовлетворения
26
Лучше один раз увидеть
var result = ymaps.geoQuery({
type: 'FeatureCollection',
features: [{
type: 'Feature',
geometry: {
type: 'Circle',
coordinates: [15, 15],
radius: 100
}
}, {
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: [[15, 16], [66, 23], [10, 12]]
}
}]
}).addToMap(map);
27
Лучше второй раз увидеть
// Найдём Москву и Екатеринбург
// Приятный бонус – теперь можно чайнить
// асинхронные операции
var result = ymaps.geoQuery(
ymaps.geocode(‘Москва’, { results: 1 })
).add(
ymaps.geocode(‘Екатеринбург’, { results: 1 })
).then(function () {
var moscow = result.get(0),
ekat = result.get(1);
// сделаем что-нибудь с полученным знанием
});
Вкусняшки
29
Что умеет geoQuery?
•  Выбирать объекты,
попадающие
в указанную
область на карте
// Например, загрузим список точек
// и подсветим те, которые попадают в круг
var circle = new ymaps.Circle([ center, 2000 ]);
myMap.geoObjects.add(circle);
ymaps.geoQuery(ymaps.geocode([56.8, 60.6], { kind: 'metro' }))
.addToMap(myMap)
.searchInside(circle)
.setOptions({ preset: 'twirl#redDotIcon' });
30
Что умеет geoQuery?
•  Выбирать объекты,
пересекающиеся
с другими объектами
// Например, загрузим траектории летящих самолётов
// и подсветим те, которые пересекают территорию России
ymaps.geoQuery(ymaps.geoXml.load(
"http://openflights.org/demo/openflights-sample.kml"
))
.addToMap(myMap)
.searchIntersect(RUGeometry)
.setOptions({ strokeColor: "FF0000" });
31
Intermezzo: ymaps.regions
•  В версии 2.0.31 мы добавили сервис
"регионы", позволяющий работать с
границами регионов России, Украины,
Беларуси и Казахстана
•  Данные берутся из OSM
ymaps.geoQuery(ymaps.regions.load(
// Код страны
"RU", {
// Язык подписей
lang: "ru",
// Уровень подробности границ
quality: 2
}))
.addToMap(map)
.then(function () { doSomething(); });
32
Intermezzo: ymaps.regions
Выглядит как-то так:
33
Что умеет geoQuery?
•  Выбирать объекты,
в которые попадает
целиком другой объект
// Проверим, попадает ли интересующая нас область
// (например, круг) в какой-то из регионов целиком
var circle = new ymaps.Circle([[55.6, 36.7], 1e4], null, {
fillColor: "FF0000", zIndex: 10000
});
myMap.geoObjects.add(circle);
ymaps.geoQuery(ymaps.regions.load("RU"))
.addToMap(myMap)
.searchContaining(circle)
.setOptions({ fillColor: "00FF0080" });
34
Что умеет geoQuery?
•  Сортировать объекты по
удалённости от другого
объекта
// Отсортируем регионы России по удалённости от Екатеринбурга
ymaps.geoQuery(ymaps.regions.load("RU"))
.addToMap(myMap)
.sortByDistance([60.6, 56.8])
.each(function (region, index) {
region.options.set("opacity", index/100);
});
35
Что умеет geoQuery?
•  Фильтровать объекты
по критерию
// Покажем на карте регионы, в названии которых
// есть слово «область»
ymaps.geoQuery(ymaps.regions.load("RU"))
// Можно фильтровать по: координатам, свойствам, опциям
// И даже писать регулярки
.search("properties.name RLIKE '(о|О)бласть'")
.addToMap(myMap);
36
Что умеет geoQuery?
•  Находить «центр»
объекта и его крайние
точки
// Например, подсветим самый западный регион России
var regions = ymaps.geoQuery(ymaps.regions.load("RU"))
.addToMap(myMap).then(function () {
westRegion = regions.getExtremeObject("left");
westRegion.options.set({ fillColor: "FF0000" });
});
37
Что умеет geoQuery?
•  Кластеризовать
// Например, загрузим траектории летящих самолётов,
// возьмём все точки отправлений и прибытий и кластеризуем
var clusters = ymaps.geoQuery(ymaps.geoXml.load(
"http://openflights.org/demo/openflights-sample.kml"
))
.search("geometry.type == 'Point'")
.clusterize();
map.geoObjects.add(clusters);
38
Что умеет geoQuery?
•  Находить оптимальный
центр
и масштаб карты
// Например, найдём Москву и Екатеринбург и покажем их
// на карте
ymaps.geoQuery(
ymaps.geocode("Москва", { results: 1 }))
.add(ymaps.geocode("Екатеринбург", { results: 1 }))
.addToMap(map)
.applyBoundsToMap(map)
39
Что умеет geoQuery?
•  Подписываться
на события и
отписываться от них
// Поставим метки «Москва» и «Екатеринбург»
// и будем по клику выводить alert-ом полное описание
ymaps.geoQuery(ymaps.geocode("Москва", { results: 1 }))
.add(ymaps.geocode("Екатеринбург", { results: 1 }))
.addToMap(map)
.addEvents("click", function (e) {
alert(e.get("target").properties.get("text"));
});
40
На правах рекламы: песочница
Заходите: http://api.yandex.ru/maps/jsbox/
Там ещё много клёвых штук!
Будут вопросы — пишите!
api.yandex.ru/maps
clubs.ya.ru/mapsapi
facebook.com/ymapsapi
Сергей Константинов
Руководитель группы
разработки
API Яндекс.Карт
twirl@yandex-team.ru
api.yandex.ru/maps
clubs.ya.ru/mapsapi
facebook.com/ymapsapi
Спасибо!

More Related Content

What's hot

Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)it-park
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в ОблакеGeeksLab Odessa
 
JavaFX Script Language
JavaFX Script LanguageJavaFX Script Language
JavaFX Script Language
SSA KPI
 
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
 «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
Mail.ru Group
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Ontico
 
Scala on android
Scala on androidScala on android
Scala on android
Valeriya Atamanova
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
JSib
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
solit
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
Омские ИТ-субботники
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
CEE-SEC(R)
 

What's hot (11)

Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в Облаке
 
JavaFX Script Language
JavaFX Script LanguageJavaFX Script Language
JavaFX Script Language
 
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
 «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
 
Scala on android
Scala on androidScala on android
Scala on android
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
 

Similar to Как модуль geoQuery упрощает работу с API Яндекс.Карт.

Александр Тармолов "API Яндекс.Карт"
Александр Тармолов "API Яндекс.Карт"Александр Тармолов "API Яндекс.Карт"
Александр Тармолов "API Яндекс.Карт"
Yandex
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх Webdriver
SQALab
 
Фёдор Голубев "API Яндекс.Карт"
Фёдор Голубев "API Яндекс.Карт"Фёдор Голубев "API Яндекс.Карт"
Фёдор Голубев "API Яндекс.Карт"
Yandex
 
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
MoscowJS
 
Сергей Константинов "Координаты, слои и тайлы в API 2.0"
Сергей Константинов "Координаты, слои и тайлы в API 2.0"Сергей Константинов "Координаты, слои и тайлы в API 2.0"
Сергей Константинов "Координаты, слои и тайлы в API 2.0"
Yandex
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
Alex Filatov
 
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
Andrey Gershun
 
Работа с геоданными в MongoDb
Работа с геоданными в MongoDbРабота с геоданными в MongoDb
Работа с геоданными в MongoDb
OSLL
 
Android - 14 - Geodata
Android - 14 - GeodataAndroid - 14 - Geodata
Android - 14 - Geodata
Noveo
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Yandex
 
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Ontico
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java scriptNoveo
 
О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"
Yandex
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутри
Kirill Averyanov
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
CocoaHeads
 
Big Data - первые шаги
Big Data - первые шагиBig Data - первые шаги
Big Data - первые шагиAnton Gorokhov
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
DevDay
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
DevDay
 

Similar to Как модуль geoQuery упрощает работу с API Яндекс.Карт. (20)

Александр Тармолов "API Яндекс.Карт"
Александр Тармолов "API Яндекс.Карт"Александр Тармолов "API Яндекс.Карт"
Александр Тармолов "API Яндекс.Карт"
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх Webdriver
 
Фёдор Голубев "API Яндекс.Карт"
Фёдор Голубев "API Яндекс.Карт"Фёдор Голубев "API Яндекс.Карт"
Фёдор Голубев "API Яндекс.Карт"
 
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
 
Сергей Константинов "Координаты, слои и тайлы в API 2.0"
Сергей Константинов "Координаты, слои и тайлы в API 2.0"Сергей Константинов "Координаты, слои и тайлы в API 2.0"
Сергей Константинов "Координаты, слои и тайлы в API 2.0"
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
 
Работа с геоданными в MongoDb
Работа с геоданными в MongoDbРабота с геоданными в MongoDb
Работа с геоданными в MongoDb
 
Android - 14 - Geodata
Android - 14 - GeodataAndroid - 14 - Geodata
Android - 14 - Geodata
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
 
О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутри
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
 
Big Data - первые шаги
Big Data - первые шагиBig Data - первые шаги
Big Data - первые шаги
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 

More from Optima-PROMO

Презентация "От сердца к сердцу".
Презентация "От сердца к сердцу".Презентация "От сердца к сердцу".
Презентация "От сердца к сердцу".
Optima-PROMO
 
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...Optima-PROMO
 
Ассесорное руководство: Факторы оценки качества поиска от Google
Ассесорное руководство: Факторы оценки качества поиска от GoogleАссесорное руководство: Факторы оценки качества поиска от Google
Ассесорное руководство: Факторы оценки качества поиска от Google
Optima-PROMO
 
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Optima-PROMO
 
Что из себя представляет новая технология формирования выдачи в Поиске для са...
Что из себя представляет новая технология формирования выдачи в Поиске для са...Что из себя представляет новая технология формирования выдачи в Поиске для са...
Что из себя представляет новая технология формирования выдачи в Поиске для са...
Optima-PROMO
 
Про Python и вычисления.
Про Python и вычисления.Про Python и вычисления.
Про Python и вычисления.
Optima-PROMO
 
Как использовать информацию из твиттера для улучшения поиска.
Как использовать информацию из твиттера для улучшения поиска.Как использовать информацию из твиттера для улучшения поиска.
Как использовать информацию из твиттера для улучшения поиска.Optima-PROMO
 
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...Optima-PROMO
 
Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Optima-PROMO
 
Как максимально повысить продажи с сайта в 2013 году?
Как максимально повысить продажи с сайта в 2013 году?Как максимально повысить продажи с сайта в 2013 году?
Как максимально повысить продажи с сайта в 2013 году?Optima-PROMO
 
Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Голованов Дмитрий - тренды поискового продвижения сайтов 2012Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Optima-PROMO
 
Асессоры Яндекса
Асессоры ЯндексаАсессоры Яндекса
Асессоры ЯндексаOptima-PROMO
 
Презентация про тренды в SEO в продвижении сайтов
Презентация про тренды в SEO в продвижении сайтовПрезентация про тренды в SEO в продвижении сайтов
Презентация про тренды в SEO в продвижении сайтовOptima-PROMO
 
презентация про тренды в Seo
презентация про тренды в Seoпрезентация про тренды в Seo
презентация про тренды в SeoOptima-PROMO
 
Презентация компании "Optima-Promo"
Презентация компании "Optima-Promo"Презентация компании "Optima-Promo"
Презентация компании "Optima-Promo"Optima-PROMO
 
12 мая index.art голованов д.о 1.3
12 мая index.art голованов д.о 1.312 мая index.art голованов д.о 1.3
12 мая index.art голованов д.о 1.3Optima-PROMO
 

More from Optima-PROMO (16)

Презентация "От сердца к сердцу".
Презентация "От сердца к сердцу".Презентация "От сердца к сердцу".
Презентация "От сердца к сердцу".
 
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
 
Ассесорное руководство: Факторы оценки качества поиска от Google
Ассесорное руководство: Факторы оценки качества поиска от GoogleАссесорное руководство: Факторы оценки качества поиска от Google
Ассесорное руководство: Факторы оценки качества поиска от Google
 
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
 
Что из себя представляет новая технология формирования выдачи в Поиске для са...
Что из себя представляет новая технология формирования выдачи в Поиске для са...Что из себя представляет новая технология формирования выдачи в Поиске для са...
Что из себя представляет новая технология формирования выдачи в Поиске для са...
 
Про Python и вычисления.
Про Python и вычисления.Про Python и вычисления.
Про Python и вычисления.
 
Как использовать информацию из твиттера для улучшения поиска.
Как использовать информацию из твиттера для улучшения поиска.Как использовать информацию из твиттера для улучшения поиска.
Как использовать информацию из твиттера для улучшения поиска.
 
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
 
Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)
 
Как максимально повысить продажи с сайта в 2013 году?
Как максимально повысить продажи с сайта в 2013 году?Как максимально повысить продажи с сайта в 2013 году?
Как максимально повысить продажи с сайта в 2013 году?
 
Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Голованов Дмитрий - тренды поискового продвижения сайтов 2012Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Голованов Дмитрий - тренды поискового продвижения сайтов 2012
 
Асессоры Яндекса
Асессоры ЯндексаАсессоры Яндекса
Асессоры Яндекса
 
Презентация про тренды в SEO в продвижении сайтов
Презентация про тренды в SEO в продвижении сайтовПрезентация про тренды в SEO в продвижении сайтов
Презентация про тренды в SEO в продвижении сайтов
 
презентация про тренды в Seo
презентация про тренды в Seoпрезентация про тренды в Seo
презентация про тренды в Seo
 
Презентация компании "Optima-Promo"
Презентация компании "Optima-Promo"Презентация компании "Optima-Promo"
Презентация компании "Optima-Promo"
 
12 мая index.art голованов д.о 1.3
12 мая index.art голованов д.о 1.312 мая index.art голованов д.о 1.3
12 мая index.art голованов д.о 1.3
 

Как модуль geoQuery упрощает работу с API Яндекс.Карт.

  • 1. Сергей Константинов Руководитель группы разработки API Карт Я.Субботник, Екатеринбург, 06.07.2013 Простая обработка групп геообъектов на карте
  • 2. 2 API Яндекс.Карт – это инструмент для размещения карт на сайтах
  • 3. 3
  • 4. 4
  • 5. 5
  • 6. 6
  • 7. 7
  • 8. 8 Типичные операции Многие сайты реализуют одни и те же действия: •  Показать/скрыть группу объектов •  Выбрать все объекты с определённым свойством •  Отсортировать объекты по критерию •  Найти ближайшие объекты •  Найти все объекты, попадающие в область (прямоугольник, круг, границы региона и т.д.)
  • 9. 9 Типичные операции Однако операции с географическими сущностями – непростая штука. •  Как посчитать расстояния на сфере? •  Как посчитать попадание точки в сферический треугольник? А в многоугольник?
  • 10. 10 Типичные операции В итоге мы получаем: •  кучу одинакового кода, •  который всё равно работает неправильно.
  • 13. 13 Исследования Мы перебрали самые популярные вопросы, касающиеся работы с географическими объектами: •  Наш собственный клуб http://clubs.ya.ru/mapsapi •  Stack Overflow •  Форумы MSDN •  Experts Exchange
  • 14. 14 Исследования А также руками просмотрели несколько сотен крупных и средних сайтов с нашим API
  • 15. 15 Use-Cases В итоге мы получили набор из 2 групп кейсов •  Геометрические операции •  Манипуляции над данными
  • 16. 16 Геометрические операции •  Вычисление границ и масштабов •  Пересечения геометрий •  Выборки: по типу геометрии, по ограничивающей области •  Сортировка по удалённости •  Центры и крайние точки геометрий •  Поиск ближайших к данной геометрии объектов
  • 17. 17 Манипуляции над данными •  Поиск по полям данных •  Фильтрация •  Сортировка •  Перебор •  Кластеризация •  Подписка на события •  Смена опций
  • 19. 19 Инициализация Конструируем выборку из: •  геообъектов карты •  JSON •  произвольной геометрии •  результата геокодирования или xml- файла (YMapsML, KML, GPX) ymaps.geoQuery(что-то);
  • 20. 20 Выборка Результат – объект типа ymaps.GeoQueryResult •  Набор геообъектов •  Можно итерироваться (.each), выбирать объекты (.get), добавлять и удалять объекты (.add, .remove) •  Можно добавлять объекты на карту и удалять их с карты •  Можно делать всякие крутые штуки! var geoQueryResult = ymaps.geoQuery(что-то);
  • 21. 21 Выборка И ещё несколько интересных особенностей: •  Набор объектов неизменяем •  Операции асинхронны •  Операции чайнятся var geoQueryResult = ymaps.geoQuery(что-то);
  • 22. 22 Immutable •  Ни одна операция не изменяет состав исходного geoQueryResult •  Каждая операция, изменяющая набор результатов, возвращает новый экземпляр ymaps.GeoQueryResult var geoQueryResult1 = ymaps.geoQuery(что-то), geoQueryResult2 = geoQueryResult1.filter(что-то), geoQueryResult3 = geoQueryResult2.remove(что-то); // в итоге geoQueryResult1 не изменился
  • 23. 23 Async •  Некоторые операции асинхронны всегда (геокодирование, загрузка xml) •  Некоторые операции синхронны, но не стоит на это полагаться •  Для выполнения кода после завершения всех действий используйте .then var geoQueryResult = ymaps.geoQuery(ymaps.geoXml.load(<url>)) // Фильтр сработает после загрузки .filter(<expression>) // Сработает после выполнения // всех предыдущих операций .then(function (res) { soSomething() });
  • 24. 24 Promises •  Promises – замена обычным callback-ам. Они удобнее и функциональнее •  Мы имплементируем стандарт Promises/A в нашем ymaps.util.Promise •  ymaps.GeoQueryResult.then вернёт promise, который будет подтвержден после выполнения всех операций ymaps.geoXml.load(<url>) .then( // обработчик положительного ответа function (res) { doSomething(); }, // обработчик отрицательного ответа function (err) { doSomething(); } );
  • 25. 25 Chaining •  Все операции, которые имеет смысл чайнить – чайнятся •  Чайнинг работает даже для асинхронных операций var geoQueryResult1 = ymaps.geoQuery(map) .filter(…) .setOptions(…) .addToMap(…) // Продолжать до полного удовлетворения
  • 26. 26 Лучше один раз увидеть var result = ymaps.geoQuery({ type: 'FeatureCollection', features: [{ type: 'Feature', geometry: { type: 'Circle', coordinates: [15, 15], radius: 100 } }, { type: 'Feature', geometry: { type: 'LineString', coordinates: [[15, 16], [66, 23], [10, 12]] } }] }).addToMap(map);
  • 27. 27 Лучше второй раз увидеть // Найдём Москву и Екатеринбург // Приятный бонус – теперь можно чайнить // асинхронные операции var result = ymaps.geoQuery( ymaps.geocode(‘Москва’, { results: 1 }) ).add( ymaps.geocode(‘Екатеринбург’, { results: 1 }) ).then(function () { var moscow = result.get(0), ekat = result.get(1); // сделаем что-нибудь с полученным знанием });
  • 29. 29 Что умеет geoQuery? •  Выбирать объекты, попадающие в указанную область на карте // Например, загрузим список точек // и подсветим те, которые попадают в круг var circle = new ymaps.Circle([ center, 2000 ]); myMap.geoObjects.add(circle); ymaps.geoQuery(ymaps.geocode([56.8, 60.6], { kind: 'metro' })) .addToMap(myMap) .searchInside(circle) .setOptions({ preset: 'twirl#redDotIcon' });
  • 30. 30 Что умеет geoQuery? •  Выбирать объекты, пересекающиеся с другими объектами // Например, загрузим траектории летящих самолётов // и подсветим те, которые пересекают территорию России ymaps.geoQuery(ymaps.geoXml.load( "http://openflights.org/demo/openflights-sample.kml" )) .addToMap(myMap) .searchIntersect(RUGeometry) .setOptions({ strokeColor: "FF0000" });
  • 31. 31 Intermezzo: ymaps.regions •  В версии 2.0.31 мы добавили сервис "регионы", позволяющий работать с границами регионов России, Украины, Беларуси и Казахстана •  Данные берутся из OSM ymaps.geoQuery(ymaps.regions.load( // Код страны "RU", { // Язык подписей lang: "ru", // Уровень подробности границ quality: 2 })) .addToMap(map) .then(function () { doSomething(); });
  • 33. 33 Что умеет geoQuery? •  Выбирать объекты, в которые попадает целиком другой объект // Проверим, попадает ли интересующая нас область // (например, круг) в какой-то из регионов целиком var circle = new ymaps.Circle([[55.6, 36.7], 1e4], null, { fillColor: "FF0000", zIndex: 10000 }); myMap.geoObjects.add(circle); ymaps.geoQuery(ymaps.regions.load("RU")) .addToMap(myMap) .searchContaining(circle) .setOptions({ fillColor: "00FF0080" });
  • 34. 34 Что умеет geoQuery? •  Сортировать объекты по удалённости от другого объекта // Отсортируем регионы России по удалённости от Екатеринбурга ymaps.geoQuery(ymaps.regions.load("RU")) .addToMap(myMap) .sortByDistance([60.6, 56.8]) .each(function (region, index) { region.options.set("opacity", index/100); });
  • 35. 35 Что умеет geoQuery? •  Фильтровать объекты по критерию // Покажем на карте регионы, в названии которых // есть слово «область» ymaps.geoQuery(ymaps.regions.load("RU")) // Можно фильтровать по: координатам, свойствам, опциям // И даже писать регулярки .search("properties.name RLIKE '(о|О)бласть'") .addToMap(myMap);
  • 36. 36 Что умеет geoQuery? •  Находить «центр» объекта и его крайние точки // Например, подсветим самый западный регион России var regions = ymaps.geoQuery(ymaps.regions.load("RU")) .addToMap(myMap).then(function () { westRegion = regions.getExtremeObject("left"); westRegion.options.set({ fillColor: "FF0000" }); });
  • 37. 37 Что умеет geoQuery? •  Кластеризовать // Например, загрузим траектории летящих самолётов, // возьмём все точки отправлений и прибытий и кластеризуем var clusters = ymaps.geoQuery(ymaps.geoXml.load( "http://openflights.org/demo/openflights-sample.kml" )) .search("geometry.type == 'Point'") .clusterize(); map.geoObjects.add(clusters);
  • 38. 38 Что умеет geoQuery? •  Находить оптимальный центр и масштаб карты // Например, найдём Москву и Екатеринбург и покажем их // на карте ymaps.geoQuery( ymaps.geocode("Москва", { results: 1 })) .add(ymaps.geocode("Екатеринбург", { results: 1 })) .addToMap(map) .applyBoundsToMap(map)
  • 39. 39 Что умеет geoQuery? •  Подписываться на события и отписываться от них // Поставим метки «Москва» и «Екатеринбург» // и будем по клику выводить alert-ом полное описание ymaps.geoQuery(ymaps.geocode("Москва", { results: 1 })) .add(ymaps.geocode("Екатеринбург", { results: 1 })) .addToMap(map) .addEvents("click", function (e) { alert(e.get("target").properties.get("text")); });
  • 40. 40 На правах рекламы: песочница Заходите: http://api.yandex.ru/maps/jsbox/
  • 41. Там ещё много клёвых штук!
  • 44. Сергей Константинов Руководитель группы разработки API Яндекс.Карт twirl@yandex-team.ru api.yandex.ru/maps clubs.ya.ru/mapsapi facebook.com/ymapsapi Спасибо!