листовка о координате геойсона

14

Я только начал немного играть с leflet / geojson. Но мои координаты не отображаются должным образом, и я понятия не имею, что происходит.

Мои координаты: 52.23943, 4.97599. Они работают правильно с setViewфункцией.

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

Но, используя geojasonFeature, они, хммм, «проецируются» где-то к востоку от Сомали.

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

Кто-нибудь знает, что здесь происходит?

РЕДАКТИРОВАТЬ

Из чистого любопытства я изменил координаты вокруг, [4.976143930893815,52.23925499011473]и точка появляется в правильном месте. Известная ошибка !?

LarsVegas
источник

Ответы:

25

Я бы не назвал это ошибкой, просто вопросом запутанных и противоречивых стандартов.

Говоря о географических местоположениях, мы обычно используем Lat-long. Это было кодифицировано в стандарте ISO 6709 .

При работе с декартовой координатной геометрией мы обычно используем XY. Многие ГИС-системы работают с географическим местоположением как особый случай двухмерной координатной точки, где X представляет долготу, а Y представляет широту. Этот порядок координат в точности противоположен обычному понятию Лат-Лонга.

Приходя к вашей проблеме:

Map.setView принимает l.LatLong в качестве входных данных, где первый кординат - это широта, а второй - долгота.

Следовательно, когда вы хотите 52.23N, 4.97E, вы переходите в[52.23943, 4.97599]

Стандарт GeoJSON говорит, что для любой точки первым параметром является координата X (т. Е. Долгота), а вторым параметром является координата Y (т. Е. Широта);

Следовательно, когда вы хотите 52.23N, 4.97Eв GeoJSON, вам нужно передать [4.97599, 52.23943]

Для дальнейшего чтения, пройдите этот Q & A

Девдатта Тенгше
источник
На самом деле вопрос путаницы. Я только что прочитал спецификацию Geojson, и ты действительно прав. Вот цитата . Порядок элементов должен соответствовать порядку x, y, z (восток, север, высота для координат в спроектированной системе координат или долгота, широта, высота для координат в географической системе координат)
LarsVegas
1
@LarsVegas Происхождение этого выпуска - английский язык. Мы обычно говорим Lat-long, когда говорим о географическом местоположении, и используем XY, когда говорим о координатной геометрии.
Девдатта Тенгше
Краткое изложение того, какие программы и библиотеки используют X, Y и какой порядок Y, X пар: macwright.org/lonlat , предоставлено Томом МакВрайтом
Мэтт Уилки
спасибо за этот полезный ответ ... но ПОЧЕМУ geojson решил сделать это ??
Томми,
1

Я только что натолкнулся на эту проблему. Любой, кто сталкивается с этой проблемой и имеет большое количество длинных и длинных пар данных, может использовать следующие 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(); 

Редактировать: согласно этому такому ответу , по-видимому, есть также этот метод:

L.GeoJSON.coordsToLatLng(),

Я не использую это, но это кажется многообещающим.

alexandros84
источник
1
Полезная функция. Большинство входных данных, вероятно, будут представлять собой списки координатных пар [[60.672744462452,-135.02487602415],[60.673011537554,-135.02487602415]]. Я также видел, но не использовал модуль geojson-flip nodejs.
Мэтт Уилки
Ты за добрые слова. В основном это было решение последнего момента, так как я работал в сжатые сроки. На самом деле есть библиотека, предоставленная библиотекой листовок, чтобы сделать именно это, как я узнал позже (сейчас я не могу вспомнить, но я могу проверить, если хотите).
alexandros84
Название метода Leaflet будет полезным! Я не смог найти его, и модуль geojson-flip, о котором я упоминал выше, не работает с моими данными.
Мэтт Уилки
Нашел что-то в turf , который является большим хорошо поддерживаемым модулем: turfjs.org/docs/#flip
matt wilkie
1
эй, извините за долгую задержку, но вот о чем я говорил: stackoverflow.com/questions/35983078/…
alexandros84