R で GeoParquet を
読むなら SedonaDB

2025/12/06 Japan.R 2025

Hiroaki Yutani

ドーモ!

Hiroaki Yutani

  • 株式会社 MIERUNE で GIS エンジニア見習いをしています
  • 最近ぜんぜん R 触ってない…

GeoParquet とは

  • イケてる GIS データ用のデータフォーマット
  • みんな Parquet を読んでいる。読んでいないのはお前だけ
  • (5分で話せることは特にないのでこういう雑な紹介になる)

R から読むには?

DuckDB

con <- dbConnect(duckdb::duckdb())
dbExecute(con, "LOAD spatial")
dbExecute(con, "LOAD httpfs")
dbExecute(con, "CALL register_geoarrow_extensions()")

res <- tbl(con, sql("SELECT ...")) |> 
  arrow::to_arrow() |> 
  sf::st_as_sf()

(DuckDB v1.5 だと1行減るはず)

con <- dbConnect(duckdb::duckdb())
dbExecute(con, "LOAD spatial")
dbExecute(con, "LOAD httpfs")
# dbExecute(con, "CALL register_geoarrow_extensions()")

res <- tbl(con, sql("SELECT ...")) |> 
  arrow::to_arrow() |> 
  sf::st_as_sf()

SedonaDB

SedonaDB

  • GIS データに特化したクエリエンジン
  • ラスタデータも扱える
  • まだまだ開発中!

SedonaDB

  • R-universe からインストール可
install.packages(
  'sedonadb',
  repos = c('https://apache.r-universe.dev', 'https://cloud.r-project.org')
)

DuckDB の場合

  • Parquet ファイルを直接 FROM 句に指定
tbl(con, sql(
  "SELECT ... FROM 'path/to/data.parquet'"
))

SedonaDB の場合

  • view として登録してから参照
sd_read_parquet('path/to/data.parquet') |>
  sd_to_view("テーブル1")

sd_sql("SELECT ... FROM テーブル1")

SedonaDB の場合

  • sf や data.frame を SedonaDB に渡せる
sd_to_view(mtcars, "mtcars")

sd_sql("SELECT COUNT(*) FROM mtcars")
#> ┌──────────┐
#> │ count(*) │
#> │   int64  │
#> ╞══════════╡
#> │       32 │
#> └──────────┘
#> Preview of up to 6 row(s)

SedonaDB の場合

  • sf や data.frame を SedonaDB に渡せる
  • ということは、sf が読み込める様々な形式のデータを組み合わせれて便利

例:Overture Maps

# 麻布台ヒルズ周辺
target_wkt <- paste0(
  "POLYGON ((139.720 35.640, ",
  "139.720 35.680, ",
  "139.760 35.680, ",
  "139.760 35.640, ",
  "139.720 35.640))"
)

sd_read_parquet(
  's3://overturemaps-us-west-2/release/2025-11-19.0/theme=transportation/type=segment/'
) |>
  sd_to_view("transportation")

例:Overture Maps

res <- sd_sql(glue::glue(
  "SELECT id, class, geometry
  FROM transportation
  WHERE
    ST_Within(geometry, ST_SetSRID(ST_GeomFromText('{target_wkt}'), 4326))"
)) |>
  sf::st_as_sf()

例:Overture Maps

ggplot(res) +
  geom_sf(aes(colour = class)) +
  scale_colour_viridis_d()

SedonaDB の現状

  • とりあえずは Python 優先だが、R もかなりやる気ある
  • 速度は速い
  • 機能面はまだまだ DuckDB に及ばない
  • ラスタもこれから
  • 今後に期待!