Перепроектування базових шарів у OpenLayers


9

У мене є карти з кахельним покриттям з вектора / топо / зображення для деяких місць Північної Америки, які були опубліковані як сервіс REST ArcGIS Server. Ці карти (А) базуються в проекції EPSG: 26912. Тепер я хочу використовувати їх як базову карту для свого веб-додатка OpenLayers; окрім того, я також хочу споживати інші джерела базових карт (B), наприклад, OpenStreetmap, Google Maps, ESRI тощо. Оскільки більшість цих карт є у форматі EPSG: 900913, що, як мені відомо, є сферичним проекцією Меркатора. базові шари карти в компоненті карти OpenLayers, група A і група B не будуть накладатися належним чином, це означає, що вони відображаються як окремі карти.

Я знаю, що це щось пов'язане з проекцією, і може знадобитися якийсь код з proj4js, однак, як новачок, я не знаю, з чого саме почати.

В основному, я хочу розмістити карти OSM / Google як базову карту для всього світу в рівні 1, а потім поставити EPSG: 26912 базових карт для деяких місць Північної Америки в 2-й рівень, а інші версії WMS або WFS поставити у верхній рівень.

мені потрібно перетворити EPSG: 26912 в EPSG: 900913 або навпаки? Я думаю, я повинен використовувати EPSG: 900913 в якості базової проекції.


1
Як я коментував відповідь @ iant нижче, програмне забезпечення Esri не підтримує wkid 900913, але підтримує ту саму систему координат, що і wkid EPSG: 3857 або ESRI: 102100.
mkennedy

Відповіді:


7

OpenLayers можуть трансформувати векторні шари (наприклад, WFS). Якщо ваш векторний шар знаходиться в форматі EPSG: 900913 або EPSG: 4326 OpenLayers може сам перетворити трансформацію, інакше для нього потрібен Proj4js.

Є приклади, як використовувати OpenLayers з Proj4js.

Растрові шари не можуть бути перетворені OpenLayers. Якщо вам потрібно включити їх в іншу проекцію, вам доведеться їх самостійно відхилити або використовувати репроектуючи WMS-проксі, наприклад GeoWebCache .


4

Будь-яка хороша WMS повинна бути спроможна зробити репроекцію для вас. Однак я не маю уявлення, чи є ArcGIS Server хорошим WMS. Якщо він не в змозі надати шар у 900913, то розгляньте можливість використання GeoServer або MapServer як каскадної WMS для обробки перепроекції для вас.


3
ArcGIS Server не може надати шари в 900913, оскільки цей wkid не підтримується. 3857, з іншого боку ...!
mkennedy

вам потрібні docs.openlayers.org/library/… тоді
Ian Turton

2

Я не гуру OpenLayers, але вам потрібно вказати проекцію об’єкта карти. Я думаю, що за замовчуванням WGS84 .... я можу помилитися, я можу бути навіть джерелом першого шару, доданого до карти.

У будь-якому випадку спробуйте щось подібне (змініть межі відповідно)

var googleMercator = new OpenLayers.Projection("EPSG:900913");
var wgs84 = new OpenLayers.Projection("EPSG:4326");
var options = {
    projection: googleMercator,
    units: "m",
    numZoomLevels: 18,
    maxResolution: 156543.0339,
    maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508.34),
    displayProjection: wgs84,
    controls:[new OpenLayers.Control.Navigation()]}

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

Але тоді пам’ятайте, коли ви хочете встановити центр карти за допомогою lat, lon, ви повинні спроектувати таку координату від WGS до GoogleMercator, як це (використовуючи змінну wgs84 та googleMercator зверху).

 var mapCenter = new OpenLayers.LonLat(148,-36);
 mapCenter.transform(wgs84, googleMercator);
 map.setCenter(mapCenter,8);

1

Перше, що визначити проекцію вашої карти та відобразити проекцію таким чином:

map.projection = "EPSG:23030";
map.displayProjection = new OpenLayers.Projection("EPSG:4326");

Додавання перетворення координат

Після того, як ви почнете використовувати різні проекції, ви повинні почати думати про можливість перетворення координат з однієї проекції в іншу, або під час відображення цих координат, або під час читання векторних даних у іншій системі координат від карти. Як було сказано раніше, ця логіка перетворення не передбачена OL, тому вам доведеться використовувати Proj4js, який вам доведеться включити на вашу сторінку:

<script src="http://proj4js.org/lib/proj4js-compressed.js"></script>

Proj4js.defs["EPSG:23030"] = "+proj=utm +zone=30 +ellps=intl +towgs84=-131,-100.3,-163.4,-1.244,-0.020,-1.144,9.39 +units=m +no_defs";

після визначення ви можете це зробити методом перетворення:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.