Dado un conjunto de coordenadas, ¿cómo puedo calcular los límites mínimos?


13

Tengo un conjunto de coordenadas en lon / lat. Siempre hay al menos 3 coordenadas ordenadas que forman un poli (si se proyectaron planas). ¿Cómo puedo calcular los límites mínimos para estas coordenadas como un conjunto de rangos válidos de longitud y latitud? (por "válido" me refiero a rangos que explícitamente explican el antimeridiano). Es un poco difícil explicar lo que estoy buscando, así que tengo una foto.

ingrese la descripción de la imagen aquí

El caso en la imagen es trivial; solo encuentra el mínimo y el máximo absolutos para todos los puntos. Sin embargo, esto no funciona para todos los casos. ¿Hay una solución genérica?

Editar: para aclarar lo que quiero decir con "válido", digamos que tenía tres valores de longitud en mi conjunto de datos: -76, -135 y 164. Los valores cruzan el antimeridiano y me gustaría que los rangos resultantes se dividan: -76 a -180 y 164 a 180.

Un poco más de aclaración. Los puntos forman un polígono, por lo que en ciertos casos, el rango requerido podría ser de -180 a +180 (es decir, los 360 grados completos):

ingrese la descripción de la imagen aquí

La imagen de la izquierda muestra la longitud de cuatro coordenadas que ocurren en una 'mitad' de la Tierra. Imagínelo como si estuviera mirando hacia el polo norte (punto negro). El rosa muestra el rango longitudinal mínimo que abarca el polígono (el polígono se muestra entre los cuatro puntos en púrpura). El caso de la izquierda tendría dos rangos longitudinales: [-180 a -120] y [135 a 180] (solo estimándolo visualmente)

La imagen de la derecha muestra otro caso en el que los puntos van alrededor de la Tierra. Este rango sería [-180 a 180].


1
Nunca he considerado este problema antes, es una gran pregunta. ¡Otro ejemplo más de dónde una tierra plana facilitaría nuestros trabajos! Espero ver algunas soluciones a esto.
sgrieve

Creo que debe ser más explícito sobre "(por 'válido' me refiero a rangos que explícitamente explican el antimeridiano)" - Supongo que la palabra mínimo debe ir por delante de los límites en la pregunta.
Ian Turton

¿Puede volver a agregar su imagen? Podría ayudar a explicar su problema.
Mapperz

1
iant: explícitamente aclarado 'válido' Mapperz: volver a agregar? ¿no está apareciendo? Lo puedo ver bien.
Pris

1
Bueno, las coordenadas están en lon / lat, y se utilizan para consultar una base de datos para recuperar datos geográficos. Hablando estrictamente, puede convertir esto en un problema matemático puro (aunque eso se puede decir sobre muchas cosas en SIG)
Pris

Respuestas:


5

Espero entender la pregunta correctamente ...

Podemos resolver el problema de longitud y latitud por separado, por lo que tomaré su ejemplo con las longitudes: -76, -135 y 164.

Primero los ordenaría:

-135, -76, 164

Luego agregaría la coordenada más a la izquierda a la derecha nuevamente: -135 + 360 = 225

-135, -76, 164, 225

Ahora podemos calcular los espacios entre las coordenadas:

-135 (59) -76 (240) 164 (61) 225
             .......

El espacio más grande (240) debe ser el límite del cuadro delimitador mínimo, la parte que no pertenece al cuadro. La línea punteada es la parte más grande del círculo que podemos ahorrar. En nuestro ejemplo, eso significa que el cuadro de límite comienza con 164, incluye -135 y termina con -76.


Esto funciona para la mayoría de los casos, creo. Pero considere mi ejemplo con la longitud adicional (+60) [como el cuarto punto en el poli]. En este caso, me gustaría -180 a 180. Usando su método, obtendría 61 a 180 y -76 a -180.
Pris

@Pris - ¿Entonces quieres que la longitud 180 / -180 (es el mismo punto después de todo), sea parte de la caja en todos los casos, incluso si esa no es la caja más pequeña posible?
martinstoeckli

Creo que la diferencia clave aquí es que los puntos forman un polígono. Mira mi edición.
Pris

@Pris - Oh, bueno, esto se ve muy complicado. Es como cada punto de un borde entre dos puntos cuenta también como punto de vértice.
martinstoeckli

1

Esto es realmente fácil de hacer en Javascript con la API de Google Maps. Así es como lo haría del lado del cliente con esa API:

var bounds = new google.maps.LatLngBounds();

//Recursively loop through your coordinate list
    latLng = new google.maps.LatLng(<YourLat>, <YourLon>);
    bounds.extend(latLng);
//

extentBox = new google.maps.Rectangle({
    bounds: bounds,
    strokeColor: "#FF0000",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#FF0000",
    fillOpacity: 0.35
});
extentBox.setMap(map);

Hola, gracias por la respuesta, sin embargo, estoy buscando el método real en lugar de llamar a una API o usar una solución preexistente.
Pris

Me diste el método limit.extend, estaba buscando esta solución exacta, ¡así que gracias!
Thomson Comer

¿Funciona esto con polígonos? Te veo usando Rectángulo.
Danny G

1

Creo que podría haber encontrado una manera de hacer esto. Mi implementación preliminar funciona, pero no estoy seguro de si hay algunos casos límite que me he perdido. Si hay algún problema con esta solución, indíquelo.

Dado que me preocupa obtener los rangos lon / lat para el polígono en lugar de solo los puntos que lo componen, una forma de intentar el problema es realmente 'caminar' a lo largo del conjunto de coordenadas ordenadas de principio a fin. Mantiene un registro de cuán lejos ha viajado en sentido horario y antihorario en relación con el centro de la Tierra dado un punto de partida y continúa hasta completar el polígono:

ingrese la descripción de la imagen aquí

Puede obtener un rango de cuán lejos viaja CW y CCW desde su punto de partida ... esto le brinda suficiente información para derivar los límites correctos en el caso normal (a la izquierda en la imagen). En el caso en el que el polígono gira completamente o corta a través del centro, el ángulo de desplazamiento devuelto será de 360 ​​grados.

Este método también funciona cuando el polígono 'abraza' la superficie de la Tierra en lugar de atravesarla. Entonces, si tiene un polígono que muestra a alguien viajando a lo largo de la superficie de la Tierra desde Toronto (lon: -79) a Londres (lon: -5) a Tokio (lon: 139) y viceversa (en el mismo orden), obtener el rango [-79 a 139].

Si el polígono atraviesa el centro (imagine dos puntos adyacentes en +90 y -90), considero que esto es un barrido completo (360 grados), aunque podría ir en cualquier dirección.

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.