Cálculo de coordenadas de cuadrado x millas desde el punto central?


11

Estoy tratando de crear un cuadrado de milla de hacha (o círculo) alrededor de un punto central, donde todos los lados del cuadrado estarían a x millas del centro. Necesito las 4 coordenadas de la esquina.

¿Está revolviendo mi cerebro tratando de entenderlo? Puedo calcular la distancia entre dos puntos usando la fórmula de Haversine, pero las matemáticas no son mi punto fuerte y no entiendo el pecado, el cos, etc. ¡y tratar de resolver esto me ha perdido!

Me he encontrado Calculando Latitud / Longitud X millas desde el punto? pero no lo entiendo!

¿Alguien sería tan amable de explicar cómo hago esto en términos de manzanas y peras?

Para explicar exactamente lo que intento hacer;

Tengo un sitio web, donde los usuarios pueden buscar edificios en un área específica. Entrarán en una ciudad o lugar (que sabré a largo plazo) y buscarán dentro de un radio específico de, digamos, 10 millas del lugar.

Necesito encontrar el mínimo / máximo lat y longs del radio de 10 millas para poder consultar mi base de datos usando una cláusula where similar a:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

¡Necesito algún tipo de fórmula!

Mis coordenadas están en grados decimales.

Respuestas:


10

Para este propósito, las aproximaciones simples son más que suficientes. Norte o sur, un grado es de aproximadamente 69 millas, pero este u oeste, es solo 69 * cos (latitud) millas. Debido a que las latitudes no cambian mucho en un lapso de diez millas, puede usar con seguridad el coseno de la latitud central del "cuadrado". Por lo tanto, las coordenadas deseadas para vértices cuadrados a una distancia r millas de una ubicación central (f, l), dadas como lat-lon, se calculan como

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

Por ejemplo, suponga que r = 10 millas y la ubicación central está en la latitud 50 grados norte, longitud 1 grado oeste, de modo que (f, l) = (50, -1) grados. Entonces

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

y las coordenadas son (49.855, -1.225), (50.145, -1.225), (50.145, -0.775) y (49.855, -0.775) a medida que avanza en el sentido de las agujas del reloj alrededor del cuadrado que comienza en su esquina suroeste.

No use esta aproximación cerca de los polos o para cuadrados más grandes que unos pocos grados en un lado. Además, dependiendo de las limitaciones del SIG, es posible que se necesite algo de cuidado alrededor del corte global en longitud, generalmente tomado a + -180 grados.


4

Tome la coordenada X del centro y reste x millas de él, este es el lado izquierdo de su cuadrado. Luego toma la coordenada Y del centro y resta X millas de él, esta es la parte inferior de tu cuadrado. Repita estos pasos pero sumando en lugar de restando para obtener la mano derecha y los bordes superiores. Ahora puedes construir las cuatro esquinas de tu cuadrado.

Tenga en cuenta que lo anterior supone que su punto central está en millas. Si no es primero, reproyectarlo. De lo contrario, todas las apuestas están apagadas y su casilla no será cuadrada.


¿Te refieres a la página de ejemplo? ¿Cómo restar millas de una coordenada y no necesito tener en cuenta la curvatura de la tierra?
Bex

No, es tan simple que no hay necesidad real de tener un ejemplo trabajado. ¿Quizás necesite especificar qué software está utilizando? Como dije, mi solución asume que has proyectado tu coordenada a un SRS local (si no lo has hecho, esa debería ser tu primera pregunta)
Ian Turton

Estoy realmente confundido ahora! He actualizado mi pregunta para decir exactamente lo que estoy tratando de hacer. Necesito crear un cuadro delimitador para poder encontrar el min y max lat y long.
Bex

3
proj4js ( proj4js.org ) debería ayudar entonces
Ian Turton

1
Mis coordenadas se ven así: 51.498485, -0.129089 que son grados, ¿no?
Bex

4

Finalmente mi respuesta es: (en c #)

Probablemente no necesito las 4 coordenadas, pero creo que son bastante precisas.

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

EDITAR

Me acabo de dar cuenta de que si establezco las esquinas de mi cuadrado x millas desde el punto central, los bordes de mi cuadrado no serán las mismas x millas. (dijo que las matemáticas no eran mi punto fuerte) Entonces, para obtener la distancia de los puntos de esquina desde el punto central si quiero que los bordes de mis cuadrados sean x millas, utilicé el Teorema de Pitágoras para calcular la distancia de la diagonal. (en un triángulo rectángulo, el cuadrado de la hipotenusa (la diagonal) es igual al cuadrado de los otros dos lados)


eso no será un cuadrado.
Ian Turton

He modificado mis rodamientos, era un diamante ... ahora es cuadrado
Bex

Con respecto a la edición, el teorema de Pitágoras está bien para cuadrados pequeños, pero en general no es válido para los triángulos rectángulos esféricos. Es extraño, entonces, que su código use trigonometría esférica junto con esta aproximación basada en la geometría plana.
whuber

Mi distancia nunca será más de 100 millas, así que no creo que importe. Como las imprecisiones serán pequeñas con esa distancia menor.
Bex

1
Creo que lo que dice @whuber es que no es beneficioso usar un cálculo complejo de distancia a lo largo de Lat y Long, dado que luego se combinan con el teorema de Pitágoras. En su lugar, podría usar un cálculo mucho más simple, como lo hizo Whuber, o como lo hace Ewan Todd . Utilice fórmulas lineales simples para convertir la longitud en millas y la latitud en millas, o viceversa. La única parte "complicada" es saber que la fórmula de longitud necesita el ajuste * cos(lat)al convertir grados a millas y / cos(lat)al convertir millas a grados.
ToolmakerSteve

0

Si está utilizando una base de datos espacialmente consciente, puede convertir su área de interés en el mismo sistema de coordenadas en el que se almacenan sus datos y luego hacer una comparación de manzanas con manzanas.

Por ejemplo:

  1. El usuario elige una ubicación, lo que resulta en lat / lon.
  2. Solicite a la base de datos espacial que convierta este punto en un sistema de coordenadas proyectadas apropiado para el área (unidades de pies o metros, etc.).
  3. Construya su área de interés alrededor del punto proyectado.
  4. Solicite a la base de datos espacial que convierta esta área de interés nuevamente en lat / lon.
  5. Haga las comparaciones que necesite hacer.

0

Usé lo que hay en esta página

Distancia de punto de destino dada y rumbo desde el punto de inicio

Fórmula:
lat2 = asin (sin (lat1) * cos (d / R) + cos (lat1) * sin (d / R) * cos (θ))
lon2 = lon1 + atan2 (sin (θ) * sin (d / R) * cos (lat1), cos (d / R) −sin (lat1) * sin (lat2))

θ es el rumbo (en radianes, en sentido horario desde el norte); d / R es la distancia angular (en radianes), donde d es la distancia recorrida y R es el radio de la tierra

Para θ utilicé -45 grados (en radianes) para el "punto superior izquierdo" y 135 grados para el "punto inferior derecho"

(Recientemente hice la misma pregunta en el sitio de matemáticas )


El problema con esta solución es que primero tienes que calcular la distancia para las diagonales del cuadrado. En cambio, es más fácil moverse a lo largo de las geodésicas desde el centro hasta los puntos medios de los lados y luego, girando 90 grados, moverse a lo largo de los lados del cuadrado.
whuber

@whuber, si la distancia es lo suficientemente pequeña, ¿no puedes usar trigonometría simple? (d = lado opuesto / sin (lado adyacente). Lo hago porque no necesito que esa distancia sea exacta. De lo contrario, podría aplicar esta fórmula dos veces para hacer exactamente lo que dice (primero con θ = 0 y luego con θ = -90 para la esquina superior izquierda, por ejemplo)
juan

Eso es correcto, Juan. Pero uno se pregunta por qué usa las fórmulas más complicadas de la geometría esférica cuando comienza con una aproximación que supone que las fórmulas euclidianas funcionarán en primer lugar. No hay nada de malo en usar las fórmulas esféricas, pero es innecesario y computacionalmente ineficiente.
whuber

@whuber, para el segundo caso no es aproximado (aplicando la fórmula dos veces para cada lado). Sin embargo, tienes razón en que no tendría sentido mezclarlos. De hecho, tengo esto implementado, pero lo cambiaré (oh, y la razón es porque no soy tan bueno en matemáticas :))
juan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.