Reproyección de capas base en OpenLayers


9

Tengo mapas en mosaico de vectores / topo / imágenes para algunos lugares en América del Norte que se publicaron como servicio REST de ArcGIS Server. Estos mapas (A) se basan en EPSG: proyección 26912. Ahora quiero usarlos como mapa base para mi aplicación web OpenLayers; Además, también quiero consumir otras fuentes de mapas base (B), por ejemplo, OpenStreetmap, Google Maps, ESRI, etc. Dado que la mayoría de estos mapas están en EPSG: 900913, que es una proyección esférica de Mercator, si solo agrego estos Las capas del mapa base en el componente de mapa OpenLayers, el grupo A y el grupo B no se superponen correctamente, lo que significa que se muestran como mapas separados.

Sé que esto es algo relacionado con la proyección, y podría necesitar algún código con proj4js, sin embargo, como novato, realmente no sé con qué comenzar.

Básicamente, quiero poner los mapas OSM / Google como el mapa base para todo el mundo en el nivel 1, luego poner EPSG: 26912 mapas base para algunos lugares en América del Norte en el nivel 2, y poner otros WMS o WFS en el nivel superior.

¿Necesito transformar EPSG: 26912 a EPSG: 900913 o al contrario? Supongo que debería usar EPSG: 900913 como la proyección base.


1
Como comenté a continuación en la respuesta de @iant, el software de Esri no es compatible con wkid 900913 pero admite el mismo sistema de coordenadas que wkid EPSG: 3857 o ESRI: 102100.
mkennedy

Respuestas:


7

OpenLayers puede transformar capas vectoriales (como WFS). Si su capa vectorial está en EPSG: 900913 o EPSG: 4326 OpenLayers puede manejar la transformación en sí misma, de lo contrario, necesita Proj4js incluido.

Hay ejemplos de cómo usar OpenLayers con Proj4js.

OpenLayers no puede transformar las capas ráster. Si necesita incluirlos en una proyección diferente, debe volver a proyectarlos usted mismo o utilizar un proxy WMS de reproyección como GeoWebCache .


4

Cualquier buen WMS debería poder hacer la reproyección por usted. Sin embargo, no tengo idea si ArcGIS Server es un buen WMS. Si no puede proporcionar la capa en 900913, considere usar GeoServer o MapServer como un WMS en cascada para manejar la reproyección por usted.


3
ArcGIS Server no puede proporcionar capas en 900913 porque ese wkid no es compatible. 3857, por otro lado ...!
mkennedy


2

No soy un gurú de OpenLayers, pero debes especificar la proyección del objeto del mapa. Creo que el valor predeterminado es WGS84 ... Podría estar equivocado, incluso podría ser la fuente de la primera capa agregada al mapa.

De todos modos, intente algo como esto (cambie los límites según corresponda)

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

Pero luego recuerde cuándo desea establecer el centro del mapa usando un lat, ya que debe proyectar esa coordenada de WGS a GoogleMercator de esta manera (usando la variable wgs84 y googleMercator de arriba).

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

1

Lo primero es definir su proyección de mapa y mostrar la proyección de la siguiente manera:

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

Agregar conversión de coordenadas

Una vez que comience a usar diferentes proyecciones, debe comenzar a pensar en la posibilidad de convertir coordenadas de una proyección a otra, ya sea al mostrar esas coordenadas o al leer datos vectoriales en un sistema de coordenadas diferente del del mapa. Como se indicó anteriormente, OL no proporciona esta lógica de conversión, por lo que debe usar Proj4js, que deberá incluir en su 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";

después de la definición puedes hacerlo por el método de transformación:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.