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

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

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

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

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

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

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

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

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

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

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

  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. יכול להיות שמשבצות במפה לא יכללו תכונות צפופות או מורכבות ברמות זום נמוכות יותר. כשמשתמש מצמצם את התצוגה לרמת המדינה (למשל z5-z12), יכול להיות שהמפה תיראה שונה מאשר כשהוא מגדיל את התצוגה לרמת העיר או השכונה (למשל z13-z18).

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

בדוגמה הזו, נשתמש בארכיטקטורת ההפניה כדי ליצור אפליקציית אינטרנט באמצעות 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 Console כדי להריץ שאילתה בטבלה באמצעות 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 – משייכים את מערך הנתונים למזהה מפה

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

שלב 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 Maps Platform. באמצעות ארכיטקטורת ההפניה הזו, אתם יכולים ליצור אפליקציות להמחשת נתונים של מיקום מכל נתון ב-Google Cloud BigQuery, שפועלות ביעילות בכל מכשיר באמצעות Google Maps Datasets API.

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

קריאה נוספת:

תורמים

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

  • Ryan Baumann, Google Maps Platform Solutions Engineering Manager