Source code for spymicmac.usgs
"""
sPyMicMac.usgs is a collection of tools for interfacing with USGS Earth Explorer.
"""
import os
import netrc
import geopandas as gpd
from shapely.geometry.polygon import Polygon
from usgs import api
[docs]def get_login_creds():
"""
Read a user's .netrc file and return the login credentials.
:return:
- **creds** -- the netrc.netrc credentials.
"""
return netrc.netrc(os.path.expanduser('~/.netrc'))
[docs]def read_coords(result):
"""
Parse a search result returned from USGS and create a list of coordinates for the image footprint.
:param dict result: the USGS search result
:return:
-- **coords** (*list*) -- a list of coordinates
"""
corner_names = ['NW', 'NE', 'SE', 'SW']
corner_fields = [d for d in result['metadataFields'] if 'Corner' in d['fieldName'] and 'dec' in d['fieldName']]
corner_dict = dict()
for field in corner_fields:
corner_dict[field['fieldName']] = float(field['value'])
coords = []
for corner in corner_names:
coords.append((corner_dict['{} Corner Long dec'.format(corner)],
corner_dict['{} Corner Lat dec'.format(corner)]))
return coords
[docs]def get_usgs_footprints(imlist, dataset='DECLASSII'):
"""
Search for a list of images on USGS Earth Explorer. Note that the image names should be the USGS entity ID (e.g.,
AR5840034159994 rather than AR5840034159994.tif).
:param list imlist: a list of image names.
:param str dataset: the USGS dataset name to search (default: DECLASSII).
:return:
-- **gdf** (*GeoDataFrame*) -- a GeoDataFrame of image footprints.
"""
# air photos: 'AERIAL_COMBIN'
creds = get_login_creds()
gdf = gpd.GeoDataFrame()
user, _, pwd = creds.authenticators('earthexplorer.usgs.gov')
login = api.login(user, pwd)
del user, pwd, creds
if login['errorCode'] is not None:
print('Error logging in to USGS EROS.')
raise login['error']
else:
search_results = api.metadata(dataset,
node='EE',
entityids=imlist)
for i, result in enumerate(search_results['data']):
# coords = result['spatialFootprint']['coordinates'][0]
coords = read_coords(result)
poly = Polygon(coords)
gdf.loc[i, 'geometry'] = poly
gdf.loc[i, 'ID'] = result['entityId']
gdf.crs = {'init': 'epsg:4326'}
return gdf