我花了太多时间摆弄配置和服务,只是为了在 AWS 中启动一个计算实例。有时,我只是需要一个可用于生产的环境来测试应用程序和想法。使用 Heroku,我只需在 CLI 中输入几个简单的命令即可获得它。
最近,我了解到 Heroku 还支持 PostGIS 。我个人以前从未使用过 PostGIS。我知道该产品有几种专有竞争对手,所以我认为这是尝试开源选项的好时机。
在本文中,我将向您展示如何在 Heroku 上运行支持 PostGIS 的 Postgres 实例。然后,我将在数据库上运行一些示例查询,让您了解它的工作原理。最好的部分是什么?您可以跟着我们一起探索!
即使您已经使用过 Postgres 一段时间,您可能也不熟悉 PostGIS。GIS 代表地理信息系统。该领域有许多解决方案。但 PostGIS 的优点在于它基于广受欢迎的 PostgreSQL 数据库。除了您期望 Postgres 具有的所有性能之外,我们还获得了一个用于存储地理空间数据的全功能工具。
PostGIS 不仅为此类数据提供了良好的存储解决方案,而且可以与多种可使用此类数据的应用程序(如 ArcGIS 和 Tableau)无缝集成。
TL; DR — 如果您需要处理、存储或查询位置数据,PostGIS 是一个很好的选择。幸运的是,这就像向 Heroku 应用程序添加插件一样简单,可以启动并运行新的 Postgres 实例。所以,我们现在就开始吧。
首先,您需要一个任意大小的应用程序。然后,将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 。
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
可用。
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
扩展。
就是这样!几个简单的命令还不错。我们有了数据库和数据。
如果您已经知道如何在本地机器上设置 Postgres,您可能会想知道为什么我选择了 Heroku。对我来说,最大的原因是简单。除了为计划进行的分析选择足够大的 Heroku Postgres 计划并安装 PostGIS 扩展之外,我不需要做任何其他事情就可以启动和运行。
此外,我所做的任何分析都很容易协作。我可以授予其他人作为协作者访问我的数据库的权限,也可以在数据库之上快速构建应用程序并通过普通的 Web 界面(而不是 Postgres 客户端)共享访问权限。
最后,当我完成一个项目并且不再需要它时,我只需删除 Heroku 上的应用程序,它就全部消失了。我不用担心电脑上的数据文件。本地不需要安装额外的软件。我可以快速体验新技术,然后在完成后继续前进。
现在,让我们看看 PostGIS 是如何工作的。
首先要记住的是,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 应用程序了吗?今天就是这一天!