prospecto problema de coordenadas geojson

14

Empecé a jugar un poco con leflet / geojson. Pero mis coordenadas no se representan correctamente y no tengo idea de lo que está sucediendo.

Mis coordenadas son: 52.23943, 4.97599. Funcionan correctamente con la setViewfunción.

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

Pero usando una característica de geojason están, hmmm, 'proyectados', en algún lugar al este de 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.");

¿Alguien que sepa lo que está pasando aquí?

EDITAR

Por pura curiosidad cambié las coordenadas [4.976143930893815,52.23925499011473]y el punto aparece en su ubicación correcta. ¿Un error conocido?

LarsVegas
fuente

Respuestas:

25

No lo llamaría un error, solo una cuestión de estándares confusos y contradictorios.

Cuando hablamos de ubicaciones geográficas, generalmente usamos Lat-long. Esto ha sido codificado en la norma ISO 6709 .

Cuando se trata de geometría de coordenadas cartesianas, generalmente usamos XY. Muchos sistemas SIG funcionan con una ubicación geográfica como un caso especial de un punto de coordenadas 2 D, donde X representa la longitud e Y representa la latitud. Este orden de coordenadas es exactamente opuesto al de la noción Lat-long regular.

Llegando a tu problema:

Map.setView toma un l.LatLong como entrada, donde el primer cordinado es una latitud y el segundo es la longitud.

Por lo tanto, cuando quieras 52.23N, 4.97E, pasas[52.23943, 4.97599]

El estándar GeoJSON dice que para cualquier punto, el primer parámetro es la coordenada X (es decir, la longitud) y el segundo parámetro es la coordenada Y (es decir, la latitud);

Por lo tanto, cuando quieras 52.23N, 4.97Een GeoJSON, debes pasar [4.97599, 52.23943]

Para leer más, revisa estas preguntas y respuestas

Devdatta Tengshe
fuente
De hecho, una cuestión de confusión. Acabo de leer las especificaciones de Geojson y de hecho tienes toda la razón. Aquí está la cita El orden de los elementos debe seguir el orden x, y, z (este, norte, altitud para coordenadas en un sistema de referencia de coordenadas proyectadas, o longitud, latitud, altitud para coordenadas en un sistema de referencia de coordenadas geográficas)
LarsVegas
1
@LarsVegas El origen de este problema es el idioma inglés. Usualmente decimos Lat-long cuando hablamos de la ubicación geográfica y usamos XY cuando hablamos de geometría de coordenadas.
Devdatta Tengshe
Un resumen de qué programas y bibliotecas usan X, Y y qué pedido de pares Y, X: macwright.org/lonlat , cortesía de Tom MacWrite
matt wilkie
gracias por esta útil respuesta ... pero ¿POR QUÉ geojson eligió hacer esto?
Tommy
1

Acabo de toparme con este tema. Para cualquier persona que experimente este problema y tenga un número considerable de pares de datos largos y largos, puede usar los siguientes 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(); 

Editar: de acuerdo con esta respuesta SO , aparentemente también existe este método:

L.GeoJSON.coordsToLatLng().

No lo he usado pero parece prometedor.

alexandros84
fuente
1
Una función útil Sin embargo, la mayoría de las entradas probablemente serían listas de pares de coordenadas desnudas [[60.672744462452,-135.02487602415],[60.673011537554,-135.02487602415]]. También he visto pero no he usado el módulo geojson-flip nodejs.
matt wilkie
Ty por tus amables palabras. Fue sobre todo una solución del último momento, ya que estaba trabajando en un horario apretado. En realidad, hay un método proporcionado por la biblioteca de folletos para hacer exactamente eso, como he aprendido más tarde (no puedo recordar ahora qué, pero puedo verificar si lo desea).
alexandros84
¡El nombre del método de folleto sería útil! No he podido encontrarlo, y el módulo geojson-flip que mencioné anteriormente no funciona con mis datos.
Matt Wilkie
Encontré algo en turf , que es un gran módulo bien soportado: turfjs.org/docs/#flip
matt wilkie
1
Hola, perdón por el largo retraso, pero esto es de lo que estaba hablando: stackoverflow.com/questions/35983078/…
alexandros84