Visualizar seus dados com o BigQuery e a API Datasets

Este documento fornece uma arquitetura de referência e um exemplo para criar visualizações de dados de mapas com dados de localização no Google Cloud BigQuery e na API Datasets da Plataforma Google Maps, como analisar dados municipais abertos, criar um mapa de cobertura de telecomunicações ou visualizar rastros de movimento de frota de veículos móveis.

As visualizações de dados de mapas são uma ferramenta poderosa para envolver os usuários e descobrir insights espaciais em dados de localização. Os dados de localização são dados que têm recursos 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 da 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 apps criar visualizações de dados de mapas grandes que sejam eficientes e ofereçam uma ótima experiência do usuário. Grandes dados precisam ser carregados no lado do cliente da memória, causando tempos de carregamento lentos do primeiro mapa. O visual precisa ser eficiente em todos os dispositivos, incluindo smartphones mais simples, que têm restrições de memória e GPU. Por fim, os desenvolvedores precisam escolher uma biblioteca de renderização de dados grandes que seja portátil, confiável e eficiente com dados grandes.

Arquitetura de referência

O desenvolvimento de apps com visualizações de dados grandes exige 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 app com um componente de visualização de mapa.

Confira abaixo um diagrama do sistema de 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

Considerações sobre o design

Há várias considerações de design a serem seguidas para criar uma visualização de dados eficiente 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 menores que 5 MB ou forem atualizados com muita frequência, por exemplo, uma previsão do radar meteorológico ao vivo, considere veicular dados como um objeto geojson no lado do cliente no app e renderizar com uma camada deck.gl.
    2. Se os dados tiverem mais de 5 MB de tamanho e não forem atualizados mais rápido do que uma vez por hora, considere a arquitetura da API Datasets neste documento.
      1. Os conjuntos de dados aceitam arquivos de até 350 MB de tamanho.
      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 a seção "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 recurso específico ou unir dados a um recurso para visualizar, por exemplo, estilizar um recurso selecionado no evento do usuário "clique".
    2. Formate os dados como CSV ou GeoJSON de acordo com a especificação da API Datasets com nomes de colunas, tipos de dados e tipos de objetos GeoJSON válidos.
    3. Para facilitar a criação de conjuntos de dados no BigQuery, crie uma coluna chamada wkt na exportação de CSV do SQL. Os conjuntos de dados aceitam a importação de geometria de um CSV no formato de texto conhecido (WKT, na sigla em inglês) de uma coluna chamada wkt.
    4. Verifique se os dados são geometria e tipos de dados válidos. 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 de recursos. É possível unir outras propriedades a um recurso no ambiente de execução em uma chave de identificador exclusivo (exemplo).
    2. Use tipos de dados inteiros para objetos de propriedade sempre que possível para minimizar o espaço de armazenamento de blocos, mantendo os blocos eficientes para carregar por HTTPS em um app cliente.
    3. Simplifique e/ou agregue geometrias de recursos muito complexas. Considere usar funções do BigQuery, como ST_Simplify, em geometrias de polígonos complexas para reduzir o tamanho do arquivo de origem e melhorar o desempenho do mapa.
  4. Blocos
    1. A API Datasets da Plataforma Google Maps cria blocos de mapa do arquivo de dados de origem para uso com um SDK Maps para Web ou dispositivos móveis.
    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 descartar recursos densos ou complexos em níveis de zoom mais baixos. Quando um usuário diminui o zoom para um estado ou país (por exemplo, z5-z12), a aparência pode ser diferente de quando o zoom é aumentado para uma cidade ou bairro (por exemplo, z13-z18).

Exemplo: ferrovias em Londres

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

Pré-requisitos

  1. Acesso ao BigQuery Sandbox e ao console do Cloud
  2. Verifique se você tem um projeto na nuvem do Google Cloud e uma conta de faturamento configurada.

Etapa 1: consultar dados no BigQuery

Acesse os conjuntos de dados públicos do BigQuery. O conjunto de dados 'bigquery-public-data' e a tabela geo_openstreetmap.planet_features contêm todos os dados do Open Street Map (OSM) do mundo, incluindo todos os recursos possíveis. Descubra todos os recursos disponíveis para consulta na wiki do OSM, incluindo amenity, road e landuse.

Use Cloud Shell ou o BigQuery Cloud Console para consultar a tabela usando SQL. O snippet de código abaixo usa o bq query comando para consultar todas as ferrovias filtradas apenas para Londres usando uma caixa delimitadora e a ST_Intersects() função.

Para realizar essa consulta no Cloud Shell, execute o snippet de código a seguir, atualizando o ID do projeto, o conjunto de dados e o nome da tabela para 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 recurso osm_id
  2. o feature_type, por exemplo, pontos, linhas etc.
  3. O name do recurso, por exemplo, Paddington Station
  4. O tipo 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, você pode visualizar rapidamente os dados em um painel do BigQuery usando Looker Studio.

Para exportar a tabela para um arquivo CSV em um bucket do Cloud Storage, use o bq extract comando 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 no arquivo CSV

Em seguida, crie um conjunto de dados da Plataforma Google Maps na saída da consulta no Google Cloud Storage (GCS). Usando a API Datasets, é possível criar um conjunto de dados e fazer upload de dados para ele de um arquivo hospedado no GCS.

Para começar, ative a API Datasets da Plataforma Google Maps no seu projeto na nuvem do Google Cloud e revise a documentação da API. Há bibliotecas de cliente Node.js e Node.js para chamar a API Datasets da lógica no back-end do 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, você poderá visualizar o conjunto de dados na GUI.

Prévia do conjunto de dados

Etapa 4: associar o 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, é possível associar um mapId e um estilo ao conjunto de dados. É aqui também que você pode aplicar a estilização de mapas baseada na nuvem para personalizar a aparência do mapa.

Etapa 5: criar a visualização do mapa do app cliente

Por fim, é possível adicionar o conjunto de dados a um app de visualização de dados do lado do cliente usando a API Maps JavaScript. Inicialize seu objeto de mapa 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. Confira um guia completo sobre a estilização baseada em dados com conjuntos de dados para mais detalhes.

É possível personalizar o estilo, adicionar gerenciadores de eventos para mudar o estilo dinamicamente e muito mais usando a API Maps JavaScript. Confira exemplos na documentação. Abaixo, vamos definir uma função setStyle para criar o estilo de recurso de ponto e linha para este exemplo com base no 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,
           }
     }
}

Esse código acima, quando inicializado em um app da web de uma só página, gera o seguinte visual de dados do mapa:

mapa ferroviário de londres

A partir daqui, é possível estender a visualização do mapa na função setStyle() adicionando lógica para filtrar recursos, adicionar estilos com base na interação do usuário e interagir com o restante do aplicativo.

Conclusão

Neste documento, discutimos uma arquitetura de referência e um exemplo de implementação de um aplicativo de visualização de dados grandes usando o Google Cloud e a Plataforma Google Maps. Usando essa arquitetura de referência, é possível criar apps de visualização de dados de localização de qualquer dado no Google Cloud BigQuery que sejam eficientes em qualquer dispositivo usando a API Datasets da Plataforma Google Maps.

Próximas ações

Para saber mais:

Colaboradores

Autores principais:

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