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

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

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

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

תרשים עזר לארכיטקטורה

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

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

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

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

שיקולים לגבי העיצוב

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

  1. גודל נתוני המקור ותדירות העדכון.
    1. אם נתוני המקור בפורמט geojson הם <5mb או מתעדכנים בתדירות גבוהה מאוד, למשל תחזית מכ"ם מזג אוויר בזמן אמת, כדאי להציג את הנתונים כאובייקט geojson בצד הלקוח באפליקציה ולעבד אותם באמצעות שכבת deck.gl.
    2. אם גודל הנתונים שלכם גדול מ-5MB והם מתעדכנים לא יותר מפעם בשעה, כדאי לעיין בארכיטקטורה של Datasets API שמתוארת במסמך הזה.
      1. מערכי נתונים תומכים בקבצים בגודל של עד 350MB.
      2. אם הנתונים גדולים מ-350MB, כדאי לשקול גיזום או פישוט של נתוני גיאומטריה בקובץ המקור לפני העברתם ל-Datasets (ראו 'גיזום נתונים' בהמשך).
  2. סכימה ופורמט
    1. חשוב לוודא שלכל תכונה בנתונים יש מאפיין מזהה ייחודי גלובלית. מזהה ייחודי מאפשר לכם לבחור תכונה ספציפית ולעצב אותה, או לצרף נתונים לתכונה כדי להציג אותם באופן חזותי. לדוגמה, אפשר לעצב תכונה שנבחרה באירוע המשתמש 'קליק'.
    2. מעצבים את הנתונים בפורמט CSV או GeoJSON בהתאם למפרט של Datasets API, עם שמות עמודות, סוגי נתונים וסוגי אובייקטים של GeoJSON תקינים.
    3. כדי ליצור בקלות מערכי נתונים מ-BigQuery, יוצרים עמודה בשם wkt בייצוא של ה-CSV מ-SQL. במערכי נתונים אפשר לייבא גיאומטריה מקובץ CSV בפורמט Well-Known Text ‏ (WKT) מעמודה בשם wkt.
    4. צריך לוודא שהנתונים הם גיאומטריה וסוגי נתונים תקינים. לדוגמה, GeoJSON צריך להיות במערכת הקואורדינטות WGS84, בסדר הפיתול של הגיאומטריה וכו'.
    5. כדי לוודא שכל הגיאומטריות בקובץ מקור תקינות, אפשר להשתמש בכלי כמו geojson-validate. כדי להמיר קובץ מקור בין פורמטים או מערכות קואורדינטות, אפשר להשתמש ב-ogr2ogr.
  3. הסרת נתונים
    1. צריך לצמצם את מספר המאפיינים של התכונות. אפשר לצרף מאפיינים נוספים לתכונה בזמן הריצה באמצעות מפתח מזהה ייחודי (דוגמה).
    2. כדי לצמצם את נפח האחסון של המשבצות, מומלץ להשתמש בסוגי נתונים של מספרים שלמים לאובייקטים של מאפיינים, כדי שהמשבצות יפעלו בצורה יעילה וייטענו דרך HTTPS באפליקציית לקוח.
    3. לפשט צורות גיאומטריות מורכבות מאוד או לצבור אותן. אפשר להשתמש בפונקציות של BigQuery כמו ST_Simplify בצורות גיאומטריות מורכבות של מצולעים כדי להקטין את גודל קובץ המקור ולשפר את הביצועים של המפה.
  4. Tiling
    1. ‫Google Maps Datasets API יוצר משבצות מפה מקובץ נתוני המקור שלכם לשימוש עם SDK של מפות לאינטרנט או לנייד.
    2. משבצות מפה הן מערכת אינדוקס שמבוססת על זום ומספקת דרכים יעילות יותר לטעינת נתונים באפליקציה חזותית.
    3. יכול להיות שקטעי מפה יציגו פחות תכונות צפופות או מורכבות ברמות זום נמוכות יותר. כשמשתמש מצמצם את התצוגה למדינה או לאזור (למשל, רמות זום 5 עד 12), המפה עשויה להיראות שונה מאשר כשהוא מגדיל את התצוגה לעיר או לשכונה (למשל, רמות זום 13 עד 18).

דוגמה – מסילות רכבת בלונדון

בדוגמה הזו, נשתמש בארכיטקטורת ההפניה כדי ליצור אפליקציית אינטרנט באמצעות Google Cloud ומפות Google, שתציג את כל מסילות הרכבת בלונדון על סמך נתונים מ-Open Street Map‏ (OSM).

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

  1. גישה אל ארגז החול של BigQuery ואל Cloud Console
  2. מוודאים שיש לכם פרויקט וחשבון לחיוב ב-Google Cloud.

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

עוברים אל מערכי נתונים ציבוריים של BigQuery. מערך הנתונים bigquery-public-data והטבלה geo_openstreetmap.planet_features מכילים את כל הנתונים של Open Street Map (OSM) מכל העולם, כולל כל התכונות האפשריות. אפשר לעיין בכל התכונות הזמינות לחיפוש ב-OSM Wiki, כולל amenity, ‏ road ו-landuse.

משתמשים ב-Cloud Shell או במסוף BigQuery Cloud כדי להריץ שאילתה בטבלה באמצעות SQL. קטע הקוד שבהמשך משתמש בפקודה bq query כדי לבצע שאילתה על כל מסילות הברזל, עם סינון רק לאזור לונדון באמצעות תיבת תוחמת והפונקציה 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 הוא פורמט הנתונים הסטנדרטי שמוחזר בשאילתה בעמודות של מיקומי BigQuery.

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

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

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

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

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

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

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

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

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

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

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

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

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

אפשר להתאים אישית את הסגנון, להוסיף רכיבי handler של אירועים כדי לשנות את הסגנון באופן דינמי ועוד באמצעות Maps JavaScript API. דוגמאות בהמשך נגדיר פונקציה setStyle כדי ליצור את הסגנון של תכונת הנקודה והקו בדוגמה הזו על סמך המאפיין 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,
           }
     }
}

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

london railway map

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

סיכום

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

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

קריאה נוספת:

תורמים

המחברים העיקריים:

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