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 y reducir el costo y la latencia.
Los conjuntos de datos pueden contener grandes colecciones de polígonos, formas multipoligonales y linestrings para representar componentes complejos, como rutas, parcelas de terreno y zonas de inundación. 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 generar un resultado. Para algunas operaciones, el algoritmo visita todos los puntos. En el caso de las formas complejas, visitar cada punto puede aumentar el costo 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 comunes y mejorar el rendimiento y reducir el costo.
En este documento, se da por sentado que tus tablas geoespaciales de BigQuery están agrupadas en una columna de ubicación geográfica.
Simplifica las formas
Práctica recomendada: Usa las funciones de simplificación y ajuste a la cuadrícula para almacenar una versión simplificada de tu conjunto de datos original como una vista materializada.
Muchas formas complejas con grandes cantidades de puntos se pueden simplificar sin grandes péridas de precisión. Usa las funciones ST_SIMPLIFY
y ST_SNAPTOGRID
de BigQuery por separado o juntas para reducir la cantidad de puntos en 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 mantiene automáticamente actualizada en función de la tabla base.
La simplificación de las formas es más útil para mejorar el costo y el rendimiento de un conjunto de datos en los siguientes casos de uso:
- Debes mantener un alto grado de similitud con la forma real.
- Debes realizar operaciones de alta precisión.
- Quieres acelerar las visualizaciones sin pérdidas visibles en los detalles de la forma.
En la siguiente muestra 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 quita puntos sin alterar ningún borde de una forma más que la tolerancia determinada 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 la siguiente muestra 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
en esta función funciona como exponente, lo que significa 10e-5 = 0.00001. Esta resolución equivale a alrededor de 1 metro en el peor caso, que ocurre 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 una colección de formas que se deben analizar con más detalle y, luego, realizar un segundo análisis más detallado en la tabla base. Prueba tus consultas para ver qué valores de umbral funcionan mejor para tus datos.
En el caso de los casos de uso de medición, determina el nivel de exactitud que requiere tu caso de uso. Cuando uses la función ST_SIMPLIFY
, establece el parámetro threshold_meters
en el nivel de exactitud requerido. Para medir distancias a la escala de una ciudad o más, establece un umbral de 10 metros. En escalas más pequeñas, por ejemplo, cuando se mide la distancia entre un edificio y el cuerpo de agua más cercano, se recomienda usar un umbral más pequeño de 1 metro o menos. El uso de valores de umbral más pequeños quita menos puntos de la forma determinada.
Cuando publicas capas de mapas desde un servicio web, puedes precalcular las vistas materializadas para diferentes niveles de zoom con el proyecto bigquery-geotools, que es un controlador de Geoserver que te permite publicar capas espaciales desde BigQuery. Este controlador crea varias vistas materializadas con diferentes parámetros de umbral de ST_SIMPLIFY
para que se entreguen menos detalles en niveles de zoom más altos.
Usa puntos y rectángulos
Práctica recomendada: Reduce la forma a un punto o un rectángulo para representar su ubicación.
Para mejorar el rendimiento de las consultas, reduce 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 su extensión, que puedes usar para representar su ubicación y mantener información sobre su tamaño relativo.
El uso de puntos y rectángulos es más útil para mejorar el costo y el rendimiento de un conjunto de datos cuando necesitas medir la distancia entre dos puntos, como entre dos ciudades.
Por ejemplo, considera cargar una base de datos de parcelas de terreno en Estados Unidos en una tabla de BigQuery y, luego, determinar el cuerpo de agua más cercano.
En este caso, el procesamiento previo de los centroides de parcela con la función ST_CENTROID
en combinación con el método que se describe en la sección Simplificar formas de este documento puede reducir la cantidad de comparaciones que se realizan cuando se usan las funciones ST_DISTANCE
o ST_DWITHIN
. Cuando se usa la función ST_CENTROID
, se debe considerar el centroide del parcel en el cálculo. El procesamiento previo de los centroides de parcela de esta manera también puede reducir la variabilidad en el rendimiento, ya que es probable que diferentes formas de parcela contengan diferentes cantidades 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 sobre rectangular alrededor de la forma de entrada. Si bien no es tan eficiente como usar un solo punto, puede reducir la ocurrencia de ciertos casos extremos. Esta variante aún ofrece un rendimiento bueno y coherente, ya que el resultado de la función ST_BOUNDINGBOX
siempre contiene solo cuatro puntos que se deben tener en cuenta. El resultado del cuadro delimitador será del tipo STRUCT
, lo que significa que deberás calcular las distancias de forma manual o usar el método de índice vectorial que se describe más adelante en este documento.
Usa envolventes
Práctica recomendada: Usa una envolvente para optimizar la representación de la ubicación de una forma.
Si imaginas que se une una forma y se calcula el límite de la unión, ese límite se denomina envolvente. En una envolvente convexa, todos los ángulos de la forma resultante son convexos. Al igual que el alcance de una forma, una envolvente convexa retiene cierta información sobre el tamaño y las proporciones relativos de la forma subyacente. Sin embargo, el uso de una envolvente implica la necesidad de almacenar y considerar más puntos en análisis posteriores.
Puedes usar la función ST_CONVEXHULL
para optimizar la representación de la ubicación de la forma. El uso de esta función mejora la exactitud, pero esto se logra a costa de un rendimiento menor. La función ST_CONVEXHULL
es similar a la función ST_EXTENT
, excepto que la forma de salida contiene más puntos y varía en la cantidad de puntos según la complejidad de la forma de entrada. Si bien es probable que el beneficio de rendimiento sea despreciable para conjuntos de datos pequeños de formas no complejas, para conjuntos de datos muy grandes con formas grandes y complejas, la función ST_CONVEXHULL
ofrece un buen equilibrio entre costo, rendimiento y exactitud.
Usa sistemas de cuadrícula
Práctica recomendada: Usa sistemas de cuadrículas geoespaciales para comparar áreas.
Si tus casos de uso implican la agregación de datos dentro de áreas localizadas y la comparación de las agregaciones estadísticas de esas áreas entre sí, puedes beneficiarte de usar un sistema de cuadrícula estandarizado para comparar diferentes áreas.
Por ejemplo, un minorista podría querer analizar los cambios demográficos a lo largo del tiempo en las áreas donde se encuentran sus tiendas o donde está considerando construir una tienda nueva. O bien, una empresa de seguros podría querer mejorar su comprensión de los riesgos de propiedad analizando los riesgos de peligros naturales predominantes en un área en particular.
El uso de sistemas de cuadrícula estándar, como S2 y H3, puede acelerar esas agregaciones estadísticas y análisis espaciales. El uso de estos sistemas de cuadrícula también puede simplificar el desarrollo de las estadísticas y mejorar la eficiencia del desarrollo.
Por ejemplo, las comparaciones que usan distritos censales en Estados Unidos sufren de inconsistencias en el tamaño, lo que significa que se deben aplicar factores correctivos para realizar comparaciones similares entre distritos censales. Además, los tramos censales y otros límites administrativos cambian con el tiempo y requieren un esfuerzo para corregir estos cambios. El uso de sistemas de cuadrícula para el análisis espacial puede abordar esos desafíos.
Usa la búsqueda de vectores y los índices de vectores
Práctica recomendada: Usa la búsqueda vectorial y los índices vectoriales para las consultas geoespaciales de vecino más cercano.
Las capacidades de búsqueda de vectores se presentaron en BigQuery para habilitar casos de uso de aprendizaje automático, como la búsqueda semántica, la detección de similitud y la generación de recuperación aumentada. La clave para habilitar estos casos de uso es un método de indexación llamado búsqueda de vecino más cercano aproximado. Puedes usar la búsqueda vectorial para acelerar y simplificar las consultas geoespaciales de vecino más cercano comparando vectores que representan puntos en el espacio.
Puedes usar la búsqueda de vectores para buscar componentes 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 vecino más cercano. Después de establecer el radio, usa la función ST_DWITHIN
para identificar los componentes cercanos.
Por ejemplo, considera encontrar los diez edificios más cercanos a un edificio de referencia particular del que ya tienes la ubicación. Puedes almacenar los centroides de cada edificio como un vector en una tabla nueva, indexarla y realizar búsquedas con la búsqueda de vectores.
En este ejemplo, también puedes usar datos de Overture Maps en BigQuery para crear una tabla independiente de formas de edificios correspondientes a un área de interés y un vector llamado geom_vector
. El área de interés en este ejemplo es la ciudad de Norfolk, Virginia, Estados Unidos, representada por el código FIPS 51710, como se muestra en la siguiente muestra de código:
CREATE TABLE geo-solution-demos.vector_search.norfolk_buildings
AS (
SELECT
*,
[
ST_X(ST_CENTROID(building.geometry)),
ST_Y(ST_CENTROID(building.geometry))] AS geom_vector
FROM geo-solution-demos.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 la siguiente muestra de código, se muestra cómo crear un índice vectorial en la tabla:
CREATE
vector index building_vector_index
ON
`geo-solution-demos.vector_search.norfolk_buildings`(geom_vector)
OPTIONS (index_type = 'IVF')
Esta consulta identifica los 10 edificios más cercanos a un edificio de referencia en particular, que se representa como anchor_building_id
:
declare anchor_building_id STRING;
SET anchor_building_id = '08b2af6202ce5fff02007d1778948bc4';
SELECT base.*
FROM
VECTOR_SEARCH(
TABLE `geo-solution-demos.vector_search.norfolk_buildings`,
'geom_vector',
(
SELECT
geom_vector
FROM
`geo-solution-demos.vector_search.norfolk_buildings`
WHERE id = anchor_building_id
),
top_k => 10,
distance_type => 'EUCLIDEAN',
options => '{"fraction_lists_to_search":0.1}')
Cuando ves los datos geoespaciales en BigQuery Geo Viz, el resultado es un clúster de formas de edificios más cercanas al edificio de anclaje, como se muestra en la siguiente imagen:
Cuando ejecutes esta consulta en la consola de Google Cloud, haz clic en Información del trabajo y verifica que el Modo de uso del índice vectorial esté configurado en FULLY_USED
. Esto indica que la consulta aprovecha el índice de vectores building_vector_index
, que creaste antes.
Divide 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.
¿Qué sigue?
- Obtén información para usar sistemas de cuadrícula para el análisis espacial.
- Obtén más información sobre las funciones de ubicación geográfica de BigQuery.
- Obtén información para administrar índices de vectores.
- Obtén más información sobre las prácticas recomendadas para el indexado y el agrupamiento espacial en BigQuery.
- Para obtener más información sobre cómo analizar y visualizar datos geoespaciales en BigQuery, consulta Comienza a usar las estadísticas geoespaciales.