24.8 C
Colombia
lunes, julio 7, 2025

Una extensión brillante para analizar datos geoespaciales


sparklyr.sedona ahora está disponible como el sparklyrinterfaz R basada en apache sedona.

Para instalar sparklyr.sedona desde GitHub usando el remotes paquete, ejecutar

remotes::install_github(repo = "apache/incubator-sedona", subdir = "R/sparklyr.sedona")

En esta publicación de weblog, brindaremos una introducción rápida a sparklyr.sedonadescribiendo la motivación detrás de esto sparklyr extensión, y presentando algún ejemplo sparklyr.sedona casos de uso que involucran RDD espaciales de Spark, marcos de datos de Spark y visualizaciones.

Motivación para sparklyr.sedona

Una sugerencia de la
resultados de la encuesta mlverse A principios de este año se mencionó la necesidad de interfaces R actualizadas para marcos SIG basados ​​en Spark. Mientras analizamos esta sugerencia, aprendimos sobre
apache sedonaun sistema de datos geoespaciales impulsado por Spark que es moderno, eficiente y fácil de usar. También nos dimos cuenta de que, si bien nuestros amigos de la comunidad de código abierto Spark habían desarrollado un
sparklyr extensión para GeoSpark, el predecesor de Apache Sedona, todavía no existía una extensión related que hiciera que las funcionalidades más recientes de Sedona fueran fácilmente accesibles desde R. Por ello decidimos trabajar en sparklyr.sedonacuyo objetivo es cerrar la brecha entre Sedona y R.

La disposición del terreno

Esperamos que esté listo para un recorrido rápido por algunas de las funcionalidades basadas en RDD y Spark-dataframe en sparklyr.sedonay también algunas visualizaciones deslumbrantes derivadas de datos geoespaciales en Spark.

En Apache Sedona,
Conjuntos de datos distribuidos resilientes espaciales(SRDD) son bloques de construcción básicos de datos espaciales distribuidos que encapsulan “vainilla” RDDs de objetos geométricos e índices. Los SRDD admiten operaciones de bajo nivel, como transformaciones del sistema de referencia de coordenadas (CRS), partición espacial e indexación espacial. Por ejemplo, con sparklyr.sedonaLas operaciones basadas en SRDD que podemos realizar incluyen las siguientes:

  • Importar alguna fuente de datos externa a un SRDD:
library(sparklyr)
library(sparklyr.sedona)

sedona_git_repo <- normalizePath("~/incubator-sedona")
data_dir <- file.path(sedona_git_repo, "core", "src", "check", "assets")

sc <- spark_connect(grasp = "native")

pt_rdd <- sedona_read_dsv_to_typed_rdd(
  sc,
  location = file.path(data_dir, "arealm.csv"),
  sort = "level"
)
  • Aplicar partición espacial a todos los puntos de datos:
sedona_apply_spatial_partitioner(pt_rdd, partitioner = "kdbtree")
  • Construyendo un índice espacial en cada partición:
sedona_build_index(pt_rdd, sort = "quadtree")
  • Unir un conjunto de datos espaciales con otro utilizando “contener” o “superponer” como predicado de unión:
polygon_rdd <- sedona_read_dsv_to_typed_rdd(
  sc,
  location = file.path(data_dir, "primaryroads-polygon.csv"),
  sort = "polygon"
)

pts_per_region_rdd <- sedona_spatial_join_count_by_key(
  pt_rdd,
  polygon_rdd,
  join_type = "include",
  partitioner = "kdbtree"
)

Vale la pena mencionar que sedona_spatial_join() realizará la partición espacial y la indexación de las entradas utilizando el partitioner y index_type sólo si las entradas no están particionadas o indexadas como ya se ha especificado.

En los ejemplos anteriores, se puede ver que los SRDD son excelentes para operaciones espaciales que requieren un management detallado, por ejemplo, para garantizar que una consulta de unión espacial se ejecute de la manera más eficiente posible con los tipos correctos de división e indexación espacial.

Finalmente, podemos intentar visualizar el resultado de la unión anterior, usando un mapa de coropletas:

sedona_render_choropleth_map(
  pts_per_region_rdd,
  resolution_x = 1000,
  resolution_y = 600,
  output_location = tempfile("choropleth-map-"),
  boundary = c(-126.790180, -64.630926, 24.863836, 50.000),
  base_color = c(63, 127, 255)
)

lo que nos da lo siguiente:

Ejemplo de salida de mapa de coropletas

Espera, pero algo parece andar mal. Para que la visualización anterior se vea mejor, podemos superponerla con el contorno de cada región poligonal:

contours <- sedona_render_scatter_plot(
  polygon_rdd,
  resolution_x = 1000,
  resolution_y = 600,
  output_location = tempfile("scatter-plot-"),
  boundary = c(-126.790180, -64.630926, 24.863836, 50.000),
  base_color = c(255, 0, 0),
  browse = FALSE
)

sedona_render_choropleth_map(
  pts_per_region_rdd,
  resolution_x = 1000,
  resolution_y = 600,
  output_location = tempfile("choropleth-map-"),
  boundary = c(-126.790180, -64.630926, 24.863836, 50.000),
  base_color = c(63, 127, 255),
  overlay = contours
)

lo que nos da lo siguiente:

Mapa de coropletas con superposición

Con algunas operaciones espaciales de bajo nivel atendidas utilizando la API SRDD y las estructuras de datos de indexación y partición espacial adecuadas, podemos importar los resultados de los SRDD a los marcos de datos de Spark. Cuando trabajamos con objetos espaciales dentro de marcos de datos de Spark, podemos escribir consultas declarativas de alto nivel sobre estos objetos usando dplyr verbos en conjunto con Sedona
UDF espacialespor ejemplo, la siguiente consulta nos cube si cada uno de los 8 Los polígonos más cercanos al punto de consulta contienen ese punto y también el casco convexo de cada polígono.

tbl <- DBI::dbGetQuery(
  sc, "SELECT ST_GeomFromText("POINT(-66.3 18)") AS `pt`"
)
pt <- tbl$pt[[1]]
knn_rdd <- sedona_knn_query(
  polygon_rdd, x = pt, okay = 8, index_type = "rtree"
)

knn_sdf <- knn_rdd %>%
  sdf_register() %>%
  dplyr::mutate(
    contains_pt = ST_contains(geometry, ST_Point(-66.3, 18)),
    convex_hull = ST_ConvexHull(geometry)
  )

knn_sdf %>% print()
# Supply: spark<?> [?? x 3]
  geometry                         contains_pt convex_hull
  <record>                           <lgl>       <record>
1 <POLYGON ((-66.335674 17.986328… TRUE        <POLYGON ((-66.335674 17.986328,…
2 <POLYGON ((-66.335432 17.986626… TRUE        <POLYGON ((-66.335432 17.986626,…
3 <POLYGON ((-66.335432 17.986626… TRUE        <POLYGON ((-66.335432 17.986626,…
4 <POLYGON ((-66.335674 17.986328… TRUE        <POLYGON ((-66.335674 17.986328,…
5 <POLYGON ((-66.242489 17.988637… FALSE       <POLYGON ((-66.242489 17.988637,…
6 <POLYGON ((-66.242489 17.988637… FALSE       <POLYGON ((-66.242489 17.988637,…
7 <POLYGON ((-66.24221 17.988799,… FALSE       <POLYGON ((-66.24221 17.988799, …
8 <POLYGON ((-66.24221 17.988799,… FALSE       <POLYGON ((-66.24221 17.988799, …

Expresiones de gratitud

El autor de esta entrada de weblog desea agradecer Jiayuel creador de Apache Sedona, y Lorenz Walthert por su sugerencia de contribuir sparklyr.sedona a la corriente arriba
incubadora-sedona repositorio. Jia ha proporcionado comentarios extensos sobre la revisión del código para garantizar sparklyr.sedona Cumple con los estándares de codificación y las mejores prácticas del proyecto Apache Sedona, y también ha sido de gran ayuda en la instrumentación de la verificación de flujos de trabajo de CI. sparklyr.sedona funciona como se esperaba con versiones instantáneas de las bibliotecas de Sedona de las ramas de desarrollo.

El autor también agradece a su colega. Sigrid Keydana
para sugerencias editoriales valiosas en esta publicación de weblog.

Eso es todo. ¡Gracias por leer!

Foto por NASA en desempaquetar

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles