Visualizar seus dados com o BigQuery e a API Datasets

Neste documento, apresentamos uma arquitetura de referência e um exemplo de como criar visualizações de dados de mapa com dados de local no Google Cloud Platform BigQuery e na API Datasets da Plataforma Google Maps. Por exemplo, analisar dados municipais abertos, criar um mapa de cobertura de telecomunicações ou visualizar rastros do movimento da frota de veículos móveis.

As visualizações de dados do mapa são uma ferramenta poderosa para engajar os usuários e revelar insights espaciais nos dados de localização. Os dados de local são aqueles que têm elementos de ponto, linha ou polígono. Por exemplo, os mapas meteorológicos ajudam os consumidores a entender e planejar viagens e se preparar para tempestades, os mapas de Business Intelligence ajudam os usuários a descobrir insights a partir de sua análise de dados, e os mapas de telecomunicações ajudam os usuários a entender a cobertura e a qualidade dos provedores em uma determinada área de cobertura.

No entanto, é difícil para os desenvolvedores de aplicativos criar grandes visualizações de dados de mapas que sejam eficientes e proporcionem uma ótima experiência ao usuário. Dados grandes precisam ser carregados na memória do lado do cliente, o que causa lentidão no primeiro carregamento do mapa. O visual deve ter bom desempenho em todos os dispositivos, incluindo celulares de última geração que têm restrições de memória e GPU. Por fim, os desenvolvedores precisam escolher uma grande biblioteca de renderização de dados que seja portátil, confiável e de alto desempenho com grandes volumes de dados.

Arquitetura de referência

O desenvolvimento de aplicativos com grandes visualizações de dados requer dois componentes principais.

  1. Back-end do cliente: todos os dados e serviços de back-end do app, como processamento e armazenamento.
  2. Cliente do cliente: a interface do usuário do seu app com um componente de visualização de mapa.

Veja abaixo um diagrama do sistema que mostra como esses dois componentes interagem com o usuário do app, o Google Cloud e a Plataforma Google Maps para criar um app de visualização de dados grandes.

diagrama da arquitetura

⭐ Observação: a API Maps Datasets é um produto em pré-GA. Confira os detalhes nos Termos de Serviço.

Considerações sobre o design

Há uma série de considerações de design a serem seguidas para criar uma visualização de dados de alto desempenho usando o Google Cloud e a Plataforma Google Maps.

  1. Tamanho dos dados de origem e frequência de atualização
    1. Se os dados de origem no formato geojson forem < 5 MB ou forem atualizados com muita frequência, por exemplo, uma previsão meteorológica em tempo real, considere veicular os dados como um objeto geojson no lado do cliente do app e renderizar com uma camada deck.gl.
    2. Se os dados tiverem mais de 5 MB e forem atualizados no máximo uma vez por hora, considere a arquitetura da API Datasets neste documento.
      1. Os conjuntos de dados são compatíveis com arquivos de até 350 MB.
      2. Se os dados forem maiores que 350 MB, considere remover ou simplificar os dados de geometria no arquivo de origem antes de passar para os conjuntos de dados (consulte Remoção de dados abaixo).
  2. Esquema e formato
    1. Verifique se os dados têm uma propriedade de ID globalmente exclusiva para cada recurso. Um ID exclusivo permite selecionar e estilizar um elemento específico ou mesclar dados a um elemento para visualização, por exemplo, estilizar um elemento selecionado no evento de clique.
    2. Formate seus dados como CSV ou GeoJSON de acordo com a especificação da API Datasets com nomes de colunas e tipos de dados válidos e de objetos GeoJSON.
    3. Para facilitar a criação de conjuntos de dados do BigQuery, crie uma coluna chamada wkt na exportação do CSV do SQL. Os conjuntos de dados oferecem suporte à importação de geometria de um CSV no formato texto conhecido (WKT, na sigla em inglês) de uma coluna chamada wkt.
    4. Verifique se os dados são tipos válidos de geometria e dados. Por exemplo, o GeoJSON precisa estar no sistema de coordenadas WGS84, na ordem de enrolamento da geometria etc.
    5. Use uma ferramenta como geojson-validate para garantir que todas as geometrias em um arquivo de origem sejam válidas ou ogr2ogr para transformar um arquivo de origem entre formatos ou sistemas de coordenadas.
  3. Remoção de dados
    1. Minimize o número de propriedades dos atributos. É possível mesclar outras propriedades a um recurso durante a execução com uma chave de identificador exclusivo (exemplo).
    2. Use tipos de dados de números inteiros para objetos de propriedade sempre que possível para minimizar o espaço de armazenamento de blocos, mantendo o desempenho do carregamento dos blocos por HTTPS em um app cliente.
    3. Simplifique e/ou agregue geometrias de recurso muito complexas. Use funções do BigQuery como ST_Simplify em geometrias de polígono complexas para reduzir o tamanho do arquivo de origem e melhorar o desempenho do mapa.
  4. Divisão
    1. A API Datasets do Google Maps cria blocos de mapas a partir do arquivo de dados de origem para uso na API Maps JS.
    2. Os blocos de mapa são um sistema de indexação baseado em zoom que oferece maneiras mais eficientes de carregar dados em um app visual.
    3. Os blocos de mapa podem eliminar elementos densos ou complexos em níveis mais baixos de zoom. Quando um usuário diminui o zoom em um estado ou país (por exemplo, z5-z12) pode ter uma aparência diferente do que se aplica a uma cidade ou bairro (por exemplo, z13-z18).

Exemplo: ferrovias em Londres

Neste exemplo, aplicaremos a arquitetura de referência para criar um aplicativo da Web com o GCP e o Google Maps que visualiza todas as ferrovias de Londres a partir dos dados do Open Street Map (OSM).

Pré-requisitos

  1. Acesso ao sandbox do BigQuery e ao console do Cloud
  2. Verifique se você tem um projeto do GCP e uma conta de faturamento configurados.

Etapa 1: consultar dados no BigQuery

Navegue até Conjuntos de dados públicos do BigQuery. O conjunto de dados "bigquery-public-data" e a tabela geo_openstreetmap.planet_features contêm todo o volume de dados do Open Street Map (OSM), incluindo todos os atributos possíveis. Descubra todos os recursos disponíveis para consulta na Wiki do OSM, incluindo amenity, road e landuse.

Use o Cloud Shell ou o console do Cloud no BigQuery(https://console.cloud.google.com) para consultar a tabela usando SQL. O snippet de código abaixo usa o comando bq query para consultar todas as ferrovias filtradas para Londres usando uma caixa delimitadora e a função ST_Intersects().

Para realizar essa consulta no Cloud Shell, execute o snippet de código a seguir e atualize o ID do projeto, o conjunto de dados e o nome da tabela do seu ambiente.

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

A consulta retorna:

  1. um identificador exclusivo para cada atributo osm_id
  2. o feature_type, por exemplo, pontos, linhas etc.
  3. O name do recurso, por exemplo, Paddington Station
  4. O tipo de railway, por exemplo, principal, turismo, militar etc.
  5. O wkt do recurso - geometria de ponto, linha ou polígono no formato WKT. WKT é o formato de dados padrão que as colunas de geografia do BigQuery retornam em uma consulta.

Observação: para validar visualmente os resultados da consulta antes de criar um conjunto de dados, use o Looker Studio em um painel do BigQuery.

Para exportar a tabela para um arquivo CSV em um bucket do Google Cloud Storage, use o comando bq extract no Cloud Shell:

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

Observação:é possível automatizar cada etapa usando o Cloud Scheduler para atualizar os dados regularmente.

Etapa 2: criar um conjunto de dados a partir do arquivo CSV

Em seguida, crie um conjunto de dados da Plataforma Google Maps com o resultado da consulta no Google Cloud Storage (GCS). Com a API Datasets, é possível criar um conjunto de dados e depois fazer upload dos dados para ele usando um arquivo hospedado no GCS.

Para começar, ative a API Maps Datasets no projeto do GCP e consulte os documentos da API. Há bibliotecas de cliente do Python e Node.js para chamar a API Datasets a partir da lógica no back-end do seu app. Além disso, há uma GUI de conjuntos de dados para criar conjuntos de dados manualmente no Console do Cloud.

Depois que o upload do conjunto de dados for concluído, será possível visualizá-lo na GUI do conjunto de dados.

Visualização do conjunto de dados

Etapa 4: associar seu conjunto de dados a um ID de mapa

Depois que o conjunto de dados for criado, você poderá criar um ID de mapa com um estilo de mapa associado. No Editor de estilo de mapa, você pode associar um mapId e um estilo ao conjunto de dados. Também é possível aplicar a Estilização de mapas baseada na nuvem para personalizar a aparência do seu mapa.

Etapa 5: criar uma visualização de mapa no app cliente

Por fim, você pode adicionar o conjunto de dados a um app de visualização de dados do lado do cliente usando a API Maps JS. Inicialize seu objeto map usando o mapID associado ao conjunto de dados da etapa anterior. Em seguida, defina o estilo e a interatividade da camada do conjunto de dados. Para mais detalhes, confira um guia completo sobre a estilização baseada em dados com conjuntos de dados.

É possível personalizar o estilo, adicionar manipuladores de eventos para alterar o estilo de forma dinâmica e muito mais usando a API Maps JS. Confira exemplos nos docs. Abaixo, definiremos uma função setStyle para criar o estilo de elemento de ponto e linha para esse exemplo com base no atributo “feature_type”.

Observação: use o canal v=beta para implementar a API Maps JS.

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,
           }
     }
}

Observação: sempre adicione a atribuição para seu conjunto de dados ao app de mapa. Para adicionar a atribuição OSM, siga o exemplo de código de atribuição nos documentos e aderindo às diretrizes de OSM.

O código acima, quando inicializado em um app da Web de página única, gera o seguinte visual de dados do mapa:

mapa da ferrovia de Londres

Aqui, você pode estender sua visualização de mapa na função setStyle() adicionando lógica para filtrar elementos, adicionar estilo com base na interação do usuário e interagir com o restante do aplicativo.

Conclusão

Neste artigo, discutimos uma arquitetura de referência e um exemplo de implementação de um aplicativo de visualização de dados grande usando o Google Cloud e a Plataforma Google Maps. Com essa arquitetura de referência, é possível criar apps de visualização de dados de local usando quaisquer dados no BigQuery do GCP que tenham bom desempenho em qualquer dispositivo com a API Datasets do Google Maps.

Próximas ações

Para saber mais:

Colaboradores

Autores principais:

  • Ryan Baumann, gerente de engenharia de soluções da Plataforma Google Maps