Клуб API Карт

Добавление карт Яндекса к Гугловым. Вопросы и комментарии.

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

Приветствую!

Строю приложение, которое работает с картами Яндекс или Google, по выбору пользователя. Сперва встроены гугловые карты, теперь добавляю яндексные. Появились вопросы, комментарии и пожелания.


Вопросы.

  1. Обязательно ли удалять карту деструктором на unload документа? Не удалятся ли её ресурсы автоматически при закрытии страницы?
  2. Есть ли какие-то константы, пригодные для записи типа карты и восстановления типа из этой записи? MapType.getName()  на эту строку можно полагаться как на идентификатор?
  3. Есть ли готовый более ясный значок маркера, чем тот голубенький? Для простого указания он плох тем, что неоднозначно воспринимается. Вроде указывает, но подразумевает, что содержит какую-то разворачивающуюся по клику информацию там же на карте. Это хорошо, но сначала нужен прямой, симметричный и ясный (навроде гуглового).
  4. Bounds для результатов геокодера. Гугловый геокодер явно указывает какую область карты надо отобразить, чтобы хорошо показать искомый объект. У нас такого явно нет. Есть precision, по 4 младшим значениям которого можно подобрать примерный средний zoom, но для более крупных объектов это будет совсем наугад. Если же вовсе не зумить, то получается очень неудобное для пользователя отображение. Возможно, я проглядел нужные мне данные? Или, возможно, у команды разработчиков есть средние значения zoom для разных precision?

 

Комментарии. Я вовсе не хочу сказать, что надо делать API один в один гугловому, нет. Но всё же тот API вышел пораньше и наверное было бы хорошо как можно больше облегчить миграцию на наши карты. Обо что удалось споткнуться и чего хочется (впрочем, это же и в вопросах).

  1. Хочется больше опций настройки объектов прямо в конструкторе, без необходимости вызывать дополнительные методы только для создания нужного объекта.
  2. Удобства для сериализации. У гугла в паре мест есть toUrlValue(). Дело простое, у нас тоже легко добавляется, но всё же готовое удобство это замечательно, и код/трафик экономит.
  3. У гугла порядок координат lat, lng. У нас — lng, lat. Кто не наступал? :) Не хочется сейчас лезть в энциклопедии, но по памяти, у нас нестандартный порядок.
  4. (пользовательское) Почему у нас перевёрнутый ползунок zoom?

Благодарю за ответы. И за API! :)

 

 

6 комментариев
1. Необязательно вешать деструктор на событие страницу onunload.

2. name - это имя, которое отображается в переключателе карт. Имена типов карт могут совпадать, т.е. это не уникальный идентификатор. В статье Формирование ссылки на фрагмент карты показано как можо преобразовывать тип карты в идентификатор и обратно.

3. Список всех стандартных значков можно посмотреть в Справочнике по программному интерфейсу. Вы всегда можете создать свой собственный значок.

4. У объектов класса YMaps.GeocoderResult можно получить bounds c помощью метода getBounds() и передать его карте.
var geocoder = new YMaps.Geocoder("Москва");

YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
    if (this.length()) {
        // Получаем первый результат геокодирования
        var geoResult = this.get(0);
       
        // Добавляем его на карту
        map.addOverlay(geoResult);
       
        // Устанавливаем карте границы объекта
        map.setBounds(geoResult.getBounds());
    }else {
        alert("Ничего не найдено")
    }
});

По поводу Ваших комментариев:
1. Какие именно параметры Вы хотите передавать в конструктор при создании объектов?

2. В API Яндекс.Карт есть аналог метода toUrlValue(). С помощью метода toString() можно перевести координаты точки в строку, а с помощью метода fromString() создать объект класса YMaps.GeoPoint из строкового представления.

3. Объяснение по поводу порядка координат можно прочитать в этом посте.
Забыл ответить на 4-ый комментарий по поводу расположения кнопок на элементе масштабирования.

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

Поэтому кнопка "плюс" находится внизу, позволяя  приблизиться к земле на более подробный масштаб, а кнопка "минус" соответственно - вверху, позволяя подниматься на менее подробный масштаб.
вопросы 2. Может включить это в пакет карт? 3. Жаль что нет нейтрального симметричного значка. Да, придётся делать свой. 4. С getBounds я протупил :) комменты 1. При создании карты сразу в опциях указать центр, зум, тип, может и контролсы. Но это некритично конешно. И ещё, вылезла вот такая проблема. Есть такая широко известная в наших узких кругах функция:
function loadScript(url, callback) { var e = document.createElement('script'); e.src = url; e.type = 'text/javascript'; e.onload = callback; e.onreadystatechange = callback; document.getElementsByTagName('head')[0].appendChild(e); }
Если загрузить с её помощью http://api-maps.yandex.ru/1.1/index.xml?key=ключ или http://api-maps.yandex.ru/1.1/index.xml?loadByRequire=1&key=ключ то браузер перестаёт отображать документ (с другими скриптами это не происходит). Почему так? Есть ли адрес для on-demand загрузки без loadByRequire=1? У меня движок шаблонов вообще не пропускает незаескейпленные & на страничке (кроме как в комментариях). Кстати, надо попробовать загрузить из закомменченного скрипта, но может есть и такой адрес?
апдейт: ага, статически из закомментированного скрипта грузится, проблемы прямо сейчас нет но всё равно не хочется, чтобы динамическая загрузка скрипта карт портила документ
2. Мы учтем Ваши пожелания, но будет ли включен данный функционал в API гарантировать не могу.

Я воспользовался Вашей функцией loadScript и загрузил API без проблем. При загрузке API по требования необходимо обязательно указывать параметр loadByRequire=1. Другого пути нет.
это было в сафари и хроме