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 !?

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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.