Google Maps V3 - So berechnen Sie die Zoomstufe für eine bestimmte Grenze
Ich bin auf der Suche nach einer Möglichkeit zur Berechnung der zoom-Stufe für eine bestimmte Grenzen der Nutzung der Google Maps V3 API, ähnlich getBoundsZoomLevel() in der API V2.
Hier ist, was ich tun will:
//These are exact bounds previously captured from the map object
var sw = new google.maps.LatLng(42.763479, -84.338918);
var ne = new google.maps.LatLng(42.679488, -84.524313);
var bounds = new google.maps.LatLngBounds(sw, ne);
var zoom = //do some magic to calculate the zoom level
//Set the map to these exact bounds
map.setCenter(bounds.getCenter());
map.setZoom(zoom);
//NOTE: fitBounds() will not work
Kann ich leider nicht verwenden, die fitBounds () - Methode für meinen Anwendungsfall. Es funktioniert gut für die Montage-Markierungen auf der Karte, aber es funktioniert nicht für die Einstellung der genauen Grenzen. Hier ist ein Beispiel, warum ich nicht verwenden können, die fitBounds () - Methode.
map.fitBounds(map.getBounds()); //not what you expect
InformationsquelleAutor der Frage Nick Clark | 2011-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine ähnliche Frage gestellt wurde auf der Google-Gruppe: http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/e6448fc197c3c892
Den zoom-Stufen diskret sind, mit der Skala Verdoppelung in jedem Schritt. Also, im Allgemeinen Sie können nicht passen, die Grenzen, die Sie genau möchten (es sei denn, Sie sind sehr glücklich mit den jeweiligen map-Größe).
Weiteres Problem ist das Verhältnis zwischen den Seitenlängen, z.B. Sie können nicht passen, die Grenzen genau zu einem dünnen Rechteck in ein Quadrat gekennzeichnet.
Gibt es keine einfache Antwort für wie fit genauen Grenzen, denn selbst wenn Sie bereit sind, ändern Sie die Größe der Karte, div, müssen Sie entscheiden, welche Größe und der entsprechenden zoom-Stufe Sie ändern, um (grob gesprochen, machen Sie es größer oder kleiner ist als es aktuell ist?).
Wenn Sie wirklich brauchen, um zu berechnen, zoom, anstatt zu speichern, dies sollte den trick tun:
Die Mercator-Projektion-Ketten der Breite, aber keinen Unterschied in der Länge immer steht der gleiche Bruchteil der Breite der Karte (der Winkel ist in Grad /360). Bei zoom-null, die ganze Welt Karte ist 256x256 Pixel und Zoomen jedem level verdoppelt sich sowohl die Höhe und Breite. So nach ein wenig algebra, können wir berechnen Sie die zoom wie folgt, vorausgesetzt, wir kennen die map-Breite in Pixel. Beachten Sie, dass, weil die Länge umschließt, wir müssen sicherstellen, dass die Winkel positiv ist.
InformationsquelleAutor der Antwort Giles Gardam
Dank Giles Gardam für seine Antwort, aber es bezieht sich nur auf Länge und nicht Breite. Eine umfassende Lösung sollte die Berechnung der zoom-Stufe benötigt für die breiten-und die zoom-Stufe benötigt für die Länge, und nehmen Sie dann die kleinere (weiter) von den beiden.
Hier ist eine Funktion, die sowohl breiten-und Längengrad:
Demo auf jsfiddle
Parameter:
Die "Begrenzung" parameter-Wert sollte
google.maps.LatLngBounds
Objekt."MapDim" parameter Wert sollte sein, ein Objekt mit "Höhe" und "Breite" Eigenschaften sind, die die Höhe und die Breite des DOM-element, das zeigt die Karte. Möchten Sie vielleicht sinken diese Werte, wenn Sie wollen, um sicherzustellen Polsterung. Das heißt, Sie können nicht wollen, map-Marker innerhalb der Grenzen, die sich zu nahe an den Rand der Karte.
Wenn Sie die jQuery-Bibliothek, die
mapDim
Wert kann erhalten werden wie folgt:Wenn Sie mit der Prototype-Bibliothek, die mapDim Wert kann erhalten werden wie folgt:
Rückgabewert:
Der return-Wert ist die maximale zoom-Stufe, die immer noch den gesamten Bereich. Dieser Wert wird zwischen
0
und die maximale zoom-Stufe, inklusive.Die maximale zoom-Stufe 21. (Ich glaube, es war erst 19, für die Google Maps API v2.)
Erklärung:
Nutzt Google Maps, eine Mercator-Projektion. In einer Mercator-Projektion die Längengrade sind in gleichem Abstand, aber die Linien der Breite nicht. Der Abstand zwischen den Linien der Breite zu erhöhen, wie Sie gehen vom äquator zu den Polen. In der Tat ist die Distanz tendenziell in Richtung Unendlichkeit, wie es erreicht die Pole. Eine Google-Maps-Karte, aber, nicht zeigen, breiten oberhalb von etwa 85 Grad Nord oder unterhalb von etwa -85 Grad im Süden. (Referenz) (Ich berechnen die tatsächliche cutoff bei +/-85.05112877980658 Grad.)
Dies macht die Berechnung der für die Fraktionen Grenzen mehr kompliziert für die Breite als für die Länge. Habe ich eine Formel aus Wikipedia zur Berechnung der latitude-Fraktion. Ich gehe davon aus, dass dies entspricht der Projektion verwendet, die von Google Maps. Nachdem alle, die Google-Maps-Dokumentation Seite ich link oben enthält einen link auf der gleichen Wikipedia-Seite.
Sonstige Hinweise:
InformationsquelleAutor der Antwort John S
Für die version 3 der API, das ist einfach und funktioniert:
und einige optionale tricks:
InformationsquelleAutor der Antwort d.raev
Dank, das hat mir sehr geholfen bei der Suche nach den geeigneten zoom-Faktor zur korrekten Anzeige eine Polylinie.
Ich finde die maximalen und minimalen Koordinaten zu den Punkten, die ich zu verfolgen und, im Falle der Weg ist sehr "vertikal", ich habe gerade ein paar Zeilen code:
Eigentlich die ideal-zoom zoomfactor-1.
InformationsquelleAutor der Antwort Valerio Giacosa
Da alle anderen Antworten scheinen die Fragen zu haben für mich mit der einen oder anderen Sachverhalt (Karte, Breite/Höhe, Grenzen Breite/Höhe, etc.) Ich dachte, ich Stelle meine Antwort hier...
Es war eine sehr nützliche javascript-Datei hier: http://www.polyarc.us/adjust.js
Ich verwendet, dass als Grundlage für diesen:
Können Sie sicher reinigen Sie diese nach oben oder verkleinern, wenn nötig, aber ich hielt die Variablennamen lange in einem Versuch, um es einfacher zu verstehen.
Wenn Sie sich Fragen, wo OFFSET, kam aus dem offenbar 268435456 ist der halbe Erdumfang in Pixel bei einem Zoomfaktor 21 (nach http://www.appelsiini.net/2008/11/introduction-to-marker-clustering-with-google-maps).
InformationsquelleAutor der Antwort Shadow Man
Valerio ist fast Recht mit seiner Lösung, aber es gibt einige logische Fehler.
müssen Sie zunächst prüfen, ob winkel2 größer ist als der Winkel, bevor die Zugabe von 360 bei einer negativen.
sonst haben Sie immer einen größeren Wert als Winkel
So die richtige Lösung ist:
Delta, ist es, weil ich eine grössere Breite als die Höhe.
InformationsquelleAutor der Antwort Lukas Olsen
map.getBounds()
ist nicht der momentane Betrieb, so dass ich im ähnlichen Fall-event-handler. Hier ist mein Beispiel in CoffeescriptInformationsquelleAutor der Antwort MikDiet
Arbeit Beispiel zu finden, Durchschnittliche Standard-center mit reagieren-google-maps auf
ES6
:InformationsquelleAutor der Antwort Gapur Kassym