עבודה עם נתונים גיאו-מרחביים
ניתוח נתונים גיאו-מרחביים מאפשר לכם לנתח נתונים גיאוגרפיים ב-BigQuery. נתונים גיאוגרפיים נקראים גם נתונים גיאו-מרחביים.
סוגים נפוצים של אובייקטים כשעובדים עם נתונים גיאו-מרחביים כוללים את האובייקטים הבאים:
- גיאומטריה מייצגת שטח פנים בכדור הארץ. הוא מתואר בדרך כלל באמצעות נקודות, קווים, פוליגונים או אוסף של נקודות, קווים ופוליגונים. אוסף גיאומטריות הוא גיאומטריה שמייצגת את האיחוד המרחבי של כל הצורות באוסף.
- תכונה מרחבית מייצגת אובייקט מרחבי לוגי. הוא משלב גיאומטריה עם מאפיינים נוספים שספציפיים לאפליקציה.
- אוסף של תכונות מרחביות הוא קבוצה של תכונות מרחביות.
ב-BigQuery, סוג הנתונים GEOGRAPHY מייצג ערך גיאומטרי או אוסף גיאומטרי. כדי לייצג תכונות מרחביות, יוצרים טבלה עם עמודה GEOGRAPHY לגיאומטריה ועוד עמודות למאפיינים. כל שורה בטבלה היא תכונה מרחבית, וכל הטבלה מייצגת אוסף של תכונות מרחביות.
סוג הנתונים GEOGRAPHY מתאר קבוצת נקודות על פני כדור הארץ. קבוצת נקודות היא קבוצה של נקודות, קווים ומצולעים על הספרואיד הייחוס WGS84, עם קצוות גיאודזיים. אפשר להשתמש בסוג הנתונים GEOGRAPHY על ידי קריאה לאחת מפונקציות הגיאוגרפיה של GoogleSQL.
טעינת נתונים גיאו-מרחביים
אפשר לתאר נקודות בודדות על פני כדור הארץ רק באמצעות זוג של קו אורך וקו רוחב.
לדוגמה, אפשר לטעון קובץ CSV שמכיל ערכי קו אורך וקו רוחב ואז להשתמש בפונקציה ST_GEOGPOINT כדי להמיר אותם לערכי GEOGRAPHY.
במקומות עם גיאוגרפיה מורכבת יותר, אפשר לטעון את הפורמטים הבאים של נתונים גיאו-מרחביים
לעמודה GEOGRAPHY:
- טקסט מוכר (WKT)
- Well-known binary (WKB)
- GeoJSON
- GeoParquet
טעינת נתוני WKT או WKB
WKT הוא פורמט טקסט לתיאור צורות גיאומטריות באמצעות נקודות, קווים, מצולעים עם חורים אופציונליים או אוסף של נקודות, קווים או מצולעים. WKB הוא הגרסה הבינארית של פורמט WKT. אפשר לקודד את WKB בפורמט הקסדצימלי לפורמטים שלא תומכים בנתונים בינאריים, כמו JSON.
לדוגמה, ההגדרה הבאה מגדירה נקודה ב-WKT:
POINT(-121 41)
כדי לתאר תכונה מרחבית, בדרך כלל מטמיעים את WKT בפורמט של קובץ מאגר, כמו קובץ CSV, או בטבלת מסד נתונים. שורה בקובץ או שורה בטבלה בדרך כלל תואמת לתכונה מרחבית. הקובץ כולו או הטבלה כולה
תואמים לאוסף התכונות. כדי לטעון נתוני WKT ל-BigQuery, צריך לספק סכימה שמציינת עמודה מסוג GEOGRAPHY לנתונים הגיאו-מרחביים.
לדוגמה, יכול להיות שיש לכם קובץ CSV שמכיל את הנתונים הבאים:
"POLYGON((-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35))",poly1
"POLYGON((-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66))",poly2
"POINT(1 2)",point1
אפשר לטעון את הקובץ הזה על ידי הרצת כלי שורת הפקודה של BigQuery load:
bq load --source_format=CSV \
--schema="geography:GEOGRAPHY,name:STRING" \
mydataset.mytable filename1.csv
מידע נוסף על טעינת נתונים ב-BigQuery זמין במאמר מבוא לטעינת נתונים.
כדי להזרים נתוני WKT לטבלה קיימת ב-BigQuery עם עמודה מסוג GEOGRAPHY, צריך לבצע סריאליזציה של הנתונים כמחרוזת בבקשת ה-API.
BQ
מריצים את הפקודה insert בכלי שורת הפקודה של BigQuery:
echo '{"geo": "LINESTRING (-118.4085 33.9416, -73.7781 40.6413)"}' \
| bq insert my_dataset.geo_table
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
מידע נוסף על הזנת נתונים ב-BigQuery זמין במאמר הזנת נתונים ב-BigQuery.
אפשר גם להמיר מחרוזת טקסט WKT לערך GEOGRAPHY באמצעות הפונקציה ST_GEOGFROMTEXT.
טעינת נתוני GeoJSON
GeoJSON הוא פורמט מבוסס-JSON לגיאומטריות ולתכונות מרחביות. לדוגמה, ההגדרה הבאה מגדירה נקודה ב-GeoJSON:
{ "type": "Point", "coordinates": [-121,41] }
נתוני GeoJSON יכולים להכיל כל אחד מסוגי האובייקטים הבאים:
- אובייקטים גיאומטריים. אובייקט גיאומטרי הוא צורה מרחבית, שמתוארת כאיחוד של נקודות, קווים ופוליגונים עם חורים אופציונליים.
- אובייקטים של תכונות. אובייקט תכונה מכיל גיאומטריה בתוספת צמדי שם/ערך נוספים, שהמשמעות שלהם ספציפית לאפליקציה.
- אוספים של תכונות. אוסף תכונות הוא קבוצה של אובייקטים של תכונות.
יש שתי דרכים לטעון נתוני GeoJSON ל-BigQuery:
- טעינת קובצי GeoJSON שמופרדים בתו שורה חדשה.
- טעינה של אובייקטים גיאומטריים בפורמט GeoJSON שמוטמעים בסוגי קבצים אחרים.
טעינה של קובצי GeoJSON שמופרדים בתו שורה חדשה
קובץ GeoJSON שמופרד בתו שורה חדשה מכיל רשימה של אובייקטים של תכונות GeoJSON, אחד לכל שורה בקובץ. אובייקט תכונה ב-GeoJSON הוא אובייקט JSON עם הרכיבים הבאים:
type. לאובייקטים של תכונות, הערך חייב להיותFeature. מערכת BigQuery מאמתת את הערך אבל לא כוללת אותו בסכימת הטבלה.
geometry. הערך הוא אובייקט GeoJSONGeometryאוnull. מערכת BigQuery ממירה את החבר הזה לערךGEOGRAPHY.
properties. הערך הוא אובייקט JSON או null. אם הערך הוא לאnull, כל רכיב באובייקט ה-JSON נטען על ידי BigQuery כעמודה נפרדת בטבלה. למידע נוסף על האופן שבו BigQuery מנתח סוגי נתונים של JSON, אפשר לעיין במאמר פרטים על טעינת נתוני JSON.
id. אופציונלי. אם יש ערך בשדה הזה, הוא יהיה מחרוזת או מספר. מערכת BigQuery טוענת את הערך הזה לעמודה בשםid.
אם אובייקט התכונה מכיל חברים אחרים שלא מופיעים כאן, BigQuery ממיר את החברים האלה ישירות לעמודות בטבלה.
כדי לטעון קובץ GeoJSON עם תווי מעבר לשורה, משתמשים בפקודה bq
load של כלי שורת הפקודה של bq, באופן הבא:
bq load \ --source_format=NEWLINE_DELIMITED_JSON \ --json_extension=GEOJSON \ --autodetect \ DATASET.TABLE \ FILE_PATH_OR_URI
מחליפים את מה שכתוב בשדות הבאים:
-
DATASETהוא השם של קבוצת הנתונים. -
TABLEהוא שם טבלת היעד. -
FILE_PATH_OR_URIהוא נתיב לקובץ מקומי או URI של Cloud Storage.
בדוגמה הקודמת מופעלת זיהוי סכמה אוטומטי. כדי לקבל שליטה רבה יותר על האופן שבו BigQuery ממיר את הערכים באובייקט properties, אפשר לספק סכימה מפורשת במקום זאת. מידע נוסף מופיע במאמר בנושא ציון סכימות.
אם אתם מספקים סכימה מפורשת, אל תכללו type עמודה ברמה העליונה בהגדרת הסכימה. לכל חבר בקבוצה properties member, מגדירים עמודות נפרדות, ולא עמודה אחת מקוננת.
כפי שמוגדר ב-RFC 7946, מבנה נתונים מלא של GeoJSON הוא אובייקט JSON יחיד. במערכות רבות, נתוני GeoJSON מיוצאים כאובייקט FeatureCollection יחיד שמכיל את כל הגיאומטריות. כדי לטעון את הפורמט הזה ל-BigQuery, צריך להמיר את הקובץ על ידי הסרת האובייקט FeatureCollection ברמת הבסיס ופיצול האובייקטים של התכונות הנפרדות לשורות נפרדות. לדוגמה, הפקודה הבאה משתמשת בכלי שורת הפקודה jq כדי לפצל קובץ GeoJSON לפורמט מופרד בשורות חדשות:
cat ~/file1.json | jq -c '.features[]' > converted.json
יצירת טבלה חיצונית מקובץ GeoJSON שמופרד בתו שורה חדשה
אפשר ליצור שאילתה על קובץ GeoJSON שמופרד בתו שורה חדשה ושמור ב-Cloud Storage על ידי יצירת טבלה חיצונית. כדי ליצור את הטבלה החיצונית, משתמשים בהצהרת DDL CREATE EXTERNAL TABLE. בסעיף OPTIONS, מגדירים את האפשרות format לערך NEWLINE_DELIMITED_JSON ואת האפשרות json_extension לערך GEOJSON.
דוגמה:
CREATE EXTERNAL TABLE mydataset.table1 OPTIONS (
format="NEWLINE_DELIMITED_JSON",
json_extension = 'GEOJSON',
uris = ['gs://mybucket/geofile.json']
);
טעינת נתוני גיאומטריה בפורמט GeoJSON
ניתוח נתונים גיאוגרפיים תומך בטעינה של אובייקטים גיאומטריים בפורמט GeoJSON שמוטמעים כמחרוזות טקסט בסוגי קבצים אחרים. לדוגמה, אפשר לטעון קובץ CSV שאחת מהעמודות שלו מכילה אובייקט גיאומטרי של GeoJSON.
כדי לטעון נתוני GeoJSON מסוג כזה ל-BigQuery, צריך לספק סכימה שבה מוגדרת עמודה GEOGRAPHY לנתוני ה-GeoJSON. חובה לספק את הסכימה באופן ידני. אחרת, אם ההגדרה 'זיהוי אוטומטי' מופעלת, BigQuery טוען את הנתונים כערך STRING.
ניתוח נתונים גיאוגרפיים לא תומך בטעינה של אובייקטים של תכונות GeoJSON או באוספים של תכונות באמצעות הגישה הזו. אם אתם צריכים לטעון אובייקטים של תכונות, כדאי להשתמש בקובצי GeoJSON עם תווי מעבר שורה.
כדי להזרים נתוני GeoJSON לטבלת BigQuery קיימת עם עמודה מסוג GEOGRAPHY, צריך לבצע סריאליזציה של הנתונים כמחרוזת בבקשת ה-API.
BQ
מריצים את הפקודה insert בכלי שורת הפקודה של BigQuery:
echo '{"geo": "{\"type\": \"LineString\", \"coordinates\": [[-118.4085, 33.9416], [-73.7781, 40.6413]]}"}' \
| bq insert my_dataset.geo_table
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
אפשר גם להמיר אובייקט גיאומטרי של GeoJSON לערך GEOGRAPHY באמצעות הפונקציה ST_GEOGFROMGEOJSON. לדוגמה, אפשר לאחסן את הגיאומטריות כערכים של STRING ואז להריץ שאילתה שקוראת ל-ST_GEOGFROMGEOJSON.
טעינת קובצי GeoParquet
GeoParquet הוא מפרט שמוסיף סוגים גיאו-מרחביים לפורמט הקובץ Parquet. GeoParquet כולל מטא-נתונים שמספקים סמנטיקה מוגדרת לנתונים הגיאו-מרחביים שכלולים בו, וכך נמנעים בעיות בפרשנות שמתרחשות בפורמטים אחרים של נתונים גיאומרחביים.
כשמטעינים קובצי Parquet, BigQuery בודק את המטא-נתונים של GeoParquet. אם קיימים מטא-נתונים של GeoParquet, מערכת BigQuery טוענת כברירת מחדל את כל העמודות שמתוארות בהם לעמודה תואמת של GEOGRAPHY.
מידע נוסף על טעינת קובצי Parquet זמין במאמר בנושא טעינת נתונים בפורמט Parquet.
יצירת טבלה חיצונית מנתוני GeoParquet
טבלאות חיצוניות
שמפנות לקובצי GeoParquet ממפות עמודות רלוונטיות לסוג GEOGRAPHY.
הנתונים הסטטיסטיים שזמינים בקובץ GeoParquet (bbox, covering) לא משמשים להאצת שאילתות בטבלה חיצונית.
מערכות קואורדינטות וקצוות
בניתוח נתונים גיאו-מרחביים, נקודות הן מיקומים על פני ספרואיד WGS84, שמוצגים כקו אורך וקו רוחב גיאודטי. קצה הוא גאודזיה כדורית בין שתי נקודות קצה. (כלומר, הקצוות הם הנתיב הקצר ביותר על פני השטח של כדור).
פורמט ה-WKT לא מספק מערכת קואורדינטות. כשמטעינים נתוני WKT, ניתוח נתונים גיאו-מרחביים מניח שהנתונים משתמשים בקואורדינטות WGS84 עם קצוות כדוריים. חשוב לוודא שנתוני המקור תואמים למערכת הקואורדינטות הזו, אלא אם האזורים הגיאוגרפיים קטנים מספיק כדי שאפשר יהיה להתעלם מההבדל בין קצוות כדוריים לבין קצוות שטוחים.
ב-GeoJSON נעשה שימוש מפורש בקואורדינטות WGS84 עם קצוות מישוריים. כשמעלים נתוני GeoJSON, ניתוח גיאו-מרחבי ממיר קצוות מישוריים לקצוות כדוריים. הניתוח הגיאוספציאלי מוסיף נקודות נוספות לקו לפי הצורך, כך שרצף הקצוות שהומר יישאר במרחק של עד 10 מטרים מהקו המקורי. התהליך הזה נקרא חלוקה למשולשים או הגדלת צפיפות לא אחידה. אי אפשר לשלוט בתהליך הפסיפס באופן ישיר.
כדי לטעון אזורים גיאוגרפיים עם קצוות כדוריים, משתמשים ב-WKT. כדי לטעון אזורים גיאוגרפיים עם קצוות מישוריים, שלעתים קרובות נקראים צורות גיאומטריות, הכי פשוט להשתמש ב-GeoJSON. עם זאת, אם נתוני הגיאומטריה כבר בפורמט WKT, אפשרות נוספת היא לטעון את הנתונים כסוג STRING ואז להשתמש בפונקציה ST_GEOGFROMTEXT כדי להמיר לערכים מסוג GEOGRAPHY. מגדירים את הפרמטר planar לערך TRUE
כדי לפרש את הנתונים כנתונים מישוריים.
קובצי GeoParquet כוללים מטא-נתונים על מערכת הקואורדינטות והקצוות ששימשו ליצירת הנתונים. כשקוראים קובצי GeoParquet עם קצוות מישוריים, ניתוח נתונים גיאו-מרחביים ממיר קצוות מישוריים לקצוות כדוריים. קובצי GeoParquet עם מערכות קואורדינטות שאינן WGS84 נדחים.
כשבוחרים פורמט להחלפת נתונים, חשוב להבין את מערכת הקואורדינטות שמשמשת את נתוני המקור. רוב המערכות תומכות באופן מפורש בניתוח של גיאוגרפיה (בניגוד לגיאומטריה) מ-WKT, או שהן מניחות קצוות מישוריים.
הקואורדינטות צריכות להיות קו אורך קודם, ואז קו רוחב. אם יש במיקום הגיאוגרפי קטעים או קצוות ארוכים, צריך לבצע טסלציה, כי ניתוח גיאוספציאלי מפרש אותם כגיאודזיות כדוריות, שיכול להיות שלא תואמות למערכת הקואורדינטות שממנה הגיעו הנתונים.
כיוון הפוליגון
בספירה, לכל פוליגון יש פוליגון משלים. לדוגמה, לפוליגון שמתאר את היבשות של כדור הארץ יהיה פוליגון משלים שמתאר את האוקיינוסים של כדור הארץ. מכיוון ששני הפוליגונים מתוארים על ידי אותן טבעות גבול, צריך כללים כדי לפתור את הבעיה של אי-הוודאות לגבי הפוליגון מבין השניים שמתואר על ידי מחרוזת WKT נתונה.
כשמעלים מחרוזות WKT ו-WKB מקבצים או באמצעות הטמעת עדכונים בזמן אמת, מערכת הניתוח הגיאו-מרחבי מניחה שהמצולעים בקלט מכוונים באופן הבא: אם עוברים לאורך הגבול של המצולע לפי סדר קודקודי הקלט, החלק הפנימי של המצולע נמצא בצד שמאל. ניתוח נתונים גיאוגרפיים משתמש באותו כלל כשמייצאים אובייקטים גיאוגרפיים למחרוזות WKT ו-WKB.
אם משתמשים בפונקציה ST_GEOGFROMTEXT כדי להמיר מחרוזת WKT לערך GEOGRAPHY, הפרמטר oriented מציין איך הפונקציה קובעת את הפוליגון:
FALSE: פירוש הקלט כפוליגון עם השטח הקטן יותר. זאת התנהגות ברירת המחדל.
TRUE: משתמשים בכלל האוריינטציה של יד שמאל שמתואר למעלה. האפשרות הזו מאפשרת לכם לטעון פוליגונים עם שטח גדול יותר מחצי כדור.
מחרוזות GeoJSON מוגדרות במפה מישורית, ולכן אפשר לקבוע את הכיוון שלהן באופן חד-משמעי, גם אם הקלט לא תואם לכלל הכיוון שמוגדר במפרט של פורמט GeoJSON, RFC 7946.
טיפול בנתונים מרחביים בפורמט לא תקין
כשאתם טוענים נתונים מרחביים מכלי אחר ל-BigQuery, יכול להיות שתיתקלו בשגיאות המרה בגלל נתוני WKT או GeoJSON לא תקינים. לדוגמה, שגיאה כמו Edge K has duplicate vertex with edge N מציינת שיש לפוליגון קודקודים כפולים (חוץ מהקודקוד הראשון והאחרון).
כדי להימנע מבעיות בפורמט, אפשר להשתמש בפונקציה שיוצרת פלט שתואם לתקנים. לדוגמה, כשמייצאים נתונים מ-PostGIS, אפשר להשתמש בפונקציה ST_MakeValid של PostGIS כדי לתקנן את הפלט.
אפשרות אחרת היא לייבא את הנתונים כטקסט ואז להמיר אותם על ידי קריאה לפונקציה
ST_GEOGFROMTEXT
או לפונקציה ST_GEOGFROMGEOJSON
עם הפרמטר make_valid. אם הערך של make_valid הוא TRUE, הפונקציות האלה מנסות לתקן מצולעים לא תקינים.
כדי למצוא את הנתונים בפורמט הלא תקין או להתעלם מהם, משתמשים בקידומת של הפונקציה SAFE כדי להציג את הנתונים הבעייתיים. לדוגמה, השאילתה הבאה משתמשת בקידומת SAFE כדי לאחזר נתונים מרחביים בפורמט לא תקין.
SELECT geojson AS bad_geojson FROM mytable WHERE geojson IS NOT NULL AND SAFE.ST_GEOGFROMGEOJSON(geojson) IS NULL
מגבלות
ניתוח נתונים גיאו-מרחביים לא תומך בתכונות הבאות בפורמטים גיאו-מרחביים:
- גיאומטריות תלת-ממדיות. כולל הסיומת Z בפורמט WKT, ואת קואורדינטת הגובה בפורמט GeoJSON.
- מערכות ייחוס לינאריות. זה כולל את הסיומת 'M' בפורמט WKT.
- אובייקטים גיאומטריים בפורמט WKT שאינם פרימיטיבים גיאומטריים או גיאומטריות מרובות חלקים. באופן ספציפי, ניתוח נתונים גיאוגרפיים תומך רק ב-Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon ו-GeometryCollection.
במאמרים ST_GEOGFROMGEOJSON וST_GEOGFROMTEXT מפורטים אילוצים שספציפיים לפורמטים של קלט GeoJson ו-WKT.
שילוב נתוני רסטר גיאו-מרחביים עם Google Earth Engine
תובנות גיאו-מרחביות מוצגות לרוב כנתונים מבוססי-רשת או רסטר. נתוני רסטר מארגנים נתונים רציפים אזוריים, כמו צילומי לוויין, תחזיות מזג אוויר וכיסוי פני השטח, ברשת של פיקסלים. למרות ש-BigQuery מתמחה בעיקר בנתוני וקטור טבלאיים שמייצגים תכונות עם גבולות ונקודות, אפשר לשלב נתוני רסטר בניתוחים ב-BigQuery באמצעות הפונקציה ST_REGIONSTATS.
הפונקציה הזו משתמשת ב-Earth Engine, פלטפורמת ניתוח רסטר של Google, כדי לבצע חישובים וצבירות על נתוני רסטר לניתוח גיאו-מרחבי משופר. מידע נוסף זמין במאמר בנושא עבודה עם נתוני רסטר.
מידע על ייצוא נתונים מ-Earth Engine ל-BigQuery זמין במאמר ייצוא ל-BigQuery. מידע נוסף על שילובים בין Earth Engine לבין BigQuery זמין במאמר BigQuery integration במסמכי Earth Engine.
טרנספורמציה של נתונים גיאו-מרחביים
אם הטבלה שלכם מכילה עמודות נפרדות של קווי אורך ורוחב, אתם יכולים להמיר את הערכים למיקומים גיאוגרפיים באמצעות פונקציות גיאוגרפיות של GoogleSQL, כמו ST_GEOGPOINT.
לדוגמה, אם יש לכם שתי עמודות DOUBLE של קו אורך וקו רוחב, אתם יכולים ליצור עמודה של מיקום גיאוגרפי באמצעות השאילתה הבאה:
SELECT *, ST_GEOGPOINT(longitude, latitude) AS g FROM mytable
BigQuery יכול להמיר מחרוזות WKT ו-GeoJSON לסוגי מיקום גיאוגרפי.
אם הנתונים שלכם הם בפורמט אחר, כמו Shapefiles, אתם צריכים להשתמש בכלי חיצוני כדי להמיר את הנתונים לפורמט קובץ קלט נתמך, כמו קובץ CSV, עם GEOGRAPHY עמודות שמקודדות כמחרוזות WKT או GeoJSON.
חלוקה למחיצות (partitioning) ואשכולות של נתונים גיאו-מרחביים
אפשר לחלק ולקבץ טבלאות שמכילות GEOGRAPHY עמודות. אפשר להשתמש בעמודה מסוג GEOGRAPHY כעמודת אשכולות, אבל אי אפשר להשתמש בעמודה מסוג GEOGRAPHY כעמודת חלוקה.
אם אתם מאחסנים נתוני GEOGRAPHY בטבלה והשאילתות שלכם מסננות את הנתונים באמצעות פרדיקט מרחבי, ודאו שהטבלה מקובצת לפי העמודה GEOGRAPHY.
בדרך כלל זה משפר את ביצועי השאילתה ועשוי להפחית את העלות. פרדיקט מרחבי קורא לפונקציית מיקום בוליאנית, ויש לו עמודה GEOGRAPHY כאחד מהארגומנטים. בדוגמה הבאה מוצג פרדיקט מרחבי שמשתמש בפונקציה ST_DWITHIN:
WHERE ST_DWITHIN(geo, ST_GeogPoint(longitude, latitude), 100)
שימוש בפעולות JOIN עם נתונים מרחביים
צירופים מרחביים הם צירופים של שתי טבלאות עם פונקציה גיאוגרפית של תנאי ב-clause WHERE. לדוגמה:
-- how many stations within 1 mile range of each zip code? SELECT zip_code AS zip, ANY_VALUE(zip_code_geom) AS polygon, COUNT(*) AS bike_stations FROM `bigquery-public-data.new_york.citibike_stations` AS bike_stations, `bigquery-public-data.geo_us_boundaries.zip_codes` AS zip_codes WHERE ST_DWITHIN( zip_codes.zip_code_geom, ST_GEOGPOINT(bike_stations.longitude, bike_stations.latitude), 1609.34) GROUP BY zip ORDER BY bike_stations DESC
הביצועים של הצטרפות מרחבית טובים יותר כשנתוני המיקום הגיאוגרפי נשמרים. בדוגמה שלמעלה נוצרים הערכים הגיאוגרפיים בשאילתה. יעיל יותר לאחסן את ערכי המיקום בטבלה ב-BigQuery.
לדוגמה, השאילתה הבאה מאחזרת זוגות של קו אורך וקו רוחב וממירה אותם לנקודות גיאוגרפיות. כשמריצים את השאילתה הזו, מציינים טבלת יעד חדשה לאחסון תוצאות השאילתה:
SELECT *, ST_GEOGPOINT(pLongitude, pLatitude) AS p FROM mytable
BigQuery מטמיע צירופים מרחביים אופטימליים לאופרטורים INNER JOIN ו-CROSS JOIN עם פונקציות הניבוי הבאות של GoogleSQL:
הצטרפות מרחבית לא ממוטבת:
- ל-
LEFT,RIGHTאוFULL OUTERהצטרפו - במקרים שכוללים anti-joins
- כשהפרדיקט המרחבי הוא שלילה
אופטימיזציה של JOIN שמשתמש בפרדיקט ST_DWITHIN מתבצעת רק אם פרמטר המרחק הוא ביטוי קבוע.
ייצוא נתונים מרחביים
כשמייצאים נתונים מרחביים מ-BigQuery, הערכים בעמודה GEOGRAPHY תמיד מעוצבים כמחרוזות WKT. כדי לייצא נתונים בפורמט GeoJSON, משתמשים בפונקציה ST_ASGEOJSON.
אם הכלים שבהם אתם משתמשים כדי לנתח את הנתונים המיוצאים לא מזהים את סוג הנתונים GEOGRAPHY, אתם יכולים להמיר את ערכי העמודה למחרוזות באמצעות פונקציה גיאוגרפית כמו ST_ASTEXT או ST_ASGEOJSON.
ניתוח נתונים גיאוספציאלי מוסיף נקודות נוספות לקו במקומות שבהם יש צורך בכך, כדי שרצף הקצוות שהומר יישאר במרחק של עד 10 מטרים מהקו הגיאודזי המקורי.
לדוגמה, השאילתה הבאה משתמשת ב-ST_ASGEOJSON כדי להמיר ערכי GeoJSON למחרוזות.
SELECT ST_ASGEOJSON(ST_MAKELINE(ST_GEOGPOINT(1,1), ST_GEOGPOINT(3,2)))
הנתונים שיתקבלו ייראו כך:
{ "type": "LineString", "coordinates": [ [1, 1], [1.99977145571783, 1.50022838764041], [2.49981908082299, 1.75018082434274], [3, 2] ] }
לקו ה-GeoJSON יש שתי נקודות נוספות. הניתוח הגיאו-מרחבי מוסיף את הנקודות האלה כדי שהקו ב-GeoJSON יתאים ככל האפשר למסלול של הקו המקורי בשטח.
המאמרים הבאים
- כדי להתחיל להשתמש בניתוח נתונים גיאו-מרחביים, אפשר לעיין במאמר תחילת העבודה עם ניתוח נתונים גיאו-מרחביים לאנליסטים של נתונים.
- מידע נוסף על אפשרויות ההמחשה של ניתוח נתונים גיאו-מרחביים זמין במאמר בנושא המחשת נתונים גיאו-מרחביים.
- לעיון במסמכים בנושא פונקציות GoogleSQL בניתוח נתונים גיאו-מרחביים, אפשר לעבור אל פונקציות גיאוגרפיות ב-GoogleSQL.