Bonnes pratiques pour l'analyse spatiale

Ce document décrit les bonnes pratiques à adopter 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 segments de ligne pour représenter des éléments géographiques complexes (par exemple, 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 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 suppose que vos tables géospatiales BigQuery sont mises en cluster sur une colonne de géographie.

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 perdre en 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 aux 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 les coûts 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 sur les formes.

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

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, qui se produit à l'équateur.

Une fois ces vues créées, 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 le tableau 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 à un 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 matérialisées 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 diffuser moins de détails à 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 seul point 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 son étendue, que vous pouvez utiliser pour représenter son emplacement et conserver des informations sur sa taille relative.

L'utilisation de points et de rectangles est particulièrement utile pour améliorer les coûts 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, imaginez que vous chargez une base de données de parcelles de terrain aux États-Unis dans une table BigQuery, puis que vous déterminez le plan d'eau le plus proche. Dans ce cas, le précalcul des centroids de parcelle à 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 lorsque vous utilisez les fonctions ST_DISTANCE ou ST_DWITHIN. Lorsque vous utilisez la fonction ST_CENTROID, le centroïde de la parcelle doit être pris en compte dans le calcul. Précalculer les centroids de parcelle de cette manière peut également réduire la variabilité des performances, car les parcelles de différentes formes sont susceptibles de contenir des nombres différents de points.

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'il ne soit pas aussi efficace que l'utilisation d'un seul point, il peut réduire l'occurrence de certains cas particuliers. Cette variante offre toujours de bonnes performances cohérentes, car la sortie de la fonction ST_BOUNDINGBOX ne contient toujours que quatre points à prendre en compte. Le résultat de la cadre de délimitation sera de type STRUCT, ce qui signifie que vous devrez calculer les distances manuellement ou utiliser la méthode d'index vectoriel décrite plus loin dans ce document.

Utiliser des coques

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

Si vous imaginez emballer une forme dans un film étirable et calculer la limite de ce film, cette limite s'appelle la coque. Dans un enveloppe convexe, tous les angles de la forme résultante 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 coque implique de stocker et de prendre en compte davantage de points dans les analyses ultérieures.

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, à l'exception que la forme de sortie contient plus de points et que leur nombre 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, pour les ensembles de données très volumineux avec des formes grandes et complexes, la fonction ST_CONVEXHULL offre un bon équilibre entre coût, performances et précision.

Utiliser des systèmes de grille

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

Si vos cas d'utilisation impliquent d'agréger des données dans des zones localisées et de comparer les agrégations statistiques de ces zones les unes aux autres, 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 ouvrir un nouveau. Une compagnie d'assurance peut également vouloir améliorer sa compréhension des risques liés aux biens en analysant les risques naturels prédominants dans une zone donnée.

L'utilisation de systèmes de grilles 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 secteurs de recensement aux États-Unis souffrent d'une incohérence de taille, ce qui signifie que des facteurs correctifs doivent être appliqués pour effectuer des comparaisons entre secteurs de recensement. De plus, les secteurs de recensement et d'autres limites administratives changent au fil du temps et nécessitent des efforts pour corriger ces changements. L'utilisation de systèmes de grille pour l'analyse spatiale peut répondre à ces défis.

Utiliser la recherche vectorielle et les index vectoriels

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 de machine learning tels que la recherche sémantique, la détection de similarités et la génération augmentée. La clé pour activer ces cas d'utilisation est une méthode d'indexation appelée recherche du voisin le plus proche approximative. Vous pouvez utiliser la recherche vectorielle pour accélérer et simplifier les requêtes géospatiales de voisin le plus proche en comparant des vecteurs qui représentent des points dans l'espace.

Vous pouvez utiliser la recherche vectorielle pour rechercher des éléments géographiques en fonction du rayon. Commencez par définir un rayon pour votre recherche. Vous pouvez découvrir le rayon optimal dans l'ensemble de résultats d'une recherche des plus proches voisins. Une fois le rayon défini, utilisez la fonction ST_DWITHIN pour identifier les éléments à proximité.

Par exemple, imaginez que vous souhaitiez trouver 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 centroïdes de chaque bâtiment en tant que vecteur dans une nouvelle table, indexer la table et effectuer une recherche à l'aide de la recherche vectorielle.

Pour cet exemple, vous pouvez également utiliser les données Overture Maps dans BigQuery pour créer une table distincte des 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 (Virginie, É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 de vecteur sur le tableau:

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 amas 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 la tâche et vérifiez que 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