Étant donné un ensemble de coordonnées, comment puis-je calculer les limites minimales?

13

J'ai un ensemble de coordonnées en lon / lat. Il y a toujours au moins 3 coordonnées ordonnées qui forment un poly (si elles étaient projetées à plat). Comment puis-je calculer les limites minimales de ces coordonnées comme un ensemble de plages de longitude et de latitude valides? (par «valide», j'entends des plages qui expliquent explicitement l'antiméridien). C'est un peu difficile d'expliquer ce que je cherche donc j'ai une photo.

entrez la description de l'image ici

Le cas dans l'image est trivial; vous trouvez juste le minimum et le maximum absolus pour tous les points. Cela ne fonctionne cependant pas dans tous les cas. Existe-t-il une solution générique?

Edit: pour clarifier ce que je veux dire par «valide», disons que j'avais trois valeurs de longitude dans mon ensemble de données: -76, -135 et 164. Les valeurs traversent l'antiméridien et je voudrais que les plages résultantes soient divisées: -76 à -180 ET 164 à 180.

Quelques précisions supplémentaires. Les points forment un polygone, donc dans certains cas, la plage requise peut être de -180 à +180 (c'est-à-dire les 360 degrés complets):

entrez la description de l'image ici

L'image de gauche montre la longitude de quatre coordonnées qui se produisent sur une «moitié» de la Terre. Imaginez-le comme si vous regardiez le pôle nord (point noir). Le rose montre la plage longitudinale minimale qui englobe le polygone (le polygone est représenté entre les quatre points en violet). Le cas de gauche aurait deux plages longitudinales: [-180 à -120] et [135 à 180] (juste en l'estimant visuellement)

L'image de droite montre un autre cas où les points tournent tout autour de la Terre. Cette plage serait de [-180 à 180].

Pris
la source
1
Je n'ai jamais considéré ce problème auparavant, c'est une grande question. Encore un autre exemple où une terre plate faciliterait nos travaux! J'ai hâte de voir des solutions à cela.
sgrieve
Je pense que vous devez être plus explicite sur "(par" valide ", je veux dire les plages qui expliquent explicitement l'antiméridien)" - je suppose que le mot minimum doit aller devant les limites de la question.
Ian Turton
pouvez-vous rajouter votre image, cela pourrait aider à expliquer votre problème.
Mapperz
1
iant: Mapperz «valide» explicitement clarifié: ré-ajouter? ne se présente-t-il pas? Je le vois bien.
Pris
1
Eh bien, les coordonnées sont en lon / lat, et sont utilisées pour interroger une base de données pour récupérer des données géographiques. À strictement parler, vous pouvez convertir cela en un pur problème mathématique (bien que cela puisse être dit à propos de beaucoup de choses dans le SIG)
Pris

Réponses:

5

J'espère que je comprends bien la question ...

Nous pouvons résoudre le problème de longitude et de latitude séparément, je vais donc prendre votre exemple avec les longitudes: -76, -135 et 164.

Je les commanderais d'abord:

-135, -76, 164

Ensuite, j'ajouterais à nouveau la coordonnée la plus à gauche: -135 + 360 = 225

-135, -76, 164, 225

Maintenant, nous pouvons calculer les écarts entre les coordonnées:

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

Le plus grand écart (240) doit être la limite de la boîte de délimitation minimale, la partie qui n'appartient pas à la boîte. La ligne pointillée est la plus grande partie du cercle que nous pouvons épargner. Dans notre exemple, cela signifie que la zone de frontière commence par 164, inclut -135 et se termine par -76.

martinstoeckli
la source
Cela fonctionne pour la plupart des cas, je pense. Mais considérons mon exemple avec la longitude supplémentaire (+60) [comme quatrième point du poly]. Dans ce cas, je voudrais -180 à 180. En utilisant votre méthode, j'obtiendrais 61 à 180 et -76 à -180.
Pris
@Pris - Vous voulez donc que la longitude 180 / -180 (c'est le même point après tout), fasse partie de la case dans tous les cas, même si ce n'est pas la plus petite case possible?
martinstoeckli
Je pense que la principale différence ici est que les points forment un polygone. Voir mon montage.
Pris
@Pris - Eh bien, cela semble vraiment délicat. C'est comme si chaque point d'une arête entre deux points compte également comme point de sommet.
martinstoeckli
1

C'est vraiment facile à faire en Javascript avec l'API Google Maps. Voici comment vous le feriez côté client avec cette 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
la source
Hé, merci pour la réponse, mais je cherche la méthode réelle plutôt que d'appeler une API ou d'utiliser une solution préexistante.
Pris
Vous m'avez donné la méthode bounds.extend, je cherchais cette solution exacte, alors merci!
Thomson Comer
Est-ce que cela fonctionne avec des polygones? Je vous vois utiliser Rectangle.
Danny G
1

Je pense que j'aurais trouvé un moyen de le faire. Ma mise en œuvre préliminaire fonctionne, mais je ne sais pas s'il y a des cas marginaux que j'ai manqués. S'il y a un problème avec cette solution, veuillez le signaler.

Étant donné que je souhaite obtenir les plages lon / lat du polygone plutôt que les points qui le composent, une façon de résoudre le problème consiste à `` marcher '' le long de l'ensemble des coordonnées ordonnées du début à la fin. Vous gardez une trace de la distance parcourue dans le sens horaire et antihoraire par rapport au centre de la Terre en fonction d' un point de départ et continuez jusqu'à ce que vous ayez terminé le polygone:

entrez la description de l'image ici

Vous pouvez obtenir une plage de distance entre CW et CCW à partir de votre point de départ ... cela vous donne suffisamment d'informations pour dériver des limites correctes dans le cas normal (à gauche dans l'image). Dans le cas où le polygone fait le tour complet ou coupe à travers le centre, l'angle de déplacement renvoyé sera de 360 ​​degrés.

Cette méthode fonctionne également lorsque le polygone `` épouse '' la surface de la Terre plutôt que de la traverser. Donc, si vous avez un polygone montrant quelqu'un voyageant le long de la surface de la Terre de Toronto (lon: -79) à Londres (lon: -5) à Tokyo (lon: 139) et retour (dans le même ordre), vous aurez obtenez la plage [-79 à 139].

Si le polygone coupe le centre (imaginez deux points adjacents à +90 et -90), je considère que c'est un balayage complet (360 degrés) bien que vous puissiez aller dans les deux sens.

Pris
la source