import geopandas as gpd
from shapely.geometry import Polygon
from shapely.wkt import loads
neighborhood_polygons = []
corrected_boundary = {}
# Order of lat, lon in boundary dict does not match the Zoning dataframe. We swap the order to match it.
for neighborhood, data in boundary.items():
corrected_coords = [[lon, lat] for lat, lon in data['boundary']]
corrected_boundary[neighborhood] = {'boundary': corrected_coords}
for neighborhood, data in corrected_boundary.items():
neighborhood_polygons.append(Polygon(data['boundary']))
gdf_neighborhoods = gpd.GeoDataFrame({'neighborhood': list(boundary.keys()), 'geometry': neighborhood_polygons})
zoning_df['Geometry'] = zoning_df['Geometry'].apply(lambda x: loads(x) if pd.notnull(x) else None)
gdf_zoning = gpd.GeoDataFrame(zoning_df, geometry='Geometry')
result = gpd.sjoin(gdf_zoning, gdf_neighborhoods, how='inner', predicate='within')
The GeoDataFrame result only has zoning information within the scope boundary. Zoning within the scope boundary can be seen below:
Zoning data taken from: OpenData Buffalo NY
The GeoDataFrame
result
only has zoning information within the scope boundary. Zoning within the scope boundary can be seen below: