OpenLayers: начало работы

Обсуждение материалов сайта: вопросы, замечания, предложения
Аватара пользователя
Bzzzuka
Участник
Сообщения: 81
Зарегистрирован: 12 окт 2009, 13:06
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers: начало работы

Сообщение Bzzzuka » 04 окт 2010, 12:22

Да шейп с файлом проекции отдельно.. пока не могу посмотреть.. не дома.. Но геосервер кстати эту проекцию не определил

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers: начало работы

Сообщение Mavka » 04 окт 2010, 13:02

По цифрам похоже на "Пулково 1942 зона 8", это epsg:28407.
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Bzzzuka
Участник
Сообщения: 81
Зарегистрирован: 12 окт 2009, 13:06
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers: начало работы

Сообщение Bzzzuka » 04 окт 2010, 21:44

PROJCS["unnamed",GEOGCS["unnamed",DATUM["D_PULKOVO-1942",SPHEROID["unnamed",6378137,298.257223563]],PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",51],
PARAMETER["scale_factor",1],PARAMETER["false_easting",9500000],
PARAMETER["false_northing",0],UNIT["METER",1]]

Аватара пользователя
Bzzzuka
Участник
Сообщения: 81
Зарегистрирован: 12 окт 2009, 13:06
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers: начало работы

Сообщение Bzzzuka » 04 окт 2010, 22:00

Кстати никто не подскажет адреса wms серверов.. мне нужен 1 со спутниковыми снимками и один с растровой подложкой, на территорию Татарстана.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers: начало работы

Сообщение Mavka » 05 окт 2010, 12:08

Проекция - epsg:28409 (9-я зона). Её и вписать в GeoServer'е.
Кстати никто не подскажет адреса wms серверов..
Он один - VMap0: http://labs.metacarta.com/wms/vmap0
Остальные со своим API и тараканами по использованию - Google, Bing и т.д..
Из новенького - CloudMade. Он тайловый (TMS). Мне нравится, но пока не разбирался в лицензиях.
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Bzzzuka
Участник
Сообщения: 81
Зарегистрирован: 12 окт 2009, 13:06
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers: начало работы

Сообщение Bzzzuka » 09 окт 2010, 19:08

Подскажите в чем проблема? var bounds и var options не работают

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

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>OpenLayers map preview</title>
      <link rel="stylesheet"href="http://localhost:8080/geoserver/www/openlayers/theme/default/style.css" type="text/css" />
      <link rel="stylesheet" href="style.css" type="text/css" />
      <script src="http://localhost:8080/geoserver/www/openlayers/OpenLayers.js"></script>
      <script 

src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8d

tzKET_EteAjPdGDwqpQ'></script>

      <script type="text/javascript">
	// Задаем глобальные переменные для правильной
        // отладки в Firebug
	
	var map = null;
	
	function init(){
			
			
	    map = new OpenLayers.Map('map');


	    var gmap = new OpenLayers.Layer.Google(
                "Google Streets", // the default
                {numZoomLevels: 20}
            );

            var gsat = new OpenLayers.Layer.Google(
                "Google Satellite",
                {type: G_SATELLITE_MAP, numZoomLevels: 22}
            );

	    var t1_wms = new OpenLayers.Layer.WMS(
                "Tatarstan bounds",
                "http://localhost:8080/geoserver/wms", 
		{layers: 'Tatarstan:tatar_region', 
                transparent: "true",
                format: "image/png"},
                {isBaseLayer: false, visibility: false}
	    );

	    var t2_wms = new OpenLayers.Layer.WMS(
                "Tatarstan city",
                "http://localhost:8080/geoserver/wms", 
		{layers: 'Tatarstan:contour_region', 
                transparent: "true",
                format: "image/png"},
                {isBaseLayer: false, visibility: false}
	    );	

	    var bounds = new OpenLayers.Bounds(
                9259037.001, 5985816.934,
                9705598.098, 6283991.955
	    );
	
	    var options = {
		maxExtent: bounds,
                maxResolution: 1744.3792851562466,
		projection: "EPSG:28409",
                units: 'degrees'
            };

	    map.addLayers([gmap, gsat, t1_wms, t2_wms]);
            map.addControl(new OpenLayers.Control.LayerSwitcher());
            map.zoomToMaxExtent();
		
	}

      </script>
  </head>
  <body onload="init()">
    <h1 id="title">Несколько слоев</h1>
     <p>
        Демонстрация простейшей картой с несколькими слоями
     </p>
     <div style="width: 512px; height: 341px; border: 2px solid black;" id="map"></div>
  </body>
</html>

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers: начало работы

Сообщение Mavka » 09 окт 2010, 19:24

Вы их определяете, но нигде не используете. Попробуйте так:

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

var bounds = new OpenLayers.Bounds(
    9259037.001, 5985816.934,
    9705598.098, 6283991.955
);
   
var options = {
    maxExtent: bounds,
    maxResolution: 1744.3792851562466,
    projection: "EPSG:28409",
    units: 'degrees'
};

map = new OpenLayers.Map('map', options); 
Замечу, что для EPSG:28409 должны быть untis: 'm'.
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Bzzzuka
Участник
Сообщения: 81
Зарегистрирован: 12 окт 2009, 13:06
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers: начало работы

Сообщение Bzzzuka » 09 окт 2010, 19:38

Спасибо, теперь они заработали но не так как мне нужно.. я хотела что бы в окне карты был только Татарстан но видимо произошел конфликт с гугловскими подложками, теперь он показывает верхнюю часть гугловской подложки и все... вверх вниз не работают, options нужно добавить в каждое объявление слоя?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers: начало работы

Сообщение Mavka » 09 окт 2010, 20:07

Получается, что координаты нужно задавать в WGS84 (что лично меня сильно удивило):

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

var bounds = new OpenLayers.Bounds(
    47.33, 54.13, 54.27, 56.54
);  
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Bzzzuka
Участник
Сообщения: 81
Зарегистрирован: 12 окт 2009, 13:06
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers: начало работы

Сообщение Bzzzuka » 09 окт 2010, 20:23

уже лучше.. только вот мои слои теперь не видно потому наверно они куда нить ни туда улетели.. ведь проекция у них явно не wgs, и куда девать вот эту строчку? projection: "EPSG:28409",

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Небольшое отступление о проекциях

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

Небольшое отступление о проекциях
Поднакопилось типовых вопросов.

WMS сервер (GeoServer, UMN MapServer, etc.)
При создании слоя как правило требуется указать в какой проекции находятся исходные данные (shapefile, БД и т.п.). В дальнейшей работе сервисов эта проекция нигде не проявляет. Типовой запрос на сервер WMS:

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

http://server.com/wms?
SERVICE=WMS&
&SRS=EPSG:4326
&BBOX=-180,-90,180,90
... 
включает в себя систему координат (SRS) и охват (BBOX) требуемой карты. (Обратите внимание, что BBOX всегда задается в единицах соответствующей SRS - скажем, для epsg:900913 охват будет задаваться в метрах от -20037508.34 до +20037508.34). Получив запрос, сервер перепроецирует исходные данные в требуемую СК. Т.е. клиенты (OpenLayers, Qgis и т.п.) не знают (и не должны знать!) в какой проекции хранятся данные.

UMN MapServer
В файле настроек дополнительно указывается проекция на уровне MAP:

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

MAP

EXTENT -180 -90 180 90
PROJECTION
    "init=epsg:4326"
END # proj

LAYER
    NAME "mylayer"
    DATA ...
    PROJECTION
        "init=epsg:28409"
    END # proj
END # layer

END
Она совместно с EXTENT определяет полный охват карты и на то в какой проекции хранятся данные слоев не влияет.

В отличие от GeoServer и UMN MapServer, по-умолчанию, принимает запросы от клиентов только в соответствии со списком проекции, внесенных в wms_srs:

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

WEB
  METADATA
    "wms_srs"             "EPSG:900913 EPSG:4326"
  END
END
Опять же, к проекции исходных данных этот параметр не имеет отношения.

Общее
Суть выше описанного состоит в том, что:
  1. Сервер должен знать в какой СК хранятся данные;
  2. Понимать какую СК от него требуют клиенты;
  3. Уметь преобразовывать 1-е во 2-е.
OpenLayers
Когда создается карта:

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

map = new OpenLayers.Map('map',
      {projection: "EPSG:28409"}
) 
в свойстве projection указывается проекция, в которой вы хотите увидеть всю карту. При этом, если используются такие слои как Google Maps и OSM (обычно в качестве подложки), то они автоматически и жёстко включают проекцию epsg:900913 (меркатор на сфере).

При подключении слоя WMS указывать проекцию не требуется. Теоретически, она может быть любой (в рамках дозволенного - EPSG, ESRI, SR-ORG и т.д.). OpenLayer делает запрос на сервер WMS в соответствии с проекцией карты. Если map.projection в процессе работы изменяется, то все слои заново запрашиваются на сервере WMS с указанием новой проекции.
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers: начало работы

Сообщение Mavka » 04 ноя 2010, 15:28

Дано хотел высказать мысль про использование параметра 'map' в таком контексте:

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

var basemap = new OpenLayers.Layer.WMS("Boston",
    "http://boston.freemap.in/cgi-bin/mapserv?",
    {
        map: '/www/freemap.in/boston/map/gmaps.map',
        ...
    }
); 
Если мы используем параметры, которые отсутствуют у класса, то они будут просто подставлены в строку запроса к серверу:

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

http://gis-lab.info/cgi-bin/mapserv
?SERVICE=WMS
&VERSION=1.1.1
...
&map=/www/freemap.in/boston/map/gmaps.map  
Т.е. OpenLayers их никак не обрабатывает. Таким же способом я применяю стили SLD и фильтры различных мастей.

Но дело в том, что свойство 'map' в реальности присутствует у прародителя - OpenLayers.Layer. Особо не интересовался его функциональностью, но судя по описанию используется оно не часто. И возможна ситуация когда оно все-таки получит свое значение и работа сервиса WMS прервется. Так что лучше использовать в 'url' полный идентификатор сервиса WMS:
лангольеры под окном жрали время ом-ном-ном

koma
Новоприбывший
Сообщения: 1
Зарегистрирован: 01 фев 2011, 16:54
Репутация: 0

Re: OpenLayers: начало работы

Сообщение koma » 01 фев 2011, 17:28

Добрый день!

Передо мной поставлена следующая задача:

Есть картра складского помещения в растре, в разных масштабах.
Могу ли я "порезав" эту карту на тайлы, затем отображать ее в браузере пользователя (естесственно с функциями скроллинга, масштабирования, кликания по объектам и передачи информации о клике для обработки на спец сервера)

если да, то наведите пожалуйста на то, как это можно сделать
(насколько я понимаю, тайлы должны хранится в виде http://myserver.com/map/5/1567.png?)
спасибо за любую помощь!

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers: начало работы

Сообщение Mavka » 02 фев 2011, 13:09

Если вас устроит просмотр больших картинок с зумом, то подойдет IIPImage. Без координат, линеек и прочих заморочек настоящих карт. Он в принципе и создавался для старинных карт без привязки.
лангольеры под окном жрали время ом-ном-ном

vzik19
Интересующийся
Сообщения: 35
Зарегистрирован: 10 авг 2010, 15:02
Репутация: 0

Re: OpenLayers: начало работы

Сообщение vzik19 » 01 мар 2011, 15:04

Bzzzuka писал(а):

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>OpenLayers Example</title>
    <script
    src="http://localhost:8080/geoserver/www/openlayers/OpenLayers.js"></script>
    </head>
    <body>
      <div style="width:100%; height:100%" id="map"></div>
      <script defer="defer" type="text/javascript">
        var map = new OpenLayers.Map('map');
        var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
    "http://localhost:8080/geoserver/wms",
    {layers: 'Tatarstan:tatar_region'});
	map.addLayers([wms]);
    map.zoomToMaxExtent();
      </script>
	</body>  
</html>
подскажите где здесь может быть ошибка.. карта не отображается.. есть только иконки зума
все дело в строке
map.addLayers([wms]);
как раз хотела спросить, почему при указании нескольких wms слоев в квадратных скобках пропадает карта? сейчас подгружаю каждый слой отдельно как
map.addLayer(adm_wms);
Еще у меня вопрос по кодировке, если я использую дополнительные элементы управления из gis-lab.info/qa/openlayers-begin.html, то у меня буквы иероглифами, все читается при изменении кодировки на utf-8, в коде вставляю строчку
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">, опять иероглифы, у кого как?

Ответить

Вернуться в «Материалы сайта»

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

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