This function uses spatial analysis to find all arenas that are contained by the state. The state is identified by the ID, and the URL component within which it will select all arenas whose geometry is within the state geometry:
@app.route('/nba/api/v0.1/state/<int:state_id>/contains', methods=['GET'])
def get_state_arenas(state_id):
state = session.query(State).get(state_id)
shp = to_shape(state.geom)
geojson = shapely.geometry.geo.mapping(shp)
data = [{"type": "Feature", "properties":{"name":state.name},
"geometry":{"type":"MultiPolygon", "coordinates":[geojson]},
}]
arenas = session.query(Arena).filter(state.geom.ST_Contains(arena.geom))
data_arenas =[{"type": "Feature",
"properties":{"name":arena.name}, "geometry":{"type":"Point",
"coordinates":[round(arena.longitude,6), round(arena.latitude,6)]},
} for arena in arenas]
data.extend(data_arenas)
return jsonify({"type": "FeatureCollection","features":data})
The data returned will include the state data and data for all arenas, as GeoJSON allows for multiple datatypes to be packaged as a feature collection.