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

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

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

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

ארכיטקטורה לדוגמה

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

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

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

דיאגרמת ארכיטקטורה

שיקולים בתכנון

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

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

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

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

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

  1. גישה ל-BigQuery Sandbox ולמסוף Cloud
  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 כדי לשלוח שאילתה על כל מסילות הרכבת, שמסוננות רק ללונדון באמצעות תיבה תוחמת (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.

הערה: כדי לאמת באופן חזותי את תוצאות השאילתה לפני שיוצרים קבוצת נתונים, אפשר להמחיש במהירות את הנתונים בלוח בקרה מ-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 מפלט השאילתה ב-Google Cloud Storage ‏ (GCS). באמצעות Datasets API, אתם יכולים ליצור קבוצת נתונים ואז להעלות נתונים לקבוצת הנתונים מקובץ שמתארח ב-GCS.

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

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

תצוגה מקדימה של קבוצת הנתונים

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

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

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

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

אתם יכולים להתאים אישית את הסגנון, להוסיף גורמים מטפלים באירועים כדי לשנות את הסגנון באופן דינמי ועוד באמצעות Maps JS 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,
           }
     }
}

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

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

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

סיכום

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

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

קריאה נוספת:

תורמים

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

  • ‫Ryan Baumann, מנהל הנדסת פתרונות בפלטפורמה של מפות Google