{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Example of using the `Streetscape` class\n", "\n", "The class is designed for morphological streetscape analysis, focusing on generating nd analyzing streetscape measures based on sight points and sightlines. It attempts to capture the space from the pedestrian point of view.\n", "\n", "For details and citation, refer to *Araldi, A., Fleischmann, M., Fusco, G., Novotný, M., 2025. Streetscape morphometrics: Expanding momepy to analyze urban form from the street point of view. SoftwareX 31, 102242. [https://doi.org/10.1016/j.softx.2025.102242](https://doi.org/10.1016/j.softx.2025.102242).*" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import geopandas as gpd\n", "import momepy\n", "import numpy as np\n", "import osmnx as ox\n", "import rioxarray" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Read all the data. Only streets and buildings are required." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "streets = gpd.read_file(\n", " momepy.datasets.get_path(\"bubenec\"), layer=\"streets\"\n", ").to_crs(5514)\n", "buildings = gpd.read_file(\n", " momepy.datasets.get_path(\"bubenec\"), layer=\"buildings\"\n", ").to_crs(5514)\n", "plots = gpd.read_file(\n", " momepy.datasets.get_path(\"bubenec\"), layer=\"plots\"\n", ").to_crs(5514)\n", "dtm = rioxarray.open_rasterio(momepy.datasets.get_path(\"bubenec\"), layer=\"dtm\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mimic data on building category and height." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "buildings[\"category\"] = np.random.randint(0, 6, len(buildings))\n", "buildings[\"height\"] = np.random.randint(12, 30, len(buildings))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initiate the class. This will dricectly compute builk of the sightline indicators based on streets and buildings." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "sc = momepy.Streetscape(\n", " streets, buildings, category_col=\"category\", height_col=\"height\"\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have plots and DTM, you can use two additional methods to compute additional variables." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "sc.compute_plots(plots)\n", "sc.compute_slope(dtm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The resulting data can be extracted either on a street level:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | N | \n", "n_l | \n", "n_r | \n", "left_os | \n", "right_os | \n", "os | \n", "left_os_std | \n", "right_os_std | \n", "os_std | \n", "left_os_mad | \n", "... | \n", "plot_WP_ratio | \n", "left_plot_WP_ratio | \n", "right_plot_WP_ratio | \n", "left_plot_seq_sb_index | \n", "right_plot_seq_sb_index | \n", "slope_degree | \n", "slope_percent | \n", "n_slopes | \n", "slope_valid | \n", "geometry | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| street_index | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| 0 | \n", "57 | \n", "28 | \n", "38 | \n", "33.607135 | \n", "38.163914 | \n", "71.771049 | \n", "14.794107 | \n", "12.059253 | \n", "13.436283 | \n", "13.873261 | \n", "... | \n", "0.170662 | \n", "0.156054 | \n", "0.184501 | \n", "{96, 101, 103, 104, 82, 308, 87, 89, 92} | \n", "{102, 105, 309, 310, 311, 383} | \n", "2.809318 | \n", "0.049073 | \n", "57 | \n", "True | \n", "LINESTRING (-743681.992 -1040957.169, -743809.... | \n", "
| 1 | \n", "22 | \n", "0 | \n", "19 | \n", "50.000000 | \n", "17.497487 | \n", "67.497487 | \n", "0.000000 | \n", "14.015687 | \n", "9.794670 | \n", "0.000000 | \n", "... | \n", "0.255912 | \n", "0.284263 | \n", "0.230261 | \n", "{242, 243} | \n", "{240, 238, 239} | \n", "0.166605 | \n", "0.002908 | \n", "22 | \n", "True | \n", "LINESTRING (-743916.081 -1041162.952, -743899.... | \n", "
| 2 | \n", "43 | \n", "36 | \n", "21 | \n", "13.907200 | \n", "35.792031 | \n", "49.699231 | \n", "16.207022 | \n", "15.188099 | \n", "15.613165 | \n", "11.913767 | \n", "... | \n", "0.200568 | \n", "0.221176 | \n", "0.181546 | \n", "{78, 79, 80, 81, 82, 308} | \n", "{83, 87, 311, 89, 90} | \n", "1.122029 | \n", "0.019587 | \n", "43 | \n", "True | \n", "LINESTRING (-743689.806 -1041115.822, -743698.... | \n", "
| 3 | \n", "24 | \n", "0 | \n", "0 | \n", "50.000000 | \n", "48.865531 | \n", "98.865531 | \n", "0.000000 | \n", "4.101247 | \n", "2.869002 | \n", "0.000000 | \n", "... | \n", "0.156703 | \n", "0.060853 | \n", "0.248559 | \n", "{380, 381, 382} | \n", "{385, 103} | \n", "2.735747 | \n", "0.047794 | \n", "24 | \n", "True | \n", "LINESTRING (-743618.342 -1040934.607, -743621.... | \n", "
| 4 | \n", "15 | \n", "0 | \n", "0 | \n", "50.000000 | \n", "50.000000 | \n", "100.000000 | \n", "0.000000 | \n", "0.000000 | \n", "0.000000 | \n", "0.000000 | \n", "... | \n", "0.068937 | \n", "0.050164 | \n", "0.058499 | \n", "{390, 391, 398, 400, 401, 404} | \n", "{388, 391, 401, 403, 404} | \n", "1.505840 | \n", "0.026294 | \n", "15 | \n", "True | \n", "LINESTRING (-743701.515 -1040870.813, -743693.... | \n", "
5 rows × 106 columns
\n", "| \n", " | geometry | \n", "left_os_count | \n", "left_os | \n", "left_sb_count | \n", "left_sb | \n", "left_h | \n", "left_hw | \n", "left_bc | \n", "right_os_count | \n", "right_os | \n", "... | \n", "right_plot_seq_sb_index | \n", "os_count | \n", "os | \n", "sb_count | \n", "sb | \n", "h | \n", "hw | \n", "bc | \n", "plot_seq_sb | \n", "plot_seq_sb_depth | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| street_index | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| 0 | \n", "POINT (-743682.367 -1040957.5) | \n", "1 | \n", "50.000000 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.000000 | \n", "1 | \n", "50.000000 | \n", "... | \n", "{383} | \n", "2 | \n", "50.000000 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.000000 | \n", "14.568200 | \n", "19.240118 | \n", "
| 0 | \n", "POINT (-743684.627 -1040959.485) | \n", "1 | \n", "50.000000 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.000000 | \n", "1 | \n", "50.000000 | \n", "... | \n", "{383} | \n", "2 | \n", "50.000000 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.000000 | \n", "10.090066 | \n", "18.011884 | \n", "
| 0 | \n", "POINT (-743686.886 -1040961.471) | \n", "1 | \n", "50.000000 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.000000 | \n", "1 | \n", "27.593446 | \n", "... | \n", "{383} | \n", "2 | \n", "38.796723 | \n", "1 | \n", "27.593446 | \n", "17.0 | \n", "0.616088 | \n", "2.491801 | \n", "10.100149 | \n", "15.658901 | \n", "
| 0 | \n", "POINT (-743689.145 -1040963.457) | \n", "1 | \n", "50.000000 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.000000 | \n", "1 | \n", "26.229691 | \n", "... | \n", "{383} | \n", "2 | \n", "38.114846 | \n", "1 | \n", "26.229691 | \n", "17.0 | \n", "0.648120 | \n", "5.604209 | \n", "9.996735 | \n", "27.216748 | \n", "
| 0 | \n", "POINT (-743691.405 -1040965.443) | \n", "1 | \n", "50.000000 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.000000 | \n", "1 | \n", "25.412462 | \n", "... | \n", "{383} | \n", "2 | \n", "37.706231 | \n", "1 | \n", "25.412462 | \n", "17.0 | \n", "0.668963 | \n", "6.825341 | \n", "9.996961 | \n", "32.570991 | \n", "
| 0 | \n", "POINT (-743693.664 -1040967.428) | \n", "1 | \n", "23.978541 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "6.557431 | \n", "1 | \n", "25.198986 | \n", "... | \n", "{383} | \n", "2 | \n", "24.588764 | \n", "1 | \n", "25.198986 | \n", "17.0 | \n", "0.674630 | \n", "11.811294 | \n", "9.997186 | \n", "29.171224 | \n", "
| 0 | \n", "POINT (-743695.923 -1040969.414) | \n", "1 | \n", "14.720375 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "15.763951 | \n", "1 | \n", "26.764536 | \n", "... | \n", "{383} | \n", "2 | \n", "20.742455 | \n", "1 | \n", "26.764536 | \n", "17.0 | \n", "0.635169 | \n", "16.722367 | \n", "9.997412 | \n", "25.070210 | \n", "
| 0 | \n", "POINT (-743698.182 -1040971.4) | \n", "1 | \n", "14.705134 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "16.541363 | \n", "1 | \n", "28.184169 | \n", "... | \n", "{383} | \n", "2 | \n", "21.444652 | \n", "1 | \n", "28.184169 | \n", "17.0 | \n", "0.603175 | \n", "15.669026 | \n", "9.997637 | \n", "21.235336 | \n", "
| 0 | \n", "POINT (-743700.442 -1040973.386) | \n", "1 | \n", "14.689893 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "19.812513 | \n", "1 | \n", "29.961410 | \n", "... | \n", "{383} | \n", "2 | \n", "22.325652 | \n", "1 | \n", "29.961410 | \n", "17.0 | \n", "0.567397 | \n", "13.593521 | \n", "9.997863 | \n", "24.073478 | \n", "
| 0 | \n", "POINT (-743702.701 -1040975.371) | \n", "1 | \n", "14.674652 | \n", "0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "19.807911 | \n", "1 | \n", "31.357056 | \n", "... | \n", "{383} | \n", "2 | \n", "23.015854 | \n", "1 | \n", "31.357056 | \n", "17.0 | \n", "0.542143 | \n", "13.355549 | \n", "9.998088 | \n", "25.161555 | \n", "
10 rows × 34 columns
\n", "