This page was generated from geoconnex.ipynb. Interactive online version: Binder badge

GeoConnex#

[ ]:
from pathlib import Path

import geopandas as gpd
import pandas as pd

import pynhd
from pynhd import GeoConnex

GeoConnex is a web service developed by Internet Of Water that provides access to many hydro-linked datasets. PyNHD provides access to all GeoConnex endpoints.

For single queries it’s recommended to use the pynhd.geoconnex function and for multiple queries, it’s more efficient to directly use the underlying pynhd.GeoConnex class that the pynhd.geoconnex function calls under-the-hood.

Let’s start by the geoconnex function. If you run the function without any arguments, it will print out a list of available endpoints. Moreover, if you run the function with item but no query, it will print out the description, queryable fields, and extent of the selected endpoint (item).

[ ]:
pynhd.geoconnex()

For example, let’s select the hu02 item and find all its queryable fields.

[ ]:
pynhd.geoconnex("hu02")

Now that we know all the queryable fields of hu02, we can decide what’s the best way to pull our desired data. For example, let’s get the data for “HUC02” using HUC2 field.

[ ]:
huc2 = pynhd.geoconnex(item="hu02", query={"HUC2": "02"})
ax = huc2.plot(figsize=(6, 6))
ax.set_axis_off()

GeoConnex, also supports spatial query. At the moment, it only accepts requesting features within a bounding box. For example, let’s get all the stations within HUC02 that we previously retrieved.

[ ]:
gages = pynhd.geoconnex(item="gages", query={"geometry": huc2.geometry.iloc[0]})
[ ]:
ax = huc2.plot(facecolor="none", edgecolor="black", figsize=(6, 6))
gages.plot(ax=ax, color="red", marker="*")
ax.set_axis_off()
ax.figure.savefig(Path("_static", "geoconnex.png"), dpi=300, bbox_inches="tight", facecolor="w")

Next, we want to retrieve the available data for a couple of USGS stations using the GeoConnex class.

[ ]:
gcx = GeoConnex()
gcx.item = "gages"  # instead we can instantiate the class like so GeoConnex("gages")
station_ids = ["01031450", "01031500", "01031510"]
gages = gpd.GeoDataFrame(
    pd.concat((gcx.query({"provider_id": sid}) for sid in station_ids), ignore_index=True),
    crs="epsg:4326",
)
gages

Let’s make a bit more advanced spatial query. Assume that we want to get all the stations within a 5-km radius of each the stations that we obtained above. First, we need to buffer the points by 5 km to create a multipolygon. Then we pass it as a query to geoconnex.

[ ]:
buff = gages.to_crs(5070).buffer(5e3).to_crs(4326)
gages = pynhd.geoconnex(item="gages", query={"geometry": buff.unary_union})
[ ]:
ax = buff.plot(facecolor="none", edgecolor="black", figsize=(6, 6))
gages.plot(ax=ax, color="red", marker="*")
ax.set_axis_off()