Clean up leaflet polygon API surface.

This commit is contained in:
Dan Albert 2022-03-06 23:25:25 -08:00
parent 15176223fa
commit 6ee235545f
10 changed files with 53 additions and 65 deletions

View File

@ -255,7 +255,7 @@ export type GetFlightByIdApiArg = {
withWaypoints?: boolean;
};
export type GetCommitBoundaryForFlightApiResponse =
/** status 200 Successful Response */ number[][];
/** status 200 Successful Response */ LatLng[];
export type GetCommitBoundaryForFlightApiArg = {
flightId: string;
};
@ -352,26 +352,26 @@ export type HttpValidationError = {
detail?: ValidationError[];
};
export type HoldZones = {
homeBubble: number[][];
targetBubble: number[][];
joinBubble: number[][];
excludedZones: number[][][];
permissibleZones: number[][][];
preferredLines: number[][][];
homeBubble: LatLng[];
targetBubble: LatLng[];
joinBubble: LatLng[];
excludedZones: LatLng[][];
permissibleZones: LatLng[][];
preferredLines: LatLng[][];
};
export type IpZones = {
homeBubble: number[][];
ipBubble: number[][];
permissibleZone: number[][];
safeZones: number[][][];
homeBubble: LatLng[];
ipBubble: LatLng[];
permissibleZone: LatLng[];
safeZones: LatLng[][];
};
export type JoinZones = {
homeBubble: number[][];
targetBubble: number[][];
ipBubble: number[][];
excludedZones: number[][][];
permissibleZones: number[][][];
preferredLines: number[][][];
homeBubble: LatLng[];
targetBubble: LatLng[];
ipBubble: LatLng[];
excludedZones: LatLng[][];
permissibleZones: LatLng[][];
preferredLines: LatLng[][];
};
export type Waypoint = {
name: string;
@ -415,17 +415,17 @@ export type SupplyRoute = {
active_transports: string[];
};
export type ThreatZones = {
full: number[][][];
aircraft: number[][][];
air_defenses: number[][][];
radar_sams: number[][][];
full: LatLng[][];
aircraft: LatLng[][];
air_defenses: LatLng[][];
radar_sams: LatLng[][];
};
export type ThreatZoneContainer = {
blue: ThreatZones;
red: ThreatZones;
};
export type NavMeshPoly = {
poly: number[][];
poly: LatLng[];
threatened: boolean;
};
export type NavMesh = {
@ -446,9 +446,9 @@ export type Game = {
map_center: LatLng;
};
export type MapZones = {
inclusion: number[][][];
exclusion: number[][][];
sea: number[][][];
inclusion: LatLng[][];
exclusion: LatLng[][];
sea: LatLng[][];
};
export type UnculledZone = {
position: LatLng;

View File

@ -1,7 +1,6 @@
import { Flight } from "../../api/flight";
import { useGetCommitBoundaryForFlightQuery } from "../../api/liberationApi";
import WaypointMarker from "../waypointmarker";
import { LatLng } from "leaflet";
import { ReactElement } from "react";
import { Polyline } from "react-leaflet";
@ -83,15 +82,8 @@ function CommitBoundary(props: CommitBoundaryProps) {
);
return <></>;
}
// TODO: Fix the response model and clean up.
const positions = data.map(([lat, lng]) => new LatLng(lat, lng));
return (
<Polyline
positions={positions}
color="#ffff00"
weight={1}
interactive={false}
/>
<Polyline positions={data} color="#ffff00" weight={1} interactive={false} />
);
}

View File

@ -1,6 +1,5 @@
import { selectNavMeshes } from "../../api/navMeshSlice";
import { useAppSelector } from "../../app/hooks";
import { LatLng } from "leaflet";
import { LayerGroup, Polygon } from "react-leaflet";
interface NavMeshLayerProps {
@ -13,11 +12,10 @@ export default function NavMeshLayer(props: NavMeshLayerProps) {
return (
<LayerGroup>
{mesh.map((zone, idx) => {
const positions = zone.poly.map(([lat, lng]) => new LatLng(lat, lng));
return (
<Polygon
key={idx}
positions={positions}
positions={zone.poly}
color="#000000"
weight={1}
fill

View File

@ -1,18 +1,16 @@
import { LatLng } from "leaflet";
import { LatLng } from "../../api/liberationApi";
import { Polygon } from "react-leaflet";
interface ThreatZoneProps {
poly: number[][];
poly: LatLng[];
blue: boolean;
}
export default function ThreatZone(props: ThreatZoneProps) {
const color = props.blue ? "#0084ff" : "#c85050";
// TODO: Fix response model so the type can be used directly.
const positions = props.poly.map(([lat, lng]) => new LatLng(lat, lng));
return (
<Polygon
positions={positions}
positions={props.poly}
color={color}
weight={1}
fill

View File

@ -8,7 +8,7 @@ from pydantic import BaseModel
from game.server.combat.models import FrozenCombatJs
from game.server.flights.models import FlightJs
from game.server.frontlines.models import FrontLineJs
from game.server.leaflet import LeafletLatLon
from game.server.leaflet import LeafletPoint
if TYPE_CHECKING:
from game import Game
@ -16,7 +16,7 @@ if TYPE_CHECKING:
class GameUpdateEventsJs(BaseModel):
updated_flight_positions: dict[UUID, LeafletLatLon]
updated_flight_positions: dict[UUID, LeafletPoint]
new_combats: list[FrozenCombatJs]
updated_combats: list[FrozenCombatJs]
ended_combats: list[UUID]
@ -33,7 +33,7 @@ class GameUpdateEventsJs(BaseModel):
deleted_front_lines: set[UUID]
updated_tgos: set[UUID]
updated_control_points: set[int]
reset_on_map_center: LeafletLatLon | None
reset_on_map_center: LeafletPoint | None
game_unloaded: bool
new_turn: bool
@ -55,14 +55,9 @@ class GameUpdateEventsJs(BaseModel):
for c in events.updated_combats
]
recenter_map = None
if events.reset_on_map_center is not None:
recenter_map = events.reset_on_map_center.as_list()
return GameUpdateEventsJs(
updated_flight_positions={
f[0].id: f[1].latlng().as_list()
for f in events.updated_flight_positions
f[0].id: f[1].latlng() for f in events.updated_flight_positions
},
new_combats=new_combats,
updated_combats=updated_combats,
@ -84,7 +79,7 @@ class GameUpdateEventsJs(BaseModel):
deleted_front_lines=events.deleted_front_lines,
updated_tgos=events.updated_tgos,
updated_control_points=events.updated_control_points,
reset_on_map_center=recenter_map,
reset_on_map_center=events.reset_on_map_center,
game_unloaded=events.game_unloaded,
new_turn=events.new_turn,
)

View File

@ -3,14 +3,12 @@ from __future__ import annotations
from typing import Union
from dcs import Point
from dcs.mapping import LatLng
from pydantic import BaseModel
from shapely.geometry import LineString, MultiLineString, MultiPolygon, Polygon
from game.theater import ConflictTheater
LeafletLatLon = list[float]
LeafletPoly = list[LeafletLatLon]
class LeafletPoint(BaseModel):
lat: float
@ -22,13 +20,20 @@ class LeafletPoint(BaseModel):
title = "LatLng"
LeafletPoly = list[LeafletPoint]
class ShapelyUtil:
@staticmethod
def poly_to_leaflet(poly: Polygon, theater: ConflictTheater) -> LeafletPoly:
def latlng_to_leaflet(latlng: LatLng) -> LeafletPoint:
return LeafletPoint(lat=latlng.lat, lng=latlng.lng)
@classmethod
def poly_to_leaflet(cls, poly: Polygon, theater: ConflictTheater) -> LeafletPoly:
if poly.is_empty:
return []
return [
Point(x, y, theater.terrain).latlng().as_list()
cls.latlng_to_leaflet(Point(x, y, theater.terrain).latlng())
for x, y in poly.exterior.coords
]
@ -43,15 +48,13 @@ class ShapelyUtil:
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]
def line_to_leaflet(line: LineString, theater: ConflictTheater) -> list[LatLng]:
return [Point(x, y, theater.terrain).latlng() for x, y in line.coords]
@classmethod
def lines_to_leaflet(
cls, line_string: MultiLineString | LineString, theater: ConflictTheater
) -> list[list[LeafletLatLon]]:
) -> list[list[LatLng]]:
if isinstance(line_string, MultiLineString):
lines = line_string.geoms
else:

View File

@ -6,12 +6,12 @@ from PySide2.QtCore import Property, QObject, Signal, Slot
from dcs import Point
from dcs.mapping import LatLng
from game.server.leaflet import LeafletLatLon
from game.theater import ConflictTheater, ControlPoint
from game.utils import meters, nautical_miles
from qt_ui.dialogs import Dialog
from qt_ui.models import GameModel
from qt_ui.windows.basemenu.QBaseMenu2 import QBaseMenu2
from .leaflet import LeafletLatLon
MAX_SHIP_DISTANCE = nautical_miles(80)

View File

@ -0,0 +1,2 @@
LeafletLatLon = list[float]
LeafletPoly = list[LeafletLatLon]

View File

@ -7,13 +7,13 @@ from dcs.mapping import LatLng
from game import Game
from game.profiling import logged_duration
from game.server.leaflet import LeafletLatLon
from game.theater import (
ConflictTheater,
)
from qt_ui.models import GameModel
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
from .controlpointjs import ControlPointJs
from .leaflet import LeafletLatLon
from .supplyroutejs import SupplyRouteJs

View File

@ -5,9 +5,9 @@ from typing import List
from PySide2.QtCore import Property, QObject, Signal
from game import Game
from game.server.leaflet import LeafletLatLon
from game.theater import ControlPoint
from game.transfers import MultiGroupTransport, TransportMap
from .leaflet import LeafletLatLon
class SupplyRouteJs(QObject):