File size: 4,191 Bytes
3894000 780fa43 a767f1e 6f842ea de3d1f9 3894000 de3d1f9 e456660 efe3888 b3c40c7 a767f1e 3894000 de3d1f9 064f2e2 de3d1f9 a767f1e 3894000 de3d1f9 3894000 de3d1f9 13626dd de3d1f9 13626dd de3d1f9 b3c40c7 efe3888 13626dd de3d1f9 13626dd ec0024a de3d1f9 3894000 de3d1f9 3894000 de3d1f9 86258b2 3894000 de3d1f9 ad6c4be 89a1ce6 02905e8 c3c16bf de3d1f9 97d5be8 de3d1f9 3894000 86258b2 3894000 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
import gradio as gr
import geopandas as gpd
import pandas as pd
import os
from shapely.ops import unary_union
#from datasets import load_dataset
#ds = load_dataset('psalama/NYC_sensitive_sites', data_files=data_files)
# Import functions from modules in data.py and plot.py
from data import get_gdf_from_feature_layer, process_buildings, get_max_extent
from plot import create_plot
def ss_intersect(geojson1, ss_geoselect, multiplier_factor, default_building_height):
# Read the GeoJSON files
input_gdf = gpd.read_file(geojson1.name)
# Check that CRS is EPSG:4326
if input_gdf.crs.to_epsg() != 4326:
raise ValueError("Input GeoJSON files must be in CRS EPSG:4326")
if ss_geoselect==0:
sensitive_sites_gdf = gpd.read_file("sensitive_sites/NYC_Parks_Properties.geojson")
else:
sensitive_sites_gdf = gpd.read_file("sensitive_sites/NYC_Parks_Zones.geojson")
default_building_height_m = default_building_height * 0.3048
buffers, intersected_sites, intersection_desc = process_buildings(input_gdf, sensitive_sites_gdf, default_building_height_m, multiplier_factor)
# Concatenate all buffer GeoDataFrames and save as a GeoJSON file
buffers_gdf = pd.concat(buffers, ignore_index=True)
buffers_gdf = buffers_gdf.to_crs("EPSG:4326")
buffers_gdf.to_file("building_buffers.geojson", driver='GeoJSON')
# Concatenate all intersected sensitive sites and save as a GeoJSON file
if intersected_sites:
intersected_sites_gdf = pd.concat(intersected_sites, ignore_index=True)
intersected_sites_gdf = intersected_sites_gdf.to_crs("EPSG:4326")
else: #if there aren't any intersections, return an empty geojson
intersected_sites_gdf = gpd.read_file("files/No_intersecting_buildings.geojson")
print("No buildings are in the vicinity of any sensitive sites.")
intersected_sites_gdf.to_file("intersected_sensitive_sites.geojson", driver='GeoJSON')
# Perform the union operation if there is more than one buffer
if len(buffers) > 1:
# Perform a unary union on the geometry column of the GeoDataFrame
buffer_union = unary_union(buffers_gdf['geometry'])
# Create a new GeoDataFrame from the union result
buffer_union_gdf = gpd.GeoDataFrame(geometry=[buffer_union], crs="EPSG:4326")
# Save the union GeoDataFrame as a GeoJSON file
buffer_union_gdf.to_file("buffer_union.geojson", driver='GeoJSON')
# Calculate the maximum extent
extent = get_max_extent(input_gdf, buffers_gdf)
lots_url = "https://services5.arcgis.com/GfwWNkhOj9bNBqoJ/arcgis/rest/services/MAPPLUTO/FeatureServer/0" # Access MapPLUTO # Eventually should be a checkbox
lots_gdf = get_gdf_from_feature_layer(lots_url)
# Create and save the plot - which is the output image
create_plot('output_image.png', extent, lots_gdf, sensitive_sites_gdf, buffer_union_gdf, intersected_sites_gdf, input_gdf)
# Return the image, geojson files, and text description
return 'output_image.png', "building_buffers.geojson", "buffer_union.geojson", intersection_desc
iface = gr.Interface(
fn=ss_intersect,
inputs=[
gr.inputs.File(label="Building Footprints GeoJSON"),
gr.Radio(["Parks Properties", "Park Zones"], label="Which Sensitive Sites?", info="From NYC DPR", type="index"),
gr.inputs.Slider(minimum=0.0, maximum=10.0, default=4.3, label="Building Height Multiplier"),
gr.inputs.Number(default=200, label="Default Building Height"), #Can I make this optional?
],
outputs=[
gr.outputs.Image(type="pil", label="Result Image"),
gr.outputs.File(label="Building Buffers"),
gr.outputs.File(label="Union of Building Buffers"),
gr.outputs.Textbox(label="Building intersection descriptions"),
],
examples=[
["files/building4test.geojson", "Parks Properties", 4.3, 200],
["files/building4test.geojson", "Park Zones", 4.3, 900],
],
title="Shadow Proximity",
description="Upload proposed building footprints in a GeoJSON file and select a numeric value to get the building proximity prediction.",
)
iface.launch() |