Клуб API Карт

Вывод меток и хинтов к ним на карте в цикле из массива

Пост в архиве.

Имеется двумерный массив, по сути - таблица, из которой надо вывести точки на карте.

Делаю так:

 

var myMap;
ymaps.ready(init);

function init () {
  myMap = new ymaps.Map('ymap', {
    center:[65,100],
    zoom:3,
    controls:['zoomControl','typeSelector']
  });

  c = ai_users_points.length;
  i = 0;
  while (i<c) {
    var adr = arr[i][0]; // сдесь адрес, по которому ищется точка
    var name = arr[i][1]; // сдесь текст хинта
    var coords; // для координат


    // ищем координаты по адресу
    var myGeocoder = ymaps.geocode(adr,{results:1});
    myGeocoder.then(function (res) {
      myMap.geoObjects.add(res.geoObjects.get(0));
      coords = res.geoObjects.get(0).geometry.getCoordinates();
    });
 
   //формирование хинта
   HintLayout = ymaps.templateLayoutFactory.createClass(
      '<div class="ymap-hint"><strong>{{ properties.fname }}</strong></div>', {
        getShape: function () {
          var el = this.getElement(), result = null;
          if (el) {
            var firstChild = el.firstChild;
            result = new ymaps.shape.Rectangle(
              new ymaps.geometry.pixel.Rectangle([
                [0,0],
                [firstChild.offsetWidth, firstChild.offsetHeight]
              ])
            );
          }
          return result;
        }
      }
    );

    // формирование точки
    myPlacemarkPoint = new ymaps.Placemark(coords, {
      fname: name
    },{
      hintLayout: HintLayout
    });
 
    // выводим точку на карту
    myMap.geoObjects.add(myPlacemarkPoint);
    i++;
  }
}

 

  

Все бы ничего, но хинты не добавляются.

Если закомментировать myMap.geoObjects.add(res.geoObjects.get(0)); то хинты добавляются, но у каждой точки содержание хинта - от последней записи массива.

 

Как-либо проблема решаема?

4 комментария

Проблемы нет.

1. не надо геокодировать в цикле на клиенте.

(даже 100 адресов * 250 клиентов в сутки = бан согласно ПС)

 

2.3.6. Геокодирование. Функция геокодирования может быть использована только для сайтов или мобильных приложений, использующих Сервис. Пользователь имеет право обрабатывать полученные координаты исключительно для отображения их посредством Сервиса. Количество обращений к функции геокодирования ограничено 25000 запросов для одного сайта/мобильного приложения в сутки.

 

Геокодируйте на сервере (1 раз) с сохранением результатов в БД

2. надо прочитать про javascript (хотя бы про замыкания в javascript)

эта тема с последней записью в массиве – ошибка всех начинающих

http://javascript.ru/basic/closure#primer-oshibochnogo-ispolzovaniya

3. Зачем в цикле  создавать каждый раз один и тот же HintLayout?

4. сдесь => здесь

Алексей М.
27 января 2016, 23:25

 

Геокодируйте на сервере (1 раз) с сохранением результатов в БД

 

Спс за ответ. Если честно, js мне не очень дается вообще.

Я пишу модуль для Joomla3, где надо вывести кучу точек на карте по адресам из базы (типа "наши клиенты").

Чтобы использовать серверный вариант, мн енужно установить пакет:

npm install multi-geocoder

Это linux, я правильно понял? не думаю, что хостер позволит мне что-то устанавливать на сервер. К тому же, как я мосмотрел на гите (https://github.com/dimik/node-multi-geocoder) там только js, не понимаю, как это вообще может выполняться на сервере, если js - изначально клиентская (браузерная) часть, Joomla не умеет выполнять js на стороне сервера (или я чего-то не знаю?).

 

сдесь => здесь

Сори за очепятки, с кем не бывает )

http://nodejs.org/ работает и на windows

В качестве альтернативы можно воспользоваться этой статьей для православного пэхапэ

Алексей М.
27 января 2016, 23:25

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