Задать вопрос
@DmitryNs

Уменьшить количество вызовов геокодера яндекс карт?

У меня есть код выводящий большое количество меток на яндекс карту. Список офисов берется по api (также список офисов записываются в select). Проблема в том, что лимитов бесплатного тарифа яндекс мне хватает на несколько перезагрузок страницы. За раз происходит ~1700 вызовов геокодера. Дальше яндекс блокирует аккаунт на сутки. Причем со старой версией кода такого не происходило. Это нормальное поведение или я где то накосячил?

6682f683b2386373317494.png

const apiUrl = 'тут апи со списком офисов';
        let map, placemarks = [];
        let regions = {};
        let geocodeCache = {};


        ymaps.ready(initMap);

        function initMap() {
            map = new ymaps.Map('map_office', {
                center: [55.751574, 37.573856],
                zoom: 10
            });

            $.getJSON(apiUrl, function(data) {
                data.data.forEach(item => {
                    const city = item.city;
                    const region = item.region;
                    const address = item.address;
                    const vacancies = item.vacancies;

                    if (!regions[region]) {
                        regions[region] = {};
                    }
                    if (!regions[region][city]) {
                        regions[region][city] = {};
                    }
                    if (!regions[region][city][address]) {
                        regions[region][city][address] = [];
                    }
                    regions[region][city][address] = vacancies;


                    // Add placemark to the map
                    addPlacemark(region, city, address);
                });

        

                function addPlacemark(region, city, address) {
                    if (geocodeCache[address]) {
                        const coords = geocodeCache[address];
                        createPlacemark(coords, address, region, city);
                    } else {
                        ymaps.geocode(address, { results: 1 }).then(function(res) {
                            var geoObject = res.geoObjects.get(0);
                            if (geoObject) {
                                var coords = geoObject.geometry.getCoordinates();
                                geocodeCache[address] = coords;
                                createPlacemark(coords, address, region, city);
                            } else {
                                console.error(`Geocode failed for address: ${address}`);
                            }
                        }).catch(function(error) {
                            console.error(`Geocode failed for address: ${address}, Error: ${error}`);
                        });
                    }
                }

                function createPlacemark(coords, address, region, city) {
                    var placemark = new ymaps.Placemark(coords, {
                        balloonContent: address
                    });

                    // Add event listener for placemark click
                    placemark.events.add('click', function () {
                        setTimeout(function() {
                            $('#city').val(city).trigger('change');
                            setTimeout(function() {
                                $('#address').val(address).trigger('change');
                                setTimeout(function() {
                                    const firstVacancyOption = $('#vacancy option:eq(1)').val();
                                    if (firstVacancyOption) {
                                        $('#vacancy').val(firstVacancyOption).prop('disabled', false);
                                    }
                                }, 500);
                            }, 500);
                        }, 500);
                    });

                    map.geoObjects.add(placemark);
                    placemarks.push(placemark);
                }
            }).fail(function(jqxhr, textStatus, error) {
                console.error(`Request Failed: ${textStatus}, ${error}`);
            });
        }
  • Вопрос задан
  • 80 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы