Riproiezione di layer di base in OpenLayers


9

Ho mappe piastrellate vettoriale / topo / immagine per alcuni luoghi del Nord America che sono state pubblicate come servizio REST di ArcGIS Server. Queste mappe (A) sono basate su EPSG: proiezione 26912. Ora voglio usarli come mappa di base per la mia app Web OpenLayers; Inoltre, voglio anche consumare altre fonti di mappe di base (B), ad esempio OpenStreetmap, Google Maps, ESRI, ecc. Dato che la maggior parte di queste mappe sono in EPSG: 900913 che è la proiezione sferica di Mercator a mia conoscenza, se aggiungo solo queste i livelli della mappa di base nel componente della mappa OpenLayers, il gruppo A e il gruppo B non si sovrapporranno correttamente, il che significa che vengono visualizzati come mappe separate.

So che questo è qualcosa legato alla proiezione e potrebbe aver bisogno di un po 'di codice con proj4js, tuttavia, come principiante, non so davvero da che parte cominciare.

Fondamentalmente, voglio mettere le mappe OSM / Google come mappa di base per tutto il mondo nel livello 1, quindi inserire EPSG: 26912 mappe di base per alcuni luoghi in Nord America nel livello 2 e inserire altri WMS o WFS nel livello superiore.

devo trasformare EPSG: 26912 in EPSG: 900913 o opposto? Immagino che dovrei usare EPSG: 900913 come proiezione base.


1
Come ho commentato di seguito la risposta di @ iant, il software Esri non supporta wkid 900913 ma supporta lo stesso sistema di coordinate di wkid EPSG: 3857 o ESRI: 102100.
mkennedy,

Risposte:


7

Gli OpenLayer possono trasformare layer vettoriali (come WFS). Se il tuo livello vettoriale è in EPSG: 900913 o EPSG: 4326 OpenLayers può gestire la trasformazione stessa, altrimenti ha bisogno di Proj4js incluso.

Ci sono esempi su come usare OpenLayers con Proj4js.

I layer raster non possono essere trasformati da OpenLayers. Se è necessario includerli in una diversa proiezione, è necessario riproiettarli da soli o utilizzare un proxy WMS riproiettante come GeoWebCache .


4

Qualsiasi buon WMS dovrebbe essere in grado di fare la riproiezione per te. Tuttavia, non ho idea se ArcGIS Server sia un buon WMS. Se non è possibile fornire il layer in 900913, considerare l'utilizzo di GeoServer o MapServer come WMS a cascata per gestire la riproiezione.


3
Il server ArcGIS non è in grado di fornire livelli in 900913 perché wkid non è supportato. 3857, d'altra parte ...!
mkennedy,

avete bisogno di docs.openlayers.org/library/… quindi
Ian Turton

2

Non sono un guru di OpenLayers, ma devi specificare la proiezione dell'oggetto map. Penso che il valore predefinito sia WGS84 .... Potrei sbagliarmi, potrei anche essere la fonte del primo livello aggiunto alla mappa.

Prova comunque qualcosa del genere (cambia i limiti secondo necessità)

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

Ma poi ricorda quando vuoi impostare il centro della mappa usando un lat, lon devi proiettare le coordinate da WGS a GoogleMercator in questo modo (usando le variabili wgs84 e googleMercator dall'alto).

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

1

La prima cosa è che definisci la proiezione della mappa e la proiezione del display come segue:

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

Aggiunta della conversione delle coordinate

Una volta che inizi a utilizzare diverse proiezioni, devi iniziare a pensare alla possibilità di convertire le coordinate da una proiezione a un'altra, sia quando visualizzi quelle coordinate, sia quando leggi i dati vettoriali in un sistema di coordinate diverso da quello della mappa. Come affermato in precedenza, questa logica di conversione non è fornita da OL, quindi devi utilizzare Proj4js, che dovrai includere nella tua pagina:

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

dopo la definizione puoi farlo con il metodo di trasformazione:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.