Клуб API Карт

Множественное геокодирование

chepurigor
11 мая 2014, 14:58

Добрый день всем и модераторам и участникам!

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

 

<script type="text/javascript">
    function init() {
        var myMap = new ymaps.Map('map', {
            center: [55.08, 38.75],
            zoom: 12,
            controls: ['zoomControl', 'searchControl', 'fullscreenControl']
        });
        var objects = ymaps.geoQuery(ymaps.geocode('Коломна, ул. Октябрьской Революции д. 134 а'))
            .add(ymaps.geocode('Коломна.", ".ул. Октябрьской Революции д. 134 а'))
            .add(ymaps.geocode('Коломна.", ".ул. Октябрьской Революции, д. 387 б'))
            .add(ymaps.geocode('Коломна.", ".ул. Щуровская, 13'))
            .add(ymaps.geocode('Коломна.", ".ул. Ленина, д. 139а'))
            .add(ymaps.geocode('Коломна.", ".ул. Астахова д.2 в'))
            .add(ymaps.geocode('Коломна.", ".а/д Москва-Чепябинск, 94 км.'))
            .add(ymaps.geocode('Коломна.", ".ул. Щуровская, д.4'))
            .add(ymaps.geocode('Коломна.", ".ул. Астахова, д. 4'))
            .add(ymaps.geocode('Коломна.", ".п. Радужный, 102 км'))
            .add(ymaps.geocode('Коломна.", ".ул. Митяево, 1'))
            .add(ymaps.geocode('Коломна.", ".пр-д Станкостроителей, 11а'))
            .add(ymaps.geocode('Коломна.", ".ул. Октябрьской революции. 139'))
            .add(ymaps.geocode('Коломна.", ".ул. Ленина, 139а'))
            .add(ymaps.geocode('Коломна.", ".ул. Ленина д. 86'))
            .add(ymaps.geocode('.", ".Озерское шоссе, 15-й км, ул. Щуровская д.38'))
            .add(ymaps.geocode('Коломна.", ".ул. Октябрьской Революции д. 130'))
            .add(ymaps.geocode('Коломна.", ".д. Сычево'))
            .add(ymaps.geocode('Коломна.", ".ул. Щуровская, 13'))
            .add(ymaps.geocode('Коломна.", ".Озерское ш., 5 А'))
        .addToMap(myMap);
    }
    ymaps.ready(init);
</script>

 

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

Ваше решение из разряда того как делать не надо:

http://ymapsapi.ya.ru/replies.xml?item_no=2002

 


Не пытайтесь экономить запросы к геокодеру

Очень часто пользователи сталкиваются вот с какой задачей. У них есть список адресов магазинов, аптек, достопримечательностей и многого другого. Все эти адреса нужно показать на карте. Задача решается просто – нужно взять все адреса, отправить их на клиентскую сторону, и просто-напросто геокодировать адреса в координаты меток на клиенте.

Неподготовленный читатель может спросить «Правильно ли то, что набор меток у нас один и тот же, а геокодируется он каждый раз при каждом вызове моего приложения у каждого пользователя заново?». Мы отвечаем на этот вопрос прямо: «Не волнуйтесь». Сервера Яндекса достаточно отказоустойчивы и выдержат все. Единственная загвоздка – при большом количестве запросов с вашего сайта, вы можете превысить лимит в 25 000 запросов не геокодирование и ваш сайт забанят. Но эту проблему мы уже освещали выше, поэтому не будем засорять голову по пустякам.

Разработчики, которые не читали эту статью и не верят в силу серверов Яндекса, придумали геокодировать данные на сервере. А один наш сотрудник даже написал модуль для серверного геокодирования на node.js. Этому посвящен раздел в руководстве разработчика.


 

 

Нахожу ваше ехидство вредным, думаю надо бы вот "настучать" Вашему руководству о таком "бестолковом" сотруднике компании Яндекс как вы,  так как ваши советы - вовсе не советы, а простые издевательства.

Хочу заметить этот код что я взял из Ваших примеров вот ссылка - http://api.yandex.ru/maps/jsbox/2.1/multigeocode

Получается или вы не компетентный или не грамотный человек!

 

Мое руководство читает этот клуб, так что не стоит себя утруждать настукиванием.

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

Множественное геокодирование на клиенте имеет смысл когда пользователь сам "накликивает" несколько точек на карте или указывает адреса в форме

У вас же 250 одних и тех же известных заранее объектов, которые вы хотите на каждом клиенте геокодировать каждый раз, отправляя 250 http-запросов, и считаете это грамотным и толковым.

А пример этот мы пожалуй уберем, спасибо за идею

ну если этому руководству по барабану, видать стоит обратиться в вышестоящему.

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

250 - это условно, думаю даже максимум который может быть. и то не частым, но вопрос был задан с перспективой - чтобы узнать потолок возможностей.

где можно ознакомиться более детально (возможно с примерами) чтобы геокодировать 1 раз и не мучать каждого клиента массовым траффиком?

Я вас в песочницу не отправлял.

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

А ссылку я вам давал еще в предыдущем треде.

бабуля бетмена, я правильно понял что мне нужно использовать:

 geocoder.geocode([

 'Москва, 1905 года ул., д.19', 'Москва, 1-ая Квесисская ул., д 18', 'Москва, 1-й Тверской-Ямской пер, д.16' ], 

да.

тут есть небольшая документация и пример использования

я узнавал, на шаред-хостинг-е это невозможно установить

выходит либо сервер покупать (или VPS) либо отправлять множественные запросы... 

а больше вариантов нет?

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

Либо у нас есть статья как сделать тоже самое на php+mysql

это должно работать на любом хостинге

 

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

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

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

 

Нет это не ошибка, просто геокодер возвращает координаты в порядке longlat

При подключении АПИ можно указать &coordorder=longlat

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

 

Я вставил тут, но ничего не поменялось, что ни так?

нет не в урле к геокодеру, а там где вы апи подключаете

http://api.yandex.ru/maps/doc/jsapi/2.1/dg/concepts/load.xml#param

странно, но я ничего не подключаю, как же оно мне координаты сгенерировало?

 

Ну у вас где координаты в Африке отображаются?

не, в Узбекистане в основном!

а вот у Вас файл примеров не работает, не существует файл, так то я бы там посмотрел

странно, подключил файл - и тоже самое.

мда, чекнуться можно пока допилишь простые вещи....

 

нет, нужно поменять урл подключения АПИ на вашем сайте где ваши объекты отображаются в Узбекистане, добавив в него &coordorder=longlat

добавлять этот параметр в ссылку наших примеров смысла не имеет

ща дошло.... а я в файл coords.php  - который в таблице координаты добавляет - экспериментирую...

ща отпишусь..

теперь по Украине.... метки разбросанны....:-$

Ха а часть верно.... видать неверное определение адреса.... в геокодере

для добавления меток я использую из примера - http://api.yandex.ru/maps/jsbox/2.1/geo_object_collection

может что посоветуете другое (например как балуны еще добавить) ?

возможно имеет смысл добавлять в адрес страну "Россия, " + адрес или "Украина, " + адрес

да, я уже сам догадался, оказывается у меня город в отдельном поле в таблице, приоединил его к адресу - и УРА ТОВАРИЩИ бэтмены! и никаких ограничений в 25 000 запросов :-)

 

Вам спасбо за помощь! 

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

Тут описаны все поля балуна, включая header и footer

http://api.yandex.ru/maps/jsbox/2.0/balloon_and_hint

 

Правильный вариант это сделать отдельный php файл, который будет формировать из записей вашей БД структуру JSON такого вида, например с помошью json_encode

Затем на странице с картой просто загрузить его, например с помощью jQuery

 

ymaps.ready(function () {

var myMap = ymaps.Map(

    ...

);

 

$.getJSON("_url_to_your_php_to_json_handler_", function (json) {

    ymaps.geoQuery(json).addToMap(myMap);

});

 

});

 

На этот файл с json выставить "правильные" http-заголовки кеширования и заголовок "content-type: application/json; charset=utf-8"

В этом случае ваша страница с картой будет "летать"

 

а чем он правильнее?  

и еще пример балунов 2.0 и 2.1 отличается отображением информации?

и  myPlacemark = new ymaps.Placemark([55.907228, 31.260503], { - это я создам 1 раз, а потом как добавлять следующие ?

или для каждого адреса будет:

 myPlacemark1 = new ymaps.Placemark ...

 myPlacemark2 = new ymaps.Placemark ...

и т.д. - так чтоли?

я сейчас делаю так - как в примере добавления коллекции:

blueCollection = new ymaps.GeoObjectCollection(null, {

preset: 'islands#blueIcon'

}),

blueCoords = [

[38.855496,55.060735],[38.721674,55.079318],[38.787637,55.090088],[38.761927,55.083931] ];

вот как раз чтобы не делать myPlacemark1, myPlacemark2  и т.п. ерунды.

1. Плохая практика распечатывать из одного языка программирования (PHP) другой язык программирования (Javascript), лучше использовать промежуточный формат данных (JSON)

 

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

 

3. Вы сможете закешировать загрузку JSON-данных и при следующих открытиях вашего сайта они уже будут браться из кеша браузера (плюс к скорости сайта и снижение нагрузки на ваш сервер)

 

В статье о "вредных советах", которую вы почему-то восприняли как издевательство, мы постарались уберечь пользователей от неверного подхода к созданию геообъектов:

 

 

Не стоит задумываться о знании JavaScript

Как известно, программист на JavaScript – это не программист, а так – верстальщик. Вас ни в коем случае не должно сбивать с этой мысли то, что API, который вы хотите использовать, написан на JavaScript. Изучая конструкции этого языка (если так вообще можно сказать), вы рискуете забыть что-то важное из другого языка, запутаться и все пойдет прахом.

Идеальный вариант – это печатать конструкции JavaScript с помощью PHP. Приведу пример:


myPlacemark = new ymaps.Placemark(["" ,"" ]);
myMap.geoObjects.add(myPlacemark);

Видите, как изящно мы обошлись без JavaScript!

Этот подход позволит вам избежать многих неприятных последствий

    • Ваше приложение будет работать достаточно медленно, чтобы дать пользователю время подумать о смысле жизни.
    • Ваш код не будет требовать обфускации, так как он достаточно запутан с самого начала.
    • Код страницы не будет кешироваться браузером, а будет генерироваться каждый раз заново на сервере.

Печально, что многие программисты все-таки пытаются идти против системы. Они пишут код на чистом, хорошо структурированном JavaScript. Загружают данные пачками по одним и тем же URL, засоряя кеш браузера. В результате их приложения работают быстро, пользователи воспринимают это как должное и даже не смотрят на другие сайты. Подумайте о подрастающем поколении – хватит делать сайты, на которых школьники проводят свою молодость, освободим человечество от интернет-зависимости!

 

Рекомендую, всё же использовать ту схему создания объектов, которую я вам посоветовал.

кто же против "мерседеса", только пока я его "создам" - пропадет всякое желание вообще его создавать. Потому думаю "жигули" бы собрать. Я только начал РНР  изучать. До этого в wordpresse сайты делал.

Думаю хотя бы запустить проект, а потом и оттачивать свое мастерство и сайтостроение.

В идеале вы правы, но когда неукого спросить - пухнет голова. 

Разница в трудоемкости не так велика, а разница в результате вполне ощутима.

Вы попробуйте сделать всё как надо, а я вам помогу.

Вам нужно создать отдельный PHP-файл, типа geoobjects.php

и в нем сделать запрос к БД, результат которого привести к формату JSON c помощью метода json_encode

т.е. мне нужно в цикле создать:

 

"type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    33.0865,
                    68.97468
                ]
            },
только со своими координатами?

Да

можно создавать php-объекты, а потом делать им json_encode, чтобы строки не клеить

В том же самом примере в песочнице написано

 

Для случаев, когда требуется геокодировать на клиенте одни и те же точки много раз, лучше реализовать геокодирование на стороне сервера с кешированием результатов. Подробнее об этой технологии читайте в руководстве разработчика.

Посмотрите примеры в песочнице http://api.yandex.ru/maps/jsbox/2.1/icon_customImage

Там есть и свои метки, и свои балуны (балуны в другом примере)

Катриченко Денис
4 июня 2014, 03:14

Привет, ну так как в итоге добавлять свои балуны? Чтото я не увидел вразумительного ответа. Только чтобы без лишнего кода 

myPlacemark = new ymaps.Placemark([], {iconContent: '', balloonContentHeader: '', balloonContentBody: ' Подробнее', balloonContentFooter: '', hintContent: ''});

Катриченко Денис
4 июня 2014, 23:23

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

у меня есть на лету - но мне показалось что это долго - число запросов то больше.

        http://joxi.ru/o_2PUxjKTJAaH4HKJoQ - вот тут то что ты хотел.