Unter diesen Bedingungen:
- eine Skala wie
1:50000
- Die Mitte des Ansichtsfensters ist
100°E, 20°N
- Die Größe des Ansichtsfensters ist
400x600
Wie kann ich den Begrenzungsrahmen des Ansichtsfensters berechnen?
Das geografische Koordinatensystem der Karte lautet EPSG: 4490.
Wir möchten sie in einer anderen Projektion wie Mercator oder latitude_longitude_projection anzeigen (vielleicht ist dies die so genannte nicht projizierte).
Die Größe des Ansichtsfensters ist in Pixel angegeben.
android
scale
resolution
giser
quelle
quelle
Antworten:
Ok, mit einigen anfänglichen Problemen ist die Aufgabe relativ einfach.
Maßstab, dargestellt als f.ex 1: 50000, bedeutet, dass eine Einheit auf der Karte 50.000 Einheiten in der realen Welt entspricht.
Für eine Papierkarte im Maßstab 1: 50000 bedeutet dies, dass 1 Meter auf der Karte 50.000 Metern in der realen Welt entspricht, oder um es einfacher zu machen: 1 cm auf der Karte entspricht 50 Metern in der realen Welt. So weit, ist es gut.
Wenn Computer (oder Telefonbildschirme) die Show betreten, ist es viel schwieriger: Die Maßeinheit auf einem Bildschirm ist ein Pixel, das nicht direkt auf Zentimeter abgebildet wird. OpenLayers verwenden (oder zumindest wo) die "Punkte pro Zoll" und gehen davon aus, dass ein Zoll 72 Pixel entspricht (dies ist auf 72-dpi-Bildschirmen sinnvoll, auf Retina-Displays jedoch falsch. Aber bleiben wir vorerst bei 72 dpi (wie es die meisten Mapping-Bibliotheken tun (ich denke, Korrekturen sind willkommen)).
OpenLayers hat eine Funktion OpenLayers.Util.getResolutionFromScale (siehe Quelle ):
Mit Einheiten = "Grad" (was EPSG: 4490 ist, nach dem, was ich erfahre) erhalten wir Zoll_per Einheit = 4374754 (OpenLayers.INCHES_PER_UNIT ["Grad"])
Ein Maßstab von 1: 50000 (entspricht 1/50000 = 0,00002) (dies berechnet penLayers.Util.normalizeScale) ergibt normScale = 0,00002
Wir können dann die Auflösung als berechnen
Wenn wir den Mittelpunkt (lon = 100, lat = 30), die Pixelgröße des Ansichtsfensters (w = 400, h = 600) und die Auflösung kennen, können wir die Funktion berechne Grenzen aus OpenLayers.Map verwenden (siehe Quelle ):
was wir reduzieren können auf:
Wenn wir dies mit unseren Werten bezeichnen, erhalten wir:
Wir können all dies dann zu einer Funktion kombinieren, die für Grade mit angegebenem Skalennenner funktioniert:
quelle
dpi
Wert zu sein. Ist es nicht?