diff --git a/intro.ipynb b/intro.ipynb index da362684ec..22d792e520 100644 --- a/intro.ipynb +++ b/intro.ipynb @@ -42,7 +42,8 @@ "path = \"example/shapefile/C-5.shp\"\n", "gdf = gpd.read_file(path)\n", "gdf = naturf.nodes.standardize_column_names_df(gdf)\n", - "gdf = naturf.nodes.filter_zero_height_df(gdf)" + "gdf = naturf.nodes.filter_zero_height_df(gdf)\n", + "gdf = naturf.nodes.apply_max_building_height(gdf)" ] }, { @@ -61,6 +62,17 @@ { "cell_type": "code", "execution_count": 4, + "id": "21ffd993-8c89-4991-b67d-dfed058fbf56", + "metadata": {}, + "outputs": [], + "source": [ + "# merge wall_length into buildings_intersecting_plan_area\n", + "gdf = pd.concat([gdf, naturf.nodes.wall_length(naturf.nodes.wall_angle_direction_length(gdf.geometry))], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "id": "17f4392a-efb1-4d67-b43a-9963ad388437", "metadata": { "tags": [] @@ -73,14 +85,18 @@ " gdf[Settings.geometry_field],\n", " gdf.building_area,\n", " naturf.nodes.total_plan_area_geometry(gdf[Settings.geometry_field]),\n", - " naturf.nodes.target_crs(gdf)\n", + " gdf[Settings.wall_length_north],\n", + " gdf[Settings.wall_length_east],\n", + " gdf[Settings.wall_length_south],\n", + " gdf[Settings.wall_length_west],\n", + " naturf.nodes.target_crs(gdf),\n", ")\n", "gdf[Settings.building_plan_area_field] = naturf.nodes.building_plan_area(buildings_intersecting_plan_area)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "13aa785f-638a-4011-adba-274f27400c4c", "metadata": {}, "outputs": [], @@ -91,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "fad209f4-28dc-4999-9196-673ade6365bd", "metadata": { "tags": [] @@ -112,15 +128,60 @@ }, "outputs": [], "source": [ + "# add average distance between buildings\n", "gdf = gdf.merge(naturf.nodes.average_distance_between_buildings(buildings_intersecting_plan_area[Settings.target_id_field], buildings_intersecting_plan_area[Settings.distance_to_neighbor_by_centroid]), how=\"left\", on=Settings.id_field)\n", "\n", "gdf[Settings.sky_view_factor] = naturf.nodes.sky_view_factor(gdf[Settings.height_field], gdf.average_distance_between_buildings)" ] }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f170e200-4e94-476a-baaa-e322300eee05", + "metadata": {}, + "outputs": [], + "source": [ + "# merge in frontal area density\n", + "gdf = pd.concat([gdf, naturf.nodes.frontal_area_density(naturf.nodes.frontal_length(buildings_intersecting_plan_area), gdf.building_height)], axis=1)" + ] + }, { "cell_type": "code", "execution_count": 10, - "id": "9ce1217d-6208-47e3-8983-3f789db1f88a", + "id": "6c2e11b6-9fb6-4f1d-af4f-fcae87aa510b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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KaPRaODg4IDw8HCMGjUKzz33HD755BMYDAa8+OKLePTRR+Hv739DF4mIiKjJmtv8OD4+XgCo95kyZYoQQogpU6aI4cOHW8ofO3ZM9O3bV6hUKqFWq8XYsWPFiRMnrPYZHBzc4D7nzJkjhBAiJyenwfUARHx8vGU/JSUlYtKkScLFxUWo1Wrx1FNPiYqKiiafG7vbEBHRZS3NBJkQQrR1mLdX5eXlcHNzg06n4/tWIqKbXEszgWMFExERSYjBSkREJCEGKxERkYQYrERERBJisBIREUmIwUpERCQhBisREZGEGKxEREQSYrASERFJiMFKRETt3vnyWltXockYrERE1O6dvlBp6yo0GYOViIjavcHdvWxdhSZjsBIREUmIwUpERCQhBisREZGEGKxEREQSYrASERFJiMFKREQkIQYrERGRhBisREREEmKwEhERSYjBSkREJCEGKxERkYQYrERERBJisBIREUmIwUpERCQhBisREZGEGKxEREQSYrASERFJiMFKREQkIQYrERGRhBisREREEmKwEhERSYjBSkREJCEGKxERkYQYrERERBJisBIREUmIwUpERCQhBisREZGEGKxEREQSYrASEVGnYTCZMff7DOw/U2qzOjBYiYio07BXyOFoL0dWUaXN6mBnsyMTERG1glfvDkOF3mCz4zNYiYioU1E5KKByUNjs+HwUTEREJCEGKxERkYQYrERERBJisBIREUmIwUpERCQhBisREZGEGKxEREQSYrASERFJiMFKREQkIQYrERGRhBisREREEmKwEhERSYjBSkREJCEGKxERkYQ4bdxVhBAAgPLychvXhIiIbO1yFlzOhqZisF6loqICABAYGGjjmhARUXtRUVEBNze3JpeXieZGcSdmNptRUFAAV1dXyGSya5YtLy9HYGAg8vLyoFar26iGHQevT+N4bRrHa3NtvD6Na41rI4RARUUF/P39IZc3/c0p71ivIpfLERAQ0Kxt1Go1v+DXwOvTOF6bxvHaXBuvT+OkvjbNuVO9jI2XiIiIJMRgJSIikhCDtYUcHR0xZ84cODo62roq7RKvT+N4bRrHa3NtvD6Na0/Xho2XiIiIJMQ7ViIiIgkxWImIiCTEYCUiIpIQg5WIiEhCN0WwJiYmYvTo0fD394dMJsPWrVuvu41er8fbb7+N4OBgODo6IiQkBGvXrrWsz8jI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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gdf.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "aac24c35-28c4-415a-ba10-478886d15713", "metadata": { "tags": [] }, @@ -157,16 +218,16 @@ " CAPTUREACT\n", " SHAPE_Leng\n", " ...\n", - " Shape_Le_1\n", - " Shape_Area\n", - " building_geometry\n", - " building_area\n", - " total_plan_area_geometry\n", - " building_plan_area\n", - " grimmond_oke_displacement_height\n", - " grimmond_oke_roughness_length\n", - " average_distance_between_buildings\n", - " sky_view_factor\n", + " frontal_area_west_5\n", + " frontal_area_west_6\n", + " frontal_area_west_7\n", + " frontal_area_west_8\n", + " frontal_area_west_9\n", + " frontal_area_west_10\n", + " frontal_area_west_11\n", + " frontal_area_west_12\n", + " frontal_area_west_13\n", + " frontal_area_west_14\n", " \n", " \n", " \n", @@ -183,16 +244,16 @@ " Update\n", " 88.360518\n", " ...\n", - " 88.376402\n", - " 320.512854\n", - " POLYGON ((1618052.020 1922797.834, 1618051.749...\n", - " 320.512854\n", - " POLYGON ((1618163.488 1922816.063, 1618163.807...\n", - " 355.472188\n", - " 1.7822\n", - " 0.266\n", - " 15.126073\n", - " 0.943354\n", + " 0.000000\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " 1\n", @@ -207,16 +268,16 @@ " Existing\n", " 23.649351\n", " ...\n", - " 23.652040\n", - " 34.959333\n", - " POLYGON ((1618059.647 1922806.024, 1618058.415...\n", - " 34.959333\n", - " POLYGON ((1618081.753 1922903.550, 1618091.122...\n", - " 355.472188\n", - " 1.7822\n", - " 0.266\n", - " 15.126073\n", - " 0.943354\n", + " 0.000000\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " 2\n", @@ -231,16 +292,16 @@ " Existing\n", " 404.280929\n", " ...\n", - " 404.267225\n", - " 8241.992817\n", - " POLYGON ((1620424.742 1923453.039, 1620423.981...\n", - " 8241.992817\n", - " POLYGON ((1620257.768 1923468.318, 1620256.804...\n", - " 10144.216994\n", - " 17.0247\n", - " 2.541\n", - " 164.117547\n", - " 0.955250\n", + " 1038.741417\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " 3\n", @@ -255,16 +316,16 @@ " Add\n", " 516.345080\n", " ...\n", - " 515.899777\n", - " 11262.582839\n", - " POLYGON ((1619893.556 1923694.814, 1619890.578...\n", - " 11262.582839\n", - " POLYGON ((1619987.586 1923638.814, 1619986.879...\n", - " 19831.477972\n", - " 8.0333\n", - " 1.199\n", - " 156.850830\n", - " 0.988514\n", + " 0.000000\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " 4\n", @@ -279,16 +340,16 @@ " Add\n", " 302.001260\n", " ...\n", - " 302.011231\n", - " 5396.390622\n", - " POLYGON ((1620091.602 1923651.742, 1620152.861...\n", - " 5396.390622\n", - " POLYGON ((1619981.031 1923664.814, 1619983.859...\n", - " 15236.673224\n", - " 8.4286\n", - " 1.258\n", - " 122.748977\n", - " 0.979633\n", + " 0.000000\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " ...\n", @@ -327,16 +388,16 @@ " Existing\n", " 10.255482\n", " ...\n", - " 10.256489\n", - " 6.565565\n", - " POLYGON ((1619442.911 1923341.729, 1619441.670...\n", - " 6.565565\n", - " POLYGON ((1619494.704 1923427.272, 1619502.744...\n", - " 7141.352104\n", - " 3.3165\n", - " 0.495\n", - " 43.194874\n", - " 0.974727\n", + " 0.000000\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " 188\n", @@ -351,16 +412,16 @@ " Existing\n", " 10.295296\n", " ...\n", - " 10.287547\n", - " 6.537354\n", - " POLYGON ((1619519.989 1923844.352, 1619520.277...\n", - " 6.537354\n", - " POLYGON ((1619506.281 1923745.296, 1619496.707...\n", - " 941.202884\n", - " 1.6147\n", - " 0.241\n", - " 28.357857\n", - " 0.985861\n", + " 0.000000\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " 189\n", @@ -375,16 +436,16 @@ " Existing\n", " 9.847711\n", " ...\n", - " 9.858116\n", - " 5.996740\n", - " POLYGON ((1619448.266 1923520.007, 1619446.211...\n", - " 5.996740\n", - " POLYGON ((1619542.398 1923553.757, 1619545.244...\n", - " 3645.412385\n", - " 8.7368\n", - " 1.304\n", - " 46.818172\n", - " 0.873603\n", + " 0.000000\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " 190\n", @@ -399,16 +460,16 @@ " Existing\n", " 169.791410\n", " ...\n", - " 169.969445\n", - " 2007.261302\n", - " POLYGON ((1618967.172 1923713.151, 1618967.258...\n", - " 2007.261302\n", - " POLYGON ((1618838.420 1923708.798, 1618838.798...\n", - " 2007.261302\n", - " 24.1401\n", - " 3.603\n", - " 15.000000\n", - " 0.203791\n", + " 233.971650\n", + " 233.97165\n", + " 185.77349\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", " 191\n", @@ -423,25 +484,25 @@ " Existing\n", " 637.014174\n", " ...\n", - " 637.051963\n", - " 2948.264256\n", - " POLYGON ((1619357.797 1923445.956, 1619344.502...\n", - " 2948.264256\n", - " POLYGON ((1619216.500 1923421.273, 1619216.497...\n", - " 10869.724941\n", - " 4.8776\n", - " 0.728\n", - " 97.017742\n", - " 0.988925\n", + " 0.000000\n", + " 0.00000\n", + " 0.00000\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " \n", " \n", "\n", - "

192 rows × 44 columns

\n", + "

192 rows × 108 columns

\n", "" ], "text/plain": [ - " Join_Count TARGET_FID FID_1 building_id GIS_ID FEATURECOD \n", - "0 1 132230 132229 132230 NaN BUILDING \\\n", + " Join_Count TARGET_FID FID_1 building_id GIS_ID FEATURECOD \\\n", + "0 1 132230 132229 132230 NaN BUILDING \n", "1 1 132237 132236 132237 NaN BUILDING \n", "2 2 132338 132337 132338 NaN BUILDING \n", "3 1 134281 134280 134281 NaN BUILDING \n", @@ -453,8 +514,8 @@ "190 1 159991 159990 159991 NaN MEMORIAL \n", "191 1 163411 163410 163411 NaN BUILDING \n", "\n", - " DESCRIPTIO CAPTUREYEA CAPTUREACT SHAPE_Leng ... \n", - "0 Building 2017-03-09T00:00:00.000Z Update 88.360518 ... \\\n", + " DESCRIPTIO CAPTUREYEA CAPTUREACT SHAPE_Leng ... \\\n", + "0 Building 2017-03-09T00:00:00.000Z Update 88.360518 ... \n", "1 Building 2015-04-24T00:00:00.000Z Existing 23.649351 ... \n", "2 Building 2015-04-24T00:00:00.000Z Existing 404.280929 ... \n", "3 Building 2017-03-09T00:00:00.000Z Add 516.345080 ... \n", @@ -466,75 +527,62 @@ "190 Memorial 2015-04-24T00:00:00.000Z Existing 169.791410 ... \n", "191 Building 2015-04-24T00:00:00.000Z Existing 637.014174 ... \n", "\n", - " Shape_Le_1 Shape_Area \n", - "0 88.376402 320.512854 \\\n", - "1 23.652040 34.959333 \n", - "2 404.267225 8241.992817 \n", - "3 515.899777 11262.582839 \n", - "4 302.011231 5396.390622 \n", - ".. ... ... \n", - "187 10.256489 6.565565 \n", - "188 10.287547 6.537354 \n", - "189 9.858116 5.996740 \n", - "190 169.969445 2007.261302 \n", - "191 637.051963 2948.264256 \n", + " frontal_area_west_5 frontal_area_west_6 frontal_area_west_7 \\\n", + "0 0.000000 0.00000 0.00000 \n", + "1 0.000000 0.00000 0.00000 \n", + "2 1038.741417 0.00000 0.00000 \n", + "3 0.000000 0.00000 0.00000 \n", + "4 0.000000 0.00000 0.00000 \n", + ".. ... ... ... \n", + "187 0.000000 0.00000 0.00000 \n", + "188 0.000000 0.00000 0.00000 \n", + "189 0.000000 0.00000 0.00000 \n", + "190 233.971650 233.97165 185.77349 \n", + "191 0.000000 0.00000 0.00000 \n", "\n", - " building_geometry building_area \n", - "0 POLYGON ((1618052.020 1922797.834, 1618051.749... 320.512854 \\\n", - "1 POLYGON ((1618059.647 1922806.024, 1618058.415... 34.959333 \n", - "2 POLYGON ((1620424.742 1923453.039, 1620423.981... 8241.992817 \n", - "3 POLYGON ((1619893.556 1923694.814, 1619890.578... 11262.582839 \n", - "4 POLYGON ((1620091.602 1923651.742, 1620152.861... 5396.390622 \n", - ".. ... ... \n", - "187 POLYGON ((1619442.911 1923341.729, 1619441.670... 6.565565 \n", - "188 POLYGON ((1619519.989 1923844.352, 1619520.277... 6.537354 \n", - "189 POLYGON ((1619448.266 1923520.007, 1619446.211... 5.996740 \n", - "190 POLYGON ((1618967.172 1923713.151, 1618967.258... 2007.261302 \n", - "191 POLYGON ((1619357.797 1923445.956, 1619344.502... 2948.264256 \n", + " frontal_area_west_8 frontal_area_west_9 frontal_area_west_10 \\\n", + "0 0 0 0 \n", + "1 0 0 0 \n", + "2 0 0 0 \n", + "3 0 0 0 \n", + "4 0 0 0 \n", + ".. ... ... ... \n", + "187 0 0 0 \n", + "188 0 0 0 \n", + "189 0 0 0 \n", + "190 0 0 0 \n", + "191 0 0 0 \n", "\n", - " total_plan_area_geometry building_plan_area \n", - "0 POLYGON ((1618163.488 1922816.063, 1618163.807... 355.472188 \\\n", - "1 POLYGON ((1618081.753 1922903.550, 1618091.122... 355.472188 \n", - "2 POLYGON ((1620257.768 1923468.318, 1620256.804... 10144.216994 \n", - "3 POLYGON ((1619987.586 1923638.814, 1619986.879... 19831.477972 \n", - "4 POLYGON ((1619981.031 1923664.814, 1619983.859... 15236.673224 \n", - ".. ... ... \n", - "187 POLYGON ((1619494.704 1923427.272, 1619502.744... 7141.352104 \n", - "188 POLYGON ((1619506.281 1923745.296, 1619496.707... 941.202884 \n", - "189 POLYGON ((1619542.398 1923553.757, 1619545.244... 3645.412385 \n", - "190 POLYGON ((1618838.420 1923708.798, 1618838.798... 2007.261302 \n", - "191 POLYGON ((1619216.500 1923421.273, 1619216.497... 10869.724941 \n", + " frontal_area_west_11 frontal_area_west_12 frontal_area_west_13 \\\n", + "0 0 0 0 \n", + "1 0 0 0 \n", + "2 0 0 0 \n", + "3 0 0 0 \n", + "4 0 0 0 \n", + ".. ... ... ... \n", + "187 0 0 0 \n", + "188 0 0 0 \n", + "189 0 0 0 \n", + "190 0 0 0 \n", + "191 0 0 0 \n", "\n", - " grimmond_oke_displacement_height grimmond_oke_roughness_length \n", - "0 1.7822 0.266 \\\n", - "1 1.7822 0.266 \n", - "2 17.0247 2.541 \n", - "3 8.0333 1.199 \n", - "4 8.4286 1.258 \n", - ".. ... ... \n", - "187 3.3165 0.495 \n", - "188 1.6147 0.241 \n", - "189 8.7368 1.304 \n", - "190 24.1401 3.603 \n", - "191 4.8776 0.728 \n", + " frontal_area_west_14 \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + ".. ... \n", + "187 0 \n", + "188 0 \n", + "189 0 \n", + "190 0 \n", + "191 0 \n", "\n", - " average_distance_between_buildings sky_view_factor \n", - "0 15.126073 0.943354 \n", - "1 15.126073 0.943354 \n", - "2 164.117547 0.955250 \n", - "3 156.850830 0.988514 \n", - "4 122.748977 0.979633 \n", - ".. ... ... \n", - "187 43.194874 0.974727 \n", - "188 28.357857 0.985861 \n", - "189 46.818172 0.873603 \n", - "190 15.000000 0.203791 \n", - "191 97.017742 0.988925 \n", - "\n", - "[192 rows x 44 columns]" + "[192 rows x 108 columns]" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } diff --git a/naturf/config.py b/naturf/config.py index 23dd55806b..bea747e8ed 100755 --- a/naturf/config.py +++ b/naturf/config.py @@ -82,6 +82,10 @@ class Settings: frontal_length_east = "frontal_length_east" frontal_length_south = "frontal_length_south" frontal_length_west = "frontal_length_west" + frontal_area_north = "frontal_area_north" + frontal_area_east = "frontal_area_east" + frontal_area_south = "frontal_area_south" + frontal_area_west = "frontal_area_west" grimmond_oke_displacement_height = "grimmond_oke_displacement_height" grimmond_oke_roughness_length = "grimmond_oke_roughness_length" diff --git a/naturf/nodes.py b/naturf/nodes.py index 961f652ec5..09d75577e1 100755 --- a/naturf/nodes.py +++ b/naturf/nodes.py @@ -1,4 +1,5 @@ import geopandas as gpd +import math import numpy as np import pandas as pd from pyproj.crs import CRS @@ -483,6 +484,97 @@ def filter_zero_height_df(standardize_column_names_df: gpd.GeoDataFrame) -> gpd. ].reset_index(drop=True) +def frontal_area_density(frontal_length: pd.DataFrame, building_height: pd.Series) -> pd.DataFrame: + """Calculate the frontal area density for each building in a GeoPandas GeoSeries. Frontal area density is the frontal area of a + building at a specific height increment divided by the total plan area. naturf calculates frontal area density from the four cardinal + directions (east, north, west, south) and at 5 meter increments from ground level to 75 meters. + + :param frontal_length: Frontal length in each cardinal direction for each building. + :type frontal_length: pd.DataFrame + + :param building_height: Building height for each building. + :type building_height: pd.Series + + :return: Pandas DataFrame with frontal area density for each cardinal direction and + each BUILDING_HEIGHT_INTERVAL for each building. + """ + + rows, cols = ( + len(building_height.index), + int(Settings.MAX_BUILDING_HEIGHT / Settings.BUILDING_HEIGHT_INTERVAL), + ) + frontal_area_north, frontal_area_east, frontal_area_south, frontal_area_west = ( + [[0 for i in range(cols)] for j in range(rows)], + [[0 for i in range(cols)] for j in range(rows)], + [[0 for i in range(cols)] for j in range(rows)], + [[0 for i in range(cols)] for j in range(rows)], + ) + + # Go through each building. + for index, row in frontal_length.iterrows(): + building_height_counter = Settings.BUILDING_HEIGHT_INTERVAL + + # Go from ground level to building height by the building height interval and calculate frontal area density. + for i in range(0, math.ceil(building_height[index]), Settings.BUILDING_HEIGHT_INTERVAL): + if building_height_counter <= building_height[index]: + frontal_area_north[index][int(i / Settings.BUILDING_HEIGHT_INTERVAL)] = ( + row["frontal_length_north"] * Settings.BUILDING_HEIGHT_INTERVAL + ) + frontal_area_east[index][int(i / Settings.BUILDING_HEIGHT_INTERVAL)] = ( + row["frontal_length_east"] * Settings.BUILDING_HEIGHT_INTERVAL + ) + frontal_area_south[index][int(i / Settings.BUILDING_HEIGHT_INTERVAL)] = ( + row["frontal_length_south"] * Settings.BUILDING_HEIGHT_INTERVAL + ) + frontal_area_west[index][int(i / Settings.BUILDING_HEIGHT_INTERVAL)] = ( + row["frontal_length_west"] * Settings.BUILDING_HEIGHT_INTERVAL + ) + else: + frontal_area_north[index][int(i / Settings.BUILDING_HEIGHT_INTERVAL)] = row[ + "frontal_length_north" + ] * (building_height_counter - building_height[index]) + frontal_area_east[index][int(i / Settings.BUILDING_HEIGHT_INTERVAL)] = row[ + "frontal_length_east" + ] * (building_height_counter - building_height[index]) + frontal_area_south[index][int(i / Settings.BUILDING_HEIGHT_INTERVAL)] = row[ + "frontal_length_south" + ] * (building_height_counter - building_height[index]) + frontal_area_west[index][int(i / Settings.BUILDING_HEIGHT_INTERVAL)] = row[ + "frontal_length_west" + ] * (building_height_counter - building_height[index]) + break + building_height_counter += Settings.BUILDING_HEIGHT_INTERVAL + + columns_north, columns_east, columns_south, columns_west = ( + [ + f"{Settings.frontal_area_north}_{i}" + for i in range(int(Settings.MAX_BUILDING_HEIGHT / Settings.BUILDING_HEIGHT_INTERVAL)) + ], + [ + f"{Settings.frontal_area_east}_{i}" + for i in range(int(Settings.MAX_BUILDING_HEIGHT / Settings.BUILDING_HEIGHT_INTERVAL)) + ], + [ + f"{Settings.frontal_area_south}_{i}" + for i in range(int(Settings.MAX_BUILDING_HEIGHT / Settings.BUILDING_HEIGHT_INTERVAL)) + ], + [ + f"{Settings.frontal_area_west}_{i}" + for i in range(int(Settings.MAX_BUILDING_HEIGHT / Settings.BUILDING_HEIGHT_INTERVAL)) + ], + ) + + return pd.concat( + [ + pd.DataFrame(frontal_area_north, columns=columns_north), + pd.DataFrame(frontal_area_east, columns=columns_east), + pd.DataFrame(frontal_area_south, columns=columns_south), + pd.DataFrame(frontal_area_west, columns=columns_west), + ], + axis=1, + ) + + def frontal_length( buildings_intersecting_plan_area: gpd.GeoDataFrame, ) -> pd.Series: