mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
This is briefly moving us over to my fork of pydcs while we wait for https://github.com/pydcs/dcs/pull/206 to be merged. The adaptation is invasive enough that I don't want it lingering for long.
49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Union
|
|
|
|
from dcs import Point
|
|
from shapely.geometry import LineString, MultiLineString, MultiPolygon, Polygon
|
|
|
|
from game.theater import ConflictTheater
|
|
|
|
LeafletLatLon = list[float]
|
|
LeafletPoly = list[LeafletLatLon]
|
|
|
|
|
|
class ShapelyUtil:
|
|
@staticmethod
|
|
def poly_to_leaflet(poly: Polygon, theater: ConflictTheater) -> LeafletPoly:
|
|
if poly.is_empty:
|
|
return []
|
|
return [
|
|
Point(x, y, theater.terrain).latlng().as_list()
|
|
for x, y in poly.exterior.coords
|
|
]
|
|
|
|
@classmethod
|
|
def polys_to_leaflet(
|
|
cls, poly: Union[Polygon, MultiPolygon], theater: ConflictTheater
|
|
) -> list[LeafletPoly]:
|
|
if isinstance(poly, MultiPolygon):
|
|
polys = poly.geoms
|
|
else:
|
|
polys = [poly]
|
|
return [cls.poly_to_leaflet(poly, theater) for poly in polys]
|
|
|
|
@staticmethod
|
|
def line_to_leaflet(
|
|
line: LineString, theater: ConflictTheater
|
|
) -> list[LeafletLatLon]:
|
|
return [Point(x, y, theater.terrain).latlng().as_list() for x, y in line.coords]
|
|
|
|
@classmethod
|
|
def lines_to_leaflet(
|
|
cls, line_string: MultiLineString | LineString, theater: ConflictTheater
|
|
) -> list[list[LeafletLatLon]]:
|
|
if isinstance(line_string, MultiLineString):
|
|
lines = line_string.geoms
|
|
else:
|
|
lines = [line_string]
|
|
return [cls.line_to_leaflet(line, theater) for line in lines]
|