26 lines
829 B
Python
26 lines
829 B
Python
"""Small geospatial math helpers for lon/lat products."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import math
|
|
|
|
|
|
def meters_to_degrees(meters: float, lat: float) -> tuple[float, float]:
|
|
deg_lat = meters / 111_320.0
|
|
deg_lon = meters / max(111_320.0 * math.cos(math.radians(lat)), 1.0)
|
|
return deg_lon, deg_lat
|
|
|
|
|
|
def pixel_area_m2(info) -> float:
|
|
center_lat = info.y0 - info.lines * info.dy * 0.5
|
|
meters_per_deg_lat = 111_320.0
|
|
meters_per_deg_lon = 111_320.0 * math.cos(math.radians(center_lat))
|
|
return abs(info.dx * meters_per_deg_lon * info.dy * meters_per_deg_lat)
|
|
|
|
|
|
def polygon_area_m2(geom, center_lat: float) -> float:
|
|
meters_per_deg_lat = 111_320.0
|
|
meters_per_deg_lon = 111_320.0 * math.cos(math.radians(center_lat))
|
|
return float(abs(geom.area) * meters_per_deg_lon * meters_per_deg_lat)
|
|
|