Antworten:
Wenn Sie eine Karte entwerfen, die Sie über Google Maps oder Virtual Earth legen möchten, und ein Kachelschema erstellen möchten, sollten Sie die folgenden Maßstäbe für jede Zoomstufe verwenden:
20 : 1128.497220
19 : 2256.994440
18 : 4513.988880
17 : 9027.977761
16 : 18055.955520
15 : 36111.911040
14 : 72223.822090
13 : 144447.644200
12 : 288895.288400
11 : 577790.576700
10 : 1155581.153000
9 : 2311162.307000
8 : 4622324.614000
7 : 9244649.227000
6 : 18489298.450000
5 : 36978596.910000
4 : 73957193.820000
3 : 147914387.600000
2 : 295828775.300000
1 : 591657550.500000
Quelle: http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
Ich fand diese Antwort - geschrieben von einem Google-Mitarbeiter - wahrscheinlich die genaueste:
Dies ist nicht korrekt, da die Auflösung einer Karte mit Mercator-Projektion (wie bei Google Maps) vom Breitengrad abhängt.
Es ist möglich, mit dieser Formel zu berechnen:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
Dies basiert auf der Annahme, dass der Erdradius 6378137 m beträgt. Welchen Wert verwenden wir :)
entnommen aus: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
BTW - Ich vermute, dass:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
Zum besseren Verständnis der Mathematik (keine genaue Berechnung, nur zur Veranschaulichung):
Nehmen wir an, Ihr Computermonitor hat 100 Pixel pro Zoll (PPI). Das heißt, 256 Pixel sind ungefähr 6,5 cm lang. Und das sind 0,065 m .
Bei Zoomstufe 0 sind die gesamten 360 Längengrade in einer einzigen Kachel sichtbar . Sie können dies in Google Maps nicht beobachten, da es automatisch in die Zoomstufe 1 wechselt, aber Sie können es auf der Karte von OpenStreetMap sehen (es wird dasselbe Kachelschema verwendet).
360 Grad am Äquator entsprechen dem Erdumfang von 40.075,16 km, was 40075160 m entspricht
Teilen Sie 40075160 m durch 0,065 m und Sie erhalten 616313361 , eine Skala der Zoomstufe 0 am Äquator für einen Computermonitor mit 100 DPI
Überprüfen Sie auch: http://wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
591657550.500000
gemäß dieser Antwort Level 0. Aber laut @CaptDragon ist Level 1. Ich sollte überlegen, ab Level 1 mit Google Maps zu rechnen?
Nicht so einfach. Angesichts der Projektion hängt die Größe der Kachelpixel von der Breite des Bereichs ab, an dem Sie interessiert sind. Wenn Sie die Größe der Kachelpixel in die Größe der Bildschirmpixel umwandeln, hängt dies vom Bildschirm und der Auflösung ab, in der die Daten angezeigt werden dpi, die Ihr Bildschirm verwendet.
Unkomplizierte, verbindliche und korrekte Antwort:
591657550.500000 / 2^(level-1)
Sie erhalten die obige Tabelle, in der Sie die Zoomstufe eingeben.
Probieren Sie es live auf jsfiddle.net aus
Da die Frage nur für Google MAPS und nicht für EARTH gilt, kümmert sich das OP nicht um die 3D-Geometrie. Google Maps sind BEREITS abgeflacht, sodass 1 Pixel immer der gleiche Abstand ist (in GRAD, was eine Google Map betrifft), hier und im Steuergerät wie in den Polen.
Übrigens, haben Sie bemerkt, dass irgendwo in der ersten Pixelreihe einer Weltkarte der Maßstab 1: 1 ist?
Eine solche Tabelle finden Sie in der Dokumentation des Virtal Earth Tile Systems von Microsoft . Aber wie von GuillaumeC gesagt, hängen die Werte vom Breitengrad und von der Bildschirmauflösung ab. Die Tabelle gibt die am Äquator gemessenen Werte und eine Bildschirmauflösung von 96 dpi an.
PS: Ich bin mir nicht sicher, aber die Zoomstufen von Microsoft könnten im Vergleich zu den Zoomstufen von Google um 1 verschoben werden. Sie verwenden jedoch definitiv dieselbe Projektion, sodass die Werte für Google korrekt bleiben.
Radius @ Äquator 6.378.137 Meter genau (WGS-84)
Umfang am Äquator = 40.075.017 Meter (2πr)
Die Zoomstufe 24 verwendet 2 bis 32 (4.294.967.296) Pixel am Umfang.
Äquatorialer Umfang / 2 32 = .009330692 Meter pro Pixel
Einheit am Breitengrad = (Kosinus des Breitengrads) X (Einheit am Äquator)
Die Zoomstufe verdoppelt sich mit jedem Inkrement.
1 Fuß (International) = 0,3048 Meter
Bearbeiten
Nun, es ist nicht wirklich eine legitime Frage. Die Skalierungsverhältnisse beziehen sich auf gedruckte Dokumente und nicht auf Computerbildschirme. Damit diese Bilder mit jeder Genauigkeit verwendet werden können, müssen Sie die Größe jedes Pixels kennen und das Bild dann entsprechend Ihrer Überlagerung skalieren.
Vor 15 bis 20 Jahren nahm jemand WGS-84 als Basisdaten. (Beachten Sie in einem vorherigen Beitrag, dass jemand einen Wert von 40.075.160 verwendet hat. Ich habe dies in Wikipedia an einigen Stellen gesehen und es ist falsch. Der korrekte Wert ist 40.075.017
Das haben sie dann genommen und durch eine ganze 32-Bit-Zahl geteilt. Dies ist eine logische Entscheidung, da hiermit eine globale Genauigkeit von etwa einem Zentimeter erzielt wird, was für Luftbilder ausreichend ist. 32-Bit-Ganzzahlen sind auch effizient zu speichern und zu verarbeiten.
Warum dies Stufe 24 ist, wurde ausgewählt. Ich weiß jedoch nicht, wie jemand anderes hier herausgefunden hat. 0 bringt Sie auf eine 256-Pixel-Kachel für die Erde.
Nun ein Beispiel für die Verwendung der oben genannten Daten. Nehmen wir an, ich habe ein Bild mit Zoomstufe 20 (so gezoomt, wie Sie es gerade haben). Nehmen Sie 0,009330692 (Zoom 24 am Äquator), verdoppeln Sie es für Zoom 23, erneut für Zoom 22, erneut für Zoom 21 und ein letztes Mal für Zoom 20 Sie sollten jetzt 0.149231071 haben.
Nehmen wir nun an, unser Bild befindet sich auf dem 45. Breitengrad. Nehmen Sie den Cosinus (0,707106781) und multiplizieren Sie ihn mit 0,149231071. Sie erhalten 0,105564729 Meter. Dies ist die Länge und Höhe eines Pixels von einem Bild bei 45 Breitengraden in Zoomstufe 20. Wenn Sie ein 1000 x 1000 Pixel großes Bild dieses Bereichs auf dem Bildschirm aufnehmen, beträgt die Abmessung 105,56 Quadratmeter. Wenn Sie Füße wollen, teilen Sie diese 0,3048
Was Quellen angeht, habe ich vor ungefähr 5 Jahren den Ingenieur von verschiedenen Informationen und Dokumentationen, die ich im Web gefunden habe, zurückgenommen, einschließlich Google- und MS-Mapping-Support-Sites.
Ich habe diese Zeit hundert Mal verwendet und sie mit tatsächlichen Feldvermessungsdaten überlagert, und sie waren immer korrekt. Prüfen Sie dies anhand der hier angegebenen Tabellen, und die Zahlen stimmen überein.
Habe gerade einige Berechnungen durchgeführt und die folgenden Ergebnisse erhalten:
Google Maps zeigt ein 1-km-Lineal (links unten auf der Karte) mit einer Länge von 90 Pixeln in Zoomstufe 13. Dies bedeutet Folgendes:
Unter der Annahme, dass die Bildschirmauflösung 96 dpi oder 36 dpcm beträgt, haben wir bei Zoomstufe 13 0,4 km (von 36/90) in 1 cm, was einen Kartenmaßstab von 1: 40.000 für einen 96-dpi-Bildschirm ergibt.
Für verschiedene Operationen auf dem Bildschirm ist es am besten, 90px als Basis zu nehmen, da alle Zahlen in allen Zoomstufen rund sind, d. H
und so weiter.
Beachten Sie, dass dies eine Annäherung ist, die eher auf kleineren als auf großen Skalen mehr oder weniger gut funktionieren sollte.
(Und Google mag am Ende runde Zahlen ...)
Basierend auf allen bereitgestellten Informationen habe ich eine Funktion erstellt, die das beste z für eine Karte liefert, wenn Sie eine horizontale Linie wünschen, die N% der angezeigten Karte darstellt.
Die angezeigte Karte zeichnet sich durch eine eigene Pixelbreite aus.
function calculateZoom(WidthPixel,Ratio,Lat,Length){
// from a segment Length (km),
// with size ratio of the segment expected on a map (70%),
// with a map WidthPixel width in pixels (100px),
// and a latitude (45°) we can get the best Zoom
// assume earth is a perfect ball with radius : 6,378,137m and
// circumference at the equator = 40,075,016.7 m
// The full world on google map is available in tiles of 256 px;
// it has a ratio of 156543.03392 (px/m).
// For Z = 0;
// pixel scale at the Lat_level is ( 156543,03392 * cos ( PI * (Lat/180) ))
// The map scale increases at the rate of square root of Z.
//
Length = Length *1000; //Length is in Km
var k = WidthPixel * 156543.03392 * Math.cos(Lat * Math.PI / 180); //k = circumference of the world at the Lat_level, for Z=0
var myZoom = Math.round( Math.log( (Ratio * k)/(Length*100) )/Math.LN2 );
myZoom = myZoom -1; // Z starts from 0 instead of 1
//console.log("calculateZoom: width "+WidthPixel+" Ratio "+Ratio+" Lat "+Lat+" length "+Length+" (m) calculated zoom "+ myZoom);
// not used but it could be useful for some: Part of the world size at the Lat
MapDim = k /Math.pow(2,myZoom);
//console.log("calculateZoom: size of the map at the Lat: "+MapDim + " meters.");
//console.log("calculateZoom: world circumference at the Lat: " +k+ " meters.");
return(myZoom);
}
Ich kann noch keinen Kommentar hinzufügen, aber dies ist eine mögliche Quelle für Petes Antwort oben: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
[...] beachten Sie, dass jede zunehmende Zoomstufe sowohl in x- als auch in y-Richtung doppelt so groß ist. Daher enthält jede höhere Zoomstufe die vierfache Auflösung der vorherigen Stufe. Bei Zoomstufe 1 besteht die Karte beispielsweise aus 4 Kacheln mit 256 x 256 Pixeln, was einen Pixelraum von 512 x 512 ergibt. Bei Zoomstufe 19 kann auf jedes x- und y-Pixel auf der Karte mit einem Wert zwischen 0 und 256 * 2 19 verwiesen werden
Ich habe die Maßstäbe für vier Zoomstufen berechnet:
Zoomstufe | Maßstab 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
Es scheint, dass der Maßstab verdoppelt wird, wenn die Zoomstufe um einen Schritt erhöht wird. Ich hoffe also, dass der Maßstab für die Zoomstufe 16 1: 8000 ist und so weiter.
Hallo, ich glaube, ich habe berechnet, dass 1 Pixel = 11,627 km in gerader Linie; ohne Berücksichtigung des Erdradius. Hier der Link des Videos, das erklärt, wie: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . Ich hoffe, das klärt deinen Geist.
Zoom level set meters: ${meters}
); var zoomfactor = 1; if (meter <1128) {zoomfactor = 15; } else if ((meter> 1128) && (meter <2256)) {zoomfactor = 14; } else if ((meter> 2256) && (meter <4513)) {zoomfactor = 13; } else if ((meter> 4513) && (meter <9027)) {zoomfactor = 12; } else if ((meter> 9027) && (meter <18055)) {zoomfactor = 11; } else if ((meter> 18055) && (meter <36111)) {zoomfactor = 10; } else if ((meter> 36111) && (