OpenLayers. Начало работы. проекции

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Alone
Интересующийся
Сообщения: 31
Зарегистрирован: 20 дек 2011, 23:32
Репутация: 0

OpenLayers. Начало работы. проекции

Сообщение Alone » 22 дек 2011, 17:30

Добрый день.
Кто может объяснить новичку на пальцах суть проекций?

Пример:
Создаем объект карту и 2 слоя (OSM, layer1)

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

map = new OpenLayers.Map("OSMap",{
    units:'m',
    numZoomLevels:19,
    minResolution: "auto",
    minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
    maxResolution: "auto",
    maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
  });

mapnik = new OpenLayers.Layer.OSM();
map.addLayer(mapnik);

var lon = 36;
var lat = 49;
var lonLat = new OpenLayers.LonLat(lon, lat);
map.setCenter(lonLat, 15);
На векторный слой будут подгружаться векторные объекты через Strategy.BBOX (protocol:HTTP, format:GML), которые имеют координаты в градусах(широта, долгота)
Также, на этом слое будут создаваться векторные объекты, и сохраняться через SaveStrategy

Мне необходимо оперировать координатами только в градусах (широта, долгота)
Как корректно описать проекции, ибо сейчас при попытке выставить центр карты - меня бросает в океан.

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

Re: OpenLayers. Начало работы. проекции

Сообщение Denis Rykov » 22 дек 2011, 18:40

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

var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913"));
Spatial is now, more than ever, just another column- The Geometry Column.

Alone
Интересующийся
Сообщения: 31
Зарегистрирован: 20 дек 2011, 23:32
Репутация: 0

Re: OpenLayers. Начало работы. проекции

Сообщение Alone » 22 дек 2011, 18:49

Хорошо, согласен. OSM захардкоден в 900913, поэтому при центрировании карты необходим трансформ.
А как быть, если я добавляю свой векторный слой, на который подгружаю объекты с координатами в epsg:4326?
А помимо этого я еще и добавляю объекты на этот слой... И тоже в 4326 :(
Я почему то представлял себе что достаточно векторному слою сказать, в какой проекции он будет работать и все наносимые на него объекты с координатами в 4326 будут отображаться корректно.

UPD:
Сделал так:

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

var proj_google = new OpenLayers.Projection("EPSG:900913");
var proj_4326 = new OpenLayers.Projection("EPSG:4326");

map = new OpenLayers.Map("OSMap", {
    projection: proj_4326,
    displayProjection: proj_4326,
    units:'m',
    numZoomLevels:19,
    minResolution: "auto",
    minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
    maxResolution: "auto",
    maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
  });

mapnik = new OpenLayers.Layer.OSM("Mapnik");
mapnik.projection = proj_4326; //(1)
map.addLayer(mapnik);

vectors = new OpenLayers.Layer.Vector("Vector_Layer", {
    projection:proj_4326,
    rendererOptions:{zIndexing:true},
    renderers:renderer,
    strategies:[
      new OpenLayers.Strategy.BBOX(),
      saveStrategy
    ],
    protocol:new OpenLayers.Protocol.HTTP({
      url:"/test.xml",
      format:new OpenLayers.Format.GML({
        ignoreExtraDims:false
      })
    })
  });
  map.addLayer(vectors);
Если закоментарить (1) то подгружаемые объекты (с координатами в 4326) отображаются, и стоят на правильных позициях.
Если (1) оставить как сейчас, то подгружаемые объекты вообще не видны на карте.
Во как... :(

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

Re: OpenLayers. Начало работы. проекции

Сообщение Denis Rykov » 22 дек 2011, 20:56

Запись вида:

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

mapnik.projection = proj_4326
лишена смысла по причине того, что слой OSM находится в проекции 900913, команда же выше говорит, что ваш слой находится якобы в 4326 и в связи с чем OpenLayers не перепроецирует ваш вектор, считая что он и так уже в проекции базового слоя. За то, чтобы вектор автоматом перепроецировался в 900913 отвечает миксин SphericalMercator, то есть по дефолту в слое OpenLayers.Layer.OSM прописано "sphericalMercator: true", следовательно при использовании его в качестве базового все оверлеи из 4326 будут автоматом трансформироваться в 900913.
Spatial is now, more than ever, just another column- The Geometry Column.

Alone
Интересующийся
Сообщения: 31
Зарегистрирован: 20 дек 2011, 23:32
Репутация: 0

Re: OpenLayers. Начало работы. проекции

Сообщение Alone » 23 дек 2011, 11:35

Денис, спасибо за ответ.
А как вы можете разъяснить тот момент, когда я с помощью интерфейса добавляю например поинт на карту в 35 48, а потом через firebug смотрю ее координаты, и вижу гугловские, 6ти значные?

Возможен ли вообще такой вариант, что бы я оперировал координатами только в 4326? И на сервере и в слоях, при использовании в качестве базового слоя OSM?
Спасибо.

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

Re: OpenLayers. Начало работы. проекции

Сообщение Denis Rykov » 23 дек 2011, 12:56

Alone писал(а):А как вы можете разъяснить тот момент, когда я с помощью интерфейса добавляю например поинт на карту в 35 48, а потом через firebug смотрю ее координаты, и вижу гугловские, 6ти значные?
Вы же добавляете точку в некоторый векторный слой, поэтому при использовании OSM в качестве базового, все объекты векторных оверлеев автоматом приводятся к 900913 (из 4326).
Alone писал(а):Возможен ли вообще такой вариант, что бы я оперировал координатами только в 4326? И на сервере и в слоях, при использовании в качестве базового слоя OSM?
Вообще распространена практика хранить исходные данные именно в неспроецированном виде, то есть в градусах. Не вижу никаких сложностей.
Spatial is now, more than ever, just another column- The Geometry Column.

Alone
Интересующийся
Сообщения: 31
Зарегистрирован: 20 дек 2011, 23:32
Репутация: 0

Re: OpenLayers. Начало работы. проекции

Сообщение Alone » 27 дек 2011, 16:31

Вы же добавляете точку в некоторый векторный слой, поэтому при использовании OSM в качестве базового, все объекты векторных оверлеев автоматом приводятся к 900913 (из 4326).
А как объяснить тот случай, когда я непосредственно из кода добавляю на слой точку с координатами в градусах и она у меня рисуется на западном берегу африки, вместо Харькова? Ведь я указал, что векторный слой в проекции 4326. Почему не происходит автоматического пепрепроецирования, как Вы писали?
Вот код, скажите, где я дурак? :)

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

var map, mapnik, controls, vectors, layerMarkers;
var proj_google = new OpenLayers.Projection("EPSG:900913");
var proj_4326 = new OpenLayers.Projection("EPSG:4326");

function GetMap() {
  map = new OpenLayers.Map("OSMap", {
    displayProjection: proj_4326,
    units:'m',
    numZoomLevels:19,
    minResolution: "auto",
    minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
    maxResolution: "auto",
    maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
  });

  createLayers(map);
  setDefaultPoints(map);

  var lon = 36.18622;
  var lat = 49.97816;
  var lonLat = new OpenLayers.LonLat(lon, lat);
  map.setCenter(lonLat.transform(proj_4326, proj_google), 15);

  map.addControl(new OpenLayers.Control.LayerSwitcher());
  map.addControl(new OpenLayers.Control.MousePosition());
}


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

function createLayers(map) {
  mapnik = new OpenLayers.Layer.OSM("Mapnik");
  map.addLayer(mapnik);

  vectors = new OpenLayers.Layer.Vector("Vector_Layer", {
    projection:proj_4326,
    rendererOptions:{zIndexing:true},
    renderers:renderer,
  });
  map.addLayer(vectors);
}

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

function setDefaultPoints(map) {
  var lon = 36.18622;
  var lat = 49.97816;
  var bpoint = new OpenLayers.Geometry.Point(lon, lat);
  var newpoint = new OpenLayers.Feature.Vector(bpoint);
  vectors.addFeatures(newpoint);
}
Спасибо.

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

Re: OpenLayers. Начало работы. проекции

Сообщение Denis Rykov » 28 дек 2011, 05:10

Note that even if you set the projection object on a layer, if you are adding features to the layer manually (via layer.addFeatures), they must be transformed before adding to the layer. OpenLayers will only transform the projection of geometries that are created internally to the library, to prevent duplicating projection work.
Думаю понятно?
Spatial is now, more than ever, just another column- The Geometry Column.

Alone
Интересующийся
Сообщения: 31
Зарегистрирован: 20 дек 2011, 23:32
Репутация: 0

Re: OpenLayers. Начало работы. проекции

Сообщение Alone » 28 дек 2011, 18:26

Исчерпывающе. Спасибо.
Следующий вопрос в новом топике.

Ответить

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

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

Сейчас этот форум просматривают: Bing [Bot] и 1 гость