使用 Uber hndexes 和 PostgreSQL 进行栅格分析

嗨,在这篇博客中,我们将讨论如何使用 h3 索引轻松进行栅格分析。

客观的

为了学习,我们将计算出由 esri 土地覆盖确定的聚居区有多少建筑物。让我们针对矢量和栅格的国家级数据进行目标。

我们先找到数据

下载栅格数据

我已经从 esri land cover 下载了定居点区域。

https://livingatlas.arcgis.com/landcover/

让我们下载2023年,大小约362mb

使用 Uber hndexes 和 PostgreSQL 进行栅格分析

下载尼泊尔 osm 建筑

来源:http://download.geofabrik.de/asia/nepal.html

2882​​41523188

预处理数据

让我们在实际的 h3 单元计算之前对数据进行一些预处理
我们将在这一步中使用 gdal 命令行程序。在你的机器上安装 gdal

转换为云优化的 geotiff

如果您不知道 cog ,请在此处查看:https://www.cogeo.org/

检查gdal_translate是否可用

gdal_translate --version

它应该打印您正在使用的 gdal 版本

将光栅重新投影为 4326

您的栅格可能有不同的源 srs ,相应地更改它

gdalwarp esri-settlement-area-kathmandu-grid.tif esri-landcover-4326.tif -s_srs epsg:32645 -t_srs epsg:4326

现在让我们将 tif 转换为云优化的 geotif

gdal_translate -of cog esri-landcover-4326.tif esri-landcover-cog.tif

将重新投影的 tiff 转换为 geotiff 大约需要一分钟

将osm数据插入postgresql表

我们正在使用 osm2pgsql 将 osm 数据插入到我们的表中

osm2pgsql --create nepal-latest.osm.pbf -u postgres

osm2pgsql 总共花费了 274 秒(4m 34​​ 秒)。

如果您有任何使用 ogr2ogr 的文件,也可以使用 geojson 文件

ogr2ogr -f postgresql  pg:"dbname=postgres user=postgres password=postgres" buildings_polygons_geojson.geojson -nln buildings

ogro2gr 对驱动程序有广泛的支持,因此您可以非常灵活地选择输入内容。输出是 postgresql 表

计算h3指数

postgresql

安装

pip install pgxnclient cmakepgxn install h3

在您的数据库中创建扩展

create extension h3;create extension h3_postgis cascade;

现在让我们创建建筑物表

create table buildings (  id serial primary key,  osm_id bigint,  building varchar,  geometry geometry(polygon, 4326));

向表中插入数据

insert into buildings (osm_id, building, geometry)select osm_id, building, wayfrom planet_osm_polygon popwhere building is not null;

日志和计时:

updated rows    8048542query   insert into buildings (osm_id, building, geometry)    select osm_id, building, way    from planet_osm_polygon pop    where building is not nullstart time  mon aug 12 08:23:30 npt 2024finish time mon aug 12 08:24:25 npt 2024

现在让我们使用 centroid 计算这些建筑物的 h3 指数。这里 8 是我正在研究的 h3 分辨率。在这里了解有关决议的更多信息

alter table buildings add column h3_index h3index generated always as (h3_lat_lng_to_cell(st_centroid(geometry), 8)) stored;

光栅操作

安装

pip install h3 h3ronpy rasterio asyncio asyncpg aiohttp

确保重新投影的齿轮处于静态/

mv esri-landcover-cog.tif ./static/

运行 repo 中提供的脚本以从栅格创建 h3 像元。我正在按模式方法重新采样:这取决于您拥有的数据类型。对于分类数据模式更适合。在这里了解有关重采样方法的更多信息

python cog2h3.py --cog esri-landcover-cog.tif --table esri_landcover --res 8 --sample_by mode

日志:

2024-08-12 08:55:27,163 - info - starting processing2024-08-12 08:55:27,164 - info - cog file already exists: static/esri-landcover-cog.tif2024-08-12 08:55:27,164 - info - processing raster file: static/esri-landcover-cog.tif2024-08-12 08:55:41,664 - info - determined min fitting h3 resolution: 132024-08-12 08:55:41,664 - info - resampling original raster to : 1406.475763m2024-08-12 08:55:41,829 - info - resampling done2024-08-12 08:55:41,831 - info - new native h3 resolution: 82024-08-12 08:55:41,967 - info - converting h3 indices to hex strings2024-08-12 08:55:42,252 - info - raster calculation done in 15 seconds2024-08-12 08:55:42,252 - info - creating or replacing table esri_landcover in database2024-08-12 08:55:46,104 - info - table esri_landcover created or updated successfully in 3.85 seconds.2024-08-12 08:55:46,155 - info - processing completed

分析

让我们创建一个函数来获取多边形中的_h3_indexes

create or replace function get_h3_indexes(shape geometry, res integer)  returns h3index[] as $$declare  h3_indexes h3index[];begin  select array(    select h3_polygon_to_cells(shape, res)  ) into h3_indexes;  return h3_indexes;end;$$ language plpgsql immutable;

让我们获取我们感兴趣的区域中所有被确定为建筑面积的建筑物

with t1 as (  select *  from esri_landcover el  where h3_ix = any (    get_h3_indexes(      st_geomfromgeojson('{        "coordinates": [          [            [83.72922006065477, 28.395029869336483],            [83.72922006065477, 28.037312312532066],            [84.2367635433626, 28.037312312532066],            [84.2367635433626, 28.395029869336483],            [83.72922006065477, 28.395029869336483]          ]        ],        "type": "polygon"      }'), 8    )  ) and cell_value = 7)select *from buildings bljoin t1 on bl.h3_ix = t1.h3_ix;

查询计划:

使用 Uber hndexes 和 PostgreSQL 进行栅格分析

如果在建筑物的 h3_ix 列上添加索引,这可以进一步增强

create index on buildings(h3_ix);

拍摄计数时:我所在的地区有 24416 座建筑,其建筑等级属于 esri

确认

让我们验证输出是否为真:让我们以 geojson 形式获取建筑物

with t1 as (  select *  from esri_landcover el  where h3_ix = any (    get_h3_indexes(      st_geomfromgeojson('{        "coordinates": [          [            [83.72922006065477, 28.395029869336483],            [83.72922006065477, 28.037312312532066],            [84.2367635433626, 28.037312312532066],            [84.2367635433626, 28.395029869336483],            [83.72922006065477, 28.395029869336483]          ]        ],        "type": "polygon"      }'), 8    )  ) and cell_value = 7)select jsonb_build_object(  'type', 'featurecollection',  'features', jsonb_agg(st_asgeojson(bl.*)::jsonb))from buildings bljoin t1 on bl.h3_ix = t1.h3_ix;

让我们也获得h3细胞

with t1 as (  select *, h3_cell_to_boundary_geometry(h3_ix)  from esri_landcover el  where h3_ix = any (    get_h3_indexes(      st_geomfromgeojson('{        "coordinates": [          [            [83.72922006065477, 28.395029869336483],            [83.72922006065477, 28.037312312532066],            [84.2367635433626, 28.037312312532066],            [84.2367635433626, 28.395029869336483],            [83.72922006065477, 28.395029869336483]          ]        ],        "type": "polygon"      }'), 8    )  ) and cell_value = 7)select jsonb_build_object(  'type', 'featurecollection',  'features', jsonb_agg(st_asgeojson(t1.*)::jsonb))from t1

使用 Uber hndexes 和 PostgreSQL 进行栅格分析

增加 h3 分辨率后可以提高准确性,并且还取决于输入和重采样技术

清理

删除我们不需要的桌子

drop table planet_osm_line;drop table planet_osm_point;drop table planet_osm_polygon;drop table planet_osm_roads;drop table osm2pgsql_properties;

可选 – 矢量平铺

为了可视化图块,我们可以使用 pg_tileserv 快速构建矢量图块

下载pg_tileserv从上面提供的链接下载或使用 docker导出凭证

export database_url=postgresql://postgres:postgres@localhost:5432/postgres

授予我们表选择权限

grant select on buildings to postgres;grant select on esri_landcover to postgres;

让我们在 h3 索引上创建几何图形以进行可视化(如果您从 st_asmvt 手动构建图块,则可以直接从查询中执行此操作)

alter table esri_landcover add column geometry geometry(polygon, 4326) generated always as (h3_cell_to_boundary_geometry(h3_ix)) stored;

在该 h3 几何图形上创建索引以有效地可视化它

create index idx_esri_landcover_geometry on esri_landcover using gist (geometry);

奔跑

  ./pg_tileserv

使用 Uber hndexes 和 PostgreSQL 进行栅格分析

现在您可以根据图块值或任何您想要的方式可视化这些 mvt 图块,例如:maplibre!您还可以可视化处理结果或与其他数据集结合。这是我根据 qgis 中的 cell_value 对 h3 索引进行的可视化使用 Uber hndexes 和 PostgreSQL 进行栅格分析

源代码库:https://github.com/kshitijrajsharma/raster-analysis-using-h3

参考 :

https://blog.rustprooflabs.com/2022/04/postgis-h3-intro https://jsonsingh.com/blog/uber-h3/https://h3ronpy.readthedocs.io/en/latest/

以上就是使用 Uber hndexes 和 PostgreSQL 进行栅格分析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348969.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 12:28:41
下一篇 2025年12月13日 12:28:52

相关推荐

  • 尝试重新开始编码

    上个月我决定重新开始编码,因为我已经生疏了,开始忘记如何编写一行代码。原因是;我中断了一年的编码工作,我可以免费告诉你,这并不容易。去年,我一直在学习 Web 开发,并且完成了函数式和面向对象 JavaScript 的学习,并准备好将一些项目推送到 GitHub,我的下一步是开始学习 React。 …

    好文分享 2025年12月13日
    000
  • Python 中的错误处理和日志记录

    编写软件是一项远非完美的活动。从构思到生产,可能会出现错误,在某些情况下,可能会故意发生失败。这就是为什么理解主要编程语言中的错误处理和日志记录是一项需要掌握的关键技能。 错误可能会发生,情况也可能出现,但是您的应对方式(包括有关错误的准备和信息)将使您尽快摆脱困境。 在本文中,我们将学习 pyth…

    2025年12月13日
    000
  • 代码气味 – 蹲着

    不要提前在关键任务资源上使用可猜测的名称 tl;dr:通过避免可预测的命名模式来保护您的云资源。 问题 可预测的名字 未经授权的访问 数据暴露风险 影子资源 帐户接管 idor 漏洞 过早优化 解决方案 使用带有暗键的独特存储桶名称 验证创建的所有权 充分保障资源 间接混淆真实姓名 书名防止抢注 随…

    2025年12月13日
    000
  • 避免条件语句的智慧

    循环复杂度是衡量代码复杂性和混乱程度的指标。 高圈复杂度并不是一件好事,恰恰相反。 简单来说,圈复杂度与程序中可能的执行路径的数量成正比。换句话说,圈复杂度和条件语句的总数(尤其是它们的嵌套)密切相关。 所以今天我们来谈谈条件语句。 反如果 2007年,francesco cirillo发起了一场名…

    2025年12月13日
    000
  • Django AllAuth 章 使用自定义字段扩展 Django AllAuth 用户模型

    注意:本文最初发布在我的 substack 上,网址为 https://andresalvareziglesias.substack.com/ 这是 django allauth 系列文章的最后一章。在这五章中,我们发现了一个小奇迹,一个非常有用的 django 组件来处理我们所有的身份验证需求。在…

    2025年12月13日
    000
  • 如何使用 Ollama 和 LangChain 创建本地 RAG 代理

    什么是 rag? rag 代表检索增强生成,这是一种强大的技术,旨在通过以文档形式为大型语言模型(llm)提供特定的相关上下文来增强其性能。与纯粹根据预先训练的知识生成响应的传统法学硕士不同,rag 允许您通过检索和利用实时数据或特定领域的信息,使模型的输出与您期望的结果更紧密地结合起来。 rag …

    2025年12月13日
    000
  • 如何构建简单的 AI 代理:分步指南

    人工智能无处不在,从回答您问题的聊天机器人到管理您日程安排的智能助手。但您是否知道只需几步即可构建自己的人工智能代理?无论您是开发人员还是好奇的爱好者,本指南都将向您展示如何创建一个可以执行基本任务的简单 ai 代理,同时让事情变得有趣和简单。 ? ?️ 第 1 步:定义 ai 代理的使命 首先,决…

    2025年12月13日
    000
  • 释放 Python 脚本的力量:日复一日的 DevOps 工具系列

    欢迎来到“50 天 50 个 devops 工具”系列的第 28 天!今天,我们将深入探讨 python 脚本世界——这是任何 devops 专业人员的一项关键技能。 python 以其简单性、可读性和广泛的库支持而闻名,已成为自动化任务、管理基础设施和开发可扩展应用程序的重要工具。 为什么 pyt…

    2025年12月13日
    000
  • 使用 Diffuser 运行 Fluxn Mac

    什么是扩散器? 拥抱脸 / 扩散器 ? diffusers:最先进的扩散模型,用于 pytorch 和 flax 中的图像和音频生成。 ? diffusers 是最先进的预训练扩散模型的首选库,用于生成图像、音频甚至分子的 3d 结构。无论您是在寻找简单的推理解决方案还是训练自己的扩散模型,? di…

    2025年12月13日 好文分享
    000
  • 使用 Asyncio 创建和管理任务

    asyncio 允许开发者轻松地用 python 编写异步程序。该模块还提供了多种异步任务的方法,并且由于执行方法多种多样,因此可能会让人困惑于使用哪一种。 在本文中,我们将讨论使用 asyncio 创建和管理任务的多种方法。 什么是异步任务? 在 asyncio 中,task 是一个包装协程并安排…

    2025年12月13日
    000
  • 了解 Python 中常规类和数据类之间的差异

    介绍 在python中定义数据结构可以通过各种方法来完成。两种常用的方法是常规类和数据类。了解这两种方法之间的差异有助于为给定任务选择最合适的选项。本文对常规类和数据类进行了比较分析,强调了它们各自的特点和适当的用例。 常规课程 python 中的常规类是创建对象的传统方式。它需要对各种方法和属性进…

    2025年12月13日
    000
  • 关于如何使用 pip 安装你需要知道的一切

    在本文中,我们正在研究使用 pip 将代码安装到虚拟环境中的不同方法。 这些会变得更加复杂,但不用担心,我会全程陪伴您。 拍拍你的背 废话说够了!让我们从简单的事情开始吧。 安装本地存储库 假设以下情况:您刚刚签出了存储库并想要安装需求。 这可以通过使用以下命令轻松完成……当…

    2025年12月13日
    000
  • 在深入了解 Nylas 之前需要了解的关键概念

    在深入研究 nylas 之前必须了解的概念 所以,我已经准备好开始使用 nylas 及其强大的 api,但在开始之前,值得花点时间确保我很好地掌握了一些基本概念。这些构建块不仅可以帮助我有效地使用 nylas,还可以使我的开发过程更加顺利和安全。 1.python虚拟环境:保持整洁 让我们从pyth…

    2025年12月13日
    000
  • Python-文件

    文件操作: 文件读取文件写入追加内容 文件读取:以 open(‘logs.txt’, ‘r’) 作为文件: open是python内置函数,用于打开文件。第一个参数是文件名,第二个参数是读取模式。with语句用于自动关闭文件。这将防止内存泄漏,提供更好…

    2025年12月13日
    000
  • 使用 AWS 学习 Python – 第 2 天

    虚拟环境 今天我们将学习虚拟环境。 python 中的虚拟环境是一个容器,所有代码和其他 python 包都驻留在其中。它允许您将 python 配置与系统上的其他版本分开。开发 python 代码时始终使用虚拟环境是一个好主意。 要创建虚拟环境,我们将使用以下命令: python -m venv …

    2025年12月13日
    000
  • Python 库初学者指南

    python 以其简单性和多功能性而闻名,使其成为初学者和专业人士的热门选择。 python 最强大的功能之一是其广泛的库集合。这些库是预先编写的代码的集合,您可以使用它们来执行常见任务,从而节省您的时间和精力。在这篇博客中,我们将探索每个初学者都应该知道的一些基本 python 库。 1.什么是p…

    2025年12月13日
    000
  • tea-tasting:用于 A/B 测试统计分析的 Python 包

    简介 我开发了tea-tasting,一个用于 a/b 测试统计分析的 python 包,具有​​: 学生的 t 检验、bootstrap、cuped 方差缩减、功效分析以及其他开箱即用的统计方法和方法。支持广泛的数据后端,例如 bigquery、clickhouse、postgresql/gree…

    2025年12月13日
    000
  • Python – 字典、集合、元组

    这三个都是python中不同类型的数据结构。这用于存储不同的数据集合。根据我们要求的用例,我们需要在其中进行选择。 字典(dict): 字典是键值对的集合,其中每个键与一个值关联可以根据键值检索数据(基于键的搜索),因为键要求是唯一的。字典在 3.7 之前都是无序的,值可以更改。密钥名称不能直接更改…

    2025年12月13日
    000
  • 精通编码之路初学者指南

    您已经掌握了编码的基础知识。循环、函数,甚至简单的网站都在你的掌握之中。 但是从休闲程序员转变为专业程序员需要什么? 好吧,我在这里帮助正在寻找相同东西的初学者。 让我们潜入吧。 专业心态:不仅仅是代码 解决问题 编码既是关于编写代码,也是关于解决问题。将复杂的问题分解为更小的、可管理的步骤至关重要…

    2025年12月13日
    000
  • 使用 FastAPI 和机器学习构建实时信用卡欺诈检测系统

    介绍 信用卡欺诈对金融业构成重大威胁,每年造成数十亿美元的损失。为了解决这个问题,人们开发了机器学习模型来实时检测和防止欺诈交易。在本文中,我们将逐步介绍使用 fastapi(python 的现代 web 框架)以及在 kaggle 流行的信用卡欺诈检测数据集上训练的随机森林分类器构建实时信用卡欺诈…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信