tb_dem_ecef_to_geodetic — 2D typed op

• Data kinds: points → points

• Call: fullseye.apply(img, "tb_dem_ecef_to_geodetic", a=0.5, b=0.5) (2-D model = एक image + दो scalar knobs a,b∈[0,1])

*कोई figure नहीं: type तो पहुँचता है, पर सामान्य synthetic input इस op के domain में नहीं आता — ECEF को पृथ्वी-सतह के निर्देशांक (केंद्र से ~6.4M m) चाहिए, पर छवि से बने कृत्रिम बिंदु मूलबिंदु के पास होते हैं, ellipsoid के evolute के अंदर गिरते हैं और हमेशा अस्वीकार होते हैं। उपयोग का तरीका नीचे "चलाए जा सकने वाले उदाहरण" में देखें।*

उपयोग

ECEF → geodetic coordinates। (..., 3) के रूप में (अक्षांश[डिग्री], देशांतर[डिग्री], ऊँचाई[m]) लौटाता है।

Bowring (1976) के closed form के क़रीब का तरीका। round trip (geodetic → ECEF → geodetic) की त्रुटि sample कहाँ से लिया गया उसके अनुसार 1 order of magnitude से ज़्यादा बदलती है, इसलिए इसे range के साथ लिखा गया है (2026-09-08 को दोबारा मापा गया। पहले "latitude, longitude 1e-12 डिग्री से कम, ऊँचाई 1e-7 m से कम" लिखा था, लेकिन ★latitude ±85 डिग्री, ऊँचाई -500 से 9000 m के 4000 points पर ही यह अधिकतम 6.4e-12 डिग्री / 8.5e-07 m से पार हो चुका था —— इसे median 2.6e-13 डिग्री / 3.3e-08 m से गड़बड़ा दिया गया था):

• latitude ±85 डिग्री, ऊँचाई -500 से 9000 m … latitude median 2.6e-13 / अधिकतम 6.4e-12 डिग्री, ऊँचाई median 3.3e-08 / अधिकतम 8.5e-07 m

• latitude ±89.9 डिग्री, ऊँचाई -11 km से 40 km … latitude median 2.9e-12 / अधिकतम 1.3e-10 डिग्री, ऊँचाई median 3.5e-07 / अधिकतम 1.7e-05 m (ध्रुवों की ओर जाने पर 20 गुना ख़राब होता है)

longitude दोनों में अधिकतम 2.8e-14 डिग्री है। ज़मीन पर ये सब µm से कम हैं, और व्यवहार में इन्हें "error floor" मान सकते हैं, लेकिन median को अधिकतम मान के रूप में उद्धृत न करें।

अगर सिर्फ़ geocentric spherical coordinates चाहिए, तो r = |xyz| और geocentric_lat = asin(z/r) काफ़ी हैं —— लेकिन वह geodetic latitude नहीं है (दोनों में अधिकतम 0.19 डिग्री, दूरी में लगभग 21 km का अंतर होता है)। यह op जो लौटाता है वह नक्शे और GPS वाला geodetic latitude है।

★पृथ्वी के केंद्र के पास यह fail-closed तरीके से reject करता है (2026-09-08, poc_geodetic_height_frames इससे टकराया)। ellipsoid के evolute (a·p)^(2/3) + (b·|z|)^(2/3) < (a²-b²)^(2/3) के अंदर, ellipsoid की सतह से खड़ा किया गया normal केवल 1 तय नहीं होता, और geodetic latitude ही अद्वितीय नहीं होता। तब तक यहाँ चुपचाप lat = 180° लौटाया जाता था —— जो latitude के रूप में अस्तित्व में ही नहीं है, और ऊपर से इसका अपना inverse function dem_geodetic_to_ecef इसे "lat_deg must be within [-90, 90]" कहकर reject करता है। यह क्षेत्र equatorial plane में axis से e²a = 42697.7 m तक और polar axis पर (a²-b²)/b = 42841.3 m तक है (मापा गया: 42600 m पर 180 डिग्री, 42700 m पर 0 डिग्री —— closed form की सीमा से ठीक मेल)।

खाली इनपुट (xyz में 0 तत्व) पर ValueError उठता है।

2-D evolution registry में bridge किया गया dem का op dem_ecef_to_geodetic। implementation वही है, केवल calling convention को op(v, a, b) के अनुरूप किया गया है। इस op में कोई tuning knob नहीं है; a और b दोनों का उपयोग नहीं होता।

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

नीचे के उदाहरण मूल ledger op dem_ecef_to_geodetic को call करते हैं। यह bridge op वही implementation है, बस fn(v, a, b) convention के अनुसार ढाला गया है, इसलिए व्यवहार वैसा ही लागू होता है (केवल call का रूप अलग है)।

• dem_geodesy_tour — py -3.11 examples/dem_geodesy_tour.py

• poc_geodetic_benchmarks_real — py -3.11 examples/poc_geodetic_benchmarks_real.py

• poc_geodetic_height_frames — py -3.11 examples/poc_geodetic_height_frames.py

वे अगले ops जिनसे type जुड़ता है (points को input के रूप में लेते हैं)

identity · tb_points_to_voxel · tb_estimate_point_normals · tb_iss_keypoints · tb_project_points · tb_render_point_depth · tb_statistical_outlier_removal · tb_radius_outlier_removal

इसी category के (typed)

tb_points_to_voxel · tb_estimate_point_normals · tb_iss_keypoints · tb_project_points · tb_render_point_depth · tb_statistical_outlier_removal · tb_radius_outlier_removal · tb_voxel_grid_downsample


*Provenance: ops.py — 2D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.