Dokumentation / Core / Projektion und Zoom

Projektion und Zoom

Projektion ist das Abbilden der runden Erde auf einen flachen Bildschirm, Zoom gibt an, wie weit herangezoomt ist. Obwohl die Definitionen für beides je nach Anbieter variieren, nutzt MapConductor dieselben Konstanten und dieselben Formeln auf 3 Plattformen und richtet die veröffentlichten Werte an einem Maßstab aus. Die Verwendung der Kamera finden Sie auf der Kamera-Seite, hier werden die darunterliegenden numerischen Werte behandelt.

ELLIPSOID
WGS84
PROJECTIONS
WebMercator · WGS84
ZOOM RANGE
0 – 22
Plattform

01 · Konstanten der Erde

Projektion, geodätische Berechnung und Kachelberechnung beziehen sich alle auf die Konstanten von Earth.

Konstante
Wert
Beschreibung
RADIUS_METERS
6 378 137.0
Große Halbachse (Äquatorradius) von WGS84.
CIRCUMFERENCE_METERS
2πa
Umfang des Äquators. Wird für die Berechnung der Kachelauflösung verwendet.
FLATTENING
1 / 298.257223563
Abplattung. Wird bei geodätischen Berechnungen im Ellipsoidmodell verwendet.
SEMI_MINOR_AXIS_METERS
a(1 − f)
Kleine Halbachse (Polradius).
ECCENTRICITY_SQUARED
f(2 − f)
Quadrat der ersten numerischen Exzentrizität.
WEB_MERCATOR_MAX_EXTENT_METERS
πa ≈ 20 037 508.34
Maximaler möglicher Wert für Web-Mercator-Koordinaten. Die projizierten x- und y-Werte liegen in diesem Bereich.

02 · Projektion

Der Projektionstyp besitzt nur die beiden Methoden `project` und `unproject`. Es handelt sich um eine symmetrische Operation, bei der Koordinaten in ebene Koordinaten (`Offset`) projiziert und wieder zurückverwandelt werden. Es sind zwei Implementierungen verfügbar.

WebMercator

Web-Mercator in Metern

Projiziert auf eine Ebene von ±20,037,508.34 m, identisch mit EPSG:3857. Wird für Berechnungen von Kachelgrenzen und zur Umrechnung von Bildschirmabständen in Meter verwendet.

WGS84

256-Pixel-Kachelkoordinaten

Projiziert in ein Koordinatensystem, das auf einer einzigen Kachel bei Zoom 0 (256×256) basiert. Ein Koordinatensystem, das von Renderern zur Generierung von Kachelbildern verwendet wird.

com.mapconductor.core.projection
interface ProjectionInterface {
    fun project(position: GeoPointInterface): Offset
    fun unproject(point: Offset): GeoPointInterface
}

val meters = WebMercator.project(tokyo)   // x und y sind in Metern
val tile = WGS84.project(tokyo)           // Kachelkoordinaten von 0 bis 256

Wenn eine gegenseitige Umrechnung von Bildschirmpixeln und Koordinaten erforderlich ist, verwenden Sie bitte `toScreenOffset` / `fromScreenOffset` von `MapViewHolder` statt der Projektion. Die tatsächliche Kameraneigung und -drehung werden dabei berücksichtigt.

03 · Umrechnung zwischen Zoom und Höhe

2D-Kachelanbieter verwenden den Zoom-Level, 3D-Anbieter verwenden die Kamerahöhe oder den Betrachtungsabstand für den Maßstab. MapConductor rechnet diese beiden Werte gegeneinander um und zeigt der App immer denselben Zoom-Maßstab an. Die Umrechnung wird für jeden Anbieter in einer Klasse implementiert, die eine gemeinsame abstrakte Klasse erbt.

Die Umrechnung bezieht Breitengrad und Neigung ein. Web Mercator vergrößert die Karte in hohen Breitengraden, sodass selbst bei gleichem Zoom die erforderliche Kamerahöhe am Äquator und in hohen Breitengraden um ein Vielfaches differs.

Abb. · Erforderliche Kamerahöhe bei gleichem Zoom-Wert (Verhältnis, Äquator = 1)
0° · Äquator
×1.00
30° · Kairo
×0.87
35° · Tokio
×0.82
Auch bei `zoom` 14 betrachten Sie es aus einer Position, die etwa 20 % niedriger ist als am Äquator.
60° · Oslo
×0.50
70° · Tromsø
×0.34
Der Unterschied zum Äquator beträgt etwa das 3-fache. Wenn Sie nur die Höhe anpassen und den Breitengrad ignorieren, verschiebt sich der sichtbare Bereich so weit.
AbstractZoomAltitudeConverter · Kotlin
abstract class AbstractZoomAltitudeConverter(
    protected val zoom0Altitude: Double,
) {
    abstract fun zoomLevelToAltitude(zoomLevel: Double, latitude: Double, tilt: Double): Double

    abstract fun altitudeToZoomLevel(altitude: Double, latitude: Double, tilt: Double): Double
}

Jedes Anbieterpaket enthält einen Konverter (`ZoomAltitudeConverter`). Die App muss ihn nicht direkt aufrufen, aber er kann verwendet werden, wenn Sie eine eigene 3D-Darstellung erstellen.

Implementierung im Video ansehen · Android + MapLibreKotlin · Jetpack Compose
// The same camera position handed to both states
val shared = MapCameraPosition(
    position = GeoPoint.fromLatLong(35.6812, 139.7671),
    zoom = 14.0,
)
val maplibre = rememberMapLibreMapViewState(cameraPosition = shared)
val googlemaps = rememberGoogleMapViewState(cameraPosition = shared)

// Move one and the same value goes to the other
Row {
    MapLibreMapView(
        state = maplibre,
        modifier = Modifier.weight(1f),
        onCameraMoveEnd = { googlemaps.moveCameraTo(it) },
    )
    GoogleMapView(
        state = googlemaps,
        modifier = Modifier.weight(1f),
        onCameraMoveEnd = { maplibre.moveCameraTo(it) },
    )
}
Beispielvideo · Zoomwert zwischen Anbietern vergleichen
Video noch nicht aufgenommenDen Anbieter wechseln, während `zoom` gleich bleibt, und zeigen, wie stark die tatsächliche Skaliertung abweicht.

04 · Grenzwerte

Konstanten, die für die Umrechnung verwendet werden. Damit die Formeln in der Nähe der Pole und bei der Draufsicht nicht divergieren, wurde auch eine Untergrenze für `cos` als Konstante festgelegt.

DEFAULT_ZOOM0_ALTITUDE
171,319,879 m
ZOOM_FACTOR
2.0
MIN / MAX_ZOOM_LEVEL
0.0 / 22.0
MIN / MAX_ALTITUDE
100 / 50,000,000 m
MIN_COS_LAT
0.01
MIN_COS_TILT
0.05
WEB_MERCATOR_INITIAL_MPP_256
156,543.033928
TILE SIZE
256 px

Die Referenzhöhe bei `zoom` 0 ist kein rein theoretischer Wert. Es ist das Ergebnis einer Kalibrierung, bei der der tatsächlich sichtbare Bereich für jede Engine gemessen wurde, wenn der gleiche Zoom angegeben wurde, sodass die Flächen übereinstimmen. Einzige Konstanten sind die Beziehung, dass sich die Höhe pro Zoomstufe halbiert (`ZOOM_FACTOR = 2`), und dieser Referenzwert.

Verwandte Seiten