Qualidade do ar e pólen em áreas e rotas

Objetivo

As APIs Air Quality e Pollen oferecem ótimas oportunidades para adicionar mais insights a uma viagem ou mapa em qualquer local. Há duas maneiras de consumir os dados disponíveis dessas APIs: indexar como texto ou blocos de mapa de calor como imagens raster.

alt_text

Ao usar os endpoints das APIs de blocos de mapa de calor, você pode enfrentar alguns desafios ao carregar os blocos raster individuais, como:

  • como carregar os blocos em um mapa do Google na Web (também para obedecer aos Termos de Uso das APIs)
  • como gerenciar o número de solicitações durante a experiência
  • como ler os valores dos blocos

Exemplos de casos de uso

Vamos apresentar exemplos de casos de uso para tentar responder às perguntas acima.

Implementação

Você vai descobrir quais blocos estão disponíveis e como eles podem ser carregados em uma experiência na Web. Você também vai ver o que pode ser feito para gerenciar o número de solicitações em um cenário em que os blocos são carregados em um mapa. Por fim, vamos mostrar como ler os blocos.

Blocos de mapa de calor disponíveis por tipo

API Air Quality

- UAQI_RED_GREEN (UAQI, paleta vermelho-verde): paleta vermelho-verde do Índice Universal de Qualidade do Ar.
- UAQI_INDIGO_PERSIAN (UAQI, paleta índigo-persa): paleta índigo-persa do Índice Universal de Qualidade do Ar.
- PM25_INDIGO_PERSIAN: paleta índigo-persa do índice PM2,5.
- GBR_DEFRA: paleta de cores do índice de qualidade do ar (Reino Unido).
- DEU_UBA: paleta de cores do Índice de Qualidade do Ar Local Alemão.
- CAN_EC: paleta de cores do Índice de Saúde da Qualidade do Ar Canadense.
- FRA_ATMO: paleta de cores do Índice de Qualidade do Ar da França.
- US_AQI: paleta de cores do Índice de Qualidade do Ar dos EUA.

API Pollen

- TREE_UP: o tipo de mapa de calor representa um mapa gráfico de índice de árvores.
- GRASS_UPI: o tipo de mapa de calor representa um mapa gráfico de índice de grama.
- WEED_UPI: o tipo de mapa de calor representa um mapa gráfico de índice de ervas daninhas.

Mostrar blocos de mapa de calor na Web

Carregue os blocos e aplique uma máscara vetorial para mostrar apenas as áreas desejadas da janela de visualização do mapa.

Carregar os blocos

import { TileLayer } from "deck.gl";
import { GoogleMapsOverlay } from "@deck.gl/google-maps";

// const TileLayer = deck.TileLayer;
// const GoogleMapsOverlay = deck.GoogleMapsOverlay;

// Initialize and add the map
function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    center: { lat: 40, lng: -110 },
    zoom: 4,
  });

  const apiKey = 'YOUR_API_KEY';
 const airqualityType = 'UAQI_RED_GREEN' // AirQuality API heatmap type
  const deckOverlay = new GoogleMapsOverlay({
    layers: [
       // Heatmap Tiles layer
new TileLayer({
    id: 'heatmap-tiles',
    data: 'https://airquality.googleapis.com/v1/mapTypes/'+ heatmapType + +'/heatmapTiles/{z}/{x}/{y}?key=' + apiKey,
...
 })
    ],
  });

  deckOverlay.setMap(map);
}

window.initMap = initMap;

Aplicar uma máscara vetorial

Você pode ocultar ou mostrar visualmente qualquer parte dos blocos de mapa de calor. Importante: você precisa adquirir os dados que serão usados para criar a máscara vetorial aplicada aos blocos de mapa de calor.

  • Em uma área:
  • use o deck.gl GeoJson para criar uma máscara na camada de blocos de qualidade do ar.

alt_text

O exemplo abaixo usa um geojson multipolígono da França

// geojson sample

{  "type": "Feature",
  "geometry": {
    "type": "MultiPolygon",
    "coordinates": [[[[-54.111527,2.11427],...[-54.194491,2.163073]]]]
  },
  "properties": {
    "name": "France"
  }
}

Confira uma referência para a implementação do deckgl:

  // Loaded layers in maps overlay
  const deckOverlay = new GoogleMapsOverlay({ layers: layers });
  const MaskExtension = deck.MaskExtension; // or import extension
  ...

  // As part of object containing the different layers
  const layers = [
    // Masking layer
  new GeoJsonLayer({
    id: 'country-vector',
    operation: 'mask',
    data: "geojson.json", // <-- any custom geometry
  })
  ...
  ...

  // Heatmap Tiles layer
  new TileLayer({
      id: 'heatmap-tiles',
      maskId: 'country-vector', // <-- same as mask id
    extensions: [new MaskExtension()],  // <-- enable mask extension
  ...
  })
  ]
  • Ao longo de uma rota: use o deck.gl com o TripsLayer para criar uma máscara na camada de blocos de qualidade do ar

Bloco de mapa de calor de qualidade do ar em uma viagem

alt_text

Gerenciar solicitações e custos da API

Embora o comportamento padrão do navegador seja geralmente armazenar em cache todos os blocos carregados no armazenamento local (na mesma sessão), você pode otimizar ainda mais:

  • Restringir a área de carregamento: crie uma caixa delimitadora (em vermelho) e atribua-a à camada. Somente os blocos de mapa de calor (em azul) que cobrem a caixa delimitadora serão carregados em qualquer nível de zoom.

Caixa delimitadora (em vermelho), blocos de mapa de calor (em azul)

alt_text

 // Heatmap Tile layer
 new TileLayer({
    id: 'heatmap-tiles',
    extent: [minX, minY, maxX, maxY] // bounding box: southwest lat, southwest lng, northeast lat, northeast lng
    ...
 })
  • Defina o tamanho do bloco de exibição visual para cobrir toda a janela de visualização em qualquer nível de zoom. Recomendação: entre 256 e 1024.

    Importante: os blocos de APIs permanecem na resolução 256 x 256, mas o ajuste de exibição visual permite aumentar/diminuir o número de solicitações de blocos para cobrir toda a janela de visualização do mapa.

    Verifique se ele funciona com minZoom e maxZoom do Google Maps. Por exemplo, tilesize:1024 não vai carregar blocos no zoom 0 ou 1.

Janela de visualização com blocos de 256 x 256 pixels x 512 x 512 pixels

alt_text alt_text



    // Heatmap Tile layer
    new TileLayer({
        id: 'heatmap-tiles',
        tilesize:256, // <-- change to 512 for instance
        ...
    })

Ler valores de pixels

Para mostrar o valor correspondente em uma escala de cores

Você pode usar a biblioteca Luma.gl e o método readPixelsToArray em um evento onClick atribuído como prop à camada deck.gl.

Valor do pixel: rgba(128,0,0,255)

alt_text

BAIXO alt_text ALTO

  // Uint8Array pixel sample
  import { readPixelsToArray } from "@luma.gl/core";
  ...

  // assign on the TileLayer
  new TileLayer({
      id: 'heatmap-tiles',
  ...
    onClick: ({
    bitmap,
    layer
  }) => {
    if (bitmap) {
      const pixel = readPixelsToArray(layer.props.image, {
        sourceX: bitmap.pixel[0],
        sourceY: bitmap.pixel[1],
        sourceWidth: 1,
        sourceHeight: 1
      });
      // console.log("color picked:"+ pixel);
    }
  }
  })

Conclusão

Você descobriu como Qualidade do Ar e Pólen os endpoints da API de blocos de mapa de calor podem ser:

  • carregados em um mapa do Google na Web, garantindo também que estejam de acordo com os Termos de Uso
  • otimizados para corresponder ao seu caso de uso
  • ler os valores dos blocos

Próximas ações

Sugestões de leitura adicional:

Colaboradores

Principais autores:

Thomas Anglaret | Engenheiro de soluções da Plataforma Google Maps