dépliant problème de coordonnées geojson

14

Je viens de commencer à jouer un peu avec leflet / geojson. Mais mes coordonnées ne sont pas restituées correctement et je n'ai aucune idée de ce qui se passe.

Mes coordonnées sont les suivantes : 52.23943, 4.97599. Ils fonctionnent correctement avec la setViewfonction.

var map = L.map('leaflet_map').setView([52.23943, 4.97599], 15);

Mais en utilisant un géojason, ils sont, hmmm, «projetés» quelque part à l'est de la Somalie.

var geojsonFeature = {
            "type": "Feature",
            "properties": {
            "name": "Coors Field",
            "amenity": "Baseball Stadium",
            "popupContent": "This is where the Rockies play!"
            },
            "geometry": {
                "type": "Point",
                "coordinates": [52.23943, 4.97599]
            }
        };
        var myLayer = L.geoJson().addTo(map);
        myLayer.addData(geojsonFeature).bindPopup("I am a gjson point.");

Quelqu'un qui sait ce qui se passe ici?

ÉDITER

Par pure curiosité, j'ai changé les coordonnées autour [4.976143930893815,52.23925499011473]et le point apparaît à son emplacement correct. Un bug connu!?

LarsVegas
la source

Réponses:

25

Je n'appellerais pas cela un bug, juste une question de normes confuses et contradictoires.

Lorsque nous parlons de lieux géographiques, nous utilisons généralement Lat-long. Ceci a été codifié dans la norme ISO 6709 .

Pour la géométrie des coordonnées cartésiennes, nous utilisons généralement XY. De nombreux systèmes SIG fonctionnent avec un emplacement géographique comme cas particulier d'un point de coordonnées 2D, où X représente la longitude et Y représente la latitude. Cet ordre de coordonnées est exactement opposé à celui de la notion régulière de Lat-long.

Venir à votre problème:

Le map.setView prend un l.LatLong en entrée, où le premier coordonné est un Latitude et le second est Longitude.

Donc quand tu veux 52.23N, 4.97E, tu passes[52.23943, 4.97599]

La norme GeoJSON dit que pour tout point, le premier paramètre est la coordonnée X (c'est-à-dire la longitude) et le deuxième paramètre est la coordonnée Y (c'est-à-dire la latitude);

Par conséquent, lorsque vous voulez 52.23N, 4.97Edans GeoJSON, vous devez passer [4.97599, 52.23943]

Pour en savoir plus, consultez ce Q&R

Devdatta Tengshe
la source
En effet, une question de confusion. Je viens de lire la spécification geojson et en effet vous avez absolument raison. Voici la citation L'ordre des éléments doit suivre l'ordre x, y, z (abscisse, ordonnée, altitude pour les coordonnées dans un système de référence de coordonnées projeté, ou longitude, latitude, altitude pour les coordonnées dans un système de référence de coordonnées géographiques)
LarsVegas
1
@LarsVegas L'origine de ce problème est la langue anglaise. Nous disons généralement Lat-long lorsque nous parlons de l'emplacement géographique et utilisons XY lorsque nous parlons de géométrie de coordonnées.
Devdatta Tengshe
Un résumé des programmes et des bibliothèques qui utilisent X, Y et de l'ordre des paires Y, X: macwright.org/lonlat , avec la permission de Tom MacWrite
matt wilkie
merci pour cette réponse utile ... mais POURQUOI geojson a-t-il choisi de le faire ??
Tommy
1

Je viens de tomber sur cette question. Pour toute personne rencontrant ce problème et possédant un nombre considérable de paires de données latentes et longues, vous pouvez utiliser les js suivants:

var a = "[LatLng(37.43943, 25.30563)],[LatLng(37.4367, 25.30495)],[LatLng(37.43071, 25.29945)],[LatLng(37.42362, 25.30426)],[LatLng(37.42089, 25.31113)],[LatLng(37.41489, 25.31113)],[LatLng(37.41053, 25.30769)],[LatLng(37.40235, 25.30563)],[LatLng(37.40562, 25.31525)],[LatLng(37.41816, 25.31937)],[LatLng(37.42307, 25.3228)],[LatLng(37.40889, 25.33104)],[LatLng(37.4078, 25.33722)],[LatLng(37.41598, 25.33791)],[LatLng(37.40344, 25.35027)],[LatLng(37.40726, 25.3688)],[LatLng(37.42253, 25.39009)],[LatLng(37.4138, 25.39902)],[LatLng(37.42907, 25.4052)],[LatLng(37.42961, 25.41962)],[LatLng(37.44215, 25.42442)],[LatLng(37.44543, 25.45807)],[LatLng(37.46287, 25.4615)],[LatLng(37.47595, 25.46013)],[LatLng(37.47104, 25.42786)],[LatLng(37.48249, 25.42923)],[LatLng(37.48358, 25.41)],[LatLng(37.49502, 25.40588)],[LatLng(37.49447, 25.38597)],[LatLng(37.49066, 25.3791)],[LatLng(37.46941, 25.38254)],[LatLng(37.46178, 25.37773)],[LatLng(37.4754, 25.35988)],[LatLng(37.4972, 25.35782)],[LatLng(37.50047, 25.34203)],[LatLng(37.49774, 25.32761)],[LatLng(37.49229, 25.3228)],[LatLng(37.4912, 25.3125)],[LatLng(37.4814, 25.30907)],[LatLng(37.47268, 25.31113)],[LatLng(37.46341, 25.32692)],[LatLng(37.44597, 25.32692)],[LatLng(37.42798, 25.3228)],[LatLng(37.43943, 25.30563)]".split("],[");
var b = a.map(function(x) { 
    var couple= (/\d+.\d+, \d+.\d+/g).exec(x).toString();
    var splitted = couple.split(", ");
    return "["+splitted[1]+","+splitted[0]+"]";
                            } );
b.join(); 

Edit: selon cette réponse SO , il y a apparemment aussi cette méthode:

L.GeoJSON.coordsToLatLng().

Je ne l'utilise pas mais cela semble prometteur.

alexandros84
la source
1
Une fonction utile. La plupart des entrées seraient probablement des listes de paires de coordonnées nues - [[60.672744462452,-135.02487602415],[60.673011537554,-135.02487602415]]. J'ai également vu mais pas utilisé le module nodejs geojson-flip .
matt wilkie
Ty pour vos aimables paroles. C'était surtout une solution du dernier moment car je travaillais sur un calendrier serré. Il y a en fait une méthode fournie par la bibliothèque de dépliants pour faire exactement cela comme je l'ai appris plus tard (je ne peux pas me souvenir maintenant, mais je peux vérifier si vous le souhaitez).
alexandros84
Le nom de la méthode Leaflet serait utile! Je n'ai pas pu le trouver, et le module geojson-flip que j'ai mentionné ci-dessus ne fonctionne pas avec mes données.
matt wilkie
Trouvé quelque chose dans le gazon , ce qui est un module de bien pris en charge: turfjs.org/docs/#flip
Wilkie mat
1
hé, désolé pour le long retard, mais voici de quoi je parlais: stackoverflow.com/questions/35983078/…
alexandros84