リーフレットジオイソン座標問題


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]、ポイントが正しい場所に表示されます。既知のバグ!?

回答:


25

私はそれをバグと呼ぶのではなく、単に混乱した矛盾した標準の問題です。

地理的な場所について話すとき、通常は緯度経度を使用します。これは、ISO 6709標準で体系化されています。

デカルト座標ジオメトリを扱う場合、通常はXYを使用します。多くのGISシステムは、Xが経度を表し、Yが緯度を表す2 D座標点の特殊なケースとして地理的位置で動作します。この座標の順序は、通常の緯度経度の概念の順序とは正反対です。

あなたの問題に来る:

map.setViewは入力としてl.LatLongを受け取ります。最初の座標は緯度で、2番目の座標は経度です。

したがって、必要なときに52.23N, 4.97E渡す[52.23943, 4.97599]

GeoJSON標準は、任意の点のために、最初のパラメータは、x座標であることを述べている(すなわち、経度)と2番目のパラメータはY座標(即ち緯度)。

したがって52.23N, 4.97E、GeoJSONを使用する場合は、合格する必要があります [4.97599, 52.23943]

詳細については、このQ&Aをご覧ください


確かに混乱の問題。私はgeojsonの仕様を読んだだけで、確かにあなたは絶対に正しいです。要素の順序
LarsVegas

1
@LarsVegasこの問題の原因は英語です。通常、地理的位置について話すときは緯度経度と言い、座標ジオメトリについて話すときはXYを使用します。
Devdatta Tengshe

:プログラムやライブラリはX、Y及びY、Xのペアの順序を使用その要約macwright.org/lonlat、礼儀トムMacWrite
マットウィルキー

この有益な答えをありがとう...しかし、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
マットウィルキー

1
ちょっと、長い遅延で申し訳ありませんが、ここで私が話していたことがあります:stackoverflow.com/questions/35983078/…–
alexandros84
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.