Grundlegende Ebenen in OpenLayers neu projizieren


9

Ich habe Vektor- / Topo- / Bildkarten für einige Orte in Nordamerika, die als ArcGIS Server REST-Service veröffentlicht wurden. Diese Karten (A) basieren auf der EPSG: 26912-Projektion. Jetzt möchte ich diese als Basiskarte für meine OpenLayers-Web-App verwenden. Außerdem möchte ich auch andere Basiskartenquellen (B) verwenden, z. B. OpenStreetmap, Google Maps, ESRI usw. Da die meisten dieser Karten in EPSG: 900913 vorliegen, was meines Wissens eine sphärische Mercator-Projektion ist, wenn ich diese nur hinzufüge Basiskartenebenen in der OpenLayers-Kartenkomponente werden Gruppe A und Gruppe B nicht korrekt überlagert, was bedeutet, dass sie als separate Karten angezeigt werden.

Ich weiß, dass dies etwas mit Projektion zu tun hat und möglicherweise Code mit proj4js benötigt, aber als Neuling weiß ich nicht wirklich, womit ich anfangen soll.

Grundsätzlich möchte ich OSM / Google-Karten als Basiskarte für die ganze Welt in Tier 1 einfügen, dann EPSG: 26912-Basiskarten für einige Orte in Nordamerika in Tier 2 und andere WMS oder WFS in die oberste Ebene einfügen.

Muss ich EPSG: 26912 in EPSG: 900913 oder umgekehrt umwandeln? Ich denke, ich sollte EPSG: 900913 als Basisprojektion verwenden.


1
Wie ich unten in der Antwort von @ iant kommentiert habe, unterstützt die Esri-Software wkid 900913 nicht, unterstützt jedoch dasselbe Koordinatensystem wie wkid EPSG: 3857 oder ESRI: 102100.
Mkennedy

Antworten:


7

OpenLayers können Vektorebenen (wie WFS) transformieren. Wenn sich Ihre Vektorebene in EPSG: 900913 oder EPSG: 4326 befindet, kann OpenLayers die Transformation selbst durchführen. Andernfalls müssen Proj4js enthalten sein.

Es gibt Beispiele für die Verwendung von OpenLayers mit Proj4js.

Rasterebenen können von OpenLayers nicht transformiert werden. Wenn Sie sie in eine andere Projektion aufnehmen müssen, müssen Sie sie selbst neu projizieren oder einen neu projizierten WMS-Proxy wie GeoWebCache verwenden .


4

Jedes gute WMS sollte in der Lage sein, die Neuprojektion für Sie durchzuführen. Ich habe jedoch keine Ahnung, ob ArcGIS Server ein gutes WMS ist. Wenn der Layer in 900913 nicht bereitgestellt werden kann, sollten Sie GeoServer oder MapServer als kaskadierendes WMS verwenden, um die Neuprojektion für Sie durchzuführen.


3
ArcGIS Server kann in 900913 keine Layer bereitstellen, da diese wkid nicht unterstützt wird. 3857 andererseits ...!
Mkennedy


2

Ich bin kein OpenLayers-Guru, aber Sie müssen die Projektion des Kartenobjekts angeben. Ich denke, es ist standardmäßig WGS84 ... Ich könnte mich irren, ich könnte sogar die Quelle der ersten Ebene sein, die der Karte hinzugefügt wurde.

Versuchen Sie auf jeden Fall so etwas (ändern Sie die Grenzen entsprechend)

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

Denken Sie jedoch daran, dass Sie, wenn Sie das Kartenzentrum mithilfe eines Lat, Lon festlegen möchten, diese Koordinate wie folgt von WGS auf GoogleMercator projizieren müssen (mithilfe der Variablen wgs84 und googleMercator von oben).

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

1

Als erstes definieren Sie Ihre Kartenprojektion und Anzeigeprojektion wie folgt:

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

Koordinatenkonvertierung hinzufügen

Sobald Sie verschiedene Projektionen verwenden, müssen Sie über die Möglichkeit nachdenken, Koordinaten von einer Projektion in eine andere umzuwandeln, entweder wenn Sie diese Koordinaten anzeigen oder wenn Sie Vektordaten in einem anderen Koordinatensystem als der Karte einlesen. Wie bereits erwähnt, wird diese Konvertierungslogik nicht von OL bereitgestellt. Sie müssen daher Proj4js verwenden, die Sie in Ihre Seite aufnehmen müssen:

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

Nach der Definition können Sie dies mit der Transformationsmethode tun:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.