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

במסמך הזה מפורטת ארכיטקטורת עזר ודוגמה ליצירת תצוגות חזותיות של נתוני מפות עם נתוני מיקום ב-Google Cloud Platform 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, מומלץ לקצץ או לפשט את נתוני הגיאומטריה בקובץ המקור לפני שמעבירים אותם למערכי נתונים (ראו 'גיזום נתונים' בהמשך).
  2. סכימה ופורמט
    1. חשוב לוודא שלכל תכונה בנתונים יש מאפיין מזהה ייחודי ברמה הגלובלית. מזהה ייחודי מאפשר לכם לבחור מאפיין ספציפי ולקבוע לו סגנון, או לצרף נתונים למאפיין כדי להציג אותו באופן חזותי. לדוגמה, אפשר לקבוע סגנון למאפיין שנבחר באירוע המשתמש 'קליק'.
    2. מעצבים את הנתונים כקובץ CSV או GeoJSON בהתאם למפרט של Datasets API, עם שמות עמודות, סוגי נתונים ואובייקטים של GeoJSON תקינים.
    3. כדי ליצור בקלות מערכי נתונים מ-BigQuery, צריך ליצור עמודה בשם wkt בייצוא של קובץ ה-CSV של SQL. Datasets תומך בייבוא גיאומטריה מקובץ CSV בפורמט טקסט מוכר (WKT) מעמודה בשם wkt.
    4. בודקים שהנתונים הם גיאומטריה וסוגים תקינים של נתונים. לדוגמה, קובץ GeoJSON חייב להיות במערכת הקואורדינטות WGS84, בסדר ספירלי של גיאומטריה וכו'.
    5. אפשר להשתמש בכלי כמו geojson-validate כדי לוודא שכל הגיאומטריות בקובץ המקור תקינות, או ב-ogr2ogr כדי להמיר קובץ מקור בין פורמטים או בין מערכות קואורדינטות.
  3. קיצוץ נתונים
    1. צמצום מספר המאפיינים של תכונות. אפשר לצרף נכסים נוספים לתכונה בזמן הריצה באמצעות מפתח מזהה ייחודי (דוגמה).
    2. כשהדבר אפשרי, כדאי להשתמש בסוגי נתונים שלמים באובייקטים של נכסים כדי לצמצם את נפח האחסון של המשבצות, תוך שמירה על ביצועים טובים של המשבצות לטעינת אפליקציית לקוח דרך HTTPS.
    3. פשטו או צברו גיאומטריות של תכונות מורכבות מאוד. מומלץ להשתמש בפונקציות של BigQuery כמו ST_Simplify על גיאומטריות של פוליגונים מורכבים כדי לצמצם את גודל קובץ המקור ולשפר את ביצועי המפה.
  4. מיקום תמונות ברצף
    1. Google Maps Datasets API יוצר משבצות מפה מקובץ נתוני המקור שלכם, לשימוש עם ערכת SDK של מפות Google לאינטרנט או לנייד.
    2. משבצות מפה הן מערכת הוספה לאינדקס המבוססת על זום, שמספקת דרכים יעילות יותר לטעינת נתונים לאפליקציה ויזואלית.
    3. יכול להיות שקטעי המפה לא יכללו תכונות צפופות או מורכבות ברמות זום נמוכות יותר. כאשר משתמש מקטין את התצוגה למדינה או למדינה (למשל z5-z12) עשוי להיראות שונה מאשר כשמתקרבים לעיר או לשכונה (לדוגמה, z13-z18).

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

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

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

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

שלב 1 – שאילתת נתונים ב-BigQuery

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

משתמשים ב-Cloud Shell או במסוף Cloud של BigQuery‏(https://console.cloud.google.com) כדי להריץ שאילתות על הטבלה באמצעות 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 Geography בשאילתה.

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

כדי לייצא את הטבלה לקובץ CSV בקטגוריה של Google Cloud Storage, משתמשים בפקודה bq האיץ ב-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. יש ספריות לקוח ל-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,
           }
     }
}

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

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

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

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

סיכום

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

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

קריאה נוספת:

תורמים

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

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