10 votos

Reproyección de capas base en OpenLayers

Tengo mapas vectoriales/topo/imágenes en mosaico para algunos lugares de Norteamérica que fueron publicados como servicio REST de ArcGIS Server. Estos mapas (A) están basados en la proyección EPSG: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 la proyección esférica de Mercator, si añado estas capas de mapas base en el componente de mapas de OpenLayers, el grupo A y el grupo B no se superpondrán correctamente, lo que significa que se mostrarán como mapas separados.

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

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

¿tengo que transformar EPSG:26912 a EPSG:900913 o al revés? Supongo que debo utilizar EPSG:900913 como proyección base.

1 votos

Como he comentado en la respuesta de @iant más abajo, el software de Esri no admite el wkid 900913 pero sí el mismo sistema de coordenadas que el wkid EPSG:3857 o ESRI:102100.

8voto

Owen Fraser-Green Puntos 642

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

Hay ejemplos de cómo utilizar OpenLayers con Proj4js.

Las capas rasterizadas no pueden ser transformadas por OpenLayers. Si necesita incluirlas en una proyección diferente, tiene que reproyectarlas usted mismo o utilizar un proxy WMS de reproyección como GeoWebCache .

4voto

Adam Ernst Puntos 6939

Cualquier buen SGA debería ser capaz de hacer la reproyección por usted. Sin embargo, no tengo ni idea de si ArcGIS Server es un buena WMS. Si no puede proporcionar la capa en 900913, considere la posibilidad de utilizar GeoServer o MapServer como WMS en cascada para gestionar la reproyección por usted.

3 votos

ArcGIS Server no puede proporcionar capas en 900913 porque ese wkid no está soportado. En cambio, el 3857...

0 votos

Necesitas docs.openlayers.org/library/ entonces

3voto

Shane O'Grady Puntos 1758

No soy un gurú de OpenLayers, pero tienes que especificar la proyección del objeto mapa. Creo que por defecto es WGS84....Puede que me equivoque, incluso podría ser la fuente de la primera capa añadida 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 entonces recuerda que cuando quieras establecer el centro del mapa usando una lat,lon tienes que proyectar esa coordenada de WGS a GoogleMercator así (usando la variable wgs84 y googleMercator de arriba).

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

2voto

texai Puntos 178

Lo primero es definir la proyección del mapa y la proyección de la pantalla como sigue:

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

Añadir la conversión de coordenadas

Una vez que empiece a utilizar diferentes proyecciones, tendrá que empezar a pensar en la posibilidad de convertir las coordenadas de una proyección a otra, ya sea al mostrar esas coordenadas, o al leer los datos vectoriales en un sistema de coordenadas diferente al del mapa. Como ya se ha dicho, esta lógica de conversión no la proporciona OL, por lo que hay que utilizar Proj4js, que tendrás que incluir en tu 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 se puede hacer 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);

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X