0

0

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

PHPz

PHPz

发布时间:2024-08-13 19:15:04

|

782人浏览过

|

来源于dev.to

转载

嗨,在这篇博客中,我们将讨论如何使用 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 cmake
pgxn 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, way
from planet_osm_polygon pop
where building is not null;

日志和计时:

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

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

知识画家
知识画家

AI交互知识生成引擎,一句话生成知识视频、动画和应用

下载
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 processing
2024-08-12 08:55:27,164 - info - cog file already exists: static/esri-landcover-cog.tif
2024-08-12 08:55:27,164 - info - processing raster file: static/esri-landcover-cog.tif
2024-08-12 08:55:41,664 - info - determined min fitting h3 resolution: 13
2024-08-12 08:55:41,664 - info - resampling original raster to : 1406.475763m
2024-08-12 08:55:41,829 - info - resampling done
2024-08-12 08:55:41,831 - info - new native h3 resolution: 8
2024-08-12 08:55:41,967 - info - converting h3 indices to hex strings
2024-08-12 08:55:42,252 - info - raster calculation done in 15 seconds
2024-08-12 08:55:42,252 - info - creating or replacing table esri_landcover in database
2024-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 bl
join 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 bl
join 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/

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

1027

2026.01.21

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

257

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

500

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

402

2024.04.08

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

440

2024.04.08

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

158

2023.10.10

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号