במסמך הזה מוצגת ארכיטקטורת עזר ודוגמה ליצירת תצוגות חזותיות של נתוני מפה עם נתוני מיקום ב-Google Cloud Platform BigQuery וב-Google Maps Platform Datasets API, למשל ניתוח נתונים עירוניים פתוחים, יצירת מפת כיסוי של תקשורת או תצוגה חזותית של תנועת צי כלי רכב ניידים.
תצוגות חזותיות של נתוני מפה הן כלי יעיל ליצירת עניין בקרב המשתמשים ולחשיפה של תובנות מרחביות בנתוני המיקום. נתוני מיקום הם נתונים שכוללים ישויות של נקודות, קווים או פוליגונים. לדוגמה, מפות מזג האוויר עוזרות לצרכנים להבין את מזג האוויר, לתכנן נסיעות ולהתכונן לשיטפונות. מפות בינה עסקית עוזרות למשתמשים לגלות תובנות מניתוח הנתונים שלהם, ומפות תקשורת עוזרות למשתמשים להבין את הכיסוי והאיכות של הספקים באזור שירות נתון.
עם זאת, למפתחי אפליקציות קשה ליצור חזותיות של נתוני מפה גדולים עם ביצועים טובים וחוויית משתמש מעולה. נתונים גדולים צריכים להיות נטענים בזיכרון בצד הלקוח, וכתוצאה מכך זמני הטעינה הראשונים של המפה איטיים. הביצועים של הרכיב החזותי צריכים להיות טובים בכל המכשירים, כולל טלפונים ניידים ברמה נמוכה יותר עם מגבלות זיכרון ו-GPU. לבסוף, המפתחים צריכים לבחור ספריית עיבוד נתונים גדולים שניתנת לניהול, מהימנה ומספקת ביצועים טובים עם נתונים גדולים.
ארכיטקטורה לדוגמה
כדי לפתח אפליקציות עם תצוגות חזותיות של כמויות גדולות של נתונים, נדרשים שני רכיבים עיקריים.
- קצה עורפי של לקוח – כל הנתונים והשירותים של האפליקציה בקצה העורפי, כמו עיבוד ואחסון.
- לקוח – ממשק המשתמש של האפליקציה עם רכיב של תצוגה חזותית של מפה.
בהמשך מופיעה תרשים מערכת שמראה איך שני הרכיבים האלה פועלים עם משתמש האפליקציה, Google Cloud והפלטפורמה של מפות Google כדי ליצור אפליקציה גדולה של תצוגה חזותית של נתונים.
שיקולים לגבי עיצוב
יש כמה שיקולים שצריך לקחת בחשבון בתכנון כדי ליצור המחשה יעילה של נתונים באמצעות Google Cloud ופלטפורמת מפות Google.
- הגודל של נתוני המקור ותדירות העדכון שלהם.
- אם נתוני המקור בפורמט geojson הם קטנים מ-5MB או מתעדכנים לעיתים קרובות מאוד (למשל, תחזית מזג אוויר בזמן אמת מראדאר), מומלץ להציג את הנתונים כאובייקט geojson בצד הלקוח באפליקציה ולבצע עיבוד באמצעות שכבת deck.gl.
- אם הנתונים שלכם גדולים מ-5MB והם מתעדכנים לא יותר מפעם בשעה, כדאי להשתמש בארכיטקטורה של Datasets API שמפורטת במסמך הזה.
- מערכי נתונים תומכים בקבצים בגודל של עד 350MB.
- אם הנתונים גדולים מ-350MB, מומלץ לבצע גיזום או פישוט של נתוני הגיאומטריה בקובץ המקור לפני שמעבירים אותם למערכי נתונים (ראו 'גיזום נתונים' בהמשך).
- סכימה ופורמט
- חשוב לוודא שלכל תכונה בנתונים יש מאפיין מזהה ייחודי ברמה הגלובלית. מזהה ייחודי מאפשר לכם לבחור מאפיין ספציפי ולקבוע לו סגנון, או לצרף נתונים למאפיין כדי להציג אותו באופן חזותי. לדוגמה, אפשר לקבוע סגנון למאפיין שנבחר באירוע המשתמש 'קליק'.
- מעצבים את הנתונים כקובץ CSV או GeoJSON בהתאם למפרט של Datasets API, עם שמות עמודות, סוגי נתונים ואובייקטים של GeoJSON תקינים.
- כדי ליצור בקלות מערכי נתונים מ-BigQuery, יוצרים עמודה בשם
wkt
בייצוא ה-CSV של SQL. Datasets תומך בייבוא גיאומטריה מקובץ CSV בפורמט Well-Known Text (WKT) מעמודה בשםwkt
. - בודקים שהנתונים הם גיאומטריה וסוגים תקינים של נתונים. לדוגמה, קובץ GeoJSON חייב להיות במערכת הקואורדינטות WGS84, בסדר ספירלי של גיאומטריה וכו'.
- אפשר להשתמש בכלי כמו geojson-validate כדי לוודא שכל הגיאומטריות בקובץ המקור תקינות, או ב-ogr2ogr כדי להמיר קובץ מקור בין פורמטים או בין מערכות קואורדינטות.
- צמצום נתונים
- צמצום מספר המאפיינים של התכונות. אפשר לצרף נכסים נוספים לתכונה בזמן הריצה באמצעות מפתח מזהה ייחודי (דוגמה).
- כשהדבר אפשרי, כדאי להשתמש בסוגי נתונים שלמים באובייקטים של נכסים כדי לצמצם את נפח האחסון של המשבצות, תוך שמירה על ביצועים טובים של המשבצות לטעינת נתונים דרך HTTPS באפליקציית לקוח.
- פשטו או צברו גיאומטריות של תכונות מורכבות מאוד. מומלץ להשתמש בפונקציות של BigQuery כמו ST_Simplify על גיאומטריות של פוליגונים מורכבים כדי לצמצם את גודל קובץ המקור ולשפר את ביצועי המפה.
- מיקום תמונות ברצף
- Google Maps Datasets API יוצר משבצות מפה מקובץ נתוני המקור שלכם, לשימוש עם ערכת SDK של מפות Google לאינטרנט או לנייד.
- משבצות מפה הן מערכת של הוספה לאינדקס שמבוססת על זום, שמספקת דרכים יעילות יותר לטעינה של נתונים באפליקציה חזותית.
- יכול להיות שקטעי המפה לא יכללו תכונות צפופות או מורכבות ברמות זום נמוכות יותר. כשמשתמש מרחיב את התצוגה למדינה או לאזור (למשל z5-z12), התצוגה עשויה להיראות שונה מאשר כשמגדילים את התצוגה לעיר או לשכונה (למשל z13-z18).
דוגמה – תחנות רכבת בלונדון
בדוגמה הזו, נשתמש בארכיטקטורת העזר כדי ליצור אפליקציית אינטרנט עם GCP ומפות Google, שמציגה באופן חזותי את כל מסילות הרכבת בלונדון על סמך נתונים מ-Open Street Map (OSM).
דרישות מוקדמות
- גישה ל-BigQuery Sandbox ול-מסוף Cloud
- מוודאים שהגדרתם פרויקט ב-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)]
))
)'
השאילתה מחזירה:
- מזהה ייחודי לכל תכונה
osm_id
feature_type
, למשל נקודות, קווים וכו'name
של התכונה, למשלPaddington Station
- הסוג
railway
, למשל: ראשי, תיירות, צבאי וכו' wkt
של התכונה – גיאומטריה של נקודה, קו או פוליגון בפורמט WKT. WKT הוא פורמט הנתונים הסטנדרטי שחוזרים בעמודות של BigQuery Geography בשאילתה.
הערה: כדי לאמת באופן חזותי את תוצאות השאילתה לפני יצירת מערך נתונים, אפשר להציג את הנתונים במהירות בלוח בקרה מ-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 בפרויקט 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. בעזרת הארכיטקטורה לדוגמה הזו, אפשר ליצור אפליקציות להצגת נתוני מיקום מכל נתונים ב-GCP BigQuery שמניבים ביצועים טובים בכל מכשיר באמצעות Google Maps Datasets API.
הפעולות הבאות
קריאה נוספת:
- מסמכי התיעוד של Google Maps Platform Datasets API
- הצגת הנתונים בזמן אמת באמצעות סגנונות שמבוססים על נתונים
- מבוא לניתוח גיאו-מרחבי ב-BigQuery
- שימוש ב-GeoJSON ב-BigQuery לניתוח גיאו-מרחבי
תורמים
המחברים הראשיים:
- Ryan Baumann, מנהל מהנדסי הפתרונות של הפלטפורמה של מפות Google