Wizualizacja danych za pomocą BigQuery i Datasets API

Ten dokument zawiera architekturę referencyjną i przykład tworzenia wizualizacji map z danymi o lokalizacji w Google Cloud Platform BigQuery i Google Maps Platform Datasets API, np. do analizowania otwartych danych komunalnych, tworzenia mapy zasięgu telekomunikacyjnego czy wizualizacji śledzenia ruchu floty pojazdów mobilnych.

Wizualizacje danych na mapie to zaawansowane narzędzie do angażowania użytkowników i odkrywania trendów przestrzennych w danych o lokalizacji. Dane o lokalizacji to dane zawierające obiekty w postaci punktów, linii lub wielokątów. Na przykład mapy pogody pomagają konsumentom zrozumieć i planować wyjazdy oraz przygotować się na burze. Mapy analityki biznesowej pomagają użytkownikom odkrywać informacje z analiz danych, a mapy telekomunikacyjne pomagają użytkownikom poznać zasięg i jakość dostawców na danym obszarze.

Deweloperom aplikacji trudno jest jednak tworzyć skuteczne wizualizacje danych map, które zapewniają wygodę 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ą być dobrze widoczne na wszystkich urządzeniach, w tym na telefonach komórkowych z niższej półki, które mają ograniczoną pamięć i układ GPU. Na koniec trzeba wybrać dużą bibliotekę renderowania, która jest przenośna, niezawodna i wydajna z dużą ilością danych.

Architektura referencyjna

Tworzenie aplikacji z dużymi wizualizacjami danych wymaga 2 głównych komponentów.

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

Poniżej znajduje się schemat systemu pokazujący, jak te 2 komponenty wchodzą w interakcję z użytkownikiem aplikacji, Google Cloud i Google Maps Platform w celu utworzenia aplikacji do wizualizacji dużych ilości danych.

schemat architektury

⭐ Uwaga: interfejs Maps Datasets API jest usługą sprzed GA. Szczegółowe informacje znajdziesz w Warunkach korzystania z usługi.

Uwagi dotyczące projektu

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

  1. Rozmiar danych źródłowych i częstotliwość aktualizacji.
    1. Jeśli dane źródłowe w formacie GeoJSON mają mniej niż 5 MB lub są aktualizowane bardzo często, np. są to prognozy z radaru pogody na żywo, rozważ udostępnianie danych w formie obiektu GeoJSON po stronie klienta i renderowanie za pomocą warstwy deck.gl.
    2. Jeśli Twoje dane mają rozmiar większy niż 5 MB i są aktualizowane nie częściej niż raz na godzinę, weź pod uwagę architekturę interfejsu Datasets API przedstawioną w tym dokumencie.
      1. Zbiory danych obsługują pliki o rozmiarze do 350 MB.
      2. Jeśli dane są większe niż 350 MB, rozważ ich przycięcie lub uproszczenie danych geometrycznych w pliku źródłowym przed przekazaniem ich do zbiorów danych (patrz: Przycinanie danych poniżej).
  2. Schemat i format
    1. Upewnij się, że dane mają globalnie unikalny identyfikator dla każdej funkcji. Unikalny identyfikator pozwala wybrać i określić styl konkretnej funkcji lub złączyć dane z funkcją w celu wizualizacji, np. nadanie stylu wybranej funkcji na podstawie zdarzenia użytkownika polegającego na kliknięciu.
    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. W celu łatwego tworzenia zbiorów danych z BigQuery utwórz kolumnę o nazwie wkt w wyeksportowanym pliku CSV SQL. Zbiory danych obsługują importowanie geometrii z pliku CSV w formacie Well-known Text (WKT) z kolumny o nazwie wkt.
    4. Sprawdź, czy Twoje dane mają prawidłową geometrię i prawidłowe typy danych. Na przykład obiekt GeoJSON musi być w układzie współrzędnych WGS84, kolejności nawijania geometrii itd.
    5. Użyj narzędzia geojson-validate, aby sprawdzić, czy wszystkie elementy geometryczne w pliku źródłowym są prawidłowe, lub ogr2ogr, aby przekształcić plik źródłowy między formatami lub układami współrzędnych.
  3. Przycinanie danych
    1. Zminimalizuj liczbę właściwości obiektów. Dodatkowe właściwości możesz złączać z daną cechą w czasie działania za pomocą unikalnego klucza identyfikatora (przykład).
    2. Gdy to możliwe, używaj typów danych dotyczących obiektów właściwości jako liczby całkowitej, aby zminimalizować ilość miejsca na kafelki i utrzymać wydajność ładowania kafelków w aplikacji klienckiej przez HTTPS.
    3. Uprość lub agreguj bardzo złożone geometrie obiektów. W przypadku złożonych geometrii wielokątów rozważ użycie funkcji BigQuery takich jak ST_Simplify, aby zmniejszyć rozmiar pliku źródłowego i poprawić wydajność mapy.
  4. Kafelki
    1. Interfejs API Map Google tworzy kafelki map ze źródłowego pliku danych i wykorzystuje je w interfejsie API Maps JS.
    2. Fragmenty mapy to system indeksowania korzystający z powiększenia, który zapewnia bardziej efektywne sposoby wczytywania danych do aplikacji wizualnej.
    3. Fragmenty mapy mogą usuwać zwarte lub złożone obiekty przy mniejszym powiększeniu. Po pomniejszeniu widoku dla stanu lub kraju (np. z5-z12) widok może wyglądać inaczej niż po powiększeniu widoku miasta lub dzielnicy (np. z13-z18).

Przykład: Koleje w Londynie

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

Wymagania wstępne

  1. Dostęp do BigQuery Sandbox 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” i tabela geo_openstreetmap.planet_features zawierają dane z całej kuli ziemskiej z Open Street Map (OSM) obejmujące wszystkie możliwe cechy. Odkryj wszystkie funkcje, których możesz użyć w OSM Wiki, w tym amenity, road i landuse.

Użyj Cloud Shell lub BigQuery Cloud Console(https://console.cloud.google.com), aby wysłać zapytanie SQL do tabeli. Poniższy wycinek kodu używa polecenia bq query do odpytywania wszystkich linii kolejowych odfiltrowanych tylko do Londynu przy użyciu 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 swojego ś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 zwróci:

  1. unikalny identyfikator każdej cechy osm_id
  2. feature_type, np.punkty, linie itp.
  3. Wartość name obiektu, np. Paddington Station
  4. Typ railway, np.główny, turystyka, wojskowe itp.
  5. wkt obiektu – geometria punktu, linii lub wielokąta w formacie WKT. WKT to standardowy format danych zwracanych w zapytaniu kolumny geograficzne BigQuery.

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

Aby wyeksportować tabelę do pliku CSV w zasobniku Google Cloud Storage, użyj polecenia bqExtract w Cloud Shell:

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

Uwaga: możesz zautomatyzować każdy krok za pomocą narzędzia Cloud Scheduler, aby regularnie aktualizować dane.

Krok 2. Utwórz zbiór danych z pliku CSV

Następnie utwórz zbiór danych Google Maps Platform na podstawie danych wyjściowych zapytania w Google Cloud Storage (GCS). Korzystając z interfejsu Datasets API, możesz utworzyć zbiór danych, a potem 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. Istnieją biblioteki klienta dla Python i Node.js do wywoływania interfejsu Datasets API z poziomu logiki w backendzie aplikacji. Dostępna jest też interfejs GUI zbioru danych umożliwiający ręczne tworzenie zbiorów danych w Cloud Console.

Po zakończeniu przesyłania zbioru danych możesz wyświetlić podgląd zbioru danych w interfejsie GUI zbiorów 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ć Styl mapy w chmurze, aby dostosować wygląd i styl 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 API Maps JS. Zainicjuj obiekt mapy za pomocą identyfikatora mapID powiązanego ze zbiorem danych z poprzedniego kroku. Następnie określ styl i interaktywność warstwy Zbiór danych. Więcej informacji znajdziesz w pełnym przewodniku po stylu 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 dynamicznie zmieniać styl, oraz wykonywać inne czynności. Zobacz przykłady w docs. Poniżej zdefiniujemy funkcję setStyle, która w tym przykładzie utworzy styl funkcji punktowych i liniowych na podstawie atrybutu „feature_type”.

Uwaga: pamiętaj, aby w implementacji interfejsu Maps JS API używać kanału v=beta.

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ę zbioru danych do aplikacji z mapami. Aby dodać atrybucję OSM, postępuj zgodnie z przykładowym kodem atrybucji w dokumentacji i przestrzegając wytycznych OSM.

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

kolej w Londynie mapa

Tutaj możesz rozszerzyć wizualizację mapy w funkcji setStyle(), dodając logikę do funkcji filtrowania, dodając style na podstawie interakcji użytkownika i wchodząc w interakcje z resztą aplikacji.

Podsumowanie

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

Następne działania

Więcej informacji:

Współtwórcy

Główne autorzy:

  • Ryan Baumann, kierownik zespołu technicznego ds. rozwiązań w Google Maps Platform