Visualice sus datos con BigQuery y la API de Datasets

En este documento, se proporciona una arquitectura de referencia y un ejemplo para crear visualizaciones de datos de mapas con datos de ubicación en BigQuery de Google Cloud Platform y la API de Datasets de Google Maps Platform, como analizar datos municipales abiertos, crear un mapa de cobertura de telecomunicaciones o visualizar los rastros del movimiento de una flota de vehículos móviles.

Las visualizaciones de datos cartográficos son una herramienta poderosa para atraer a los usuarios y descubrir estadísticas espaciales en los datos de ubicación. Los datos de ubicación son datos que tienen componentes de punto, línea o polígono. Por ejemplo, los mapas meteorológicos ayudan a los consumidores a comprender y planificar viajes y prepararse para tormentas; los mapas de inteligencia empresarial ayudan a los usuarios a descubrir estadísticas a partir de su análisis de datos, y los mapas de telecomunicaciones ayudan a los usuarios a comprender la cobertura y la calidad de sus proveedores en un área de servicio determinada.

Sin embargo, es difícil para los desarrolladores de apps crear visualizaciones de datos de mapas grandes que tengan un buen rendimiento y proporcionen una excelente experiencia del usuario. Los datos de gran tamaño se deben cargar en la memoria del cliente, lo que ralentiza los tiempos de carga del primer mapa. El elemento visual debe tener un buen rendimiento en todos los dispositivos, incluidos los teléfonos celulares de gama baja que tienen restricciones de memoria y GPU. Por último, los desarrolladores deben elegir una biblioteca de renderización de datos de gran tamaño que sea portátil, confiable y tenga buen rendimiento con grandes datos.

Arquitectura de referencia

Desarrollar aplicaciones con visualizaciones de datos grandes requiere dos componentes principales.

  1. Backend del cliente: Todos los datos y servicios de la app de backend, como el procesamiento y el almacenamiento.
  2. Cliente: Es la interfaz de usuario de tu app con un componente de visualización de mapas.

A continuación, se muestra un diagrama del sistema sobre cómo estos dos componentes interactúan con el usuario de la app, Google Cloud y Google Maps Platform para crear una app de visualización de datos de gran tamaño.

diagrama de arquitectura

Consideraciones del diseño

Existen varias consideraciones de diseño que debes tener en cuenta para crear una visualización de datos de alto rendimiento con Google Cloud y Google Maps Platform.

  1. Tamaño de los datos de origen y frecuencia de actualización.
    1. Si los datos de origen en formato GeoJSON son menores a 5 MB o se actualizan con mucha frecuencia (p.ej., un pronóstico del radar meteorológico en vivo), considera entregar los datos como un objeto GeoJSON del cliente en tu app y renderizarlos con una capa deck.gl.
    2. Si tus datos tienen un tamaño superior a 5 MB y se actualizan no más de una vez por hora, considera la arquitectura de la API de Datasets en este documento.
      1. Los conjuntos de datos admiten archivos de hasta 350 MB.
      2. Si tus datos superan los 350 MB, considera reducir o simplificar los datos de geometría en el archivo de origen antes de pasarlos a los conjuntos de datos (consulta Reducción de datos a continuación).
  2. Esquema y formato
    1. Asegúrate de que tus datos tengan una propiedad de ID globalmente única para cada componente. Un ID único te permite seleccionar y aplicar diseño a un componente específico o unir datos a un componente para visualizarlo, por ejemplo, aplicar diseño a un componente seleccionado en el evento del usuario "hacer clic".
    2. Dales formato a tus datos como CSV o GeoJSON según las especificaciones de la API de Datasets con nombres de columnas, tipos de datos y tipos de objetos GeoJSON válidos.
    3. Para crear conjuntos de datos de BigQuery de forma sencilla, crea una columna llamada wkt en tu exportación de CSV de SQL. Los conjuntos de datos admiten la importación de geometría desde un archivo CSV en formato texto conocido (WKT) desde una columna llamada wkt.
    4. Comprueba que tus datos tengan una geometría y tipos de datos válidos. Por ejemplo, GeoJSON debe estar en el sistema de coordenadas WGS84, el orden de devanado geométrico, etcétera.
    5. Usa una herramienta como geojson-validate para asegurarte de que todas las geometrías de un archivo fuente sean válidas o ogr2ogr para transformar un archivo fuente entre formatos o sistemas de coordenadas.
  3. Reducción de datos
    1. Minimiza la cantidad de propiedades de los componentes. Puedes unir propiedades adicionales a un componente en el tiempo de ejecución en una clave de identificador único (ejemplo).
    2. Usa tipos de datos de número entero para los objetos de propiedad siempre que sea posible para minimizar el espacio de almacenamiento de tarjetas y mantener el rendimiento de las tarjetas para cargarlas a través de HTTPS en una app cliente.
    3. Simplifica o agrega geometrías de componentes muy complejas. Considera usar funciones de BigQuery, como ST_Simplify, en geometrías de polígonos complejas para reducir el tamaño del archivo fuente y mejorar el rendimiento del mapa.
  4. Agrupación
    1. La API de Google Maps Datasets crea mosaicos de mapas a partir de tu archivo de datos de origen para usarlos con un SDK de Maps web o para dispositivos móviles.
    2. Las baldosas de mapas son un sistema de indexación basado en el zoom que proporciona formas más eficientes de cargar datos en una app visual.
    3. Es posible que las tarjetas del mapa dejen caer componentes densos o complejos en niveles de zoom más bajos. Cuando un usuario aleja la imagen hasta un estado o país (p.ej., de z5 a z12), es posible que se vea diferente a cuando se acerca a una ciudad o un vecindario (p.ej., de z13 a z18).

Ejemplo: Ferrocarriles en Londres

En este ejemplo, aplicaremos la arquitectura de referencia para crear una aplicación web con GCP y Google Maps que visualice todos los ferrocarriles de Londres a partir de los datos de Open Street Map (OSM).

Requisitos previos

  1. Acceso a la zona de pruebas de BigQuery y a la consola de Cloud
  2. Asegúrate de tener configurados un proyecto de GCP y una cuenta de facturación.

Paso 1: Consulta datos en BigQuery

Navega a Conjuntos de datos públicos de BigQuery. El conjunto de datos "bigquery-public-data" y la tabla geo_openstreetmap.planet_features contienen los datos de Open Street Map (OSM) de todo el mundo, incluidas todas las características posibles. Descubre todas las funciones disponibles para consultar en la Wiki de OSM, incluidas amenity, road y landuse.

Usa Cloud Shell o la consola de BigQuery en Cloud(https://console.cloud.google.com) para consultar la tabla con SQL. En el siguiente fragmento de código, se usa el comando bq query para consultar todas las líneas ferroviarias filtradas solo para Londres con un cuadro delimitador y la función ST_Intersects().

Para realizar esta consulta desde Cloud Shell, ejecuta el siguiente fragmento de código y actualiza el ID del proyecto, el conjunto de datos y el nombre de la tabla de tu entorno.

bq query --use_legacy_sql=false \
--destination_table PROJECTID:DATASET.TABLENAME \
--replace \
'SELECT
osm_id, 
feature_type,
(SELECT value
         FROM   unnest(all_tags)
         WHERE  KEY = "name") AS name,
(SELECT value
         FROM   unnest(all_tags)
         WHERE  KEY = "railway") AS railway,
geometry as wkt
FROM   bigquery-public-data.geo_openstreetmap.planet_features
WHERE ("railway") IN (SELECT key FROM unnest(all_tags)) 
    AND ST_Intersects(
    geometry,
ST_MakePolygon(ST_MakeLine(
      [ST_GeogPoint(-0.549370, 51.725346),
      ST_GeogPoint(-0.549370, 51.2529407),
      ST_GeogPoint(0.3110581, 51.25294),
      ST_GeogPoint(0.3110581, 51.725346),
      ST_GeogPoint(-0.549370, 51.725346)]
    ))
   )' 

La consulta muestra lo siguiente:

  1. un identificador único para cada componente osm_id
  2. el feature_type, p.ej., puntos, líneas, etcétera
  3. El name del componente, p.ej., Paddington Station
  4. El tipo de railway, p.ej., principal, turismo, militar, etcétera
  5. El objeto wkt del componente: geometría de punto, línea o polígono en formato WKT. WKT es el formato de datos estándar que se muestra en las columnas de ubicación geográfica de BigQuery en una consulta.

Nota: Para validar visualmente los resultados de tu consulta antes de crear un conjunto de datos, puedes visualizar rápidamente tus datos en un panel de BigQuery usando Looker Studio.

Para exportar la tabla a un archivo CSV en un bucket de Google Cloud Storage, usa el comando bq extract en Cloud Shell:

bq extract \
--destination_format "CSV" \
--field_delimiter "," \
--print_header=true \
PROJECTID:DATASET.TABLENAME \
gs://BUCKET/FILENAME.csv

Nota: Puedes automatizar cada paso con Cloud Scheduler para actualizar tus datos con regularidad.

Paso 2: Crea un conjunto de datos a partir de tu archivo CSV

A continuación, crea un conjunto de datos de Google Maps Platform a partir del resultado de la consulta en Google Cloud Storage (GCS). Con la API de Datasets, puedes crear un conjunto de datos y, luego, subir datos a tu conjunto de datos desde un archivo alojado en GCS.

Para comenzar, habilita la API de Maps Datasets en tu proyecto de GCP y revisa los documentos de la API. Existen bibliotecas cliente de Python y Node.js para llamar a la API de Datasets desde la lógica en el backend de tu app. Además, hay una GUI de conjuntos de datos para crear conjuntos de datos de forma manual en la consola de Cloud.

Una vez que se complete la carga del conjunto de datos, puedes obtener una vista previa en la GUI de conjuntos de datos.

Vista previa del conjunto de datos

Paso 4: Asocia tu conjunto de datos a un ID de mapa

Una vez que crees tu conjunto de datos, puedes crear un ID de mapa con un diseño de mapa asociado. En el Editor de diseños de mapa, puedes asociar un mapId y un estilo al conjunto de datos. También puedes aplicar el diseño de mapas basado en la nube para personalizar el aspecto de tu mapa.

Paso 5: Crea la visualización de mapas de tu app cliente

Por último, puedes agregar el conjunto de datos a una app de visualización de datos del cliente con la API de Maps JS. Inicializa tu objeto de mapa usando el mapID asociado a tu conjunto de datos del paso anterior. Luego, establece el estilo y la interactividad de tu capa de conjunto de datos. Consulta una guía completa sobre el diseño basado en datos con conjuntos de datos para obtener más detalles.

Puedes personalizar el diseño, agregar controladores de eventos para cambiarlo de forma dinámica y mucho más con la API de Maps JS. Consulta ejemplos en los documentos. A continuación, definiremos una función setStyle para crear el estilo de componentes de punto y línea para este ejemplo en función del atributo "feature_type".

function setStyle(params) {
  const map.getDatasetFeatureLayer("your-dataset-id");
  const datasetFeature = params.feature;
  const type = datasetFeature.datasetAttributes["feature_type"];
if (type == "lines") {
           return {
             fillColor: "blue",
             strokeColor: "blue",
             fillOpacity: 0.5,
             strokeWeight: 1,
           }
         } else if (type == "points") {
           return {
             fillColor: "black",
             strokeColor: "black",
             strokeOpacity: 0.5,
             pointRadius: 2,
             fillOpacity: 0.5,
             strokeWeight: 1,
           }
     }
}

Nota: Asegúrate de agregar siempre la atribución de tu conjunto de datos a tu app de mapas. Para agregar la atribución de OSM, sigue el ejemplo de código de atribución en la documentación y cumple con los lineamientos de OSM.

Cuando se inicializa en una app web de una sola página, el código anterior genera la siguiente visualización de datos de mapas:

mapa ferroviario de londres

A partir de aquí, puedes extender la visualización del mapa en la función setStyle() agregando lógica para filtrar componentes, agregar diseño según la interacción del usuario y, también, interactuar con el resto de la aplicación.

Conclusión

En este artículo, analizamos una arquitectura de referencia y una implementación de ejemplo de una aplicación de visualización de datos de gran tamaño con Google Cloud y Google Maps Platform. Con esta arquitectura de referencia, puedes crear apps de visualización de datos de ubicación a partir de cualquier dato de BigQuery de GCP que tenga un buen rendimiento en cualquier dispositivo con la API de Google Maps Datasets.

Acciones siguientes

Material de lectura adicional:

Colaboradores

Autores principales:

  • Ryan Baumann, gerente de Ingeniería de Soluciones de Google Maps Platform