add noc eventmap conversion config
This commit is contained in:
parent
ebfc683f7c
commit
4cfd58926b
2 changed files with 57 additions and 0 deletions
51
src/c3nav/mapdata/nocutils.py
Normal file
51
src/c3nav/mapdata/nocutils.py
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
import math
|
||||||
|
from functools import cached_property
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
from pydantic.main import BaseModel
|
||||||
|
from pydantic.type_adapter import TypeAdapter
|
||||||
|
from shapely import Point
|
||||||
|
|
||||||
|
|
||||||
|
def deg2pos(lat_deg, lon_deg):
|
||||||
|
lat_rad = math.radians(lat_deg)
|
||||||
|
xpos = (lon_deg + 180.0) / 360.0
|
||||||
|
ypos = math.asinh(math.tan(lat_rad)) / math.pi / 2.0
|
||||||
|
return ypos, xpos
|
||||||
|
|
||||||
|
|
||||||
|
class NocTransformLayerSchema(BaseModel):
|
||||||
|
level_id: int
|
||||||
|
scale: float | int
|
||||||
|
offset: tuple[float, float] | int
|
||||||
|
|
||||||
|
def convert(self, lat, lng) -> Point:
|
||||||
|
return np.array(deg2pos(lat, lng)) * self.scale + np.array(self.offset)
|
||||||
|
|
||||||
|
|
||||||
|
class NocTwoPointLayerSchema(BaseModel):
|
||||||
|
level_id: int
|
||||||
|
latlng1_noc: tuple[float, float]
|
||||||
|
latlng1_nav: tuple[float, float]
|
||||||
|
latlng2_noc: tuple[float, float]
|
||||||
|
latlng2_nav: tuple[float, float]
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def to_transform(self) -> NocTransformLayerSchema:
|
||||||
|
diff_noc = np.array(deg2pos(*self.latlng1_noc)) - np.array(deg2pos(*self.latlng2_noc))
|
||||||
|
print(diff_noc)
|
||||||
|
diff_nav = np.array(self.latlng1_nav) - np.array(self.latlng2_nav)
|
||||||
|
print(diff_nav)
|
||||||
|
scale = np.linalg.norm(diff_nav) / np.linalg.norm(diff_noc)
|
||||||
|
offset = np.array(self.latlng1_nav) - (np.array(deg2pos(*self.latlng1_noc)) * scale)
|
||||||
|
return NocTransformLayerSchema(
|
||||||
|
level_id=self.level_id,
|
||||||
|
scale=scale,
|
||||||
|
offset=tuple(offset),
|
||||||
|
)
|
||||||
|
|
||||||
|
def convert(self, lat, lng) -> Point:
|
||||||
|
return self.to_transform.convert(lat, lng)
|
||||||
|
|
||||||
|
|
||||||
|
NocLayersSchema = TypeAdapter(dict[str, NocTransformLayerSchema | NocTwoPointLayerSchema])
|
|
@ -14,9 +14,12 @@ from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.utils.crypto import get_random_string
|
from django.utils.crypto import get_random_string
|
||||||
from django.utils.dateparse import parse_duration
|
from django.utils.dateparse import parse_duration
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from pydantic.type_adapter import TypeAdapter
|
||||||
from pyproj import Proj, Transformer
|
from pyproj import Proj, Transformer
|
||||||
|
|
||||||
from c3nav import __version__ as c3nav_version
|
from c3nav import __version__ as c3nav_version
|
||||||
|
from c3nav.api.schema import BaseSchema
|
||||||
|
from c3nav.mapdata.nocutils import NocLayersSchema
|
||||||
from c3nav.utils.config import C3navConfigParser
|
from c3nav.utils.config import C3navConfigParser
|
||||||
from c3nav.utils.environ import Env
|
from c3nav.utils.environ import Env
|
||||||
|
|
||||||
|
@ -215,6 +218,9 @@ if not HUB_API_SECRET:
|
||||||
if HUB_API_SECRET_FILE.exists():
|
if HUB_API_SECRET_FILE.exists():
|
||||||
HUB_API_SECRET = HUB_API_SECRET_FILE.read_text().strip()
|
HUB_API_SECRET = HUB_API_SECRET_FILE.read_text().strip()
|
||||||
|
|
||||||
|
NOC_API_BASE = config.get('c3nav', 'noc_api_base', fallback='').removesuffix('/')
|
||||||
|
NOC_LAYERS = NocLayersSchema.validate_json(config.get('c3nav', 'noc_layers', fallback='{}'))
|
||||||
|
|
||||||
_db_backend = config.get('database', 'backend', fallback='sqlite3')
|
_db_backend = config.get('database', 'backend', fallback='sqlite3')
|
||||||
DATABASES: dict[str, dict[str, str | int | Path]] = {
|
DATABASES: dict[str, dict[str, str | int | Path]] = {
|
||||||
'default': env.db_url('C3NAV_DATABASE') if 'C3NAV_DATABASE' in env else {
|
'default': env.db_url('C3NAV_DATABASE') if 'C3NAV_DATABASE' in env else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue