なぜPostGISを気にする必要がありますか? -空間データベースのやさしい入門

データベース? あまり面白くない。

だから、GISやデータビジュアライゼーションを扱う平均的な人は考えるかもしれません。 私は、データベースが世界で最もセクシーなものではないことを認めなければなりません(申し訳ありませんが、DBAの)が、より深刻な方法で(空間的な)データを分析 このブログ記事では、空間データベースを効率的に使用することでどのような利点が得られるかを考えてみたいと思います。

誇大広告の用語が入り交じっていて、ほんの数年前にはまだビッグデータの周りに大きな誇大広告がありましたが、それは徐々に消えています。 まあ、データはまだ大きく、実際にはこれまで以上に大きくなっています。 ファイルサイズが増加し、”データサイエンス”と地球科学では、人々は簡単にギガバイトの範囲にすることができ、データに対処する必要があります。 データが大きければ大きいほど、データの保存と分析の方法にもっと注意を払う必要があります。

それがデータベースが画像に入る場所です。

ソフトウェア開発では、データベースを操作する必要があります。 しかし、コンピュータサイエンスの他のサブドメイン(GISなど)の人々にとって、データベースの利点は必ずしも明白ではないかもしれません。 もちろん、人々は最も使い慣れたツールを使用する傾向がありますが、目標を達成するための最も効率的な方法ではありません。 しかし時々あなたの慰めの地帯から歩むことは実際に大きい利点を持って来ることができる。 私は、空間SQLにある可能性をゆっくりと認識してきました。

ブラジルでのフライトの週。 元のファイルは、原点と目的地の座標を持つ単なるcsvでした。 データをPostGISにロードし、座標からポイントジオメトリを作成し、ポイント間に線を作成し、最終的にQGIS Time Managerでデータを視覚化しました。

このブログ記事は、主に地理空間データを扱う人々のためのものですが、PostGISに触れていない、またはそれについて聞いたことがないかもしれません。 私はPostgreSQL/PostGISをインストールする方法を説明するつもりはありませんが、むしろそれが何であるか、それが何のために良いのかの概要を試してみてくださ

私のワークフローと例は主にQGIS+PostGISの組み合わせに焦点を当てていますが、PostGIS、独自のコード、または他のGISクライアントのみで作業することもできます。

ポスト…何?

すでに私のGIS研究中に、「PostGISはPostgresの空間的拡張です」というフレーズを何度も聞いていました。 それは私がそれが何を意味するか考えていたという意味ではありませんでした。 私はPostgresとは何か、空間的な拡張はおろか、何の手がかりもありませんでした。

できるだけ簡単にブレーキをかけてみましょう。

一部の人々は、この比較のために私を憎むかもしれないが、私はリスクを取るだろう:あなたはデータベースで作業したことがない場合は、データベーステーブルを大規模なExcelシートと考えることができます。 しかし、行番号433 285の3番目の列にある値をミリ秒で見つけることができる大規模なインテリジェントなExcelシート。 また、シート内の関数を単一のセルに書き込む代わりに、それらをSQLコマンドウィンドウに書き込みます。 だから、データを保存する場所と、効率的にデータを取り出すことができる場所。

PostGISは、PostgreSQLデータベース管理システム(別名DBMS)のためのオープンソース、自由に利用可能な空間データベースエクステンダーです。 したがって、PostgreSQL(別名Postgres)はデータベースであり、PostGISはそのデータベースへのアドオンのようなものです。 PostGISの最新リリースバージョンは現在、PostgreSQLにパッケージ化されています。一言で言えば、PostGISはdistance、area、union、intersection、specialty geometryデータ型などの空間関数をPostgreSQLに追加します。空間データベースは、データベース内の他のオブジェクトと同様に、空間オブジェクトを格納および操作します。したがって、通常のデータベースでは、さまざまなタイプ(数値、テキスト、タイムスタンプ、画像…)のデータを格納し、必要に応じてデータを照会(フェッチ)して質問に 質問は、”あなたのウェブサイトにログオンしている人の数”または”オンラインストアで行われたトランザクションの数”についてです。 空間関数は、代わりに”最も近い店がどれくらい近いか”、”このエリアの中にこの点があるか”、”この国の大きさは何か”などの質問に答えることができます。

そのため、データは行と列に格納されます。 PostGISは空間データベースであるため、データには、空間参照識別子(SRID)によって定義された特定の座標系のデータを含むgeometry列もあります。 しかし、主に空間データにPostGISを使用していますが、通常のPostgreSQLデータベースのすべての機能をまだ持っているので、そこに非空間データを格納することも可能で

それはデータベースです。 ITアーキテクチャでは、データベースは円柱として表されます。 それはあなたがあなたのデータを保存することができる場所です。

優れた無限のPostGISイントロは、空間データをデータベースに関連付ける三つのコア概念を紹介します。 これらを組み合わせることで、最適化された性能と分析のための柔軟な構造を提供します。

  1. ポイント、ライン、ポリゴンなどの空間データ型。 空間データのほとんどの作業に精通しています。
  2. 多次元空間インデックスは、空間操作の効率的な処理に使用されます。
  3. SQLで提起された空間関数は、空間

SQL、または”構造化クエリ言語”は、リレーショナルデータベースの質問をし、データを更新する手段です。 (あなたが質問をするために使用する)選択クエリは、一般的に次の形式のコマンドです

SELECT some_columns FROM some_data_source WHERE some_condition;

PostGIS特定の関数は、通常、St_Functionnameの形式です。

これらのコマンドは、データベースにログインした後、またはデータベースGUIツール(pgAdminやQGIS DB Managerなど)にコマンドラインで記述します。 だから、はい、SQLはあなたが本当に何かを書く必要があります。 右クリックは一般的に過小評価されているかもしれませんが、コードを書かない人にとっては、SQLは独自のコマンドと後でコードを書くための最初のス

PostGIS以外にも空間データベースがあります。 SQL Server Spatial、ESRI ArcSDE、Oracle Spatial、およびGeoMesaは、空間データを管理および分析するための他のいくつかのオプションです。 しかし、PostGISはより多くの機能と一般的に優れたパフォーマンスを持っていると言われています。 また、言及された他のもの(GeoMesaを除く)はオープンソースではありません。

あなたはこれに慣れていない場合は、今、あなたは混乱するかもしれません: だから、それはデータを格納する場所であり、コマンドラインに奇妙なものを書くことによって複雑な方法で情報を取得する必要がありますか? それを待ってください。 あなたが本当にそれにコミットした場合、PostGISがあなたに提供できるいくつかの本当の利点もあります。

Twitterからブログ投稿のアイデアをいくつか聞いて、良いフィードバックをたくさん得ました。 そこから私はこれを2つの部分に分割するという考えを得ました。 最初の部分では、私はPostGISがあなたの毎日の仕事にもたらすことができる利点に見ていきます。 第2部では、spatial SQLに焦点を当てます。

PostGISは新しい働き方を採用することを可能にすることができます。 この新しい方法は、より簡単に再現することができ、バージョン管理の使用をより簡単に開始することができ、マルチユーザーワークフローを有効にするこ

ファイルの読み書きには特別なソフトウェアが必要なことがよくあります。 SQLは、ランダムデータアクセスと分析の抽象化です。 その抽象化がなければ、操作を行うために特定のソフトウェアが必要か、すべてのアクセスコードと分析コードを自分で記述する必要があります。

ランダムなパラメータを持ついくつかのランダムなツールでファイルのランダムな操作を行うのではなく、SQLで分析を行うと、結果をより簡単に共有 現在、シェープファイルにいくつかの空間結合とクリップ操作を行って、想定されているようにする”マスターシェープファイル”があるかもしれません。 それが消えたら?

Johnnieは、誤ってすべてのデータを削除した方法についてTwitterに良い例を書いたが、GITに保存したSQLスクリプトで最小限の労力でそれらを再現できた。

ソフトウェア開発に携わっている人は、おそらく(またはうまくいけば)バージョン管理に精通しています。 私はこのブログ記事でそれにもっと深く入るつもりはありませんが、GITのようなバージョン管理システムにSQLスクリプトを置くことができます(そし あなたの本棚に保管し、常においしいデータ分析のための最高のレシピを見つけるために常に更新する料理の本と考えてください。 あなたの家が燃え尽きた場合、あなたは再びAmazonからこの正確な料理の本の新しいコピーを購入することができます。

データベースは、空間データをより良い順序で維持するのにも役立ちます。 私たちの誰も本当に完璧ではなく、おそらくあなたはまだtemp_1、final_finalのようなテーブルを作成しますが、データベースはファイルだけよりもデータ構造を標準化

そして、それらの大きなデータセットはどうですか? 空間データベースでは、大規模なデータセットでの作業が可能になります。 簡単なだけでなく、データベースなしで大規模なデータセットで作業することはほとんど不可能な場合もあります。 2gb csvファイルを開こうとしたことがありますか? または、800mb GeoJSONのジオプロセシングを実行しようとしましたか? シェープファイルにはサイズ制限があることを知っていましたか? もちろん、Geopackageやその他のファイル形式を使用してこれらの問題のいくつかに取り組むことができますが、一般的にPostGISは大きな(地理空間)データを処理す

22 QgisでPostGISからレンダリングされた船のGPS位置の百万ポイント。 船が川に移動している場所と、彼らが外海にいる場所を見ることができますか?

データベースの非常に良い機能の1つは、通常は手動で行うプロセスをより簡単に自動化できることです。 たとえば、PostgreSQL NOTIFY機能を使用すると、QGISマップを自動的に更新できます。 また、作業を自動化するためにETLツール(FMEなど)を使用している場合は、PostGISテーブルとの読み書きはファイルよりもはるかに簡単です。

あなたは私のようではない場合(私は現在、自分自身で、楽しみのためにこのようなものを行います)、あなたはチームと呼ばれるものを持っているかもしれ また、同僚として知られています。 彼らはあなたと同じデータにアクセスする必要があるかもしれません。 ワークフローでデータベースを使用すると、共有ドライブ上にファイルを持つだけでなく、別のレベルで完全に並列作業が可能になります。

これの主な理由の1つは、同時ユーザーが破損を引き起こす可能性があることです。 同じファイルへの複数の書き込みでデータが破損しないように余分なコードを記述することは可能ですが、問題を解決し、関連するパフォーマンスの問題

もちろん、新しいワークフローを採用するには長所と短所の両方があります。 ファイルを整理しておくのと同じように、一日の終わりには、データベースを維持することも多くの作業になる可能性があります。 たとえば、PostGISを新しいバージョンに更新することは、Twitterで指摘されているように、本当の苦痛になる可能性があります。 大きな力で大きな責任が来ます。

しかし、その力の部分についてもっと話しましょう。パート2:spatial SQLの魔法の世界

Spatial SQLは、(賢明に使用すると)処理を本当に高速化できます。 以下は、シェープファイルとQGIS処理で同じプロセスを実行し、次にSt_Generatepointsを使用してPostGISで同じプロセスを実行することの比較です。

データベース関連のブログ記事は、常に処理時間を比較するbarchartを持っている必要があります。 PostGIS=非常に高速です。 バーチャートは嘘をつかない。この比較のために、私はフィンランドの郵便番号データと各郵便番号地域の人口を持っていました。 私はこれをシェープファイルと私のローカルデータベースのテーブルの両方として持っていました。 母集団を表すために、各多角形の中にランダムな点を作成しました。 ShapefileにQGIS処理(ベクトル処理からpolygon内のランダムポイント)を使用しましたが、PostGISではSQLは本当にこれと同じくらい簡単でした:

SELECT ST_GeneratePoints(geom, he_vakiy) from paavo.paavo

以前のグラフからわかるように、Qgisとシェープファイルと比較して、同じ分析を行うのにPostGISの時間は10%未満でした。 あなたがGISアナリストであり、毎日このようなプロセスを行う場合、それはあなたに一年でかなりの時間を節約することができます。

高速な処理に加えて、PostGISが提供している空間関数の広大な選択を楽しむことができます。 どの関数があなたにとって最も有用であるかは、ユースケースに完全に依存します。 ボロノイ分析とより伝統的なGIS分析(バッファ、オーバーレイ、交差、クリップなど)に加えて、.)より高度なことを行うことができます:

  • ルーティング。 PgRoutingと道路データを使用すると、最適なルートを見つけて、異なるネットワーク分析を行うことができます。
  • Polygon skeletonization。 この関数を使用すると、ポリゴンの内側軸をその場で構築できます。
  • ジオメトリサブディビジョン。
  • クラスタリング。 データからクラスターとパターンを検索します。 AIの誇大宣伝がピークになると、k-meansは以前よりもさらに興味深いかもしれません…

ポリゴンのスケルトン化のようなものは何のために必要ですか? ほとんどの人にとっては有効な質問かもしれませんが、空間分析が必要なときには、誰かがあなたのためにハードワーク(=数学)を行ったことを非常に喜 さまざまな空間関数を組み合わせて、Postgresの組み込み関数を使用すると、データベースで高度な空間分析を行うことができます。

データベース内のSQLの一行で表現可能な複雑で興味深い質問(空間結合、集計など)は、多くの計算能力を必要とし、それはPostGISがあなたに提供するものです。 独自のコードで同じ質問に答えるには、ファイルに対してプログラミングするときに何百行もの特殊なコードが必要になる場合があります。

PostGIS for dataviz

私がポートフォリオに持っている視覚化の多くでは、PostGISは視覚化プロセスにおいて何らかの役割を果たしてきました。 私のワークフローでは、ほとんどの場合、データを前処理してから、QGISで実際の視覚化を行います。

これらのプロセスの1つの例を見てみましょう。

ボロノイ線を列車。 奇妙なことに満足しています。

上記の列車とヴォロノワについてのアニメーションは、PostGISの力の遊び心のある例を与えます。 私は私のローカルデータベースに数百万の列車のGPSポイントを持っていたし、私はすでにちょうど移動するポイントでアニメーシ しかし、私はVoronoi線を持つアニメーションがどのように見えるかをテストしたかった。

まず、列車ごとに複数のGPSポイントがあるので、列車ごとに1分ごとに1つの代表ポイントを持つようにグループ化したかったのです。 私は最初に結果のポイントのために手動でテーブルを作成しました。 私は次のクエリを書いた

INSERT INTO trains.voronoipoints 
SELECT '2018–01–15 09:00:00' AS t,
geom
FROM (SELECT St_centroid(St_collect(geom)) AS geom,
trainno
FROM (SELECT geom,
trainno
FROM trains.week
WHERE time > '2018–01–15 09:00:00'
AND time < '2018–01–15 09:01:00') AS a
GROUP BY trainno) AS b

クエリを断片的にブレーキダウンすると、パズルの次の部分を見ることができます:

  • SQLクエリの通常の要素のいくつかを見ることができます(INSERT INTO、SELECT、AS、FROM、WHERE、AND、GROUP BY)
  • geom、trainno、およびtimeは、trains
  • というスキーマのweekテーブルの列名ですサブクエリaは、要求された時間枠内で追跡されたすべてのGPSポイントを返します。
  • 一分以内に追跡されたすべてのGPSポイントを選択するため、列車ごとにいくつかのポイントを得ることがあります。 私はヴォロノイラインがより賢明に見えるように、一つだけを望んでいました。 そのため、St_Collectを使用してポイントをグループ化し、それらからマルチポイントジオメトリを作成します。 St_centroidは、多点ジオメトリを重心(サブクエリb)に位置する単一のポイントに置き換え、データは列車番号によってグループ化されます。

同じことを複数回行うために、開始時刻と終了時刻をパラメータとして数百回同じクエリをループする単純なPythonスクリプトがありました。 1分ごとに1つの代表点を正常に見つけた後、次のコマンドを実行しました(11.5秒で):次に、結果をQGISに追加し、Time Managerで視覚化しました。 これは結果を達成するための少しハックな方法かもしれませんし、経験豊富なSQLユーザーは単一のSQLコマンドで完全にそれをやったかもしれませんが、私はまだ結果にかなり満足しています。 それは無意味かもしれませんが。

最終的には非常に単純ですが、結果はより高いレベルの数学のように見えます(そしてそれは!)、すべてのハードワークはPostGISによって行われているように。 また、列車ごとに1点のみのボロノイ分析を行うことができたため、処理時間は数十万点で数秒しかかかりませんでした。

多くの場合、クエリの処理時間はデータ量が増加するにつれて指数関数的に増加します。 これがあなたのクエリで賢くなければならない理由です。

こんにちは。 私はSQLミームを作りました!

経験則として、クエリがフェッチするデータが多く、データベースが行う操作(順序付け、グループ化など)が多いほど、速度が遅くなり、効率が低下します。 効率的なSQLクエリは、実際に必要な行と列のみをフェッチします。 SQLは論理的なパズルのように機能し、何を達成したいのかを徹底的に考える必要があります。

また、クエリのパフォーマンスを微調整することは滑りやすい斜面であり、無限の最適化の世界で迷子になる可能性があることに注意する必要があ “最適なクエリ”と最適なクエリのバランスを見つけることは本当に重要です。 あなたは百万人のユーザーのためのアプリケーションを構築していない場合は特に、ここまたはそこに数ミリ秒は、おそらくあなたのボートを揺

私は、Sqlを学ぶことは、JavaScript、Python、またはRを学ぶよりも、平均的なGISユーザーにとってさらに有益であると言っています。SQL構文は何年にもわたってわずかな変更私は、SQLの学習曲線が基本を行うのにはそれほど急ではないことを発見しましたが、それが空間分析にもたらす利点を実際に見るのに時間がかかる しかし、私は忍耐強く、より複雑な分析を試み、より高速な処理を目指すことをお勧めします。 最終的には違いが表示されます。

まず、SQLの基礎を学ぶときは、列の選択、結果セットの並べ替え、行のフィルタリングなどの基本的なデータ選択技術を使用して、単一のテーブルからデータ 次に、複数のテーブルの結合、セット操作の使用、サブクエリの作成などの高度なクエリについて学習します。 最後に、新しいテーブルの作成や既存のテーブルの構造の変更など、データベーステーブルの管理方法を学習します。

しかし、あなたを助けるためのツールもあります!

QGISにはDB Managerと呼ばれる優れたツールがあります。 それはあなたのデータベースのための同様のGUIを提供しますが、はるかに圧縮された方法で、そしてQGISの中で。 テーブルの変更と追加、インデックスの追加、および右クリック可能な方法で多くの基本的な操作を行うことができます。

QGIS DBマネージャーからのスクリーンショット。

また、PostgreSQLのための最も人気のある管理および開発プラットフォームであるpgAdminをチェックする必要があります。 PostGISにデータを取得するには複数の方法があります(例:ogr2ogr、shp2pgsql)。 一般的に、私はデータを扱うさまざまなツールや方法を試してみることをお勧めします。

私はPythonとPostGISを組み合わせることでいくつかの小さな実験を行ってきました。 Python(またはR)とPostGISを一緒に扱うことで、データ処理と自動化を実際に次のレベルに引き上げることができます。 Pythonの基本的なスクリプト機能を組み合わせ、psycopg2を使用してPostGISに接続するだけで始めるのに適した方法です。

あなたはPostGISを使い始めたいと感じていますか?

  1. インストーラをダウンロードして、ローカルマシンにPostGISをインストールするだけです。 チュートリアルの指示に従ってください。
  2. そこにいくつかのデータをロードします。 Qgis DB Managerまたはchechを使用して単一のシェープファイルから始めます。
  3. SQLで遊んでみましょう。 基本(データの選択、フィルタリング、変更)から始めると、ワークフローにどのような利点がもたらされるかが徐々にわかります。

結論

あなたの働き方が現在非効率的であれば、ツールを変更するだけで結果が良くなり、プロセスが苦痛になることはありません。 データ管理の考え方を変える必要があります。 データベースを非効率的に使用するには、さまざまな方法があります。 私を信じて、私はそれらを見て、いくつか試してみました。

また、変化のためだけに物事を変えることは意味がありません。 あなたの毎日の仕事が時々地図上にいくつかの点をプロットしているだけであれば、将来的にもシェープファイルとcsvファイルでそれを非常に行うこ そうすればより効率的かもしれません。

しかし。

あなたはいくつかの深刻な空間分析を行うには、あなたのプロセスを自動化したり、任意の方法で次のレベルにspatalデータを扱うあなたの方法を移 SQLを学ぶことも楽しいことができます。 マジで

最後ですが、間違いなく重要ではありません。 Tomが指摘したように:PostGISを使用するとgeohipster credが得られます!

私は開始点と終了点を持つNew York bikeshareデータを持っていました。 GraphHopperを使用して、起点と目的地の間の最適なルートを計算し、結果として得られる何千ものgpxファイルをOgr2ogrを使用してPostGISにロードしました。 PostGISでは、ポイントから線を作成し、QGISでデータを視覚化しました。

私が簡単に言及したことの一つは、PostGISがオープンソースで自由に利用できるということでした。 これは、(私のような)小規模または無予算で働く人々が参入の障壁を持っていないことを意味します。 商業空間データベースは非常に高価になる可能性があります。 大きな感謝は、プロジェクトに取り組んでアクティブな開発者のすべてに行きます!

私についてのより多くの情報のための私のウェブサイトを点検するか、または私にTwitterのコメントを投げなさい。

もっと知りたいですか? このブログ記事のソースとさらにPostGISは

RTFDを読んでいます。 PostGISのドキュメントは本当に良いです。

PostGISの第一人者ポール*ラムジーは、PostGISへの導入に無限から彼のサイト

偉大な材料上のビューの異なる観点からトピックに関するいくつかのプレゼンテーシ

Anita GraserはPostGISでの移動データの処理に関する素晴らしい一連のブログ記事を書いています。

Regina ObeのPostGISの本をチェックしてください

私が最初にPostGISをローカルにインストールしたときにこのBoston GISチュートリアルを使用しました

datavizをやっている人々のための余分な:PostGIS

の3Dポイントとして色を保存することについての興味深い実験

コメントを残す

メールアドレスが公開されることはありません。