Durante la Conferencia de Usuarios Esri 2026 escuchamos de varias personas que les gustaría integración de datos externos zero-copy. Eso significa datos en vivo entregados bajo demanda en ArcGIS sin ser escritos en una copia ETL, y idealmente también sin ningún servidor intermedio. Esto es un paso más allá de la virtualización de datos, donde se podría mantener una caché (por una muy buena razón, a saber, el rendimiento de visualización). Solo dame los datos en mi mapa dijeron.
OK, aquí está.
Lo que estás viendo es Overture Maps Foundation Places datos temáticos leídos desde AWS S3 y entregados en una capa de memoria de ArcGIS Pro, dentro de la extensión actual del mapa, en segundos.
Sin copia intermedia, sin servidor de base de datos en la cadena de entrega.
Para retroceder un poco, estoy siendo un poco ambicioso con el título del blog, esta no es una edición soportada de Query Layer, pero puede ser una aproximación "suficientemente buena" para muchos casos de uso, y no solo para una sesión: puedes actualizar los datos bajo demanda.¿Cómo funciona esto? En el archivo adjunto del blog hay una caja de herramientas de ArcGIS Pro 3.7 que contiene una herramienta script
Make Serverless Query Layer con dos parámetros de entrada, una cláusula where que filtra los datos descargados, y un booleano que determina si el esquema de salida tiene campos de texto con un ancho por defecto o uno inferido a partir de los datos, lo que llamo "ajuste".Los datos fuente, la detección de la extensión del mapa y la definición de vista están codificados en la herramienta.
Así es como se ve la consulta para la definición de vista:
# Consultar 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};"""
Estamos
consultando GeoParquet en S3 usando DuckDB, así que la sintaxis SQL que ves arriba es para DuckDB. No mostrado, leyendo el nombre de la versión Overture desde un catálogo STAC que mantiene Overture para poder inyectar el valor en el valor f-string de la consulta.Cosas a destacar en el código:
Se usan funciones SQL de DuckDB
- Las columnas complejas se aplanan en un solo valor, por simplicidad
- Se consultan tanto el operador espacial
- ST_Intersects como las propiedades del bbox struct