Created
March 6, 2022 09:37
-
-
Save alasarr/253ccf569cb824a1c27369c5203c7072 to your computer and use it in GitHub Desktop.
GeoParquet BigQuery
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/alasarr/253ccf569cb824a1c27369c5203c7072/geoparquet-bigquery.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"!pip install geopandas" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "Cirb5qI1gcq8", | |
"outputId": "64acbe07-0908-4067-ba74-682f2fbc9b9b" | |
}, | |
"execution_count": 1, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Collecting geopandas\n", | |
" Downloading geopandas-0.10.2-py2.py3-none-any.whl (1.0 MB)\n", | |
"\u001b[K |████████████████████████████████| 1.0 MB 5.4 MB/s \n", | |
"\u001b[?25hCollecting fiona>=1.8\n", | |
" Downloading Fiona-1.8.21-cp37-cp37m-manylinux2014_x86_64.whl (16.7 MB)\n", | |
"\u001b[K |████████████████████████████████| 16.7 MB 186 kB/s \n", | |
"\u001b[?25hCollecting pyproj>=2.2.0\n", | |
" Downloading pyproj-3.2.1-cp37-cp37m-manylinux2010_x86_64.whl (6.3 MB)\n", | |
"\u001b[K |████████████████████████████████| 6.3 MB 38.4 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: pandas>=0.25.0 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.3.5)\n", | |
"Requirement already satisfied: shapely>=1.6 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.8.1.post1)\n", | |
"Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (57.4.0)\n", | |
"Collecting munch\n", | |
" Downloading munch-2.5.0-py2.py3-none-any.whl (10 kB)\n", | |
"Requirement already satisfied: certifi in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (2021.10.8)\n", | |
"Collecting click-plugins>=1.0\n", | |
" Downloading click_plugins-1.1.1-py2.py3-none-any.whl (7.5 kB)\n", | |
"Requirement already satisfied: attrs>=17 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (21.4.0)\n", | |
"Requirement already satisfied: six>=1.7 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (1.15.0)\n", | |
"Requirement already satisfied: click>=4.0 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (7.1.2)\n", | |
"Collecting cligj>=0.5\n", | |
" Downloading cligj-0.7.2-py3-none-any.whl (7.1 kB)\n", | |
"Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (2018.9)\n", | |
"Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (1.21.5)\n", | |
"Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (2.8.2)\n", | |
"Installing collected packages: munch, cligj, click-plugins, pyproj, fiona, geopandas\n", | |
"Successfully installed click-plugins-1.1.1 cligj-0.7.2 fiona-1.8.21 geopandas-0.10.2 munch-2.5.0 pyproj-3.2.1\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "qTmLBxDxBAZL" | |
}, | |
"source": [ | |
"### Connect to BigQuery\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"id": "SeTJb51SKs_W", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"outputId": "f054321c-f86b-4ccb-a340-3eea606bdadc" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Authenticated\n" | |
] | |
} | |
], | |
"source": [ | |
"from google.colab import auth\n", | |
"auth.authenticate_user()\n", | |
"print('Authenticated')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "lK-9fSClKtAB" | |
}, | |
"source": [ | |
"### Read a table from a BigQuery into a Dataframe" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"project_id = 'cartodb-gcp-backend-data-team'" | |
], | |
"metadata": { | |
"id": "O0NrGkUXlnmr" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "ONI1Xo0-KtAD", | |
"outputId": "db8bd88c-4106-410b-cc41-cc26707904b4" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
"WARNING:google.auth._default:No project ID could be determined. Consider running `gcloud config set project` or setting the GOOGLE_CLOUD_PROJECT environment variable\n" | |
] | |
} | |
], | |
"source": [ | |
"from google.cloud import bigquery\n", | |
"\n", | |
"client = bigquery.Client(project=project_id)\n", | |
"\n", | |
"df = client.query('''\n", | |
" SELECT * FROM `carto-do-public-data.carto.geography_usa_county_2019`\n", | |
" ''').to_dataframe()\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 206 | |
}, | |
"id": "XrFmZBr9KtAN", | |
"outputId": "b02bc03e-6e4c-4aef-8cfe-d57b510f7528" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"\n", | |
" <div id=\"df-98b79c9f-4bb9-423c-a071-0fba2d532d29\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>geoid</th>\n", | |
" <th>do_date</th>\n", | |
" <th>do_label</th>\n", | |
" <th>do_perimeter</th>\n", | |
" <th>do_area</th>\n", | |
" <th>do_num_vertices</th>\n", | |
" <th>geom</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>15005</td>\n", | |
" <td>2019-01-01</td>\n", | |
" <td>Kalawao</td>\n", | |
" <td>44918.349</td>\n", | |
" <td>3.097105e+07</td>\n", | |
" <td>160</td>\n", | |
" <td>POLYGON((-156.917863 21.169224, -156.919403 21...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>47153</td>\n", | |
" <td>2019-01-01</td>\n", | |
" <td>Sequatchie</td>\n", | |
" <td>145804.373</td>\n", | |
" <td>6.890534e+08</td>\n", | |
" <td>256</td>\n", | |
" <td>POLYGON((-85.45352 35.55813, -85.454984 35.552...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>21233</td>\n", | |
" <td>2019-01-01</td>\n", | |
" <td>Webster</td>\n", | |
" <td>154162.019</td>\n", | |
" <td>8.692194e+08</td>\n", | |
" <td>256</td>\n", | |
" <td>POLYGON((-87.752474 37.622796, -87.766068 37.6...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>16017</td>\n", | |
" <td>2019-01-01</td>\n", | |
" <td>Bonner</td>\n", | |
" <td>377667.980</td>\n", | |
" <td>4.967966e+09</td>\n", | |
" <td>256</td>\n", | |
" <td>POLYGON((-117.033218 48.760132, -117.033335 48...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>21023</td>\n", | |
" <td>2019-01-01</td>\n", | |
" <td>Bracken</td>\n", | |
" <td>125092.379</td>\n", | |
" <td>5.411369e+08</td>\n", | |
" <td>256</td>\n", | |
" <td>POLYGON((-84.235962 38.822361, -84.233354 38.8...</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-98b79c9f-4bb9-423c-a071-0fba2d532d29')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-98b79c9f-4bb9-423c-a071-0fba2d532d29 button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-98b79c9f-4bb9-423c-a071-0fba2d532d29');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
], | |
"text/plain": [ | |
" geoid do_date do_label do_perimeter do_area do_num_vertices \\\n", | |
"0 15005 2019-01-01 Kalawao 44918.349 3.097105e+07 160 \n", | |
"1 47153 2019-01-01 Sequatchie 145804.373 6.890534e+08 256 \n", | |
"2 21233 2019-01-01 Webster 154162.019 8.692194e+08 256 \n", | |
"3 16017 2019-01-01 Bonner 377667.980 4.967966e+09 256 \n", | |
"4 21023 2019-01-01 Bracken 125092.379 5.411369e+08 256 \n", | |
"\n", | |
" geom \n", | |
"0 POLYGON((-156.917863 21.169224, -156.919403 21... \n", | |
"1 POLYGON((-85.45352 35.55813, -85.454984 35.552... \n", | |
"2 POLYGON((-87.752474 37.622796, -87.766068 37.6... \n", | |
"3 POLYGON((-117.033218 48.760132, -117.033335 48... \n", | |
"4 POLYGON((-84.235962 38.822361, -84.233354 38.8... " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 31 | |
} | |
], | |
"source": [ | |
"df.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import geopandas as gpd\n", | |
"# BigQuery returns geometries in WKT\n", | |
"df['geom'] = gpd.GeoSeries.from_wkt(df['geom'])\n", | |
"gdf = gpd.GeoDataFrame(df, geometry='geom',crs=\"EPSG:4326\")" | |
], | |
"metadata": { | |
"id": "V4_p223eiexf" | |
}, | |
"execution_count": 32, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"gdf.plot()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 160 | |
}, | |
"id": "_TLqQZg_jLne", | |
"outputId": "ee252aee-f55f-4e86-9fce-217f5b768975" | |
}, | |
"execution_count": 37, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"<matplotlib.axes._subplots.AxesSubplot at 0x7fd6dfd9e550>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 37 | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Convert GeoPandas to Geoparquet" | |
], | |
"metadata": { | |
"id": "n08Bxicpk8yz" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import pyarrow as pa\n", | |
"import pyarrow.parquet as pq\n", | |
"import pyproj\n", | |
"import json" | |
], | |
"metadata": { | |
"id": "O_yorm17jNvg" | |
}, | |
"execution_count": 41, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"table = pa.Table.from_pandas(gdf.head().to_wkb())\n", | |
"\n", | |
"\n", | |
"metadata = {\n", | |
" \"version\": \"0.1.0\",\n", | |
" \"primary_column\": \"geometry\",\n", | |
" \"columns\": {\n", | |
" \"geometry\": {\n", | |
" \"crs\": gdf.crs.to_wkt(pyproj.enums.WktVersion.WKT2_2019_SIMPLIFIED),\n", | |
" \"encoding\": \"WKB\",\n", | |
" \"edges\": \"planar\",\n", | |
" \"bbox\": [round(x, 4) for x in gdf.geometry.unary_union.bounds],\n", | |
" },\n", | |
" },\n", | |
"}\n", | |
"\n", | |
"schema = (\n", | |
" table.schema\n", | |
" .with_metadata({\"geo\": json.dumps(metadata)})\n", | |
")\n", | |
"table = table.cast(schema)\n" | |
], | |
"metadata": { | |
"id": "nnpFyywqjwuq" | |
}, | |
"execution_count": 42, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"pq.write_table(table, \"example.parquet\")" | |
], | |
"metadata": { | |
"id": "nucgJxdFj9vn" | |
}, | |
"execution_count": 47, | |
"outputs": [] | |
} | |
], | |
"metadata": { | |
"colab": { | |
"collapsed_sections": [], | |
"name": "GeoParquet BigQuery", | |
"provenance": [], | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"display_name": "Python 3", | |
"name": "python3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment