¿Cómo puedo hacer una envolvente de polilínea alrededor del mundo?

13

Estoy usando los mapas leaflet para crear una representación de un desafío alrededor del mundo. Me gustaría agregar una polilínea que se dirija al este desde Tokio y luego aparezca al oeste de Sudamérica en el mapa, pero en lugar de eso, obtengo una línea que cruza el mapa en la dirección opuesta (vea la línea amarilla).

Creoqueestoprobablementeestérelacionadoconlíneasdedatosy/osistemasdecoordenadas,peroestoyunpocoincompletoenlosdetalles.¿Alguienpuedeexplicarlateoríadetrásdeloquedebohacerparaqueestofuncione?EstoyusandolaproyecciónbluemarbledelaNASA:

varbluemarble=newL.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});
    
pregunta codecowboy 07.01.2012 - 09:18

2 respuestas

10

Debes romper la polilínea en el meridiano de + -180 grados. Esto requiere encontrar la latitud en la cual la polilínea cruza ese meridiano. Su SIG probablemente tiene métodos para hacer la ruptura. De lo contrario, se puede derivar una solución simple del código que se muestra en un hilo relacionado . Aquí hay algunos detalles.

  • Una polilínea se representa como una secuencia de vértices , cada uno dado en forma (lat, lon), con -180 < = lon < = 180. Debe verificar cada par sucesivo para ver si cruza el meridiano + -180. Hay una prueba rápida: si el valor absoluto de la diferencia de longitudes es 180 o mayor, hay un cruce.

  • Dentro de cada segmento (lat0, lon0) - > (lat1, lon1) que cruza el meridiano + -180, debe dividir la polilínea en dos partes donde se cruza.

La clave es encontrar la latitud del punto de ruptura con una precisión razonable. Esto se realiza más fácilmente con un modelo esférico de tierra: el error (comparado con un modelo elipsoidal más preciso) será demasiado pequeño para darse cuenta.

Deje que el segmento en cuestión pase del punto 0 en (lat0, lon0) al punto 1 en (lat1, lon1). El punto de ruptura se puede encontrar ejecutando un segmento de línea recta en 3D entre los dos puntos representados en las coordenadas cartesianas y encontrando donde la coordenada y es cero. Las coordenadas cartesianas son

(x0, y0, z0) = (cos(lon0)*sin(lat0), sin(lon0)*sin(lat0), cos(lat0))

y una expresión similar que da (x1, y1, z1) para el punto 1. Resuelve la ecuación

t * y0 + (1-t) * y1 = 0

para t; es decir,

t = y1 / (y1 - y0).

Las coordenadas de la intersección son, por lo tanto,

(x, y, z) = (t * x0 + (1-t) * x1, 0, t * z0 + (1-t) * z1)

Este punto (que se encuentra debajo de la superficie de la tierra en algún lugar debajo del meridiano + -180) tiene una latitud igual a

lat2 = ATan(z/x).

El punto de interrupción debe representarse de dos maneras. Al adjuntarlo después (lat0, lon0) para terminar la primera parte de la polilínea rota, use (lat2, -180) si lon0 es negativo y de otro modo utilizar (lat2, 180). Cuando lo adjunte antes (lat1, lon1) para iniciar la segunda parte de la polilínea rota, siga una regla similar.

En casos excepcionales, uno o ambos puntos 0 y 1 pueden estar en el meridiano + -180. Si sigue este procedimiento, colocará un segmento de longitud cero en una de las piezas de polilínea que cree. Si esto puede causar un problema con el SIG, pruebe esta condición.

Tenga en cuenta que una polilínea puede cruzar este meridiano más de una vez. Por lo tanto, después de encontrar la primera ruptura y dividir la polilínea en dos partes, debe procesar la segunda parte de la misma manera.

    
respondido por el whuber 19.01.2012 - 01:05
0

Para una discusión relacionada, quizás este ticket sea interesante:

"la proyección vectorial sobre el límite de ajuste está dividida"

enlace

    
respondido por el markusN 15.01.2012 - 20:33

Lea otras preguntas en las etiquetas