Reprojetando camadas de base no OpenLayers


9

Tenho mapas em mosaico vetorial / topo / imagem para alguns lugares da América do Norte que foram publicados como serviço REST do ArcGIS Server. Esses mapas (A) são baseados na projeção EPSG: 26912. Agora eu quero usá-los como mapa base para meu aplicativo da web OpenLayers; além disso, também quero consumir outras fontes básicas de mapas (B), por exemplo, OpenStreetmap, Google Maps, ESRI, etc. Como a maioria desses mapas está no EPSG: 900913, que é uma projeção esférica de Mercator, se eu apenas os adicionar. base do mapa no componente de mapa OpenLayers, o grupo A e o grupo B não se sobrepõem corretamente, o que significa que são exibidos como mapas separados.

Eu sei que isso é algo relacionado à projeção e pode precisar de algum código com o proj4js; no entanto, como um novato, eu realmente não sei por onde começar.

Basicamente, quero colocar os mapas OSM / Google como o mapa base para o mundo inteiro na camada 1, depois colocar os mapas básicos EPSG: 26912 para alguns lugares da América do Norte na camada 2 e colocar outros WMS ou WFS na camada superior.

preciso transformar o EPSG: 26912 em EPSG: 900913 ou o oposto? Acho que devo usar o EPSG: 900913 como projeção base.


11
Como comentei na resposta da @iant abaixo, o software Esri não suporta o wkid 900913, mas suporta o mesmo sistema de coordenadas do wkid EPSG: 3857 ou ESRI: 102100.
mkennedy

Respostas:


7

Os OpenLayers podem transformar camadas vetoriais (como o WFS). Se a sua camada vetorial estiver em EPSG: 900913 ou EPSG: 4326 OpenLayers pode lidar com a transformação, caso contrário, ela precisará do Proj4js incluído.

Existem exemplos de como usar o OpenLayers com o Proj4js.

Camadas de varredura não podem ser transformadas por OpenLayers. Se você precisar incluí-los em uma projeção diferente, precisará reprojetá-los por conta própria ou usar um proxy WMS de reprojeção, como o GeoWebCache .


4

Qualquer bom WMS deve poder fazer a reprojeção para você. No entanto, não tenho idéia se o ArcGIS Server é um bom WMS. Se não for possível fornecer a camada no 900913, considere usar o GeoServer ou o MapServer como um WMS em cascata para lidar com a reprojeção para você.


3
O ArcGIS Server não pode fornecer camadas no 900913 porque esse wkid não é suportado. 3857, por outro lado ...!
mkennedy


2

Não sou um guru do OpenLayers, mas você precisa especificar a projeção do objeto do mapa. Eu acho que o padrão é WGS84 .... Eu posso estar errado, posso até ser a fonte da primeira camada adicionada ao mapa.

Enfim, tente algo assim (altere os limites conforme apropriado)

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

Mas lembre-se de quando você deseja definir o centro do mapa usando um lat, lon, você deve projetar essa coordenada do WGS para o GoogleMercator dessa maneira (usando a variável wgs84 e googleMercator acima).

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

1

A primeira coisa é definir a projeção do mapa e exibir a projeção da seguinte maneira:

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

Adicionando conversão de coordenadas

Depois de começar a usar projeções diferentes, você deve começar a pensar na possibilidade de converter coordenadas de uma projeção para outra, ao exibir essas coordenadas ou ao ler dados vetoriais em um sistema de coordenadas diferente do mapa. Como afirmado anteriormente, essa lógica de conversão não é fornecida pelo OL, portanto, você deve usar o Proj4js, que precisará incluir em sua página:

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

após a definição, você pode fazer isso pelo método transform:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.