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 mapowych to potężne narzędzie do zwiększania zaangażowania użytkowników i uzyskiwania statystyk przestrzennych na podstawie danych o lokalizacji. Dane o lokalizacji to dane, które zawierają obiekty punktowe, liniowe lub wielokątne. Na przykład mapy pogody pomagają konsumentom analizować i planować wyjazdy oraz przygotować się na burze, mapy analityki biznesowej pomagają użytkownikom wyciągać wnioski z analizy danych, a mapy telekomunikacyjne pomagają użytkownikom poznać zasięg i jakość usług usługodawców na danym obszarze.

Deweloperom aplikacji trudno jednak tworzyć wizualizacje dużych zbiorów danych mapowych, które są wydajne i zapewniają użytkownikom świetne wrażenia. Duże dane muszą być wczytywane do pamięci po stronie klienta, co powoduje długi czas wczytywania mapy. Elementy wizualne muszą działać prawidłowo na wszystkich urządzeniach, w tym na tańszych telefonach komórkowych, które mają ograniczenia pamięci i procesora graficznego. Na koniec deweloperzy muszą wybrać bibliotekę do renderowania dużych danych, która jest przenośna, niezawodna i wydajna w przypadku dużych danych.

Architektura referencyjna

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

  1. Backend klienta – wszystkie dane i usługi aplikacji backendowej, takie jak przetwarzanie i przechowywanie.
  2. Klient klienta – interfejs aplikacji z komponentem wizualizacji mapy.

Poniżej znajduje się diagram systemu pokazujący, jak te 2 elementy współdziałają z użytkownikiem aplikacji, Google Cloud i Google Maps Platform, aby utworzyć aplikację do wizualizacji dużych zbiorów danych.

schemat architektury

Uwagi dotyczące projektu

Aby utworzyć wydajną wizualizację danych za pomocą Google Cloud i Google Maps Platform, należy wziąć pod uwagę kilka kwestii projektowych.

  1. Rozmiar danych źródłowych i częstotliwość ich aktualizacji.
    1. Jeśli dane źródłowe w formacie geojson mają mniej niż 5 MB lub są aktualizowane bardzo często (np. prognoza pogody na żywo), rozważ udostępnianie danych jako obiektu geojson po stronie klienta w aplikacji i renderowanie za pomocą 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. Zbiór danych obsługuje pliki o rozmiarze do 350 MB.
      2. Jeśli dane są większe niż 350 MB, przed przekazaniem ich do zbiorów danych zastanów się nad odcięciem lub uproszczeniem danych geometrycznych w pliku źródłowym (patrz Odcinanie danych poniżej).
  2. Schemat i format
    1. Upewnij się, że dane mają niepowtarzalny 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, używając prawidłowych nazw kolumn, typów danych i typów obiektów GeoJSON.
    3. Aby ułatwić tworzenie zbiorów danych z BigQuery, utwórz w eksporcie CSV do SQL kolumnę o nazwie wkt. Zbiory danych obsługują importowanie geometrii z pliku CSV w formacie Well-Known Text (WKT) z kolumny o nazwie wkt.
    4. Sprawdź, czy dane mają prawidłową geometrię i typy danych. Na przykład GeoJSON musi być w układzie współrzędnych WGS84, kolejności zwinięcia geometrii itd.
    5. Użyj narzędzia takiego jak geojson-validate, aby sprawdzić, czy wszystkie geometrie w pliku źródłowym są poprawne, lub narzędzia ogr2ogr, aby przekształcić plik źródłowy między formatami lub systemami współrzędnych.
  3. Oczyszczanie danych
    1. Zminimalizuj liczbę właściwości cech. W czasie wykonywania możesz złączać z funkcją dodatkowe właściwości na podstawie unikalnego klucza identyfikatora (przykład).
    2. W miarę możliwości używaj typów danych liczb całkowitych w przypadku obiektów właściwości, aby zminimalizować ilość miejsca na dane w płytkach i utrzymać ich wydajność podczas wczytywania przez aplikację klienta przez HTTPS.
    3. Uprość lub zgrupowań bardzo złożonych geometrii obiektów. Zastanów się nad użyciem 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. Płytka
    1. Interfejs Maps Datasets API tworzy kafelki mapy na podstawie pliku danych źródłowych, aby można było go używać z pakietem SDK Map Google na potrzeby witryny lub aplikacji mobilnej.
    2. Fragmenty mapy to system indeksowania oparty na powiększeniu, który zapewnia efektywniejsze sposoby wczytywania danych do aplikacji wizualnej.
    3. Fragmenty mapy mogą pomijać gęste lub złożone elementy na niższych poziomach powiększenia. Gdy użytkownik oddali widok do stanu lub kraju (np. z5-z12), może wyglądać inaczej niż w przypadku zbliżenia widoku do miasta lub dzielnicy (np. z13-z18).

Przykład: linie kolejowe w Londynie

W tym przykładzie zastosujemy architekturę referencyjną, aby utworzyć aplikację internetową z GCP i Mapami 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 konsoli Cloud;
  2. Upewnij się, że masz skonfigurowany projekt i konto rozliczeniowe GCP.

Krok 1. Wysyłanie zapytań do danych w BigQuery

Otwórz publiczne zbiory danych BigQuery. Zbiór danych „bigquery-public-data” oraz tabela geo_openstreetmap.planet_features zawierają dane Open Street Map z całej kuli ziemskiej, w tym wszystkie możliwe funkcje. Dowiedz się więcej o dostępnych funkcjach, które można zapytać w Wiki OSM, w tym o amenity, roadlanduse.

Użyj Cloud Shell lub konsoli BigQuery Cloud(https://console.cloud.google.com), aby wysłać zapytanie do tabeli za pomocą SQL. Fragment kodu poniżej używa polecenia bq query do wysłania zapytania do wszystkich linii kolejowych, które zostały odfiltrowane tylko do Londynu za pomocą prostokąta ograniczającego i funkcji ST_Intersects().

Aby wykonać to zapytanie w Cloud Shell, uruchom ten fragment kodu, aktualizując identyfikator projektu, zbiór danych i nazwę tabeli w swoim środowisku.

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. niepowtarzalny identyfikator każdej funkcji.osm_id
  2. feature_type np.punkty, linie itp.
  3. name funkcji, np. Paddington Station
  4. Typ railway: główny, turystyczny, wojskowy itp.
  5. wkt obiektu – geometria punktowa, liniowa lub wielokątna w formacie WKT. WKT to standardowy format danych BigQuery „Kolumny geograficzne” zwracane w zapytaniu.

Uwaga: aby przed utworzeniem zbioru danych wizualnie sprawdzić wyniki zapytania, możesz szybko zwizualizować dane w panelu BigQuery za pomocą Looker Studio.

Aby wyeksportować tabelę do pliku CSV w zasośniku Google Cloud Storage, użyj w Cloud Shell polecenia bq extract:

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

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

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 potem przesłać do niego dane z pliku hostowanego w Cloud Storage.

Aby rozpocząć, włącz interfejs Maps Datasets API w projekcie GCP i zapoznaj się z dokumentacją interfejsu API. Do wywoływania interfejsu Datasets API z logiki w backendzie aplikacji służą biblioteki klienta PythonNode.js. Dodatkowo w konsoli Cloud można ręcznie tworzyć zbiory danych za pomocą interfejsu graficznego Zbiory danych.

Po przesłaniu zbioru danych możesz wyświetlić jego podgląd w interfejsie zbiorów danych.

Podgląd zbioru danych

Krok 4. Połącz 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ć definiowanie stylów map w Google Cloud, aby dostosować wygląd i działanie mapy.

Krok 5. Utwórz wizualizację mapy aplikacji klienta

Na koniec możesz dodać zbiór danych do aplikacji do wizualizacji danych po stronie klienta za pomocą interfejsu Maps JS API. Inicjuj obiekt mapy, używając identyfikatora mapy powiązanego ze zbiorem danych z poprzedniego kroku. Następnie ustaw styl i interaktywność warstwy zbioru danych. Więcej informacji znajdziesz w pełnym przewodniku po stylowaniu opartym na danych za pomocą zbiorów danych.

Za pomocą interfejsu Maps JS API możesz dostosowywać styl, dodawać moduły obsługi zdarzeń, aby zmieniać styl dynamicznie, i wykonywać inne czynności. Przykłady znajdziesz w dokumentacji. Poniżej zdefiniujemy funkcję setStyle, która utworzy styl punktów i linii w tym przykładzie 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: zawsze dodawaj do aplikacji mapowej informacje o źródle danych. Aby dodać informacje o źródle OSM, postępuj zgodnie z przykładem kodu informacji o źródle w dokumentacji, przestrzegając wytycznych OSM.

Po zainicjowaniu w ramach aplikacji internetowej na jednej stronie ten kod powoduje wyświetlenie tych danych mapy:

mapa kolejowa Londynu

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ę odniesienia i przykładową implementację dużej aplikacji do wizualizacji danych z wykorzystaniem Google Cloud i Google Maps Platform. Dzięki tej architekturze referencyjnej możesz tworzyć aplikacje do wizualizacji danych o lokalizacji na podstawie dowolnych danych w GCP BigQuery, które działają sprawnie na dowolnym urządzeniu i korzystają z interfejsu API Zbiorów danych Google Maps.

Dalsze działania

Więcej informacji:

Współtwórcy

Główni autorzy:

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