{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "4ab778b4-52a0-4dab-9d4c-e883a9914f97",
   "metadata": {},
   "source": [
    "# Convert geometries of a geodataframe to vertices \n",
    "O. Kaufmann, 2021."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "23357b33-d921-4ab8-856e-9e864480e741",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import geopandas as gpd\n",
    "from geometron.geometries import gdf_to_points_gdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4a537cf3-53db-4f12-a9dc-a42c5841dd45",
   "metadata": {},
   "outputs": [],
   "source": [
    "geo_interface = {\"type\": \"FeatureCollection\"}\n",
    "features = []\n",
    "bbox = (0., 1., 0., 1., 0., 8.)\n",
    "geo_interface[\"bbox\"] = bbox"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "aa3aa768-d44a-4fb2-83ee-6ddcb66e4ffd",
   "metadata": {},
   "outputs": [],
   "source": [
    "features.append({'id':0, 'type': 'Feature', 'properties': {'comment': 'a 2D point'}, 'geometry': {'type': 'Point', 'coordinates': (1., 0.)}})\n",
    "features.append({'id':1, 'type': 'Feature', 'properties': {'comment': 'a 3D point'}, 'geometry': {'type': 'Point', 'coordinates': (0., 1., 4.)}})\n",
    "features.append({'id':2, 'type': 'Feature', 'properties': {'comment': 'a 2D linestring'}, 'geometry': {'type': 'LineString', 'coordinates': [(1., 1.), (1., 2.), (2., 2.)]}})\n",
    "features.append({'id':3, 'type': 'Feature', 'properties': {'comment': 'a 3D linestring'}, 'geometry': {'type': 'LineString', 'coordinates': [(2., 3., 1.), (3., 3., 2.), (3., 4., 4.)]}})\n",
    "features.append({'id':4, 'type': 'Feature', 'properties': {'comment': 'a 2D polygon'}, 'geometry': {'type': 'Polygon', 'coordinates': [[(3., 0.), (3., 1.), (4., 1.), (4., 0.), (3., 0.)]]}})\n",
    "features.append({'id':5, 'type': 'Feature', 'properties': {'comment': 'a 3D polygon'}, 'geometry': {'type': 'Polygon', 'coordinates': [[(0., 3., 0.), (0., 4., 2.), (1., 4., 4.), (1., 3., 8.), (0., 3., 0.)]]}})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b8ebaafa-6d8a-4897-8173-5e73d80bcc57",
   "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>geometry</th>\n",
       "      <th>comment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>POINT (1.00000 0.00000)</td>\n",
       "      <td>a 2D point</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>POINT Z (0.00000 1.00000 4.00000)</td>\n",
       "      <td>a 3D point</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>LINESTRING (1.00000 1.00000, 1.00000 2.00000, ...</td>\n",
       "      <td>a 2D linestring</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>LINESTRING Z (2.00000 3.00000 1.00000, 3.00000...</td>\n",
       "      <td>a 3D linestring</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>POLYGON ((3.00000 0.00000, 3.00000 1.00000, 4....</td>\n",
       "      <td>a 2D polygon</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>POLYGON Z ((0.00000 3.00000 0.00000, 0.00000 4...</td>\n",
       "      <td>a 3D polygon</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                            geometry          comment\n",
       "0                            POINT (1.00000 0.00000)       a 2D point\n",
       "1                  POINT Z (0.00000 1.00000 4.00000)       a 3D point\n",
       "2  LINESTRING (1.00000 1.00000, 1.00000 2.00000, ...  a 2D linestring\n",
       "3  LINESTRING Z (2.00000 3.00000 1.00000, 3.00000...  a 3D linestring\n",
       "4  POLYGON ((3.00000 0.00000, 3.00000 1.00000, 4....     a 2D polygon\n",
       "5  POLYGON Z ((0.00000 3.00000 0.00000, 0.00000 4...     a 3D polygon"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "geo_interface[\"features\"] = features\n",
    "gdf = gpd.GeoDataFrame.from_features(geo_interface)\n",
    "gdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b6a58e62-c549-4f63-a85f-865e49dfc507",
   "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>geometry</th>\n",
       "      <th>comment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>POINT Z (0.00000 3.00000 0.00000)</td>\n",
       "      <td>a 3D polygon</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>POINT Z (0.00000 4.00000 2.00000)</td>\n",
       "      <td>a 3D polygon</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>POINT Z (1.00000 4.00000 4.00000)</td>\n",
       "      <td>a 3D polygon</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>POINT Z (1.00000 3.00000 8.00000)</td>\n",
       "      <td>a 3D polygon</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>POINT Z (0.00000 3.00000 0.00000)</td>\n",
       "      <td>a 3D polygon</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                             geometry       comment\n",
       "13  POINT Z (0.00000 3.00000 0.00000)  a 3D polygon\n",
       "14  POINT Z (0.00000 4.00000 2.00000)  a 3D polygon\n",
       "15  POINT Z (1.00000 4.00000 4.00000)  a 3D polygon\n",
       "16  POINT Z (1.00000 3.00000 8.00000)  a 3D polygon\n",
       "17  POINT Z (0.00000 3.00000 0.00000)  a 3D polygon"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_points = gdf_to_points_gdf(gdf, columns=['comment'])\n",
    "gdf_points.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6df927c5-0416-46dd-8648-3783978e48fe",
   "metadata": {
    "nbsphinx-thumbnail": {
     "tooltip": "This tooltip message was defined in cell metadata"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(ncols=2)\n",
    "gdf.plot(ax=ax[0])\n",
    "gdf_points.plot(ax=ax[1])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}