Las capacidades geoespaciales de Microsoft Fabric y Esri Geoanalytics, demostradas

Ese 80% de los datos recopilados, almacenados y mantenidos por los gobiernos pueden asociarse con ubicaciones geográficas. Aunque nunca se probó empíricamente, ilustra la importancia de la ubicación dentro de los datos. Los volúmenes de datos cada vez mayores ponen restricciones en los sistemas que manejan los datos geoespaciales. Común Big data Los motores de cálculo, originalmente diseñados para escalar datos textuales, necesitan adaptación para trabajar de manera eficiente con los datos geoespaciales: piense en índices geográficos, particiones y operadores. Aquí, presento e ilustra cómo utilizar el Tela de Microsoft Spark Compute Engine, con el nativamente integrado ESRI Geoanalytics Engine# para procesamiento y análisis geoespaciales de big data.

Las capacidades geoanalíticas opcionales dentro de Tela Habilite el procesamiento y el análisis de los datos geoespaciales de tipo vector, donde los datos geoespaciales de tipo vector se refieren a puntos, líneas, polígonos. Estas capacidades incluyen más de 150 funciones espaciales para crear geometrías, probar y seleccionar relaciones espaciales. A medida que extiende Spark, las funciones geoanalíticas se pueden llamar cuando se usa Python, SQL o Scala. Estas operaciones espaciales se aplican indexación espacial automáticamente, lo que hace que el motor de cómputo también sea eficiente para estos datos. Puede manejar 10 formatos de datos espaciales extra comunes para cargar y guardar datos espaciales de datos, además de los formatos de origen de datos compatibles con Spark. Esta publicación de blog se centra en los motores de cómputo geoespaciales escalables como se ha introducido en mi publicación sobre Geoespacial en la era de la IA.

Demostración explicada

Aquí, demuestro algunas de estas capacidades espaciales al mostrar los pasos de manipulación y análisis de datos en un gran conjunto de datos. Al usar varios mosaicos que cubren datos de nubes de puntos (un montón de valores X, Y, Z), un conjunto de datos enorme comienza a formarse, mientras aún cubre un área relativamente pequeña. El abierto Holandés Ahn DataSet, que es un modelo nacional de elevación y superficie digital, se encuentra actualmente en su quinto ciclo de actualización y abarca un período de casi 30 años. Aquí, se utilizan los datos de la adquisición segunda, tercera y cuarta, ya que estos tienen cobertura nacional completa (la quinta simplemente aún no), mientras que la primera versión no incluyó una versión en nube de puntos (solo la versión derivada de la red).

Otro conjunto de datos abierto holandés, a saber Construyendo datos, la bolsase usa para ilustrar la selección espacial. El conjunto de datos del edificio contiene la huella de los edificios como polígonos. Actualmente, este conjunto de datos posee más de 11 millones de edificios. Para probar las funciones espaciales, uso solo 4 mosaicos Ahn por versión Ahn. Así, en este caso, 12 mosaicos, cada una de 5 x 6.25 km. Totalizando a más de 3.500 millones de puntos dentro de un área de 125 kilómetros cuadrados. El área elegida cubre el municipio de Loppersum, un área propensa al hundimiento de la tierra debido a la extracción de gas.

Los pasos a seguir incluyen la selección de edificios dentro del área de Loppersum, seleccionando los puntos X, Y, Z desde los techos de los edificios. Luego, traemos los 3 conjuntos de datos a un marco de datos y hacemos un análisis adicional con él. Una regresión espacial para predecir la altura esperada de un edificio basada en su historia de altura, así como en la historia de los edificios en su entorno directo. No es necesariamente el mejor análisis para realizar en estos datos para llegar a predicciones reales*, pero se adapta al propósito de demostrar las capacidades de procesamiento espacial de ESRI Geoanalytics de Fabric. Todos los fragmentos de código a continuación también están disponibles como cuadernos en Github.

Paso 1: Leer datos

Los datos espaciales pueden venir en muchos formatos de datos diferentes; Nos ajustamos al formato de datos Geoparquet para su posterior procesamiento. Los datos de construcción de la bolsa, tanto las huellas como los límites de municipio acompañados, ya vienen en formato de geoparquet. Sin embargo, los datos de Point Cloud Ahn, versión 2, 3 y 4 vienen como formatos de archivo LAZ, un formato estándar de la industria comprimido para las nubes de puntos. No he encontrado una biblioteca de chispa para leer laz (deje un mensaje en caso de que haya uno) y creé un archivo txt, por separado, con el LOSTOOLS+ + primero.

# ESRI - FABRIC reference: https://developers.arcgis.com/geoanalytics-fabric/

# Import the required modules
import geoanalytics_fabric
from geoanalytics_fabric.sql import functions as ST
from geoanalytics_fabric import extensions

# Read ahn file from OneLake
# AHN lidar data source: https://viewer.ahn.nl/

ahn_csv_path = "Files/AHN lidar/AHN4_csv"
lidar_df = spark.read.options(delimiter=" ").csv(ahn_csv_path)
lidar_df = lidar_df.selectExpr("_c0 as X", "_c1 as Y", "_c2 Z")

lidar_df.printSchema()
lidar_df.show(5)
lidar_df.count()

El fragmento de código anteriorY Proporciona los siguientes resultados:

Ahora, con las funciones espaciales make_point y srid Las columnas X, Y, Z se transforman en una geometría de puntos y la establecen en el sistema de coordenadas holandés específico (SRID = 28992), consulte el siguiente fragmento del códigoY:

# Create point geometry from x,y,z columns and set the spatial refrence system
lidar_df = lidar_df.select(ST.make_point(x="X", y="Y", z="Z").alias("rd_point"))
lidar_df = lidar_df.withColumn("srid", ST.srid("rd_point"))
lidar_df = lidar_df.select(ST.srid("rd_point", 28992).alias("rd_point"))\
  .withColumn("srid", ST.srid("rd_point"))

lidar_df.printSchema()
lidar_df.show(5)

Los datos de construcción y municipio se pueden leer con el extendido spark.read función para geoparquet, consulte el fragmento de códigoY:

# Read building polygon data
path_building = "Files/BAG NL/BAG_pand_202504.parquet"
df_buildings = spark.read.format("geoparquet").load(path_building)

# Read woonplaats data (=municipality)
path_woonplaats = "Files/BAG NL/BAG_woonplaats_202504.parquet"
df_woonplaats = spark.read.format("geoparquet").load(path_woonplaats)

# Filter the DataFrame where the "woonplaats" column contains the string "Loppersum"
df_loppersum = df_woonplaats.filter(col("woonplaats").contains("Loppersum"))

Paso 2: hacer selecciones

En el acompañamiento cuadernosLeo y escribo en Geoparquet. Para asegurarse de que los datos correctos se lean correctamente como Dataframes, consulte el siguiente fragmento de código:

# Read building polygon data
path_building = "Files/BAG NL/BAG_pand_202504.parquet"
df_buildings = spark.read.format("geoparquet").load(path_building)

# Read woonplaats data (=municipality)
path_woonplaats = "Files/BAG NL/BAG_woonplaats_202504.parquet"
df_woonplaats = spark.read.format("geoparquet").load(path_woonplaats)

# Filter the DataFrame where the "woonplaats" column contains the string "Loppersum"
df_loppersum = df_woonplaats.filter(col("woonplaats").contains("Loppersum"))

Con todos los datos en los marcos de datos, se convierte en un paso simple para hacer selecciones espaciales. El siguiente fragmento de códigoY Muestra cómo seleccionar los edificios dentro de los límites del municipio de Loppersum, y por separado realiza una selección de edificios que existieron durante todo el período (los datos de Point Cloud Ahn-2 se adquirieron en 2009 en esta región). Esto dio como resultado 1196 edificios, de los 2492 edificios actualmente.

# Clip the BAG buildings to the gemeente Loppersum boundary
df_buildings_roi = Clip().run(input_dataframe=df_buildings,
                    clip_dataframe=df_loppersum)

# select only buildings older then AHN data (AHN2 (Groningen) = 2009) 
# and with a status in use (Pand in gebruik)
df_buildings_roi_select = df_buildings_roi.where((df_buildings_roi.bouwjaar<2009) & (df_buildings_roi.status=='Pand in gebruik'))

Las tres versiones de Ahn utilizadas (2,3 y 4), nombradas además como T1, T2 y T3, respectivamente, se recortan en función de los datos de edificios seleccionados. El AggregatePoints La función se puede utilizar para calcular, en este caso desde la altura (valores z), algunas estadísticas, como la media por techo, la desviación estándar y el número de valores z en los que se basa; Vea el fragmento de código:

# Select and aggregrate lidar points from buildings within ROI

df_ahn2_result = AggregatePoints() \
            .setPolygons(df_buildings_roi_select) \
            .addSummaryField(summary_field="T1_z", statistic="Mean", alias="T1_z_mean") \
            .addSummaryField(summary_field="T1_z", statistic="stddev", alias="T1_z_stddev") \
            .run(df_ahn2)

df_ahn3_result = AggregatePoints() \
            .setPolygons(df_buildings_roi_select) \
            .addSummaryField(summary_field="T2_z", statistic="Mean", alias="T2_z_mean") \
            .addSummaryField(summary_field="T2_z", statistic="stddev", alias="T2_z_stddev") \
            .run(df_ahn3)

df_ahn4_result = AggregatePoints() \
            .setPolygons(df_buildings_roi_select) \
            .addSummaryField(summary_field="T3_z", statistic="Mean", alias="T3_z_mean") \
            .addSummaryField(summary_field="T3_z", statistic="stddev", alias="T3_z_stddev") \
            .run(df_ahn4)

Paso 3: agregado y regreso

Como funcionan los geoanalíticos Regresión ponderada geográfica (GWR) solo puede funcionar en los datos puntuales, desde los polígonos del edificio que su centroide se extrae con el centroid función. Los 3 marcos de datos se unen a uno, ver también el cuaderno, y está listo para realizar la función GWR. En este caso, predice la altura de T3 (Ahn4) basada en funciones de regresión local.

# Import the required modules
from geoanalytics_fabric.tools import GWR

# Run the GWR tool to predict AHN4 (T3) height values for buildings at Loppersum
resultGWR = GWR() \
            .setExplanatoryVariables("T1_z_mean", "T2_z_mean") \
            .setDependentVariable(dependent_variable="T3_z_mean") \
            .setLocalWeightingScheme(local_weighting_scheme="Bisquare") \
            .setNumNeighbors(number_of_neighbors=10) \
            .runIncludeDiagnostics(dataframe=df_buildingsT123_points)

El modelo de diagnóstico se puede consultar para el valor z predicho, en este caso, se generaron los siguientes resultados. Tenga en cuenta, nuevamente, que estos resultados no pueden usarse para aplicaciones del mundo real, ya que los datos y la metodología podrían no adaptarse mejor al propósito del modelado de la subsidencia: simplemente muestra aquí la funcionalidad geoanalítica de tela.

R2 0.994
Adjr2 0.981
AICC 1509
Sigma2 0.046
Edof 378

Paso 4: visualizar los resultados

Con el gráfico de funciones espaciales, los resultados se pueden visualizar como mapas dentro del cuaderno, para usarse solo con la API de Python en Spark. Primero, una visualización de todos los edificios dentro del municipio de Loppersum.

# visualize Loppersum buildings
df_buildings.st.plot(basemap="light", geometry="geometry", edgecolor="black", alpha=0.5)

Aquí hay una visualización de la diferencia de altura entre T3 (Ahn4) y T3 predicho (T3 predicho menos T3).

# Vizualize difference of predicted height and actual measured height Loppersum area and buildings

axes = df_loppersum.st.plot(basemap="light", edgecolor="black", figsize=(7, 7), alpha=0)
axes.set(xlim=(244800, 246500), ylim=(594000, 595500))
df_buildings.st.plot(ax=axes, basemap="light", alpha=0.5, edgecolor="black") #, color='xkcd:sea blue'
df_with_difference.st.plot(ax=axes, basemap="light", cmap_values="subsidence_mm_per_yr", cmap="coolwarm_r", vmin=-10, vmax=10, geometry="geometry")

Resumen

Esta publicación de blog discute la importancia de los datos geográficos. Destaca los desafíos planteados al aumentar los volúmenes de datos en Geoespacial Los sistemas de datos y sugieren que los motores tradicionales de big data deben adaptarse para manejar los datos geoespaciales de manera eficiente. Aquí, se presenta un ejemplo sobre cómo usar el motor Microsoft Fabric Spark Compute y su integración con el motor ESRI Geoanalytics para un procesamiento y análisis de big data geoespacial efectivo.

Las opiniones aquí son mías.

Notas al pie

# En vista previa

* Para modelar el hundimiento de la tierra con mayor precisión y frecuencia temporal se pueden utilizar otros enfoques y datos, como con la metodología Satelital Insar (ver también Bodemdalingskaart)

+ LISTOOLS se usa aquí por separado, sería divertido probar el uso de funciones de datos del usuario de Fabric (vista previa) o utilizar una función de Azure para este propósito.

y los fragmentos de código aquí están configurados para la legibilidad, no necesariamente para la eficiencia. Se pueden encadenar múltiples pasos de procesamiento de datos.

Referencias

Repo de Github con cuadernos: delange/tela_geoanalytics

Microsoft Fabric: Microsoft Fabric Documentation – Microsoft Fabric | Microsoft Learn

Esri Geoanalytics para tela: Descripción general | Arcgis Geoanalytics para Microsoft Fabric | Desarrolladores de ArcGIS

Ahn: Inicio | Ahn

BOLSA: Over Bag – BasedRegistratie Adressen en Gebouwen – Kadaster.nl Zakelijk

LISTOOLS: LISTOOLS: Convertir, filtrar, ver, procesar y comprimir datos LiDAR en formato LAS y LAZ

Mapa de movimiento de superficie y objeto: Bodemdalingskaart –