Reprojection de couches de base dans OpenLayers

9

J'ai des cartes vectorielles / topo / image en mosaïque pour certains endroits en Amérique du Nord qui ont été publiées en tant que service ArcGIS Server REST. Ces cartes (A) sont basées sur la projection EPSG: 26912. Maintenant, je veux les utiliser comme carte de base pour mon application Web OpenLayers; en outre, je veux également consommer d'autres sources de cartes de base (B), par exemple, OpenStreetmap, Google Maps, ESRI, etc. Étant donné que la plupart de ces cartes sont en EPSG: 900913 qui est une projection sphérique de Mercator à ma connaissance, si je les ajoute simplement les couches de carte de base dans le composant de carte OpenLayers, le groupe A et le groupe B ne se superposeront pas correctement, ce qui signifie qu'ils sont affichés sous forme de cartes distinctes.

Je sais que c'est quelque chose lié à la projection, et peut avoir besoin de code avec proj4js, cependant, en tant que débutant, je ne sais pas vraiment par quoi commencer.

Fondamentalement, je veux mettre les cartes OSM / Google comme carte de base pour le monde entier au niveau 1, puis mettre EPSG: 26912 cartes de base pour certains endroits en Amérique du Nord au niveau 2, et mettre d'autres WMS ou WFS au niveau supérieur.

dois-je transformer EPSG: 26912 en EPSG: 900913 ou opposé? Je suppose que je devrais utiliser EPSG: 900913 comme projection de base.

Simon
la source
1
Comme j'ai commenté la réponse de @ iant ci-dessous, le logiciel Esri ne prend pas en charge wkid 900913 mais prend en charge le même système de coordonnées que wkid EPSG: 3857 ou ESRI: 102100.
mkennedy

Réponses:

7

OpenLayers peut transformer des couches vectorielles (comme WFS). Si votre couche vectorielle est au format EPSG: 900913 ou EPSG: 4326, OpenLayers peut gérer la transformation elle-même, sinon, il a besoin de Proj4js inclus.

Il existe des exemples d'utilisation d'OpenLayers avec Proj4js.

Les couches raster ne peuvent pas être transformées par OpenLayers. Si vous devez les inclure dans une projection différente, vous devez les reprojeter vous-même ou utiliser un proxy WMS de reprojection comme GeoWebCache .

EPSG31468
la source
4

Tout bon WMS devrait pouvoir faire la reprojection pour vous. Cependant, je ne sais pas si ArcGIS Server est un bon WMS. S'il n'est pas en mesure de fournir la couche dans 900913, envisagez d'utiliser GeoServer ou MapServer en tant que WMS en cascade pour gérer la reprojection pour vous.

Ian Turton
la source
3
ArcGIS Server ne peut pas fournir de couches dans 900913 car ce wkid n'est pas pris en charge. 3857, d'autre part ...!
mkennedy
vous avez besoin de docs.openlayers.org/library/… alors
Ian Turton
2

Je ne suis pas un gourou d'OpenLayers, mais vous devez spécifier la projection de l'objet de la carte. Je pense qu'il est par défaut WGS84 .... Je peux me tromper, je peux même être la source de la première couche ajoutée à la carte.

Quoi qu'il en soit, essayez quelque chose comme ça (changez les limites comme il convient)

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

Mais souvenez-vous ensuite lorsque vous souhaitez définir le centre de la carte en utilisant un lat, lon vous devez projeter cette coordonnée de WGS à GoogleMercator comme ceci (en utilisant la variable wgs84 et googleMercator ci-dessus).

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

La première chose est de définir votre projection cartographique et votre projection d'affichage comme suit:

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

Ajout d'une conversion de coordonnées

Une fois que vous commencez à utiliser différentes projections, vous devez commencer à réfléchir à la possibilité de convertir les coordonnées d'une projection à une autre, soit lors de l'affichage de ces coordonnées, soit lors de la lecture de données vectorielles dans un système de coordonnées différent de celui de la carte. Comme indiqué précédemment, cette logique de conversion n'est pas fournie par OL, vous devez donc utiliser Proj4js, que vous devrez inclure dans votre page:

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

après la définition, vous pouvez le faire par la méthode de transformation:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Aragon
la source