paint-brush
場所、場所、場所!PostGIS と Heroku Postgres@josephcaudle
681 測定値
681 測定値

場所、場所、場所!PostGIS と Heroku Postgres

Joseph Caudle9m2024/04/16
Read on Terminal Reader

長すぎる; 読むには

最近、Heroku には PostGIS のサポートも含まれていることを知りました。私はこれまで PostGIS を使ったことはありませんでした。この製品には独自の競合製品がいくつかあることは知っているので、オープンソース オプションを試してみるには絶好の機会だと思いました。
featured image - 場所、場所、場所!PostGIS と Heroku Postgres
Joseph Caudle HackerNoon profile picture

地理空間データクエリをサポートするために Postgres を拡張する

AWS でコンピューティング インスタンスを起動するためだけに、構成やサービスをいじくり回して多くの時間を無駄にしてきました。アプリケーションやアイデアをテストするために、本番環境に対応した環境が必要なこともあります。Heroku を使用すると、CLI でいくつかの簡単なコマンドを実行するだけでそれが実現できます。


最近、Heroku にはPostGIS のサポートも含まれていることを知りました。私はこれまで PostGIS を使ったことはありませんでした。この製品には独自の競合製品がいくつかあることは知っているので、オープンソースのオプションを試してみるには絶好の機会だと思いました。


この記事では、PostGIS 対応の Postgres インスタンスを Heroku で実行する方法を説明します。次に、データベースでサンプル クエリをいくつか実行して、その仕組みを理解していただきます。そして、一番のメリットは、私たちが進める手順に沿って、ご自身で探索していただけることです。

PostGIS とは何ですか?

Postgres をしばらく使用していたとしても、PostGIS についてはよく知らないかもしれません。GIS は、 地理情報システムの略です。この分野には多くのソリューションがあります。しかし、PostGIS が優れているのは、広く愛されている PostgreSQL データベースをベースとしていることです。Postgres に期待されるすべてのパフォーマンスに加えて、地理空間データを保存するためのフル機能のツールが得られます。


PostGIS は、このタイプのデータに適したストレージ ソリューションを提供するだけでなく、このデータを使用できる複数のアプリケーション (ArcGIS や Tableau など) とシームレスに統合できます。


TL; DR—位置データを処理、保存、またはクエリする必要がある場合、PostGIS はそれを実行するのに最適なオプションです。幸いなことに、Heroku アプリにアドオンを追加するだけで、新しい Postgres インスタンスを起動して実行できます。では、今すぐ実行してみましょう。

PostGIS はどのように使用できますか?

開始するには、任意のサイズのアプリが必要です。次に、アプリにHeroku Postgresのインスタンスを追加します。

Herokuアプリを作成する

デモでは、空のアプリを作成します。

Heroku Postgresアドオンを添付する

アプリが作成されたら、Heroku Postgres アドオンを作成できます。サンプル データ セットはMini プランインスタンスには大きすぎるため、代わりに Basic プランを使用する必要があります。これは、コマンド ラインから実行できます。

 $ heroku login $ heroku addons:create heroku-postgresql:basic -a postgis-demo Creating heroku-postgresql:basic on ⬢ postgis-demo... ~$0.013/hour (max $9/month) Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pg:copy Created postgresql-fitted-78461 as DATABASE_URL

Postgres データベースを作成したら、PostGIS を設定するにはあといくつかの手順を実行するだけです。

PostGIS拡張機能を作成する

Heroku Postgres にはインストールできる拡張機能が多数あります。それらを一覧表示するには、インスタンスに次のように要求します。

 $ heroku pg:psql -a postgis-demo --> Connecting to postgresql-fitted-78461 … postgis-demo::DATABASE=> \x on; Expanded display is on. postgis-demo::DATABASE=> show extwlist.extensions; … address_standardizer,address_standardizer_data_us,amcheck,autoinc,bloom,btree_gin,btree_gist,citext,cube,dict_int,earthdistance,fuzzystrmatch,hstore,insert_username,intarray,isn,lo,ltree,moddatetime,pg_partman,pg_stat_statements,pg_trgm,pgcrypto,pgrowlocks,postgis,postgis_raster,postgis_topology,refint,seg,sslinfo,tablefunc,tcn,tsm_system_rows,tsm_system_time,unaccent,uuid-ossp


利用可能な拡張機能のリストにpostgis表示されます。そこから拡張機能を作成できます。

 postgis-demo::DATABASE=> CREATE EXTENSION postgis; CREATE EXTENSION


拡張機能がインストールされていることを確認して、バージョンを確認できます。

 postgis-demo::DATABASE=> SELECT postgis_version(); -[ RECORD 1 ]---+-------------------------------------- postgis_version | 3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1


よし!PostGIS 3.4 が稼働しているようです。

初期データセットをロード

PostGIS 拡張機能を有効にしたので、データセットをロードして試してみる必要があります。私は、PostGIS 入門書で提供されているデータセットを使用しています。ダウンロードしたデータ バンドルは、21.5 MB の zip ファイルです。抽出したアーカイブのdataサブフォルダーには、 nyc_data.backupという 9.5 MB のファイルがあります。


これは、ニューヨーク市の 2000 年の国勢調査のすべての国勢調査データと、市内のすべての道路、地区、地下鉄駅を含むファイルです。


heroku pg:backups:restoreコマンド使用して、データのバックアップを Heroku Postgres インスタンスに直接復元できます。これは非常に便利です。ただし、次の注意事項に留意してください。


  • 復元できるバックアップ ファイルは、ローカル マシンからアップロードできません。オンラインで利用できる必要があります。幸い、 nyc_data.backupを利用できるGitHub リポジトリを見つけました。


  • データベースの復元を実行するには、まず、 postgis拡張機能のインストールを含め、Heroku Postgres インスタンスを完全にリセットします。したがって、上記では拡張機能を手動でインストールする方法を示しましたが、データベースを復元するときに、データをロードする前に拡張機能を事前にインストールするためのフラグを追加する必要があります。


データベースのバックアップを復元するために使用するコマンドは次のとおりです。

 $ heroku pg:backups:restore \ https://github.com/Giorgi/PostgresSamples/raw/main/nyc_data.backup \ -e postgis \ -a postgis-demo

バックアップ ファイルは、公開されている URL を通じて指定されます。PostGIS チュートリアルからデータセットをいつでもダウンロードし、 nyc_data.backupファイルを抽出して、自分で選択した場所にオンラインで投稿することができます。


-e postgisフラグは、バックアップのスキーマとデータをロードする前にpostgis拡張機能をインストールすることを指定します。


これで完了です。いくつかの簡単なコマンドとしては悪くないですね。データベースとデータができました。

なぜ Heroku なのか?

ローカル マシンに Postgres を設定する方法をすでに知っている場合は、なぜ Heroku を選んだのか不思議に思うかもしれません。私にとって、最大の理由はシンプルさです。計画している分析に十分な大きさの Heroku Postgres プランを選択し、PostGIS 拡張機能をインストールする以外に、起動して実行するために必要なことは何もありません。


また、私が行う分析での共同作業も簡単です。他の人に共同作業者としてデータベースへのアクセスを許可したり、データベース上にアプリケーションをすばやく構築して、Postgres クライアントではなく通常の Web インターフェイスを通じてアクセスを共有したりできます。


最後に、プロジェクトの作業が終了し、不要になった場合は、Heroku 上のアプリを削除するだけで、すべてが消えます。コンピューター上のデータ ファイルを心配する必要はありません。ローカルに追加のソフトウェアをインストールする必要はありません。新しいテクノロジーを短時間試して、作業が終わったら次の作業に移ることができます。

PostGIS の操作

それでは、PostGIS がどのように機能するかを見てみましょう。

Postgresと同じように作業する

まず覚えておいていただきたいのは、PostGIS は Postgres 内の拡張機能であるということです。つまり、標準的な Postgres クエリも実行できるということです。


ニューヨークで B で始まる通りがいくつあるか知りたいとします。簡単な SQL クエリで次の結果が得られます。

 postgis-demo::DATABASE=> SELECT count(*) postgis-demo::DATABASE-> FROM nyc_streets postgis-demo::DATABASE-> WHERE name LIKE 'B%'; count 1282 (1 row)


各行政区内の地区の数はどうでしょうか? これも簡単な SQL クエリです:

 postgis-demo::DATABASE=> SELECT boroname, count(*) postgis-demo::DATABASE-> FROM nyc_neighborhoods postgis-demo::DATABASE-> GROUP BY boroname; boroname | count ---------------+------- Queens | 30 Brooklyn | 23 Staten Island | 24 The Bronx | 24 Manhattan | 28 (5 rows)

これまでは、標準的な PostgreSQL について説明してきました。次に、PostGIS 機能の使い方を見てみましょう。

地理空間ジオメトリの操作例

私たちのデータセットにはニューヨークのすべての道路が含まれているため、次のクエリを使用して、市内に何キロメートルの道路があるかを尋ねることができます。

 postgis-demo::DATABASE=> SELECT Sum(ST_Length(geom)) / 1000 as street_length FROM nyc_streets; street_length -------------------- 10418.904717199996 (1 row)


マンハッタン全体の面積などの面積を計算することもできます。

 postgis-demo::DATABASE=> SELECT Sum(ST_Area(geom)) / 4047 as acreage FROM nyc_neighborhoods WHERE boroname = 'Manhattan'; acreage ------------------- 13965.32012239119 (1 row)

これらの計算は、この種の集計データに関連する列からではなく、地理空間データから行われることに注意してください。それだけでなく、これらのクエリは非常に高速に実行されます。


最後に、私が本当に驚いたクエリは、空間結合の使用です。標準的なデータベース結合と同様に、空間結合は複数のテーブルを結合できますが、空間関係に基づきます。たとえば、空間データを使用して、特定の地下鉄駅がどの地区にあるかを照会できます。これを行うには、PostGIS のST_Containsを使用して、地区のジオメトリに地下鉄駅のジオメトリが完全に含まれていないかどうかを判断できます。


地下鉄の名前 ( nyc_subway_stations内) に基づいて、 ST_Containsが true である近隣地域 ( nyc_neighborhoods内) をクエリします。クエリは次のようになります。

 postgis-demo::DATABASE=> SELECT subways.name AS subway_name, neighborhoods.name AS neighborhood_name, neighborhoods.boroname AS borough FROM nyc_neighborhoods AS neighborhoods JOIN nyc_subway_stations AS subways ON ST_Contains(neighborhoods.geom, subways.geom) WHERE subways.name = 'Broad St'; subway_name | neighborhood_name | borough -------------+--------------------+----------- Broad St | Financial District | Manhattan (1 row)

PostGIS は、ジオメトリを使用してさらに高度な位置クエリ機能を提供しますが、それはここでの簡単なデモの範囲外です。

結論

これまで PostGIS を使ったことがなかったので、その機能には本当に感心しました。公式のPostGIS 入門書をまだ半分ほどしか読んでいないので、このデータベースでできることはまだまだたくさんあります。それだけでなく、Heroku でサポートされている任意の数の言語を使用して、PostGIS 上にアプリケーションを構築および展開できます。


特に、PostGIS 上に Rails アプリを構築するユースケースを見つけたいと考えています。開始方法に関するドキュメントはすでにいくつか見つけました。


しかし、今のところこのインスタンスはもう必要ないので、クリーンアップしてアプリを削除します。CLI から、次の操作を行う必要があります。

 $ heroku apps:destroy postgis-demo ▸ WARNING: This will delete ⬢ postgis-demo including all add-ons. ▸ To proceed, type postgis-demo or re-run this command with --confirm postgis-demo > postgis-demo Destroying ⬢ postgis-demo (including all add-ons)... done

待って、それだけ? ええ、それだけです。 1 つのコマンドと確認ですべてが破壊され、もう心配する必要はありません。

 $ heroku apps You have no apps. $ heroku addons No add-ons.

私がアプリを削除した今、素晴らしいチャンスがあります。Heroku で入手したい最初の読者にはpostgis-demoユニークなアプリ名が提供されます。次の素晴らしい PostGIS アプリを構築する準備はできていますか? 今日がその日です!