Drupal → Модуль Geofield Yandex Maps — ввод и вывод гео-информации на Яндекс.Картах 2.1

15.12.2013

Версия для Drupal 8 переименована в "Yandex.Maps (formerly Geofield Yandex Maps)".

Описание

Модуль Geofield Yandex Maps — это набор инструментов для ввода и вывода гео-информации на Яндекс.Картах версии 2.1. Модуль работает в связке с Geofield 2.x и добавляет:

  • Виджет для ввода
  • Форматтер для вывода
  • Views хэндлер для вывода нескольких объектов на одной карте
  • Текстовый фильтр для вставки карт в текст
  • Theme-функцию для лёгкого вывода карты с помощью PHP
  • Элемент формы для использования карты в своих формах

Поддерживаемая геометрия — точки, линии, полигоны.

Установка и использование

Установка стандартная — распаковать в sites/all/modules, включить.

Использование виджета

Добавляем сущности поле Geofield. Выбираем в качестве виджета Yandex Map:

Настраиваем по вкусу:

Результат:

Использование форматтера

В настройках отображения поля выбираем форматтер Yandex Map:

Настраиваем:

Результат:

Демо.

Использование Views хэндлера

Добавляем представление по материалам, с дисплеем Page и форматом Yandex Map выводящим поля:

Добавляем в представление поле Geofield в названии которого есть суффикс (GeoObject):

Добавляем любые другие поля. Они будут выводиться при клике на объекте.

Настраиваем формат:


Результат:

Демо (работает с AJAX!).

Использование текстового фильтра

В настройках текстового формата включаем фильтр Yandex Map. Изменяем порядок фильтров так, чтобы Yandex Map оказался первым:

Настраиваем по желанию:

На странице настроек модуля admin/config/system/geofield-ymap включаем опцию Use loader.

Для вставки карты в текст используем тег [map][/map]. Пример вставки карты с одной точкой:

[map]{"type":"Point","coordinates":[37.62,55.75]}[/map]

Пример вставки карты с переопределёнными настройками:

[map zoom=10 auto-zooming=0]{"type":"Point","coordinates":[37.62,55.75]}[/map]

Объекты описываются в формате GeoJSON.

Демо.

Использование theme-функции

Пример создания карты с одной точкой:

$map = array(
  '#theme' => 'geofield_ymap',
  '#map_type' => 'yandex#map', // optionaly, default 'yandex#map'
  '#map_center' => array(37, 55), // optionaly, default 0,0
  '#map_zoom' => 12, // optionaly, default 0 and auto zooming
  '#map_auto_centering' => TRUE, // optionaly, default FALSE
  '#map_auto_zooming' => TRUE, // optionaly, default FALSE
  '#map_clusterize' => TRUE, // optionaly, default FALSE
  '#map_objects' => '{"type":"Point","coordinates":[37.62,55.75]}', // GeoJSON, optionaly
);
$output = render($map);

Демо.

Использование карты в своей форме

$form['location'] = array(
  '#type' => 'geofield_ymap',
  '#title' => 'Location',
  '#description' => 'Select control and click to map for add object on map. Double click on object to remove it.',
  '#map_multiple' => TRUE,
  '#map_center' => array(55.733835, 37.588227),
  '#map_zoom' => 12,
  '#map_auto_centering' => TRUE,
  '#map_object_types' => array('point', 'line', 'polygon'),
);

В #map_object_types перечисляются названия объектов, которые сможет добавлять пользователь. После сабмита в $form_state['values']['location'] будет массив со значениями:
objects - объекты в GeoJSON
center - центр карты
zoom - зум карты

Демо.

Создание карты из html кода

Добавляем в текст:

<div class="geofield-ymap" data-map-objects='{"type":"Point","coordinates":[37,55]}'></div>

В настройках модуля admin/config/system/geofield-ymap включаем опцию Use loader.

Демо.

Создание карты с помощью javascript

ymaps.ready(function () {
  // for <div id="my-map" style="width:100%; height:400px;"></div>
  var map = Drupal.geofieldYmap.mapInit('my-map', {
    objects: '{"type":"Point","coordinates":[37.62,55.75]}',
    autoCentering: true,
    autoZooming: true
  });
});

Перед использованием не забываем подключить библиотеку:

drupal_add_library('geofield_ymap', 'geofield_ymap');

Демо.

Доступ к созданной карте из Javascript

Все объекты карт находятся в переменной Drupal.geofieldYmap.data['id-карты'].map. Объекты доступны по событию yandexMapInit:

// Доступ к определённой карте
$('#id-карты').bind('yandexMapInit', function (event, map) {
  // ...
});

// Доступ ко всем картам
$(document).bind('yandexMapInit', function (event, map) {
  // ...
});

Полезные ссылки:
Визуальный генератор GeoJSON
Определение координат (координаты идут в обратном порядке)
Сюда можно писать о багах и новых фичах

Полезные статьи:
Как быстро отрисовать 10000 меток на карте и не затормозить всё вокруг
Тепловые карты в API Яндекс.Карт
Метки кластера в виде круговой диаграммы

Написанное актуально для
Geofield Yandex Maps 7.x-1.x-dev
Похожие записи

Комментарии

Гость
05.03.2015, 01:44

А можно ли полигонам добавлять надписи, что бы без клика на нём была надпись?

Андрей
09.03.2015, 22:26

Как можно объединить иконки в одну при отдалении в пресетах?

Андрей
09.03.2015, 22:56

не понимаю вопроса

В общем у меня установлено 2 пресета, т.е. 2 разных иконки и при уменьшении зума карты эти иконки (особенно если их много на карте) начинают накладываться друг на друга. Как сделать чтобы иконки объединялись в одну при уменьшении зума карты?

Андрей
09.03.2015, 23:34

включить кластеризатор

Как его можно включить в пресет?

var zoomControl = map.controls.get('zoomControl');
zoomControl.options.set('top', 75);

не проверял

Владимир
11.03.2015, 17:47
ymaps.ready(function () {
  var zoomControl = ymaps.controls.get('zoomControl');
  zoomControl.options.set('right', 75);
});

Uncaught TypeError: Cannot read property 'get' of undefined

controls это метод карты, а не объекта ymaps

Андрей
11.03.2015, 18:01

Скажите пожалуйста, что означает поле "Cluster caption field" и "Поле с содержимым иконки" в форматтере? И какие поля должны быть указаны в этих полях?

Андрей
11.03.2015, 19:00

Здесь у вас иконки меняются при отдалении карты, как сделать так же? Вы писали, что нужно включить кластеризатор, как это сделать?

отметить опцию "Clusterize placemarks" в настройках карты

Андрей
11.03.2015, 19:16

отметить опцию "Clusterize placemarks" в настройках карты

Спасибо! А можно как-нибудь изменить эту бело-синюю иконку кластеризатора на пользовательскую иконку?

Павел
19.03.2015, 17:14

Скажите, а версия под 8-ку планируется?

Владимир
31.03.2015, 14:27

Привет.
Подскажи, пожалуйста, как добавить на карту свою кнопку? Инструкция из оф. документации не работает.

Сергей
02.04.2015, 15:03

Подскажите пожалуйста, нужно вывести на карте несколько точек. Карту вывожу через Geofield c геокодированием из другого поля. Предварительно создал текстовое поле, которое имеет несколько значений. В каждое значение вписываю нужный адрес, а на карте отображается только один - первый. В настройках пробовал играться с Multiple - Single, результат не дало.

Заранее благодарю за помощь!

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

Павел
04.04.2015, 22:30

Доброго времени суток. Модуль крайне полезный, однако как сделать так, что бы пользователь ввел адрес в карту и произошло следующее:
1) маркер ставился автоматически;
2)адрес выносился в поле "адрес" (предусмотренное формой создания ноды.
крайне интересует этот вопрос.

Если геокодирование идет из мультиполя, то простого способа вывести у каждого балуна значение его адреса нет?

Павел
15.04.2015, 16:14

Подскажите пожалуйста как отключить скрол карты (колесом мыши) на всех страницах сайта. у меня ноды выводятся программно так что в "управлении отображением" ничего не отключается. зарание спасибо

Гость
15.04.2015, 17:16

Добрый день,
Я тут выяснил, что пользовательское соглашение яндекс карт запрещает использовать свои карты в админках, так как админки "ограничивают доступ к картам" (http://habrahabr.ru/company/yandex/blog/221139/#comment_7541981).
Получается этот модуль (виджет для расстановки меток) одним своим существованием нарушает это соглашение?

Андрей
15.04.2015, 17:19

Насколько помню в последней редакции правил не запрещается закрывать доступ к данным с помощь пароля, нельзя деньги за доступ к ним брать. Хотите брать деньги - платите за лицензию (много платите).
Но я вам скажу так - до тех пор пока вы не начнете превышать ежедневные бесплатные лимиты регулярно - на вас никто внимания не обратит.

Павел
15.04.2015, 17:34

Все, получилось. по какойто причине модель поведения "drag" не работает в режиме просмотра ноды. поставил"dblClickZoom"
однако при создании ноды карта все равно цепляется за курсор мыши.

при создании карты выводится виджет, при выводе карты в ноде выводится форматтер. у них разные настройки

Павел
15.04.2015, 17:38

В таком случае мне не удастся отключить скрол в при создании ноды? может я и туплю в конце рабочего дня, однако не вижу нстроек поведения виджета.

да, как оказалось такой опции в настройках виджета нет

Евгений
20.04.2015, 13:31

Подскажите пожалуйста, как обратиться к существующим меткам имеющейся карты?

Евгений
20.04.2015, 14:05

А обращаться к ним можно только по id через each?
Впервые столкнулся с API Карт, не могу разобраться, как для всех меток описать событие при наведении мышью.
Заранее спасибо.

Павел
24.04.2015, 10:56

Возможно ли связать поле field_adress и поле карты?
что бы пир создании ноды метка ставилась автоматически

Павел
30.04.2015, 11:00

Здравствуйте. у меня обнаружилась бага в геокодере http://joxi.ru/ZrJyy3XhgxaxAj
я ставлю адрес в городе Симферополь а метка ставится в Запорожье. не подскажете в чем может быть причина и как пофиксить?

Владимир
05.05.2015, 18:01

Подскажи, пожалуйста, как инициализировать карту, если она вызывается по клику отдельно (ajax загрузка).

Гость
06.05.2015, 18:41

Здравствуйте.
Модуль работает замечательно. Но стали выводиться сообщения с ошибками на страницах, где нет ни каких карт:

Warning: file_get_contents(http://api-maps.yandex.ru/2.0/): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad request в функции _locale_parse_js_file() (строка 1488 в файле /home/www/хххх/htdocs/includes/locale.inc).

Как это исправить?

Кирилл
19.05.2015, 11:52

Скажите, а как можно сместить центральный балун на карте, например, налево на 50px?
(Я использую для вывода views).

День добрый, подскажите не сталкивались ли вы с такой проблемой. Использую версию JQuery 2.1 и поле карты не загружается, ошибка яваскрипта $(...).once is not a function в файле yamaps.run.js. Я читал разные форумы, на них пишут что проблема в последовательности подключеня скриптов. Мол сначала

jquery.min.js (2.1.1)
jquery.once.js
drupal.js

потом все остальное. Так вот она соблюдена, и сам файл вызывающий ошибку подключается уже после того как подключены вышеперечисленные модули. Не знаете в чем может быть проблема еще?

Гость
19.06.2015, 13:48

скажите пожалуйста, элементы управления, типы объектов не видны, с чем это могло быть связано? возможно ли конфликт с другим модулем для карт

Добрый день. Спасибо за модуль. Интересует вот какой вопрос. Есть ли возможность в Вашем модуле вставить в views-exposed-form саму карту, для возможности фильтрации по методу "область карты".

Гость
24.06.2015, 16:21

выше писали этот код, вопрос куда его нужно вставить?

$(document).bind('yandexMapInit', function (event, map) {
var searchControl = map.controls.get('searchControl');
searchControl.events.add('resultshow', function (event) {
var resultIndex = event.get('index');
var result = searchControl.getResultsArray()[resultIndex];
Drupal.geofieldYmap.addObjectByType(map, 'point', result.geometry);
});
});

avbelov73
29.06.2015, 12:50

Добрый день! Вопрос - как к этому модулю подключить отображение "Регионы"?

Гость
08.07.2015, 13:59

модуль способен показывать одновременно полигоны и точки. Нужно отображать районы(полигоны) и в них объекты(точки).

Гость
08.07.2015, 14:00

чуть выше вопрос был =) пропустил знак '?'

Гость
08.07.2015, 14:01

все вопрос снят))) такого же нет с гугл картами?

Гость
08.07.2015, 15:23

все же нет, после практики вопрос остался. А именно - у меня регион(область на карте), это термины, и точки это дома(ноды), вьюс одновременно не может вывести и термины и ноды на карте, одних в виде полигонов, вторых в виде точек. Не знаете как такое осуществить? Тупо - регион кликабельный, в нем точки объекты кликабельные. Буду благодарен если наведете на мысль.

Гость
08.07.2015, 16:29

нашел инфу, что это ваш модуль! Снимаю шляпу, вы круты!

Гость
09.07.2015, 13:05

о, великий гуру, хелпните советом.

views не умеет выводить данные из разных базовых таблиц

Гость
09.07.2015, 17:04

views не умеет выводить данные из разных базовых таблиц

навскидку - много кода получится?

Гость
09.07.2015, 20:44

какого кода?

ну реализации вышеописанного

Гость
13.07.2015, 09:54

доброе утро. А как можно получить координаты текущего местоположения пользователя?

Гость
16.07.2015, 09:44

Доброе утро! А не подскажите, как добавить несколько меток на карте, при создании карты через JavaScript ???

Гость
16.07.2015, 15:19

Спасибо! А можно, как то скрыть метки при использовании Views хэндлера. Т.е. что бы при загрузке страницы на карте не было меток вообще, а появлялись только по клику по какому либо элементу ??

Гость
17.07.2015, 08:21

Спасибо за вашу помощь. Все получилось. А не подскажите, как программно передать значение для этого поля. Т.е. есть координаты (latlong) точки на карте, для каждой ноды. Нод будет порядка 3000, забивать руками не вариант.

Гость
20.07.2015, 11:30

туда, где нужно вывести карту

ну если прямо в ноде фигачить, то это явно будет не по идеологии друпала, получается, нужно делать модуль, который будет создавать страницу для карты, а там выводить этот код? поправьте если не правильно

avbelov73
20.07.2015, 11:33

поставь модуль, который будет передавать координаты. что-нибудь типа geofield. а вывод через views

Гость
21.07.2015, 12:08

получается, нужно делать модуль, который будет создавать страницу для карты, а там выводить этот код? поправьте если не правильно

гуру, укажите на ошибки, пожалуйста.

Гость
21.07.2015, 12:17

'#map_objects' => '{"type":"Point","coordinates":[37.62,55.75]}', // GeoJSON, optionaly

здесь он может принимать массив координат?

Гость
21.07.2015, 12:21

здесь он может принимать массив координат?

да!

{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
},
{ "type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
]
},
"properties": {
"prop0": "value0",
"prop1": 0.0
}
},
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
[100.0, 1.0], [100.0, 0.0] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}

Гость
21.07.2015, 12:51

последний вопрос, обещаю ;)

Выше вы написали, что невозможно вьюсом вывести полигоны(термины) и точки(ноды) одновременно. Тогда такой вопрос можно ли вьюсом вывести точки, потом отловить момент перед отрисовкой карты и забить области программно?

Гость
21.07.2015, 14:46
(function ($) {
    $(document).bind('yandexMapInit', function (event, map) {
        console.log(Drupal.geofieldYmap.data['geofield-ymap-all-object-in-map-page'].map);
    });
})(jQuery);

опираясь на ваш пример и в итоге ничего не работает

Гость
21.07.2015, 14:52

у вас же написано

Все объекты карт находятся в переменной Drupal.geofieldYmap.data['id-карты'].map.

console.log(map);

также не работает.

Гость
21.07.2015, 14:57

а нет ли более развернутой информации? А то как то вырвано из контекста и по сути что куда не понятно.

Гость
27.07.2015, 10:03

Доброе утро. По поводу

куда передать?

Есть массив, с координатами объектов (долгота, широта). Планируется программно создавать ноды. Так вот, как программно заполнить данное поле, при создании ноды, исходя из того, что широта и долгота уже известны.

Гость
29.07.2015, 19:26

При использовании модуля, возникает ошибка :

Warning: file_get_contents( sites/all/modules/geofield_ymap/js/geofield_ymap_presets.example.js): 
failed to open stream: No such file or directory в функции _locale_parse_js_file() (строка 1488 в файле /includes/locale.inc).

Geofield Yandex Maps 7.x-1.2
Drupal 7.38

Как побороть ошибку?

Добавить комментарий