OpenLayers: Verwenden Sie Skalen anstelle von Auflösungen

8

Wenn man sich im OpenLayersQuellcode herumtreibt, scheint alles, was mit Zoomstufen zu tun hat, mit Auflösungen zu erfolgen. Fair genug, da dies direkt mit dem Bildschirmbereich zusammenhängt.

Ich möchte jedoch stattdessen Skalen verwenden und die zulässigen Skalen genauer definieren.
- Ist das möglich?

Bisher habe ich eine Reihe von Skalen erstellt, die ich in Auflösungen umwandle:

var scales = [500, 1000, 2000, 4000, 10000, 25000, 50000];
var resolutions = [];
for(var i = 0; i < scales.length; i++) {
    resolutions.push(OpenLayers.Util.getResolutionFromScale(scales[i], units));
}

map = new OpenLayers.Map('', {                        
    ...
    minScale: scales[scales.length - 1],
    maxScale: scales[0],        
    resolution: resolutions,
    numZoomLevels: scales.length,
    ...
});

Mein Problem ist, dass die erste und die letzte Skala eingehalten werden, aber dazwischen gehört die aktuelle Auflösung, die in eine Skala umgewandelt wurde, nicht zu den von mir angegebenen.
- Was habe ich vermisst?

Chau
quelle

Antworten:

18

So verwenden Sie Skalen auf Ihrer Karte:

  • Stellen Sie nur die Option "Skalen" ein. Legen Sie keine maxResolution, minResolution, maxScale, minScale, numZoomLevels oder andere skalierungsbezogene Eigenschaften fest. Stellen Sie es auf ein Array von Skalennennern (oder Skalen) ein.
  • Konfigurieren Sie eine Einheit: Beachten Sie, dass dies für Meter 'm', für Grad, 'Grad' usw. sein sollte.
  • Sie können einen maxExtent festlegen. Legen Sie keinen minExtent fest.

Sobald Sie dies tun, sollten die Skalen auf Ihrer Karte verwendet werden. (Beachten Sie, dass sie vom am meisten herausgezoomten - höchsten Nenner - bis zum am meisten vergrößerten - kleinsten Nenner sortiert werden.)

In Ihrem Fall sollte dies genau so aussehen:

map = new OpenLayers.Map('map', {                        
  scales: scales,
  units: 'm' // or whatever       
});

Fügen Sie dann Ihre Ebene hinzu.

Beachten Sie, dass schichtenbasierte Auflösungsoptionen die Karte steuern. Normalerweise sollten Sie diese Dinge nur auf der Karte oder auf den Ebenen angeben, nicht auf beiden.

Beachten Sie, dass die Basisebene die Gesamtskalen der Karte steuert. Überlagerungen werden vollständig von Basisschichten gesteuert.

Beachten Sie, dass OpenLayers eine DPI-Annahme von 72 verwendet. Um diese DPI-Einstellung zu steuern, können Sie OpenLayers.DOTS_PER_INCH festlegen, bevor Sie Ihre Map erstellen. Ein typischer Wert (der von der SLD-Spezifikation verwendet wird) ist unterschiedlich. Wenn diese Annahme für Sie von Bedeutung ist, sollten Sie diesen Konfigurationsparameter an Ihren Server anpassen.

Christopher Schmidt
quelle
1
@ Christopher : Vielen Dank. Das war genau das, wonach ich gesucht habe und es funktioniert wie ein Zauber :) Ich vermisse es jedoch, den scalesParameter entweder in der Quelle oder in den Dokumenten zu finden: dev.openlayers.org/docs/files/OpenLayers/Map-js.html
Chau
1
 var options = { scales: [50000000, 30000000, 10000000, 5000000],
                resolutions: [1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125],
                minScale: 50000000,
                maxResolution: "auto",
                maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90),
                maxResolution: 0.17578125,
                maxScale: 10000000,
                minResolution: "auto",
                minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
                minResolution: 0.0439453125,
                numZoomLevels: 5,
                units: "degrees"
              };
map = new OpenLayers.Map( $('map') , options);

Einheiten müssen eingestellt werden: Einheiten: "Grad"

Zeichenfolge - Die Einheiten, in denen die Ebene angezeigt werden soll.

Dies wirkt sich auf die Berechnung der Skalenauflösung aus.

Offizielle Quelle: http://trac.openlayers.org/wiki/SettingZoomLevels

Mapperz
quelle