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 local no Google Cloud Platform 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 da frota de veículos móveis.

As visualizações de dados de mapas são uma ferramenta eficiente para engajar os usuários e descobrir insights espaciais nos dados de local. 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 inteligência de negócios 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 serviço.

No entanto, é difícil para os desenvolvedores de apps criar visualizações de dados de mapas grandes que tenham bom desempenho e ofereçam uma ótima experiência do usuário. Os dados grandes precisam ser carregados na memória do lado do cliente, causando tempos de carregamento lentos do primeiro mapa. O visual precisa ter bom desempenho em todos os dispositivos, incluindo smartphones mais simples com 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 com bom desempenho.

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.

Confira 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 grande de visualização de dados.

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 de radar meteorológico em tempo real, disponibilize os dados como um objeto geojson no lado do cliente no seu app e renderize 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 aceitam 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 passá-los para os Conjuntos de dados. Consulte "Remoção de dados" abaixo.
  2. Esquema e formato
    1. Garanta que os dados tenham uma propriedade de ID globalmente exclusiva para cada elemento. Com um ID exclusivo, você pode selecionar e estilizar um recurso específico ou mesclar dados a um recurso para visualizar, por exemplo, estilizar um recurso selecionado no evento do usuário "clique".
    2. Formate seus 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 criar conjuntos de dados do BigQuery com facilidade, crie uma coluna chamada wkt na exportação de 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 têm 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. Poda de dados
    1. Minimizar o número de propriedades dos atributos. É possível mesclar outras propriedades a um recurso no momento de execução em uma chave de identificador exclusiva (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 o desempenho deles para carregar por HTTPS em um app cliente.
    3. Simplifique e/ou agregue geometrias de recursos muito complexas. Use as funções do BigQuery como ST_Simplify (em inglês) em geometrias de polígono complexas para reduzir o tamanho do arquivo de origem e melhorar o desempenho do mapa.
  4. Tiling
    1. A API Datasets do Google Maps cria blocos de mapa a partir do arquivo de dados de origem para uso com um SDK do Maps para Web ou dispositivos móveis.
    2. Os blocos do 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 do mapa podem deixar de mostrar elementos densos ou complexos em níveis de zoom mais baixos. Quando um usuário diminui o zoom em um estado ou país (por exemplo, z5-z12), pode ser diferente do zoom em 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 GCP e o Google Maps que visualize todas as ferrovias em Londres com base nos 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 configurada.

Etapa 1: consultar dados no BigQuery

Acesse Conjuntos de dados públicos do BigQuery. O conjunto de dados "bigquery-public-data" e a tabela geo_openstreetmap.planet_features contêm os dados do Open Street Map (OSM) de todo o 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 o Cloud Shell ou o console do 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 abaixo, atualizando 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 elemento osm_id
  2. 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 elemento: geometria de ponto, linha ou polígono no formato WKT. O 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, visualize rapidamente os dados em um painel do BigQuery usando o Looker Studio.

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 seus 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 base na saída da consulta no Google Cloud Storage (GCS). Com a API Datasets, você pode criar um conjunto de dados e fazer upload de 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 Python e Node.js para chamar a API Datasets usando a 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 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 do mapa

Depois de criar o conjunto de dados, você pode criar um ID de mapa com um estilo associado. No editor de estilo do mapa, você pode associar um ID e um estilo de mapa 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 seu mapa.

Etapa 5: criar a visualização de mapa do aplicativo 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 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. Confira um guia completo sobre o estilo orientado a dados com conjuntos de dados para mais detalhes.

Você pode personalizar o estilo, adicionar manipuladores de eventos para mudar o estilo dinamicamente e muito mais usando a API Maps JS. Confira exemplos na documentação. Abaixo, definiremos uma função setStyle para criar o estilo de elemento 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,
           }
     }
}

Observação: sempre adicione a atribuição do conjunto de dados ao seu app de mapa. Para adicionar a atribuição do OSM, siga o exemplo de código de atribuição nas documentações, obedecendo às diretrizes do OSM.

Esse código acima, quando inicializado em um app da Web de página única, gera a seguinte visualização de dados do mapa:

mapa ferroviário de Londres

A partir daqui, você pode estender a visualização do mapa na função setStyle() adicionando lógica para filtrar recursos, 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 de grande porte 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 localização a partir de qualquer dado no BigQuery do GCP que tenha bom desempenho em qualquer dispositivo usando a API Datasets do Google Maps.

Próximas ações

Para saber mais:

Colaboradores

Principais autores:

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