OpenLayers: проекция VectorLayer как в GoogleEarth

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Vagolo
Новоприбывший
Сообщения: 5
Зарегистрирован: 02 дек 2011, 15:01
Репутация: 0

OpenLayers: проекция VectorLayer как в GoogleEarth

Сообщение Vagolo » 02 дек 2011, 15:06

Необходимо в векторном слое, который единственный и базовый, отобразить полигон (данные из KML-файла, созданного в GoogleEarth).
Собственно полигон отображается, но сжатым по вертикали. По всей видимости проблема в проекции...
Но если подключить базовым слоем Google, затем векторный слой с этим же KML-файлом, то все отображается без искажений.
Ниже приведен код с Google и векторным слоями:

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

var geographic = new OpenLayers.Projection("EPSG:4326");
var mercator = new OpenLayers.Projection("EPSG:900913");
var lon = (lonMax-lonMin)/2+lonMin;
var lat = (latMax-latMin)/2+latMin;
var bounds = new OpenLayers.Bounds(lonMin, latMin, lonMax, latMax);
bounds.transform(geographic,mercator);

var zoom = 12;
var options = {
	projection: mercator,
	displayProjection: geographic,
	maxExtent: bounds
};

map = new OpenLayers.Map('map_element', options);

var layer = new OpenLayers.Layer.Google(
             'Google'
             ,{
               type: google.maps.MapTypeId.HYBRID
               ,numZoomLevels: 20
               ,'sphericalMercator': true
              }
);

map.addLayer(layer);

var myKML = new OpenLayers.Layer.GML(
  "KML layer",
  "kml/kml01.kml", 
  {
   format: OpenLayers.Format.KML,
   projection: map.displayProjection
  }
);
map.addLayer(myKML);

var proj = geographic;
var point = new OpenLayers.LonLat(lon, lat);
map.setCenter(point.transform(proj, map.getProjectionObject()), zoom);
Как отобразить kml01.kml в браузере с помощью OpenLayers без искажения? Помогите, плз!

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

Re: OpenLayers: проекция VectorLayer как в GoogleEarth

Сообщение ericsson » 02 дек 2011, 15:36

У окна карты OpenLayers есть свойство - projection. В приведенном примере посмотрите, как оно используется, сделайте также.

Vagolo
Новоприбывший
Сообщения: 5
Зарегистрирован: 02 дек 2011, 15:01
Репутация: 0

Re: OpenLayers: проекция VectorLayer как в GoogleEarth

Сообщение Vagolo » 05 дек 2011, 11:37

ericsson писал(а):У окна карты OpenLayers есть свойство - projection. В приведенном примере посмотрите, как оно используется, сделайте также.
Не получается =(.

Привожу код:

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

    var geographic = new OpenLayers.Projection("EPSG:4326");
    var mercator = new OpenLayers.Projection("EPSG:900913");
    var lon = (lonMax-lonMin)/2+lonMin;
    var lat = (latMax-latMin)/2+latMin;
    var bounds = new OpenLayers.Bounds(lonMin, latMin, lonMax, latMax);
    bounds.transform(geographic,mercator);

    var zoom = 22;
    var options = {
       projection: mercator,
       displayProjection: geographic,
       maxExtent: bounds,
       numZoomLevels: zoom
    };

    map = new OpenLayers.Map('map_element', options);

    var myKML = new OpenLayers.Layer.GML(
      "KML layer",
      {
       isBaseLayer: true,
       projection: map.projection,
       strategies: [new OpenLayers.Strategy.Fixed()],
       protocol: new OpenLayers.Protocol.HTTP({
                                                                      url: "kml/kml01.kml",
                                                                      format: new OpenLayers.Format.KML({})
                                                                    })
      }
    );
    map.addLayer(myKML);

    var proj = geographic;
    var point = new OpenLayers.LonLat(lon, lat);
    map.setCenter(point.transform(proj, map.getProjectionObject()), zoom);
Верно ли рассуждаю?
Координаты в kml01.kml являются LonLat (geographic ).
Если карта должна быть mercator (как задано в options), то необходимо перевести все координаты в mercator:
границы, данные из KML, центр карты.
Подскажите, как KML привести к mercator?
И, вообще, корректен ли собственно код...

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

Re: OpenLayers: проекция VectorLayer как в GoogleEarth

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

Рабочий пример:

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

geographic = new OpenLayers.Projection("EPSG:4326");
mercator = new OpenLayers.Projection("EPSG:900913");

options = {
    projection: mercator,
    maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34, 20037508.34),
    maxResolution: 156543.03390625
};

map = new OpenLayers.Map('map', options);

var baseLayer = new OpenLayers.Layer("No Basemap", {isBaseLayer: true});
var myKML = new OpenLayers.Layer.Vector(
    "KML layer", {
         strategies: [new OpenLayers.Strategy.Fixed()],
         projection: geographic,
         protocol: new OpenLayers.Protocol.HTTP({
             url: "photos.kml",
             format: new OpenLayers.Format.KML()
        })
});
map.addLayers([baseLayer,myKML]);
map.setCenter(new OpenLayers.LonLat(105.2, 72.5).transform(geographic, mercator), 10); 
Spatial is now, more than ever, just another column- The Geometry Column.

Vagolo
Новоприбывший
Сообщения: 5
Зарегистрирован: 02 дек 2011, 15:01
Репутация: 0

Re: OpenLayers: проекция VectorLayer как в GoogleEarth

Сообщение Vagolo » 06 дек 2011, 09:07

_DR_ писал(а):Рабочий пример:

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

geographic = new OpenLayers.Projection("EPSG:4326");
mercator = new OpenLayers.Projection("EPSG:900913");

options = {
    projection: mercator,
    maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34, 20037508.34),
    maxResolution: 156543.03390625
};

map = new OpenLayers.Map('map', options);

var baseLayer = new OpenLayers.Layer("No Basemap", {isBaseLayer: true});
var myKML = new OpenLayers.Layer.Vector(
    "KML layer", {
         strategies: [new OpenLayers.Strategy.Fixed()],
         projection: geographic,
         protocol: new OpenLayers.Protocol.HTTP({
             url: "photos.kml",
             format: new OpenLayers.Format.KML()
        })
});
map.addLayers([baseLayer,myKML]);
map.setCenter(new OpenLayers.LonLat(105.2, 72.5).transform(geographic, mercator), 10); 
Помогло! Спасибо большое!
Моя ошибка заключалась в том, что я создавал только один векторный слой myKML.
Видимо OpenLayers не умеет применять проекции к единственному базовому слою. Или я не прав?
Возможно ли обойтись только одним базовым слоем?

Ответить

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

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

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