दस्तावेज़ / कोर / प्रक्षेपण और ज़ूम

प्रक्षेपण और ज़ूम

गोल पृथ्वी को समतल स्क्रीन पर प्रक्षेपित करना प्रक्षेपण है, और यह बताना कि कितना करीब ज़ूम किया गया है, वह ज़ूम है। प्रदाता के अनुसार दोनों की परिभाषाओं में भिन्नता होती है, लेकिन MapConductor 3 प्लेटफ़ॉर्म्स पर समान स्थिरांक और समान सूत्र साझा करता है और प्रकाशित मानों को एक ही पैमाने पर लाता है। कैमरे के उपयोग के लिए कैमरे के पृष्ठ को देखें, यहाँ उसके नीचे के मानों को संभाला जाता है।

ELLIPSOID
WGS84
PROJECTIONS
WebMercator · WGS84
ZOOM RANGE
0 – 22
प्लेटफ़ॉर्म

01 · पृथ्वी के स्थिरांक

प्रक्षेपण, भौगोलिक गणना और टाइल गणना सभी Earth के स्थिरांकों का संदर्भ लेते हैं।

स्थिरांक
मान
विवरण
RADIUS_METERS
6 378 137.0
WGS84 की अर्द्ध-प्रमुख अक्ष (भूमध्य रेखा त्रिज्या)।
CIRCUMFERENCE_METERS
2πa
भूमध्य रेखा की परिधि। टाइल रिज़ॉल्यूशन गणना में उपयोग किया जाता है।
FLATTENING
1 / 298.257223563
चपटाप। दीर्घवृत्ताभ मॉडल के जियोडेसिक गणना में उपयोग किया जाता है।
SEMI_MINOR_AXIS_METERS
a(1 − f)
अर्द्ध-लघु अक्ष (ध्रुवीय त्रिज्या)।
ECCENTRICITY_SQUARED
f(2 − f)
पहली उत्केंद्रता का वर्ग।
WEB_MERCATOR_MAX_EXTENT_METERS
πa ≈ 20 037 508.34
वेब मर्केटर के निर्देशांक का अधिकतम संभावित मान। प्रक्षेपण के बाद x और y इस सीमा के भीतर आते हैं।

02 · प्रक्षेपण

प्रक्षेपण प्रकार में केवल project और unproject दो प्रकार होते हैं। निर्देशांकों को समतल निर्देशांकों (Offset) में गिराना और फिर वापस लाना एक सममित ऑपरेशन है। दो कार्यान्वयन उपलब्ध हैं।

WebMercator

मीटर में वेब मर्केटर

EPSG:3857 के समान, ±20,037,508.34 m के समतल पर प्रक्षेपित करता है। टाइल सीमाओं की गणना और स्क्रीन पर दूरी को मीटर में बदलने की प्रक्रिया में उपयोग होता है।

WGS84

256 पिक्सेल टाइल निर्देशांक

ज़ूम 0 की एक टाइल (256×256) को इकाई के रूप में उपयोग करने वाले निर्देशांक में प्रक्षेपित करता है। टाइल छवियाँ उत्पन्न करने वाले रेंडरर द्वारा उपयोग किया जाने वाला निर्देशांक प्रणाली है।

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

val meters = WebMercator.project(tokyo)   // x, y मीटर में हैं
val tile = WGS84.project(tokyo)           // 0 से 256 तक के टाइल निर्देशांक

जब स्क्रीन पर पिक्सेल और निर्देशांकों के बीच परस्पर रूपांतरण की आवश्यकता होती है, तो प्रक्षेपण के बजाय MapViewHolder के toScreenOffset / fromScreenOffset का उपयोग करें। वास्तव में प्रदर्शित कैमरे का झुकाव और घुमाव इसमें दर्शाया जाता है।

03 · ज़ूम और ऊंचाई रूपांतरण

2D टाइल-आधारित प्रदाता ज़ूम स्तर से, और 3D आधारित प्रदाता कैमरा ऊंचाई या दृश्य दूरी से पैमाना व्यक्त करते हैं। MapConductor इन दोनों को परस्पर रूपांतरित करता है और ऐप को हमेशा समान ज़ूम पैमाने पर दिखाता है। रूपांतरण प्रत्येक प्रदाता के लिए एक वर्ग, एक सामान्य अमूर्त वर्ग को विरासत में लेने के रूप में लागू किया जाता है।

रूपांतरण में अक्षांश और झुकाव शामिल होता है। वेब मर्केटर उच्च अक्षांश पर मानचित्र को अधिक बड़ा करता है, इसलिए समान ज़ूम पर भी भूमध्य रेखा और उच्च अक्षांश पर आवश्यक कैमरा ऊंचाई में कई गुना अंतर होता है।

चित्र · समान ज़ूम मान के लिए आवश्यक कैमरा ऊंचाई (भूमध्य रेखा को 1 मानकर अनुपात)
0° · भूमध्य रेखा
×1.00
30° · काहिरा
×0.87
35° · टोक्यो
×0.82
समान zoom 14 के लिए भी, आप भूमध्य रेखा की तुलना में लगभग 20 प्रतिशत नीचे की स्थिति से देख रहे होंगे।
60° · ओस्लो
×0.50
70° · ट्रोम्सो
×0.34
भूमध्य रेखा के साथ अंतर लगभग 3 गुना है। अक्षांश की अनदेखी करके केवल ऊंचाई को मिलाने पर, दिखाई देने वाली सीमा इतनी शिफ्ट हो जाती है।
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
}

कन्वर्टर प्रत्येक प्रदाता के पैकेज में होता है (ZoomAltitudeConverter)। ऐप को सीधे कॉल करने की आवश्यकता नहीं है, लेकिन अपना स्वयं का 3D प्रतिनिधित्व बनाते समय इसका उपयोग किया जा सकता है।

वीडियो में दिखाया गया कार्यान्वयन · 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) },
    )
}
सैंपल वीडियो · एक ही ज़ूम मान को प्रदाताओं के बीच तुलना करें
वीडियो अभी नहीं बनाएक ही zoom देते हुए प्रदाता को स्विच करें और वास्तविक स्केल में कितना अंतर आता है यह दिखाएं।

04 · सीमा मान

रूपांतरण में उपयोग होने वाला स्थिरांक है। ध्रुवों के पास या सीधे ऊपर से नीचे देखने पर सूत्र अपसारित न हो, इसलिए cos की न्यूनतम सीमा भी स्थिरांक के रूप में तय की गई है।

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

zoom 0 का आधार ऊँचाई केवल सैद्धांतिक रूप से तय की गई वैल्यू नहीं है। एक ही ज़ूम निर्दिष्ट करते समय वास्तव में दिखाई देने वाली सीमा को प्रत्येक इंजन में व्यावहारिक रूप से मापा गया और क्षेत्रफल मेल खाए, इस प्रकार कैलिब्रेट करने का परिणाम है। ज़ूम 1 स्तर पर ऊँचाई आधी हो जाती है (ZOOM_FACTOR = 2) — यह संबंध और केवल यह आधार मान स्थिरांक हैं।

संबंधित पेज