problem współrzędnych geojson ulotki

14

Właśnie zacząłem trochę grać z Lefletem / Geojsonem. Ale moje współrzędne nie są poprawnie renderowane i nie mam pojęcia, co się dzieje.

Kim są współrzędne: 52.23943, 4.97599. Działają poprawnie z setViewfunkcją.

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

Ale za pomocą geojasona są one, hmmm, „rzutowane” gdzieś na wschód od Somalii.

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

Czy ktoś wie, co się tutaj dzieje?

EDYTOWAĆ

Z czystej ciekawości zmieniłem współrzędne wokół [4.976143930893815,52.23925499011473]i punkt pojawia się we właściwym miejscu. Znany błąd !?

LarsVegas
źródło

Odpowiedzi:

25

Nie nazwałbym tego błędem, tylko kwestią mylących i sprzecznych standardów.

Mówiąc o lokalizacjach geograficznych, zwykle używamy Lat-long. Zostało to skodyfikowane w normie ISO 6709 .

W przypadku kartezjańskiej geometrii współrzędnych zwykle używamy XY. Wiele systemów GIS współpracuje z położeniem geograficznym jako szczególnym przypadkiem punktu współrzędnych 2 D, gdzie X oznacza długość geograficzną, a Y szerokość geograficzną. Ta kolejność współrzędnych jest dokładnie odwrotna do zwykłej koncepcji Lat-long.

Jeśli chodzi o twój problem:

Map.setView przyjmuje dane wejściowe l.LatLong , gdzie pierwszy cordinate to Latitude, a drugi Longitude.

Dlatego kiedy chcesz 52.23N, 4.97E, wchodzisz[52.23943, 4.97599]

Standard GeoJSON mówi, że dla dowolnego punktu pierwszym parametrem jest współrzędna X (tj. Długość geograficzna), a drugim parametrem jest współrzędna Y (tj. Szerokość geograficzna);

Dlatego jeśli chcesz 52.23N, 4.97Ew GeoJSON, musisz zdać [4.97599, 52.23943]

Aby przeczytać więcej, przejrzyj to pytanie i odpowiedzi

Devdatta Tengshe
źródło
Rzeczywiście kwestia zamieszania. Właśnie przeczytałem specyfikację geojson i rzeczywiście masz całkowitą rację. Oto cytat Kolejność elementów musi być zgodna z kolejnością x, y, z (wschód, północ, wysokość współrzędnych w rzutowanym układzie odniesienia współrzędnych lub długość geograficzna, szerokość geograficzna, wysokość współrzędnych w układzie odniesienia współrzędnych geograficznych)
LarsVegas
1
@LarsVegas Źródłem tego problemu jest język angielski. Zwykle mówimy Lat-long, gdy mówimy o położeniu geograficznym, i używamy XY, gdy mówimy o geometrii współrzędnych.
Devdatta Tengshe,
Podsumowanie, które programy i biblioteki używają X, Y, a które zamawiają pary Y, X: macwright.org/lonlat , dzięki uprzejmości Toma MacWrite'a
Matt Wilkie
dzięki za tę pomocną odpowiedź ... ale DLACZEGO geojson zdecydował się to zrobić?
Tommy
1

Właśnie natknąłem się na ten problem. Dla każdego, kto doświadcza tego problemu i ma znaczną liczbę długich, długich par danych, możesz użyć następującego 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(); 

Edycja: zgodnie z tą odpowiedzią SO , najwyraźniej istnieje również ta metoda:

L.GeoJSON.coordsToLatLng().

Nie korzystałem z niego, ale wydaje się obiecujący.

alexandros84
źródło
1
Przydatna funkcja. Większość danych wejściowych prawdopodobnie byłaby jednak pustymi listami współrzędnych - [[60.672744462452,-135.02487602415],[60.673011537554,-135.02487602415]]. Widziałem też moduł geodson-flip nodejs, ale go nie używałem.
matt wilkie
Ty za miłe słowa. Było to głównie rozwiązanie ostatniej chwili, kiedy pracowałem nad napiętym harmonogramem. Istnieje biblioteka metod ulotek, która robi dokładnie to, czego się później dowiedziałam (nie pamiętam teraz, ale mogę sprawdzić, czy chcesz).
alexandros84
Pomocna byłaby nazwa metody Ulotki! Nie udało mi się go znaleźć, a moduł geojson-flip, o którym wspomniałem powyżej, nie działa z moimi danymi.
matt wilkie
Znalazłem coś w turf , który jest dużym, dobrze obsługiwanym modułem: turfjs.org/docs/#flip
matt wilkie
1
hej, przepraszam za duże opóźnienie, ale oto o czym mówiłem: stackoverflow.com/questions/35983078/…
alexandros84