המחשה ויזואלית של הנתונים באמצעות BigQuery ו-Datasets API

המסמך מספק ארכיטקטורת עזר ודוגמה ליצירת תצוגות חזותיות של נתוני מפות עם נתוני מיקום ב-Google Cloud Platform BigQuery וב-Google Maps Platform Datasets API, כמו ניתוח נתונים עירוניים פתוחים, יצירת מפת כיסוי של התקשורת, או הצגת עקבות של תנועת צי רכבי נייד.

תצוגות חזותיות של נתוני מפות הן כלי יעיל מאוד ליצירת מעורבות של משתמשים ולחשיפת תובנות מרחביות בנתוני המיקום. נתוני מיקום הם נתונים שכוללים תכונות של נקודה, קו או פוליגון. לדוגמה, מפות מזג אוויר עוזרות לצרכנים להבין ולתכנן נסיעות ולהתכונן לקראת סופות; מפות של בינה עסקית (BI) עוזרות למשתמשים לגלות תובנות מניתוח הנתונים שלהם, ומפות תקשורת עוזרות למשתמשים להבין את הכיסוי והאיכות של הספקים שלהם באזור שירות נתון.

עם זאת, למפתחי אפליקציות קשה ליצור תצוגות חזותיות גדולות של נתוני מפות שמניבות ביצועים טובים ומספקות חוויית משתמש מעולה. יש לטעון נתונים גדולים בצד לקוח הזיכרון, וכתוצאה מכך זמן הטעינה של המפה הראשונה איטי. הרכיבים החזותיים חייבים להיות תקינים בכל המכשירים, כולל טלפונים ניידים פשוטים יותר עם מגבלות זיכרון ו-GPU. לבסוף, מפתחים צריכים לבחור ספרייה גדולה לעיבוד נתונים שהיא ניידת, אמינה ויעילה עם כמות גדולה של נתונים.

ארכיטקטורת עזר

לפיתוח אפליקציות עם תצוגות חזותיות גדולות של נתונים נדרשים שני רכיבים עיקריים.

  1. הקצה העורפי של הלקוח – כל הנתונים והשירותים של האפליקציה לקצה העורפי, כמו עיבוד ואחסון.
  2. לקוח לקוח – ממשק המשתמש של האפליקציה שלכם שכולל רכיב של תצוגה חזותית של מפה.

בהמשך מופיע תרשים מערכת שמראה את האינטראקציה בין שני הרכיבים האלה עם המשתמש באפליקציה, עם Google Cloud ועם הפלטפורמה של מפות Google, במטרה ליצור אפליקציה גדולה להמחשה חזותית של נתונים.

תרשים ארכיטקטורה

⭐ הערה: Maps Datasets API הוא מוצר טרום-GA. לפרטים נוספים אפשר לעיין בתנאים ובהגבלות.

שיקולי עיצוב

יש כמה שיקולי תכנון כדי ליצור תצוגה חזותית יעילה של נתונים באמצעות Google Cloud והפלטפורמה של מפות Google.

  1. גודל נתוני המקור ותדירות העדכון.
    1. אם נתוני המקור בפורמט Geojson הם קטנים מ-5MB או שהם מתעדכנים לעיתים קרובות מאוד, למשל תחזית רדאר בזמן אמת בקשר למזג האוויר, כדאי להציג את הנתונים כצד הלקוח של האובייקטים של geojson באפליקציה ולעבד אותם באמצעות שכבת deck.gl.
    2. אם גודל הנתונים עולה על 5MB והם מתעדכנים רק פעם אחת בשעה, כדאי להשתמש בארכיטקטורת ה-API של מערכי הנתונים שבמסמך הזה.
      1. מערכי נתונים תומכים בקבצים בגודל של עד 350MB.
      2. אם הנתונים שלך גדולים מ-350MB, כדאי לקצץ או לפשט נתונים גיאומטריים בקובץ המקור לפני המעבר למערכי נתונים (ראו בהמשך 'חיתוך נתונים').
  2. סכימה ופורמט
    1. מוודאים שלנתונים יש נכס מזהה ייחודי גלובלי לכל תכונה. מזהה ייחודי מאפשר לכם לבחור ולעצב תכונה ספציפית או לאחד נתונים לתכונה להצגה חזותית. למשל, עיצוב של תכונה שנבחרה באירוע 'קליק' של משתמש.
    2. פורמט הנתונים צריך להיות CSV או GeoJSON בהתאם למפרט של Datasets API, עם שמות עמודות, סוגי נתונים וסוגים חוקיים של אובייקטים של GeoJSON.
    3. כדי ליצור בקלות מערכי נתונים מ-BigQuery, אפשר ליצור עמודה בשם wkt בייצוא של קובץ CSV ב-SQL. מערכי נתונים תומכים בייבוא גיאומטריה מקובץ CSV בפורמט טקסט ידוע (WKT) מעמודה בשם wkt.
    4. בודקים שהנתונים גיאומטריים וסוגי נתונים תקינים. לדוגמה, GeoJSON חייב להיות במערכת הקואורדינטות WGS84, סדר ליפוף הגיאומטריה וכו'.
    5. משתמשים בכלי כמו geojson-validate כדי לוודא שכל הגאומטריות בקובץ המקור תקינות, או להשתמש ב-ogr2ogr כדי לשנות קובץ מקור בין פורמטים או של מערכות קואורדינטות.
  3. קיצוץ נתונים
    1. צמצם את מספר המאפיינים של תכונות. אפשר לצרף נכסים נוספים לתכונה בזמן ריצה במפתח מזהה ייחודי (דוגמה).
    2. כשניתן, כדאי להשתמש בסוגי נתונים של מספרים שלמים לאובייקטים של נכסים כדי לצמצם את שטח האחסון של האריחים, וכך לשמור על רמת הביצועים של משבצות לטעינה ב-HTTPS באפליקציית לקוח.
    3. פישוט ו/או צבירה של גיאומטריה של תכונות מורכבות מאוד. מומלץ להשתמש בפונקציות BigQuery כמו ST_Simplify כשמדובר בגאומטריה מורכבת של פוליגונים כדי לצמצם את הגודל של קובץ המקור ולשפר את ביצועי המפה.
  4. אריחים
    1. API של מפות Google למערכי נתונים יוצר אריחי מפה מקובץ נתוני המקור שלך לשימוש ב-API של JS של מפות Google.
    2. משבצות מפה הן מערכת הוספה לאינדקס שמבוססת על מרחק מתצוגה, שמספקת דרכים יעילות יותר לטעון נתונים לאפליקציה ויזואלית.
    3. משבצות מפה עשויות להשתחרר תכונות מורכבות או צפופות ברמות נמוכות יותר של מרחק התצוגה. כאשר משתמש מקטין את התצוגה של מדינה או מדינה (לדוגמה, z5-z12) עשוי להיראות שונה לעומת התצוגה של עיר או שכונה (לדוגמה, z13-z18).

דוגמה - רכבות בלונדון

בדוגמה הזו נחיל את ארכיטקטורת העזר כדי ליצור אפליקציית אינטרנט באמצעות GCP ומפות Google שמציגה באופן חזותי את כל מסילות הרכבת בלונדון מנתוני Open Street Map (OSM).

דרישות מוקדמות

  1. גישה ל-BigQuery Sandbox ולמסוף Cloud
  2. יש לוודא שיש לך פרויקט GCP וחשבון לחיוב.

שלב 1 – הרצת שאילתות על הנתונים ב-BigQuery

עוברים אל BigQuery Public Datasets. מערך הנתונים 'bigquery-public-data' והטבלה geo_openstreetmap.planet_features מכילים את הנתונים המלאים של מפת הרחובות הפתוחים (OSM) בעולם, כולל כל התכונות האפשריות. מידע על כל התכונות הזמינות לשאילתה ב-OSM Wiki, כולל amenity, road ו-landuse.

כדי לבצע שאילתות על הטבלה באמצעות SQL, משתמשים ב-Cloud Shell או ב-BigQuery Cloud Console(https://console.cloud.google.com). בקטע הקוד הבא השתמש בפקודה bq query כדי לבצע שאילתה על כל מסילות הרכבת שסוננו ללונדון בלבד. לשם כך, השתמש בתיבה תוחמת (bounding box) והפונקציה ST_Intersects().

כדי לבצע את השאילתה הזו מ-Cloud Shell, מריצים את קטע הקוד הבא ומעדכנים את מזהה הפרויקט, מערך הנתונים ושם הטבלה עבור הסביבה שלכם.

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

השאילתה מחזירה:

  1. מזהה ייחודי לכל תכונה osm_id
  2. הfeature_type למשל נקודות, קווים וכו'
  3. name של התכונה, למשל Paddington Station
  4. הסוג railway, למשל ראשי, תיירות, צבא וכו'
  5. ה-wkt של העצם - גיאומטריה של נקודה, קו או פוליגון בפורמט WKT. WKT הוא פורמט הנתונים הרגיל של העמודות Geography של BigQuery שמוחזרות בשאילתה.

הערה: כדי לאמת באופן חזותי את תוצאות השאילתה לפני שיוצרים מערך נתונים, אפשר להשתמש ב-Looker Studio כדי להמחיש במהירות את הנתונים במרכז בקרה ב-BigQuery.

כדי לייצא את הטבלה לקובץ CSV בקטגוריה של Google Cloud Storage, משתמשים בפקודה bq pull ב-Cloud Shell:

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

הערה: אפשר להפוך כל שלב לאוטומטי באמצעות Cloud Scheduler כדי לעדכן את הנתונים באופן קבוע.

שלב 2 – יוצרים מערך נתונים מקובץ ה-CSV

בשלב הבא, יוצרים מערך נתונים של הפלטפורמה של מפות Google מפלט השאילתה ב-Google Cloud Storage (GCS). באמצעות Datasets API, אפשר ליצור מערך נתונים ולאחר מכן להעלות נתונים למערך הנתונים מקובץ שמתארח ב-GCS.

כדי להתחיל, צריך להפעיל את Maps Datasets API בפרויקט GCP ולעיין במסמכי ה-API. כדי לקרוא ל-Datasets API מלוגיקה בקצה העורפי של האפליקציה, יש ספריות לקוח של Python ו-Node.js. בנוסף, יש GUI של מערכי נתונים ליצירה ידנית של מערכי נתונים במסוף Cloud.

כשההעלאה של מערך הנתונים תסתיים, תוכלו להציג תצוגה מקדימה של מערך הנתונים ב-GUI של מערכי הנתונים.

תצוגה מקדימה של מערך הנתונים

שלב 4 – שיוך מערך הנתונים למזהה המפה

לאחר יצירת מערך הנתונים, ניתן ליצור מזהה מפה עם סגנון מפה משויך. בעורך סגנון המפה, ניתן לשייך מזהה מפה וסגנון למערך הנתונים. כאן גם אפשר להחיל עיצוב מפה מבוסס-ענן כדי להתאים אישית את המראה והתחושה של המפה.

שלב 5 – יוצרים המחשה חזותית של המפה באפליקציה

לבסוף, ניתן להוסיף את מערך הנתונים לאפליקציה להצגה חזותית של נתונים בצד הלקוח באמצעות API של JS למפות Google. מאתחלים את אובייקט המפה באמצעות מזהה ה-mapID שמשויך למערך הנתונים מהשלב הקודם. לאחר מכן מגדירים את הסגנון ואת האינטראקטיביות של שכבת מערך הנתונים. לפרטים נוספים, מומלץ לעיין במדריך המלא ליצירת סגנון מבוסס-נתונים באמצעות מערכי נתונים.

באמצעות ה-API של JS API אפשר להתאים אישית את הסגנון ולהוסיף גורמים מטפלים באירועים לשינוי הסגנון באופן דינמי ועוד. בdocs אפשר לראות דוגמאות. בהמשך נגדיר פונקציית setStyle כדי ליצור את סגנון תכונת הנקודה והקו בדוגמה הזו על סמך המאפיין 'feature_type'.

הערה – הקפידו להשתמש בערוץ v=beta עבור ההטמעה של Maps JS API.

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,
           }
     }
}

הערה: הקפידו תמיד להוסיף שיוך (Attribution) למערך הנתונים שלכם לאפליקציית המפה. כדי להוסיף שיוך OSM, צריך לפעול לפי הדוגמה של קוד השיוך במסמכים בהתאם להנחיות של OSM.

הקוד שלמעלה, כשהוא אותחל באפליקציית אינטרנט בדף יחיד, מניב את נתוני המפה הבאים:

מפת הרכבת של לונדון

מכאן אפשר להרחיב את התצוגה החזותית של המפה בפונקציה setStyle() באמצעות הוספת לוגיקה לסינון תכונות, הוספת סגנון המבוסס על האינטראקציה של המשתמש ואינטראקציה עם שאר האפליקציה.

סיכום

במאמר הזה עסקנו בארכיטקטורת עזר ובהטמעה לדוגמה של אפליקציה גדולה להמחשה חזותית של נתונים באמצעות Google Cloud והפלטפורמה של מפות Google. באמצעות ארכיטקטורת העזר הזו, אפשר ליצור אפליקציות להמחשה חזותית של נתוני מיקום מכל הנתונים ב-GCP BigQuery שמניבים ביצועים טובים בכל מכשיר באמצעות API של מפות Google למערכי נתונים.

הפעולות הבאות

קריאה נוספת:

תורמים

מחברים ראשיים:

  • ריאן באומן, מנהל הנדסת הפתרונות של הפלטפורמה של מפות Google