{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## QuadkeyPandas key features\n",
    "\n",
    "You can try out vgridpandas by using the cloud-computing platforms below without having to install anything on your computer:\n",
    "\n",
    "[![image](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/opengeoshub/vgridpandas/blob/main/docs/notebooks/16_quadkey.ipynb)\n",
    "[![image](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/opengeoshub/vgridpandas/HEAD?filepath=docs/notebooks/16_quadkey.ipynb)\n",
    "[![image](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/opengeoshub/vgridpandas/blob/main/docs/notebooks/16_quadkey.ipynb)\n",
    "[![image](https://jupyterlite.rtfd.io/en/latest/_static/badge.svg)](https://jupyterlite.gishub.vn/lab/index.html?path=notebooks/vgridpandas/16_quadkey.ipynb)\n",
    "\n",
    "Full VgridPandas DGGS documentation is available at [vgridpandas document](https://vgridpandas.gishub.vn).\n",
    "\n",
    "To work with Vgrid in Python or CLI, use [vgrid](https://pypi.org/project/vgrid/) package. Full Vgrid DGGS documentation is available at [vgrid document](https://vgrid.gishub.vn).\n",
    "\n",
    "To work with Vgrid DGGS in QGIS, install the [Vgrid Plugin](https://plugins.qgis.org/plugins/vgridtools/).\n",
    "\n",
    "To visualize DGGS in Maplibre GL JS, try the [vgrid-maplibre](https://www.npmjs.com/package/vgrid-maplibre) library.\n",
    "\n",
    "For an interactive demo, visit the [Vgrid Homepage](https://vgrid.vn)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Install vgridpandas\n",
    "Uncomment the following line to install [vgridpandas](https://pypi.org/project/vgridpandas/)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# %pip install vgridpandas"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4740c9f5",
   "metadata": {},
   "source": [
    "### Import quadkeypandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a10c4a1d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from vgridpandas import quadkeypandas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Latlon to Quadkey"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<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>lon</th>\n",
       "      <th>lat</th>\n",
       "      <th>housing_median_age</th>\n",
       "      <th>total_rooms</th>\n",
       "      <th>total_bedrooms</th>\n",
       "      <th>population</th>\n",
       "      <th>households</th>\n",
       "      <th>median_income</th>\n",
       "      <th>median_house_value</th>\n",
       "      <th>ocean_proximity</th>\n",
       "      <th>quadkey</th>\n",
       "      <th>quadkey_res</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-122.23</td>\n",
       "      <td>37.88</td>\n",
       "      <td>41</td>\n",
       "      <td>880</td>\n",
       "      <td>129.0</td>\n",
       "      <td>322</td>\n",
       "      <td>126</td>\n",
       "      <td>8.3252</td>\n",
       "      <td>452600</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-122.22</td>\n",
       "      <td>37.86</td>\n",
       "      <td>21</td>\n",
       "      <td>7099</td>\n",
       "      <td>1106.0</td>\n",
       "      <td>2401</td>\n",
       "      <td>1138</td>\n",
       "      <td>8.3014</td>\n",
       "      <td>358500</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-122.24</td>\n",
       "      <td>37.85</td>\n",
       "      <td>52</td>\n",
       "      <td>1467</td>\n",
       "      <td>190.0</td>\n",
       "      <td>496</td>\n",
       "      <td>177</td>\n",
       "      <td>7.2574</td>\n",
       "      <td>352100</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-122.25</td>\n",
       "      <td>37.85</td>\n",
       "      <td>52</td>\n",
       "      <td>1274</td>\n",
       "      <td>235.0</td>\n",
       "      <td>558</td>\n",
       "      <td>219</td>\n",
       "      <td>5.6431</td>\n",
       "      <td>341300</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-122.25</td>\n",
       "      <td>37.85</td>\n",
       "      <td>52</td>\n",
       "      <td>1627</td>\n",
       "      <td>280.0</td>\n",
       "      <td>565</td>\n",
       "      <td>259</td>\n",
       "      <td>3.8462</td>\n",
       "      <td>342200</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20635</th>\n",
       "      <td>-121.09</td>\n",
       "      <td>39.48</td>\n",
       "      <td>25</td>\n",
       "      <td>1665</td>\n",
       "      <td>374.0</td>\n",
       "      <td>845</td>\n",
       "      <td>330</td>\n",
       "      <td>1.5603</td>\n",
       "      <td>78100</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>0230100313</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20636</th>\n",
       "      <td>-121.21</td>\n",
       "      <td>39.49</td>\n",
       "      <td>18</td>\n",
       "      <td>697</td>\n",
       "      <td>150.0</td>\n",
       "      <td>356</td>\n",
       "      <td>114</td>\n",
       "      <td>2.5568</td>\n",
       "      <td>77100</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>0230100313</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20637</th>\n",
       "      <td>-121.22</td>\n",
       "      <td>39.43</td>\n",
       "      <td>17</td>\n",
       "      <td>2254</td>\n",
       "      <td>485.0</td>\n",
       "      <td>1007</td>\n",
       "      <td>433</td>\n",
       "      <td>1.7000</td>\n",
       "      <td>92300</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>0230100313</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20638</th>\n",
       "      <td>-121.32</td>\n",
       "      <td>39.43</td>\n",
       "      <td>18</td>\n",
       "      <td>1860</td>\n",
       "      <td>409.0</td>\n",
       "      <td>741</td>\n",
       "      <td>349</td>\n",
       "      <td>1.8672</td>\n",
       "      <td>84700</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>0230100312</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20639</th>\n",
       "      <td>-121.24</td>\n",
       "      <td>39.37</td>\n",
       "      <td>16</td>\n",
       "      <td>2785</td>\n",
       "      <td>616.0</td>\n",
       "      <td>1387</td>\n",
       "      <td>530</td>\n",
       "      <td>2.3886</td>\n",
       "      <td>89400</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>0230100313</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>20640 rows × 12 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          lon    lat  housing_median_age  total_rooms  total_bedrooms  \\\n",
       "0     -122.23  37.88                  41          880           129.0   \n",
       "1     -122.22  37.86                  21         7099          1106.0   \n",
       "2     -122.24  37.85                  52         1467           190.0   \n",
       "3     -122.25  37.85                  52         1274           235.0   \n",
       "4     -122.25  37.85                  52         1627           280.0   \n",
       "...       ...    ...                 ...          ...             ...   \n",
       "20635 -121.09  39.48                  25         1665           374.0   \n",
       "20636 -121.21  39.49                  18          697           150.0   \n",
       "20637 -121.22  39.43                  17         2254           485.0   \n",
       "20638 -121.32  39.43                  18         1860           409.0   \n",
       "20639 -121.24  39.37                  16         2785           616.0   \n",
       "\n",
       "       population  households  median_income  median_house_value  \\\n",
       "0             322         126         8.3252              452600   \n",
       "1            2401        1138         8.3014              358500   \n",
       "2             496         177         7.2574              352100   \n",
       "3             558         219         5.6431              341300   \n",
       "4             565         259         3.8462              342200   \n",
       "...           ...         ...            ...                 ...   \n",
       "20635         845         330         1.5603               78100   \n",
       "20636         356         114         2.5568               77100   \n",
       "20637        1007         433         1.7000               92300   \n",
       "20638         741         349         1.8672               84700   \n",
       "20639        1387         530         2.3886               89400   \n",
       "\n",
       "      ocean_proximity     quadkey  quadkey_res  \n",
       "0            NEAR BAY  0230102122           10  \n",
       "1            NEAR BAY  0230102122           10  \n",
       "2            NEAR BAY  0230102122           10  \n",
       "3            NEAR BAY  0230102122           10  \n",
       "4            NEAR BAY  0230102122           10  \n",
       "...               ...         ...          ...  \n",
       "20635          INLAND  0230100313           10  \n",
       "20636          INLAND  0230100313           10  \n",
       "20637          INLAND  0230100313           10  \n",
       "20638          INLAND  0230100312           10  \n",
       "20639          INLAND  0230100313           10  \n",
       "\n",
       "[20640 rows x 12 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_csv('https://raw.githubusercontent.com/opengeoshub/vopendata/main/csv/housing.csv')\n",
    "resolution = 10\n",
    "df = df.quadkey.latlon2quadkey(resolution, lat_col='lat', lon_col='lon')\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### GeoPandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<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>longitude</th>\n",
       "      <th>latitude</th>\n",
       "      <th>housing_median_age</th>\n",
       "      <th>total_rooms</th>\n",
       "      <th>total_bedrooms</th>\n",
       "      <th>population</th>\n",
       "      <th>households</th>\n",
       "      <th>median_income</th>\n",
       "      <th>median_house_value</th>\n",
       "      <th>ocean_proximity</th>\n",
       "      <th>geometry</th>\n",
       "      <th>quadkey</th>\n",
       "      <th>quadkey_res</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-122.23</td>\n",
       "      <td>37.88</td>\n",
       "      <td>41.0</td>\n",
       "      <td>880.0</td>\n",
       "      <td>129.0</td>\n",
       "      <td>322.0</td>\n",
       "      <td>126.0</td>\n",
       "      <td>8.3252</td>\n",
       "      <td>452600.0</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>POINT (-122.23 37.88)</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-122.22</td>\n",
       "      <td>37.86</td>\n",
       "      <td>21.0</td>\n",
       "      <td>7099.0</td>\n",
       "      <td>1106.0</td>\n",
       "      <td>2401.0</td>\n",
       "      <td>1138.0</td>\n",
       "      <td>8.3014</td>\n",
       "      <td>358500.0</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>POINT (-122.22 37.86)</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-122.24</td>\n",
       "      <td>37.85</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1467.0</td>\n",
       "      <td>190.0</td>\n",
       "      <td>496.0</td>\n",
       "      <td>177.0</td>\n",
       "      <td>7.2574</td>\n",
       "      <td>352100.0</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>POINT (-122.24 37.85)</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-122.25</td>\n",
       "      <td>37.85</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1274.0</td>\n",
       "      <td>235.0</td>\n",
       "      <td>558.0</td>\n",
       "      <td>219.0</td>\n",
       "      <td>5.6431</td>\n",
       "      <td>341300.0</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>POINT (-122.25 37.85)</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-122.25</td>\n",
       "      <td>37.85</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1627.0</td>\n",
       "      <td>280.0</td>\n",
       "      <td>565.0</td>\n",
       "      <td>259.0</td>\n",
       "      <td>3.8462</td>\n",
       "      <td>342200.0</td>\n",
       "      <td>NEAR BAY</td>\n",
       "      <td>POINT (-122.25 37.85)</td>\n",
       "      <td>0230102122</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20635</th>\n",
       "      <td>-121.09</td>\n",
       "      <td>39.48</td>\n",
       "      <td>25.0</td>\n",
       "      <td>1665.0</td>\n",
       "      <td>374.0</td>\n",
       "      <td>845.0</td>\n",
       "      <td>330.0</td>\n",
       "      <td>1.5603</td>\n",
       "      <td>78100.0</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>POINT (-121.09 39.48)</td>\n",
       "      <td>0230100313</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20636</th>\n",
       "      <td>-121.21</td>\n",
       "      <td>39.49</td>\n",
       "      <td>18.0</td>\n",
       "      <td>697.0</td>\n",
       "      <td>150.0</td>\n",
       "      <td>356.0</td>\n",
       "      <td>114.0</td>\n",
       "      <td>2.5568</td>\n",
       "      <td>77100.0</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>POINT (-121.21 39.49)</td>\n",
       "      <td>0230100313</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20637</th>\n",
       "      <td>-121.22</td>\n",
       "      <td>39.43</td>\n",
       "      <td>17.0</td>\n",
       "      <td>2254.0</td>\n",
       "      <td>485.0</td>\n",
       "      <td>1007.0</td>\n",
       "      <td>433.0</td>\n",
       "      <td>1.7000</td>\n",
       "      <td>92300.0</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>POINT (-121.22 39.43)</td>\n",
       "      <td>0230100313</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20638</th>\n",
       "      <td>-121.32</td>\n",
       "      <td>39.43</td>\n",
       "      <td>18.0</td>\n",
       "      <td>1860.0</td>\n",
       "      <td>409.0</td>\n",
       "      <td>741.0</td>\n",
       "      <td>349.0</td>\n",
       "      <td>1.8672</td>\n",
       "      <td>84700.0</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>POINT (-121.32 39.43)</td>\n",
       "      <td>0230100312</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20639</th>\n",
       "      <td>-121.24</td>\n",
       "      <td>39.37</td>\n",
       "      <td>16.0</td>\n",
       "      <td>2785.0</td>\n",
       "      <td>616.0</td>\n",
       "      <td>1387.0</td>\n",
       "      <td>530.0</td>\n",
       "      <td>2.3886</td>\n",
       "      <td>89400.0</td>\n",
       "      <td>INLAND</td>\n",
       "      <td>POINT (-121.24 39.37)</td>\n",
       "      <td>0230100313</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>20640 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       longitude  latitude  housing_median_age  total_rooms  total_bedrooms  \\\n",
       "0        -122.23     37.88                41.0        880.0           129.0   \n",
       "1        -122.22     37.86                21.0       7099.0          1106.0   \n",
       "2        -122.24     37.85                52.0       1467.0           190.0   \n",
       "3        -122.25     37.85                52.0       1274.0           235.0   \n",
       "4        -122.25     37.85                52.0       1627.0           280.0   \n",
       "...          ...       ...                 ...          ...             ...   \n",
       "20635    -121.09     39.48                25.0       1665.0           374.0   \n",
       "20636    -121.21     39.49                18.0        697.0           150.0   \n",
       "20637    -121.22     39.43                17.0       2254.0           485.0   \n",
       "20638    -121.32     39.43                18.0       1860.0           409.0   \n",
       "20639    -121.24     39.37                16.0       2785.0           616.0   \n",
       "\n",
       "       population  households  median_income  median_house_value  \\\n",
       "0           322.0       126.0         8.3252            452600.0   \n",
       "1          2401.0      1138.0         8.3014            358500.0   \n",
       "2           496.0       177.0         7.2574            352100.0   \n",
       "3           558.0       219.0         5.6431            341300.0   \n",
       "4           565.0       259.0         3.8462            342200.0   \n",
       "...           ...         ...            ...                 ...   \n",
       "20635       845.0       330.0         1.5603             78100.0   \n",
       "20636       356.0       114.0         2.5568             77100.0   \n",
       "20637      1007.0       433.0         1.7000             92300.0   \n",
       "20638       741.0       349.0         1.8672             84700.0   \n",
       "20639      1387.0       530.0         2.3886             89400.0   \n",
       "\n",
       "      ocean_proximity               geometry     quadkey  quadkey_res  \n",
       "0            NEAR BAY  POINT (-122.23 37.88)  0230102122           10  \n",
       "1            NEAR BAY  POINT (-122.22 37.86)  0230102122           10  \n",
       "2            NEAR BAY  POINT (-122.24 37.85)  0230102122           10  \n",
       "3            NEAR BAY  POINT (-122.25 37.85)  0230102122           10  \n",
       "4            NEAR BAY  POINT (-122.25 37.85)  0230102122           10  \n",
       "...               ...                    ...         ...          ...  \n",
       "20635          INLAND  POINT (-121.09 39.48)  0230100313           10  \n",
       "20636          INLAND  POINT (-121.21 39.49)  0230100313           10  \n",
       "20637          INLAND  POINT (-121.22 39.43)  0230100313           10  \n",
       "20638          INLAND  POINT (-121.32 39.43)  0230100312           10  \n",
       "20639          INLAND  POINT (-121.24 39.37)  0230100313           10  \n",
       "\n",
       "[20640 rows x 13 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import geopandas as gpd\n",
    "\n",
    "df = gpd.read_file('https://raw.githubusercontent.com/opengeoshub/vopendata/main/shape/housing.geojson')\n",
    "resolution = 10\n",
    "df = df.quadkey.latlon2quadkey(resolution)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Quadkey to geo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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4PPr16+Xtm3bOvcR37Jli/zsZz9z7j3+8MMPHzf2q6++cm5te95550mynNtrr73mFO4//elPzvjvfve7Mm7cONmwYYPYfm56S+ELLrjAOaeNGzfKLbfcItdee22z/mIKOi/XD3/4Q/n+97/f4HN6XuPHj5cRI0Y456Xno31eJ0yYIM0pjHNTN998s9MWUYv3u+++6zRmOeussyQZzk3V1tY6Fx3nnHOOnJBICnnqqaciRUVFRmNvuOGGyHe/+93jvv/9738/ctddd0VmzpwZGThwYCSZzi1aSUlJZNasWRHbz+3222+P9O3b97if4ZgxYyI2nJfX37PFixdHMjMzI3V1dUe+t3Tp0khaWlqkpqYmYvO5bd261Tm3d999N5KInmrEuUX/vbzyyitj+rsdLSWuuE+E3kNXmx1He+qpp2THjh3OgvtkO7djb/SlN8fxG2PLub3++utOX9Ro2hNVv28zfTuu9/XRv5N1dXXOef/mN79xztWvObcNli1bJt26dXN61nbt2tVpwqLvkvbs2SPJ4K9//assXrxYHnnkkeS5yVQiWL16tfzud7+Tl19++cj3/vGPf8idd94pf/vb35z57WQ6t2Pp29N9+/bJZZddJraf22effSbt2rU7apz+We/qdvDgQWdu3EZa0P785z87P6Prr7/eKd762YROd9lOL4527drlFLdnn33WObfp06fLJZdc4hQ9m33xxRdyzTXXONN7jbnZlrVX3FpE9bavfg+dG4vVO++848wd6lW19tBU+hfniiuukFmzZjkfliTTuR1L+4jqeT7//PPO/HEynVs8xeu8vOgvpB//+McyceJEWbt2raxatcpp0q3FLewwdFOfm9uAXIu2zgEPHz5cFixYIK+++qps375dbD43/ZlpLRk2bFijtmPtpeNtt93m/Obyo2+3YrF161bnQ8frrrtO7rrrriPf12mDdevWOR/W3XTTTUf+cuk/EL361isf/ZDIxnOL9txzzzlvSfVK59jpBVvP7dRTT5Xdu3cf9T39s17thHm1HY/z8qNvs/WWof/1X/915Ht6FacrbLT3q642sfXc2rdv7/y7ir5I0hVD6sMPP5RevXpZe276jkE/aNV3tUpriNYSPd9f/epXzgebSV24dfmTPsKiqxK0+OoVzLHLjvQf+ebNm4/63qOPPur8EJYsWeK8bbX13FyLFi1y/tJo8dZVGPHS1OfW0PTBypUrne8n8nkFOXDgwHE358/IyHC+aiGw+dy+/e1vy6FDh+SDDz6Q7t27O9977733nK9dunSx+tz0sxV9B+/6wx/+IPfdd58zzadLHk1ZW7hjob+l9YMN/aovmi6fUrqmt6CgwHmbrf/49UOrW2+91Xkb6v5D0B+q/gPp16/fUdvUaYTc3Nzjvm/bubnTI1r4dA30t771rSNj9Io0XjeCb6pzmzx5srM88Pbbb3d+MekvW50G8pvjb+7zctf46ucMek46F++OKSkpcaZE9JfrvHnz5Be/+IWzrEzfFf70pz91CtuZZ55p9bnpuz1dd68/rwceeMD5RXTjjTc6S1abYqoynufmvnNw6Tv5hupLoEgKmDhxok76Hfd49dVXjyzdaej5Ll26eG4zUZYDhnFu5557boNjdNvJ8HPT8WeccUYkOzs70q1bN2cJViKfl9/PZOfOnUfGLFq0KHLmmWdG8vPzI23atIlceOGFkW3btkWS4dw++eSTyIQJEyIFBQWRdu3aRa655prIF198EUmGc4t2ossBua0rAFjG2lUlAJCqKNwAYBkKNwBYhsINAJahcAOAZSjcAGAZCjcAWIbCDQCWoXADgGUo3ABgGQo3AFiGwg0AYpf/B5Qw4xgljZ9UAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = df.quadkey.quadkey2geo(quadkey_col='quadkey')\n",
    "df.plot(edgecolor='white')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### (Multi)Polygon to Quadkey"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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73+3jh07Zr333nvmMZ9++qnnmJdeesmKjY21NmzYYO3atct6+OGHrSZNmlj+6m7VU/Pmzc1xma+pK1euWP7M7brKyMgw10ezZs2sr776yjp06JDVt29fq3Llyl6/X4F+TeW3ngLhmvrqq6+sP/zhD9bHH39sRUdHWxMnTvxRZbpxTRGe7rKGDRta/fv396zfvn3biomJscaOHevz+O7du1vt27f32taoUSOrX79+OT5Hp06drMcee8yzrr+gmpt37tzp2fa3v/3NhIbTp09b/upu1JUdnnz9kvqzgqir2rVrmxCZWf369a3XX3/d/D8lJcW86C9ZssSz/x//+Ie51rZt22b5o7tRT/Yb3cCBA63CxO26Sk5ONtfG/v37vcqMjIy0PvjgA7PONZW/egqUayo/r8t5lenWNUW33V108+ZN2b17t7Ru3drrs/N0fdu2bT4fo9szH68SEhJyPF6bIletWmW65TKXoV11Dz30kGeblqnPvWPHDvFHd6uubNpNp0289erVM116P/zwg/irgqqrJk2ayMqVK+X06dPmAzb//ve/y//+7/9KmzZtzH59zlu3bnmVo102lStXzvF5A7GebB9++KGUL19efvGLX8iwYcMkPT1d/FVB1NWNGzfMV+1ayVymTnb4xRdfmHWuqfzVU6BcU26U6dY1xQcD30WXLl2S27dvS4UKFby26/qhQ4d8PubcuXM+j9ftvsybN0/uu+8+6dq1q1cZUVFRXscFBwdLREREjuUEal2pl19+WerXr2/qZ+vWreZF6ezZs/LOO+9IINXVu+++K3379jVjefR60RelDz74QB599FFPGcWLFzfBPLdyAr2e1DPPPCNVqlQxY1i+/fZbee211yQ5OVmWLVsm/qgg6sp+w9Lfp/fee09KlSolEydOlH/961/m98suI9CvqfzUU6BcU26U6dY1RXi6x82ePdsMDM/8Vwuc1dXgwYM9/3/wwQfNL16/fv1k7NixAfWROBoKtm/fblpV9EV68+bNZtClvlhnbWEIZPmpJw1XNh1IXbFiRWnVqpUcPXpU4uLiJBAUK1bMvLFrS6/+YVK0aFFTP+3atTMtdnBWT1xTPy3C012kzav6i5B1lL+uR0dH+3yMbs/v8Vu2bDF/eSxatChbGRcuXPDapt1QegdeTs8bqHXli969ofV1/PhxqVGjhgRCXV27dk3+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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import geopandas as gpd\n",
    "\n",
    "gdf = gpd.read_file('https://raw.githubusercontent.com/opengeoshub/vopendata/main/shape/polygon.geojson')\n",
    "resolution = 18\n",
    "gdf_polyfill = gdf.quadkey.polyfill(resolution, compact=True, predicate='intersect', explode=False)\n",
    "gdf_polyfill = gdf_polyfill.quadkey.quadkey2geo(quadkey_col='quadkey')\n",
    "gdf_polyfill.plot(edgecolor='white')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Quadkey binning"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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+dJLL0mzZs0kf/78UrRo0Wte//LLL+WBBx4wW1wlJCRIjRo1ZNKkSRm29/nnn0uuXLmkXr16EgvX9s9//tPcok3vW6q7lTRt2tTcti1W/t701nP169c3U//11nOzZs2S7Hxd6qmnnpIGDRqYc87o35n+HTVp0sRsI6l/d127dpX//Oc/EgvXppP3x48fL7fccouJu+mmm0zbsXBtAd999535u8uoLWQ/OSJh6j6L9913n/Tv3z/d17du3SolS5Y0N77euXOn/OlPfzI3y548efI1sSdPnjT3BG3VqpXEyrWtXbvWJMwlS5aY+BYtWkinTp3kiy++EK9fm96LtWPHjuaatm/fLgMHDpQ+ffr8oh8InK4roFevXtKtW7d0X9Pr6ty5s7Rs2dJcl17P8ePHpUuXLvJLisa1qaefflqmT59ukubXX38tCxculEaNGkksXJu6fPmy+bB35513RvkskaX8OcjMmTP9RYoUsYr9wx/+4G/RosU1z3fr1s0/fPhw/4gRI/x169b1x9K1hapZs6Z/5MiRfq9f29ChQ/21atW65u+wXbt2fi9cV0b/zhITE/25cuXyp6SkBJ9buHCh3+fz+ZOSkvxevrZdu3aZa/v666/92VEk1xb67/Khhx7K1L9t/PJyRIV5PU6dOiXFihVL89zMmTPl3//+t9nZI9au7eo7xuhdFsLFeOXa1q9fL61bt04T065dO/O8l2m3n96oQP9NpqSkmOv++9//bq41d+7c4mUffvih/OpXv5JFixZJ5cqVpVKlSqZX4MSJExILVq1aJYmJiTJlypRf+lTg9buVZAfr1q2TefPmyeLFi4PPffvtt/Lss8/Kp59+asYvY+narqbdYGfPnpX7779fvH5thw8fllKlSqWJ08d6W6YLFy6YsU8v0kSyfPly83f0+OOPm6SpY8/are51+qH0+++/N0nlb3/7m7m2QYMGyb333muSjZf9+OOP8uijj5phhFi8a0us82yFqclL75cZ7tCxj8z66quvzNiQVpFt27Y1z+n/sA8++KCMHDnSTEKIpWu72pw5c8x1vvvuu2Z8MJauLStl1XVlRD8I9O3bV3r06CGbN2+WNWvWmHsZalKJ9m6Xbl+b9nBcunTJJEsd42vevLnMmDFDPvnkE9mzZ494+dr070x/l9x1111RaxPu8Wyp9D//8z/mk1o42q2TGbt27TKTeR577DEZPnx48HntntyyZYuZBPPEE08E/6fWX0xabeonfZ184cVrCzV37lzT9aWf7K/uxvTqtekd5I8cOZLmOX2sn+6jWV1mxXWFo915eq/FcePGBZ/TqkVnDG/cuNHMnvXqtZUpU8b8fxX64VRnQKv9+/dLtWrVPHttWiHrBCbtxVH6O0R/l+j1/vWvfzUThpB9eTZh6jR6PaJFZ1lq0tNP7FdPX9dfrjt27Ejz3NSpU80//vnz55vuMa9eW8A//vEP8z+rJk2dVZpV3L629LopV6xYYZ7Pztfl5Pz582YMM1R8fLz5qr+AvXxtt99+uyQnJ8vevXvl5ptvNs9988035mvFihU9fW06dq49VgEffPCB/O///q8ZTtClM8jePJswM0M/leqEAf2q/1h1Gr7SNXkFCxY03Xn6S1cngwwePNh0dwV+Aen/TPqL6dZbb03TpnZX6l3Or37ea9cW6IbVhKNrGBs3bhyM0QrMjTvGZ+W19evXzywzGTp0qPlAoB9ytLs53BjuL31dgTV6Oo6s16RjrYGYmjVrmq5X/VAzYcIEGTVqlFmeoL0gzz33nEkot912m6evTXs3dN2s/n1NnDjRfAAYMGCAWfrkxpBIVl5boFIO0J6r9H6/IJvy5wA9evTQQZ1rjk8++SQ4BTy91ytWrJhhm9llWUk0ru03v/lNujHadiz8vWl8vXr1/Hny5PH/6le/MlP5s/N1hfs72bdvXzDmH//4h/+2227zFyhQwH/jjTf6f/e73/l3797tj4Vr++GHH/xdunTxFyxY0F+qVCn/o48+6v/xxx/9sXBtoVhW4i3cDxMAgFieJQsAgJtImAAAWCBhAgBggYQJAIAFEiYAABZImAAAWCBhAgBggYQJAIAFEiYAABZImAAAWCBhAgAgzv5/7idW4t9WSzAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "resolution = 10\n",
    "df = pd.read_csv('https://raw.githubusercontent.com/opengeoshub/vopendata/main/csv/housing.csv')\n",
    "stats = 'max'\n",
    "numeric_col = 'median_house_value'\n",
    "df_bin = df.quadkey.quadkeybin(resolution=resolution,\n",
    "                    lat_col='lat',\n",
    "                    lon_col='lon',\n",
    "                    stats=stats,\n",
    "                    numeric_col=numeric_col,\n",
    "                    # category_col='ocean_proximity',\n",
    "                    )\n",
    "df_bin.plot(\n",
    "    column=f'{numeric_col}_{stats}',\n",
    "    cmap='Spectral_r',\n",
    "    legend=True,\n",
    "    linewidth=0.2,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### GeoPandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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+dJLL0mzZs0kf/78UrRo0Wte//LLL+WBBx4wW1wlJCRIjRo1ZNKkSRm29/nnn0uuXLmkXr16EgvX9s9//tPcok3vW6q7lTRt2tTcti1W/t701nP169c3U//11nOzZs2S7Hxd6qmnnpIGDRqYc87o35n+HTVp0sRsI6l/d127dpX//Oc/EgvXppP3x48fL7fccouJu+mmm0zbsXBtAd999535u8uoLWQ/OSJh6j6L9913n/Tv3z/d17du3SolS5Y0N77euXOn/OlPfzI3y548efI1sSdPnjT3BG3VqpXEyrWtXbvWJMwlS5aY+BYtWkinTp3kiy++EK9fm96LtWPHjuaatm/fLgMHDpQ+ffr8oh8InK4roFevXtKtW7d0X9Pr6ty5s7Rs2dJcl17P8ePHpUuXLvJLisa1qaefflqmT59ukubXX38tCxculEaNGkksXJu6fPmy+bB35513RvkskaX8OcjMmTP9RYoUsYr9wx/+4G/RosU1z3fr1s0/fPhw/4gRI/x169b1x9K1hapZs6Z/5MiRfq9f29ChQ/21atW65u+wXbt2fi9cV0b/zhITE/25cuXyp6SkBJ9buHCh3+fz+ZOSkvxevrZdu3aZa/v666/92VEk1xb67/Khhx7K1L9t/PJyRIV5PU6dOiXFihVL89zMmTPl3//+t9nZI9au7eo7xuhdFsLFeOXa1q9fL61bt04T065dO/O8l2m3n96oQP9NpqSkmOv++9//bq41d+7c4mUffvih/OpXv5JFixZJ5cqVpVKlSqZX4MSJExILVq1aJYmJiTJlypRf+lTg9buVZAfr1q2TefPmyeLFi4PPffvtt/Lss8/Kp59+asYvY+narqbdYGfPnpX7779fvH5thw8fllKlSqWJ08d6W6YLFy6YsU8v0kSyfPly83f0+OOPm6SpY8/are51+qH0+++/N0nlb3/7m7m2QYMGyb333muSjZf9+OOP8uijj5phhFi8a0us82yFqclL75cZ7tCxj8z66quvzNiQVpFt27Y1z+n/sA8++KCMHDnSTEKIpWu72pw5c8x1vvvuu2Z8MJauLStl1XVlRD8I9O3bV3r06CGbN2+WNWvWmHsZalKJ9m6Xbl+b9nBcunTJJEsd42vevLnMmDFDPvnkE9mzZ494+dr070x/l9x1111RaxPu8Wyp9D//8z/mk1o42q2TGbt27TKTeR577DEZPnx48HntntyyZYuZBPPEE08E/6fWX0xabeonfZ184cVrCzV37lzT9aWf7K/uxvTqtekd5I8cOZLmOX2sn+6jWV1mxXWFo915eq/FcePGBZ/TqkVnDG/cuNHMnvXqtZUpU8b8fxX64VRnQKv9+/dLtWrVPHttWiHrBCbtxVH6O0R/l+j1/vWvfzUThpB9eTZh6jR6PaJFZ1lq0tNP7FdPX9dfrjt27Ejz3NSpU80//vnz55vuMa9eW8A//vEP8z+rJk2dVZpV3L629LopV6xYYZ7Pztfl5Pz582YMM1R8fLz5qr+AvXxtt99+uyQnJ8vevXvl5ptvNs9988035mvFihU9fW06dq49VgEffPCB/O///q8ZTtClM8jePJswM0M/leqEAf2q/1h1Gr7SNXkFCxY03Xn6S1cngwwePNh0dwV+Aen/TPqL6dZbb03TpnZX6l3Or37ea9cW6IbVhKNrGBs3bhyM0QrMjTvGZ+W19evXzywzGTp0qPlAoB9ytLs53BjuL31dgTV6Oo6s16RjrYGYmjVrmq5X/VAzYcIEGTVqlFmeoL0gzz33nEkot912m6evTXs3dN2s/n1NnDjRfAAYMGCAWfrkxpBIVl5boFIO0J6r9H6/IJvy5wA9evTQQZ1rjk8++SQ4BTy91ytWrJhhm9llWUk0ru03v/lNujHadiz8vWl8vXr1/Hny5PH/6le/MlP5s/N1hfs72bdvXzDmH//4h/+2227zFyhQwH/jjTf6f/e73/l3797tj4Vr++GHH/xdunTxFyxY0F+qVCn/o48+6v/xxx/9sXBtoVhW4i3cDxMAgFieJQsAgJtImAAAWCBhAgBggYQJAIAFEiYAABZImAAAWCBhAgBggYQJAIAFEiYAABZImAAAWCBhAgAgzv5/7idW4t9WSzAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import geopandas as gpd\n",
    "\n",
    "resolution = 10\n",
    "df = gpd.read_file('https://raw.githubusercontent.com/opengeoshub/vopendata/main/shape/housing.geojson')\n",
    "stats = 'max'\n",
    "numeric_col = 'median_house_value'\n",
    "df_bin = df.quadkey.quadkeybin(resolution=resolution,\n",
    "                    stats=stats,\n",
    "                    numeric_col=numeric_col,\n",
    "                    # category_col='ocean_proximity',\n",
    "                    )\n",
    "df_bin.plot(\n",
    "    column=f'{numeric_col}_{stats}',\n",
    "    cmap='Spectral_r',\n",
    "    legend=True,\n",
    "    linewidth=0.2,\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv (3.13.11)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
