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。我知道该产品有几种专有竞争对手,所以我认为这是尝试开源选项的好时机。


在本文中,我将向您展示如何在 Heroku 上运行支持 PostGIS 的 Postgres 实例。然后,我将在数据库上运行一些示例查询,让您了解它的工作原理。最好的部分是什么?您可以跟着我们一起探索!

什么是 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实例。这非常方便。但是,请记住以下注意事项:


  • 无法从本地计算机上传可供恢复的备份文件。它必须在线可用。幸运的是,我找到了一个GitHub repo ,它使nyc_data.backup可用。


  • 执行数据库恢复首先要完全重置 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 扩展之外,我不需要做任何其他事情就可以启动和运行。


此外,我所做的任何分析都很容易协作。我可以授予其他人作为协作者访问我的数据库的权限,也可以在数据库之上快速构建应用程序并通过普通的 Web 界面(而不是 Postgres 客户端)共享访问权限。


最后,当我完成一个项目并且不再需要它时,我只需删除 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为真的街区(在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

等等,就这些?是的,就这些。只要一个命令和确认,一切都会被拆除,我不再需要担心。

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

现在我已经删除了我的应用程序,您有一个绝佳的机会:独特的应用程序名称postgis-demo可供想要在 Heroku 上获取它的第一位读者使用!您准备好构建下一个出色的 PostGIS 应用程序了吗?今天就是这一天!