Клуб API Карт

Использование тайлов Google Maps

Пост в архиве.
Павел
1 июля 2009, 11:31

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



API Яндекс.Карт позволяет использовать сторонние тайлы через YMaps.TileDataSource:



var gMap = new YMaps.TileDataSource('http://khm1.google.ru/kh/v=40', false, false);
var gMapType = new YMaps.MapType(new YMaps.MapLayer(gMap), 'Google Maps', {minZoom: 1, maxZoom: 17});

gMap.getTileUrl = function(tile, zoom) {
    return this.getTileUrlTemplate() + '&x=' + tile.x + '&y=' + tile.y + '&z=' + zoom + '&s=G';
}
 
map.addControl(new YMaps.TypeControl([YMaps.MapType.MAP, YMaps.MapType.SATELLITE, gMapType]));


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



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



Может, у кого-нибудь из участников клуба стояла подобная задача? Или выбранный мною путь неверен?

17 комментариев
Этот вопрос обсуждался здесь.
Thekashey вывел формулу для смещения тайлов, но как тайлы смещать непонятно.
Попробуйте спросить у него.
удалось узнать?
Насколько я понял, условия предоставления карт Google запрещают использовать тайлы без их API. А использование двух API будет нехило тормозить клиентские компы.

К тому же, я пробовал заменить Яндекс.Карты на Google Maps. В итоге точки, поставленные в Яндекс.Картах, всё равно получаются смещёнными на Google Maps (примерно на метров 30).
Получается, что это как бы, недокументированная функция?
Ок понятно.
Спасибо
А смещение - постоянная константа для всей карты или зависит от области?

P.S. Делаю сайт с поддержкой G И Я API. Поэтому хотелось бы знать, так как сам уже с этим сталкивался, но пока не разбирался основательно.
Так как тайлы не совпадают по-разному в зависимости от координаты, и несовпадение не на целый тайл, а на дробное число, то все, что тут можно сделать – это проксировать гугловские тайлы через свой сервер, который будет брать на гугле два тайла и делать из него один.
Несовпадение там только по Y.
Либо, МОЖЕТ БЫТЬ, можно как-то хакнуть API самого Яндекса, чтобы эта поправка учитывалась на клиенте, но это еще более кривой способ.
А вот же уже даже и реализовано http://clubs.ya.ru/mapsapi/replies.xml?item_no=66
Нет. Для моего города и по X и по Y несовпадение
Ого. Это неожиданно. Какой город?
Хотя, если вы например, под "своим" городом имеете ввиду г. Волжский Волгоградской области, то в спутниковых картах там действительно смещены не только тайлы по вертикали (что правильно, и смещены они-таки только по вертикали), но и геопривязка самих карт несколько отличается – карта гугла смещена на 23 метра на северо-запад от карты Яндекса – например, угол одного из зданий абразивного завода по версии гугла находится на 48°48‘49,3685‘‘N 44°46‘07,7535‘‘E, а по версии Яндекса та же точка – 48°48‘48,9155‘‘N  44°46‘048,9155‘‘E.
При этом у VirtualEarth третье мнение (но ближе к Яндексу).

Но это уже другой совершенно вопрос, тут перерасчетами не поможешь, так как эта поправка должна быть своя для каждого города.
Всё точно, как в анекдоте: >Идёт интернетконференция с Путиным. >Путин читает очередной вопрос: >- "Вова, скажи, а тебе не в падлу отвечать на анонимные вопросы по инету?" >-"Отвечаю обладателю IP 265.03.05.05 провайдера "Волготелекома" Иванову >Петру Ивановичу, проживающего по адресу г. Волгоград, Проспект Ленина 13: >Нет, не в падлу." А если серьёзно, то не очень хорошо получается - это значит придется переводить координаты из гугля в яндекс и обратно динамически с поправкой на саму координату + определять эти смещения для местности.
Ну, смотря для чего вам это нужно... Смотря какие требования к точности, смотря для какого количества городов собираетесь что-то делать. Если для одного конкретного, то можно и подогнать – в принципе даже не сложно скачать гугловские тайлы для города и, пересчитав их под Яндекс, разместить у себя на сервере... То есть так нельзя, но если очень хочется то наверное гугль не засудит )
Теоретичеки - хотелось бы для любого города.
Скачивать тайлы - это немного не то.
Я уже сделал возможность пользователю переключаться между API карт.
Но не очень хорошо, когда на гугле объекты в одном месте, а в яндексе в другом.
Пока сделаю работу хотя бы с моим городом. Потом уже расширю.
Предварительное решение - делать корректирующие точки, которые будут хранить разницу смещения. И при преобразовании брать ближайщую точку и использовать её смещение.
раз уж меня тут помянули всуе  - я наконец то расказал как это делается :)

http://clubs.ya.ru/mapsapi/replies.xml?item_no=7125
Попробуйте использовать Leafletjs для решения этой задачи.