Використання базового шару двох різних проекцій (Сферичний Меркатор та 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);

            }

Відповіді:


5

Я нещодавно розглядав це питання, і це один із найкращих результатів пошуку. Я зрозумів, що додам трохи сухарів до своїх досліджень та експериментів.

Довгі та короткі:

2.X лінія відкритих шарів це не підтримує. Карта, її властивості, такі як центр, роздільна здатність та розширення, встановлюються INITIAL базовим шаром карти. Перехід на інший базовий шар НЕ коригує ці властивості, тому результат невідомий. Часто ви отримуєте центральну точку / межі, які не відповідають дійсності для базового шару, на який ви змінюєтесь, тому ви бачите білі плитки. Але це не ЗАВЖДИ результат (наприклад, перехід з 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. Під час використання растрових зображень у веб-переглядачі неможливо відтворити зображення так само, як це було б у «товстому» GIS-клієнті. Натомість усі зображення повинні бути в одній проекції. Як створити сферичну плитку 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, який працює для накладок, але не для двох різних базових шарів, будь-який коментар до цього?
kinkajou

1

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


Додано код. Існує проблема при перемиканні між цим шаром. Коли я завантажую шар з WGS 4326 спочатку як базовий шар і підтримую рівень масштабування, це нормально, після того як я перейду на шар google і трохи переміщую карту, це все пропало.
kinkajou

Змінити map.addLayers ([dsb, dG, gmap_gs]); до map.addLayers ([gmap_gs, dsb, dG]);
Ян Тертон

показує карту Google при першому завантаженні, але все ще не може переключити шар. Помилка під час перемикання
kinkajou

0

Взагалі це неможливо, оскільки OpenLayers встановлює проекцію карти з базового шару.

Однією з можливих проблем є використання каскадної WMS на зразок GeoServer для відтворення одного з базових шарів від одного до іншого проекції.


0

Я щойно застосував патч до ol 2.13.1 (з тегу)

Останній файл виправлення з trac не працював, коли не було задано обмеженого Експозиції, тому я його і виправив.

Ви можете отримати його тут, разом із текстовим прикладом:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.