Prácticas recomendadas para el análisis espacial

En este documento se describen las prácticas recomendadas para optimizar el rendimiento de las consultas geoespaciales en BigQuery. Puedes usar estas prácticas recomendadas para mejorar el rendimiento, reducir los costes y disminuir la latencia.

Los conjuntos de datos pueden contener grandes colecciones de polígonos, formas multipolígonos y linestring para representar elementos complejos, como carreteras, parcelas y zonas inundables. Cada forma puede contener miles de puntos. En la mayoría de las operaciones espaciales de BigQuery (por ejemplo, intersecciones y cálculos de distancia), el algoritmo subyacente suele visitar la mayoría de los puntos de cada forma para producir un resultado. En algunas operaciones, el algoritmo visita todos los puntos. En el caso de las formas complejas, visitar cada punto puede aumentar el coste y la duración de las operaciones espaciales. Puedes usar las estrategias y los métodos que se presentan en esta guía para optimizar estas operaciones espaciales habituales y mejorar el rendimiento y reducir los costes.

En este documento se da por hecho que tus tablas geoespaciales de BigQuery están agrupadas en clústeres por una columna de geografía.

Simplificar formas

Práctica recomendada: Usa las funciones de simplificación y acoplamiento a la cuadrícula para almacenar una versión simplificada de tu conjunto de datos original como vista materializada.

Muchas formas complejas con un gran número de puntos se pueden simplificar sin perder mucha precisión. Usa las funciones de BigQuery ST_SIMPLIFY y ST_SNAPTOGRID por separado o juntas para reducir el número de puntos de formas complejas. Combina estas funciones con las vistas materializadas de BigQuery para almacenar una versión simplificada de tu conjunto de datos original como una vista materializada que se actualiza automáticamente en la tabla base.

Simplificar las formas es muy útil para mejorar el coste y el rendimiento de un conjunto de datos en los siguientes casos prácticos:

  • Debes mantener un alto grado de similitud con la forma real.
  • Debes realizar operaciones de alta precisión.
  • Quieres acelerar las visualizaciones sin que se pierdan detalles de las formas.

En el siguiente ejemplo de código se muestra cómo usar la función ST_SIMPLIFY en una tabla base que tiene una columna GEOGRAPHY llamada geom. El código simplifica las formas y elimina puntos sin alterar ningún borde de una forma en más de la tolerancia dada de 1,0 metros.

CREATE MATERIALIZED VIEW project.dataset.base_mv
  CLUSTER BY geom
AS (
  SELECT
    * EXCEPT (geom),
    ST_SIMPLIFY(geom, 1.0) AS geom
  FROM base_table
)

En el siguiente ejemplo de código se muestra cómo usar la función ST_SNAPTOGRID para ajustar los puntos a una cuadrícula con una resolución de 0,00001 grados:

CREATE MATERIALIZED VIEW project.dataset.base_mv
  CLUSTER BY geom
AS (
  SELECT
    * EXCEPT (geom),
    ST_SNAPTOGRID(geom, -5) AS geom
  FROM base_table
)

El argumento grid_size de esta función actúa como exponente, lo que significa que 10e-5 = 0,00001. Esta resolución equivale a aproximadamente 1 metro en el peor de los casos, que se da en el ecuador.

Después de crear estas vistas, consulta la vista base_mv con la misma semántica de consulta que usarías para consultar la tabla base. Puedes usar esta técnica para identificar rápidamente un conjunto de formas que necesiten un análisis más detallado y, a continuación, realizar un segundo análisis más profundo en la tabla base. Prueba tus consultas para ver qué valores de umbral se adaptan mejor a tus datos.

En los casos prácticos de medición, determina el nivel de precisión que necesitas. Cuando uses la función ST_SIMPLIFY, define el parámetro threshold_meters con el nivel de precisión necesario. Para medir distancias a escala de una ciudad o más, define un umbral de 10 metros. En escalas más pequeñas, por ejemplo, al medir la distancia entre un edificio y la masa de agua más cercana, se recomienda usar un umbral más pequeño, de 1 metro o menos. Si se usan valores de umbral más pequeños, se eliminarán menos puntos de la forma dada.

Cuando sirves capas de mapa desde un servicio web, puedes precalcular vistas materializadas para diferentes niveles de zoom con el proyecto bigquery-geotools, que es un controlador de GeoServer que te permite servir capas espaciales desde BigQuery. Este controlador crea varias vistas materializadas con diferentes parámetros de umbral ST_SIMPLIFY para que se muestren menos detalles con niveles de zoom más altos.

Usar puntos y rectángulos

Práctica recomendada: Reduce la forma a un punto o un rectángulo para representar su ubicación.

Puedes mejorar el rendimiento de las consultas reduciendo la forma a un solo punto o a un rectángulo. Los métodos de esta sección no representan con precisión los detalles ni las proporciones de la forma, sino que se optimizan para representar la ubicación de la forma.

Puedes usar el punto central geográfico de una forma (su centroide) para representar la ubicación de toda la forma. Usa un rectángulo que contenga la forma para crear la extensión de la forma, que puedes usar para representar la ubicación de la forma y mantener información sobre su tamaño relativo.

Usar puntos y rectángulos es muy útil para mejorar el coste y el rendimiento de un conjunto de datos cuando necesitas medir la distancia entre dos puntos, como entre dos ciudades.

Por ejemplo, puedes cargar una base de datos de parcelas de terreno de Estados Unidos en una tabla de BigQuery y, a continuación, determinar la masa de agua más cercana. En este caso, precalcular los centroides de las parcelas con la función ST_CENTROID junto con el método descrito en la sección Simplificar formas de este documento puede reducir el número de comparaciones que se realizan al usar las funciones ST_DISTANCE o ST_DWITHIN. Cuando se usa la función ST_CENTROID, el centroide de la parcela debe tenerse en cuenta en el cálculo. Precalcular los centroides de las parcelas de esta forma también puede reducir la variabilidad del rendimiento, ya que es probable que las diferentes formas de las parcelas contengan un número diferente de puntos.

Una variante de este método es usar la función ST_BOUNDINGBOX en lugar de la función ST_CENTROID para calcular un envolvente rectangular alrededor de la forma de entrada. Aunque no es tan eficiente como usar un solo punto, puede reducir la aparición de determinados casos límite. Esta variante sigue ofreciendo un rendimiento bueno y constante, ya que el resultado de la función ST_BOUNDINGBOX siempre contiene solo cuatro puntos que deben tenerse en cuenta. El resultado del cuadro delimitador será del tipo STRUCT, lo que significa que tendrás que calcular las distancias manualmente o usar el método de índice vectorial que se describe más adelante en este documento.

Usar cascos

Práctica recomendada: Usa un envolvente para optimizar la representación de la ubicación de una forma.

Si imaginas que envuelves una forma con plástico y calculas el límite de ese envoltorio, ese límite se denomina envolvente. En una envolvente convexa, todos los ángulos de la forma resultante son convexos. Al igual que la extensión de una forma, un envolvente convexo conserva información sobre el tamaño y las proporciones relativos de la forma subyacente. Sin embargo, usar un envolvente implica almacenar y tener en cuenta más puntos en los análisis posteriores.

Puedes usar la función ST_CONVEXHULL para optimizar la representación de la ubicación de la forma. Si usas esta función, la precisión será mayor, pero el rendimiento se reducirá. La función ST_CONVEXHULL es similar a la función ST_EXTENT, salvo que la forma de salida contiene más puntos y varía en el número de puntos en función de la complejidad de la forma de entrada. Aunque la mejora del rendimiento probablemente sea insignificante en conjuntos de datos pequeños con formas no complejas, en conjuntos de datos muy grandes con formas grandes y complejas, la función ST_CONVEXHULL ofrece un buen equilibrio entre coste, rendimiento y precisión.

Usar sistemas de cuadrícula

Práctica recomendada: Usa sistemas de cuadrícula geoespacial para comparar zonas.

Si sus casos prácticos implican agregar datos en zonas localizadas y comparar agregaciones estadísticas de esas zonas entre sí, puede beneficiarse de un sistema de cuadrícula estandarizado para comparar diferentes zonas.

Por ejemplo, un comercio puede querer analizar los cambios demográficos a lo largo del tiempo en las zonas donde se encuentran sus tiendas o donde se plantea construir una nueva. O bien, una aseguradora puede querer mejorar su conocimiento de los riesgos de las propiedades analizando los riesgos de catástrofes naturales predominantes en una zona concreta.

Si se usan sistemas de cuadrícula estándar, como S2 y H3, se pueden acelerar las agregaciones estadísticas y los análisis espaciales. Usar estos sistemas de cuadrícula también puede simplificar el desarrollo de analíticas y mejorar la eficiencia del desarrollo.

Por ejemplo, las comparaciones que usan secciones censales de Estados Unidos tienen problemas de inconsistencia en el tamaño, lo que significa que se deben aplicar factores de corrección para hacer comparaciones similares entre secciones censales. Además, los tramos censales y otros límites administrativos cambian con el tiempo y requieren un esfuerzo para corregir estos cambios. Para abordar estos problemas, se pueden usar sistemas de cuadrícula para el análisis espacial.

Usar la búsqueda vectorial y los índices vectoriales

Práctica recomendada: Usa la búsqueda vectorial y los índices vectoriales para hacer consultas geoespaciales de vecinos más cercanos.

Las funciones de búsqueda de vectores se introdujeron en BigQuery para habilitar casos prácticos de aprendizaje automático, como la búsqueda semántica, la detección de similitudes y la generación aumentada de recuperación. La clave para habilitar estos casos prácticos es un método de indexación llamado búsqueda del vecino más cercano aproximado. Puedes usar la búsqueda de vectores para acelerar y simplificar las consultas geoespaciales de vecinos más cercanos comparando vectores que representan puntos en el espacio.

Puedes usar la búsqueda vectorial para buscar características por radio. Primero, establece un radio para tu búsqueda. Puedes descubrir el radio óptimo en el conjunto de resultados de una búsqueda de vecinos más cercanos. Una vez que hayas establecido el radio, usa la función ST_DWITHIN para identificar las funciones cercanas.

Por ejemplo, puedes buscar los diez edificios más cercanos a un edificio de referencia concreto del que ya tengas la ubicación. Puedes almacenar los centroides de cada edificio como un vector en una tabla nueva, indexar la tabla y buscar mediante la búsqueda vectorial.

En este ejemplo, también puedes usar datos de Overture Maps en BigQuery para crear una tabla independiente de formas de edificios que correspondan a una zona de interés y un vector llamado geom_vector. El área de interés de este ejemplo es la ciudad de Norfolk, Virginia (EE. UU.), representada por el código FIPS 51710, tal como se muestra en el siguiente código de ejemplo:

CREATE TABLE vector_search.norfolk_buildings
AS (
  SELECT
    *,
    [
      ST_X(ST_CENTROID(building.geometry)),
      ST_Y(ST_CENTROID(building.geometry))] AS geom_vector
  FROM `bigquery-public-data.overture_maps.building` AS building
  INNER JOIN `bigquery-public-data.geo_us_boundaries.counties` AS county
    ON (st_intersects(county.county_geom, building.geometry))
  WHERE county.county_fips_code = '51710'
)

En el siguiente código de ejemplo se muestra cómo crear un índice vectorial en la tabla:

CREATE
  vector index building_vector_index
ON
  vector_search.norfolk_buildings(geom_vector)
  OPTIONS (index_type = 'IVF')

Esta consulta identifica los 10 edificios más cercanos a un edificio de referencia concreto:

SELECT base.*
FROM
  VECTOR_SEARCH(
    TABLE vector_search.norfolk_buildings,
    'geom_vector',
    (
      SELECT
        geom_vector
      FROM
        vector_search.norfolk_buildings
      WHERE id = '56873794-9873-4fe1-871a-5987bb3a0efb'
    ),
    top_k => 10,
    distance_type => 'EUCLIDEAN',
    options => '{"fraction_lists_to_search":0.1}')

En el panel Resultados de la consulta, haz clic en la pestaña Visualización. En el mapa se muestra un clúster de formas de edificios más cercano al edificio de referencia:

Datos geoespaciales visualizados en BigQuery.

Cuando ejecutes esta consulta en la Google Cloud consola, haz clic en Información del trabajo y comprueba que Modo de uso del índice vectorial esté definido como FULLY_USED. Esto indica que la consulta está aprovechando el índice vectorial building_vector_index, que creaste anteriormente.

Dividir formas grandes

Práctica recomendada: divide las formas grandes con la función ST_SUBDIVIDE.

Usa la función ST_SUBDIVIDE para dividir formas grandes o cadenas de líneas largas en formas más pequeñas.

Siguientes pasos