problema de coordenadas geojson folheto

14

Comecei a brincar um pouco com leflet / geojson. Mas minhas coordenadas não são renderizadas corretamente e não tenho idéia do que está acontecendo.

Minhas coordenadas são: 52.23943, 4.97599. Eles funcionam corretamente com a setViewfunção.

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

Mas, usando uma característica geográfica, eles estão, hmmm, 'projetados', em algum lugar a leste da Somália.

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

Alguém que sabe o que está acontecendo aqui?

EDITAR

Por pura curiosidade, mudei as coordenadas [4.976143930893815,52.23925499011473]e o ponto aparece no local correto. Um bug conhecido !?

LarsVegas
fonte

Respostas:

25

Eu não chamaria isso de bug, apenas uma questão de padrões confusos e contraditórios.

Ao falar sobre localizações geográficas, geralmente usamos Lat-long. Isso foi codificado na norma ISO 6709 .

Ao lidar com a geometria de coordenadas cartesianas, geralmente usamos XY. Muitos sistemas GIS trabalham com uma localização geográfica como um caso especial de um ponto de coordenada 2 D, onde o X representa a longitude e Y representa a latitude. Essa ordem de coordenadas é exatamente oposta à da noção Lat-long regular.

Chegando ao seu problema:

O map.setView usa l.LatLong como entrada, onde o primeiro cordado é um Latitude e o segundo é Longitude.

Daí quando você quiser 52.23N, 4.97E, você passa[52.23943, 4.97599]

O padrão GeoJSON diz que, para qualquer ponto, o primeiro parâmetro é a coordenada X (ou seja, Longitude) e o segundo parâmetro é a coordenada Y (ou seja, Latitude);

Portanto, quando você quiser 52.23N, 4.97Eno GeoJSON, precisará passar [4.97599, 52.23943]

Para uma leitura mais aprofundada, consulte estas perguntas e respostas

Devdatta Tengshe
fonte
De fato, uma questão de confusão. Acabei de ler a especificação geojson e, de fato, você está absolutamente certo. Aqui está a citação A ordem dos elementos deve seguir a ordem x, y, z (leste, norte, altitude para coordenadas em um sistema de referência de coordenadas projetado, ou longitude, latitude, altitude para coordenadas em um sistema de referência de coordenadas geográficas)
LarsVegas
1
@LarsVegas A origem deste problema é o idioma inglês. Normalmente dizemos Lat-long quando estamos falando sobre a localização geográfica e usamos XY quando estamos falando sobre geometria de coordenadas.
Devdatta Tengshe
Um resumo das quais programas e bibliotecas usar X, Y e que Y, X par ordenação: macwright.org/lonlat , cortesia Tom MacWrite
Matt Wilkie
obrigado por esta resposta útil ... mas POR QUE geojson optou por fazer isso?
Tommy
1

Acabei de esbarrar nessa questão. Para qualquer pessoa que tenha esse problema e tenha um número considerável de pares de dados longos e latinos, você pode usar os seguintes 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(); 

Edit: de acordo com esta resposta SO , aparentemente há também este método:

L.GeoJSON.coordsToLatLng().

Eu não o uso, mas parece promissor.

alexandros84
fonte
1
Uma função útil. A maioria das entradas provavelmente seriam listas simples de pares de coordenadas - [[60.672744462452,-135.02487602415],[60.673011537554,-135.02487602415]]. Também vi mas não usei o módulo geojson-flip nodejs.
31517 Julian
Ty pelas suas amáveis ​​palavras. Foi principalmente uma solução do último momento, pois eu estava trabalhando em um cronograma apertado. Na verdade, existe um método fornecido pela biblioteca de folhetos para fazer exatamente isso como aprendi mais tarde (não consigo lembrar agora qual, mas posso verificar se você deseja).
Alexandros84
O nome do método Leaflet seria útil! Não consegui encontrá-lo, e o módulo geojson-flip que mencionei acima não funciona com meus dados.
Matt wilkie
Algo que se encontra no relvado , que é um grande módulo bem suportado: turfjs.org/docs/#flip
Matt Wilkie
1
hey, desculpe pelo atraso, mas aqui é o que eu estava falando: stackoverflow.com/questions/35983078/...
alexandros84