地理空間データクエリをサポートするために 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 アドオンを作成できます。サンプル データ セットは インスタンスには大きすぎるため、代わりに Basic プランを使用する必要があります。これは、コマンド ラインから実行できます。 Mini プラン $ 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 拡張機能を有効にしたので、データセットをロードして試してみる必要があります。私は 提供されているデータセットを使用しています。ダウンロードしたデータ バンドルは、21.5 MB の zip ファイルです。抽出したアーカイブの サブフォルダーには、 という 9.5 MB のファイルがあります。 、PostGIS 入門書で data nyc_data.backup これは、ニューヨーク市の 2000 年の国勢調査のすべての国勢調査データと、市内のすべての道路、地区、地下鉄駅を含むファイルです。 使用して、データのバックアップを Heroku Postgres インスタンスに直接復元できます。これは非常に便利です。ただし、次の注意事項に留意してください。 heroku pg:backups:restore コマンド を 復元できるバックアップ ファイルは、ローカル マシンからアップロードできません。オンラインで利用できる必要があります。幸い、 を利用できる を見つけました。 nyc_data.backup GitHub リポジトリ データベースの復元を実行するには、まず、 拡張機能のインストールを含め、Heroku Postgres インスタンスを完全にリセットします。したがって、上記では拡張機能を手動でインストールする方法を示しましたが、データベースを復元するときに、データをロードする前に拡張機能を事前にインストールするためのフラグを追加する必要があります。 postgis データベースのバックアップを復元するために使用するコマンドは次のとおりです。 $ 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 地下鉄の名前 ( 内) に基づいて、 が true である近隣地域 ( 内) をクエリします。クエリは次のようになります。 nyc_subway_stations ST_Contains 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 を使ったことがなかったので、その機能には本当に感心しました。公式の まだ半分ほどしか読んでいないので、このデータベースでできることはまだまだたくさんあります。それだけでなく、Heroku で を使用して、PostGIS 上にアプリケーションを構築および展開できます。 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 アプリを構築する準備はできていますか? 今日がその日です! postgis-demo