<\/HEAD>
<\/P>
Lassen Sie uns das kurz und bündig halten. Wie oft haben Sie mit der ArcGIS API for JavaScript gearbeitet und mussten zu einem Feature zoomen. Haben Sie sich schon einmal über das merkwürdige Verhalten von map#centerAndZoom<\/A> den Kopf zerbrochen? Vielleicht haben Sie sich dabei ertappt, wie Sie switch\/case- oder if\/else-Anweisungen geschrieben haben, um die Karte basierend darauf zu zoomen, ob Sie zu einem Punkt, Polygon oder einer Polylinie zoomen.<\/SPAN><\/SPAN><\/P><\/P>Lesen Sie die Dokumentation<\/STRONG><\/SPAN><\/P>Bevor wir uns ansehen, wie man einfach zu Features zoomt, schauen wir uns an, warum die centerAndZoom-Methode die Karte hasst.<\/SPAN><\/P>Die Methodensignatur von centerAndZoom lautet centerAndZoom(mapPoint, levelOrFactor). Was bedeutet levelOrFactor? Schauen wir uns die Definition an.<\/SPAN><\/P><\/P>"<\/STRONG>Beim Verwenden eines <\/SPAN>ArcGISTiledMapServiceLayer<\/STRONG><\/SPAN> wird die Karte auf das angegebene Level gezoomt. Beim Verwenden eines <\/SPAN>DynamicMapServiceLayer<\/STRONG><\/SPAN> wird die Karte um den angegebenen Faktor rein- oder rausgezoomt. Zum Beispiel verwenden Sie 0.5, um doppelt so weit reinzuzoomen, und 2.0, um doppelt so weit rauszuzoomen."<\/STRONG><\/SPAN><\/EM><\/SPAN><\/P><\/P>Das ist viel besser. Oder? Noch verwirrt? Ok, im Grunde genommen, wenn Sie einen <\/SPAN>ArcGISTiledMapServiceLayer <\/SPAN>verwenden, können Sie die Karte auf ein bestimmtes Detaillevel zoomen. Denken Sie an den Zoom-Schieberegler auf einer Karte. Wenn Sie jedoch einen <\/SPAN>DynamicMapServiceLayer <\/SPAN>verwenden, wird es kompliziert. Nun können Sie doppelt so weit rein- oder rauszoomen, aber Sie müssen den Faktor als Dezimalzahl angeben, also denken Sie an Prozentsätze. Ich vermute, Sie wollen doppelt so weit reinzoomen, also scheint 0.5 eine sichere Wahl zu sein, aber wenn Sie 0.25 nehmen würden, wäre das was? Viermal so weit reinzoomen.<\/SPAN><\/P><\/P>Machen Sie die Arbeit<\/STRONG><\/SPAN><\/P>Ok, mit diesem Wissen wissen Sie ziemlich genau, was zu tun ist. Ich habe vor einiger Zeit dieses kleine Modul zusammengestellt, als ich es leid war, immer wieder dasselbe zu schreiben und nach Geometrietypen und verschiedenen Szenarien zu prüfen. Ich wette, dass dies 90 % der Situationen abdeckt, auf die Sie stoßen (Ich habe keine genauen Zahlen zur Untermauerung, aber vertrauen Sie mir<\/EM>).<\/SPAN><\/P>define([
'dojox\/lang\/functional\/curry'
], function(curry) {
var zoom = curry(function(map, geometry) {
if (geometry.type === 'point') {
 var mz = map.getMaxZoom() ;
 if (mz >-1) {
 map.centerAndZoom(geometry, mz - 2);
 } else {
 map.centerAndZoom(geometry, 0.25);
 }
} else {
 map.setExtent(geometry.getExtent());
}
} );
 return zoom;
});<\/PRE><\/P>Hier ist eine Live-Demo<\/A>.<\/SPAN>
Sie prüfen also im Grunde genommen, ob die Geometrie ein Punkt ist. Wenn es ein Punkt ist, erhalten Sie das maximale Zoom-Level der Karte. An diesem Punkt haben Sie zwei Möglichkeiten:<\/SPAN>
- Wenn es größer als -1 ist, zoomen Sie auf dieses Level und ziehen 2 ab, damit Sie nicht zu nah heranzoomen. Oder auch nicht, das liegt bei Ihnen.<\/SPAN> <\LI> Zoomen mit einem Faktor von 0.25, was bedeutet viermal so stark wie das aktuelle Zoom-Level.<\ /span>
Wenn die Geometrie kein Punkt ist, ist es einfach – Polygone, Polylinien und Multipunkte können eine Ausdehnung zurückgeben, sodass Sie einfach die aktuelle Ausdehnung der Karte auf die Ausdehnung der Geometrie setzen können.< /span >
Kicken wir es eine Stufe höher< /strong >< /span >
Das funktioniert ziemlich gut, aber sagen wir mal, Sie wollen eine flexiblere Lösung. Die obige Version funktioniert gut bei Übergabe einer Geometrie – aber wie sieht es mit einem Graphic oder einem Array von Graphics aus? Das sind alles gültige Objekte, zu denen man zoomen möchte. Also bauen wir dafür ein Modul auf, das so ziemlich alles verarbeiten kann, was man ihm vorwirft.< /span >
& nbsp ; define([
& nbsp ; & nbsp ; & nbsp ; 'dojox/lang/functional/curry',
& nbsp ; & nbsp ; & nbsp ; 'esri/graphic',
& nbsp ; & nbsp ; & nbsp ; 'esri/graphicsUtils'
& nbsp ; ], function(curry, Graphic, gUtils) {
& nbsp ; & nbsp ; var zoomToPoint = function(m, geometry) {
& nbsp ; & nbsp ; & nbsp ; var mz = m.getMaxZoom();
& nbsp ; & nbsp ; & nbsp ; if (mz & gt;-1) {
& nbsp ; & nbsp ; & nbsp ; & nbsp ; return m.centerAndZoom(geometry,mz - 2);
& nbsp ; & nbsp ; & nbsp ; } else {
& nbsp ; & nbsp ; & nbsp ; & nbsp ; return m.centerAndZoom(geometry ,0.25);
& nbsp ; & nbsp ; & nbsp ; }
& nbsp ; & nbsp ; };
& nbsp ; & nbsp ; var zoomToGeom = function(m ,geometry) {
& nbsp ; & nbsp ; & nbsp ; if (geometry.type === 'point') {
& nbsp ; & nbsp ; & nbsp ; & nbsp ; return zoomToPoint(m ,geometry);
& nbsp ; & nbsp ; & nbsp ; } else {
& nbsp ; & nbsp ; & nbsp ;& nb sp;; return m.setExtent(geometry.getExtent());
& nb sp;; }
& nb sp;; };
& nb sp;; var zoomToGraphics = function(m ,graphics) {
& nb sp;; if (!graphics.length) return;
& nb sp;; if (graphics.length >1) {
& nb sp;;& nb sp;; return gUtils.graphicsExtent(graphics);
& nb sp;; } else {
& nb sp;;& nb sp;; var g = graphics[0];
& nb sp;;& nb sp;; var geometry = g.geometry;
& nb sp;;& nb sp;; if (geometry.type === 'point') {
& nb sp;;& nb sp;;& nb sp;; return zoomToPoint(m ,geometry);
& nb sp;;& nb sp;; } else {
& nb sp;;& nb sp;;& nb sp;; return m.setExtent(gUtils.graphicsExtent(graphics));
& nb sp;;& nb sp;; }
& nb sp;; }
& nb sp;; };
& nb sp;; var zoomToGraphic = function(m ,graphic) {
& nb sp;; return zoomToGeom(m ,graphic.geometry);
& nb sp;; };
& nb sp;; var zoom = curry(function(m ,gs) {
& nb sp;; if (gs.type) {
& nb sp;; return zoomToGeom(m ,gs);
& nb sp;; }
& nb sp;; if (gs instanceof Array) {
& nb sp;; return zoomToGraphics(m ,gs);
& nb sp;; }
& nb sp;; if (gs instanceof Graphic) {
& nb sp;; return zoomToGraphic(m ,gs);
& nb sp;; }
& nb sp;; });
& nb sp;; return zoom;
});< /pre > Dieses Modul nutzt das esri/graphicsUtils-Modul zur Verarbeitung von Arrays von Graphics und kann sowohl einzelne Graphics als auch Geometrien verarbeiten. Klicken Sie hier für eine Demo dieses Moduls <\/A> in Aktion.<\/SPAN><\/P><\/P>
Bam erledigt!<\/STRONG><\/SPAN><\/P>Woah woah<\/EM>. Was ist das für ein
curry<\/A> Unsinn? Ok, also habe ich das hier eingeschmuggelt. Die Verwendung von curry ermöglicht es im Grunde, Funktionen teilweise auszuwerten. Das bedeutet, du übergibst die Karte an die Funktion, bevor du die Geometrie übergeben musst. Hier ist eine Erklärung von curry in JavaScript<\/A>.<\/SPAN><\/P>Das ist keine harte Voraussetzung, aber es macht die Sache etwas interessanter.<\/SPAN><\/P><\/P>Spiele damit, ändere es, missbrauche es und programmiere.<\/SPAN><\/P><\/BODY><\/HTML>