传单geojson坐标问题


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],使该点出现在其正确的位置。一个已知的错误!

Answers:


25

我不会将其称为错误,而只是令人困惑和相互矛盾的标准。

在谈论地理位置时,我们通常使用纬度。这已编入ISO 6709标准

处理笛卡尔坐标几何时,通常使用XY。许多GIS系统都将地理位置作为2D坐标点的特例,其中X代表经度,Y代表纬度。此坐标顺序与常规的Lat-long概念完全相反。

遇到您的问题:

map.setView将l.LatLong作为输入,其中第一个坐标是纬度,第二个坐标是经度。

因此,当您想要时52.23N, 4.97E,您会通过[52.23943, 4.97599]

以GeoJSON标准说,对于任何点处,第一参数是X坐标(即经度)和第二参数的Y坐标(即纬度);

因此,当您要52.23N, 4.97E在GeoJSON中使用时,您需要传递 [4.97599, 52.23943]

如需进一步阅读,请进行以下问答


确实是一个混乱的问题。我刚刚阅读了geojson规范,确实您是绝对正确的。这是引号。元素的顺序必须遵循x,y,z顺序(投影坐标系中坐标的东,北,海拔,地理坐标系中坐标的经度,纬度,海拔)
LarsVegas

1
@LarsVegas此问题的起源是英语。我们通常在谈论地理位置时说“纬度”,而在谈论坐标几何时则说“ XY”。
Devdatta Tengshe

哪些程序和库使用X,Y以及哪些Y,X对排序的摘要macwright.org/lonlat,由Tom MacWrite提供
Matt wilkie

感谢您提供的有用答案...但是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(); 

编辑:根据此SO 答案,显然也有此方法:

L.GeoJSON.coordsToLatLng()

我还没有使用它,但看起来很有希望。


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.