一种将完整的澳大利亚地理编码国家地址文件 (GNAF) 和澳大利亚行政边界加载到 Postgres 中的快速方法,经过简化,可用作地理编码、分析、可视化和聚合的参考数据。
查看这些介绍幻灯片 (PDF) 以及 data.gov.au 页面。
运行 load-gnaf Python 脚本并一步构建数据库
从 Docker Hub 拉取数据库并在容器中运行
下载 GNAF 和/或 Admin Bdys Postgres 转储文件并将其恢复到 Postgres 14+ 数据库中
在 S3 中使用或下载 Geoparquet 和 Parquet 文件以用于您的数据和分析工作流程;在 AWS 或您自己的平台中。
在配置为利用可用 RAM 的 Postgres 服务器上运行 Python 脚本需要 30-120 分钟。
您可以处理 GDA94 或 GDA2020 版本的数据 - 只需确保为 GNAF 和管理边界下载相同的版本即可。如果您不知道 GDA94 或 GDA2020 是什么,请下载 GDA94 版本(仅供参考 - 它们是不同的坐标系)
为了获得良好的加载时间,您需要配置 Postgres 服务器以提高性能。这里有一个很好的指南,指出它已经有几年了,如果你有 RAM,一些内存参数可以增强。
Postgres 14.x 及更高版本和 PostGIS 3.2+
将 Postgres bin 目录添加到系统 PATH
Python 3.6+ 与 Psycopg 3.x
从 data.gov.au 下载 Geoscape GNAF(GDA94 或 GDA2020)
从 data.gov.au 下载 Geoscape 行政边界(下载 ESRI Shapefile(GDA94 或 GDA2020)版本)
将 GNAF 解压缩到 Postgres 服务器上的目录
将 Admin Bdys 解压到本地目录
更改这些目录的安全性以授予 Postgres 读取权限
创建目标数据库(如果需要)
通过运行以下 SQL 将 PostGIS 添加到数据库(如果需要): CREATE EXTENSION postgis
通过使用-h
参数运行 load-gnaf.py 检查可用和必需的参数(请参阅下面的命令行示例)
运行脚本,30-120 分钟后返回并享受吧!
gnaf-loader 的行为可以通过为脚本指定各种命令行选项来控制。支持的参数有:
--gnaf-tables-path
指定提取的 GNAF PSV 文件的路径。该目录必须可由 Postgres 服务器访问,并且服务器到该目录的相应本地路径可能需要通过local-server-dir
参数设置
--local-server-dir
指定gnaf-tables-path
对应的 Postgres 服务器上的本地路径。如果服务器在本地运行,则可以省略此参数。
--admin-bdys-path
指定提取的 Shapefile 管理边界文件的路径。与gnaf-tables-path
不同,远程 Postgres 服务器不一定可以访问此路径。
--pghost
Postgres 服务器的主机名。如果设置,则默认为PGHOST
环境变量,否则默认为localhost
。
--pgport
Postgres 服务器的端口号。如果设置,则默认为PGPORT
环境变量,否则为5432
。
--pgdb
Postgres 服务器的数据库名称。如果设置,则默认为PGDATABASE
环境变量,否则为geoscape
。
--pguser
访问 Postgres 服务器的用户名。如果设置,则默认为PGUSER
环境变量,否则为postgres
。
--pgpassword
用于访问 Postgres 服务器的密码。如果设置,则默认为PGPASSWORD
环境变量,否则默认password
。
--srid
设置输入数据的坐标系。有效值为4283
(默认值:GDA94 纬度/经度)和7844
(GDA2020 纬度/经度)。
--geoscape-version
Geoscape 版本号,格式为 YYYYMM。默认为当前年份和最后发布月份。例如202408
。
--previous-geoscape-version
以前的 Geoscape 发行版本号为 YYYYMM;用于 QA 比较。例如202405
。
--raw-gnaf-schema
用于存储原始 GNAF 表的模式名称。默认为raw_gnaf_<geoscape_version>
。
--raw-admin-schema
用于存储原始管理边界表的模式名称。默认为raw_admin_bdys_<geoscape_version>
。
--gnaf-schema
用于存储最终 GNAF 表的目标模式名称。默认为gnaf_<geoscape_version>
。
--admin-schema
用于存储最终管理边界表的目标模式名称。默认为admin_bdys_<geoscape_version>
。
--previous-gnaf-schema
包含先前版本的 GNAF 表的架构。默认为gnaf_<previous_geoscape_version>
。
--previous-admin-schema
包含先前版本的管理边界表的架构。默认为admin_bdys_<previous_geoscape_version>
。
--states
以空格分隔要加载的状态列表,例如--states VIC TAS
。默认加载所有状态。
--prevacuum
强制在删除表后清理数据库。默认为关闭,指定此选项将减慢导入过程。
--raw-fk
为原始 GNAF 表创建主键和外键。默认为关闭,如果指定,将减慢导入过程。如果您打算将原始 GNAF 表用作临时导入步骤,请使用此选项。请注意,最终处理的表将始终具有适当的主键和外键集。
--raw-unlogged
创建未记录的原始 GNAF 表,从而加快导入速度。默认为关闭。仅当您不关心导入后的原始数据表时才指定此选项 - 如果服务器崩溃,它们将丢失!
--max-processes
指定用于数据加载的最大并行进程数。将其设置为 Postgres 服务器上的核心数减 2,但如果有 16 个以上核心,则限制为 12 - 超过 12 的好处很小。默认为 4。
--no-boundary-tag
不要使用一些用于创建聚合和分区统计图的关键管理边界 ID 来标记所有地址。
本地 Postgres 服务器: python load-gnaf.py --gnaf-tables-path="C:tempgeoscape_202408G-NAF" --admin-bdys-path="C:tempgeoscape_202408Administrative Boundaries"
将 GNAF 表加载到本地运行的 Postgres 服务器。 GNAF 存档已提取到文件夹C:tempgeoscape_202408G-NAF
,管理边界已提取到C:tempgeoscape_202408Administrative Boundaries
文件夹。
远程 Postgres 服务器: python load-gnaf.py --gnaf-tables-path="svrsharedgnaf" --local-server-dir="f:sharedgnaf" --admin-bdys-path="c:tempunzippedAdminBounds_ESRI"
加载已提取到共享文件夹svrsharedgnaf
GNAF 表。此共享文件夹对应于 Postgres 服务器上的本地f:sharedgnaf
文件夹。管理边界已提取到c:tempunzippedAdminBounds_ESRI
文件夹中。
仅加载选定的州: python load-gnaf.py --states VIC TAS NT ...
仅加载维多利亚州、塔斯马尼亚州和北领地的数据
您可以在没有 GNAF 的情况下加载管理边界。为此:注释掉 def main 中的步骤 1、3 和 4。
注意:由于分割墨尔本和修复地址上的非边界 locality_pids 所需的依赖关系,您无法在没有 Admin Bdys 的情况下加载 GNAF。
使用此过程中生成的数据时,您需要遵守 data.gov.au 页面上 GNAF 和 Admin Bdys 的归属要求,作为开放数据许可要求的一部分。
该脚本将在 GNAF 和 Admin Bdy 模式中使用 CASCADE 删除所有表,然后重新创建它们;这意味着如果您创建了任何观点,您将失去您的观点!如果您想保留现有数据 - 您需要更改脚本中的架构名称或使用不同的数据库
所有原始 GNAF 表都可以创建为 UNLOGGED 以加快数据加载速度。如果您的数据库损坏,这将使它们无法恢复。您可以再次运行这些脚本来重新创建它们。如果您认为这听起来不错 - 将 unlogged_tables 标志设置为 True 以获得稍快的加载速度
如果您有 PostGIS 2.2+,边界标记(默认情况下启用)将使该过程增加 15-60 分钟。如果您有 PostGIS 2.1 或更低版本 - 可能需要几个小时,因为边界表无法优化!
虽然您可以选择将数据加载到哪 4 个模式,但我并没有对每个排列进行 QA。如果您的 Postgres 经验有限,请坚持使用默认值
如果您不在 Postgres 服务器上运行 Python 脚本,则需要有权访问数据库服务器上 GNAF 文件的网络路径(以创建要处理的文件列表)。另一种方法是拥有原始文件的本地副本
“创建表”sql 脚本会将 PostGIS 扩展添加到公共模式中的数据库中,您不需要将其添加到数据库中
在删除现有 GNAF/Admin Bdy 表后,可以选择在开始时对数据库进行 VACUUM - 除了重复测试之外,这实际上并没有做任何事情。 (我懒得把它从代码中删除,因为这意味着对所有 SQL 文件重新编号,我现在想睡觉了)
GNAF 和管理边界已准备好在 Docker Hub 上的映像中的 Postgres 中使用。
在您的 docker 环境中使用docker pull minus34/gnafloader:latest
拉取映像
使用docker run --publish=5433:5432 minus34/gnafloader:latest
运行
通过端口5433
访问容器中的 Postgres。默认登录名是 - 用户: postgres
,密码: password
注意:压缩后的 Docker 镜像为 8Gb,未压缩为 25Gb
警告:默认的 postgres 超级用户密码不安全,应使用以下命令更改:
ALTER USER postgres PASSWORD '<something a lot more secure>'
下载 Postgres 转储文件并将其恢复到数据库中。
应该需要 15-60 分钟。
Postgres 14+ 与 PostGIS 3.0+
Postgres pg_restore 参数的知识
下载 GNAF 转储文件或 GNAF GDA2020 转储文件 (~2.0Gb)
下载 Admin Bdys 转储文件或 Admin Bdys GDA2020 转储文件 (~2.8Gb)
编辑supporting-files文件夹中的restore-gnaf-admin-bdys.bat或.sh脚本,获取转储文件名、数据库参数以及pg_restore的位置
运行脚本,15-60 分钟后返回并享受吧!
空间表的 Geoparquet 版本以及非空间表的 Parquet 版本位于公共 S3 存储桶中,可直接在应用程序或服务中使用。还可以使用 AWS CLI 下载它们。
几何图形具有 WGS84 纬度/经度坐标 (SRID/EPSG:4326)。使用 Apache Sedona 分析数据的示例查询,Apache Spark 的空间扩展位于spark
文件夹中。
文件位于: s3://minus34.com/opendata/geoscape-202408/geoparquet/
列出所有数据集: aws s3 ls s3://minus34.com/opendata/geoscape-202408/geoparquet/
复制所有数据集: aws s3 sync s3://minus34.com/opendata/geoscape-202408/geoparquet/ <my-local-folder>
使用 G-NAF 合并或开发 © Geoscape Australia 已根据开放地理编码国家地址文件 (G-NAF) 最终用户许可协议获得澳大利亚联邦许可。
使用行政边界合并或开发 © Geoscape Australia 经澳大利亚联邦根据 Creative Commons Attribution 4.0 International 许可证 (CC BY 4.0) 许可。
GNAF 和 Admin Bdys 已经过定制,消除了数据的一些已知的次要限制。最值得注意的是:
所有地址都链接到一个有边界的宪报地点。那些不在原始 GNAF 中的少量地址已将其 locality_pid 更改为宪报公布的等效地址
地点已添加地址和街道计数
郊区-地方 bdy 已被扁平化为一个连续的地方层 - 南澳大利亚州 删除了数百个地方,并在没有宪报公布的地方的地方添加了 ACT 地区
维多利亚州墨尔本地区已分为 Melbourne、3000 和 Melbourne 3004 地区(新地区 PID 为loc9901d119afda_1
和loc9901d119afda_2
)。分流发生在亚拉河(基于墨尔本地址中的邮政编码)
已使用地址表中的邮政编码创建邮政编码边界图层。虽然这与官方 Geoscape 邮政编码边界非常相似,但有数百个地址的邮政编码 bdy 是错误的。请勿将此数据视为权威数据