[Openlayers] маркеры, слои, проекции

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Zim-a
Новоприбывший
Сообщения: 2
Зарегистрирован: 18 ноя 2012, 03:44
Репутация: 0

[Openlayers] маркеры, слои, проекции

Сообщение Zim-a » 18 ноя 2012, 04:19

Здравствуйте, я очень начинающий.
Хочу сделать карту, на которой можно отображать маркеры.
Посмотрел много примеров.
Но так и не понял насчет проекций.

Я создаю карту, принудительно задаю ей projection "EPSG:4326" (как я понимаю это обычные координаты долгота/широта в градусах), displayProjection тоже "EPSG:4326".

Добавляю слой карт OSM (Мапник он называется вроде).
Как я понимаю у его тейлов другая проекция - 'EPSG:900913' (центр в пересечении экватора и нулевого меридиана, отсчет в метрах).

Добавляю свой слой, на котором будут маркеры.
Задаю ему projection "EPSG:4326".

Пытаюсь добавлять туда маркеры (вектор - точки).
Я предполагал что добавлять точки в этот слой я буду указанием просто широты и долготы. А получается что чтобы точку показало в правильном месте мне надо обязательно преобразовывать координаты.

Почему?

Вот мой код:
Создание карты:

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

		var map;
            map = new OpenLayers.Map('map', {  displayProjection: new OpenLayers.Projection("EPSG:4326"),   
						projection: new OpenLayers.Projection("EPSG:4326"), controls: [new OpenLayers.Control.Navigation(),
                        new OpenLayers.Control.PanZoomBar()]
            });

Создание слоя карт OSM:

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

            var mapnik = new OpenLayers.Layer.OSM('OSM mapnik');

            map.addLayer(mapnik);
Создание слоя маркеров:

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

			var Markers = new OpenLayers.Layer.Vector("Markers" , {projection: new OpenLayers.Projection("EPSG:4326")} );
			map.addLayer(Markers);
Координаты маркеров:

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

            // координаты маркеров
            var GeoPointKiev = new OpenLayers.Geometry.Point(30.565469,50.435782);

            var OSMPointKiev = new OpenLayers.Geometry.Point(30.565469,50.435782).transform("EPSG:4326", 'EPSG:900913');
Весь код:

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>OpenLayers Example</title>
    <style>
        html, body, #map_canvas
        {
            margin: 0;
            padding: 0;
            height: 100%;
        }
    </style>
	<script src="http://openlayers.org/api/OpenLayers.js" type="text/javascript"></script>
    <script type="text/javascript">
		var map;
        function InitMap() {
						
            map = new OpenLayers.Map('map', {  displayProjection: new OpenLayers.Projection("EPSG:4326"),   
						projection: new OpenLayers.Projection("EPSG:4326"), controls: [new OpenLayers.Control.Navigation(),
                        new OpenLayers.Control.PanZoomBar()]
            });

            // слой карты
            var mapnik = new OpenLayers.Layer.OSM('OSM mapnik');

            map.addLayer(mapnik);

            //  слой маркеров
			var Markers = new OpenLayers.Layer.Vector("Markers" , {projection: new OpenLayers.Projection("EPSG:4326")} );
			map.addLayer(Markers);
			
            //alert(Markers.projection);

            // координаты маркеров
            var GeoPointKiev = new OpenLayers.Geometry.Point(30.565469,50.435782);

            var OSMPointKiev = new OpenLayers.Geometry.Point(30.565469,50.435782).transform("EPSG:4326", 'EPSG:900913');

            // пример с хабры
            var marker1 = new OpenLayers.Feature.Vector(
                //долгота/широта
                GeoPointKiev,
                //данные по вкусу
                    {},
                //Стиль, как отрисовывать
                    {
                        //рисуем картинку
                        externalGraphic: 'http://www.openlayers.org/dev/img/marker.png',
                        //вот такой ширины
                        graphicWidth: 21,
                        //вот такой вышины *
                        graphicHeight: 25,
                        //сместив картинку на 8 пикселей влево 
                        //относительно координат геометрии
                        graphicXOffset: -8,
                        //и на 16 пикселей вверх
                        graphicYOffset: -16,
                        //с милой подписью (подпись будет выводиться прямо на карту)
                        label: 'GeoPoint',
                        //с базовой точкой текста подписи посередине-сверху текста
                        labelAlign: 'ct',
                        //сдвинув текст на 5 пикселей вниз
                        labelYOffset: '5'
                    }
                );

            var marker2 = new OpenLayers.Feature.Vector(
                //долгота/широта
                OSMPointKiev,
                //данные по вкусу
                    {},
                //Стиль, как отрисовывать
                    {
                        //рисуем картинку
                        externalGraphic: 'http://www.openlayers.org/dev/img/marker.png',
                        //вот такой ширины
                        graphicWidth: 21,
                        //вот такой вышины *
                        graphicHeight: 25,
                        //сместив картинку на 8 пикселей влево 
                        //относительно координат геометрии
                        graphicXOffset: -8,
                        //и на 16 пикселей вверх
                        graphicYOffset: -16,
                        //с милой подписью (подпись будет выводиться прямо на карту)
                        label: 'OSMPoint',
                        //с базовой точкой текста подписи посередине-сверху текста
                        labelAlign: 'ct',
                        //сдвинув текст на 5 пикселей вниз
                        labelYOffset: '5'
                    }
                );

                Markers.addFeatures([marker1, marker2]);

                map.zoomToMaxExtent();
        }
    </script>
</head>
<body onload="InitMap()">
    <div style="width: 100%; height: 100%" id="map"></div>
</body>
</html>
Вот как-то так оно сейчас получается:
http://windy.p.ht/OSM3.html

Мне хотелось бы, чтобы на Киев показывала GeoPoint. Возможно ли это?
Подскажите пожалуйста, что не так.

dooh007
Интересующийся
Сообщения: 24
Зарегистрирован: 22 июл 2011, 09:50
Репутация: 2
Контактная информация:

Re: [Openlayers] маркеры, слои, проекции

Сообщение dooh007 » 18 ноя 2012, 19:31

Потому что OSM это БАЗОВЫЙ слой и он в проекции EPSG:900913 как ты понял уже сам.

Zim-a
Новоприбывший
Сообщения: 2
Зарегистрирован: 18 ноя 2012, 03:44
Репутация: 0

Re: [Openlayers] маркеры, слои, проекции

Сообщение Zim-a » 18 ноя 2012, 23:07

Но я же добавляю не на базовый слой, а на Markers

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

var Markers = new OpenLayers.Layer.Vector("Markers" , {projection: new OpenLayers.Projection("EPSG:4326")} );

Ответить

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

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

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