Estaba jugando un poco visualizando puntos en un mapa, y me vi en la necesidad de poder calcular un punto automáticamente, para así, ir mostrando puntos aleatorios alrededor de un punto inicial. Despues de investigar un poco, he llegado a estas conclusiones las cuales os comparto hoy aqui.
¿Que es lo que tenemos que hacer?
Para ello tenemos que hacer unos cuantos cálculos. Suponiendo que deseamos obtener puntos alreadedor de un radio dado en km, pngamos 5Km, deberíamos seguir los siguentes pasos.
1. Convertir la latitud y longitud a coordenadas cartesianas en un sistema de coordenadas plano. Esto se puede hacer utilizando una proyección cartográfica, como la proyección de Mercator o la proyección de plano tangente, o utilizando fórmulas matemáticas que convierten las coordenadas geográficas en coordenadas cartesianas en un sistema de referencia específico.
2. Calcular la distancia en metros entre el punto de origen (latitud y longitud dadas) y cualquier otro punto en el plano cartesiano utilizando la fórmula de la distancia euclidiana o la distancia del círculo máximo, dependiendo del sistema de coordenadas utilizado.
3. Verificar si la distancia calculada en el paso anterior está dentro del radio deseado de 5 km. Si es así, entonces el punto se encuentra dentro del radio y puedes utilizar las coordenadas cartesianas resultantes como la latitud y longitud del punto deseado.
4. Si la distancia calculada es mayor que el radio deseado, entonces ese punto está fuera del radio y necesitas seleccionar otro punto en el plano cartesiano y repetir los pasos 2 y 3 hasta encontrar un punto dentro del radio.
Es importante tener en cuenta que la precisión de este cálculo dependerá del sistema de coordenadas utilizado y de la forma real de la superficie de la Tierra en el área de interés. En distancias cortas como 5 km, las diferencias debidas a la curvatura de la Tierra pueden ser insignificantes en la práctica. Sin embargo, si se requiere una mayor precisión, se deben tener en cuenta factores como la elipsoidalidad de la Tierra y la proyección cartográfica utilizada.
Creando el algoritmo para representar que es lo que tenemos que hacer
Para calcular un punto dentro de un radio de 5km (en nuestro ejemplo) alrededor de una latitud y longitud dadas en un sistema de coordenas cartesianas planas podríamos hacer algo como lo suguiente. Pero como siempre el algoritmo es a gusto del consumidor.
1. Convertir la latitud y longitud a coordenadas cartesianas en metros utilizando una proyección cartográfica, como la proyección de Mercator. Puedes usar las siguientes fórmulas:
x = longitud * R * cos(latitud)
y = latitud * R
Donde longitud y latitud son las coordenadas geográficas en radianes, R es el radio de la Tierra en metros (aproximadamente 6,371,000 metros en promedio).
2. Generar un punto aleatorio dentro de un círculo de radio 5 km en el plano cartesiano. Puedes usar las siguientes fórmulas:
r = sqrt(random()) * 5000 # Generar una distancia aleatoria entre 0 y 5000 metros
theta = 2 * pi * random() # Generar un ángulo aleatorio entre 0 y 2pi radianes
Donde random() genera un número aleatorio entre 0 y 1, sqrt() es la función de raíz cuadrada y pi es la constante pi (aproximadamente 3.14159265359).
3. Calcular las coordenadas cartesianas del punto dentro del círculo utilizando las siguientes fórmulas:
x_punto = x + r * cos(theta)
y_punto = y + r * sin(theta)
Donde x e y son las coordenadas cartesianas del punto de origen (latitud y longitud convertidas), r es la distancia aleatoria generada en el paso anterior, y cos() y sin() son las funciones trigonométricas del coseno y el seno, respectivamente.
4. Convertir las coordenadas cartesianas x_punto y y_punto a latitud y longitud utilizando las siguientes fórmulas inversas:
longitud_punto = x_punto / (R * cos(latitud))
latitud_punto = y_punto / R
5. Verificar si la distancia entre el punto de origen y el punto generado está dentro del radio de 5 km. Puedes usar la fórmula de la distancia euclidiana o la distancia del círculo máximo para calcular la distancia entre dos puntos en el plano cartesiano.
6. Si la distancia es menor o igual a 5 km, entonces el punto generado está dentro del radio deseado. Si no, repetir los pasos 2-5 hasta encontrar un punto dentro del radio.
Ten en cuenta que este algoritmo es una aproximación simple y puede no ser preciso en todas las situaciones, ya que no tiene en cuenta la curvatura real de la Tierra ni otros factores complejos. Para aplicaciones que requieran una mayor precisión, se recomienda utilizar métodos más avanzados que tengan en cuenta la elipsoidalidad de la Tierra y la proyección cartográfica específica utilizada.
¿Formula euclidiana?
El algoritmo para calcular la distancia euclidiana entre dos puntos en un plano cartesiano se puede resumir en los siguientes pasos:
1. Obtener las coordenadas cartesianas de los dos puntos. Supongamos que tienes dos puntos con coordenadas (x1, y1) y (x2, y2).
2. Calcular la diferencia de coordenadas en cada eje:
delta_x = x2 - x1
delta_y = y2 - y1
3. Elevar al cuadrado cada diferencia de coordenadas:
delta_x_cuadrado = delta_x * delta_x
delta_y_cuadrado = delta_y * delta_y
4. Sumar los cuadrados de las diferencias de coordenadas:
suma_cuadrados = delta_x_cuadrado + delta_y_cuadrado
5. Calcular la raíz cuadrada de la suma de los cuadrados:
distancia = sqrt(suma_cuadrados)
Donde sqrt() es la función de raíz cuadrada.
6. El resultado distancia es la distancia euclidiana entre los dos puntos en el plano cartesiano.
En pseudocódigo, el algoritmo se vería así:
Función distancia_euclidiana(x1, y1, x2, y2)
delta_x = x2 - x1
delta_y = y2 - y1
delta_x_cuadrado = delta_x * delta_x
delta_y_cuadrado = delta_y * delta_y
suma_cuadrados = delta_x_cuadrado + delta_y_cuadrado
distancia = sqrt(suma_cuadrados)
Devolver distancia
Fin Función
Este algoritmo es simple y ampliamente utilizado para calcular la distancia entre dos puntos en un plano cartesiano. Sin embargo, ten en cuenta que este enfoque no tiene en cuenta la curvatura de la Tierra ni otros factores geodésicos, por lo que puede no ser preciso para distancias muy largas en la superficie terrestre. Para cálculos de distancia en la Tierra, se recomienda utilizar fórmulas más precisas que tengan en cuenta la elipsoidalidad de la Tierra y la proyección cartográfica específica utilizada.
Hay otra formula, la haversine, que es más precisa para calcular la distancia entre dos puntos en la superficie de una esfera, como la Tierra, mientras que la fórmula euclidiana solo es precisa para distancias cortas en una superficie plana.
Lo interesante. Un ejemplo en c#
Utilizando la formula haversine podemos simplificar un poco haciendo los siguientes pasos.
1. Se define una clase Coordenada para representar las coordenadas de latitud y longitud.
2. Se utiliza la fórmula haversine para convertir la distancia máxima en kilómetros a radianes.
3. Se genera un ángulo aleatorio en radianes para determinar la dirección en la que se encuentra el nuevo punto dentro del radio máximo.
4. Se utilizan las fórmulas haversine inversas para calcular la nueva latitud y longitud a partir del punto de origen, la distancia máxima en radianes y el ángulo aleatorio generado.
5. Se devuelve la nueva latitud y longitud como un objeto de la clase Coordenada.
using System;
class Program
{
static void Main(string[] args)
{
// Coordenadas del punto central
double latitudCentro = 19.4326; // Latitud del punto central en grados
double longitudCentro = -99.1332; // Longitud del punto central en grados
// Radio en kilómetros
double radioKm = 5.0;
// Calcular un punto dentro del radio
double latitudPunto, longitudPunto;
CalcularPuntoDentroRadio(latitudCentro, longitudCentro, radioKm, out latitudPunto, out longitudPunto);
Console.WriteLine($"Latitud del punto: {latitudPunto}");
Console.WriteLine($"Longitud del punto: {longitudPunto}");
}
static void CalcularPuntoDentroRadio(double latitudCentro, double longitudCentro, double radioKm,
out double latitudPunto, out double longitudPunto)
{
const double radioTierraKm = 6371.0; // Radio promedio de la Tierra en kilómetros
// Convertir la latitud y longitud del centro a radianes
double latitudCentroRad = ConvertirAGradosRadianes(latitudCentro);
double longitudCentroRad = ConvertirAGradosRadianes(longitudCentro);
// Generar un ángulo aleatorio en radianes
Random random = new Random();
double anguloRad = 2 * Math.PI * random.NextDouble();
// Calcular la distancia en kilómetros
double distanciaKm = radioKm * Math.Sqrt(random.NextDouble());
// Calcular la latitud y longitud del punto dentro del radio
double latitudPuntoRad = latitudCentroRad + (distanciaKm / radioTierraKm) * Math.Cos(anguloRad);
double longitudPuntoRad = longitudCentroRad + (distanciaKm / radioTierraKm) * Math.Sin(anguloRad);
// Convertir la latitud y longitud del punto a grados
latitudPunto = ConvertirARadianesGrados(latitudPuntoRad);
longitudPunto = ConvertirARadianesGrados(longitudPuntoRad);
// Asegurarse de que la longitud esté dentro del rango válido (-180 a 180 grados)
if (longitudPunto < -180)
{
longitudPunto += 360;
}
else if (longitudPunto > 180)
{
longitudPunto -= 360;
}
}
// Método para convertir grados a radianes
static double ConvertirAGradosRadianes(double grados)
{
return grados * (Math.PI / 180.0);
}
// Método para convertir radianes a grados
static double ConvertirARadianesGrados(double radianes)
{
return radianes * (180.0 / Math.PI);
}
}
Conclusiones
Espero que te haya parecido interesante este post, happy codding.