Lors de la conférence utilisateur Esri 2026, nous avons entendu plusieurs personnes dire qu'elles aimeraient intégration de données externes sans copie. Cela signifie des données en direct fournies à la demande dans ArcGIS sans être écrites dans une copie ETL, et idéalement aussi sans aucun serveur intermédiaire. C'est une étape au-delà de la virtualisation des données, où un cache pourrait être conservé (pour une très bonne raison, à savoir la performance d'affichage). Donnez-moi simplement les données dans ma carte ont-ils dit.
D'accord, les voici.
Ce que vous regardez est Overture Maps Foundation Places données thématiques lues depuis AWS S3 et livrées dans une couche mémoire ArcGIS Pro, dans l'étendue actuelle de la carte, en quelques secondes.
Pas de copie intermédiaire, pas de serveur de base de données dans la chaîne de livraison.
Pour prendre un peu de recul, je suis un peu ambitieux avec le titre du blog, ceci n'est pas une édition prise en charge de Query Layer, mais cela peut être une approximation "suffisamment bonne" pour de nombreux cas d'utilisation, et pas seulement pour une session - vous pouvez actualiser les données à la demande.Comment cela fonctionne-t-il ? Dans la pièce jointe du blog se trouve une boîte à outils ArcGIS Pro 3.7 contenant un outil script
Make Serverless Query Layer avec deux paramètres d'entrée, une clause where filtrant les données téléchargées, et un booléen qui détermine si le schéma de sortie a des champs texte avec une largeur par défaut ou une largeur déduite des données, que j'appelle "réglage".Les données source, la détection de l'étendue de la carte et la définition de la vue sont codées en dur dans l'outil.
Voici à quoi ressemble la requête de définition de vue :
# Requête S3
query = f"""select
id,
names.primary as primary_name,
basic_category,
taxonomy.primary as primary_category,
brand.names.primary as primary_brand,
concat_ws(',',brand.names.common) as other_brands,
concat_ws(' ',addresses[1].freeform,addresses[1].locality,addresses[1].postcode,addresses[1].region,addresses[1].country) as address,
array_to_string(taxonomy.hierarchy,' > ') as taxonomy_hierarchy,
array_to_string(websites,' ') as websites,
array_to_string(emails,' ') as emails,
array_to_string(socials,' ') as socials,
array_to_string(phones,' ') as phones,
operating_status,
confidence,
ST_AsWKB(geometry) as shape,
from read_parquet('s3:\/\/overturemaps-us-west-2\/release\/{release}\/theme=places\/type=place\/*.parquet',filename=false,hive_partitioning=1)
where ST_Intersects(geometry,ST_MakeEnvelope({xmin},{ymin},{xmax},{ymax}))
and bbox.xmin >= {xmin} and bbox.ymin >= {ymin} and bbox.xmax <= {xmax} and bbox.ymax <= {ymax}
and {where};"""
Nous
interrogeons GeoParquet dans S3 en utilisant DuckDB, donc la syntaxe SQL que vous voyez ci-dessus est pour DuckDB. Non montré, lecture du nom de version Overture depuis un catalogue STAC maintenu par Overture afin que nous puissions injecter la valeur dans la chaîne f de la requête.Points à souligner dans le code :
Les fonctions SQL DuckDB sont utilisées
- Les colonnes complexes sont aplaties en une seule valeur, pour plus de simplicité
- À la fois l'opérateur spatial
- ST_Intersects et une structure bbox sont interrogésCeci est temporaire jusqu'à ce que les
- statistiques géométriques du groupe de lignes GeoParquet 2.0.0
soient disponiblesJe vous laisse inspecter le code de l'outil script à votre convenance, mais un autre aspect notable est que les données sont lues dans une table Apache Arrow
, en route vers devenir une classe d'entités mémoire. Les tables Arrow peuvent être utilisées à la place des classes d'entités natives ArcGIS comme paramètres de géotraitement, cependant j'ai trouvé un bug qui nécessite un double traitement des données (faire passer les données par une classe d'entités mémoire séparée plutôt que de les ajouter directement à ma sortie cible) donc vous pouvez vous attendre à des performances plus rapides lorsque cela sera corrigé.
Pour exécuter l'outil, ajoutez d'abord la boîte à outils jointe au blog à votre projet, puis activez une carte ou scène à une étendue qui vous intéresse - en vous rappelant que toutes les données Places dans l'étendue seront lues en utilisant la clause where par défaut "1 = 1" - puis choisissez si vous souhaitez régler (ou non) les champs texte et cliquez sur Exécuter. Essayez les clauses where d'exemple dans l'outil script :
Voici environ 5 400 épiceries dans le grand Londres, GB lorsque ma carte était à l'échelle 1:500K au moment de l'exécution :
Concernant le réglage des champs texte dans les données : Les formats basés sur fichiers (par exemple GeoParquet, CSV, JSON) ne sont généralement pas accompagnés d'une définition de schéma (à l'exception d'EsriJSON). Dans ArcGIS, différents outils font différents choix concernant les largeurs des champs texte, ce qui peut conduire à ce qu'on appelle dans l'industrie un "schéma pathologique", par exemple des données non réglées dans cet exemple créeraient des champs texte larges de 5000 octets. Ce n'est généralement pas un problème, mais cela peut dépendre de là où les données vont en aval, comme des performances plus lentes dans une géodatabase ou un service d'entités pour les big data. Comme nous ne traitons probablement pas des big data avec cet exemple, vous pouvez probablement choisir de ne pas régler les sorties, mais en tout cas vous avez une approche alternative.Si vous avez vraiment des colonnes à l'échelle documentaire dans vos données, vous pouvez exécuter l'outil sans réglage puis exécuter ensuite Export Features