Форумчане, подскажите: как разместить карту объекта на сайте доски объявлений?
Я в курсе, что можно код от сервиса карт вставить в текстовое поле, но не каждый пользователь до этого додумается. Можно сделать, чтобы пользователь в произвольной форме водил адрес и выводилась карта исходя из поиска этой записи в Яндексе?
Комментарии
Через геокодер можно конечно.
Нужно выводить только карту одного объекта на его собственной странице, или потом захочется выводить много объектов на одной карте? Для второго я бы рекомендовал сразу взять модуль geolocation field, для первого он тоже конечно сойдёт, но на мой взгляд будет чересчур тяжёл (для этого есть ворох более простых модулей).
PS Я лично использую сильно переписанную версию трехлетней давности и с Гуглом, но текущая версия вроде поддерживает и Яндекс.
PPS На мой взгляд архитектурно правильнее для карты хранить в отдельном поле координаты объекта наряду с человекопонятным адресом. В модуле есть вся функциональность геокодера для получения координат из адреса и наоборот.
"Нужно выводить только карту одного объекта" - нужно чтоб карта формировалась исходя из того, что пользователь вбил в текстовой области адрес.
Установил модуль и провайдер
$ composer require geocoder-php/yandex-provider
Включил модуль Geocoder Field, добавил провайдер Yandex. В настройках отображения текстового поля указал:
По идее на странице ноды должна выводится карта, но ее нет
В текстовом поле на статье вбито "Московская область, Балашиха, Карбышева 21"
По какой идее? Геокодер никогда не выводил, не выводит и не должен выводить карту.
Понятно. Вопрос остается открытым.
А это вообще реально (если да то как?): вывести яндекс карту на основании введенного в текстовое поле?
Или это моя очередная нездоровая фантазия?
Обычно это две разные задачи:
1. Преобразовать текстовый адрес в координаты. Для этого есть геокодеры, их много.
2. Отобразить карту по координатам. Таких модулей еще больше.
Может и существуют модули, которые рисуют карту СРАЗУ по адресу, но мне такие не известны, потому что я такого никогда не искал и случайно тоже не натыкался.
https://www.drupal.org/project/yamaps
https://www.drupal.org/project/yandex_maps
Вам нужен один из этих модулей, точно не помню какой из них идеально Вам подходит..
Геокодер нужен для того, чтобы адрес преобразовать в координаты. Поэтому нужно текстовое поле и поле типа geofield, и модуль геокодера. В настройках геофилда указать, что значение необходимо взять геокодированием из другого поля. А уже еа выводе вывести этот геофилд картой.
"нужно текстовое поле и поле типа geofield" - поставил модуль geofield, создал соотв. поле.
"В настройках геофилда указать, что значение необходимо взять геокодированием из другого поля."
В настройках геофилда есть только Storage Backend.
В настройках текстового поля указал:
В отображении полей:
Не работает. Что-то не так делаю?
Модулем Geofield не пользуюсь (предпочитаю Geolocation Field), но совершенно очевидно, что Reverse geocoding тут не по делу: должен быть просто geocoding. Reverse geocoding - это определение адреса по координатам.
PS Насколько я знаю (могу ошибаться), модуль Geofield сам по себе никакую карту не выведет, нужно будет ставить что-то еще. За что я и люблю Geolocation field.
Geocode from existing field.
Для отображения надо модуль ставить, gmap, leaflet или yandex_maps, в зависимости от того, какую карту хочешь. Всегда предпочитаю использовать именно geofield, т.к. он хранит именно координаты, а для полигонов автоматически высчитывает центр. За счёт этого можно потом проводить всякие манипуляции вроде нахождения ближайшего объекта и т.д.
Ок, пойду другим путем.
Поставил yandex_maps. Все те же 2 поля. Текстовое и типа geofield. В текстовом поле убрал геокод.
В настройках геофилд:
Настройки отображения:
Результат: при сохранении материала пишет:
Deprecated function: idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated in GuzzleHttp\Utils::idnUriConvert() (line 35 of /home/u14038/domains/sitename.ru/vendor/guzzlehttp/guzzle/src/Utils.php).
Предупреждение
Unable to geocode 'Московская область, Балашиха, Карбышева 21'.
А через какой сервис геокодируешь? Токен добавил?
Geocoder provider - Yandex. Оно?
Какой токен?
Токен это API ключ? Без него никак?
А вы не реализуете динамику в картах без ключа. Без ключа ставится только статика, выдаваемая в конструкторе.
Ок, пусть ставится. Вы можете мне сказать, почему карта не выводится?
Как вариант, поле просто не связано с апи сервисом карты. Вы когда вводите данные в яндекс-картах, поле выдаёт вам правильные или возможное варианты. Но это однозначно те, которые содержатся в базе яндекса.
Такое же поле должно быть и у вас.
P.S. Если вы взялись за работу с сайтом недвижимости, на который тут недавно был запрос, то я вам соболезную. Бюджет не соответствует заданию. Заказчик пытается выставить всё в свете "да тут всё просто", "я сам пытался и даже шаблон есть". Но на самом деле там для такого ТЗ бюджет занижен вдвое. Планируются полигоны по данным кадастровых компаний. Заказчик ещё тот хитрожоп. Если это тот самый заказ - аккуратней...
"на который тут недавно был запрос" - не недвижимость и не я.
А координаты в базу записались? Полагаю, что нет, т.к. без ключа геокодер работать не будет. Вообще, ключ нужно в любом случае делать. Без ключа работает только статика, как сказали выше, и карты leaflet. Яндекс и Гугл для карт и геокодера требуют ключ. Причём гугл ещё и требует привязать к аккаунту платёжную карту.
Хорошо, доупустим я согласен на карты leaflet.
В текстовом поле geofield изменил провайдера на google
В настройках отображения выставил Leaflet Map:
Результат:
Т.е. карту показывает, но объект не находит. Почему так?
Ничего не знаю про Яндекс, но про Гугл ответственно могу сказать, что ни один из его карточных API, включая геокодер, не ответит НИЧЕГО, не получив предварительно номер кредитной карты вопрошающего.
То есть в данном случае проблема не с рисователем карты (leaflet), а с провайдером геокодинга.
PS В консоли ничего конкретного нет? А в логах?
Посмотри ты уже в базе данных свою ноду, записались координаты или нет. А вообще можно на карту поставить виджет от Яндекса без геокодера, только в настройках токена на самом Яндексе подключить апи поиска, тогда в виджет вводишь адрес, он центрирует карту по нему, остаётся только тыкнуть мышью в нужный конец дома.
Как я понял, проблема именно с геокодированием. т.е. не определяются координаты.
Поставил АПИ ключ от Яндекса. Правда в самом геокодере этот ключ вставлять негде (или где-то можно?), но я вставил в модуле yandex_maps.
После сохранения ноды, как писал выше:
Deprecated function: idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated in GuzzleHttp\Utils::idnUriConvert() (line 35 of /home/u14038/domains/sitename.ru/vendor/guzzlehttp/guzzle/src/Utils.php).
Неужели геокодеру не нравится окружение Патруля? На своем ПК, не могу проверить, т.к. смог найти только АПИ ключ Яндекса, который запрещен в моей стране.
а в журнале:
Client error: `GET https://geocode-maps.yandex.ru/1.x/?format=json&geocode=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0%2C+%D1%83%D0%BB%D0%B8%D1%86%D0%B0+%D0%90%D0%BA%D0%B0%D0%B4%D0%B5%D0%BC%D0%B8%D0%BA%D0%B0+%D0%9A%D0%BE%D1%80%D0%BE%D0%BB%D0%B5%D0%B2%D0%B0+12&lang=ru&results=5` resulted in a `403 Forbidden` response: @"statusCode":403,"error":"Forbidden","message":"Key is required"
Повторюсь, что про Яндекс ничего не знаю, но гугл требует добавить ключ в качестве одного из параметров каждого запроса, типа "&key=blablabla". При использовании Geolocation Field этот ключ забивается один раз в настройках модуля, про другие модули ничего сказать не могу.
Ок, пробую с geolocation. Включил модуль Geolocation - Yandex Maps. Ключ вставил. Добавил в материал поле типа geolocation.
Настройки формы:
Настройки отображения:
Редактирую ноду. Выбираю на карте объект, через поле поиска карты:
Объект находится, но координаты его автоматом не заполняются. Карта не выводится при просмотре ноды.
При последующем редактировании ноды, не видно, что я выбирал какой-то адрес на карте.
Что я неправильно делаю?
В яндексе встроенное окошко поиска только центрирует карту. Надо ещё тыкнуть мышкой в карту, чтобы появился маркер.
Понятно. С нескольких попыток тыканья в карту на здании появляется маркер. Слишком сложный вариант для пользователей доски объявлений.
так все таки в настройках самого геокодера нужно API ключ вводить? Если да, то где?
Ты хочешь, чтобы мы тут вместо тебя прочитали мануал?
В модули геокодер надо еще патч применить
https://www.drupal.org/project/geocoder/issues/3090777
и все заработает
leha373, спасибо, что ответили. Не знаю смогу ли я проверить работоспособность патча. 1800 долл/мес мне на этот ключ все равно не дадут. А если дадут, я готов без всяких апи в объявления вставлять карты руками.
У меня все работает! Ключ Апи же бесплатный до 25000 запросов в день!Или нет?!
Там вроде написано, что только для не коммерческих проектов.
Где такое написано, что геокодер "только для не коммерческих проектов"?
https://tech.yandex.ru/maps/geocoder/doc/desc/concepts/limits-docpage/
Как бы если доска объявлений, где каждый постит и читает объявления значит можно. Но вдруг будет что-то типа "премиум аккаунт"? Хотя чтоб такое посетителям было интересно уже постараться надо
Насколько я понял, там в итоге получается так, что если карты смотреть можно без регистрации, то сойдёт.
Попробуй
Попробовал. Патч работает. Карту из текстового поля формирует.
Проблемы:
1. Непонятно почему выпадает ошибка, не знаю что она показывает. Подозреваю, что то ему на сервере не нравится.
Deprecated function: idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated in GuzzleHttp\Utils::idnUriConvert() (line 35 of /home/u14038/domains/sitename.ru/vendor/guzzlehttp/guzzle/src/Utils.php).
2. Как вести разработку этого дела? Есть сайт продакшн. Есть копия для разработки на сервере. Есть копия у меня на Докере. Ведь ключ Яндекса, привязан к домену.
Ключ яндекса можно не привязывать к домену!!!
Если Яндекс поддерживает поддомены (Гугл точно поддерживает), то наверное достаточно будет хакнуть DNS на локальной машине чтобы dev.[ваш.прод.сайт.на.который.зареген.ключ.яндекса] показывал на локальный хост.
Я бы начал с прописывания в /etc/hosts строки
127.0.0.1 dev.[ваш.прод.сайт.на.который.зареген.ключ.яндекса]
Потом на дев-сайт надо будет заходить по этому адресу есс-но.
PS Но это я всё из головы пишу, сам не пробовал, и могут оказаться подводные камни
Если ключ не привязывать к домену, то это уже не твой ключ и даже не мой ключ - это их ключ (c). То есть им сможет пользоваться абсолютно кто угодно и твой дневной лимит выдуют за 10 минут.
И что получается, что мой ключ вылажут в паблик "пользуйтесь кто хотите"!??
У меня ключ уже больше двух лет не привязан не к чему, и все нормально. Никто не пользуется!!
Ваш ключ прямо сейчас лежит в паблике "пользуйтесь кто хотите". Дайте адрес сайта, и я Вам его покажу
О, это беспорное доказательство того, что никто и не может Тут иногда проскакивают сайты на версии 7.27 и до сих пор не взломаны. Из этого же следует, что версия 7.27 абсолютно надёжна, правда?
Из этого следует, что этим ключом пользуется не каждый, а только я
Ну, а так да. Вы правы