המחשה חזותית של נתוני ניתוח גיאו-מרחבי ב-notebook של Colab מאפשרת לכם לחקור את נתוני המיקום באמצעות כלים מוכרים של Python למדעי הנתונים. במדריך הזה תשלחו שאילתות למערכי הנתונים הציבוריים הבאים ישירות מה-notebook, כדי לחשוף דפוסים גיאוגרפיים באמצעות רינדור של תרשימי פיזור אינטראקטיביים, פוליגונים, מפות כורופלתיות ומפות חום:
במאמר גישה למערכי נתונים ציבוריים במסוף Google Cloud מוסבר איך לגשת למערכי הנתונים הציבוריים האלה.
מטרות
- מגדירים אימות באמצעות Google Cloud , ואם רוצים, גם באמצעות מפות Google.
- להריץ שאילתות על נתונים ב-BigQuery ולהוריד את התוצאות ל-Colab.
- להשתמש בכלים של Python למדעי הנתונים כדי לבצע טרנספורמציות וניתוחים.
- ליצור תצוגות חזותיות, כולל תרשימי פיזור, פוליגונים, מפות כורופלת ומפות חום.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
בעזרת מחשבון העלויות אתם יכולים להעריך את העלויות בהתאם לשימוש הצפוי.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the BigQuery and Google Maps JavaScript APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.- מוודאים שיש לכם את ההרשאות הנדרשות כדי לבצע את המשימות שמפורטות במסמך הזה.
התפקידים הנדרשים
אם אתם יוצרים פרויקט חדש, אתם ה-Project Owner שלו ומוענקות לכם כל הרשאות ה-IAM שנדרשות כדי להשלים את המדריך הזה.
אם אתם משתמשים בפרויקט קיים, אתם צריכים את התפקיד הבא ברמת הפרויקט כדי להריץ משימות של שאילתות.
צריך לוודא שיש לכם בפרויקט את התפקיד או התפקידים הבאים:
- BigQuery User (
roles/bigquery.user)
בדיקת התפקידים
-
נכנסים לדף IAM במסוף Google Cloud .
כניסה לדף IAM - בוחרים את הפרויקט.
-
בעמודה Principal, מחפשים את כל השורות שמזהות אתכם או קבוצה שאתם חברים בה. כדי לברר לאילו קבוצות אתם שייכים, פנו לאדמין.
- בכל השורות שבהן אתם מופיעים, בודקים בעמודה Role אם רשימת התפקידים כוללת את התפקידים הנדרשים.
מתן התפקידים
-
נכנסים לדף IAM במסוף Google Cloud .
כניסה לדף IAM - בוחרים את הפרויקט.
- לוחצים על Grant access.
-
בשדה New principals, מזינים את מזהה המשתמש. בדרך כלל זה המזהה של משתמש במאגר זהויות של כוח עבודה. למידע נוסף, קראו את המאמר ייצוג המשתמשים במאגרי כוח עבודה בכללי מדיניות IAM או פנו לאדמין שלכם.
- לוחצים על Select a role ומחפשים את התפקיד.
- כדי לתת עוד תפקידים, לוחצים על Add another role ומוסיפים אותם.
- לוחצים על Save.
למידע נוסף על תפקידים ב-BigQuery, קראו את המאמר תפקידי IAM מוגדרים מראש.
יצירת נוטבוק של Colab
במדריך הזה נבנה נוטבוק של Colab כדי להמחיש באופן חזותי נתונים של ניתוח נתונים גיאו-מרחביים. כדי לפתוח גרסה מוכנה מראש של ה-notebook ב-Colab, ב-Colab Enterprise או ב-BigQuery Studio, לוחצים על הקישורים שמופיעים בחלק העליון של גרסת ה-GitHub של המדריך BigQuery Geospatial Visualization in Colab.
פותחים את Colab.
בתיבת הדו-שיח Open notebook, לוחצים על New notebook.
לוחצים על
Untitled0.ipynbומשנים את שם ה-notebook ל-bigquery-geo.ipynb.לוחצים על קובץ > שמירה.
אימות באמצעות Google Cloud ומפות Google
במדריך הזה נשלח שאילתות למערכי נתונים ב-BigQuery ונשתמש ב-Google Maps JavaScript API. כדי להשתמש במשאבים האלה, צריך לאמת את סביבת זמן הריצה של Colab באמצעות Google Cloud ו-Maps API.
אימות באמצעות Google Cloud
כדי להוסיף תא קוד, לוחצים על Code.
כדי לאמת את הפרויקט, מזינים את הקוד הבא:
# REQUIRED: Authenticate with your project. GCP_PROJECT_ID = "PROJECT_ID" #@param {type:"string"} from google.colab import auth from google.colab import userdata auth.authenticate_user(project_id=GCP_PROJECT_ID) # Set GMP_API_KEY to none GMP_API_KEY = None
מחליפים את PROJECT_ID במזהה הפרויקט.
לוחצים על Run cell.
כשמופיעה בקשה, לוחצים על אישור כדי לתת ל-Colab גישה לפרטי הכניסה שלכם, אם אתם מסכימים.
בדף כניסה באמצעות חשבון Google, בוחרים את החשבון.
בדף Sign in to Third-party authored notebook code, לוחצים על Continue.
בקטע Select what third-party authored notebook code can access, לוחצים על Select all ואז על Continue.
אחרי שתשלימו את תהליך ההרשאה, לא ייווצר פלט בנוטבוק של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
אופציונלי: אימות באמצעות מפות Google
אם אתם משתמשים ב-Google Maps Platform כספק המפות של המפות הבסיסיות, אתם צריכים לספק מפתח API של Google Maps Platform. ה-notebook מאחזר את המפתח מהסודות שלכם ב-Colab.
השלב הזה נדרש רק אם אתם משתמשים ב-Maps API. אם לא תבצעו אימות מול Google Maps Platform, במקום זאת pydeck תשתמש במפה של carto.
כדי לקבל מפתח Google Maps API, פועלים לפי ההוראות בדף שימוש במפתחות API במסמכי התיעוד של מפות Google.
עוברים לנוטבוק של Colab ולוחצים על Secrets.
לוחצים על Add new secret (הוספת סוד חדש).
בשדה Name, מזינים
GMP_API_KEY.בשדה Value, מזינים את הערך של מפתח ה-Maps API שיצרתם קודם.
סוגרים את החלונית Secrets.
כדי להוסיף תא קוד, לוחצים על Code.
כדי לבצע אימות באמצעות Maps API, מזינים את הקוד הבא:
# Authenticate with the Google Maps JavaScript API. GMP_API_SECRET_KEY_NAME = "GMP_API_KEY" #@param {type:"string"} if GMP_API_SECRET_KEY_NAME: GMP_API_KEY = userdata.get(GMP_API_SECRET_KEY_NAME) if GMP_API_SECRET_KEY_NAME else None else: GMP_API_KEY = None
כשמופיעה בקשה, לוחצים על Grant access כדי לתת ל-notebook גישה למפתח, אם אתם מסכימים.
לוחצים על Run cell.
אחרי שתשלימו את תהליך ההרשאה, לא ייווצר פלט בנוטבוק של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
התקנת חבילות Python וייבוא ספריות של מדעי הנתונים
בנוסף למודולים של Python ב-colabtools (google.colab), במדריך הזה משתמשים בכמה חבילות אחרות של Python ובספריות של מדעי הנתונים.
בקטע הזה מתקינים את החבילות pydeck ו-h3. pydeck
מספק עיבוד מרחבי בקנה מידה גדול ב-Python, באמצעות deck.gl.
h3-py מספק את מערכת האינדקסים הגיאוגרפיים ההיררכיים המשושים H3 של Uber ב-Python.
אחר כך מייבאים את הספריות h3 ו-pydeck ואת הספריות הגיאו-מרחביות הבאות של Python:
geopandasכדי להרחיב את סוגי הנתונים שבהם משתמשים ב-pandas, וכך לאפשר פעולות מרחביות על סוגים גיאומטריים.shapelyלטיפול באובייקטים גיאומטריים מישוריים בודדים ולניתוח שלהם.brancaכדי ליצור מפות צבעים ב-HTML וב-JavaScript.geemap.deckלהמחשה עםpydeckו-earthengine-api.
אחרי שמייבאים את הספריות, מפעילים טבלאות אינטראקטיביות לpandas DataFrames ב-Colab.
מתקינים את החבילות pydeck ו-h3
כדי להוסיף תא קוד, לוחצים על Code.
כדי להתקין את החבילות
pydeckו-h3, מזינים את הקוד הבא:# Install pydeck and h3. !pip install pydeck>=0.9 h3>=4.2
לוחצים על Run cell.
אחרי שההתקנה מסתיימת, לא נוצר פלט ב-נוטבוק של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
ייבוא ספריות Python
כדי להוסיף תא קוד, לוחצים על Code.
כדי לייבא את ספריות Python, מזינים את הקוד הבא:
# Import data science libraries. import branca import geemap.deck as gmdk import h3 import pydeck as pdk import geopandas as gpd import shapely
לוחצים על Run cell.
אחרי שמריצים את הקוד, לא נוצר פלט ב-notebook של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
הפעלת טבלאות אינטראקטיביות ל-DataFrame של pandas
כדי להוסיף תא קוד, לוחצים על Code.
כדי להפעיל את
pandasDataFrames, מזינים את הקוד הבא:# Enable displaying pandas data frames as interactive tables by default. from google.colab import data_table data_table.enable_dataframe_formatter()
לוחצים על Run cell.
אחרי שמריצים את הקוד, לא נוצר פלט ב-notebook של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
יצירת תרחיש משותף
בקטע הזה יוצרים שגרה משותפת שמעבדת שכבות במפה בסיסית.
כדי להוסיף תא קוד, לוחצים על Code.
כדי ליצור שגרת שיתוף לעיבוד שכבות במפה, מזינים את הקוד הבא:
# Set Google Maps as the base map provider. MAP_PROVIDER_GOOGLE = pdk.bindings.base_map_provider.BaseMapProvider.GOOGLE_MAPS.value # Shared routine for rendering layers on a map using geemap.deck. def display_pydeck_map(layers, view_state, **kwargs): deck_kwargs = kwargs.copy() # Use Google Maps as the base map only if the API key is provided. if GMP_API_KEY: deck_kwargs.update({ "map_provider": MAP_PROVIDER_GOOGLE, "map_style": pdk.bindings.map_styles.GOOGLE_ROAD, "api_keys": {MAP_PROVIDER_GOOGLE: GMP_API_KEY}, }) m = gmdk.Map(initial_view_state=view_state, ee_initialize=False, **deck_kwargs) for layer in layers: m.add_layer(layer) return m
לוחצים על Run cell.
אחרי שמריצים את הקוד, לא נוצר פלט ב-notebook של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
יצירת תרשים פיזור
בקטע הזה תיצרו תרשים פיזור של כל תחנות השכרת האופניים במערך הנתונים הציבורי של San Francisco Ford GoBike Share, על ידי אחזור נתונים מהטבלה bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info. תרשים הפיזור נוצר באמצעות שכבה ושכבת תרשים פיזור מה-framework של deck.gl.
תרשימי פיזור שימושיים כשצריך לבדוק קבוצת משנה של נקודות נתונים ספציפיות (פעולה שנקראת גם בדיקה נקודתית).
בדוגמה הבאה מוסבר איך להשתמש בשכבה ובשכבת תרשים פיזור כדי לעבד נקודות נפרדות כעיגולים.
כדי להוסיף תא קוד, לוחצים על Code.
כדי להריץ שאילתה במערך הנתונים הציבורי של San Francisco Ford GoBike Share, מזינים את הקוד הבא. הקוד הזה משתמש בפונקציית הקסם
%%bigqueryכדי להריץ את השאילתה ולהחזיר את התוצאות ב-DataFrame:# Query the station ID, station name, station short name, and station # geometry from the bike share dataset. # NOTE: In this tutorial, the denormalized 'lat' and 'lon' columns are # ignored. They are decomposed components of the geometry. %%bigquery gdf_sf_bikestations --project {GCP_PROJECT_ID} --use_geodataframe station_geom SELECT station_id, name, short_name, station_geom FROM `bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info`
לוחצים על Run cell.
הפלט אמור להיראות כך:
Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%כדי להוסיף תא קוד, לוחצים על Code.
כדי לקבל סיכום של ה-DataFrame, כולל עמודות וסוגי נתונים, מזינים את הקוד הבא:
# Get a summary of the DataFrame gdf_sf_bikestations.info()
לוחצים על Run cell.
הפלט אמור להיראות כך:
<class 'geopandas.geodataframe.GeoDataFrame'> RangeIndex: 472 entries, 0 to 471 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 station_id 472 non-null object 1 name 472 non-null object 2 short_name 472 non-null object 3 station_geom 472 non-null geometry dtypes: geometry(1), object(3) memory usage: 14.9+ KBכדי להוסיף תא קוד, לוחצים על Code.
כדי לראות תצוגה מקדימה של חמש השורות הראשונות של ה-DataFrame, מזינים את הקוד הבא:
# Preview the first five rows gdf_sf_bikestations.head()
לוחצים על Run cell.
הפלט אמור להיראות כך:
כדי לעבד את הנקודות, צריך לחלץ את קו האורך וקו הרוחב כקואורדינטות x ו-y מהעמודה station_geom במערך הנתונים של השכרת האופניים.
מכיוון ש-gdf_sf_bikestations הוא geopandas.GeoDataFrame, הגישה לקואורדינטות מתבצעת ישירות מעמודת הגיאומטריה station_geom שלו. אפשר לאחזר את קו האורך באמצעות המאפיין .x של העמודה, ואת קו הרוחב באמצעות המאפיין .y. אחר כך אפשר לאחסן אותם בעמודות חדשות של קווי אורך ורוחב.
כדי להוסיף תא קוד, לוחצים על Code.
כדי לחלץ את הערכים של קו האורך וקו הרוחב מהעמודה
station_geom, מזינים את הקוד הבא:# Extract the longitude (x) and latitude (y) from station_geom. gdf_sf_bikestations["longitude"] = gdf_sf_bikestations["station_geom"].x gdf_sf_bikestations["latitude"] = gdf_sf_bikestations["station_geom"].y
לוחצים על Run cell.
אחרי שמריצים את הקוד, לא נוצר פלט ב-notebook של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
כדי להוסיף תא קוד, לוחצים על Code.
כדי ליצור את תרשים הפיזור של תחנות השכרת האופניים על סמך ערכי קווי האורך והרוחב שחילצתם קודם, מזינים את הקוד הבא:
# Render a scatter plot using pydeck with the extracted longitude and # latitude columns in the gdf_sf_bikestations geopandas.GeoDataFrame. scatterplot_layer = pdk.Layer( "ScatterplotLayer", id="bike_stations_scatterplot", data=gdf_sf_bikestations, get_position=['longitude', 'latitude'], get_radius=100, get_fill_color=[255, 0, 0, 140], # Adjust color as desired pickable=True, ) view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12) display_pydeck_map([scatterplot_layer], view_state)
לוחצים על Run cell.
הפלט אמור להיראות כך:
הצגת פוליגונים
ניתוח נתונים גיאו-מרחביים מאפשר לנתח נתונים גיאו-מרחביים ולהציג אותם באופן חזותי ב-BigQuery, באמצעות סוגי נתונים של GEOGRAPHY ופונקציות גיאוגרפיות של GoogleSQL.
סוג הנתונים GEOGRAPHY בניתוח נתונים גיאו-מרחביים הוא אוסף של נקודות, מחרוזות קווים ומצולעים, שמיוצג כקבוצת נקודות או כקבוצת משנה של פני כדור הארץ. סוג GEOGRAPHY יכול להכיל אובייקטים כמו:
- נקודות
- שורות
- פוליגונים
- מרובי-פוליגונים
רשימה של כל האובייקטים הנתמכים מופיעה במסמכי התיעוד של הסוג GEOGRAPHY.
אם קיבלתם נתונים גיאו-מרחביים בלי לדעת מהן הצורות הצפויות, אתם יכולים להמחיש את הנתונים כדי לגלות את הצורות. כדי להמחיש צורות, אפשר להמיר את הנתונים הגיאוגרפיים לפורמט GeoJSON. אחר כך אפשר להמחיש את הנתונים של GeoJSON באמצעות שכבת GeoJSON מ-deck.gl framework.
בקטע הזה תשלחו שאילתה על נתונים גיאוגרפיים במערך הנתונים San Francisco Neighborhoods, ואז תציגו את הפוליגונים באופן חזותי.
כדי להוסיף תא קוד, לוחצים על Code.
כדי לשלוח שאילתה על הנתונים הגיאוגרפיים מהטבלה
bigquery-public-data.san_francisco_neighborhoods.boundariesבמערך הנתונים San Francisco Neighborhoods, מזינים את הקוד הבא. הקוד הזה משתמש בפונקציית הקסם%%bigqueryכדי להריץ את השאילתה ולהחזיר את התוצאות ב-DataFrame:# Query the neighborhood name and geometry from the San Francisco # neighborhoods dataset. %%bigquery gdf_sanfrancisco_neighborhoods --project {GCP_PROJECT_ID} --use_geodataframe geometry SELECT neighborhood, neighborhood_geom AS geometry FROM `bigquery-public-data.san_francisco_neighborhoods.boundaries`
לוחצים על Run cell.
הפלט אמור להיראות כך:
Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%כדי להוסיף תא קוד, לוחצים על Code.
כדי לקבל סיכום של ה-DataFrame, מזינים את הקוד הבא:
# Get a summary of the DataFrame gdf_sanfrancisco_neighborhoods.info()
לוחצים על Run cell.
התוצאות אמורות להיראות כך:
<class 'geopandas.geodataframe.GeoDataFrame'> RangeIndex: 117 entries, 0 to 116 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 neighborhood 117 non-null object 1 geometry 117 non-null geometry dtypes: geometry(1), object(1) memory usage: 2.0+ KBכדי לראות תצוגה מקדימה של השורה הראשונה ב-DataFrame, מזינים את הקוד הבא:
# Preview the first row gdf_sanfrancisco_neighborhoods.head(1)
לוחצים על Run cell.
הפלט אמור להיראות כך:
בתוצאות, שימו לב שהנתונים הם פוליגון.
כדי להוסיף תא קוד, לוחצים על Code.
כדי להציג את הפוליגונים, מזינים את הקוד הבא. הפונקציה
pydeckמשמשת להמרת כל מופע של אובייקטshapelyבעמודת הגיאומטריה לפורמטGeoJSON:# Visualize the polygons. geojson_layer = pdk.Layer( 'GeoJsonLayer', id="sf_neighborhoods", data=gdf_sanfrancisco_neighborhoods, get_line_color=[127, 0, 127, 255], get_fill_color=[60, 60, 60, 50], get_line_width=100, pickable=True, stroked=True, filled=True, ) view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12) display_pydeck_map([geojson_layer], view_state)
לוחצים על Run cell.
הפלט אמור להיראות כך:
יצירת מפה כורופלתית
אם אתם חוקרים נתונים עם פוליגונים שקשה להמיר לפורמט GeoJSON, אתם יכולים להשתמש במקום זאת בשכבת פוליגונים מה-framework של deck.gl. שכבת פוליגון יכולה לעבד נתוני קלט מסוגים ספציפיים, כמו מערך של נקודות.
בקטע הזה משתמשים בשכבת פוליגון כדי ליצור מערך של נקודות, ומשתמשים בתוצאות כדי ליצור מפה כורופלתית. המפה הכורופלתית מציגה את צפיפות תחנות השכרת האופניים לפי שכונה, על ידי איחוד נתונים ממערך הנתונים של שכונות בסן פרנסיסקו עם מערך הנתונים של Ford GoBike Share בסן פרנסיסקו.
כדי להוסיף תא קוד, לוחצים על Code.
כדי לצבור ולספור את מספר התחנות בכל שכונה וליצור עמודת
polygonשמכילה מערך של נקודות, מזינים את הקוד הבא:# Aggregate and count the number of stations per neighborhood. gdf_count_stations = gdf_sanfrancisco_neighborhoods.sjoin(gdf_sf_bikestations, how='left', predicate='contains') gdf_count_stations = gdf_count_stations.groupby(by='neighborhood')['station_id'].count().rename('num_stations') gdf_stations_x_neighborhood = gdf_sanfrancisco_neighborhoods.join(gdf_count_stations, on='neighborhood', how='inner') # To simulate non-GeoJSON input data, create a polygon column that contains # an array of points by using the pandas.Series.map method. gdf_stations_x_neighborhood['polygon'] = gdf_stations_x_neighborhood['geometry'].map(lambda g: list(g.exterior.coords))
לוחצים על Run cell.
אחרי שמריצים את הקוד, לא נוצר פלט ב-notebook של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
כדי להוסיף תא קוד, לוחצים על Code.
כדי להוסיף עמודה של
fill_colorלכל אחד מהמצולעים, מזינים את הקוד הבא:# Create a color map gradient using the branch library, and add a fill_color # column for each of the polygons. colormap = branca.colormap.LinearColormap( colors=["lightblue", "darkred"], vmin=0, vmax=gdf_stations_x_neighborhood['num_stations'].max(), ) gdf_stations_x_neighborhood['fill_color'] = gdf_stations_x_neighborhood['num_stations'] \ .map(lambda c: list(colormap.rgba_bytes_tuple(c)[:3]) + [0.7 * 255]) # force opacity of 0.7
לוחצים על Run cell.
אחרי שמריצים את הקוד, לא נוצר פלט ב-notebook של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
כדי להוסיף תא קוד, לוחצים על Code.
כדי לעבד את שכבת הפוליגון, מזינים את הקוד הבא:
# Render the polygon layer. polygon_layer = pdk.Layer( 'PolygonLayer', id="bike_stations_choropleth", data=gdf_stations_x_neighborhood, get_polygon='polygon', get_fill_color='fill_color', get_line_color=[0, 0, 0, 255], get_line_width=50, pickable=True, stroked=True, filled=True, ) view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12) display_pydeck_map([polygon_layer], view_state)
לוחצים על Run cell.
הפלט אמור להיראות כך:
יצירת מפת חום
מפות כלורופלת שימושיות כשיש גבולות משמעותיים וידועים. אם יש לכם נתונים בלי גבולות משמעותיים ידועים, אתם יכולים להשתמש בשכבת מפת חום כדי להציג את הצפיפות הרציפה שלהם.
בדוגמה הבאה, אתם שולחים שאילתה לנתונים בטבלה bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents במערך הנתונים של הדוחות של משטרת סן פרנסיסקו (SFPD). הנתונים משמשים להמחשה חזותית של התפלגות האירועים בשנת 2015.
במפות חום, מומלץ לבצע קוונטיזציה וצבירה של הנתונים לפני הרינדור. בדוגמה הזו, הנתונים עוברים קוונטיזציה וצבירה באמצעות האינדקס המרחבי H3 של Carto.
מפת החום נוצרת באמצעות שכבת מפת חום מ-deck.gl framework.
בדוגמה הזו, הקוונטיזציה מתבצעת באמצעות ספריית Python h3 כדי לצבור את נקודות האירועים למשושים. הפונקציה h3.latlng_to_cell משמשת למיפוי המיקום של האירוע (קו רוחב וקו אורך) לאינדקס תאים ב-H3. רזולוציית H3 של תשע מספקת מספיק משושים מצטברים למפת החום.
הפונקציה h3.cell_to_latlng משמשת לקביעת המרכז של כל משושה.
כדי להוסיף תא קוד, לוחצים על Code.
כדי לשלוח שאילתה על הנתונים במערך הנתונים של דוחות משטרת סן פרנסיסקו (SFPD), מזינים את הקוד הבא. הקוד הזה משתמש בפונקציית הקסם
%%bigqueryכדי להריץ את השאילתה ולהחזיר את התוצאות ב-DataFrame:# Query the incident key and location data from the SFPD reports dataset. %%bigquery gdf_incidents --project {GCP_PROJECT_ID} --use_geodataframe location_geography SELECT unique_key, location_geography FROM ( SELECT unique_key, SAFE.ST_GEOGFROMTEXT(location) AS location_geography, # WKT string to GEOMETRY EXTRACT(YEAR FROM timestamp) AS year, FROM `bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents` incidents ) WHERE year = 2015
לוחצים על Run cell.
הפלט אמור להיראות כך:
Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%כדי להוסיף תא קוד, לוחצים על Code.
כדי לחשב את התא של קו הרוחב וקו האורך של כל אירוע, לצבור את האירועים של כל תא, ליצור DataFrame של
geopandasולהוסיף את מרכז כל משושה לשכבת מפת החום, מזינים את הקוד הבא:# Compute the cell for each incident's latitude and longitude. H3_RESOLUTION = 9 gdf_incidents['h3_cell'] = gdf_incidents.geometry.apply( lambda geom: h3.latlng_to_cell(geom.y, geom.x, H3_RESOLUTION) ) # Aggregate the incidents for each hexagon cell. count_incidents = gdf_incidents.groupby(by='h3_cell')['unique_key'].count().rename('num_incidents') # Construct a new geopandas.GeoDataFrame with the aggregate results. # Add the center of each hexagon for the HeatmapLayer to render. gdf_incidents_x_cell = gpd.GeoDataFrame(data=count_incidents).reset_index() gdf_incidents_x_cell['h3_center'] = gdf_incidents_x_cell['h3_cell'].apply(h3.cell_to_latlng) gdf_incidents_x_cell.info()
לוחצים על Run cell.
הפלט אמור להיראות כך:
<class 'geopandas.geodataframe.GeoDataFrame'> RangeIndex: 969 entries, 0 to 968 Data columns (total 3 columns): # Column Non-Null Count Dtype -- ------ -------------- ----- 0 h3_cell 969 non-null object 1 num_incidents 969 non-null Int64 2 h3_center 969 non-null object dtypes: Int64(1), object(2) memory usage: 23.8+ KBכדי להוסיף תא קוד, לוחצים על Code.
כדי לראות תצוגה מקדימה של חמש השורות הראשונות של ה-DataFrame, מזינים את הקוד הבא:
# Preview the first five rows. gdf_incidents_x_cell.head()
לוחצים על Run cell.
הפלט אמור להיראות כך:
כדי להוסיף תא קוד, לוחצים על Code.
כדי להמיר את הנתונים לפורמט JSON שאפשר להשתמש בו ב-
HeatmapLayer, מזינים את הקוד הבא:# Convert to a JSON format recognized by the HeatmapLayer. def _make_heatmap_datum(row) -> dict: return { "latitude": row['h3_center'][0], "longitude": row['h3_center'][1], "weight": float(row['num_incidents']), } heatmap_data = gdf_incidents_x_cell.apply(_make_heatmap_datum, axis='columns').values.tolist()
לוחצים על Run cell.
אחרי שמריצים את הקוד, לא נוצר פלט ב-notebook של Colab. סימן הווי לצד התא מציין שהקוד פעל בהצלחה.
כדי להוסיף תא קוד, לוחצים על Code.
כדי להציג את מפת החום, מזינים את הקוד הבא:
# Render the heatmap. heatmap_layer = pdk.Layer( "HeatmapLayer", id="sfpd_heatmap", data=heatmap_data, get_position=['longitude', 'latitude'], get_weight='weight', opacity=0.7, radius_pixels=99, # this limitation can introduce artifacts (see above) aggregation='MEAN', ) view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12) display_pydeck_map([heatmap_layer], view_state)
לוחצים על Run cell.
הפלט אמור להיראות כך:
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים.
מחיקת הפרויקט
המסוף
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
gcloud
כדי למחוק פרויקט ב- Google Cloud :
gcloud projects delete PROJECT_ID
מחיקת ה-Notebook ומפתח ה-API של מפות Google
אחרי שמוחקים את הפרויקט ב- Google Cloud , אם השתמשתם ב-Google Maps API, מחקו את מפתח ה-API של Google Maps מהסודות ב-Colab ואז מחקו את ה-Notebook (אם רוצים).
ב-Colab, לוחצים על Secrets.
בסוף השורה של
GMP_API_KEY, לוחצים על Delete.אופציונלי: כדי למחוק את ה-notebook, לוחצים על File > Move to trash.
המאמרים הבאים
- למידע נוסף על ניתוח נתונים גיאו-מרחביים ב-BigQuery, קראו את המאמר מבוא לניתוח נתונים גיאו-מרחביים ב-BigQuery.
- במאמר המחשה חזותית של נתונים גיאו-מרחביים מוסבר איך להמחיש חזותית נתונים גיאו-מרחביים ב-BigQuery.
- כדי לקבל מידע נוסף על
pydeckועל סוגים אחרים של תרשימיdeck.gl, אפשר לעיין בדוגמאות בגלריה שלpydeck, בקטלוג השכבות שלdeck.glובמקור שלdeck.glב-GitHub. - למידע נוסף על עבודה עם נתונים גיאו-מרחביים במסגרות נתונים, קראו את דף תחילת העבודה של GeoPandas ואת המדריך למשתמש של GeoPandas.
- למידע נוסף על מניפולציה של אובייקטים גיאומטריים, ראו המדריך למשתמש של Shapely.
- כדי להבין איך משתמשים בנתונים של Google Earth Engine ב-BigQuery, קראו את המאמר ייצוא ל-BigQuery במסמכי התיעוד של Google Earth Engine.