Flugblatt Geojson Koordinatenproblem

14

Ich habe gerade angefangen, ein bisschen mit Leflet / Geojson zu spielen. Aber meine Koordinaten werden nicht richtig dargestellt und ich habe keine Ahnung, was los ist.

Meine Koordinaten sind: 52.23943, 4.97599. Sie arbeiten korrekt mit der setViewFunktion.

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

Aber mit einem Geojason-Feature sind sie, hmmm, irgendwo östlich von Somalia 'projiziert'.

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.");

Wer weiß, was hier passiert?

BEARBEITEN

Aus reiner Neugier habe ich die Koordinaten geändert [4.976143930893815,52.23925499011473]und der Punkt wird an der richtigen Stelle angezeigt. Ein bekannter Bug !?

LarsVegas
quelle

Antworten:

25

Ich würde es nicht als Fehler bezeichnen, sondern nur als verwirrende und widersprüchliche Angelegenheit.

Wenn wir über geografische Standorte sprechen, verwenden wir normalerweise Lat-Long. Dies wurde in der Norm ISO 6709 kodifiziert .

Beim Umgang mit kartesischer Koordinatengeometrie verwenden wir im Allgemeinen XY. Viele GIS-Systeme arbeiten mit einer geografischen Position als Spezialfall eines 2D-Koordinatenpunkts, wobei X die Länge und Y die Breite darstellt. Diese Koordinatenreihenfolge ist genau entgegengesetzt zu der regulären Lat-Long-Reihenfolge.

Kommen Sie zu Ihrem Problem:

Die map.setView nimmt als Eingabe l.LatLong , wobei die erste Koordinate eine Breite und die zweite eine Länge ist.

Also, wenn Sie wollen 52.23N, 4.97E, geben Sie nach[52.23943, 4.97599]

Der GeoJSON-Standard besagt, dass für jeden Punkt der erste Parameter die X-Koordinate (dh der Längengrad) und der zweite Parameter die Y-Koordinate (dh der Breitengrad) ist.

Wenn Sie also 52.23N, 4.97Ein GeoJSON möchten , müssen Sie übergeben [4.97599, 52.23943]

Lesen Sie diese Fragen und Antworten durch, um weitere Informationen zu erhalten

Devdatta Tengshe
quelle
In der Tat eine Frage der Verwirrung. Ich habe gerade die Geojson-Spezifikation gelesen und Sie haben absolut Recht. Hier ist das Zitat Die Reihenfolge der Elemente muss der Reihenfolge x, y, z entsprechen (Ost, Nord, Höhe für Koordinaten in einem projizierten Koordinatenbezugssystem oder Längengrad, Breitengrad, Höhe für Koordinaten in einem geografischen Koordinatenbezugssystem)
LarsVegas,
1
@LarsVegas Der Ursprung dieser Ausgabe ist die englische Sprache. Wir sagen normalerweise Lat-Long, wenn wir über den geografischen Standort sprechen, und verwenden XY, wenn wir über Koordinatengeometrie sprechen.
Devdatta Tengshe
Eine Zusammenfassung, welche Programme und Bibliotheken verwenden X, Y und die Y, X Paar Ordnung: macwright.org/lonlat , mit freundlicher Genehmigung Tom MacWrite
matt wilkie
Danke für diese hilfreiche Antwort ... aber WARUM hat Geojson sich dafür entschieden?
Tommy
1

Ich bin gerade auf dieses Problem gestoßen. Wenn dieses Problem auftritt und eine beträchtliche Anzahl lat. Langer Datenpaare vorhanden ist, können Sie die folgenden Js verwenden:

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: laut dieser SO- Antwort gibt es anscheinend auch diese Methode:

L.GeoJSON.coordsToLatLng().

Ich habe es nicht benutzt, aber es scheint vielversprechend.

alexandros84
quelle
1
Eine nützliche Funktion. Die meisten Eingaben wären wahrscheinlich reine Koordinatenpaarlisten - [[60.672744462452,-135.02487602415],[60.673011537554,-135.02487602415]]. Ich habe auch das Modul geojson-flip nodejs gesehen, aber nicht verwendet .
Matt Wilkie
Ty für deine freundlichen Worte. Es war größtenteils eine Lösung des letzten Moments, als ich an einem engen Zeitplan arbeitete. Es gibt tatsächlich eine Methode, die von der Broschürenbibliothek bereitgestellt wird, um genau das zu tun, wie ich später erfahren habe (kann mich jetzt nicht erinnern, welche, aber ich kann prüfen, ob Sie wollen).
Alexandros84
Der Name der Leaflet-Methode wäre hilfreich! Ich konnte es nicht finden und das oben erwähnte Geojson-Flip-Modul funktioniert nicht mit meinen Daten.
Matt Wilkie
Fand etwas in Rasen , das ein großes, gut unterstütztes Modul ist: turfjs.org/docs/#flip
matt wilkie
1
Hey, entschuldige die lange Verzögerung, aber hier ist, worüber ich sprach: stackoverflow.com/questions/35983078/…
alexandros84