baremetal-int/shadow-geolocate
GitHub: baremetal-int/shadow-geolocate
利用阴影方向与太阳几何关系进行照片/视频地理定位推断的开源工具,支持城市体积模拟与 EXIF 交叉验证。
Stars: 0 | Forks: 0
# shadow-geolocate
[](https://github.com/baremetal-int/shadow-geolocate/actions/workflows/ci.yml)
[](LICENSE)

基于阴影和太阳几何的地理位置推断,并提供城市体积支持。
验证社区的链接。其中最有价值的文件是
[`docs/limits.md`](docs/limits.md) —— 记录了每种方法失效的场景。
```
src/shadow_geolocate/
solar.py azimuth, elevation (pysolar / suncalc)
urban.py Shadowmap / ShadeMap integration
horizon.py horizon-line validation
exif.py EXIF cross-check
video.py ffmpeg decomposition, mosaicking
docs/limits.md <- read this first
```
## 功能及其适用范围
在自然地形和宏观尺度下,平坦的太阳几何是可靠的。在
城市峡谷中,建筑物的高度会扭曲投影,导致几何计算产生偏差。
`docs/limits.md` 说明了密度阈值,超过该阈值时你必须转而使用
体积模拟,以及任何方法都完全失效的情况:阴天、
漫反射阴影、至日歧义。
## 安装
```
pip install -e ".[dev]" # core (numpy + pyyaml) plus test/lint tooling
```
分析核心在导入时仅依赖 `numpy` 和 `pyyaml`。繁重的操作
后端(pysolar, piexif/exifread, ffmpeg-python, rasterio, shapely, geopandas)
位于 `full` extra 中,并在使用它们的函数内部进行懒加载:
```
pip install -e ".[full]" # volumetric ShadeMap, EXIF/GPS parsing, ffmpeg
```
## 快速入门
获取特定地点和 UTC 时间的太阳方位角/高度角,以及其投射的阴影:
```
python -c "import datetime as dt; from shadow_geolocate import solar, urban; \
p = solar.solar_position(45.0, 0.0, solar.solar_noon_utc(0.0, dt.date(2023,3,20))); \
print(round(p.azimuth,1), round(p.elevation,1), round(urban.shadow_length(10.0, p.elevation),2))"
# -> 180.0 44.5 10.16 (正南方向,向上约 45 度,一根 10 m 的桅杆投射出约 10 m 的阴影)
```
根据照片声称的阴影方位与其 EXIF 时间和 GPS 进行交叉验证:
```
import datetime as dt
from shadow_geolocate import exif
check = exif.shadow_direction_consistency(
observed_shadow_azimuth=5.0, latitude=48.0, longitude=0.0,
when=dt.datetime(2023, 6, 21, 9, 0, 0),
)
print(check.consistent, round(check.residual_deg, 1))
```
运行测试:
```
PYTHONPATH=src pytest -q
```
## 许可证
MIT。
标签:Python, 图像情报, 地理定位, 城市体积, 太阳几何, 恶意代码分类, 无后门, 逆向工具, 阴影分析