{ "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 }