mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Holes in the inclusion zone are defined by exclusion zones, not by holes in the inclusion zone. Add a cached property for the inclusion zone that is not also sea or exclusion zone and use that boundary instead.
50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
from dataclasses import dataclass
|
|
import pickle
|
|
from functools import cached_property
|
|
from typing import Optional, Tuple, Union
|
|
import logging
|
|
|
|
from shapely import geometry
|
|
from shapely.geometry import MultiPolygon, Polygon
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Landmap:
|
|
inclusion_zones: MultiPolygon
|
|
exclusion_zones: MultiPolygon
|
|
sea_zones: MultiPolygon
|
|
|
|
def __post_init__(self):
|
|
if not self.inclusion_zones.is_valid:
|
|
raise RuntimeError("Inclusion zones not valid")
|
|
if not self.exclusion_zones.is_valid:
|
|
raise RuntimeError("Exclusion zones not valid")
|
|
if not self.sea_zones.is_valid:
|
|
raise RuntimeError("Sea zones not valid")
|
|
|
|
@cached_property
|
|
def inclusion_zone_only(self) -> MultiPolygon:
|
|
return self.inclusion_zones - self.exclusion_zones - self.sea_zones
|
|
|
|
|
|
def load_landmap(filename: str) -> Optional[Landmap]:
|
|
try:
|
|
with open(filename, "rb") as f:
|
|
return pickle.load(f)
|
|
except:
|
|
logging.exception(f"Failed to load landmap {filename}")
|
|
return None
|
|
|
|
|
|
def poly_contains(x, y, poly: Union[MultiPolygon, Polygon]):
|
|
return poly.contains(geometry.Point(x, y))
|
|
|
|
|
|
def poly_centroid(poly) -> Tuple[float, float]:
|
|
x_list = [vertex[0] for vertex in poly]
|
|
y_list = [vertex[1] for vertex in poly]
|
|
x = sum(x_list) / len(poly)
|
|
y = sum(y_list) / len(poly)
|
|
return (x, y)
|
|
|