How to determine the number of streams entering and exiting lakes using NHD data

Obtain data

Download a pre-staged file geodatabase for HUC subregion(s) of interest from and extract the contents of the download.

Prepare data

In ArcGIS, add the feature classes NHDWaterbodyNHDFlowline, and WBD\HU8 to your map. If you wish to work with lakes and ponds only, either perform a definition query on NHDWaterbodyto show only Type = Lake/pond (“FType” = 390) or select all FType = 390 and write the records out to a new feature class.

Remove the feature type “artificial path” from the feature class NHDFlowline. Artificial paths are created by NHD staff to simulate connections between inflows and outflows from water bodies (rivers entering and leaving lakes). Leaving these features in the data set will result in duplicate entries and an artificially (2x) high number of inflows and outflows. To remove these features from your analysis, you may either select all elements not flagged as ArtificialPath and write out to a new feature class, or perform a definition query to exclude them (“FType” <> 558).

You can create a new file geodatabase to hold your exported files and the results of your analysis or write the new data to the pre-staged geodatabase you downloaded above. Either option is fine.

Perform analysis

Intersect rivers and lakes

Open the Intersect (Analysis) tool and add your two layers (NDHFlowline and NHDWaterbody) as prepared above as Input Features. Change the Output Type (optional) from INPUT to POINT. This tool will create points wherever NHDFlowline features (rivers and streams) enter or exit lakes and ponds. Save your output file with a name that makes sense (e.g., include the HUC ID and InflowOutflow: NHD_403_InflowOutflow).

Add waterbody ID information to your point file

To obtain counts for each lake (total inflows and outflows) each lake will need a unique name. Unfortunately, many NHD lakes are unnamed and lake names are not unique (Examples? search for “Wolf Lake”, “Mud Lake”, or “Deer Lake” in any lakes database). Because of these ‘features’ of the data, generating a unique name isn’t as simple as it might be. A workable suggestion: add a new field to the lakes (NHDWaterbody) attribute table named UniqueName, type of Text and length of 50 characters. Ensure you have no records selected, and use the field calculator to populate the UniqueName field with the expression [GNIS_NAME] & “_’NHD’_” & [OBJECTID]  Replace ‘NHD‘ with the three-digit HUC prefix of the watershed you are working in (Lake Michigan is 403). The output will consist of something like “Wescott Lake_403_7” for records with a lake name, and “_403_17” for records where the lake was unnamed.

Next, perform a spatial join on your InflowOutflow points layer (created in the intersect step above). Right-click on this layer, and choose Joins and Relates > Join. Set the join type to “Join data from another layer based on spatial location” and choose your lakes layer (NHDWaterbody with the UniqueName field added) as the layer to join to your points. Under 2. in the Join Datawindow, set the relationship to is closest to it. (leaving the relationship set to the default it falls inside will result in no results (the points are not in the lakes, but on their borders). Name your output layer as something that makes sense (InflowOutflow_Lake_names) and save it in your file geodatabase.

Summarize results

Open the attribute table of your output file (InflowOutflow_Lake_Names). Find the UniqueName field and sort it (either ascending or descending) and look a the results. You should find multiple instances of many records (lakes with more than one inlet or outlet). All Distance values should be 0.

Right-click on the field UniqueName and choose Summarize. Choose the output destination (your file geodatabase unzipped or created above) and click OK. Answer Yes when prompted to add the summary table to the map. The resulting table will have one record for each lake (as found in UniqueName) and a Count_UniqueName value that summarizes the number of records of each UniqueName in your InflowOutflow_Lake_Names database. This Count value shows the number of streams entering or leaving each lake.

(Optional) Label lakes with Inflow / Outflow counts

As a last step you can join the summary table (created in the last step) to your lakes layer (NHDWaterbody) to label each lake with its total inflows and outflows. This join should be on the common field UniqueName. Be sure to Join attributes from a table, not Join data from another layer based on spatial location.