Использование базового слоя двух разных проекций (Spherical Mercator и WGS84) в OpenLayers

9

Как добавить базовый слой с двумя разными проекциями?

Я добавил оверлей с другой проекцией (EPSG: 4326), но мне нужно добавить базовый слой с другой проекцией

  1. Карты Гугл
  2. Мой векторный слой с EPSG: проекция 4326

Я вижу, что все в порядке с Google Maps, но когда я переключаю базовый слой на слой EPSG: 4326, все становится белым.

window.onload = function init(){
                var lon = 84;
                var lat = 28;
                var zoom = 8;
                var url = "http://10.6.7.6/geoserver/wms";

                var mapControls = [
                    new OpenLayers.Control.Navigation(),
                    new OpenLayers.Control.PanZoomBar(),
                    new OpenLayers.Control.LayerSwitcher({'ascending':false}),                       
                    new OpenLayers.Control.ScaleLine(),
                    new OpenLayers.Control.MousePosition(),
                    new OpenLayers.Control.OverviewMap(),
                    new OpenLayers.Control.KeyboardDefaults()
                ];

                var map = new OpenLayers.Map(
                'map', 
                {       
                    numZoomLevels: 21,
                    projection: new OpenLayers.Projection("EPSG:900913"),
                    displayProjection: new OpenLayers.Projection("EPSG:4326"),
                    controls: mapControls 
                });


                var dsb = new OpenLayers.Layer.WMS( 
                "Nepal Border",
                url,                
                {layers: 'GisData:IR'}                        
            );  

                var gmap_gs = new OpenLayers.Layer.Google(
                "Google Streets",// the default 
                {'sphericalMercator': true}                 

            );




                var dG = new OpenLayers.Layer.WMS( 
                "2G Down Sites",
                url, 
                {layers: 'GisData:dG', transparent: "true",format: "image/png"},
                {
                    isBaseLayer: false,
                    buffer: 0
                });


                map.addLayers([dsb, dG,gmap_gs]);
                var proj = new OpenLayers.Projection("EPSG:4326");
                var point = new OpenLayers.LonLat(lon,lat);

                point.transform(proj, map.getProjectionObject());

                map.setCenter(point, zoom);

            }
Kinkajou
источник

Ответы:

5

Я недавно изучал это, и это один из лучших результатов поиска, и я решил добавить крошки в свои исследования и эксперименты.

Длинный и короткий:

Линия открытых слоев 2.X не поддерживает это. Карта, ее свойства, такие как центр, разрешение и экстенты, задаются начальным базовым слоем карты. Переход на другой базовый слой НЕ регулирует эти свойства, поэтому результат неизвестен. Часто вы получаете центральную точку / границы, которые недопустимы для базового слоя, на который вы меняете, поэтому вы видите белые плитки. Но это не всегда результат (например, переключение с 4326 на 900913 приведет вас к точке, близкой к 0degN, 0degE).

Но надежда не потеряна.

Ближайшее:

Некоторые патчи были написаны для открытых слоев, которые пытаются исправить это для карты и многих слоев (см. [1]). Это происходит из-за ошибки, поданной более 6 (6 !!!) лет назад [2]. Хотя вам придется разместить свою собственную версию OL и исправить ее вручную (исправление не будет применяться корректно к последним версиям, поэтому вам придется вручную редактировать), это приведет вас в основном к тому месту, где вы хотите быть. Очень неприятно и не справляется со всем, но в целом получает того, кому НУЖНО несколько базовых слоев с разными выступами на ногах.

Долгосрочный

Это как раз то, что OpenLayers 3.0 надеется решить [3].

Одним из примеров является дихотомия базовый слой / наложение. Часто бывает сложно узнать, как и где устанавливать разрешения, maxExtent и т. Д. Для карты. Обработка проекции между картой и слоями и взаимодействие между проекцией и свойствами, такими как maxExtent и center, в лучшем случае сложны.

Объект Map в 2.X слишком сильно зависел от базового слоя, и это изменится в будущем. Так что, если вы сможете продержаться до конца 2013 года, вам может быть предложено готовое решение.

[1] http://trac.osgeo.org/openlayers/attachment/ticket/1249/NEW.Reproject.patch
[2] http://trac.osgeo.org/openlayers/ticket/1249
[3] http: / /openlayers.org/blog/2012/11/14/why-are-we-building-openlayers-3/

Джонс
источник
1

здесь есть что-то вроде вашего вопроса, как перепроектировать базовые слои в OpenLayers? и вы получите некоторую информацию о преобразовании, вы должны посмотреть это, Создание сферических растровых изображений Mercator.

Подводя итог кратко из первого поста:

  1. OpenLayers может преобразовывать векторные слои (например, WFS).
  2. Растровые слои не могут быть преобразованы OpenLayers.
  3. Любой хороший WMS должен иметь возможность сделать перепроектирование для вас.
  4. ArcGIS Server не может предоставить слои в 900913, потому что этот wkid не поддерживается. 3857, с другой стороны ...!

и со второй ссылки:

Одна из причин, по которой проекция сферического Меркатора так важна, заключается в том, что она является единственной проекцией, которая позволит правильно наложить данные изображения поверх коммерческих слоев, таких как Google Maps. При использовании растровых изображений в браузере невозможно перепроецировать изображения так же, как в «толстом» ГИС-клиенте. Вместо этого все изображения должны быть в одной проекции. Как создавать проекционные плитки Spherical Mercator, зависит от программного обеспечения, которое вы используете для создания ваших изображений.

Важная вещь здесь:

using raster images, in the browser, it is not possible to reproject the images
in the same way it might be in a thick GIS client.

и для преобразования набора данных, мой ответ может помочь вам в этом, здесь .

я надеюсь, что это поможет вам ...

Арагон
источник
Я добавил код с proj4js, который работает для оверлеев, но не для 2 разных базовых слоев. Любой комментарий по этому поводу?
kinkajou
1

Настройте свой слой WMS без каких-либо ссылок на 900913 (при условии, что ваши данные находятся в 4326). Затем, когда вы добавляете слой в OpenLayers, убедитесь, что вы установили проекцию карты на 900913 (или просто сначала добавьте Google Карты). Затем, когда вы добавляете слой WMS, OpenLayers будет запрашивать данные в проекции карты (900913), а GeoServer будет перепроектировать с 4326 до 900913 на лету.

Ян Тертон
источник
Добавил код. Есть проблема при переключении между этими слоями. Когда я сначала загружаю слой с WGS 4326 в качестве базового слоя и сохраняю уровень масштабирования, все нормально, после того как я переключился на слой Google и немного панорамировал карту, все исчезло.
kinkajou
Изменить map.addLayers ([dsb, dG, gmap_gs]); to map.addLayers ([gmap_gs, dsb, dG]);
Ян Тертон
показывает карту Google при первой загрузке, но все еще не может переключить слой. Ошибка при переключении
kinkajou
0

В общем случае это невозможно, поскольку OpenLayers устанавливает проекцию карты из базового слоя.

Один из возможных обходных путей - использовать каскадную WMS, такую ​​как GeoServer, для перепроецирования одного из базовых слоев с одного на другой проект.

Ян Тертон
источник
0

Я только что применил патч к ol 2.13.1 (из тега)

Последний файл патча из trac не работал, когда не было указано limitExtent, поэтому я также исправил его.

Вы можете получить его здесь вместе с примером текста:

https://github.com/glferri/ol2-reproj-2.13.1/blob/master/OL.Reproject_2.13.1_fixRestrictedExtent.patch

Джанлука Ферри
источник