Перепроектирование базовых слоев в OpenLayers


9

У меня есть мозаичные карты вектор / topo / image для некоторых мест в Северной Америке, которые были опубликованы как сервис ArcGIS Server REST. Эти карты (A) основаны на проекции 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


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);

Но затем запомните, когда вы хотите установить центр карты, используя лат, если вам нужно проецировать эту координату из 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";

после определения вы можете сделать это методом transform:

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.