OpenLayers+Yandex
-
- Участник
- Сообщения: 83
- Зарегистрирован: 16 июн 2009, 10:38
- Репутация: 0
OpenLayers+Yandex
Столкнулся с такой проблемой при отображении карт Yandex в OpenLayers:
когда пытаюсь приблизиться на какой нибудь дикой местности(там где детализация Яндекса слабовата и по хорошему надо получить сообщение что нет карты нужного масштаба) Яндекс отдает мне в ответ карту того масштаба что у него есть. В итоге отображаемая карта не совпадает с реальным масштабом OpenLayers.
Подскажите как можно этот эффект побороть?
когда пытаюсь приблизиться на какой нибудь дикой местности(там где детализация Яндекса слабовата и по хорошему надо получить сообщение что нет карты нужного масштаба) Яндекс отдает мне в ответ карту того масштаба что у него есть. В итоге отображаемая карта не совпадает с реальным масштабом OpenLayers.
Подскажите как можно этот эффект побороть?
-
- Новоприбывший
- Сообщения: 1
- Зарегистрирован: 03 янв 2011, 18:49
- Репутация: 0
Re: OpenLayers+Yandex
Это происходит вследствие динамического изменения диапазона доступных масштабов в зависимости от текущего вьюпорта:)
1. Можно понизить версию скриптов до 1.0: <script src='http://api-maps.yandex.ru/1.0/...>. Но тогда перестают быть доступны новые фичи - маршруты и т.д.
2. Изменить некоторые функции слоя яндекса:
1. Можно понизить версию скриптов до 1.0: <script src='http://api-maps.yandex.ru/1.0/...>. Но тогда перестают быть доступны новые фичи - маршруты и т.д.
2. Изменить некоторые функции слоя яндекса:
Код: Выделить всё
loadMapObject:function() {
//has ymaps library has been loaded?
try {
// create YMap, hide nav controls
this.mapObject = new YMaps.Map( this.div );
this.dragObject = this.mapObject;
var ol = this;
YMaps.Events.observe(this.mapObject, this.mapObject.Events.ZoomRangeChange, function(map, minmax) {
ol.numZoomLevels = minmax.max + 1;
var ctrls = ol.map.getControlsByClass("OpenLayers.Control.PanZoomBar");
if (ctrls && ctrls.length)
ctrls[0].redraw();
});
} catch (e) {
OpenLayers.Console.error(e);
}
},
setMapObjectCenter: function(center, zoom) {
this.mapObject.setCenter(center, zoom);
var max = this.mapObject.getMaxZoom();
if (max < zoom)
this.map.zoomTo(max);
},
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: OpenLayers+Yandex
2LeXXaT
Спасибо за наводку. При использовании версии API Yndex 1.1 в OpenLayers при сдвиге карты с помощью кнопок навигации в FF наблюдалось неприятное моргание карты (причём в IE такой баг отсутствует). При откате на версию - 1.0 проблема исчезла. Библиотека для работы с картами Yandex отсюда.
Спасибо за наводку. При использовании версии API Yndex 1.1 в OpenLayers при сдвиге карты с помощью кнопок навигации в FF наблюдалось неприятное моргание карты (причём в IE такой баг отсутствует). При откате на версию - 1.0 проблема исчезла. Библиотека для работы с картами Yandex отсюда.
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 02 окт 2011, 20:22
- Репутация: 0
Re: OpenLayers+Yandex
А как вместо карты включить спутник?
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: OpenLayers+Yandex
Код: Выделить всё
Y_mapH = new OpenLayers.Layer.Yandex("Яndex (гибрид)",{type:YMaps.MapType.HYBRID, sphericalMercator: true});
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 02 окт 2011, 20:22
- Репутация: 0
Re: OpenLayers+Yandex
_DR_, спасибо.
-
- Интересующийся
- Сообщения: 21
- Зарегистрирован: 04 мар 2014, 12:21
- Репутация: 0
Re: OpenLayers+Yandex
Помогите пожалуйста с Яндексом, некорректно отображается
Пробовал научить OpenLayers проекции EPGS=3395 http://trac.osgeo.org/openlayers/wiki/D ... ev/proj4js у меня не получается: или так же не корректно отображает, или не выводит карту
Код: Выделить всё
<head>
<title>Example</title>
<script
src="http://localhost/OpenLayers-2.13.1/OpenLayers.js"></script>
<script
</head>
<body>
<!-- Создаем div, в котором будет отображаться карта -->
<div id="YaMap" style="border:1px solid #c6c6c6;width=85%;height=85%;"></div>
<!-- Код, описывающий карту -->
<script type="text/javascript">
// Функция, возвращающая адреса тайлов Яндекс.Карты
function yandex_getTileURL(bounds) {
var r = this.map.getResolution();
var maxExt = (this.maxExtent) ? this.maxExtent : YaBounds;
var w = (this.tileSize) ? this.tileSize.w : 256;
var h = (this.tileSize) ? this.tileSize.h : 256;
var x = Math.round((bounds.left - maxExt.left)/(r * w));
var y = Math.round((maxExt.top - bounds.top)/(r * h));
var z = this.map.getZoom();
var lim = Math.pow(2, z);
if (y <0>= lim) {
return OpenLayers.Util.getImagesLocation() + "404.png";
} else {
x = ((x % lim) + lim) % lim;
var url = (this.url) ? this.url : "http://vec02.maps.yandex.net/";
return url + "tiles?l=map&v=2.2.3&x=" + x + "&y=" + y + "&z=" + z;
}
};
// Границы Яндекс.Карты в пикселях
var YaBounds = new OpenLayers.Bounds(-20037508, -20002151, 20037508, 20072865);
// Объект карты
var map = new OpenLayers.Map('YaMap', {
projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
units: "m",
maxResolution: 156543.0339,
maxExtent:new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508.34)
});
// Слой Яндекс.Карты
var yandexMaps =
new OpenLayers.Layer.TMS("Yandex.Maps", "http://vec02.maps.yandex.net/",
{
maxExtent: YaBounds,
type: "png",
getURL: yandex_getTileURL,
numZoomLevels: 18,
attribution: '<a href="http://beta-maps.yandex.ru/">Яндекс.Карты</a>',
transitionEffect: 'resize',
});
// Слой MapServer.Карты
var wms = new OpenLayers.Layer.WMS( "Слой",
"http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/setka.map&",
{layers: 'setka',transparent: "true",
},
{wrapDateLine: true});
// Добавляем на карту слои yandexMaps и OpenStreetMap
map.addLayers([yandexMaps, new OpenLayers.Layer.OSM, wms]);
// Добавляем контрол переключения слоев
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
// Начальный зум, с которым загружается карта
map.zoomTo(9);
// Центр карты
var proj = new OpenLayers.Projection("EPSG:4326");
var point = new OpenLayers.LonLat(50.28, 50.06);
map.setCenter(point.transform(proj, map.getProjectionObject()));
</script>
</script>
</body>
</html>
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: OpenLayers+Yandex
Давно не работал с Yandex в OpenLayers, но насколько я помню для этого есть полноценный класс.
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Интересующийся
- Сообщения: 21
- Зарегистрирован: 04 мар 2014, 12:21
- Репутация: 0
Re: OpenLayers+Yandex
А есть действующий пример?
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: OpenLayers+Yandex
Да, вот. Слой с подложкой Yandex можно включить в списке слоёв в группе "Базовые карты".
Spatial is now, more than ever, just another column- The Geometry Column.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость