volantino geojson problema di coordinate


14

Ho appena iniziato a giocare con leflet / geojson un po '. Ma le mie coordinate non sono visualizzate correttamente e non ho idea di cosa stia succedendo.

Le mie coordinate sono: 52.23943, 4.97599. Funzionano correttamente con la setViewfunzione.

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

Ma usando una funzionalità geojason sono, hmmm, "proiettati", da qualche parte ad est della Somalia.

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

Qualcuno che sa cosa sta succedendo qui?

MODIFICARE

Per pura curiosità ho cambiato le coordinate [4.976143930893815,52.23925499011473]e il punto appare nella posizione corretta. Un bug noto !?

Risposte:


25

Non lo definirei un bug, solo una questione di standard confusi e contraddittori.

Quando parliamo di posizioni geografiche, di solito usiamo Lat-long. Questo è stato codificato nella norma ISO 6709 .

Quando si ha a che fare con la geometria delle coordinate cartesiane, generalmente si usa XY. Molti sistemi GIS funzionano con una posizione geografica come un caso speciale di un punto di coordinata 2 D, dove X rappresenta la longitudine e Y rappresenta la latitudine. Questo ordine di coordinate è esattamente opposto a quello della normale nozione lat-long.

Venendo al tuo problema:

Map.setView utilizza l.LatLong come input, in cui la prima coordinata è una latitudine e la seconda è longitudine.

Quindi quando vuoi 52.23N, 4.97E, passi dentro[52.23943, 4.97599]

Lo standard GeoJSON afferma che per qualsiasi punto, il primo parametro è la coordinata X (ovvero la longitudine) e il secondo parametro è la coordinata Y (ovvero la latitudine);

Quindi quando vuoi 52.23N, 4.97Ein GeoJSON, devi passare [4.97599, 52.23943]

Per ulteriori letture, consulta le Domande e risposte


Anzi una questione di confusione. Ho appena letto le specifiche di Geojson e in effetti hai perfettamente ragione. Ecco la citazione L'ordine degli elementi deve seguire l'ordine x, y, z (est, nord, altitudine per le coordinate in un sistema di riferimento di coordinate proiettato, o longitudine, latitudine, altitudine per le coordinate in un sistema di riferimento di coordinate geografiche)
LarsVegas

1
@LarsVegas L'origine di questo problema è la lingua inglese. Di solito diciamo Lat-long quando parliamo della posizione geografica e usiamo XY quando parliamo di geometria delle coordinate.
Devdatta Tengshe,

Un riepilogo di quali programmi e librerie utilizzano X, Y e quali ordini di coppie Y, X: macwright.org/lonlat , cortesia di Tom MacWrite
matt wilkie

grazie per questa utile risposta ... ma PERCHÉ geojson ha scelto di farlo ??
Tommy,

1

Ho appena incontrato questo problema. Per chiunque abbia questo problema e abbia un numero considerevole di coppie di dati lat, long, puoi usare i seguenti js:

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(); 

Modifica: secondo questa risposta SO , a quanto pare esiste anche questo metodo:

L.GeoJSON.coordsToLatLng().

Non lo uso, ma sembra promettente.


1
Una funzione utile La maggior parte degli input sarebbero probabilmente elenchi di coppie di coordinate nude - [[60.672744462452,-135.02487602415],[60.673011537554,-135.02487602415]]. Ho anche visto ma non ho usato il modulo nodejs geojson-flip .
matt wilkie

Ty per le tue gentili parole. Era principalmente una soluzione dell'ultimo momento mentre stavo lavorando su un programma stretto. In realtà esiste un metodo fornito dalla libreria di opuscoli per fare esattamente quello che ho imparato in seguito (non ricordo ora quale, ma posso verificare se vuoi).
alexandros84,

Il nome del metodo Leaflet sarebbe utile! Non sono stato in grado di trovarlo e il modulo geojson-flip che ho citato sopra non funziona con i miei dati.
Matt Wilson

Trovato qualcosa nel tappeto erboso , che è un grande modulo ben supportato: turfjs.org/docs/#flip
matt wilkie

1
ehi, scusa per il lungo ritardo, ma ecco di cosa parlavo: stackoverflow.com/questions/35983078/…
alexandros84
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.