agrobot_base/AgroBase/OperationControl/Mapas/Models/MapaDocumento.cs

88 lines
2.6 KiB
C#

using AgroBase.Models;
using NetTopologySuite.Geometries;
using System.Linq;
using static AgroBase.Models.Enums;
namespace OperationControl.Mapas.Models
{
public class MapaDocumento
{
public string Nome { get; set; } = string.Empty;
/// <summary>
/// Arquivo que originou este documento.
/// Pode deixar de existir futuramente após edições/salvamento,
/// portanto não deve ser usado como fonte de verdade do mapa.
/// </summary>
public string? CaminhoOrigem { get; set; }
public MapaFormatoOrigem FormatoOrigem { get; set; }
= MapaFormatoOrigem.Desconhecido;
public TipoMapaOperacao Tipo { get; set; }
= TipoMapaOperacao.Indefinido;
/// <summary>
/// O documento interno trabalha sempre em WGS84.
/// </summary>
public int Srid => 4326;
public List<MapaRua> Ruas { get; set; } = new();
/// <summary>
/// Indica alteração posterior à importação.
/// No carregamento inicial sempre começa false.
/// </summary>
public bool Modificado { get; set; }
/// <summary>
/// Avisos que não impediram a importação.
///
/// Exemplos:
/// - SHP sem PRJ, mas já aparentemente em longitude/latitude;
/// - PRJ inválido ignorado com segurança;
/// - IDs ausentes/duplicados corrigidos.
/// </summary>
public List<string> AvisosImportacao { get; set; } = new();
public bool PossuiRuas =>
Ruas != null && Ruas.Count > 0;
public int QuantidadeRuas =>
Ruas?.Count ?? 0;
public double ComprimentoTotalMetros =>
Ruas?.Sum(x => x?.ComprimentoMetros ?? 0.0) ?? 0.0;
/// <summary>
/// Limite espacial do documento em WGS84.
/// Pode ser usado posteriormente pelo renderizador
/// para enquadrar o mapa.
/// </summary>
public Envelope Limites
{
get
{
var envelope = new Envelope();
if (Ruas == null)
return envelope;
foreach (var rua in Ruas)
{
if (rua?.Geometria == null ||
rua.Geometria.IsEmpty)
{
continue;
}
envelope.ExpandToInclude(
rua.Geometria.EnvelopeInternal
);
}
return envelope;
}
}
}
}