Estou usando mapas de folhetos para criar uma representação de um desafio de volta ao mundo. Gostaria de adicionar uma polilinha que segue para leste a partir de Tóquio e depois aparece a oeste da América do Sul no mapa - mas, em vez disso, recebo uma linha que atravessa o mapa na direção oposta (veja a linha amarela).
Eu acho que isso provavelmente está relacionado a datelines e / ou sistemas de coordenadas, mas estou um pouco superficial nos detalhes. Alguém pode explicar a teoria por trás do que eu preciso fazer para que isso funcione? Estou usando a projeção bluemarble da Nasa:
var bluemarble = new L.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});
coordinate-system
polyline-creation
leaflet
codecowboy
fonte
fonte
Respostas:
Você precisa quebrar a polilinha no meridiano de + -180 graus. Isso requer encontrar a latitude na qual a polilinha cruza esse meridiano. Seu GIS provavelmente tem métodos para fazer a quebra. Caso contrário, uma solução simples pode ser derivada do código mostrado em um thread relacionado . Aqui estão alguns detalhes.
Uma polilinha é representada como uma sequência de vértices , cada um dado na forma (lat, lon), com -180 <= lon <= 180. Você precisa verificar cada par sucessivo para ver se cruza o meridiano + -180. Há um teste rápido: se o valor absoluto da diferença de longitudes for 180 ou superior, haverá um cruzamento.
Dentro de cada segmento (lat0, lon0) -> (lat1, lon1) que cruza o meridiano + -180, é necessário dividir a polilinha em duas partes onde ela cruza.
A chave é encontrar a latitude do ponto de interrupção com precisão razoável. Isso é feito com mais facilidade com um modelo de terra esférico: o erro (comparado a um modelo elipsoidal mais preciso) será muito pequeno para ser observado.
Deixe o segmento em questão ir do ponto 0 em (lat0, lon0) ao ponto 1 em (lat1, lon1). O ponto de interrupção pode ser encontrado executando um segmento de linha reta em 3D entre os dois pontos, conforme representado nas coordenadas cartesianas e localizando onde a coordenada y é zero. As coordenadas cartesianas são
e uma expressão semelhante dando (x1, y1, z1) para o ponto 1. Resolva a equação
para t; isso é,
As coordenadas da interseção são, portanto,
Este ponto (que fica abaixo da superfície da Terra em algum lugar abaixo do meridiano + -180) tem latitude igual a
O ponto de interrupção precisa ser representado de duas maneiras. Ao anexá-lo após (lat0, lon0) para finalizar a primeira parte da polilinha quebrada, use (lat2, -180) se lon0 for negativo e use (lat2, 180). Ao anexá-lo antes (lat1, lon1) para iniciar a segunda parte da polilinha quebrada, siga uma regra semelhante.
Em casos excepcionais, um ou ambos os pontos 0 e 1 podem estar no meridiano + -180. Seguir este procedimento fará com que você coloque um segmento de comprimento zero em uma das peças de polilinha criadas. Se isso puder causar um problema com o GIS, teste para esta condição.
Observe que uma polilinha pode cruzar esse meridiano mais de uma vez. Portanto, depois de encontrar a primeira quebra e dividir a polilinha em duas partes, é necessário processar a segunda parte da mesma maneira.
fonte
Para uma discussão relacionada, talvez esse ticket seja interessante:
"a projeção vetorial sobre o limite da quebra automática é dividida"
https://trac.osgeo.org/grass/ticket/1527
fonte