93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
"""
|
||
Модель геолокационных данных.
|
||
"""
|
||
from django.contrib.gis.db import models as gis
|
||
from django.db import models
|
||
|
||
|
||
class Geo(models.Model):
|
||
"""
|
||
Модель геолокационных данных.
|
||
|
||
Хранит информацию о местоположении источника сигнала, включая координаты,
|
||
данные от различных источников (геолокация, кубсат, оперативники) и расстояния между ними.
|
||
"""
|
||
|
||
# Основные поля
|
||
timestamp = models.DateTimeField(
|
||
null=True,
|
||
blank=True,
|
||
verbose_name="Время",
|
||
db_index=True,
|
||
help_text="Время фиксации геолокации",
|
||
)
|
||
location = models.CharField(
|
||
max_length=255,
|
||
null=True,
|
||
blank=True,
|
||
verbose_name="Местоположение",
|
||
help_text="Текстовое описание местоположения",
|
||
)
|
||
comment = models.CharField(
|
||
max_length=255,
|
||
blank=True,
|
||
verbose_name="Комментарий",
|
||
help_text="Дополнительные комментарии",
|
||
)
|
||
is_average = models.BooleanField(
|
||
null=True,
|
||
blank=True,
|
||
verbose_name="Усреднённое",
|
||
help_text="Является ли координата усредненной",
|
||
)
|
||
|
||
# Координаты
|
||
coords = gis.PointField(
|
||
srid=4326,
|
||
null=True,
|
||
blank=True,
|
||
verbose_name="Координата геолокации",
|
||
help_text="Основные координаты геолокации (WGS84)",
|
||
)
|
||
|
||
# Связи
|
||
mirrors = models.ManyToManyField(
|
||
'mainapp.Satellite',
|
||
related_name="geo_mirrors",
|
||
verbose_name="Зеркала",
|
||
blank=True,
|
||
help_text="Спутники-зеркала, использованные для приема",
|
||
)
|
||
objitem = models.OneToOneField(
|
||
'mainapp.ObjItem',
|
||
on_delete=models.CASCADE,
|
||
verbose_name="Объект",
|
||
related_name="geo_obj",
|
||
null=True,
|
||
help_text="Связанный объект",
|
||
)
|
||
|
||
def __str__(self):
|
||
if self.coords:
|
||
longitude = self.coords.coords[0]
|
||
latitude = self.coords.coords[1]
|
||
lon = f"{longitude}E" if longitude > 0 else f"{abs(longitude)}W"
|
||
lat = f"{latitude}N" if latitude > 0 else f"{abs(latitude)}S"
|
||
location_str = f", {self.location}" if self.location else ""
|
||
return f"{lat} {lon}{location_str}"
|
||
return f"Гео #{self.pk}"
|
||
|
||
class Meta:
|
||
verbose_name = "Гео"
|
||
verbose_name_plural = "Гео"
|
||
ordering = ["-timestamp"]
|
||
indexes = [
|
||
models.Index(fields=["-timestamp"]),
|
||
models.Index(fields=["location"]),
|
||
]
|
||
constraints = [
|
||
models.UniqueConstraint(
|
||
fields=["timestamp", "coords"], name="unique_geo_combination"
|
||
)
|
||
]
|