OpenLayers+Yandex

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
AntonAD
Участник
Сообщения: 83
Зарегистрирован: 16 июн 2009, 10:38
Репутация: 0

OpenLayers+Yandex

Сообщение AntonAD » 14 окт 2010, 10:51

Столкнулся с такой проблемой при отображении карт Yandex в OpenLayers:
когда пытаюсь приблизиться на какой нибудь дикой местности(там где детализация Яндекса слабовата и по хорошему надо получить сообщение что нет карты нужного масштаба) Яндекс отдает мне в ответ карту того масштаба что у него есть. В итоге отображаемая карта не совпадает с реальным масштабом OpenLayers.

Подскажите как можно этот эффект побороть?

LeXXaT
Новоприбывший
Сообщения: 1
Зарегистрирован: 03 янв 2011, 18:49
Репутация: 0

Re: OpenLayers+Yandex

Сообщение LeXXaT » 03 янв 2011, 18:55

Это происходит вследствие динамического изменения диапазона доступных масштабов в зависимости от текущего вьюпорта:)
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

Сообщение Denis Rykov » 03 янв 2011, 19:33

2LeXXaT
Спасибо за наводку. При использовании версии API Yndex 1.1 в OpenLayers при сдвиге карты с помощью кнопок навигации в FF наблюдалось неприятное моргание карты (причём в IE такой баг отсутствует). При откате на версию - 1.0 проблема исчезла. Библиотека для работы с картами Yandex отсюда.
Spatial is now, more than ever, just another column- The Geometry Column.

dimmer
Новоприбывший
Сообщения: 14
Зарегистрирован: 02 окт 2011, 20:22
Репутация: 0

Re: OpenLayers+Yandex

Сообщение dimmer » 02 окт 2011, 20:26

А как вместо карты включить спутник?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers+Yandex

Сообщение Denis Rykov » 03 окт 2011, 05:19

Код: Выделить всё

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.

dimmer
Новоприбывший
Сообщения: 14
Зарегистрирован: 02 окт 2011, 20:22
Репутация: 0

Re: OpenLayers+Yandex

Сообщение dimmer » 03 окт 2011, 08:29

_DR_, спасибо.

Александр2014
Интересующийся
Сообщения: 21
Зарегистрирован: 04 мар 2014, 12:21
Репутация: 0

Re: OpenLayers+Yandex

Сообщение Александр2014 » 11 апр 2014, 09:33

Помогите пожалуйста с Яндексом, некорректно отображается

Код: Выделить всё

<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>
Пробовал научить OpenLayers проекции EPGS=3395 http://trac.osgeo.org/openlayers/wiki/D ... ev/proj4js у меня не получается: или так же не корректно отображает, или не выводит карту

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers+Yandex

Сообщение Denis Rykov » 11 апр 2014, 16:31

Давно не работал с Yandex в OpenLayers, но насколько я помню для этого есть полноценный класс.
Spatial is now, more than ever, just another column- The Geometry Column.

Александр2014
Интересующийся
Сообщения: 21
Зарегистрирован: 04 мар 2014, 12:21
Репутация: 0

Re: OpenLayers+Yandex

Сообщение Александр2014 » 14 апр 2014, 12:07

А есть действующий пример?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers+Yandex

Сообщение Denis Rykov » 14 апр 2014, 12:28

Да, вот. Слой с подложкой Yandex можно включить в списке слоёв в группе "Базовые карты".
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость