J'utilise des cartes de dépliants pour créer une représentation d'un défi autour du monde. Je voudrais ajouter une polyligne qui se dirige vers l'est de Tokyo et apparaît ensuite à l'ouest de l'Amérique du Sud sur la carte - mais à la place, j'obtiens une ligne qui traverse la carte dans la direction opposée (voir la ligne jaune).
Je pense que cela est probablement lié aux lignes de données et / ou aux systèmes de coordonnées, mais je suis un peu sommaire sur les détails. Quelqu'un peut-il expliquer la théorie derrière ce que je dois faire pour que cela fonctionne? J'utilise la projection bluemarble de la 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
la source
la source
Réponses:
Vous devez rompre la polyligne au méridien de + -180 degrés. Cela nécessite de trouver la latitude à laquelle la polyligne traverse ce méridien. Votre SIG a probablement des méthodes pour faire le break. Sinon, une solution simple peut être dérivée du code affiché dans un thread associé . Voici quelques détails.
Une polyligne est représentée comme une séquence de sommets , chacun donné sous forme (lat, lon), avec -180 <= lon <= 180. Vous devez vérifier chaque paire successive pour voir si elle croise le méridien + -180. Il y a un test rapide: si la valeur absolue de la différence de longitudes est de 180 ou plus, il y a un croisement.
Dans chaque segment (lat0, lon0) -> (lat1, lon1) qui traverse le méridien + -180, vous devez diviser la polyligne en deux morceaux où elle se croise.
La clé est de trouver la latitude du point de rupture avec une précision raisonnable. Cela se fait plus facilement avec un modèle de terre sphérique: l'erreur (par rapport à un modèle ellipsoïdal plus précis) sera trop faible pour être remarquée.
Laissez le segment en question passer du point 0 en (lat0, lon0) au point 1 en (lat1, lon1). Le point de rupture peut être trouvé en exécutant un segment de ligne droite en 3D entre les deux points comme représenté en coordonnées cartésiennes et en trouvant où la coordonnée y est nulle. Les coordonnées cartésiennes sont
et une expression similaire donnant (x1, y1, z1) pour le point 1. Résoudre l'équation
pour t; C'est,
Les coordonnées de l'intersection sont donc
Ce point (qui se trouve sous la surface de la terre quelque part sous le méridien + -180) a une latitude égale à
Le point d'arrêt doit être représenté de deux manières. Lorsque vous l'attachez après (lat0, lon0) pour terminer la première partie de la polyligne rompue, utilisez (lat2, -180) si lon0 est négatif et sinon utilisez (lat2, 180). Lorsque vous l'attachez avant (lat1, lon1) pour démarrer la deuxième partie de la polyligne rompue, suivez une règle similaire.
Dans des cas exceptionnels, l'un ou les deux des points 0 et 1 peuvent être sur le méridien + -180. En suivant cette procédure, vous placerez un segment de longueur nulle sur l'une des pièces de polyligne que vous créez. Si cela peut provoquer un problème avec le SIG, testez cette condition.
Notez qu'une polyligne peut traverser ce méridien plusieurs fois. Par conséquent, après avoir trouvé la première rupture et brisé la polyligne en deux parties, vous devez traiter la deuxième partie de la même manière.
la source
Pour une discussion connexe, ce billet est peut-être intéressant:
"la projection vectorielle au-dessus de la limite d'enroulement est divisée"
https://trac.osgeo.org/grass/ticket/1527
la source