Клуб API Карт

Найдено на тему «множественное геокодирование»:
Есть код, который выводит на карту объект по адресу из переменной. Как можно вывести множество таких объектов?
Юлия
10 мая 2017, 12:36

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

ymaps.ready(init);
function init(){
    var geocoder = new ymaps.geocode(
          // Строка с адресом, который нужно геокодировать
          'ПЕРЕМЕННАЯ АДРЕСА',
          // требуемое количество результатов
          { results: 1 }
    );
    // После того, как поиск вернул результат, вызывается callback-функция
    geocoder.then(
          function (res) {
                // координаты объекта
                var coord = res.geoObjects.get(0).geometry.getCoordinates();
                var map = new ymaps.Map('yandex_map', {
                        // Центр карты - координаты первого элемента
                        center: coord,
                         // Коэффициент масштабирования
                        zoom: 10,
                        // включаем масштабирование карты колесом
                         behaviors: ['default', 'scrollZoom'],
                         controls: ['mapTools']
                 });
                 var myPlacemark = new ymaps.Placemark(
                         coord, {
                                 balloonContent: 'ПЕРЕМЕННАЯ СОДЕРЖИМОГО БАЛУНА'
                          }
                 );
                // Добавление метки на карту
                map.geoObjects.add(myPlacemark);

                // устанавливаем максимально возможный коэффициент масштабирования - 1
                map.zoomRange.get(coord).then(function(range){
                         map.setCenter(coord, range[1] - 1)
                 });
                 // Добавление стандартного набора кнопок
                         map.controls.add('mapTools')
                 // Добавление кнопки изменения масштаба
                         .add('zoomControl')
                         // Добавление списка типов карты
                         .add('typeSelector');
            }
    );

}

Заранее спасибо!

3 комментария
множество объектов,множественное геокодирование
Multigeocoding tomcat
samaromku
18 апреля 2017, 11:05

Здравствуйте.

Хочу сделать множественное геокодирование. Прочитал, что для этого используется Node.js 

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

У меня приложение на tomcat. Возможно ли реализовать множественное геодирование на нем?

3 комментария
множественное геокодирование
Геокодирование с кастомным результатом
vctr78
8 февраля 2015, 21:04

На вход подаётся список городов, при чем каждому городу соотвествует количество людей.

Например, Москва - 3, Севастополь - 5, Ялта - 7

 

По идее, чтобы не загружать трафик, нужно воспользоваться множественным геокодированием и сделать как-то так:

 

 

var objects = ymaps.geoQuery(ymaps.geocode('Москва'))

for (var key in cities) {

    city = cities[key].title;

    objects.add(ymaps.geocode(city));

} 

objects.addToMap(myMap);

 

 

Но. Нужно, чтобы каждый геообъект менял iconContent на соотвествующее количество, и другие мелочи (текст балуна, вид метки в зависимости от количества).

Более того, нужно еще, чтобы кластеризатор учитывал это количество.

 

 

Поэтому я сделал так:

 

 

for (var ck in cts) //cts - города, ck - идентификатор-название города

 

{

   var current = {

   city: ck

    };

 

 ymaps.geocode(ck,{kind:"locality",results:1}).then(ymaps.util.bind(function (res) { 

    var object = res.geoObjects.get(0);

    object.properties.set('iconContent', cts[this.city]["count"]);

    object.properties.set('balloonContentHeader', this.city+" ("+cts[this.city]["count"]+")");

 

    clusterer.add(object);

 

    clusterer.createCluster = function (center, geoObjects) {

         // Создаем метку-кластер с помощью стандартной реализации метода.

        var clusterPlacemark = ymaps.Clusterer.prototype.createCluster.call(this, center, geoObjects),

        geoObjectsLength = clusterPlacemark.getGeoObjects().length,

        realGeoObjectsLength = 0;

        var objs = clusterPlacemark.getGeoObjects();

 

        for (var j=0; j<geoObjectsLength; j++) {

            realGeoObjectsLength = realGeoObjectsLength + objs[j].properties.get('iconContent');

        }

 

        clusterPlacemark.options.set('clusterIconContentLayout', ymaps.templateLayoutFactory.createClass('<div style="color: #FFFFFF; font-weight: bold;">'+realGeoObjectsLength+'</div>'));

        return clusterPlacemark;

    };

 

}, current));

}

myMap.geoObjects.add(clusterer);

 

 

Так метки с городами и кластерами отображаются с нужными числами.

Но, во-первых, такое решение далеко от принципа множественного геокодирования.

При этом, города могут быть абсолютно любые, самые популярные города можно сохранить в БД, и оттуда вытягивать, но все равно - будут и непопулярные города.

А во-вторых, с этим вариантом кастомизации не получается дальше работать - например, я не нашел, как спозиционировать карту по объектам(стандартные решения не работают).

 

Как быть? Как сделать кастомный вывод метки в зависимости от города(от его параметров) и при этом не превысить лимит запросов?

 

П.С.: текст кода упрощен в процессе задавания вопроса, поэтому может содержать формальные ошибки. Важен же ответ по существу.

7 комментариев
метка,кластеризатор,множественное геокодирование,API 2.1,геокодирование
geocode() по массиву
Удалённый пользователь
20 ноября 2012, 18:38

Есть массив типа:

list {

  0 : {addr: "адрес 1, дом1", coords: ""},

  1 : {addr: "адрес 2, дом 2", coords: ""},

  2 : {addr: "адрес 3, дом 3", coords: ""},

}

Запускаю геокодер по массиву list:

for(i in list){

  ymaps.geocode(list[i].addr).then(

    function (res){  ???  },

    function (err) {  console.log(err);  }

  );

}

Как записать координаты домов в соответствущее поле coords?

Не понимаю как это сделать, поскольку в callback-функции, которая обрабатывает ответ геокодера, неизвестно с каким элементом массива list она работает.

3 комментария
множественное геокодирование,API 2.0,геокодирование
Серверная реализация мультигеокодирования
nolan23
29 августа 2012, 10:27

в одном проектике была поставлена задача: геокодировать более 1000 адресов из загружаемого excel-файла с адресами.

алгоритм такой:
1. загрузка excel-файла и его парсинг в csv
2. вывод окна с формой ajax, которая опрашивает сервер каждую минуту до окончания геокодирования
3. если юзер обновляет окно, сервер проверяет наличие "недокодированного" файла с данными,и, если такой есть, показывает форму из п.2
4. по окончании геокодирования выводится список ошибок и файл с данными удаляется.
вот функция собственно геокодирования:
$result = array('html'=>'');
// проверяем существовование файла с данными для геокодирования
if (file_exists($dataraw)) {
// инициализируем memcache
        $memcache = new Memcache;
        $memcache->pconnect('127.0.0.1', 11211);
// грузим данные для геокодирования
        $data = file($dataraw, FILE_IGNORE_NEW_LINES);
// устанавливаем таймаут работы скрипта
        $endtime = time() + 60;
        $storage = '';
        $count = 0;
        $geocoded = 0;
        $errordata = '';
// инициализируем curl.
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// цикл геокодирования заканчивается по таймаут либо когда массив с адресами кончится
        while ((time() < $endtime) && sizeof($data)) {
            $count ++;
            $coords = false;
            $string = array_shift($data);
            $row = str_getcsv($string);
            array_walk($row, create_function('&$val', '$val = trim($val);'));
// тут превращаем часть столбцов массива данных в строку адреса
            $addr = implode(',', array_slice($row, 4, 4));
// хэш для хранения и поиска в memcache
            $hash = md5($addr);
// проверяем наличие уже отгеокодированного адреса в memcache
            $coords =  $memcache->get($hash);
// обраращение к геокодеру
            if ($coords === false)
            {
                curl_setopt($ch, CURLOPT_URL, 'http://geocode-maps.yandex.ru/1.x/?kind=house'.
                    '&geocode='.urlencode('Россия,+'.implode(',+', array_slice($row, 4, 4))));
                $content = curl_exec($ch);
                if (curl_error($ch)) {
                    break;
                }
                $xml = simplexml_load_file($content);
// тут коряво, конечно, но проверяем точность геокодирования. нас вполне устроит точность exact, number, near и street
                if ($xml->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found !=0 &&
                    in_array($xml->GeoObjectCollection->featureMember[0]->GeoObject->metaDataProperty->GeocoderMetaData->precision, array('exact', 'number','near', 'street')))
                {
// сохраняем в memcache если геокодирование прошло удачно
                    $coords = sprintf($xml->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos[0]);
                    $memcache->set($hash, $coords, MEMCACHE_COMPRESSED, strtotime('+30 days'));
                } else {
// сохраняем false, если геокодирование прошло неудачно.
                    $memcache->set($hash, NULL, MEMCACHE_COMPRESSED, strtotime('+1 days'));
                }
                $geocoded ++;
            };
            if ($coords) {
// сохраняем результат 
                list($lng, $lat) = explode(' ', $coords);
                $storage .= ($storage ? '|' : '') . implode(":", array(
                    $row[0],
                    $lat,
                    $lng,
                    isset($row[9]) ? intval($row[9]) : 0,
                    $row[0].". ".$row[1].' '.$row[2].' '.$row[3].'<br />'. implode(',', array_slice($row, 4, 5))));
            } else {
// или сохраняем ошибку
                $errordata .= "<tr><td>{$row[0]}</td><td>$addr</td></tr>";
            };
        };
// сохраняем ошибки в файл
        file_put_contents($error, $errordata."<tr colspan='2'>Обработано $count, геокодировано $geocoded<td></tr>");
// если отработан весь файл с данными - удаляем его и выводим ошибки
        if (sizeof($data) == 0) {
            @unlink($dataraw);
            $result['done'] = true;
            file_put_contents($error, "<tr><td colspan='2'>Обработка завершена<td></tr>" .
                "<tr><td colspan='2'><a href='/weather/mapexcel/'>Нажмите для переходы к карте</a><td></tr>",  FILE_APPEND);
        } else {
            file_put_contents($error, "<tr><td colspan='2'>Обработано $count. Осталось ".sizeof($data)."<td></tr>",  FILE_APPEND);
        };
        $result['html'] = file_exists($error) ? file_get_contents($error) : '<tr><td colspan="2">Ошибок не найдено</td></tr>';
// сохраняем файл с обработанными данными
        file_put_contents($datafile, $storage);
// отправляем ответ json
        header('Content-Type: application/json');
        echo json_encode($result);
        exit;
    }

клиентская часть
if (file_exists($dataraw))
{
    echo '<h1>Обработка загруженного файла</h1>';
    echo '<div id="result">Обрабатывается...</div>'.PHP_EOL;
    echo '<script type="text/javascript">
    $().ready(function() {
        var load = function() {
                $.get("?action=work", function(response) {
                    $("#result").html(response.html);
                    if (!response.done) {
                        window.setTimeout(load, 1000);
                    }
                });
            };
        window.setTimeout(load, 1000);
    })
    </script>
    </body>
    </html>';
    exit;
};

пояснения:
1. cron не использую, так как проект мелкий, да и потом вспомнить, что там было в кроне - сложно
2. почему без mysql? нет смысла морочиться из-за такого мелкого объема. данные обновляются ежедневно, а вот адресов будет 20-50 новых в день
3. memcache? вместо него можно использовать что угодно - mysql, файловый кэш и т.д. (сложнее, медленнее)
4. почему curl? сначала исползовал file_get_contents, но после большого числа обращений к геокодеру, яндекс начинает отдавать результаты с большой задержкой и скрипт вылетает по таймауту. Можно поставить set_time_limit(0), но все расвно вылетает из-за Nginx. в общем, curl хорош тем, что легко настраивается timeout. Кстати, насиловать яндекс тысячами адресов в минуту тоже нехорошо)

 

 

6 комментариев
статьи пользователей,примеры,множественное геокодирование,API 2.0,геокодирование,статьи
Перегнать массив адресов в метки
Роман
22 октября 2010, 11:02

Здравствуйте, вопрос состоит в следующем: Как правильно перегнать массив адресов в массив меток на карте? Сейчас использую следующий способ:

function ymap(msg) {
    var arAdress = eval(msg);

        // Создание обработчика для события window.onLoad
        YMaps.jQuery(function () {
            // Создание экземпляра карты и его привязка к созданному контейнеру
            var map = new YMaps.Map(YMaps.jQuery("#map")[0]);

            // Создание объекта геокодера

            map.addControl(new YMaps.TypeControl());
            map.addControl(new YMaps.ToolBar());
            map.addControl(new YMaps.Zoom());
            map.addControl(new YMaps.MiniMap());
            map.addControl(new YMaps.ScaleLine());
            map.addControl(new YMaps.SearchControl());

            for(var Element in arAdress){

                    var street = arAdress[Element];
                    var geocoder = new YMaps.Geocoder(street);

                    // По завершению геокодирования инициализируем карту первым результатом
                    YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
                            if (geocoder.length())
                            {
                                map.setBounds(geocoder.get(0).getBounds());

                                var geoResult = geocoder.get(0);

                                var point = geoResult.getCoordPoint();
                                // Создает метку и добавляет ее на карту
                                var placemark = new YMaps.Placemark(point, {style:'default#redPoint'});

                                placemark.setBalloonContent(street);
                                map.addOverlay(placemark);
                                //Открыает балун
                                placemark.openBalloon();

                            }
                         });
            }

      });
}

Казалось бы все логично, метки расставляются по правильным адресам, но геокодирование адреса занимает какое-то время, и к тому моменту когда функции постановки меток завершат свою работу, в качестве контента меткам передается только последний элемент массива (так как цикл for уже давно пробежал все адреса). То есть для решения проблемы надо дождаться заершения построения метки, а потом переходить к следующей итерации, но вот как это сделать я ума не приложу, может быть есть еще варианты решения проблемы?

6 комментариев
множественное геокодирование,геокодирование
YMaps.Geocoder получение координат нескольких объектов
Валерий
21 сентября 2010, 14:42

var geocoder = new YMaps.Geocoder("Москва"); находит координаты москвы или если есть такой же город с таким же названием находи и его, а можно ли получить координаты скопом различных географических точек? к примеру что-то вроде этого псевдокода

var geocoder = new YMaps.Geocoder(["Москва", "Екатиринбург","Владивосток"]);

мне надо отметить на карте ряд организаций из бд, каждый раз искать их координаты по отдельности будет долго

5 комментариев
множественное геокодирование,геокодирование
Подписи к меткам, полученным с помощью множественного геокодирования
SkyCat
3 сентября 2010, 00:36

Здравствуйте.

Подскажите, пожалуйста, как выводить подписи (адреса) у меток, полученных с помощью множественного геокодирования.

Я брал за основу этот пример.

Вот мой адаптированный вариант вышеуказанного примера.

<script type="text/javascript">
 // Создание обработчика для события window.onLoad
 YMaps.jQuery(function () {

 // Создание экземпляра карты и его привязка к созданному контейнеру
 var map = new YMaps.Map(YMaps.jQuery("#YMapsIDd")[0]);
 map.setCenter(new YMaps.GeoPoint(39.887714, 57.622506), 10);
 var traffic = new YMaps.Traffic.Control();
 var zoom = new YMaps.Zoom({smooth: true});
 map.addControl(new YMaps.Zoom(), new YMaps.ControlPosition(YMaps.ControlPosition.TOP_LEFT), new YMaps.Point(10, 10));
 map.addControl(traffic, new YMaps.ControlPosition(YMaps.ControlPosition.TOP_RIGHT, new YMaps.Point(5, 5)));
 traffic.setState({
 shown: true, // элемент управления развернут, пробки показаны
 infoLayerShown: true
 });

 // Координаты или адреса географических объектов
 var data = ["г. Ярославль, Ленинградский пр-т, 49а", "г. Ярославль, Московский пр-т, д. 108" ];

 var geocoder = new MultiplyGeocoder(data);

 map.addOverlay(geocoder);

 YMaps.Events.observe(geocoder, "Load", function (geocoder) {

 });

 });

 // Реализует наследование прототипа без исполнения конструктора родителя
 // Подробнее о наследовании: http://javascript.ru/tutorial/object/inheritance
 function extend (child, parent) {
 var c = function () {};
 c.prototype = parent.prototype;
 c.prototype.constructor = parent;
 return child.prototype = new c;
 };

 // Множественный геокодер
 // requests - массив адресов
 function MultiplyGeocoder (requests) {

 // Вызов родительского конструктора
 YMaps.GeoObjectCollection.call(this);
 var _this = this,

 // Количество вызовов геокодера
 geocodeCallCount = 0,

 // Обработчики событий
 listeners = [];

 // Последовательно геокодируем все переданные адреса
 for (var i = 0, l = requests.length; i < l; i++) {
 geocode(requests[i]);
 }

 // Функция, отвечающая за геокодировании одного адреса
 function geocode (request) {
	 
 // Геокодируем
 var geocoder = new YMaps.Geocoder(request);

 // Счетчик вызовов геокодирования увеличиваем
 geocodeCallCount++;

 // Сохраняем ссылки на обработчики событий
 listeners = listeners.concat(

 // Обработка событий Load и Fault
 YMaps.Events.observe(geocoder, [geocoder.Events.Load, geocoder.Events.Fault], function (geocoder) {
 if (geocoder.length()) {
 _this.add(geocoder.get(0));
 }

 geocodeCallCount--;
 isFinish();
 })
 );
 }

 // Функция для проверки окончания процесса геокодирования
 function isFinish () {

 // Если все объекты сгеокодированы, то генерируем событие завершения
 if (!geocodeCallCount) {

 // Событие о завершении геокодирования
 YMaps.Events.notify(_this, "Load", _this);

 // Удаление обработчиков событий
 for (var i = 0, l = listeners.length; i < l; i++) {
 listeners[i].cleanup();
 }
 }
 }
 }

 var ptp = extend(MultiplyGeocoder, YMaps.GeoObjectCollection);
</script>

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

11 комментариев
метка,множественное геокодирование,геокодирование
Получение координат для списка адресов
rodlex
27 июля 2010, 17:38
В блоге опубликована статья с примером множественного геокодирования с использованием PHP и MySQL
Получение координат для списка адресов

В данной статье  будет рассмотрен вариант получения координат для списка адресов с использованием PHP и MySQL. Полученные координаты можно будет использовать для отображения на карте списка ваших объектов (например, местоположение офисов компании, пользователей и пр.). Если вы хотите обрабатывать массивы адресов на клиенте, обратите внимание на статью «Множественное геокодирование».

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

Внимание. Если у вас есть таблица, содержащая адреса, которые необходимо геокодировать, то вы можете добавить в нее поле coords и перейти к настройке скрипта.

Таблица имеет три поля:

  • id – уникальный идентификатор адреса;
  • address – адрес, который необходимо геокодировать;
  • coords – координаты.
Создать таблицу можно, используя любую оболочку управления БД (например, phpMyAdmin), либо выполнив следующий sql-код:
CREATE TABLE `addresses` (
  `id` int(3) NOT NULL auto_increment,
  `address` varchar(1000) NOT NULL,
  `coords` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Далее заполните таблицу адресами, например, так:

INSERT INTO `addresses` VALUES (1, 'Москва, ул. Льва Толстого, 16', '');

INSERT INTO `addresses` VALUES (2, 'Санкт-Петербург, Свердловская набережная, 44', '');

INSERT INTO `addresses` VALUES (3, 'Екатеринбург, ул. Хохрякова, 10', '');

INSERT INTO `addresses` VALUES (4, 'Новосибирск, ул. Красноярская, 35', '');

INSERT INTO `addresses` VALUES (5, 'Казань, ул. Спартаковская 6, 11', '');

INSERT INTO `addresses` VALUES (6, 'Киев, ул. Луначарского, 4', '');

INSERT INTO `addresses` VALUES (7, 'Одесса, пр. Шевченко, дом 4-Д', '');

INSERT INTO `addresses` VALUES (8, 'Симферополь, ул. Героев Аджимушкая, 6/13', '');

INSERT INTO `addresses` VALUES (9, 'абракадабра', '');

Геокодирование будем производить с помощью следующего скрипта:

<?

    // Параметры

    $config = Array(

        'host' => 'localhost',

        'user' => 'root',

        'password' => '',

        'dbname' => 'test',

        'tablename' => 'addresses',

        'apikey' => 'ВАШ API-КЛЮЧ'

    

    // Соединение с сервером СУБД

    $dp = mysql_connect($config['host'], $config['user'], $config['password']) or die('Ошибка при подключении к серверу СУБД: '.mysql_error()

    // Выбор нужной БД

    mysql_select_db($config['dbname']) or die('Невозможно выбрать БД с именем "'.$config['dbname'].'": '.mysql_error()

    // Назначение кодировки

    mysql_query('SET NAMES utf8');

    // Выборка данных из таблицы

    $addresses = mysql_query('SELECT * FROM '.$config['tablename']) or die('Ошибка при выполнении запроса к таблице "'.$config['tablename'].'": '.mysql_error()

    // Общее количество адресов и количество адресов, в обработке которых произошла ошибка

    $countGeocode = $countGeocodeFault = 0;

    // Обработка адресов

    $result = '<table style="width:600px">';

    while ($row = mysql_fetch_assoc($addresses)) {

        $countGeocode++;

        // Обращение к http-геокодеру

        $xml = simplexml_load_file('http://geocode-maps.yandex.ru/1.x/?geocode='.urlencode($row["address"]).'&key='.urlencode($config['apikey']).'&results=1');

        // Если геокодировать удалось, то записываем в БД

        $found = $xml->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found;

        if ($found > 0) {

            $coords = str_replace(' ', ',', $xml->GeoObjectCollection->featureMember->GeoObject->Point->pos);

            $result .= '<tr><td>'.$row['address'].'</td><td>'.$coords.'</td></tr>';

            mysql_query("UPDATE `{$config['tablename']}` SET coords = '".mysql_real_escape_string($coords)."' WHERE id = {$row['id']}") or die("Ошибка при обновлении данных в таблице: ".mysql_error()

        } else {

            $result .= '<tr style="color:red"><td>'.$row['address'].'</td><td>ошибка</td></tr>';

            $countGeocodeFault++;

        }

    };

    $result .= '</table>';

    // Вывод результата

    echo $result;

    // Закрытие соеденинения с сервером

    mysql_close($dp);

    // Вывод общего количество прогеокодированных результатов

    if ($countGeocode) {

        echo '<div style="margin-top:1em">Всего обработано адресов: '.$countGeocode.'</div>';

        if ($countGeocodeFault) {

            echo '<div style="color:red">Не удалось прогеокодировать: '.$countGeocodeFault.'</div>';

        }

    } else {

        echo '<div>Таблица с адресами пуста.</div>';

    }

?>Скачать php-файл

Перед запуском скрипта необходимо прописать ваши параметры доступа к БД, а также указать API-ключ (получить ключ можно с помощью специальной формы

$config = Array(

    'host' => 'localhost',

    'user' => 'root',

    'password' => '',

    'dbname' => 'test',

    'tablename' => 'addresses',

    'apikey' => 'ВАШ API-КЛЮЧ'

После внесения изменений выполните скрипт.

В окно браузера будет выведены найденные координаты и сообщения об ошибках, если некоторые адреса прогеокодировать не удалось. Также скрипт обновит записи в таблице, добавив найденные координаты.

Рассмотренный скрипт демонстрирует пример геокодирования списка адресов. Вы можете его модернизировать и изменять по своему усмотрению.

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

множественное геокодирование,статьи,геокодирование
есть 140 000 адресов, нужно для каждого получить гео-координату!
Алексей
19 мая 2010, 17:10

Всем привет,

 

    - есть 140 000 адресов, нужно для каждого адреса получить гео-координату на yandex карте, какие есть идеи? может существуют готовые решения/сервисы? или статьи-мануалы по данной теме

11 комментариев
множественное геокодирование,геокодирование
Отображение списка адресов
vnkrivoshlykov
21 апреля 2010, 15:03

Подскажите пожалуйста, может уже кто сталкивался с сабжем, как это проще всего реализовать.

по тексту вида:

 

 

«Gothic Style»;Москва, м.ВДНХ, ВВЦ, 1-й павильон

«Культура»;Москва, м.Сухаревская, ул.Мещанская, д.1 тел. 207-59-87  
"Зиг-Заг"; Москва, м. Киевская(филевская линия), ул. Можайский Вал, д.1

Вбитого в текстовое поле по нажатию кнопки отобразить карту с балунами. В балуны поместить первое поле.

1 комментарий
множественное геокодирование,геокодирование
Множественное геокодирование (оформление балуна)
Удалённый пользователь
17 апреля 2010, 14:16

Мне необходимо вывести на карту ряд объектов по списку. При этом у каждого объекта должен быть балун с названием, а при щелчке на нем выводилось бы описание. Я вывожу объекты (из 1С) при помощи кода ниже. Вопрос следующий: как передать в геокодер вместе с адресами и название/описание для метки?

// Создание обработчика для события window.onLoad
|        YMaps.jQuery(function () {
|            // Создание экземпляра карты и его привязка к созданному контейнеру
|            var map = new YMaps.Map(YMaps.jQuery(""#YMapsID"")[0]);
|
|            // Установка для карты ее центра и масштаба
|           map.setCenter(new YMaps.GeoPoint(135.094069,48.4767176), 13);
|                map.addControl(new YMaps.TypeControl());
|                map.addControl(new YMaps.ToolBar());
|                map.addControl(new YMaps.Zoom());
|                map.addControl(new YMaps.MiniMap());
|                map.addControl(new YMaps.ScaleLine());
|
|            // Координаты или адреса географических объектов
|            var data = ["+СтрокаАдресов+"];
|
|            var geocoder = new MultiplyGeocoder(data);
|            map.addOverlay(geocoder);
|
//|            YMaps.Events.observe(geocoder, ""Load"", function (geocoder) {
//|                alert(""Геокодирование завершено"");
//|            });
|        });
|
|        // Реализует наследование прототипа без исполнения конструктора родителя
|        function extend (child, parent) {
|            var c = function () {};
|            c.prototype = parent.prototype;
|            c.prototype.constructor = parent;
|            return child.prototype = new c;
|        };
|
|        // Множественный геокодер
|        // requests - массив адресов
|        function MultiplyGeocoder (requests) {
|
|            // Вызов родительского конструктора
|            YMaps.GeoObjectCollection.call(this);
|
|            var _this = this,
|
|                // Количество вызовов геокодера
|                geocodeCallCount = 0,
|
|                // Обработчики событий
|                listeners = [];
|
|            // Последовательно геокодируем все переданные адреса
|            for (var i = 0, l = requests.length; i < l; i++) {
|                geocode(requests[i]);
|            }
|
|            // Функция, отвечающая за геокодировании одного адреса
|            function geocode (request) {
|                // Геокодируем
|                var geocoder = new YMaps.Geocoder(request);
|           
|                // Счетчик вызовов геокодирования увеличиваем
|                geocodeCallCount++;
|
|                // Сохраняем ссылки на обработчики событий
|                listeners = listeners.concat(
|
|                    // Обработка событий Load и Fault
|                    YMaps.Events.observe(geocoder, [geocoder.Events.Load, geocoder.Events.Fault], function (geocoder) {
|                        if (geocoder.length()) {
|                            _this.add(geocoder.get(0));
|                        }
|                        geocodeCallCount--;
|                        isFinish();
|                    })
|                );
|            }
|
|            // Функция для проверки окончания процесса геокодирования
|            function isFinish () {
|                // Если все объекты сгеокодированы, то генерируем событие завершения
|                if (!geocodeCallCount) {
|
|                    // Событие о завершении геокодирования
|                    YMaps.Events.notify(_this, ""Load"", _this);
|
|                    // Удаление обработчиков событий
|                    for (var i = 0, l = listeners.length; i < l; i++) {
|                        listeners[i].cleanup();
|                    }
|                }
|            }
|        }
|
|        var ptp = extend(MultiplyGeocoder, YMaps.GeoObjectCollection);



1 комментарий
множественное геокодирование,геокодирование
Проблема с установкой map.setBounds() и GeoCollectionBounds
Сергей Т.
15 апреля 2010, 16:40

Здравствуйте!

Создаю коллекцию YMaps.GeoObjectCollection (хранится в глобальной переменной trikCol), в нее помещаю Placemark-и двух типов - результаты поиска YMaps.Geocoder-а по адресу и созданые "вручную" YMaps.Placemark на основе известных координат.

 

После этого "пробегаюсь" по коллекции, собираю массив точек и на его основе создаю объект YMaps.GeoCollectionBounds. По нему пытаюсь спозиционировать карту:

 

  var points = [];
  trikCol.forEach(function (obj) {points.push(obj.getGeoPoint());});   
  var gcBounds = new YMaps.GeoCollectionBounds(points);
  map.setBounds(gcBounds);

 

После этого добавляю коллекцию на карту - map.addOverlay(trikCol);

 

В результате ВСЕ метки отображаются на карте корректно, но в массиве points оказываются только метки созданные "вручную" на основе известных координат; метки, являющиеся результатом геокодирования, отсутствуют. Так и должно быть, или я все-таки что-то делаю не так? (в результате setBounds() выставляется на основе только части меток, созданных руками).

 

P.S. похоже, что дело в асинхронности геокодера - и к моменту сбора массива точек для GeoCollectionBounds коллекция меток просто не заполнена еще результатами геокодирования. Я правильно понимаю?

5 комментариев
множественное геокодирование,API 1.x
Работа с результатами геокодирования
tug
29 ноября 2009, 01:10

Предположим в массиве есть несколько географических объектов. Часть из них задана координатами, а часть адресами. Задача: вывести их на карту.

Я начинаю перебирать объекты и если объект задан координатами, то делаю из него GeoPoint и обрабатываю (создаю PlaceMark и добавляю в массив для дальнейшего расчета масштаба).

Если же объект задан адресом, я передаю адрес в функцию на геокодирование, чтобы получить GeoPoint, создать PlaceMark и т.д. Проблема в том, что я не знаю, когда их получу, а программа в это время идет дальше.

Так вот как мне дождаться результатов геокодирования? Или как решить задачу другим способом?

4 комментария
множественное геокодирование,геокодирование
Выполнить функцию после загрузки карты
ddvhouse
9 октября 2009, 14:44

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


Как для этого её нужно описать? Если просто после описания карты, то она тогда начинает выполняться одновременно с загрузкой карты.

4 комментария
множественное геокодирование,события,API 1.x