地理的データがantimeridianに及ぶデータベースおよびAPIのベストプラクティス


24

地理的特徴(ライン、ポリゴン、およびそれらの同等のマルチパート)がantimeridian(±180°経度)にまたがり、GeoJSONとしてクライアントWebアプリケーションに送信および受信する必要がある場合、それらを保存するためのベストプラクティスは何ですか?


私は、Postgres / PostGISデータベースのサポートを受けて、サーバー側のWeb APIで作業を開始し、熱帯低気圧の履歴と風の半径を予測します。太平洋の多くのサイクロンは、時には寿命の間に複数回、反時計回りを通過する不幸な傾向があります。

ここに画像の説明を入力してください

ニュージーランドのアンティリディアンの近くに住んでいる私は、地域のデータでこの問題に何度も対処し、対処戦略を立てましたが、実際にベストプラクティスと考えられるものを見つけたいと思います。残念ながら、でタグ付けされた既存の質問はないため、関連する質問を検索するのは困難です。私がこの問題に苦労しているのを見た質問はすべて、非常にアプリケーション固有のアドバイスを求めているようです。この質問では、境界のない地球に広がるGeoJSONポリゴンの場合の反時計回りについて簡単に説明します。この質問は、私が尋ねていることにかなり近いものです。

空間的データベースに歴史的サイクロンと予測サイクロンを保存する必要がありますが、反時計回りに問題があると予想しています。たとえば、緯度/経度(0,179)で始まり、で終わる線(0,-179)は、その方向に関してあいまいです。それは、反時計回りを横切る短い経路を取るか、惑星全体を「包む」かです。このようなパスを空間データベースにどのように保存する必要がありますか(具体的には私はPostGISを使用していますが、ソリューションが十分に汎用的であることを望みます)。私が持っているいくつかのアイデア:

  1. フィーチャジオメトリに変更を加えず、クライアントアプリケーションへの曖昧さをシフトします。
  2. antimeridian横切るフィーチャを、antimeridianでブレークするマルチパートジオメトリに分割します。(GeoJSON仕様は名前付きCRSをサポートしています。)
  3. 仕事以外のグローバル予測などの不連続を持っていない別のサイクロン流域や海洋地域のために
  4. サイクロンが惑星全体を巡回することが一度も観察されていないという事実を利用して(90,-90) 、360°の位相でオフセットされた緯度範囲から始まるサイクロンの座標を保存します(他の-180-180°を維持)
  5. サイクロンがアフリカの南端の南にある可能性が非常に低いという事実を利用して、経度30°でブレークを使用します(上記のマップのように)。
  6. 座標がEPSG 4326の有効範囲を超えて拡張できるようにします。たとえば、反時計回りを通過するすべてのフィーチャに対して、180度以上-180度未満です。
  7. TopoJSONと同様に、デルタエンコーディング(例:で始まり(0,-179)、次の座標は-3緯度西です)。PostGISにデータを保存するときにこれを実装するかどうか、または実装する方法がわかりませんが、これはクライアントアプリケーションにデータを送信するための優れたソリューションです。
  8. 何らかの形式のベクトル表記または極座標。(かなり難しくて珍しいようです。)

これらのうち、アイデア2〜5は一般的なものではないので好きではありませんが、私の特定のアプリケーションにとって意味があるので好きです。太平洋のデータのみを処理するアプリケーションの場合、それらは非常に理にかなっている可能性があるため、オプションとして完全に割引したくはありません。

アイデア6および7は、Tom MacWrightのブログから取り上げられました。このブログは読む価値はありますが、反時計回りに関しては決定的なものではありません。

アイデア4はGeographicaGS 'GeodesicLinesToGISPythonによって使用されfiona.transform.transform_geom、360°の反時計回りオフセットで使用されています。次に、FionaはOGRを使用してい-wrapdatelineます。これは非常に堅実な先例であり、実際にはかなり一般的だと思います。

ストレージの問題に関連して、そのような機能をクライアントアプリケーションに送信する方法、およびアプリケーションがそこにポストバックされるデータを考慮する方法を検討する必要があります(たとえば、太平洋のサイクロンの予測トラックを変更する人間予報士)。交換形式はおそらくGeoJSONになりますが、そうである必要はありません。

残念ながら、GeoJSON仕様は、反時計回りの問題について明示的ではありません。ウィキペディアからこれ:

多くの地理的ソフトウェアライブラリまたはデータ形式は、世界を長方形に投影します。多くの場合、この長方形は180番目の子午線で正確に分割されます。これにより、180番目の子午線上で単純なタスク(エリアやラインを表すなど)を実行できなくなることがよくあります。いくつかの例:

  • GeoJSON仕様では、仕様で180番目の子午線の処理に言及していないため、180番目の子午線を横切る線の表現は、世界中を回っていると解釈できます。

  • OpenStreetMapでは、領域(ロシアの境界など)は180番目の子午線で分割されます。

私の読書では、GeoJSONには反時計回りに広がる特徴の特定の標準表現はなく、意図的に曖昧なままになっています(マルチパートジオメトリによって問題が解決される可能性があります)。同様に、OpenStreetMapにはantimeridianにジオメトリ分割がありますが、そのような分割されたフィーチャがマルチパートであるか、実際に個別のレコードであるかはわかりません。

これは、特にバウンディングボックスまたはこの行にまたがる他の空間要求を作成するという観点からだけでなく、入力の解析とサニタイズおよびフィーチャジオメトリの更新においても、かなり問題があります。これが、私が従うことができるベストプラクティスを決定しようとしている理由です。


1
これは本当に良い質問です。以前は90度から開始する手作りの座標系を使用していましたが、私は非常に小さな領域にしか関心がありませんでした。本当に適切に「ラップアラウンド」するものはありません。180にまたがる(重要な)陸地がなく、それをマップする必要のある人がほとんどいないため、問題全体がほとんど注目されないからだと思います。
マイケルスティムソン

いい質問ですね。あなたはポイント4で運命を誘惑していると思いますが、実際には座標を360を超えて拡張できない理由はなく、modを使用して座標を回復します。デルタは最も拡張性の高いソリューションのように聞こえ、データ圧縮の面でもいくらかの利点がありますが、あなたが言うように、責任はクライアントに移ります。
ジョンパウエル

GeoJSONに関するコメントの一部は、1.0 RC以降は古くなっています。1つの例は、GeoJSONのCRS定義が非推奨になったことです(sgillies.net//2014/08/06/pruning-crs-from-geojson.html)。これは最終的に編集します。
alphabetasoup

回答:


7

純粋にデータストレージと分析の観点から言えばgeography、PostGISタイプは、(いくつかの設計目標の中で)反時計回りを念頭に置いて設計されました。タイプ専用に設計されたいくつかの機能geographyがあります。

たとえば、フィジーのタベウニGreat Circle Mapperでマッピング)を横切るLineStringを考えてみましょう。

SELECT ST_Length('LINESTRING(179.9 -17, -179.8 -16.7)'::geography);

この測地線の長さは約46 kmです。同様に、ST_Areaは、経度座標が+179から-179の間でジャンプしても、島のポリゴンで正しく機能します。

EPSG:4326 geometrygeography型にキャストすると、座標も正規化されます。たとえば、最後の座標の経度は180を超えます。

SELECT ST_AsGeoJSON('LINESTRING (179.9 -17, 180.2 -16.7)'::geography);

NOTICE:  Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY
                           st_asgeojson
------------------------------------------------------------------
 {"type":"LineString","coordinates":[[179.9,-17],[-179.8,-16.7]]}

geography最初の例ではまったく同じ型に変換されますが、GeoJSON出力が使用されます。NOTICE(またはSET client_min_messages TO WARNING;)を無視し、あらゆる種類の面白い外観をgeographyタイプとして変換することを選択できます。


表示geographyPostGISの外マップ上のタイプは別の話で、うまくいけば、より良い答えがこの点に触れたいと思います。


2
制限の1つは、地理が180º以下である必要があることです(高度なFAQを参照)。しかし、あなただけの頂点のために、このルールを使用することができますし、このような愚かな何かをLINESTRING(179.9 -17, 60 -16.9, -60 -16.8, -179.8 -16.7)、どのソートのラップの周り。
マイクT

0

確かに、好ましい答えは(1)です。つまり、クライアントに「正しいこと」をさせます。考慮すべき良いケースは、このkmlファイルによって近似された南極大陸を表すポリゴンです。

<kml> <Folder> <name>Antarctica</name> <Placemark> <name>Antarctica</name> <Polygon> <tessellate>1</tessellate> <outerBoundaryIs> <LinearRing> <coordinates> -58,-63.1,0 -74,-72.9,0 -102,-71.9,0 -102,-74.9,0 -131,-74.3,0 -163,-77.5,0 163,-77.4,0 172,-71.7,0 140,-65.9,0 113,-65.7,0 88,-66.6,0 59,-66.9,0 25,-69.8,0 -4,-70,0 -14,-71,0 -33,-77.3,0 -46,-77.9,0 -61,-74.7,0 -58,-63.1,0 </coordinates> </LinearRing> </outerBoundaryIs> </Polygon> </Placemark> </Folder> </kml>

経度の区切りが発生する場所でのデルタエンコードまたはシフトは、このようなデータには役立ちません。南極大陸に固有の投影法を使用すると機能しますが、これは一般的な解決策ではありません。

驚くべきことに、Google Earthプロはこのポリゴンを正しく表示しません(「アウトライン」モードを使用しない限り)。こちらをご覧ください Google Earthプロのスクリーンショット


Google Earthについてあまり知らないので、アウトラインモードを有効にする方法がわかりません。しかし、ここには反時計回りにまたがる有効なポリゴンがあり、画像ではGoogle Earthが正しくレンダリングできないことがわかります。したがって、Google Earthが対応できない場合、クライアントアプリケーションにあいまいさを渡すことはこのベストプラクティスです。それ?ちなみに、QGISはSRID 4326でこのポリゴンのレンダリングの問題を引き起こしますが、反時計回りに線を導入した場合(...線を除く)はそうではありません。南極ステレオグラフィック投影を使用すると、元の画像は見事にレンダリングされます。
alphabetasoup

けっこうだ。ただし、kml座標は緯度と経度に制限されているため、この特定の例では、ユーザーであるGoogle Earthを支援するためにできることは何もありません。クライアント側でこの問題を修正する責任はGoogle Earthのメンテナーにあります。(残念なことに、そうする傾向はほとんどありません!)
cffk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.