仰角可见性计算:包含正上方边界、阈值边界与常规场景。
| 111 | # check_visibility # |
| 112 | # --------------------------------------------------------------------------- # |
| 113 | class TestCheckVisibility: |
| 114 | """仰角可见性计算:包含正上方边界、阈值边界与常规场景。""" |
| 115 | |
| 116 | # --- 正上方边界(d < 0.001 特殊分支) --- |
| 117 | |
| 118 | def test_overhead_visible_min_el_0(self): |
| 119 | """卫星正上方:d < 0.001,仰角 = 90°,任何 min_elevation 阈值均可见。""" |
| 120 | sat = {"lat": 35.0, "lon": 139.0, "alt": 500000} |
| 121 | gs = {"lat": 35.0, "lon": 139.0} |
| 122 | assert check_visibility(sat, gs, min_elevation=0) is True |
| 123 | |
| 124 | def test_overhead_visible_min_el_10(self): |
| 125 | """正上方仰角 = 90°,10° 阈值也应可见。""" |
| 126 | sat = {"lat": 35.0, "lon": 139.0, "alt": 500000} |
| 127 | gs = {"lat": 35.0, "lon": 139.0} |
| 128 | assert check_visibility(sat, gs, min_elevation=10) is True |
| 129 | |
| 130 | def test_overhead_visible_min_el_90(self): |
| 131 | """正上方仰角 = 90°,90° 阈值也应可见(临界等号)。""" |
| 132 | sat = {"lat": 35.0, "lon": 139.0, "alt": 500000} |
| 133 | gs = {"lat": 35.0, "lon": 139.0} |
| 134 | assert check_visibility(sat, gs, min_elevation=90) is True |
| 135 | |
| 136 | def test_overhead_different_altitude(self): |
| 137 | """不同高度的正上方卫星,均应可见(仰角 = 90°)。""" |
| 138 | gs = {"lat": 51.5, "lon": -0.1} |
| 139 | for alt_m in [300000, 550000, 1000000, 35786000]: |
| 140 | sat = {"lat": 51.5, "lon": -0.1, "alt": alt_m} |
| 141 | assert check_visibility(sat, gs, min_elevation=10) is True, ( |
| 142 | f"高度 {alt_m} m 的正上方卫星不应不可见" |
| 143 | ) |
| 144 | |
| 145 | # --- 仰角阈值边界 --- |
| 146 | |
| 147 | def test_small_angle_below_threshold(self): |
| 148 | """地心角约 0.5°、500km 高度:精确 ENU 仰角约 83°,远高于 10° 阈值,应可见。 |
| 149 | |
| 150 | 注:原球面正弦近似错误地将此情形计算为仰角 ~6.3°;ENU 拓扑坐标 |
| 151 | 给出的 ~83° 才是物理正确值(卫星几乎在正上方)。 |
| 152 | """ |
| 153 | sat = {"lat": 35.5, "lon": 139.0, "alt": 500000} |
| 154 | gs = {"lat": 35.0, "lon": 139.0} |
| 155 | assert check_visibility(sat, gs, min_elevation=10) is True |
| 156 | |
| 157 | def test_moderate_angle_above_threshold(self): |
| 158 | """地心角约 1°(仰角约 12.5°)> 10°,可见。""" |
| 159 | sat = {"lat": 36.0, "lon": 139.0, "alt": 500000} |
| 160 | gs = {"lat": 35.0, "lon": 139.0} |
| 161 | assert check_visibility(sat, gs, min_elevation=10) is True |
| 162 | |
| 163 | def test_large_angle_below_threshold(self): |
| 164 | """地心角约 60°(仰角约 3.7°)< 10°,不可见。""" |
| 165 | sat = {"lat": 95.0, "lon": 139.0, "alt": 500000} |
| 166 | gs = {"lat": 35.0, "lon": 139.0} |
| 167 | assert check_visibility(sat, gs, min_elevation=10) is False |
| 168 | |
| 169 | def test_min_elevation_zero_always_passes_for_near_sat(self): |
| 170 | """min_elevation=0 时,较近距离的卫星始终可见。""" |
nothing calls this directly
no outgoing calls
no test coverage detected