Клуб API Карт

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

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

К сожалению, спутниковых снимков многих сибирских городов на Яндекс.Картах пока нет. Поэтому мне пришла в голову идея использовать снимки из карт 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 комментариев
Sergey Konstantinov
28 января 2016, 08:37
Этот вопрос обсуждался здесь.
Thekashey вывел формулу для смещения тайлов, но как тайлы смещать непонятно.
Sergey Konstantinov
28 января 2016, 08:37
Попробуйте спросить у него.
удалось узнать?
Насколько я понял, условия предоставления карт 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 для решения этой задачи.