Как разместить карту объекта на сайте доски объявлений?

Главные вкладки

Аватар пользователя VasyOK VasyOK 11 мая 2020 в 6:58

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

Комментарии

Аватар пользователя marassa marassa 11 мая 2020 в 7:26

Нужно выводить только карту одного объекта на его собственной странице, или потом захочется выводить много объектов на одной карте? Для второго я бы рекомендовал сразу взять модуль geolocation field, для первого он тоже конечно сойдёт, но на мой взгляд будет чересчур тяжёл (для этого есть ворох более простых модулей).
PS Я лично использую сильно переписанную версию трехлетней давности и с Гуглом, но текущая версия вроде поддерживает и Яндекс.
PPS На мой взгляд архитектурно правильнее для карты хранить в отдельном поле координаты объекта наряду с человекопонятным адресом. В модуле есть вся функциональность геокодера для получения координат из адреса и наоборот.

Аватар пользователя VasyOK VasyOK 11 мая 2020 в 8:25

"Нужно выводить только карту одного объекта" - нужно чтоб карта формировалась исходя из того, что пользователь вбил в текстовой области адрес.

Установил модуль и провайдер

$ composer require 'drupal/geocoder:^3.1'
$ composer require geocoder-php/yandex-provider

Включил модуль Geocoder Field, добавил провайдер Yandex. В настройках отображения текстового поля указал:

По идее на странице ноды должна выводится карта, но ее нет Sad

В текстовом поле на статье вбито "Московская область, Балашиха, Карбышева 21"

Аватар пользователя marassa marassa 11 мая 2020 в 9:24

VasyOK wrote: По идее на странице ноды должна выводится карта

По какой идее? Геокодер никогда не выводил, не выводит и не должен выводить карту.

Аватар пользователя VasyOK VasyOK 11 мая 2020 в 11:16

Понятно. Вопрос остается открытым.
А это вообще реально (если да то как?): вывести яндекс карту на основании введенного в текстовое поле?
Или это моя очередная нездоровая фантазия?

Аватар пользователя marassa marassa 11 мая 2020 в 11:44

VasyOK wrote: А это вообще реально (если да то как?): вывести яндекс карту на основании введенного в текстовое поле?

Обычно это две разные задачи:
1. Преобразовать текстовый адрес в координаты. Для этого есть геокодеры, их много.
2. Отобразить карту по координатам. Таких модулей еще больше.
Может и существуют модули, которые рисуют карту СРАЗУ по адресу, но мне такие не известны, потому что я такого никогда не искал и случайно тоже не натыкался.

Аватар пользователя gun_dose gun_dose 11 мая 2020 в 19:28

Геокодер нужен для того, чтобы адрес преобразовать в координаты. Поэтому нужно текстовое поле и поле типа geofield, и модуль геокодера. В настройках геофилда указать, что значение необходимо взять геокодированием из другого поля. А уже еа выводе вывести этот геофилд картой.

Аватар пользователя VasyOK VasyOK 12 мая 2020 в 14:38

"нужно текстовое поле и поле типа geofield" - поставил модуль geofield, создал соотв. поле.

"В настройках геофилда указать, что значение необходимо взять геокодированием из другого поля."
В настройках геофилда есть только Storage Backend.
В настройках текстового поля указал:

В отображении полей:

Не работает. Что-то не так делаю?

Аватар пользователя marassa marassa 12 мая 2020 в 15:01

Модулем Geofield не пользуюсь (предпочитаю Geolocation Field), но совершенно очевидно, что Reverse geocoding тут не по делу: должен быть просто geocoding. Reverse geocoding - это определение адреса по координатам.
PS Насколько я знаю (могу ошибаться), модуль Geofield сам по себе никакую карту не выведет, нужно будет ставить что-то еще. За что я и люблю Geolocation field.

Аватар пользователя gun_dose gun_dose 12 мая 2020 в 22:04

Geocode from existing field.

Для отображения надо модуль ставить, gmap, leaflet или yandex_maps, в зависимости от того, какую карту хочешь. Всегда предпочитаю использовать именно geofield, т.к. он хранит именно координаты, а для полигонов автоматически высчитывает центр. За счёт этого можно потом проводить всякие манипуляции вроде нахождения ближайшего объекта и т.д.

Аватар пользователя VasyOK VasyOK 13 мая 2020 в 16:40

Ок, пойду другим путем.
Поставил 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'.

Аватар пользователя Vladi-D7-D8 Vladi-D7-D8 14 мая 2020 в 12:57
1

VasyOK wrote: Токен это API ключ? Без него никак?

А вы не реализуете динамику в картах без ключа. Без ключа ставится только статика, выдаваемая в конструкторе.

Аватар пользователя Vladi-D7-D8 Vladi-D7-D8 14 мая 2020 в 14:38

Как вариант, поле просто не связано с апи сервисом карты. Вы когда вводите данные в яндекс-картах, поле выдаёт вам правильные или возможное варианты. Но это однозначно те, которые содержатся в базе яндекса.

Такое же поле должно быть и у вас.

P.S. Если вы взялись за работу с сайтом недвижимости, на который тут недавно был запрос, то я вам соболезную. Бюджет не соответствует заданию. Заказчик пытается выставить всё в свете "да тут всё просто", "я сам пытался и даже шаблон есть". Но на самом деле там для такого ТЗ бюджет занижен вдвое. Планируются полигоны по данным кадастровых компаний. Заказчик ещё тот хитрожоп. Если это тот самый заказ - аккуратней...

Аватар пользователя gun_dose gun_dose 14 мая 2020 в 21:51

А координаты в базу записались? Полагаю, что нет, т.к. без ключа геокодер работать не будет. Вообще, ключ нужно в любом случае делать. Без ключа работает только статика, как сказали выше, и карты leaflet. Яндекс и Гугл для карт и геокодера требуют ключ. Причём гугл ещё и требует привязать к аккаунту платёжную карту.

Аватар пользователя VasyOK VasyOK 16 мая 2020 в 13:42

Хорошо, доупустим я согласен на карты leaflet.

В текстовом поле geofield изменил провайдера на google

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

Результат:

Т.е. карту показывает, но объект не находит. Почему так?

Аватар пользователя marassa marassa 16 мая 2020 в 13:51

Ничего не знаю про Яндекс, но про Гугл ответственно могу сказать, что ни один из его карточных API, включая геокодер, не ответит НИЧЕГО, не получив предварительно номер кредитной карты вопрошающего.
То есть в данном случае проблема не с рисователем карты (leaflet), а с провайдером геокодинга.
PS В консоли ничего конкретного нет? А в логах?

Аватар пользователя gun_dose gun_dose 16 мая 2020 в 15:41

Посмотри ты уже в базе данных свою ноду, записались координаты или нет. А вообще можно на карту поставить виджет от Яндекса без геокодера, только в настройках токена на самом Яндексе подключить апи поиска, тогда в виджет вводишь адрес, он центрирует карту по нему, остаётся только тыкнуть мышью в нужный конец дома.

Аватар пользователя VasyOK VasyOK 18 мая 2020 в 12:12

Как я понял, проблема именно с геокодированием. т.е. не определяются координаты.

Поставил АПИ ключ от Яндекса. Правда в самом геокодере этот ключ вставлять негде (или где-то можно?), но я вставил в модуле 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"

Аватар пользователя marassa marassa 18 мая 2020 в 15:04

VasyOK wrote: "error":"Forbidden","message":"Key is required"

Повторюсь, что про Яндекс ничего не знаю, но гугл требует добавить ключ в качестве одного из параметров каждого запроса, типа "&key=blablabla". При использовании Geolocation Field этот ключ забивается один раз в настройках модуля, про другие модули ничего сказать не могу.

Аватар пользователя VasyOK VasyOK 19 мая 2020 в 11:27

Ок, пробую с geolocation. Включил модуль Geolocation - Yandex Maps. Ключ вставил. Добавил в материал поле типа geolocation.

Настройки формы:

Настройки отображения:

Редактирую ноду. Выбираю на карте объект, через поле поиска карты:

Объект находится, но координаты его автоматом не заполняются. Карта не выводится при просмотре ноды.

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

Аватар пользователя gun_dose gun_dose 19 мая 2020 в 12:06

В яндексе встроенное окошко поиска только центрирует карту. Надо ещё тыкнуть мышкой в карту, чтобы появился маркер.

Аватар пользователя VasyOK VasyOK 19 мая 2020 в 17:06

Понятно. С нескольких попыток тыканья в карту на здании появляется маркер. Слишком сложный вариант для пользователей доски объявлений.

так все таки в настройках самого геокодера нужно API ключ вводить? Если да, то где?

Аватар пользователя VasyOK VasyOK 3 июня 2020 в 21:07

leha373, спасибо, что ответили. Не знаю смогу ли я проверить работоспособность патча. 1800 долл/мес мне на этот ключ все равно не дадут. А если дадут, я готов без всяких апи в объявления вставлять карты руками.

Аватар пользователя VasyOK VasyOK 5 июня 2020 в 11:02

https://tech.yandex.ru/maps/geocoder/doc/desc/concepts/limits-docpage/

Нельзя использовать API в коммерческих проектах.
Бесплатная версия API не подходит для проектов, которые требуют платы за регистрацию или приобретения лицензии.

Как бы если доска объявлений, где каждый постит и читает объявления значит можно. Но вдруг будет что-то типа "премиум аккаунт"? Хотя чтоб такое посетителям было интересно уже постараться надо Smile

Аватар пользователя VasyOK VasyOK 5 июня 2020 в 11:54

Попробовал. Патч работает. Карту из текстового поля формирует.

Проблемы:
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. Как вести разработку этого дела? Есть сайт продакшн. Есть копия для разработки на сервере. Есть копия у меня на Докере. Ведь ключ Яндекса, привязан к домену.

Аватар пользователя marassa marassa 5 июня 2020 в 12:02

VasyOK wrote: 2. Как вести разработку этого дела? Есть сайт продакшн. Есть копия для разработки на сервере. Есть копия у меня на Докере. Ведь ключ Яндекса, привязан к домену.

Если Яндекс поддерживает поддомены (Гугл точно поддерживает), то наверное достаточно будет хакнуть DNS на локальной машине чтобы dev.[ваш.прод.сайт.на.который.зареген.ключ.яндекса] показывал на локальный хост.
Я бы начал с прописывания в /etc/hosts строки
127.0.0.1 dev.[ваш.прод.сайт.на.который.зареген.ключ.яндекса]
Потом на дев-сайт надо будет заходить по этому адресу есс-но.
PS Но это я всё из головы пишу, сам не пробовал, и могут оказаться подводные камни Wink

Аватар пользователя marassa marassa 5 июня 2020 в 12:13

leha373 wrote: Ключ яндекса можно не привязывать к домену!!!

Если ключ не привязывать к домену, то это уже не твой ключ и даже не мой ключ - это их ключ (c). То есть им сможет пользоваться абсолютно кто угодно и твой дневной лимит выдуют за 10 минут.

Аватар пользователя leha373 leha373 5 июня 2020 в 12:17

И что получается, что мой ключ вылажут в паблик "пользуйтесь кто хотите"!??
У меня ключ уже больше двух лет не привязан не к чему, и все нормально. Никто не пользуется!!

Аватар пользователя marassa marassa 5 июня 2020 в 15:12

leha373 wrote: И что получается, что мой ключ вылажут в паблик "пользуйтесь кто хотите"!??

Ваш ключ прямо сейчас лежит в паблике "пользуйтесь кто хотите". Дайте адрес сайта, и я Вам его покажу Wink

leha373 wrote: У меня ключ уже больше двух лет не привязан не к чему, и все нормально. Никто не пользуется!!

О, это беспорное доказательство того, что никто и не может Wink Тут иногда проскакивают сайты на версии 7.27 и до сих пор не взломаны. Из этого же следует, что версия 7.27 абсолютно надёжна, правда?