Práticas recomendadas para análise espacial

Este documento descreve as práticas recomendadas para otimizar a performance de consultas geoespaciais no BigQuery. É possível usar essas práticas recomendadas para melhorar o desempenho e reduzir o custo e a latência.

Os conjuntos de dados podem conter grandes coleções de polígonos, formas com vários polígonos e cadeias de linhas para representar atributos complexos, por exemplo, estradas, lotes de terra e zonas de inundação. Cada forma pode conter milhares de pontos. Na maior parte dos ambientes operações no BigQuery (por exemplo, interseções e distância cálculos), o algoritmo subjacente geralmente visita a maioria dos pontos em cada forma para produzir um resultado. Para algumas operações, o algoritmo visita todos os pontos. Para formas complexas, a visita a cada ponto pode aumentar o custo e a duração das operações espaciais. Você pode usar as estratégias e os métodos apresentados neste guia para otimizar essas operações espaciais comuns e melhorar o desempenho e reduzir custos.

Neste documento, consideramos que suas tabelas geoespaciais do BigQuery são agrupados em uma coluna geográfica.

Simplificar formas

Prática recomendada: use as funções de simplificação e ajuste à grade para armazenar uma versão simplificada do seu conjunto de dados original como uma visualização materializada.

Muitas formas complexas com um grande número de pontos podem ser simplificadas sem muito perda de precisão. Usar o BigQuery ST_SIMPLIFY e ST_SNAPTOGRID separadamente ou juntas para reduzir o número de pontos em formas complexas. Combine essas funções com o BigQuery visualizações materializadas para armazenar uma versão simplificada do conjunto de dados original como uma visualização materializada que é são atualizadas automaticamente em relação à tabela base.

Simplificar formas é mais útil para melhorar o custo e o desempenho de um conjunto de dados nos seguintes casos de uso:

  • Você precisa manter um alto grau de semelhança com a forma verdadeira.
  • Você precisa executar operações de alta precisão e alta precisão.
  • Você quer acelerar as visualizações sem perda visível nos detalhes de formas.

O exemplo de código a seguir mostra como usar a função ST_SIMPLIFY em uma base tabela que tem uma coluna GEOGRAPHY chamada geom. O código simplifica formas e remove pontos sem perturbar as bordas de uma forma em mais que a tolerância de 1 metro.

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

O exemplo de código abaixo mostra como usar a função ST_SNAPTOGRID para fixar os pontos em uma grade com uma resolução de 0,00001 graus:

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

O argumento grid_size nesta função serve como o expoente, o que significa 10e-5 = 0,00001. Essa resolução equivale a cerca de 1 metro no pior cenário, que ocorre no equador.

Depois de criar essas visualizações, consulte a visualização base_mv usando a mesma consulta. semântica que você usaria para consultar a tabela base. Use essa técnica para identificar rapidamente uma coleção de formas que precisam ser analisadas mais profundamente, para depois realizar uma segunda análise mais profunda na tabela base. Teste suas consultas para saber quais valores de limite funcionam melhor para seus dados.

Para casos de uso de medição, determine o nível de precisão necessário. Ao usar a função ST_SIMPLIFY, defina o parâmetro threshold_meters como o nível de precisão necessário. Para medir distâncias na escala de uma cidade ou mais, defina o limite de 10 metros. Em escalas menores, por exemplo, ao medir a distância entre um edifício e o corpo mais próximo de água. Use um limite menor, de 1 metro ou menos. O uso de valores de limite menores resulta na remoção de menos pontos da forma especificada.

Ao exibir camadas de mapa em um serviço da Web, é possível pré-calcular visualizações para diferentes níveis de zoom com o projeto bigquery-geotools, que é um driver para o Geoserver que permite exibir camadas espaciais de no BigQuery. Esse driver cria várias visualizações materializadas com diferentes parâmetros de limite ST_SIMPLIFY para que menos detalhes sejam exibidos em níveis de zoom mais altos.

Usar pontos e retângulos

Prática recomendada: reduza a forma a um ponto ou retângulo para representar o o local.

É possível melhorar a performance da consulta reduzindo a forma a um único ponto ou retângulo. Os métodos desta seção não representam os detalhes com precisão e proporções da forma, mas otimizar para representar o local da forma.

Você pode usar o ponto central geográfico de uma forma (o centroide) para representar a localização de toda a forma. Use um retângulo que contenha a forma para criar a extensão dela, que pode ser usada para representar a localização da forma e manter informações sobre o tamanho relativo.

O uso de pontos e retângulos é mais útil para melhorar o custo e o desempenho de um conjunto de dados quando você precisa medir a distância entre dois pontos, como entre duas cidades.

Por exemplo, considere carregar um banco de dados de lotes de terra nos Estados Unidos em uma tabela do BigQuery e determinar o corpo de água mais próximo. Nesse caso, a pré-computação dos centroides de lotes usando a ST_CENTROID em combinação com o método descrito na seção Simplificar formas deste documento pode reduzir a o número de comparações realizadas com o ST_DISTANCE ou ST_DWITHIN . Ao usar a função ST_CENTROID, o centroide do pacote precisa ser considerado no cálculo. A pré-computação dos centroides de pacotes dessa maneira também pode reduzir a variabilidade no desempenho, porque diferentes formas de pacotes provavelmente contêm números diferentes de pontos.

Uma variante desse método é usar o método ST_BOUNDINGBOX em vez da função ST_CENTROID para calcular um envelope retangular ao redor da forma de entrada. Embora não seja tão eficiente quanto usar um único ponto, ele pode reduzir a ocorrência de alguns casos extremos. Essa variante ainda oferece performance boa e consistente, já que a saída da função ST_BOUNDINGBOX sempre contém apenas quatro pontos que precisam ser considerados. O resultado da caixa delimitadora será do tipo STRUCT, o que significa que você vai precisar calcular as distâncias manualmente ou usar o método de índice de vetor descrito mais adiante neste documento.

Usar cascos

Prática recomendada: use um casco para otimizar a representação do local de uma forma.

Imagine encobrir uma forma e calcular o limite da redução esse limite é chamado de casco. Em um envolvente convexo, todos os ângulos da forma resultante são convexos. Assim como a extensão de uma forma, um casco convexo retém um pouco informações sobre o tamanho e as proporções relativas da forma subjacente. No entanto, o uso de um casco tem o custo de precisar armazenar e considerar mais pontos em análises subsequentes.

Você pode usar a função ST_CONVEXHULL para otimizar a representação do localização do polígono. O uso dessa função melhora a precisão, mas isso custa a diminuição do desempenho. A função ST_CONVEXHULL é semelhante a ST_EXTENT exceto que a forma final contém mais pontos e varia no número de pontos com base na complexidade da forma de entrada. Embora o benefício de desempenho seja provavelmente insignificante para pequenos conjuntos de dados de formas não complexas, para conjuntos de dados muito grandes com formas grandes e complexas, a função ST_CONVEXHULL oferece um bom equilíbrio entre custo, desempenho e precisão.

Usar sistemas de grade

Prática recomendada: use sistemas de grade geoespacial para comparar áreas.

Se seus casos de uso envolvem a agregação de dados em áreas localizadas e a comparação de agregações estatísticas dessas áreas entre si, você pode usar um sistema de grade padronizado para comparar áreas diferentes.

Por exemplo, um varejista pode querer analisar as mudanças demográficas ao longo do tempo nas áreas em que as lojas estão localizadas ou em que ele está pensando em construir uma nova loja. Uma seguradora pode querer melhorar a compreensão de riscos de propriedade analisando riscos de perigo natural predominantes em uma área específica.

O uso de sistemas de grade padrão, como S2 e H3, pode acelerar essas agregações estatísticas e análises espaciais. O uso desses sistemas de grade também pode simplificar o desenvolvimento de análises e melhorar a eficiência do desenvolvimento.

Por exemplo, as comparações usando setores censitários nos Estados Unidos tenham inconsistência de tamanho, o que significa que é necessário aplicar fatores corretivos aplicada para realizar comparações semelhantes entre setores censitários. Além disso, setores censitários e outros limites administrativos mudam com o tempo e exigem para corrigir essas mudanças. Usar sistemas de grade para análise espacial pode esses desafios.

Usar a pesquisa vetorial e os índices de vetor

Prática recomendada: use a pesquisa vetorial e os índices vetoriais para consultas geoespaciais de vizinhos mais próximos.

Os recursos de pesquisa vetorial eram introduzidos no BigQuery para permitir casos de uso de machine learning, como pesquisa semântica, detecção de similaridade e geração aumentada de recuperação. A chave para ativar esses casos de uso é um método de indexação chamado pesquisa aproximada de vizinho mais próximo. É possível usar a pesquisa vetorial para acelerar e simplificar as consultas geoespaciais de vizinho mais próximo comparando vetores que representam pontos no espaço.

A pesquisa vetorial pode ser usada para buscar elementos por raio. Primeiro, estabeleça uma para sua pesquisa. Você pode descobrir o raio ideal no conjunto de resultados de para procurar um vizinho mais próximo. Depois de definir o raio, use o método ST_DWITHIN para identificar elementos próximos.

Por exemplo, considere encontrar os dez prédios mais próximos de uma construção de âncora ao qual você já tem o local. É possível armazenar os centroides de cada edifício como um vetor em uma nova tabela, indexar a tabela e pesquisar usando a pesquisa vetorial.

Para este exemplo, você também pode usar Dados do Maps de abertura no BigQuery para criar uma tabela separada de formas de construção correspondentes a uma área de interesse e um vetor chamado geom_vector. A área de interesse neste exemplo é a cidade de Norfolk, VA, Estados Unidos, representada pelo código FIPS 51710, conforme mostrado no exemplo de código abaixo:

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'
)

O exemplo de código a seguir mostra como criar um índice de vetor na tabela:

CREATE
  vector index building_vector_index
ON
  `geo-solution-demos.vector_search.norfolk_buildings`(geom_vector)
  OPTIONS (index_type = 'IVF')

Esta consulta identifica as 10 construções mais próximas a uma âncora específica que é representado 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}')

Quando você visualiza os dados geoespaciais BigQuery Geo Viz, a saída é um cluster de formas de construções mais próximas à construção da âncora, conforme exibido na seguinte imagem:

Dados geoespaciais visualizados no BigQuery Geo Viz.

Ao executar essa consulta no console do Google Cloud, clique em Informações do job e verifique se o Modo de uso do índice vetorial está definido como FULLY_USED. Isso indica que a consulta está aproveitando o índice de vetor building_vector_index, que você que criamos antes.

Dividir formas grandes

Prática recomendada: divida formas grandes com a função ST_SUBDIVIDE.

Use a função ST_SUBDIVIDE para dividir formas grandes ou strings de linhas longas em formas menores.

A seguir