def interactive_map(bbox: Tuple[float, float, float, float]) -> folium.Map: """Generate an interactive map including all USGS stations within a bounding box. Notes ----- Only stations that record(ed) daily streamflow data are included. Parameters ---------- bbox : tuple List of corners in this order (west, south, east, north) Returns ------- folium.Map Interactive map within a bounding box. """ geoutils.check_bbox(bbox) nwis = NWIS() query = nwis.query_bybox(bbox) sites = nwis.get_info(query, expanded=True) sites["coords"] = [ (lat, lon) for lat, lon in sites[["dec_lat_va", "dec_long_va"]].itertuples(name=None, index=False) ] sites["altitude"] = ( sites["alt_va"].astype(str) + " ft above " + sites["alt_datum_cd"].astype(str) ) sites["drain_area_va"] = sites["drain_area_va"].astype(str) + " square miles" sites["contrib_drain_area_va"] = sites["contrib_drain_area_va"].astype(str) + " square miles" cols_old = [ "site_no", "station_nm", "coords", "altitude", "huc_cd", "drain_area_va", "contrib_drain_area_va", "begin_date", "end_date", "hcdn_2009", ] cols_new = [ "Site No.", "Station Name", "Coordinate", "Altitude", "HUC8", "Drainage Area", "Contributing Drainage Area", "Begin date", "End data", "HCDN 2009", ] sites = sites.rename(columns=dict(zip(cols_old, cols_new)))[cols_new] msgs = [] for row in sites.itertuples(index=False): msg = "" for col in sites: msg += "".join( ["<strong>", col, "</strong> : ", f"{row[sites.columns.get_loc(col)]}<br>"] ) msgs.append(msg[:-4]) sites["msg"] = msgs west, south, east, north = bbox lon = (west + east) * 0.5 lat = (south + north) * 0.5 imap = folium.Map(location=(lat, lon), tiles="Stamen Terrain", zoom_start=10) for coords, msg in sites[["Coordinate", "msg"]].itertuples(name=None, index=False): folium.Marker( location=coords, popup=folium.Popup(msg, max_width=250), icon=folium.Icon() ).add_to(imap) return imap
def query_bybox(bbox: Tuple[float, float, float, float]) -> Dict[str, str]: """Generate the geometry keys and values of an ArcGISRESTful query.""" geoutils.check_bbox(bbox) query = {"bBox": ",".join(f"{b:.06f}" for b in bbox)} return query