Wizualizacja danych za pomocą BigQuery i Datasets API

Ten dokument zawiera architekturę referencyjną i przykład tworzenia wizualizacji danych map z danymi o lokalizacji w Google Cloud Platform BigQuery i Google Maps Platform Datasets API, na przykład do analizowania otwartych danych miejskich, tworzenia mapy zasięgu usług telekomunikacyjnych lub wizualizacji śladów przemieszczania się floty pojazdów mobilnych.

Wizualizacje danych map to zaawansowane narzędzie do angażowania użytkowników i odkrywania informacji przestrzennych w danych o lokalizacji. Dane o lokalizacji to dane zawierające obiekty punktowe, liniowe lub wielokątne. Na przykład mapy pogody pomagają klientom zrozumieć i zaplanować wyjazdy oraz przygotować się na burze. mapy analityki biznesowej pomagają użytkownikom wydobyć wnioski z analizy danych, a mapy telekomunikacyjne pomagają zasięgu i jakości na danym obszarze.

Deweloperom aplikacji trudno jest jednak tworzyć duże wizualizacje danych map, które będą skuteczne i atrakcyjne dla użytkowników. Duże dane muszą być wczytywane po stronie klienta pamięci, co wydłuża czas wczytywania pierwszej mapy. Treści wizualne muszą działać prawidłowo na wszystkich urządzeniach, w tym na niższych telefonach komórkowych, które mają ograniczoną pamięć i układ GPU. Na koniec deweloperzy muszą wybrać dużą bibliotekę renderowania danych, która jest przenośna, niezawodna i wydajna w obszarze dużej ilości danych.

Architektura referencyjna

Tworzenie aplikacji z wizualizacjami dużych danych wymaga 2 głównych elementów.

  1. backend klienta – wszystkie dane aplikacji w backendzie takich jak przetwarzanie danych i przechowywanie danych.
  2. Klient klienta – interfejs aplikacji z komponentem wizualizacji mapy.

Poniżej znajdziesz schemat systemu, który pokazuje, jak te 2 komponenty wchodzą w interakcję z użytkownikiem aplikacji – Google Cloud i Google Maps Platform w celu tworzenia dużych aplikacji do wizualizacji danych.

schemat architektury

Uwagi dotyczące projektu

Aby utworzyć wydajną wizualizację danych przy użyciu Google Cloud i Google Maps Platform, musisz wziąć pod uwagę szereg kwestii związanych z projektowaniem.

  1. Rozmiar danych źródłowych i częstotliwość ich aktualizacji.
    1. Jeśli dane źródłowe w formacie GeoJSON obejmują mniej niż 5 MB lub są aktualizowane bardzo często, np. prognozy radaru pogodowego na żywo, rozważ udostępnianie danych w postaci obiektu GeoJSON po stronie klienta w aplikacji i renderowanie z użyciem warstwy deck.gl.
    2. Jeśli Twoje dane mają więcej niż 5 MB, a aktualizowane są nie częściej niż raz na godzinę, rozważ zastosowanie w tym dokumencie architektury Datasets API.
      1. Zbiory danych obsługują pliki o rozmiarze do 350 MB.
      2. Jeśli Twoje dane są większe niż 350 MB, rozważ przycięcie lub uproszczenie danych geometrycznych w pliku źródłowym przed przekazaniem ich do zbiorów danych (zobacz „Przycinanie danych” poniżej).
  2. Schemat & format
    1. Upewnij się, że dane mają globalnie unikalny identyfikator dla każdej funkcji. Unikalny identyfikator pozwala wybrać konkretną cechę i określić jej styl lub połączyć dane z cechą w celu jej wizualizacji, np. nadać styl wybranej cechy w zdarzeniu użytkownika „kliknięcie”.
    2. Sformatuj dane jako CSV lub GeoJSON zgodnie ze specyfikacją interfejsu Datasets API, podając prawidłowe nazwy kolumn, typy danych i typy obiektów GeoJSON.
    3. Aby ułatwić sobie tworzenie zbiorów danych z BigQuery, utwórz kolumnę o nazwie wkt w eksportowanym pliku CSV SQL. Zbiory danych obsługują importowanie geometrii z pliku CSV w formacie dobrze znanego tekstu (WKT) z kolumny wkt.
    4. Sprawdź, czy geometria i typy danych są prawidłowe. Na przykład GeoJSON musi być w układzie współrzędnych WGS84, kolejności zwinięcia geometrii itd.
    5. Użyj narzędzia geojson-validate, aby sprawdzić, czy wszystkie geometrie w pliku źródłowym są prawidłowe, lub ogr2ogr, by przekształcić plik źródłowy między formatami lub systemami współrzędnych.
  3. Przycinanie danych
    1. Zmniejsz liczbę właściwości cech. Dodatkowe usługi możesz łączyć z funkcją w czasie działania za pomocą unikalnego klucza identyfikatora (przykład).
    2. W miarę możliwości używaj w przypadku obiektów usługi typów danych całkowitych, aby zminimalizować ilość miejsca na kafelki i zapewnić odpowiednią wydajność ładowania kafelków przez HTTPS w aplikacji klienckiej.
    3. uproszczenie lub agregowanie bardzo złożonych geometrii obiektów; rozważ użycie funkcji BigQuery, takich jak ST_Simplify, w przypadku złożonych geometrii wielokątów, aby zmniejszyć rozmiar pliku źródłowego i poprawić wydajność mapy.
  4. Kafelki
    1. Interfejs Google Maps Datasets API tworzy kafelki map z pliku danych źródłowych i używa ich z pakietem SDK Map Google w przeglądarce lub na urządzeniu mobilnym.
    2. Fragmenty mapy to system indeksowania oparty na powiększeniu, który zapewnia efektywniejsze sposoby wczytywania danych do aplikacji wizualnej.
    3. Przy mniejszym powiększeniu fragmentów mapy mogą być widoczne gęste lub złożone obiekty. Po pomniejszeniu obrazu do stanu lub kraju (np. z5-z12) może on wyglądać inaczej niż po powiększeniu widoku miasta lub dzielnicy (np. z13-z18).

Przykład: linie kolejowe w Londynie

W tym przykładzie zastosujemy architekturę referencyjną do utworzenia aplikacji internetowej przy użyciu GCP i Map Google, która wizualizuje wszystkie linie kolejowe w Londynie na podstawie danych z Open Street Map (OSM).

Wymagania wstępne

  1. Dostęp do piaskownicy BigQuery i Cloud Console.
  2. Sprawdź, czy masz skonfigurowany projekt GCP i konto rozliczeniowe.

Krok 1. Utwórz zapytanie o dane w BigQuery

Otwórz Publiczne zbiory danych BigQuery. Zbiór danych „bigquery-public-data” a tabela geo_openstreetmap.planet_features zawiera dane Open Street Map z całej kuli ziemskiej, w tym dane o wszystkich możliwych funkcjach. Odkryj wszystkie funkcje, o których możesz szukać, w OSM Wiki, w tym amenity, road i landuse.

Użyj Cloud Shell lub konsoli BigQuery Cloud(https://console.cloud.google.com), aby wysłać zapytanie do tabeli za pomocą SQL. Poniższy wycinek kodu używa polecenia bq query, aby przesłać zapytanie dotyczące wszystkich linii kolejowych odfiltrowanych tylko w Londynie za pomocą ramki ograniczającej i funkcji ST_Intersects().

Aby wykonać to zapytanie w Cloud Shell, uruchom poniższy fragment kodu, aktualizując identyfikator projektu, zbiór danych i nazwę tabeli dla Twojego środowiska.

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

Zapytanie zwraca:

  1. unikalny identyfikator każdej cechy osm_id
  2. feature_type np. punkty, linie itp.
  3. name elementu, np. Paddington Station
  4. Typ railway, np. główny, turystyka, wojskowy, itp.
  5. Wartość wkt obiektu – geometria punktowa, linia lub wielokąt w formacie WKT. WKT to standardowy format danych BigQuery „Kolumny geograficzne” zwracane w zapytaniu.

Uwaga: aby przed utworzeniem zbioru danych sprawdzić wizualnie wyniki zapytania, możesz szybko zwizualizować dane w panelu BigQuery przy użyciu narzędzia Looker Studio.

Aby wyeksportować tabelę do pliku CSV w zasobniku Google Cloud Storage, użyj polecenia bq poświęconego wyodrębnianiu w Cloud Shell:

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

Uwaga: każdy krok możesz zautomatyzować za pomocą usługi Cloud Scheduler, aby regularnie aktualizować dane.

Krok 2. Utwórz zbiór danych na podstawie pliku CSV

Następnie utwórz zbiór danych Google Maps Platform na podstawie danych wyjściowych zapytania w Google Cloud Storage (GCS). Za pomocą interfejsu Datasets API możesz utworzyć zbiór danych, a następnie przesłać do niego dane z pliku hostowanego w GCS.

Aby rozpocząć, włącz interfejs Maps Datasets API w projekcie GCP i zapoznaj się z dokumentacją interfejsu API. Dostępne są biblioteki klienta Python i Node.js do wywoływania interfejsu Datasets API z poziomu logiki w backendzie aplikacji. Oprócz tego dostępny jest interfejs GUI zbiorów danych, który służy do ręcznego tworzenia zbiorów danych w konsoli Cloud.

Po zakończeniu przesyłania zbioru danych możesz wyświetlić jego podgląd w GUI zbioru danych.

Podgląd zbioru danych

Krok 4. Powiąż zbiór danych z identyfikatorem mapy

Po utworzeniu zbioru danych możesz utworzyć identyfikator mapy z powiązanym stylem mapy. W edytorze stylu mapy możesz powiązać identyfikator mapy i styl ze zbiorem danych. Tutaj możesz też zastosować style mapy oparte na chmurze, aby dostosować wygląd i styl mapy.

Krok 5. Utwórz wizualizację mapy aplikacji klienta

Możesz też dodać zbiór danych do aplikacji do wizualizacji danych po stronie klienta za pomocą interfejsu API Map Google w języku JS. Zainicjuj obiekt mapy za pomocą identyfikatora mapID powiązanego ze zbiorem danych z poprzedniego kroku. Następnie określ styl i interaktywność warstwy zbioru danych. Więcej informacji znajdziesz w kompletnym przewodniku po stylu opartym na danych za pomocą zbiorów danych.

Możesz dostosować styl, dodać moduły obsługi zdarzeń, by dynamicznie zmieniać styl, i korzystać z innych funkcji interfejsu Maps JS API. Zobacz przykłady w dokumentacji. Poniżej zdefiniujemy funkcję setStyle służącą do tworzenia stylu funkcji punktu i linii dla tego przykładu, na podstawie atrybutu „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,
           }
     }
}

Uwaga: pamiętaj, aby zawsze dodawać atrybucję do zbioru danych do aplikacji z mapami. Aby dodać atrybucję OSM, skorzystaj z przykładowego kodu atrybucji w dokumentacji zgodnie z wytycznymi OSM.

Powyższy kod po zainicjowaniu w aplikacji internetowej na jednej stronie generuje następujący wizualizację danych mapy:

mapa londyńskiej kolei

Tutaj możesz rozszerzyć wizualizację mapy za pomocą funkcji setStyle(), dodając reguły filtrowania funkcji, dodając styl na podstawie interakcji użytkownika i wchodząc w interakcję z pozostałą częścią aplikacji.

Podsumowanie

W tym artykule omówiliśmy architekturę referencyjną i przykładową implementację dużej aplikacji do wizualizacji danych przy użyciu Google Cloud i Google Maps Platform. Korzystając z tej architektury referencyjnej, możesz przy użyciu interfejsu Google Maps Datasets API tworzyć aplikacje do wizualizacji danych o lokalizacji, korzystając z dowolnych danych w BigQuery w GCP, które działają na dowolnym urządzeniu.

Następne działania

Więcej informacji:

Współtwórcy

Główni autorzy:

  • Ryan Baumann, menedżer ds. inżynierii rozwiązań Google Maps Platform