Клуб API Карт

Количество домов на прямой

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

Здраствуйте. Пытаюсь написать работу в универ с помощью яндекс карт. Не могу разобраться с геокодером. Мне нужно посчитать количество домов вокруг заданного адреса. Для простоты я беру окружность радиусом 500 метров, разбиваю ее на 8 секторов и считаю дома в диагонали каждого сектора. Проблема в том что могу посчитать количество только в том который обрабатываю первым. Я думаю что не до конца разобралась с геокодером. Помогите пожалуйста найти ошибку. И еще не могу придумать как сохранять адреса только с домами. Буду благодарна за любую помощь.

 

<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

        <script src="http://api-maps.yandex.ru/1.1/index.xml?key=ANpUFEkBAAAAf7jmJwMAHGZHrcKNDsbEqEVjEUtCmufxQMwAAAAAAAAAAAAvVrubVT4btztbduoIgTLAeFILaQ==" type="text/javascript"></script>

        <script type="text/javascript">

            kolDomov = new Array(8); //количество домов в каждом секторе

            var indexKolDom = 0; //номер сектора

            spisDomovI = new Array(50); //список адресов в одном секторе

            var flag = 0,

                radius = 0,

                x = 0,

                y = 0;

            var dom;

 

 

            YMaps.jQuery(function () {

                var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]),

                    geoResult; // Результат поиска

                map.setCenter(new YMaps.GeoPoint(39.31, 48.57), 13); // Установка для карты ее центра и масштаба

                map.enableScrollZoom();

                map.addControl(new YMaps.ToolBar());

                map.addControl(new YMaps.Zoom());

                var mysearchBounds = new YMaps.GeoBounds(new YMaps.GeoPoint(39.17523, 48.462364), new YMaps.GeoPoint(39.448515, 48.668955)); //ограничила поиск Луганском

                // Поиск по нажатию Enter в поисковом поле

                YMaps.jQuery("#first").bind("keyup", function (e) {

                    if (e.keyCode == 13) {

                        poisk();

                    }

                });

 

                YMaps.jQuery("#poisk").bind("click", poisk); // Поиск по щелчку на кнопке "Искать"

 

                // Запускаем поиск

 

                function poisk() {

                    var geocoder = new YMaps.Geocoder(YMaps.jQuery("#first").attr("value"), {

                        boundedBy: mysearchBounds,

                        strictBounds: true,

                        prefLang: "uk"

                    });

                    //var geocoder = new YMaps.Geocoder(YMaps.jQuery("#first").attr("value"));

 

                    var listenerLoad = YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {

                        // Если результа геокодирования был добавлен на карту, то удалим его

                        if (geoResult) {

                            map.removeOverlay(geoResult);

                        }

                        if (geocoder.length()) {

                            // Отображаем первый релевантный результат геокодирования

                            geoResult = geocoder.get(0);

                            map.addOverlay(geoResult);

                            geoResult.openBalloon();

                            x = Number(geoResult.getGeoPoint().getLng()); //сохраняем координаты магазина

                            y = Number(geoResult.getGeoPoint().getLat());

                        } else {

                            alert("По вашему запросу ничего не найдено.");

                        }

                        listenerLoad.cleanup();

                    });

                }

                YMaps.jQuery("#doma").bind("click", doma); //функция по нажатию кнопки Dom

 

                function doma() {

                    for (indexKolDom = 0; indexKolDom < 8; indexKolDom++) //переюираем по очереди каждую диагональ сектора

                    {

                        if (indexKolDom == 0)

                            raschet(2, 5, indexKolDom); //передаем коэффициенты увеличения первой диагонали и номер по порядку

                        else if (indexKolDom == 1)

                            raschet(5, 2, indexKolDom); //передаем коэффициенты увеличения второй диагонали и номер по порядку

                        else if (indexKolDom == 2)

                            raschet(5, -2, indexKolDom); //передаем коэффициенты увеличения третей диагонали и номер по порядку и т.д.

                        else if (indexKolDom == 3)

                            raschet(2, -5, indexKolDom);

                        else if (indexKolDom == 4)

                            raschet(-2, -5, indexKolDom);

                        else if (indexKolDom == 5)

                            raschet(-5, -2, indexKolDom);

                        else if (indexKolDom == 6)

                            raschet(-5, 2, indexKolDom);

                        else if (indexKolDom == 7)

                            raschet(-2, 5, indexKolDom);

                    }

                }

 

                function raschet(indX, indY, indexKolDom) //функция считает количество домов в диагонали

                {

                    var _x = x; //координаты диагонали

                    var _y = y;

                    var indexDom = 0; //переменная сохраняет количество не повторяющихся адресов

                    while (radius <= 0.005) //условие диагональ длиной 500 метров

                    {

                        _x += 0.0001 * indX; //изменяем координаты точек на диагонали для поиска домов

                        _y += 0.0001 * indY;

                        radius = Math.sqrt(Math.pow(_x - x, 2) + Math.pow(_y - y, 2)); //высчитуем расстояние от данного дома до следующей точки

                        var geocoder = new YMaps.Geocoder(new YMaps.GeoPoint(_x, _y), {

                            boundedBy: mysearchBounds,

                            strictBounds: true,

                            prefLang: "uk"

                        });

                        var listenerLoad = YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {

                            var geoResultNew;

                            if (geoResultNew) {

                                map.removeOverlay(geoResult);

                            }

                            if (geocoder.length()) {

                                // Отображаем первый релевантный результат геокодирования

                                geoResultNew = geocoder.get(0);

                                map.addOverlay(geoResultNew);

                                dom = geoResultNew.text;

                                for (var i = 0, flag = 0; i < 50; i++) {

                                    if (spisDomovI[i] == dom) flag++; //проверяем повторяющиеся адреса

                                }

                                if (flag == 0) {

                                    spisDomovI[indexDom] = dom;

                                    indexDom++;

                                }

                                //alert(indexDom);

                                //alert(doma);

                            } else {

                                alert("По вашему запросу ничего не найдено.");

                            }

                            listenerLoad.cleanup();

                            kolDomov[indexKolDom] = indexDom; //записываем количество домов в диагонали

                        });

                    }

 

                }

            })

 

            function Mass() //функция выводит количество домов в диагоналях

             {

                alert(kolDomov[0] + " - " + kolDomov[1] + " - " + kolDomov[2] + " - " + kolDomov[3] + " - " + kolDomov[4] + " - " + kolDomov[5] + " - " +

                    kolDomov[6] + " - " + kolDomov[7]);

            }

        </script>

    </head>

    

    <body>

        <table>

            <tr>

                <td>

                    <label>Введите адрес</label>

                    <input type="text" id="first" value="39.31, 48.57"></input>

                    </br>

                    </br>

                    <input id="poisk" type="button" value="Искать" />

                    <input id="mass" type="button" value="massiv" onclick="Mass()" />

                    <input id="doma" type="button" value="Dom" />

                </td>

                <td>

                    <div id="YMapsID" style="width:800px;height:500px"></div>

                </td>

            </tr>

        </table>

    </body>

 

</html>

 

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

Ваша задача не может быть решена с помощью геокодера,

он как бы совсем для других целей предназначен.

да вообще-то можно это решить.

Берём координаты центра круга, запрашиваем все адреса через http c rspn=1 и ll=радиусу круга (если конечно радиус не слишком большой. Если большой - чуть сложнее надо), а потом проверяем координаты всех домов на вхождение в круг и отсеиваем ненужные

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

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

Спасибо. Буду пытаться что-то с этим сделать :)

Андрей #МойБрокер #НедвижимостьМосквы
2 апреля 2021, 19:19
А нет ли уже готового такого инструмента? 
Интересная идея
mapsapi-help
Сотрудник Яндекса3 апреля 2021, 10:25
Андрей #МойБрокер #НедвижимостьМосквы,
Добрый день! Нет, в наших API такого инструмента в данный момент нет.