Dado um conjunto de coordenadas, como posso calcular os limites mínimos?

13

Eu tenho um conjunto de coordenadas em lon / lat. Sempre há pelo menos três coordenadas ordenadas que formam um poli (se elas foram projetadas planas). Como posso calcular os limites mínimos para essas coordenadas como um conjunto de intervalos válidos de longitude e latitude? (por 'válido', quero dizer intervalos que explicitamente explicam o antimeridiano). É meio difícil de explicar o que estou procurando, então eu tenho uma foto.

insira a descrição da imagem aqui

O caso na foto é trivial; você apenas encontra o mínimo e o máximo absolutos para todos os pontos. Isso não funciona para todos os casos. Existe uma solução genérica?

Editar: para esclarecer o que quero dizer com 'válido', diga que eu tinha três valores de longitude no meu conjunto de dados: -76, -135 e 164. Os valores cruzam o antimeridiano e eu gostaria que os intervalos resultantes fossem divididos: -76 para -180 E 164 para 180.

Mais alguns esclarecimentos. Os pontos formam um polígono; portanto, em certos casos, o intervalo necessário pode ser de -180 a +180 (ou seja, os 360 graus completos):

insira a descrição da imagem aqui

A imagem à esquerda mostra a longitude de quatro coordenadas que ocorrem em uma 'metade' da Terra. Imagine como se estivesse olhando para o pólo norte (ponto preto). O rosa mostra o intervalo longitudinal mínimo que abrange o polígono (o polígono é mostrado entre os quatro pontos em roxo). O caso à esquerda teria duas faixas longitudinais: [-180 a -120] e [135 a 180] (apenas para estimar visualmente)

A imagem à direita mostra outro caso em que os pontos percorrem toda a Terra. Esse intervalo seria [-180 a 180].

Pris
fonte
1
Eu nunca considerei esse problema antes, é uma ótima pergunta. Mais um exemplo de onde uma terra plana tornaria nosso trabalho mais fácil! Estou ansioso para ver algumas soluções para isso.
S2
Eu acho que você precisa ser mais explícito sobre "(por 'válido' quero dizer intervalos que explicitamente explicam o antimeridiano)" - acho que a palavra mínimo precisa estar na frente dos limites da pergunta.
Ian Turton
se você pode adicionar novamente sua imagem, isso pode ajudar a explicar seu problema.
Mapperz
1
iant: explicitamente esclarecido 'válido' Mapperz: adicionar novamente? não está aparecendo? Eu posso ver isso bem.
Pris
1
Bem, as coordenadas estão em lon / lat e são usadas para consultar um banco de dados para recuperar dados geográficos. Estritamente falando, você pode converter isso em um problema de matemática pura (embora isso pode ser dito sobre muitas coisas em GIS)
Pris

Respostas:

5

Espero que eu entenda a pergunta corretamente ...

Podemos resolver o problema da longitude e latitude separadamente, portanto, darei o seu exemplo com as longitudes: -76, -135 e 164.

Primeiro eu pediria:

-135, -76, 164

Então eu adicionaria a coordenada mais à esquerda novamente à direita: -135 + 360 = 225

-135, -76, 164, 225

Agora podemos calcular as lacunas entre as coordenadas:

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

O maior espaço (240) deve ser o limite da caixa delimitadora mínima, a parte que não pertence à caixa. A linha pontilhada é a maior parte do círculo que podemos gastar. No nosso exemplo, isso significa que a caixa de limite começa com 164, inclui -135 e termina com -76.

martinstoeckli
fonte
Isso funciona para a maioria dos casos, eu acho. Mas considere meu exemplo com a longitude adicional (+60) [como o quarto ponto no poli]. Nesse caso, eu gostaria de -180 a 180. Usando seu método, obteria 61 a 180 e -76 a -180.
Pris
@Pris - Então você quer que a longitude 180 / -180 (afinal, é o mesmo ponto) faça parte da caixa em todos os casos, mesmo que essa não seja a menor caixa possível?
martinstoeckli
Eu acho que a principal diferença aqui é que os pontos formam um polígono. Veja minha edição.
Pris
@ Pris - Oh, bem, isso parece realmente complicado. É como todo ponto de uma aresta entre dois pontos também conta como ponto de vértice.
martinstoeckli
1

Isso é realmente fácil de fazer em Javascript com a API do Google Maps. Aqui está como você faria isso no lado do cliente com essa 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);
SeanMaday
fonte
Ei, obrigado pela resposta, no entanto, estou procurando o método real em vez de chamar uma API ou usar uma solução pré-existente.
Pris
Você me deu o método bounds.extend, eu estava procurando por essa solução exata, então obrigado!
Thomson Comer
Isso funciona com polígonos? Vejo você usando o retângulo.
Danny G
1

Eu acho que posso ter encontrado uma maneira de fazer isso. Minha implementação preliminar funciona, mas não tenho certeza se existem casos extremos que eu perdi. Se houver algo errado com esta solução, indique-o.

Como estou preocupado em obter os intervalos long / lat do polígono, e não apenas os pontos que o compõem, uma maneira de tentar o problema é realmente 'caminhar' ao longo do conjunto de coordenadas ordenadas do início ao fim. Você acompanha o quão longe no sentido horário e anti-horário você viajou em relação ao centro da Terra, dado um ponto de partida e continua até concluir o polígono:

insira a descrição da imagem aqui

Você pode obter uma faixa de quão longe o CW e o CCW você viaja a partir do ponto de partida ... isso fornece informações suficientes para derivar limites corretos no caso normal (deixado na imagem). No caso em que o polígono gira totalmente ou corta o centro, o ângulo de deslocamento retornado será de 360 ​​graus.

Esse método também funciona quando você tem o polígono 'abraçando' a superfície da Terra em vez de atravessá-la. Portanto, se você tiver um polígono mostrando alguém viajando pela superfície da Terra de Toronto (long: -79) a Londres (long: -5) a Tóquio (long: 139) e vice-versa (na mesma ordem), você obtenha o intervalo [-79 a 139].

Se o polígono corta o centro (imagine dois pontos adjacentes em +90 e -90), considero que isso é uma varredura completa (360 graus), embora você possa ir de qualquer maneira.

Pris
fonte