""" Модель геолокационных данных. """ 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" ) ]