Клуб API Карт

Как во время выполнения динамически использовать myGeocoder и Placemark

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

Добрый день!

 

Как динамически создавать метки на карте используя строковое представление адресса. 

Функция myGeocoder  работает асинхронно, поэтому не могу ее использовать для быстрого поиска нужного объекта на карте и его размещения (Placemark).

Если ипользовать координаты, то проблем вооще нет, но в данном кейсе нет такой возможности.

  

for (i = 0; i < jSonArray[0].results.length; i++) {
    var url = serverUrl + "/main.aspx?etn=city_u&pagetype=entityrecord&id=" + jSonArray[0].results[i].city_uaId;
    var City = (jSonArray[0].results[i].city_name != null) ? jSonArray[0].results[i].city_name : "";
    var Region = (jSonArray[0].results[i].city_regionId.Name != null) ? jSonArray[0].results[i].city_regionId.Name : "";
    //Используем сервис геокодирования  
    var adress = City + ", " + Region;
    var myGeocoder = ymaps.geocode(adress);
    myGeocoder.then(function (res) {
        var firstGeoObject = res.geoObjects.get(0),
            CoordAdress = firstGeoObject.geometry.getCoordinates();
    }, function (err) {});
    var coordinates = CoordAdress;
    //Устанавливаем метку на карте 
    geoObjects[i] = new ymaps.Placemark(coordinates, {
        name: 'Населенный пункт № ' + i,
        clusterCaption: 'Населенный пункт № ' + jSonArray[0].results[i].city_name,
        balloonContentBody: '<br><br>' +
            '<a href=' + url + '>Открыть запись населенный пункт' + jSonArray[0].results[i].city_name + '</a> <br>',
        balloonContentHeader: jSonArray[0].results[i].city_name,
        balloonContentFooter: 'Населенный пункт'
    }, {
        preset: 'twirl#violetStretchyIcon'
    });
    //Конец цыкла
}

 

7 комментариев

 

Если ипользовать координаты, то проблем вооще нет, но в данном кейсе нет такой возможности.

что за кейс?

kondratenko.igo1987
28 января 2016, 00:12

Есть просто адресс, нет полей широта и долгота! 

 

Прийдется вручную вводить, если тяжело реализовать(

 

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

 

 Надо регионны добавить или как это сделать? 

 

Тут у нас несколько контролов 


   ymaps.ready(init); function init() {var myMap = new ymaps.Map('map', {        center: [50.4501,30.5234],        zoom: 10    }),
ymaps.Regions.load("ua", function (state, collection) {    if (state == ymaps.State.SUCCESS) {        // Добавляет коллекцию регионов на карту        map.addOverlay(collection);            ymaps.Events.observe(collection, collection.Events.Click, function (collection, region, mEvent) {            alert("Вы щелкнули на регионе \"" + region.name + "\"");        });    }});
//Контрол поиска на карте searchControl = new ymaps.control.SearchControl({ provider: 'yandex#publicMap' });
//Контрол зумм на карте myMap.controls.add('zoomControl', { top: 75, left: 5 });
// добавляем панель на карту в нужную позициюmyMap.controls.add(searchControl, { left: '40px', top: '10px' });        MainContentLayout = ymaps.templateLayoutFactory.createClass('', {            build: function () {                MainContentLayout.superclass.build.call(this);                this.stateListener = this.getData().state.events.group()                    .add('change', this.onStateChange, this);                this.activeObject = this.getData().state.get('activeObject');                this.applyContent();            },                        clear: function () {                if (this.activeObjectLayout) {                    this.activeObjectLayout.setParentElement(null);                    this.activeObjectLayout = null;                }                this.stateListener.removeAll();                MainContentLayout.superclass.clear.call(this);            },                        onStateChange: function () {                var newActiveObject = this.getData().state.get('activeObject');                if (newActiveObject != this.activeObject) {                    this.activeObject = newActiveObject;                    this.applyContent();                }            },                        applyContent: function () {                if (this.activeObjectLayout) {                    this.activeObjectLayout.setParentElement(null);                }                                  this.activeObjectLayout = new MainContentSubLayout({                       options: this.options,                        properties: this.activeObject.properties                    });                                this.activeObjectLayout.setParentElement(this.getParentElement());            }        }),                MainContentSubLayout = ymaps.templateLayoutFactory.createClass(            '

$[properties.name]

' +            '' +                '$[properties.balloonContentHeader]
' +                '$[properties.balloonContentBody]' +            ''        ),                ItemLayout = ymaps.templateLayoutFactory.createClass(            '$[properties.name]'        ),            clusterer = new ymaps.Clusterer({            clusterDisableClickZoom: true,            clusterBalloonMainContentLayout: MainContentLayout,            clusterBalloonSidebarItemLayout: ItemLayout,            clusterBalloonSidebarWidth: 100,            clusterBalloonWidth: 300        }),


сколько у вас всего адресов?

kondratenko.igo1987
28 января 2016, 00:12

Я видел, что ограничение 25 тысяч, у нас не так много 2 тысячи.

 

А как задать изначально страну Украина при отображении? 

kondratenko.igo1987
28 января 2016, 00:12

Это понял, просто zoom нужный выставил)

 

А на счет гокодирования - вопрос открыт

Разъясняю

25 тысяч это на сайт в сутки.

25 000 / 2 000 = 12,5 пользователей в сутки могут прийти на ваш сайт.

Каждый из них сделает 2000 http-запросов на сервер Яндекса, т.е. скачает около 5 мегабайт данных.

 

Итог – если вас раньше не убъют пользователи за такой сервис, то обязательно забанит Яндекс.

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

kondratenko.igo1987
28 января 2016, 00:12

Чудесно, не знал как сделать множественное геокодирование. Мне и самому не хотелось изобритать нечто непонятное.

 

Спасибо за ссылку!