Idaho State Ranks - in need of Bird Data

We are assessing the state ranks (SRank) for various species to include in the upcoming State Wildlife Action Plan. Listed below is a list of birds where we could use additional information.  Please feel free to submit your entire dataset if it includes multiple species beyond this list.  

please direct any questions to Suzin Romin, or Nikki Wade

Submit your data here, (login required)

If you have incidental and/or one-time survey data yet to be compiled into a spreadsheet, you also have the option of populating our MS Excel template which includes our core database values.  Click here to download a spreadsheet with bulit-in drop-down lists.  Click here to download a copy of the same spreadsheet, but without the built-in drop-down lists.

Common Name Sci Name SRank
Pygmy Nuthatch Sitta pygmaea S1
Pinyon Jay Gymnorhinus cyanocephalus S1
White-winged Crossbill Loxia leucoptera S1
Scott's Oriole Icterus parisorum S1B
Forster's Tern Sterna forsteri S1B
Great Egret Ardea alba S1B
Virginia's Warbler Vermivora virginiae S1B
Common Tern Sterna hirundo S1B
Black Swift Cypseloides niger S1B
Northern Mockingbird Mimus polyglottos S1B
Upland Sandpiper Bartramia longicauda S1B
Harlequin Duck Histrionicus histrionicus S1B
Blue Grosbeak Guiraca caerulea S1B
Black Tern Chlidonias niger S1B
Common Loon Gavia immer S1B,S2N
Trumpeter Swan Cygnus buccinator S1B,S2N
Bohemian Waxwing Bombycilla garrulus S1B,S3N
Eurasian Wigeon Anas penelope S1N
Juniper  Titmouse Baeolophus ridgwayi S2
Boreal Owl Aegolius funereus S2
White-headed Woodpecker Picoides albolarvatus S2
Three-toed Woodpecker Picoides dorsalis S2
Black-throated Sparrow Amphispiza bilineata S2B
Long-billed Curlew Numenius americanus S2B
Cattle Egret Bubulcus ibis S2B
Yellow-billed Cuckoo Coccyzus americanus S2B
Lesser Goldfinch Carduelis psaltria S2B
Grasshopper Sparrow Ammodramus savannarum S2B
Red-necked Grebe Podiceps grisegena S2B
Lark Bunting Calamospiza melanocorys S2B
Merlin Falco columbarius S2B,S2N
Hooded Merganser Lophodytes cucullatus S2B,S3N
Black-backed Woodpecker Picoides arcticus S3
Northern Saw-whet Owl Aegolius acadicus S3
Northern Pygmy-Owl Glaucidium gnoma S3
Loggerhead Shrike Lanius ludovicianus S3
Northern Goshawk Accipiter gentilis S3
Great Gray Owl Strix nebulosa S3
Black Rosy-finch Leucosticte atrata S3
Lesser Scaup Aythya affinis S3
Swainson's Hawk Buteo swainsoni S3B
Wilson's Phalarope Phalaropus tricolor S3B
Flammulated Owl Otus flammeolus S3B
Sage Thrasher Oreoscoptes montanus S3B
Gray Flycatcher Empidonax wrightii S3B
Gray-crowned Rosy-finch Leucosticte tephrocotis S4B,S3N
Species currently not ranked    
Pacific-slope Flycatcher Empidonax difficilis  
White-tailed Ptarmigan Lagopus leucura SNA
American Golden-Plover Pluvialis dominica SNA
Snowy Plover Charadrius alexandrinus SNA
Broad-winged Hawk Buteo platypterus SNA
American Oystercatcher Haematopus palliatus SNA
Gyrfalcon Falco rusticolus SNA
Yellow Rail Coturnicops noveboracensis SNA
Horned Grebe Podiceps auritus SNA
Green Heron Butorides virescens SNA
White-throated Sparrow Zonotrichia albicollis SNA
Golden-crowned Sparrow Zonotrichia atricapilla SNA
Brown Thrasher Toxostoma rufum SNA
Clay-colored Sparrow Spizella pallida SNA
Swamp Sparrow Melospiza georgiana SNA
Ovenbird Seiurus aurocapillus SNA
Curve-billed Thrasher Toxostoma curvirostre SNA
Hoary Redpoll Carduelis hornemanni SNA
Ancient Murrelet Synthliboramphus antiquus SNA
McCown's Longspur Calcarius mccownii SNA
Anna's Hummingbird Calypte anna SNR


Update the data source in an ArcMap project using python, arcpy.mapping

Need to update a path in your ArcMap project to reflect the new location?  Here's how...

There are several methods for updating data sources using arcpy.mapping, check out this help topic from ESRI.  The example listed below is just one of several methods.

 Attach the following python code to a script in the toolbox of the mxd you wish to update.  This will allow you to update the directory the data layer is referencing, but will NOT allow you to change the data layer source name itself.  To change the data layer source name use the 'replaceDataSource' method instead.


import arcpy
mapdoc = arcpy.mapping.MapDocument("CURRENT")
mapdoc.findAndReplaceWorkspacePaths("<the directory you are changing from>" , "<the directory you are changing to>")
del mapdoc


TIPS / Notes:

--You could get fancy and set the 'directory you are changing from' and the 'directory you are changing to' to input arguments.  Then, the script could be used for resetting any project.

--If you don't know the directories your data are referencing you can insert print lyr.dataSource.  This will  return a list of data sources used in the mxd.

--If you know you have broken links in your mxd, here's how to get a list printed to the python shell window.

import arcpy
mapdoc = arcpy.mapping.MapDocument("CURRENT")
brokenlist = arcpy.mapping.ListBrokenDataSources(mapdoc)

      for lyr in brokenlist:      


del mapdoc



XY Coordinate Validation Rules for Idaho

The following extents are based upon Hydrologic Units Fourth Code (Hydro_HUC4) projected in NAD83 Idaho Tranverse Mercator meters.


UTM XY Coordinate Validation Rules for Idaho GIS data per HUC4 intersecting Idaho


The value for the Northing field must be an integer between 1,000,000 and 9,999,999.

In Idaho, we can narrow that down further (if we want) to ?



The value for the Easting field must be an integer between 100,000 and 999,999.

In Idaho, we can narrow that down further (if we want) to ?


Latitude and Longitude Coordinate Validation Rules for Idaho GIS data per HUC4 intersecting Idaho













ArcGIS Server, ArcGIS Online - Questions, Answers, and Resources

ArcGIS Server Services

  • Should we use fewer Services with more layers or more services with fewer layers?
    • From an application performance perspective.
    • From a server demand perspective.
      Is server demand currently an issue?
  • Should we use dedicated services with everything an application needs or general services that can be used by many applications or both?
  • How many services are too many and is that likely to be an actual problem for us in the foreseeable future?
  • Is there any advantage to separating the services that run our applications from services we are sharing?
  • What data are we, and should we be, sharing through services?
  • What can we do to increase the efficiency of our services?
  • What kind monitoring can we set up?
  • What testing can we do?
  • Should we move some of our data and services to the State server or ArcGIS Online?



ArcGIS Server Caching

  • How are our current caches set up?
  • What is being cached?
  • How will they be used?
  • What else do we want to cache?
  • For what layers do we want to build caches and for what do we cache dynamically?
  • Can we do a combination of predefined caching?
    i.e.  Build a cache to a certain scale then cache dynamically beyond that.  Or, cache the most likely layer combinations and dynamically cash the less likely combinations.
  • Does it make sense to cache small simple layers like IDFG Regions beyond the most general zoom levels?
  • How many and how large cached services can we support?


ArcGIS Online

  • What do we have on there now?
  • Where do the data, services, application code actually reside?
  • What are we likely to use it for in the future?
  • Who will be the “Named Users”?
  • How many named users do we want to license?
  • Should we move some of our data and services to the State server or ArcGIS Online?
  • Do we want to upload data, create services, build caches, now while it’s free? Will they delete everything and make us start over.

Observations: Finding and Reviewing

To “View & Export Observations” that have been submitted and entered into the IDFG-IFWIS database, for Animals you can go to, while for Plants you go to  From this page you can begin filtering and querying the data to fit your need.  Filters currently included are by: Common Name, Scientific Name, Category [of species type], and Region.  An updated form will also include filters for Observer and Reporting Organization.  If you require a specific filter, that you believe will be useful by many, please let us know.

These filters should be fairly intuitive, but a helpful note is to remember to “Reset” the filter when you want to change your search criteria, otherwise, the filter will continue to narrow down on the search criteria that are already entered.  You may also increase the number of observations returned per page by changing the Items/page filter.

Creating observations using the Species API

Our Species Platform is designed not just to be a web page, but also an Application Programming Interface (API) that allows other websites and programs to read, create and edit observations.

Creating an Observation requires having an existing Fish and Game Account, logging in successfully, and finally creating the new observation.  For this example I'll be using the Firefox Poster extension.  Let's get started!

Step 1 - Login

First we need to authenticate against Fish and Game Accounts and receive a token to include in our future interactions with the REST API.  We can do both steps at once by posting to the login form with a return path set to receive our token:

Set the content type:


And send a standard html payload for username, password and rememberMe flag:



Post this and in the response you'll receive a string that we'll use as a token for all future requests.

Step 2 - Create Observation

Now we need to construct the request to create our observation.

Let's start by adding the token.

Add Token to Header

This token is only for session validation, not authentication.  Forms-based cookies are still needed for authentication, so if building a stand-alone iOS or Android application you'll also need to add the cookie to the request.


Now we need to build the payload for the observation.  We can do this as an HTML form, XML or JSON object.  For our example we'll use JSON.

Post to:

Content Type:


Finding the correct content for the post is a little tricky.  It involves quite a bit of familiarity with the data and our API which is built using Drupal Services.  The documentation will get you started, and examples are useful, but ultimately we are going to have to break this down in a future post line by line.  

In this example we have standard inputs (field_count) with one pattern, select lists and radios (field_count_type) with a slightly different pattern, dates (field_datetime) doing something different still, files (field_file) weirder still, geofield (field_location) with escaped geojson and node references (field_species) which include the primary key of the referenced content.  The good part, is once you understand these oddities, it's the same oddities to create other data stored in Species.


    "type": "observation",
    "field_count": {
        "und": [
                "value": "1"
    "field_count_type": {
        "und": [
    "field_life_stage": {
        "und": [
    "field_life_state": {
        "und": [
    "field_location": {
        "und": [
                "geom": "{ \"type\": \"Point\", \"coordinates\":  [-112.0, 43.5] }"
    "field_location_resource": {
        "und": [
                "value": "Google Maps Click"
    "field_location_use": {
        "und": [
    "field_observation_method": {
        "und": [
    "field_sex": {
        "und": [
    "field_species": {
        "und": [
                "nid": "[nid:80612]"
    "field_species_confidence": {
        "und": [
            "value": "100"
     "field_datetime": {
        "und": [
                "value": {
                   "date": "07/16/2013",
                   "time": "11:14am"
    "field_file": {
        "und": [
                "fid": ""
    "field_photo": {
        "und": [
                "fid": ""
If the post is successful you'll receive a json response with the new id of the observation:


You can browse to this location to retrieve an xml version of the new observation:

Append .json to view as a javascript object:

Or remove rest from the url to view and edit as HTML:

This is the first in a series of posts on creating, reading and manipulating content in species through the API.  We'll add links to future posts here of follow the speciesapi tag.

Display Points From a Table: A Step-by-Step Guide

Do you have data points that won’t display right in your GIS map?

This may be the help you need.

Download and View Powerpoint Presentation

Click slide or this link to view Powerpoint Presentation

Definitions of Terms used by IDNHP and IFWIS

Links to downloadable files have been added to the IFWIS website.  A workbook of acronyms, agency codes, and definitions was added to the Species Diversity page.  A text document was added to the Obtain Information page, explaining the terms used in the downloadable county lists of rare and sensitive species.


Create a Buffer for a KML in Google Earth

Create a user-defined buffer around point, line, or polygon KMLs has never been easier!

1) Make sure that your Google Earth data is saved as a KML, not KMZ

2) Open this website:


3) Select your buffer type (line, point, or polygon)

4) Select the KML you would like to buffer and choose a buffer distance (in meters). Click the globe with the up arrow to upload your KML file.


5) A new KML will be created and available via a link at the top of the screen.


6) Click the link, save the KML to a location of your choosing and open in Google Earth!

MS Access Query to determine if 1+ fields of a subset of fields is not null

I recently encountered an issue where I tried to determine which records for any of 7 out of 12 Forest Service National Forests contained data for a query.  Region 4 of the USFS has 12 NFs, of which 7 have boundaries within Idaho.  For a list of sensitive species occurring in the region, I wanted to determine which species occurred in 1 or more of the forests that occur in Idaho.  Currently, R4 indicates 231 sensitive species, but only 56 occur in forests within Idaho.

With my original query, I simply put `Is Not Null' in the `or:' row of the query design view, but this resulted in no records being returned.  It appeared that something needed to be in the `Criteria:' row of query design, but when I did this, then put `Is Not Null' in the `or' row going straight across for each field desired, only records meeting the `Criteria:' rule were returned.  Example of failed query shown below:

It ended up that the query rules needed to be "tiered" or staggered in the query design view, with each OR statement completely encapsulated with parenthesis, resulting in the following GOOD SQL query:


SELECT [Tbl_USFS-R4--July_2011].ID, [Tbl_USFS-R4--July_2011].Type, [Tbl_USFS-R4--July_2011].Species, [Tbl_USFS-R4--July_2011].Common, [Tbl_USFS-R4--July_2011].Boise_NF, [Tbl_USFS-R4--July_2011].Caribou_NF, [Tbl_USFS-R4--July_2011].Challis_NF, [Tbl_USFS-R4--July_2011].Payette_NF, [Tbl_USFS-R4--July_2011].Salmon_NF, [Tbl_USFS-R4--July_2011].Sawtooth_NF, [Tbl_USFS-R4--July_2011].Targhee_NF
FROM [Tbl_USFS-R4--July_2011]
WHERE ((([Tbl_USFS-R4--July_2011].Boise_NF) Is Not Null)) OR ((([Tbl_USFS-R4--July_2011].Caribou_NF) Is Not Null)) OR ((([Tbl_USFS-R4--July_2011].Challis_NF) Is Not Null)) OR ((([Tbl_USFS-R4--July_2011].Payette_NF) Is Not Null)) OR ((([Tbl_USFS-R4--July_2011].Salmon_NF) Is Not Null)) OR ((([Tbl_USFS-R4--July_2011].Sawtooth_NF) Is Not Null)) OR ((([Tbl_USFS-R4--July_2011].Targhee_NF) Is Not Null));
Tiered Query to determine if any of a subset "is not null"