Mejoras en elevaciones, equilibrado y callejero inverso
Añadida visualización de pendientes en los tramos a pie con puntos coloreados: llano, subida y bajada. Añadidos umbrales configurables para subida y bajada junto al interruptor de elevaciones. Añadido callejero inverso en el detalle de la solución, mostrando el lugar del callejero más cercano al origen y al destino. Ajustado el modo Equilib. A para limpiar la tarjeta visualmente y guardar/restaurar el factor usado desde el historial. Mejoras menores en el refresco del resumen técnico de rutas y validación de compilación.
This commit is contained in:
@@ -7,6 +7,7 @@ using LeafletForBlazor;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using RutasDBUS.Modelos.Planificacion;
|
||||
using RutasDBUS.Modelos.Geocodificacion;
|
||||
using RutasDBUS.Modelos.RedBus;
|
||||
using RutasDBUS.Servicios;
|
||||
using RutasDBUS.Servicios.Caminata;
|
||||
@@ -344,6 +345,8 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
private double _duracionTotalSegundos = 0;
|
||||
private double? _altitudOrigenResumenRuta = null;
|
||||
private double? _altitudDestinoResumenRuta = null;
|
||||
private string? _callejeroOrigenResumenRuta = null;
|
||||
private string? _callejeroDestinoResumenRuta = null;
|
||||
|
||||
private readonly List<AlternativaRuta> _opcionesRuta = new();
|
||||
private int _indiceAlternativaSeleccionada = 0;
|
||||
@@ -351,6 +354,8 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
private TimeSpan? _tiempoUltimoCalculoRuta = null;
|
||||
private bool _mostrarElevacionesRuta = false;
|
||||
private bool _pintandoElevacionesRuta = false;
|
||||
private double _umbralPendienteSubidaRuta = 3.0;
|
||||
private double _umbralPendienteBajadaRuta = 3.0;
|
||||
private readonly Dictionary<string, List<Parada>> _paradasItinerarioVisiblesPorId = new(StringComparer.OrdinalIgnoreCase);
|
||||
private readonly Dictionary<string, List<Parada>> _paradasRutaVisiblesPorId = new(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
@@ -1037,7 +1042,8 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
double opacity,
|
||||
string? dashArray = null,
|
||||
bool arrowEnd = false,
|
||||
string? lineCap = null)
|
||||
string? lineCap = null,
|
||||
IReadOnlyList<object>? elevationSegments = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -1045,28 +1051,11 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
"rt.drawRoute",
|
||||
id,
|
||||
LineaToLatLng(linea),
|
||||
new { color, weight, opacity, dashArray, arrowEnd, lineCap }
|
||||
new { color, weight, opacity, dashArray, arrowEnd, lineCap, elevationSegments }
|
||||
);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
private async Task DrawRouteElevationPointsJsAsync(string id, IReadOnlyList<object> points)
|
||||
{
|
||||
try
|
||||
{
|
||||
await JS.InvokeVoidAsync("rt.drawElevPoints", $"route_elev_{id}", points, new
|
||||
{
|
||||
radius = 4,
|
||||
opacity = 0.98,
|
||||
fillOpacity = 0.95,
|
||||
showLabels = false,
|
||||
showSlopeTooltips = true,
|
||||
className = "rt-route-elev-point"
|
||||
});
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ajusta rutas js.
|
||||
@@ -1163,6 +1152,67 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
|
||||
return $"D: Y.Lat = {lat} X.Lon = {lon} Z = {alt}";
|
||||
}
|
||||
|
||||
private string FormatearResumenCallejeroOrigen()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_callejeroOrigenResumenRuta))
|
||||
return string.Empty;
|
||||
|
||||
return $"O callejero: {_callejeroOrigenResumenRuta}";
|
||||
}
|
||||
|
||||
private string FormatearResumenCallejeroDestino()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_callejeroDestinoResumenRuta))
|
||||
return string.Empty;
|
||||
|
||||
return $"D callejero: {_callejeroDestinoResumenRuta}";
|
||||
}
|
||||
|
||||
private static string FormatearLugarCallejeroResumen(LugarGeocodificadoCercano? cercano)
|
||||
{
|
||||
if (cercano is null)
|
||||
return string.Empty;
|
||||
|
||||
var nombre = LimpiarTextoCallejeroResumen(cercano.Lugar.Nombre);
|
||||
if (string.IsNullOrWhiteSpace(nombre))
|
||||
nombre = LimpiarTextoCallejeroResumen(cercano.Lugar.Subtitulo);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(nombre))
|
||||
return string.Empty;
|
||||
|
||||
var distancia = FormatearDistanciaCallejeroResumen(cercano.DistanciaMetros);
|
||||
if (string.IsNullOrWhiteSpace(distancia))
|
||||
return nombre;
|
||||
|
||||
return cercano.DistanciaMetros <= 20
|
||||
? $"{nombre} ({distancia})"
|
||||
: $"mas cercano: {nombre} ({distancia})";
|
||||
}
|
||||
|
||||
private static string LimpiarTextoCallejeroResumen(string texto)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(texto))
|
||||
return string.Empty;
|
||||
|
||||
texto = texto
|
||||
.Replace(" · ", " - ", StringComparison.Ordinal)
|
||||
.Replace("·", "-", StringComparison.Ordinal)
|
||||
.Replace("·", "-", StringComparison.Ordinal);
|
||||
|
||||
return Regex.Replace(texto, @"\s+", " ").Trim();
|
||||
}
|
||||
|
||||
private static string FormatearDistanciaCallejeroResumen(double distanciaMetros)
|
||||
{
|
||||
if (!double.IsFinite(distanciaMetros) || distanciaMetros < 0)
|
||||
return string.Empty;
|
||||
|
||||
if (distanciaMetros < 1000)
|
||||
return $"{Math.Round(distanciaMetros):0} m";
|
||||
|
||||
return $"{(distanciaMetros / 1000.0).ToString("0.000", CultureInfo.InvariantCulture)} km";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Formatea duracion.
|
||||
@@ -1638,6 +1688,8 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
_duracionTotalSegundos = 0;
|
||||
_altitudOrigenResumenRuta = null;
|
||||
_altitudDestinoResumenRuta = null;
|
||||
_callejeroOrigenResumenRuta = null;
|
||||
_callejeroDestinoResumenRuta = null;
|
||||
|
||||
_paradaOrigenSeleccionada = null;
|
||||
_paradaDestinoSeleccionada = null;
|
||||
|
||||
@@ -1261,7 +1261,7 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
private bool _elevPopupMinimizado = false;
|
||||
|
||||
|
||||
private const string _versionApp = "(v-20260709a)";
|
||||
private const string _versionApp = "(v-20260710a)";
|
||||
|
||||
|
||||
private double? _paradaElevG;
|
||||
|
||||
@@ -36,6 +36,8 @@ public partial class PlanificadorRutas
|
||||
public double? CoeficienteEsfuerzoAltura { get; set; }
|
||||
public double? PesoTransbordoRankingMinutos { get; set; }
|
||||
public double? FactorEquilibradoAndarBus { get; set; }
|
||||
public double? UmbralPendienteSubidaRuta { get; set; }
|
||||
public double? UmbralPendienteBajadaRuta { get; set; }
|
||||
public double VelocidadPieKmH { get; set; }
|
||||
public double VelocidadBusKmH { get; set; }
|
||||
public int ElevMaxPuntosPorTramo { get; set; }
|
||||
@@ -136,6 +138,8 @@ public partial class PlanificadorRutas
|
||||
CoeficienteEsfuerzoAltura = _coeficienteEsfuerzoAltura,
|
||||
PesoTransbordoRankingMinutos = _pesoTransbordoRankingMinutos,
|
||||
FactorEquilibradoAndarBus = _factorEquilibradoAndarBus,
|
||||
UmbralPendienteSubidaRuta = _umbralPendienteSubidaRuta,
|
||||
UmbralPendienteBajadaRuta = _umbralPendienteBajadaRuta,
|
||||
VelocidadPieKmH = _velocidadPieKmH,
|
||||
VelocidadBusKmH = _velocidadBusKmH,
|
||||
ElevMaxPuntosPorTramo = _elevMaxPuntosPorTramo,
|
||||
@@ -192,6 +196,10 @@ public partial class PlanificadorRutas
|
||||
_pesoTransbordoRankingMinutos = Math.Abs(pesoTransbordo - 8.0) < 0.0001 ? 4.0 : Math.Max(0, pesoTransbordo);
|
||||
if (config.FactorEquilibradoAndarBus is { } factorEquilibrado && double.IsFinite(factorEquilibrado))
|
||||
_factorEquilibradoAndarBus = Math.Max(0, factorEquilibrado);
|
||||
if (config.UmbralPendienteSubidaRuta is { } umbralSubida && double.IsFinite(umbralSubida))
|
||||
_umbralPendienteSubidaRuta = NormalizarUmbralPendienteRuta(umbralSubida);
|
||||
if (config.UmbralPendienteBajadaRuta is { } umbralBajada && double.IsFinite(umbralBajada))
|
||||
_umbralPendienteBajadaRuta = NormalizarUmbralPendienteRuta(umbralBajada);
|
||||
_velocidadPieKmH = Math.Clamp(config.VelocidadPieKmH, 0.5, 25.0);
|
||||
_velocidadBusKmH = Math.Clamp(
|
||||
Math.Abs(config.VelocidadBusKmH - 15.0) < 0.0001 ||
|
||||
@@ -295,6 +303,8 @@ public partial class PlanificadorRutas
|
||||
_coeficienteEsfuerzoAltura = CoeficienteEsfuerzoAlturaPorDefecto;
|
||||
_pesoTransbordoRankingMinutos = 4.0;
|
||||
_factorEquilibradoAndarBus = 12.0;
|
||||
_umbralPendienteSubidaRuta = 3.0;
|
||||
_umbralPendienteBajadaRuta = 3.0;
|
||||
_velocidadPieKmH = 3.6;
|
||||
_velocidadBusKmH = 16.0;
|
||||
_minutosTransbordo = 5;
|
||||
@@ -342,6 +352,8 @@ public partial class PlanificadorRutas
|
||||
_coeficienteEsfuerzoAltura = CoeficienteEsfuerzoAlturaPorDefecto;
|
||||
_pesoTransbordoRankingMinutos = 4.0;
|
||||
_factorEquilibradoAndarBus = 12.0;
|
||||
_umbralPendienteSubidaRuta = 3.0;
|
||||
_umbralPendienteBajadaRuta = 3.0;
|
||||
_velocidadPieKmH = 3.6;
|
||||
_velocidadBusKmH = 16.0;
|
||||
_minutosTransbordo = 5;
|
||||
|
||||
@@ -331,6 +331,43 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
_altitudDestinoResumenRuta = null;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ActualizarCallejeroResumenRutaAsync(CancellationToken ct)
|
||||
{
|
||||
if (_coordenadasOrigen is null || _coordenadasDestino is null)
|
||||
{
|
||||
_callejeroOrigenResumenRuta = null;
|
||||
_callejeroDestinoResumenRuta = null;
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var origen = await GeocodificadorLocal.BuscarMasCercanoAsync(
|
||||
_coordenadasOrigen[0],
|
||||
_coordenadasOrigen[1],
|
||||
ct);
|
||||
|
||||
var destino = await GeocodificadorLocal.BuscarMasCercanoAsync(
|
||||
_coordenadasDestino[0],
|
||||
_coordenadasDestino[1],
|
||||
ct);
|
||||
|
||||
_callejeroOrigenResumenRuta = FormatearLugarCallejeroResumen(origen);
|
||||
_callejeroDestinoResumenRuta = FormatearLugarCallejeroResumen(destino);
|
||||
}
|
||||
catch
|
||||
{
|
||||
_callejeroOrigenResumenRuta = null;
|
||||
_callejeroDestinoResumenRuta = null;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ActualizarResumenTecnicoRutaAsync(CancellationToken ct)
|
||||
{
|
||||
await ActualizarAlturasResumenRutaAsync(ct);
|
||||
await ActualizarCallejeroResumenRutaAsync(ct);
|
||||
}
|
||||
|
||||
|
||||
private static readonly ConcurrentDictionary<string, double> _elevIdeeCache =
|
||||
@@ -2170,7 +2207,7 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
_hayRutaValida = false;
|
||||
try
|
||||
{
|
||||
await ActualizarAlturasResumenRutaAsync(CancellationToken.None);
|
||||
await ActualizarResumenTecnicoRutaAsync(CancellationToken.None);
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -2194,7 +2231,7 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
{
|
||||
await RegistrarEscenarioActualEnHistorialLocalAsync();
|
||||
}
|
||||
await ActualizarAlturasResumenRutaAsync(CancellationToken.None);
|
||||
await ActualizarResumenTecnicoRutaAsync(CancellationToken.None);
|
||||
_tiempoUltimoCalculoRuta = cronometroCalculo.Elapsed;
|
||||
StateHasChanged();
|
||||
}
|
||||
@@ -2207,7 +2244,7 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
_hayRutaValida = false;
|
||||
try
|
||||
{
|
||||
await ActualizarAlturasResumenRutaAsync(CancellationToken.None);
|
||||
await ActualizarResumenTecnicoRutaAsync(CancellationToken.None);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -76,6 +76,33 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
_ => !_mostrarElevacionesRuta
|
||||
};
|
||||
|
||||
await RepintarRutaSeleccionadaPorElevacionesAsync(_mostrarElevacionesRuta
|
||||
? "Aplicando elevaciones..."
|
||||
: "Representando ruta seleccionada...");
|
||||
}
|
||||
|
||||
private async Task CambiarUmbralElevacionRutaAsync(ChangeEventArgs e, bool esSubida)
|
||||
{
|
||||
var actual = esSubida
|
||||
? _umbralPendienteSubidaRuta
|
||||
: _umbralPendienteBajadaRuta;
|
||||
var nuevo = ParseUmbralPendienteRuta(e.Value, actual);
|
||||
|
||||
if (esSubida)
|
||||
_umbralPendienteSubidaRuta = nuevo;
|
||||
else
|
||||
_umbralPendienteBajadaRuta = nuevo;
|
||||
|
||||
await PersistirConfiguracionAsync();
|
||||
|
||||
if (_mostrarElevacionesRuta)
|
||||
await RepintarRutaSeleccionadaPorElevacionesAsync("Aplicando elevaciones...");
|
||||
else
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private async Task RepintarRutaSeleccionadaPorElevacionesAsync(string mensaje)
|
||||
{
|
||||
if (_opcionesRuta.Count == 0 ||
|
||||
_indiceAlternativaSeleccionada < 0 ||
|
||||
_indiceAlternativaSeleccionada >= _opcionesRuta.Count)
|
||||
@@ -85,9 +112,7 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
}
|
||||
|
||||
_pintandoElevacionesRuta = true;
|
||||
_mensajeRuta = _mostrarElevacionesRuta
|
||||
? "Aplicando elevaciones..."
|
||||
: "Representando ruta seleccionada...";
|
||||
_mensajeRuta = mensaje;
|
||||
StateHasChanged();
|
||||
await Task.Yield();
|
||||
|
||||
@@ -103,6 +128,23 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
}
|
||||
}
|
||||
|
||||
private static double ParseUmbralPendienteRuta(object? valor, double actual)
|
||||
{
|
||||
var texto = Convert.ToString(valor, CultureInfo.InvariantCulture)?.Replace(',', '.');
|
||||
if (!double.TryParse(texto, NumberStyles.Float, CultureInfo.InvariantCulture, out var nuevo) ||
|
||||
!double.IsFinite(nuevo))
|
||||
{
|
||||
return NormalizarUmbralPendienteRuta(actual);
|
||||
}
|
||||
|
||||
return NormalizarUmbralPendienteRuta(nuevo);
|
||||
}
|
||||
|
||||
private static double NormalizarUmbralPendienteRuta(double valor)
|
||||
=> double.IsFinite(valor)
|
||||
? Math.Clamp(Math.Abs(valor), 0.0, 50.0)
|
||||
: 3.0;
|
||||
|
||||
private async Task DrawWalkingRouteJsAsync(
|
||||
string id,
|
||||
double[,] linea,
|
||||
@@ -110,7 +152,7 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
int versionPintado,
|
||||
bool arrowEnd = true)
|
||||
{
|
||||
var puntosElevacion = await ConstruirPuntosElevacionMapaAsync(linea, CancellationToken.None);
|
||||
var segmentosElevacion = await ConstruirSegmentosElevacionMapaAsync(linea, CancellationToken.None);
|
||||
ThrowIfPintadoObsoleto(versionPintado);
|
||||
|
||||
await DrawRouteJsAsync(
|
||||
@@ -121,16 +163,11 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
0.9,
|
||||
dashArray: DashArrayPiePunteado,
|
||||
arrowEnd: arrowEnd,
|
||||
lineCap: "round");
|
||||
|
||||
if (puntosElevacion is { Count: > 0 })
|
||||
{
|
||||
ThrowIfPintadoObsoleto(versionPintado);
|
||||
await DrawRouteElevationPointsJsAsync(id, puntosElevacion);
|
||||
}
|
||||
lineCap: "round",
|
||||
elevationSegments: segmentosElevacion);
|
||||
}
|
||||
|
||||
private async Task<List<object>?> ConstruirPuntosElevacionMapaAsync(double[,] linea, CancellationToken ct)
|
||||
private async Task<List<object>?> ConstruirSegmentosElevacionMapaAsync(double[,] linea, CancellationToken ct)
|
||||
{
|
||||
if (!_mostrarElevacionesRuta || linea.GetLength(0) < 2)
|
||||
return null;
|
||||
@@ -139,7 +176,7 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
if (muestras.Count < 2)
|
||||
return null;
|
||||
|
||||
var puntos = new List<object>();
|
||||
var segmentos = new List<object>();
|
||||
var hayPendienteCalculada = false;
|
||||
|
||||
for (var i = 1; i < muestras.Count; i++)
|
||||
@@ -168,10 +205,13 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
}
|
||||
|
||||
var (categoria, color) = ClasificarPendienteMapa(pendiente);
|
||||
puntos.Add(new
|
||||
segmentos.Add(new
|
||||
{
|
||||
lat = actual.Latitud,
|
||||
lon = actual.Longitud,
|
||||
coords = new[]
|
||||
{
|
||||
new[] { anterior.Latitud, anterior.Longitud },
|
||||
new[] { actual.Latitud, actual.Longitud }
|
||||
},
|
||||
color,
|
||||
category = categoria,
|
||||
slope = pendiente,
|
||||
@@ -181,32 +221,28 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
});
|
||||
}
|
||||
|
||||
return hayPendienteCalculada && puntos.Count > 0
|
||||
? puntos
|
||||
return hayPendienteCalculada && segmentos.Count > 0
|
||||
? segmentos
|
||||
: null;
|
||||
}
|
||||
|
||||
private static double? ElevacionPreferidaMapa(MuestraElevacion muestra)
|
||||
=> muestra.ElevacionIdee ?? muestra.Elevacion;
|
||||
|
||||
private static (string Categoria, string Color) ClasificarPendienteMapa(double? pendientePorcentaje)
|
||||
private (string Categoria, string Color) ClasificarPendienteMapa(double? pendientePorcentaje)
|
||||
{
|
||||
if (pendientePorcentaje is null || !double.IsFinite(pendientePorcentaje.Value))
|
||||
return ("sin-datos", "#94a3b8");
|
||||
|
||||
if (pendientePorcentaje.Value >= 8.0)
|
||||
return ("subida-fuerte", "#ef4444");
|
||||
var umbralSubida = NormalizarUmbralPendienteRuta(_umbralPendienteSubidaRuta);
|
||||
var umbralBajada = NormalizarUmbralPendienteRuta(_umbralPendienteBajadaRuta);
|
||||
if (pendientePorcentaje.Value >= umbralSubida)
|
||||
return ("subida", "#000000");
|
||||
|
||||
if (pendientePorcentaje.Value >= 3.0)
|
||||
return ("subida", "#f97316");
|
||||
if (pendientePorcentaje.Value <= -umbralBajada)
|
||||
return ("bajada", "#2563eb");
|
||||
|
||||
if (pendientePorcentaje.Value <= -8.0)
|
||||
return ("bajada-fuerte", "#1d4ed8");
|
||||
|
||||
if (pendientePorcentaje.Value <= -3.0)
|
||||
return ("bajada", "#38bdf8");
|
||||
|
||||
return ("llano", "#facc15");
|
||||
return ("llano", "#dc2626");
|
||||
}
|
||||
|
||||
|
||||
@@ -238,7 +274,7 @@ public partial class PlanificadorRutas : ComponentBase
|
||||
}
|
||||
|
||||
ThrowIfPintadoObsoleto(versionPintado);
|
||||
await ActualizarAlturasResumenRutaAsync(CancellationToken.None);
|
||||
await ActualizarResumenTecnicoRutaAsync(CancellationToken.None);
|
||||
ThrowIfPintadoObsoleto(versionPintado);
|
||||
await CerrarPopupsAsync();
|
||||
|
||||
|
||||
@@ -653,6 +653,31 @@
|
||||
@(_pintandoElevacionesRuta ? "Elevaciones..." : "Elevaciones")
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<div class="route-elevation-thresholds" title="Porcentaje minimo para colorear subida o bajada">
|
||||
<label class="route-elevation-threshold">
|
||||
<span>Sube</span>
|
||||
<input type="number"
|
||||
min="0"
|
||||
max="50"
|
||||
step="0.5"
|
||||
value="@_umbralPendienteSubidaRuta.ToString("0.#", CultureInfo.InvariantCulture)"
|
||||
disabled="@_pintandoElevacionesRuta"
|
||||
@onchange="@(e => CambiarUmbralElevacionRutaAsync(e, true))" />
|
||||
<span>%</span>
|
||||
</label>
|
||||
<label class="route-elevation-threshold">
|
||||
<span>Baja</span>
|
||||
<input type="number"
|
||||
min="0"
|
||||
max="50"
|
||||
step="0.5"
|
||||
value="@_umbralPendienteBajadaRuta.ToString("0.#", CultureInfo.InvariantCulture)"
|
||||
disabled="@_pintandoElevacionesRuta"
|
||||
@onchange="@(e => CambiarUmbralElevacionRutaAsync(e, false))" />
|
||||
<span>%</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (_opcionesRuta.Count > 0)
|
||||
@@ -885,6 +910,8 @@
|
||||
var dCorregida = CalcularDistanciaCorregidaAlternativa(altSeleccionada);
|
||||
var xyzOrigen = FormatearResumenXYZOrigen();
|
||||
var xyzDestino = FormatearResumenXYZDestino();
|
||||
var callejeroOrigen = FormatearResumenCallejeroOrigen();
|
||||
var callejeroDestino = FormatearResumenCallejeroDestino();
|
||||
var tiempoCalculo = FormatearTiempoCalculoRuta();
|
||||
var scoreEquilibradoSeleccionado = CriterioPrioritarioEquilibradoActivo
|
||||
? FormatearScoreEquilibradoAlternativa(altSeleccionada)
|
||||
@@ -920,10 +947,18 @@
|
||||
{
|
||||
<div style="white-space: pre-wrap;">@xyzOrigen</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(callejeroOrigen))
|
||||
{
|
||||
<div style="white-space: pre-wrap;">@callejeroOrigen</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(xyzDestino))
|
||||
{
|
||||
<div style="white-space: pre-wrap;">@xyzDestino</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(callejeroDestino))
|
||||
{
|
||||
<div style="white-space: pre-wrap;">@callejeroDestino</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(tiempoCalculo))
|
||||
{
|
||||
<div>Tiempo de calculo: @tiempoCalculo</div>
|
||||
@@ -951,13 +986,17 @@
|
||||
var dRectaSinRuta = DistanciaLineaRectaOrigenDestino();
|
||||
var xyzOrigenSinRuta = FormatearResumenXYZOrigen();
|
||||
var xyzDestinoSinRuta = FormatearResumenXYZDestino();
|
||||
var callejeroOrigenSinRuta = FormatearResumenCallejeroOrigen();
|
||||
var callejeroDestinoSinRuta = FormatearResumenCallejeroDestino();
|
||||
var tiempoCalculoSinRuta = FormatearTiempoCalculoRuta();
|
||||
|
||||
<p class="route-main-text">@mensajeSinRuta</p>
|
||||
|
||||
@if (dRectaSinRuta > 0
|
||||
|| !string.IsNullOrWhiteSpace(xyzOrigenSinRuta)
|
||||
|| !string.IsNullOrWhiteSpace(xyzDestinoSinRuta))
|
||||
|| !string.IsNullOrWhiteSpace(xyzDestinoSinRuta)
|
||||
|| !string.IsNullOrWhiteSpace(callejeroOrigenSinRuta)
|
||||
|| !string.IsNullOrWhiteSpace(callejeroDestinoSinRuta))
|
||||
{
|
||||
<div class="muted" style="font-size:0.75rem;margin-top:4px;">
|
||||
@if (dRectaSinRuta > 0)
|
||||
@@ -968,10 +1007,18 @@
|
||||
{
|
||||
<div style="white-space: pre-wrap;">@xyzOrigenSinRuta</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(callejeroOrigenSinRuta))
|
||||
{
|
||||
<div style="white-space: pre-wrap;">@callejeroOrigenSinRuta</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(xyzDestinoSinRuta))
|
||||
{
|
||||
<div style="white-space: pre-wrap;">@xyzDestinoSinRuta</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(callejeroDestinoSinRuta))
|
||||
{
|
||||
<div style="white-space: pre-wrap;">@callejeroDestinoSinRuta</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(tiempoCalculoSinRuta))
|
||||
{
|
||||
<div>Tiempo de calculo: @tiempoCalculoSinRuta</div>
|
||||
|
||||
Reference in New Issue
Block a user