Bonnes pratiques pour l'analyse spatiale

Ce document décrit les bonnes pratiques à suivre pour optimiser les performances des requêtes géospatiales dans BigQuery. Vous pouvez utiliser ces bonnes pratiques pour améliorer les performances, et réduire les coûts et la latence.

Les ensembles de données peuvent contenir de grandes collections de polygones, de formes multipolygones et de linéaires pour représenter des éléments géographiques complexes, tels que des routes, des parcelles de terrain et des zones inondables. Chaque forme peut contenir des milliers de points. Dans la plupart des opérations spatiales de BigQuery (par exemple, les intersections et les calculs de distance), l'algorithme sous-jacent visite généralement la majorité des points de chaque forme pour produire un résultat. Pour certaines opérations, l'algorithme visite tous les points. Pour les formes complexes, l'accès à chaque point peut augmenter le coût et la durée des opérations spatiales. Vous pouvez utiliser les stratégies et les méthodes présentées dans ce guide pour optimiser ces opérations spatiales courantes afin d'améliorer les performances et de réduire les coûts.

Ce document part du principe que vos tables géospatiales BigQuery sont regroupées dans une colonne géographique.

Simplifier les formes

Bonne pratique : Utilisez les fonctions de simplification et d'ancrage à la grille pour stocker une version simplifiée de votre ensemble de données d'origine en tant que vue matérialisée.

De nombreuses formes complexes comportant un grand nombre de points peuvent être simplifiées sans trop de perte de précision. Utilisez les fonctions BigQuery ST_SIMPLIFY et ST_SNAPTOGRID séparément ou ensemble pour réduire le nombre de points dans des formes complexes. Combinez ces fonctions avec les vues matérialisées BigQuery pour stocker une version simplifiée de votre ensemble de données d'origine en tant que vue matérialisée automatiquement mise à jour par rapport à la table de base.

La simplification des formes est particulièrement utile pour améliorer le coût et les performances d'un ensemble de données dans les cas d'utilisation suivants :

  • Vous devez conserver un degré de similitude élevé avec la forme réelle.
  • Vous devez effectuer des opérations de haute précision.
  • Vous souhaitez accélérer les visualisations sans perdre de détails dans les formes.

L'exemple de code suivant montre comment utiliser la fonction ST_SIMPLIFY sur une table de base comportant une colonne GEOGRAPHY nommée geom. Le code simplifie les formes et supprime les points sans modifier les bords d'une forme de plus de 1 mètre.

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

L'exemple de code suivant montre comment utiliser la fonction ST_SNAPTOGRID pour aligner les points sur une grille avec une résolution de 0,00001 degrés :

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

L'argument grid_size de cette fonction sert d'exposant, ce qui signifie que 10e-5 = 0,00001. Cette résolution équivaut à environ 1 mètre dans le pire des cas, c'est-à-dire à l'équateur.

Après avoir créé ces vues, interrogez la vue base_mv à l'aide de la même sémantique de requête que celle que vous utiliseriez pour interroger la table de base. Vous pouvez utiliser cette technique pour identifier rapidement un ensemble de formes qui doivent être analysées plus en détail, puis effectuer une deuxième analyse plus approfondie sur la table de base. Testez vos requêtes pour déterminer les valeurs de seuil les plus adaptées à vos données.

Pour les cas d'utilisation de mesure, déterminez le niveau de précision requis. Lorsque vous utilisez la fonction ST_SIMPLIFY, définissez le paramètre threshold_meters sur le niveau de précision requis. Pour mesurer des distances à l'échelle d'une ville ou plus, définissez un seuil de 10 mètres. À des échelles plus petites (par exemple, lorsque vous mesurez la distance entre un bâtiment et le plan d'eau le plus proche), envisagez d'utiliser un seuil inférieur à 1 mètre. Si vous utilisez des valeurs de seuil plus faibles, vous supprimez moins de points de la forme donnée.

Lorsque vous diffusez des calques de carte à partir d'un service Web, vous pouvez précalculer des vues mises en cache pour différents niveaux de zoom avec le projet bigquery-geotools, qui est un pilote pour Geoserver qui vous permet de diffuser des calques spatiaux à partir de BigQuery. Ce pilote crée plusieurs vues matérialisées avec différents paramètres de seuil ST_SIMPLIFY afin de réduire le niveau de détail à des niveaux de zoom plus élevés.

Utiliser des points et des rectangles

Bonne pratique : Réduisez la forme à un point ou un rectangle pour représenter son emplacement.

Vous pouvez améliorer les performances des requêtes en réduisant la forme à un point unique ou à un rectangle. Les méthodes de cette section ne représentent pas précisément les détails et les proportions de la forme, mais optimisent la représentation de l'emplacement de la forme.

Vous pouvez utiliser le point central géographique d'une forme (son centroïde) pour représenter l'emplacement de l'ensemble de la forme. Utilisez un rectangle contenant la forme pour créer l'étendue de la forme, que vous pouvez utiliser pour représenter l'emplacement de la forme et conserver des informations sur sa taille relative.

L'utilisation de points et de rectangles est particulièrement utile pour améliorer le coût et les performances d'un ensemble de données lorsque vous devez mesurer la distance entre deux points, par exemple entre deux villes.

Par exemple, vous pouvez charger une base de données de parcelles aux États-Unis dans une table BigQuery, puis déterminer le plan d'eau le plus proche. Dans ce cas, le précalcul des centroïdes de parcelles à l'aide de la fonction ST_CENTROID en combinaison avec la méthode décrite dans la section Simplifier les formes de ce document peut réduire le nombre de comparaisons effectuées lors de l'utilisation des fonctions ST_DISTANCE ou ST_DWITHIN. Lorsque vous utilisez la fonction ST_CENTROID, le calcul doit tenir compte du centre de gravité du lot. Le précalcul des centroïdes de parcelles de cette manière peut également réduire la variabilité des performances, car les différentes formes de parcelles sont susceptibles de contenir un nombre de points différent.

Une variante de cette méthode consiste à utiliser la fonction ST_BOUNDINGBOX au lieu de la fonction ST_CENTROID pour calculer une enveloppe rectangulaire autour de la forme d'entrée. Bien qu'elle ne soit pas aussi efficace que l'utilisation d'un seul point, elle peut réduire l'occurrence de certains cas particuliers. Cette variante offre toujours de bonnes performances constantes, car la sortie de la fonction ST_BOUNDINGBOX ne contient toujours que quatre points à prendre en compte. Le résultat de la zone de délimitation est de type STRUCT, ce qui signifie que vous devez calculer les distances manuellement ou utiliser la méthode d'index vectoriel décrite plus loin dans ce document.

Utiliser des enveloppes

Bonne pratique : Utilisez une enveloppe pour optimiser la représentation de l'emplacement d'une forme.

Si vous imaginez que vous réduisez une forme et que vous calculez la limite de la réduction, cette limite est appelée enveloppe. Dans une enveloppe convexe, tous les angles de la forme obtenue sont convexes. Comme l'étendue d'une forme, une enveloppe convexe conserve certaines informations sur la taille et les proportions relatives de la forme sous-jacente. Toutefois, l'utilisation d'une enveloppe nécessite de stocker et de prendre en compte davantage de points dans les analyses suivantes.

Vous pouvez utiliser la fonction ST_CONVEXHULL pour optimiser la représentation de l'emplacement de la forme. L'utilisation de cette fonction améliore la précision, mais au détriment des performances. La fonction ST_CONVEXHULL est semblable à la fonction ST_EXTENT, sauf que la forme de sortie contient plus de points et que le nombre de points varie en fonction de la complexité de la forme d'entrée. Bien que l'avantage en termes de performances soit probablement négligeable pour les petits ensembles de données de formes non complexes, la fonction ST_CONVEXHULL offre un bon équilibre entre le coût, les performances et la précision pour les très grands ensembles de données avec des formes volumineuses et complexes.

Utiliser des systèmes de grille

Bonne pratique : Utilisez des systèmes de grille géospatiale pour comparer les zones.

Si vos cas d'utilisation impliquent l'agrégation de données dans des zones localisées et la comparaison des agrégations statistiques de ces zones, vous pouvez utiliser un système de grille standardisé pour comparer différentes zones.

Par exemple, un marchand peut vouloir analyser les changements démographiques au fil du temps dans les zones où se trouvent ses magasins ou où il envisage d'en créer un. Une compagnie d'assurance peut également vouloir mieux comprendre les risques liés aux biens en analysant les risques naturels prédominants dans une zone donnée.

L'utilisation de systèmes de grille standards tels que S2 et H3 peut accélérer ces agrégations statistiques et analyses spatiales. L'utilisation de ces systèmes de grille peut également simplifier le développement d'analyses et améliorer l'efficacité du développement.

Par exemple, les comparaisons utilisant des zones de recensement aux États-Unis souffrent d'une taille incohérente, ce qui signifie que des facteurs correctifs doivent être appliqués pour effectuer des comparaisons comparables entre les zones de recensement. De plus, les zones de recensement et les autres limites administratives changent au fil du temps et nécessitent des efforts pour les corriger. L'utilisation de systèmes de grille pour l'analyse spatiale peut résoudre ces problèmes.

Utiliser la recherche vectorielle et les index de vecteurs

Bonne pratique : Utilisez la recherche vectorielle et les index vectoriels pour les requêtes géospatiales de voisin le plus proche.

Les fonctionnalités de recherche vectorielle ont été introduites dans BigQuery pour permettre des cas d'utilisation du machine learning tels que la recherche sémantique, la détection de similarités et la génération augmentée. Pour activer ces cas d'utilisation, il est essentiel de mettre en œuvre une méthode d'indexation appelée recherche approximative du voisin le plus proche. Vous pouvez utiliser la recherche vectorielle pour accélérer et simplifier les requêtes géospatiales de voisin le plus proche en comparant les vecteurs qui représentent des points dans l'espace.

Vous pouvez utiliser la recherche vectorielle pour rechercher des éléments géographiques en fonction d'un rayon. Commencez par définir un rayon de recherche. Vous pouvez découvrir le rayon optimal dans l'ensemble de résultats d'une recherche de voisinage. Après avoir défini le rayon, utilisez la fonction ST_DWITHIN pour identifier les éléments à proximité.

Par exemple, vous pouvez rechercher les dix bâtiments les plus proches d'un bâtiment d'ancrage particulier dont vous connaissez déjà l'emplacement. Vous pouvez stocker les centres de gravité de chaque bâtiment en tant que vecteur dans une nouvelle table, indexer la table et effectuer une recherche vectorielle.

Pour cet exemple, vous pouvez également utiliser les données Overture Maps dans BigQuery pour créer une table distincte de formes de bâtiments correspondant à une zone d'intérêt et un vecteur appelé geom_vector. La zone d'intérêt dans cet exemple est la ville de Norfolk, en Virginie, aux États-Unis, représentée par le code FIPS 51710, comme illustré dans l'exemple de code suivant :

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

L'exemple de code suivant montre comment créer un indice vectoriel sur la table :

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

Cette requête identifie les 10 bâtiments les plus proches d'un bâtiment d'ancrage particulier, représenté par 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}')

Lorsque vous affichez les données géospatiales dans BigQuery Geo Viz, la sortie est un groupe de formes de bâtiments les plus proches du bâtiment d'ancrage, comme illustré dans l'image suivante :

Données géospatiales visualisées dans BigQuery Geo Viz.

Lorsque vous exécutez cette requête dans la console Google Cloud, cliquez sur Informations sur le job et vérifiez que le mode d'utilisation de l'index vectoriel est défini sur FULLY_USED. Cela indique que la requête exploite l'index de vecteur building_vector_index que vous avez créé précédemment.

Diviser de grandes formes

Bonne pratique : Divisez les grandes formes avec la fonction ST_SUBDIVIDE.

Utilisez la fonction ST_SUBDIVIDE pour diviser de grandes formes ou de longues chaînes de lignes en formes plus petites.

Étape suivante