במסמך הזה נספק ארכיטקטורת עזר ודוגמה ליצירת תצוגות חזותיות של נתוני מפה עם נתוני מיקום ב-Google Cloud BigQuery וב-Google Maps Platform Datasets API, כמו ניתוח נתונים עירוניים פתוחים, יצירת מפת כיסוי של תקשורת או יצירת תצוגה חזותית של תנועת צי כלי רכב ניידים.
תצוגות חזותיות של נתוני מפה הן כלי יעיל ליצירת עניין בקרב המשתמשים ולחשיפה של תובנות מרחביות בנתוני המיקום. נתוני מיקום הם נתונים שכוללים תכונות של נקודות, קווים או פוליגונים. לדוגמה, מפות מזג האוויר עוזרות לצרכנים להבין את מזג האוויר, לתכנן נסיעות ולהכין את עצמם לשיטפונות. מפות ה-BI עוזרות למשתמשים לגלות תובנות מניתוח הנתונים שלהם, ומפות התקשורת עוזרות למשתמשים להבין את הכיסוי ואת האיכות של הספקים באזור שירות נתון.
עם זאת, למפתחי אפליקציות קשה ליצור חזותיות של נתוני מפה גדולים עם ביצועים טובים וחוויית משתמש מעולה. נתונים גדולים צריכים להיטען לזיכרון בצד הלקוח, וכתוצאה מכך זמני הטעינה הראשונים של המפה איטיים. הרכיב החזותי צריך לפעול בצורה חלקה בכל המכשירים, כולל טלפונים ניידים ברמה נמוכה יותר עם מגבלות זיכרון ו-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).
דוגמה – תחנות רכבת בלונדון
בדוגמה הזו נשתמש בארכיטקטורת העזר כדי ליצור אפליקציית אינטרנט עם Google Cloud ומפות Google, שמציגה באופן חזותי את כל מסילות הרכבת בלונדון על סמך נתונים מ-Open Street Map (OSM).
דרישות מוקדמות
- גישה ל-BigQuery Sandbox ול-Cloud Console
- מוודאים שהפרויקט ב-Google Cloud והחשבון לחיוב מוגדרים.
שלב 1 – שאילתת נתונים ב-BigQuery
עוברים אל מערכי נתונים ציבוריים של BigQuery. מערך הנתונים bigquery-public-data והטבלה geo_openstreetmap.planet_features
מכילים את כל נתוני Open Street Map (OSM) בעולם, כולל כל התכונות האפשריות. בWiki של OSM תוכלו למצוא את כל התכונות הזמינות לשליחת שאילתות, כולל amenity
, road
ו-landuse
.
משתמשים ב-Cloud Shell או במסוף Cloud של BigQuery כדי להריץ שאילתות בטבלה באמצעות 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 בפרויקט ב-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. בעזרת הארכיטקטורה לדוגמה הזו, תוכלו ליצור אפליקציות של תצוגות חזותיות של נתוני מיקום מכל נתונים ב-Google Cloud BigQuery, שפועלות בצורה יעילה בכל מכשיר באמצעות Google Maps Datasets API.
הפעולות הבאות
קריאה נוספת:
- מסמכי התיעוד של Google Maps Platform Datasets API
- הצגת הנתונים בזמן אמת באמצעות סגנונות שמבוססים על נתונים
- מבוא לניתוח גיאו-מרחבי ב-BigQuery
- שימוש ב-GeoJSON ב-BigQuery לניתוח גיאו-מרחבי
תורמים
המחברים הראשיים:
- ריאן באומן (Ryan Baumann), מנהל מהנדסי הפתרונות בפלטפורמה של מפות Google