From 8c2ba23cfffdb8565aaa2171dc69edd679dc6cdc Mon Sep 17 00:00:00 2001 From: Kilian Vos Date: Fri, 22 Mar 2019 11:51:36 +1100 Subject: [PATCH] update from GitHub.com --- NARRA.kml | 62 ----- README.md | 31 ++- SDS_download.py | 18 +- SDS_preprocess.py | 198 ++++++++-------- SDS_shoreline.py | 88 ++++--- SDS_transects.py | 57 ++++- classifiers/NN_4classes_nopan.pkl | Bin 51273 -> 0 bytes classifiers/NN_4classes_withpan.pkl | Bin 54033 -> 0 bytes example_jupyter.ipynb | 65 +++++- main.py | 48 ++-- requirements_linux64.txt | 342 ++++++++++++++++------------ 11 files changed, 512 insertions(+), 397 deletions(-) delete mode 100644 NARRA.kml delete mode 100644 classifiers/NN_4classes_nopan.pkl delete mode 100644 classifiers/NN_4classes_withpan.pkl diff --git a/NARRA.kml b/NARRA.kml deleted file mode 100644 index ab57b18..0000000 --- a/NARRA.kml +++ /dev/null @@ -1,62 +0,0 @@ - - - - NARRA - - - - - normal - #poly-000000-1200-77-nodesc-normal - - - highlight - #poly-000000-1200-77-nodesc-highlight - - - - Polygon 1 - #poly-000000-1200-77-nodesc - - - - 1 - - 151.2957545,-33.7012561,0 - 151.297557,-33.7388075,0 - 151.312234,-33.7390216,0 - 151.311204,-33.701399,0 - 151.2957545,-33.7012561,0 - - - - - - - diff --git a/README.md b/README.md index 48cff50..07bbc64 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ The underlying approach and application of the CoastSat toolkit are described in *Vos K., Splinter K.D., Harley M.D., Simmons J.A., Turner I.L. (submitted). CoastSat: a Google Earth Engine-enabled Python toolkit to extract shorelines from publicly available satellite imagery, Environmental Modelling and Software*. There are two main steps: -- assisted retrieval from from Google Earth Engine of all avaiable satellite images spanning the user-defined region of interest and time period +- assisted retrieval from Google Earth Engine of all avaiable satellite images spanning the user-defined region of interest and time period - automated extraction of shorelines from all the selected images using a sub-pixel resolution technique @@ -105,7 +105,7 @@ jupyter notebook ``` A web browser window will open. Point to the directory where you downloaded/cloned this repository and click on `example_jupyter.ipynb`. -The following sections guide the reader through the different functionalities of CoastSat with an example at Narrabeen-Collaroy beach (Australia). If you prefer to use Spyder or PyCharm or other integrated development environments (IDEs), a Python script is also included `main.py` in the repository. +The following sections guide the reader through the different functionalities of CoastSat with an example at Narrabeen-Collaroy beach (Australia). If you prefer to use Spyder or PyCharm or other integrated development environments (IDEs), a Python script `main.py` is also included in the repository. If using `main.py` on Spyder, make sure that the Graphics Backend is set to **Automatic** and not **Inline** (as this mode doesn't allow to interact with the figures). To change this setting go under Preferences>IPython console>Graphics. To run a Jupyter Notebook, place your cursor inside one of the code sections and then clikc on the 'run' button up in the top menu to run that section and progress forward (as shown in the animation below). @@ -129,16 +129,16 @@ It is now time to map the sandy shorelines! The following user-defined settings are required: - `cloud_thresh`: threshold on maximum cloud cover that is acceptable on the images (value between 0 and 1 - this may require some initial experimentation) -- `output_epsg`: epsg code defining the spatial reference system of the shoreline coordinates +- `output_epsg`: epsg code defining the spatial reference system of the shoreline coordinates. It has to be a cartesion coordinate system (i.e. projected) and not a geographical coordinate system (in latitude and longitude angles). - `check_detection`: if set to `True` allows the user to quality control each shoreline detection See http://spatialreference.org/ to find the EPSG number corresponding to your local coordinate system. If the user wants to quality control the mapped shorelines and manually validate each detection, the parameter `check_detection` should be set to `True`. -In addition, there are extra parameters (`min_beach_size`, `buffer_size`, `min_length_sl`) that can be tuned to optimise the shoreline detection (for Advanced users only). For the moment leave these parameters set to their default values, we will see later how they can be modified. +In addition, there are extra parameters (`min_beach_size`, `buffer_size`, `min_length_sl`, `cloud_mask_issue`) that can be tuned to optimise the shoreline detection (for Advanced users only). For the moment leave these parameters set to their default values, we will see later how they can be modified. An example of settings is provided here: -![settings](https://user-images.githubusercontent.com/7217258/49565578-ba7f5200-f97b-11e8-9bb4-8d933329b625.PNG) +![settings_v2](https://user-images.githubusercontent.com/7217258/52684207-876bc700-2f99-11e9-9e5c-086f523bcdc2.PNG) Once all the settings have been defined, the batch shoreline detection can be launched by calling: ``` @@ -162,6 +162,7 @@ As mentioned above, there are some additional parameters that can be modified to - `min_beach_area`: minimum allowable object area (in metres^2) for the class 'sand'. During the image classification, some features (for example, building roofs) may be incorrectly labelled as sand. To correct this, all the objects classified as sand containing less than a certain number of connected pixels are removed from the sand class. The default value of `min_beach_area` is 4500 m^2, which corresponds to 20 connected pixels of 15 m^2. If you are looking at a very small beach (<20 connected pixels on the images), try decreasing the value of this parameter. - `buffer_size`: radius (in metres) that defines the buffer around sandy pixels that is considered for the shoreline detection. The default value of `buffer_size` is 150 m. This parameter should be increased if you have a very wide (>150 m) surf zone or inter-tidal zone. - `min_length_sl`: minimum length (in metres) of shoreline perimeter to be valid. This can be used to discard small features that are detected but do not correspond to the sand-water shoreline. The default value is 200 m. If the shoreline that you are trying to map is shorter than 200 m, decrease the value of this parameter. +- `cloud_mask_issue`: the cloud mask algorithm applied to Landsat images by USGS, namely CFMASK, does have difficulties sometimes with very bright features such as beaches or white-water in the ocean. This may result in pixels corresponding to a beach being identified as clouds in the cloud mask (appear as black pixels on your images). If this issue seems to be present in a large proportion of images from your local beach, you can switch this parameter to `True` and CoastSat will remove from the cloud mask the pixels that form very thin linear features (as often these are beaches and not clouds). Only activate this parameter if you observe this very specific cloud mask issue, otherwise leave to the default value of `False`. #### Reference shoreline @@ -180,13 +181,25 @@ The maximum distance (in metres) allowed from the reference shoreline is defined ### 2.3 Shoreline change analysis -This section shows how to obtain time-series of shoreline change along shore-normal transects. - -The user can draw shore-normal transects by calling: +This section shows how to obtain time-series of shoreline change along shore-normal transects. Each transect is defined by two points, its origin and a second point that defines its orientation. The parameter `transect_length` determines how far (in metres) from the origin the transect will span. There are 3 options to define the coordinates of the transects: +1. The user can interactively draw shore-normal transects along the beach: ``` -settings['transect_length'] = 500 # defines the length of the transects in metres transects = SDS_transects.draw_transects(output, settings) ``` +2. Load the transect coordinates from a KML file: +``` +transects = SDS_transects.load_transects_from_kml('transects.kml') +``` +3. Create the transects by manually providing the coordinates of two points: +``` +transects = dict([]) +transects['Transect 1'] = np.array([[342836, ,6269215], [343315, 6269071]]) +transects['Transect 2'] = np.array([[342482, 6268466], [342958, 6268310]]) +transects['Transect 3'] = np.array([[342185, 6267650], [342685, 6267641]]) +``` + +**Note:** if you choose option 2 or 3, make sure that the points that you are providing are in the spatial reference system defined by `settings['output_epsg']`. + Once the shore-normal transects have been defined, the intersection between the 2D shorelines and the transects is computed with the following function: ``` settings['along_dist'] = 25 diff --git a/SDS_download.py b/SDS_download.py index 519e0e8..3bdbe01 100644 --- a/SDS_download.py +++ b/SDS_download.py @@ -543,14 +543,20 @@ def retrieve_images(inputs): im_epsg.append(int(im_dic['bands'][0]['crs'][5:])) # Sentinel-2 products don't provide a georeferencing accuracy (RMSE as in Landsat) # but they have a flag indicating if the geometric quality control was passed or failed - # if passed a value of 1 is stored if faile a value of -1 is stored in the metadata - try: + # if passed a value of 1 is stored if failed a value of -1 is stored in the metadata + if 'GEOMETRIC_QUALITY_FLAG' in im_dic['properties'].keys(): if im_dic['properties']['GEOMETRIC_QUALITY_FLAG'] == 'PASSED': acc_georef.append(1) else: acc_georef.append(-1) - except: + elif 'quality_check' in im_dic['properties'].keys(): + if im_dic['properties']['quality_check'] == 'PASSED': + acc_georef.append(1) + else: + acc_georef.append(-1) + else: acc_georef.append(-1) + print(i+1, end='..') # sort timestamps and georef accuracy (dowloaded images are sorted by date in directory) @@ -564,7 +570,7 @@ def retrieve_images(inputs): 'epsg':im_epsg_sorted, 'filenames':filenames_sorted} print('\nFinished with ' + satname) - # merge overlapping images (only if polygon is at the edge of an image) + # merge overlapping images (necessary only if the polygon is at the boundary of an image) if 'S2' in metadata.keys(): metadata = merge_overlapping_images(metadata,inputs) @@ -643,7 +649,7 @@ def merge_overlapping_images(metadata,inputs): fn_im.append([os.path.join(filepath, 'S2', '10m', filenames[pair[index]]), os.path.join(filepath, 'S2', '20m', filenames[pair[index]].replace('10m','20m')), os.path.join(filepath, 'S2', '60m', filenames[pair[index]].replace('10m','60m'))]) - im_ms, georef, cloud_mask, im_extra, imQA = SDS_preprocess.preprocess_single(fn_im[index], sat) + im_ms, georef, cloud_mask, im_extra, imQA = SDS_preprocess.preprocess_single(fn_im[index], sat, False) # in Sentinel2 images close to the edge of the image there are some artefacts, # that are squares with constant pixel intensities. They need to be masked in the @@ -772,7 +778,7 @@ def remove_cloudy_images(metadata,inputs,cloud_thresh): # image filename fn = SDS_tools.get_filenames(filenames[i],filepath, satname) # preprocess image (cloud mask + pansharpening/downsampling) - im_ms, georef, cloud_mask, im_extra, imQA = SDS_preprocess.preprocess_single(fn, satname) + im_ms, georef, cloud_mask, im_extra, imQA = SDS_preprocess.preprocess_single(fn, satname, False) # calculate cloud cover cloud_cover = np.divide(sum(sum(cloud_mask.astype(int))), (cloud_mask.shape[0]*cloud_mask.shape[1])) diff --git a/SDS_preprocess.py b/SDS_preprocess.py index 2d72e9d..8fbf1f4 100644 --- a/SDS_preprocess.py +++ b/SDS_preprocess.py @@ -28,7 +28,7 @@ import SDS_tools np.seterr(all='ignore') # raise/ignore divisions by 0 and nans -def create_cloud_mask(im_qa, satname): +def create_cloud_mask(im_qa, satname, cloud_mask_issue): """ Creates a cloud mask using the information contained in the QA band. @@ -40,6 +40,8 @@ def create_cloud_mask(im_qa, satname): Image containing the QA band satname: string short name for the satellite (L5, L7, L8 or S2) + cloud_mask_issue: boolean + True if there is an issue with the cloud mask and sand pixels are being masked on the images Returns: ----------- @@ -58,9 +60,15 @@ def create_cloud_mask(im_qa, satname): # find which pixels have bits corresponding to cloud values cloud_mask = np.isin(im_qa, cloud_values) - # remove isolated cloud pixels (there are some in the swash zone and they are not clouds) + # remove cloud pixels that form very thin features. These are beach or swash pixels that are + # erroneously identified as clouds by the CFMASK algorithm applied to the images by the USGS. if sum(sum(cloud_mask)) > 0 and sum(sum(~cloud_mask)) > 0: morphology.remove_small_objects(cloud_mask, min_size=10, connectivity=1, in_place=True) + if cloud_mask_issue: + elem = morphology.square(3) # use a square of width 3 pixels + cloud_mask = morphology.binary_opening(cloud_mask,elem) # perform image opening + # remove objects with less than 25 connected pixels + morphology.remove_small_objects(cloud_mask, min_size=25, connectivity=1, in_place=True) return cloud_mask @@ -209,7 +217,7 @@ def rescale_image_intensity(im, cloud_mask, prob_high): return im_adj -def preprocess_single(fn, satname): +def preprocess_single(fn, satname, cloud_mask_issue): """ Reads the image and outputs the pansharpened/down-sampled multispectral bands, the georeferencing vector of the image (coordinates of the upper left pixel), the cloud mask and @@ -226,6 +234,8 @@ def preprocess_single(fn, satname): resolution (30m and 15m for Landsat 7-8, 10m, 20m, 60m for Sentinel-2) satname: str name of the satellite mission (e.g., 'L5') + cloud_mask_issue: boolean + True if there is an issue with the cloud mask and sand pixels are being masked on the images Returns: ----------- @@ -262,7 +272,7 @@ def preprocess_single(fn, satname): # create cloud mask im_qa = im_ms[:,:,5] im_ms = im_ms[:,:,:-1] - cloud_mask = create_cloud_mask(im_qa, satname) + cloud_mask = create_cloud_mask(im_qa, satname, cloud_mask_issue) # resize the image using bilinear interpolation (order 1) im_ms = transform.resize(im_ms,(nrows, ncols), order=1, preserve_range=True, @@ -314,7 +324,7 @@ def preprocess_single(fn, satname): # create cloud mask im_qa = im_ms[:,:,5] - cloud_mask = create_cloud_mask(im_qa, satname) + cloud_mask = create_cloud_mask(im_qa, satname, cloud_mask_issue) # resize the image using bilinear interpolation (order 1) im_ms = im_ms[:,:,:5] @@ -374,7 +384,7 @@ def preprocess_single(fn, satname): # create cloud mask im_qa = im_ms[:,:,5] - cloud_mask = create_cloud_mask(im_qa, satname) + cloud_mask = create_cloud_mask(im_qa, satname, cloud_mask_issue) # resize the image using bilinear interpolation (order 1) im_ms = im_ms[:,:,:5] @@ -456,7 +466,7 @@ def preprocess_single(fn, satname): bands = [data.GetRasterBand(k + 1).ReadAsArray() for k in range(data.RasterCount)] im60 = np.stack(bands, 2) imQA = im60[:,:,0] - cloud_mask = create_cloud_mask(imQA, satname) + cloud_mask = create_cloud_mask(imQA, satname, cloud_mask_issue) # resize the cloud mask using nearest neighbour interpolation (order 0) cloud_mask = transform.resize(cloud_mask,(nrows, ncols), order=0, preserve_range=True, mode='constant') @@ -551,10 +561,12 @@ def save_jpg(metadata, settings): contains all the information about the satellite images that were downloaded settings: dict contains the following fields: - 'cloud_thresh': float + cloud_thresh: float value between 0 and 1 indicating the maximum cloud fraction in the image that is accepted - 'sitename': string + sitename: string name of the site (also name of the folder where the images are stored) + cloud_mask_issue: boolean + True if there is an issue with the cloud mask and sand pixels are being masked on the images Returns: ----------- @@ -582,7 +594,7 @@ def save_jpg(metadata, settings): # image filename fn = SDS_tools.get_filenames(filenames[i],filepath, satname) # read and preprocess image - im_ms, georef, cloud_mask, im_extra, imQA = preprocess_single(fn, satname) + im_ms, georef, cloud_mask, im_extra, imQA = preprocess_single(fn, satname, settings['cloud_mask_issue']) # calculate cloud cover cloud_cover = np.divide(sum(sum(cloud_mask.astype(int))), (cloud_mask.shape[0]*cloud_mask.shape[1])) @@ -592,6 +604,10 @@ def save_jpg(metadata, settings): # save .jpg with date and satellite in the title date = filenames[i][:10] create_jpg(im_ms, cloud_mask, date, satname, filepath_jpg) + + # print the location where the images have been saved + print('Satellite images saved as .jpg in ' + os.path.join(os.getcwd(), 'data', sitename, + 'jpg_files', 'preprocessed')) def get_reference_sl_manual(metadata, settings): """ @@ -650,14 +666,14 @@ def get_reference_sl_manual(metadata, settings): filepath = SDS_tools.get_filepath(settings['inputs'],satname) filenames = metadata[satname]['filenames'] else: - print('You cannot digitize the shoreline on L7 images, add another L8, S2 or L5 to your dataset.') + raise Exception('You cannot digitize the shoreline on L7 images, add another L8, S2 or L5 to your dataset.') # loop trhough the images for i in range(len(filenames)): # read image fn = SDS_tools.get_filenames(filenames[i],filepath, satname) - im_ms, georef, cloud_mask, im_extra, imQA = preprocess_single(fn, satname) + im_ms, georef, cloud_mask, im_extra, imQA = preprocess_single(fn, satname, settings['cloud_mask_issue']) # calculate cloud cover cloud_cover = np.divide(sum(sum(cloud_mask.astype(int))), (cloud_mask.shape[0]*cloud_mask.shape[1])) @@ -684,7 +700,7 @@ def get_reference_sl_manual(metadata, settings): mng = plt.get_current_fig_manager() mng.window.showMaximized() # let user click on the image once - pt_input = ginput(n=1, timeout=1000000, show_clicks=True) + pt_input = ginput(n=1, timeout=1e9, show_clicks=False) pt_input = np.array(pt_input) # if clicks next to , show another image if pt_input[0][0] > im_ms.shape[1]/2: @@ -694,102 +710,78 @@ def get_reference_sl_manual(metadata, settings): # remove keep and skip buttons keep_button.set_visible(False) skip_button.set_visible(False) - # update title (instructions) - plt.title('Click points along the shoreline every ~500 m.\n' + - 'Start at one end of the beach.\n' + 'When finished digitizing, click ', - fontsize=14) - plt.draw() - # let user click on the shoreline - pts = ginput(n=50000, timeout=1e9, show_clicks=True) - pts_pix = np.array(pts) - - # interpolate between points and show the output to the user - pts_pix_interp = np.expand_dims(np.array([np.nan, np.nan]),axis=0) - for k in range(len(pts_pix)-1): - if pts_pix[k,0] < pts_pix[k+1,0]: - x = pts_pix[[k,k+1],0] - y = pts_pix[[k,k+1],1] - else: - x = pts_pix[[k+1,k],0] - y = pts_pix[[k+1,k],1] - xvals = np.linspace(x[0],x[1],50) - yinterp = np.interp(xvals,x,y) - pts_pix_interp = np.append(pts_pix_interp, - np.transpose(np.array([xvals,yinterp])), axis=0) - pts_pix_interp = np.delete(pts_pix_interp,0,axis=0) - plt.plot(pts_pix_interp[:,0], pts_pix_interp[:,1], 'r.', markersize=3) - plt.title('Saving reference shoreline as ' + sitename + '_reference_shoreline.pkl ...') - plt.draw() - ginput(n=1, timeout=5, show_clicks=True) - plt.close() + # create two new buttons + add_button = plt.text(0, 0.9, 'add', size=16, ha="left", va="top", + transform=plt.gca().transAxes, + bbox=dict(boxstyle="square", ec='k',fc='w')) + end_button = plt.text(1, 0.9, 'end', size=16, ha="right", va="top", + transform=plt.gca().transAxes, + bbox=dict(boxstyle="square", ec='k',fc='w')) + # add multiple reference shorelines (until user clicks on button) + pts_sl = np.expand_dims(np.array([np.nan, np.nan]),axis=0) + while 1: + add_button.set_visible(False) + end_button.set_visible(False) + # update title (instructions) + plt.title('Click points along the shoreline (enough points to capture the beach curvature).\n' + + 'Start at one end of the beach.\n' + 'When finished digitizing, click ', + fontsize=14) + plt.draw() + # let user click on the shoreline + pts = ginput(n=50000, timeout=1e9, show_clicks=True) + pts_pix = np.array(pts) + # convert pixel coordinates to world coordinates + pts_world = SDS_tools.convert_pix2world(pts_pix[:,[1,0]], georef) + # interpolate between points clicked by the user (1m resolution) + pts_world_interp = np.expand_dims(np.array([np.nan, np.nan]),axis=0) + for k in range(len(pts_world)-1): + pt_dist = np.linalg.norm(pts_world[k,:]-pts_world[k+1,:]) + xvals = np.arange(0,pt_dist) + yvals = np.zeros(len(xvals)) + pt_coords = np.zeros((len(xvals),2)) + pt_coords[:,0] = xvals + pt_coords[:,1] = yvals + phi = 0 + deltax = pts_world[k+1,0] - pts_world[k,0] + deltay = pts_world[k+1,1] - pts_world[k,1] + phi = np.pi/2 - np.math.atan2(deltax, deltay) + tf = transform.EuclideanTransform(rotation=phi, translation=pts_world[k,:]) + pts_world_interp = np.append(pts_world_interp,tf(pt_coords), axis=0) + pts_world_interp = np.delete(pts_world_interp,0,axis=0) + # convert to pixel coordinates and plot + pts_pix_interp = SDS_tools.convert_world2pix(pts_world_interp, georef) + pts_sl = np.append(pts_sl, pts_world_interp, axis=0) + plt.plot(pts_pix_interp[:,0], pts_pix_interp[:,1], 'r--') + plt.plot(pts_pix_interp[0,0], pts_pix_interp[0,1],'ko') + plt.plot(pts_pix_interp[-1,0], pts_pix_interp[-1,1],'ko') + # update title and buttons + add_button.set_visible(True) + end_button.set_visible(True) + plt.title('click to digitize another shoreline or to finish and save the shoreline(s)', + fontsize=14) + plt.draw() + pt_input = ginput(n=1, timeout=1e9, show_clicks=False) + pt_input = np.array(pt_input) + # if user clicks on , save the points and break the loop + if pt_input[0][0] > im_ms.shape[1]/2: + add_button.set_visible(False) + end_button.set_visible(False) + plt.title('Reference shoreline saved as ' + sitename + '_reference_shoreline.pkl') + plt.draw() + ginput(n=1, timeout=5, show_clicks=False) + plt.close() + break + pts_sl = np.delete(pts_sl,0,axis=0) + # convert world coordinates to user-defined coordinates - # convert image coordinates to world coordinates - pts_world = SDS_tools.convert_pix2world(pts_pix_interp[:,[1,0]], georef) image_epsg = metadata[satname]['epsg'][i] - pts_coords = SDS_tools.convert_epsg(pts_world, image_epsg, settings['output_epsg']) + pts_coords = SDS_tools.convert_epsg(pts_sl, image_epsg, settings['output_epsg']) # save the reference shoreline filepath = os.path.join(os.getcwd(), 'data', sitename) with open(os.path.join(filepath, sitename + '_reference_shoreline.pkl'), 'wb') as f: pickle.dump(pts_coords, f) - print('Reference shoreline has been saved') + print('Reference shoreline has been saved in ' + filepath) break - return pts_coords - -def get_reference_sl_Australia(settings): - """ - Automatically finds a reference shoreline from a high resolution coastline of Australia - (Smartline from Geoscience Australia). It finds the points of the national coastline vector - that are situated inside the area of interest (polygon). - - KV WRL 2018 - - Arguments: - ----------- - settings: dict - contains the following fields: - 'cloud_thresh': float - value between 0 and 1 indicating the maximum cloud fraction in the image that is accepted - 'sitename': string - name of the site (also name of the folder where the images are stored) - 'output_epsg': int - epsg code of the desired spatial reference system - - Returns: - ----------- - ref_sl: np.array - coordinates of the reference shoreline found in the shapefile - - """ - - # load high-resolution shoreline of Australia - filename = os.path.join(os.getcwd(), 'data', 'shoreline_Australia.pkl') - with open(filename, 'rb') as f: - sl = pickle.load(f) - # spatial reference system of this shoreline - sl_epsg = 4283 # GDA94 geographic - - # only select the points that sit inside the area of interest (polygon) - polygon = settings['inputs']['polygon'] - # spatial reference system of the polygon (latitudes and longitudes) - polygon_epsg = 4326 # WGS84 geographic - polygon = SDS_tools.convert_epsg(np.array(polygon[0]), polygon_epsg, sl_epsg)[:,:-1] - - # use matplotlib function Path - path = mpltPath.Path(polygon) - sl_inside = sl[np.where(path.contains_points(sl))] - - # convert to desired output coordinate system - ref_sl = SDS_tools.convert_epsg(sl_inside, sl_epsg, settings['output_epsg'])[:,:-1] - - # make a figure for quality control - plt.figure() - plt.axis('equal') - plt.xlabel('Eastings [m]') - plt.ylabel('Northings [m]') - plt.plot(ref_sl[:,0], ref_sl[:,1], 'r.') - polygon = SDS_tools.convert_epsg(polygon, sl_epsg, settings['output_epsg'])[:,:-1] - plt.plot(polygon[:,0], polygon[:,1], 'k-') - - return ref_sl \ No newline at end of file + return pts_coords \ No newline at end of file diff --git a/SDS_shoreline.py b/SDS_shoreline.py index 9c794d7..6de4fd5 100644 --- a/SDS_shoreline.py +++ b/SDS_shoreline.py @@ -163,40 +163,18 @@ def classify_image_NN(im_ms, im_extra, cloud_mask, min_beach_area, satname): 3D image containing a boolean image for each class (im_classif == label) """ - - if satname == 'L5': - # load classifier (without panchromatic band) - clf = joblib.load(os.path.join(os.getcwd(), 'classifiers', 'NN_4classes_nopan.pkl')) - # calculate features - n_features = 9 - im_features = np.zeros((im_ms.shape[0], im_ms.shape[1], n_features)) - im_features[:,:,[0,1,2,3,4]] = im_ms - im_features[:,:,5] = nd_index(im_ms[:,:,3], im_ms[:,:,1], cloud_mask) # (NIR-G) - im_features[:,:,6] = nd_index(im_ms[:,:,3], im_ms[:,:,2], cloud_mask) # ND(NIR-R) - im_features[:,:,7] = nd_index(im_ms[:,:,0], im_ms[:,:,2], cloud_mask) # ND(B-R) - im_features[:,:,8] = nd_index(im_ms[:,:,4], im_ms[:,:,1], cloud_mask) # ND(SWIR-G) - vec_features = im_features.reshape((im_ms.shape[0] * im_ms.shape[1], n_features)) - - elif satname in ['L7','L8']: - # load classifier (with panchromatic band) - clf = joblib.load(os.path.join(os.getcwd(), 'classifiers', 'NN_4classes_withpan.pkl')) - # calculate features - n_features = 10 - im_features = np.zeros((im_ms.shape[0], im_ms.shape[1], n_features)) - im_features[:,:,[0,1,2,3,4]] = im_ms - im_features[:,:,5] = im_extra - im_features[:,:,6] = nd_index(im_ms[:,:,3], im_ms[:,:,1], cloud_mask) # (NIR-G) - im_features[:,:,7] = nd_index(im_ms[:,:,3], im_ms[:,:,2], cloud_mask) # ND(NIR-R) - im_features[:,:,8] = nd_index(im_ms[:,:,0], im_ms[:,:,2], cloud_mask) # ND(B-R) - im_features[:,:,9] = nd_index(im_ms[:,:,4], im_ms[:,:,1], cloud_mask) # ND(SWIR-G) - vec_features = im_features.reshape((im_ms.shape[0] * im_ms.shape[1], n_features)) - elif satname == 'S2': + if satname == 'S2': # load classifier (special classifier for Sentinel-2 images) clf = joblib.load(os.path.join(os.getcwd(), 'classifiers', 'NN_4classes_S2.pkl')) - # calculate features - vec_features = calculate_features(im_ms, cloud_mask, np.ones(cloud_mask.shape).astype(bool)) - vec_features[np.isnan(vec_features)] = 1e-9 # NaN values are create when std is too close to 0 + + else: + # load classifier (special classifier for Landsat images) + clf = joblib.load(os.path.join(os.getcwd(), 'classifiers', 'NN_4classes_Landsat.pkl')) + + # calculate features + vec_features = calculate_features(im_ms, cloud_mask, np.ones(cloud_mask.shape).astype(bool)) + vec_features[np.isnan(vec_features)] = 1e-9 # NaN values are create when std is too close to 0 # remove NaNs and cloudy pixels vec_cloud = cloud_mask.reshape(cloud_mask.shape[0]*cloud_mask.shape[1]) @@ -269,7 +247,7 @@ def find_wl_contours1(im_ndwi, cloud_mask): return contours -def find_wl_contours2(im_ms, im_labels, cloud_mask, buffer_size): +def find_wl_contours2(im_ms, im_labels, cloud_mask, buffer_size, is_reference_sl): """ New robust method for extracting shorelines. Incorporates the classification component to refine the treshold and make it specific to the sand/water interface. @@ -287,6 +265,8 @@ def find_wl_contours2(im_ms, im_labels, cloud_mask, buffer_size): buffer_size: int size of the buffer around the sandy beach over which the pixels are considered in the thresholding algorithm. + is_reference_sl: boolean + True if there is a reference shoreline, False otherwise Returns: ----------- contours_wi: list of np.arrays @@ -339,8 +319,13 @@ def find_wl_contours2(im_ms, im_labels, cloud_mask, buffer_size): im_wi_buffer[~im_buffer] = np.nan im_mwi_buffer = np.copy(im_mwi) im_mwi_buffer[~im_buffer] = np.nan - contours_wi = measure.find_contours(im_wi_buffer, t_wi) - contours_mwi = measure.find_contours(im_mwi_buffer, t_mwi) + + if is_reference_sl: # if there is a reference_shoreline map the shoreline on the entire image + contours_wi = measure.find_contours(im_wi, t_wi) + contours_mwi = measure.find_contours(im_mwi, t_mwi) + else: # otherwise only map the shoreline along the sandy pixels + contours_wi = measure.find_contours(im_wi_buffer, t_wi) + contours_mwi = measure.find_contours(im_mwi_buffer, t_mwi) # remove contour points that are NaNs (around clouds) contours = contours_wi @@ -585,20 +570,24 @@ def extract_shorelines(metadata, settings): metadata: dict contains all the information about the satellite images that were downloaded - inputs: dict + settings: dict contains the following fields: - sitename: str - String containig the name of the site - polygon: list - polygon containing the lon/lat coordinates to be extracted - longitudes in the first column and latitudes in the second column - dates: list of str - list that contains 2 strings with the initial and final dates in format - 'yyyy-mm-dd' e.g. ['1987-01-01', '2018-01-01'] - sat_list: list of str - list that contains the names of the satellite missions to include - e.g. ['L5', 'L7', 'L8', 'S2'] - + sitename: str + String containig the name of the site + cloud_mask_issue: boolean + True if there is an issue with the cloud mask and sand pixels are being masked on the images + buffer_size: int + size of the buffer (m) around the sandy beach over which the pixels are considered in the + thresholding algorithm + min_beach_area: int + minimum allowable object area (in metres^2) for the class 'sand' + cloud_thresh: float + value between 0 and 1 defining the maximum percentage of cloud cover allowed in the images + output_epsg: int + output spatial reference system as EPSG code + check_detection: boolean + True to show each invidual detection and let the user validate the mapped shoreline + Returns: ----------- output: dict @@ -646,7 +635,7 @@ def extract_shorelines(metadata, settings): # get image filename fn = SDS_tools.get_filenames(filenames[i],filepath, satname) # preprocess image (cloud mask + pansharpening/downsampling) - im_ms, georef, cloud_mask, im_extra, imQA = SDS_preprocess.preprocess_single(fn, satname) + im_ms, georef, cloud_mask, im_extra, imQA = SDS_preprocess.preprocess_single(fn, satname, settings['cloud_mask_issue']) # get image spatial reference system (epsg code) from metadata dict image_epsg = metadata[satname]['epsg'][i] # calculate cloud cover @@ -671,8 +660,9 @@ def extract_shorelines(metadata, settings): contours_mwi = find_wl_contours1(im_mndwi, cloud_mask) else: # use classification to refine threshold and extract sand/water interface + is_reference_sl = 'reference_shoreline' in settings.keys() contours_wi, contours_mwi = find_wl_contours2(im_ms, im_labels, - cloud_mask, buffer_size_pixels) + cloud_mask, buffer_size_pixels, is_reference_sl) except: continue diff --git a/SDS_transects.py b/SDS_transects.py index 2c7fd12..1ba275d 100644 --- a/SDS_transects.py +++ b/SDS_transects.py @@ -14,6 +14,8 @@ import skimage.transform as transform from pylab import ginput import pickle import simplekml +import json +from osgeo import ogr def find_indices(lst, condition): "imitation of MATLAB find function" @@ -106,7 +108,11 @@ def draw_transects(output, settings): origin = pts[0] except: fig1.gca().set_title('Transect locations', fontsize=16) - fig1.savefig(os.path.join(filepath, sitename + 'transects.jpg'), dpi=200) + fig1.savefig(os.path.join(filepath, 'jpg_files', sitename + '_transect_locations.jpg'), dpi=200) + plt.title('Transects saved as ' + sitename + '_transects.pkl and ' + sitename + '_transects.kml ') + plt.draw() + ginput(n=1, timeout=5, show_clicks=True) + plt.close(fig1) break counter = counter + 1 # create the transect using the origin, orientation and length @@ -134,9 +140,53 @@ def draw_transects(output, settings): newline.coords = transects[key] newline.description = 'user-defined cross-shore transect' kml.save(os.path.join(filepath, sitename + '_transects.kml')) + print('Transect locations saved in ' + filepath) return transects +def load_transects_from_kml(filename): + """ + Reads transect coordinates from a KML file. + + Arguments: + ----------- + filename: str + contains the path and filename of the KML file to be loaded + + Returns: + ----------- + transects: dict + contains the X and Y coordinates of each transect. + + """ + + # set driver + drv = ogr.GetDriverByName('KML') + # read file + file = drv.Open(filename) + layer = file.GetLayer() + feature = layer.GetNextFeature() + # initialise transects dictionnary + transects = dict([]) + + while feature: + + f_dict = json.loads(feature.ExportToJson()) + + # raise an exception if the KML file contains other features that LineString geometries + if not f_dict['geometry']['type'] == 'LineString': + raise Exception('The KML file you provided does not contain LineString geometries. Modify your KML file and try again.') + # store the name of the feature and coordinates in the transects dictionnary + else: + name = f_dict['properties']['Name'] + coords = np.array(f_dict['geometry']['coordinates'])[:,:-1] + transects[name] = coords + feature = layer.GetNextFeature() + + print('%d transects have been loaded' % len(transects.keys())) + + return transects + def compute_intersection(output, transects, settings): """ Computes the intersection between the 2D mapped shorelines and the transects, to generate @@ -146,10 +196,13 @@ def compute_intersection(output, transects, settings): ----------- output: dict contains the extracted shorelines and corresponding dates. + transects: dict + contains the X and Y coordinates of the transects (first and last point needed for each + transect). settings: dict contains parameters defining : along_dist: alongshore distance to caluclate the intersection (median of points - within this distance). + within this distance). Returns: ----------- diff --git a/classifiers/NN_4classes_nopan.pkl b/classifiers/NN_4classes_nopan.pkl deleted file mode 100644 index 2a780fd26ef332495acca950f26af43bd93f111c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51273 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 A2LJ#7 diff --git a/classifiers/NN_4classes_withpan.pkl b/classifiers/NN_4classes_withpan.pkl deleted file mode 100644 index 375d597d21dec0d74ef0d654ecc54a957cdfdb6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54033 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 --file # platform: linux-64 @EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-3.0.0-1.tar.bz2 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-mkl.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2018.03.07-0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2018.11.29-ha4d7672_0.tar.bz2 https://repo.anaconda.com/pkgs/main/linux-64/intel-openmp-2019.1-144.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-8.2.0-hdf63c60_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-3.0.0-1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libgfortran-ng-7.3.0-hdf63c60_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-8.2.0-hdf63c60_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/poppler-data-0.4.9-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.6-h470a237_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/expat-2.2.6-he6710b0_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/freexl-1.0.5-h470a237_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/geos-3.6.2-heeff764_2.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/giflib-5.1.4-h470a237_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/gmp-6.1.2-h6c8ec71_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/icu-58.2-h9c2bf20_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/jpeg-9c-h470a237_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/json-c-0.13.1-h1bed415_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.2.1-hd88cf55_4.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libgcc-7.2.0-h69d50b8_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libsodium-1.0.16-h1bed415_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h470a237_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libxcb-1.13-h1bed415_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/mkl-2018.0.3-1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/ncurses-6.1-he6710b0_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/openssl-1.0.2p-h14c3975_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-7.3.0-hdf63c60_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-7.2.0-hdf63c60_3.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.8.0-1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-7.3.0-hdf63c60_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.6-1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.9-1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.6-h14c3975_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.2.5-hf484d3e_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/freexl-1.0.5-h14c3975_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.7.1-hf484d3e_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/giflib-5.1.4-h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-hf484d3e_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/icu-58.2-hf484d3e_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9c-h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/json-c-0.13.1-h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.2.1-hf484d3e_1005.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.15-h14c3975_1004.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.16-h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h14c3975_1000.tar.bz2 +https://repo.anaconda.com/pkgs/main/linux-64/mkl-2019.1-144.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.1-hf484d3e_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.3-h9ac9557_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/openssl-1.0.2p-h14c3975_1002.tar.bz2 https://repo.anaconda.com/pkgs/main/linux-64/pcre-8.42-h439df22_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.34.0-h470a237_3.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/proj4-4.9.3-hc8507d1_7.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h470a237_2.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.0.9-h470a237_4.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h470a237_2.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h470a237_2.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h470a237_7.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/xz-5.2.4-h14c3975_4.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/zlib-1.2.11-h7b6447c_3.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.68.0-h3a22d5f_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/glib-2.56.2-hd408876_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.13-h951d187_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/hdf5-1.10.1-h9caa474_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libedit-3.1.20170329-h6b74fdf_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libpng-1.6.35-hbc83047_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.8.0-h5b517e9_3.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/libtiff-4.0.9-he85c1e1_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libxml2-2.9.8-h26e45fe_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pandoc-2.2.3.2-0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/readline-7.0-h7b6447c_5.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.8-hbc83047_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.2-h5d6a6da_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-h8c8a85c_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.6.6-h470a237_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/zeromq-4.2.5-hf484d3e_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.34.0-h14c3975_1003.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/proj4-5.2.0-h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/tzcode-2018g-h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h14c3975_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.0.9-h14c3975_1004.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h14c3975_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.2-h14c3975_1007.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h14c3975_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h14c3975_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h14c3975_1007.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.4-h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h14c3975_1004.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.68.0-h11c811c_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.19.8.1-h9745a5d_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.13-h9a582f1_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.10.4-nompi_h11e915b_1105.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20170329-hf8c457e_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.36-h84994c4_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.0.10-h648cc4a_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h14c3975_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.9.8-h143f9aa_1005.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/readline-7.0-hf8c457e_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.9-h84994c4_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.2-hac72e42_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-h4937e3b_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.2.5-hf484d3e_1006.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.9.1-h94bbf69_1005.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.4.3-h1105359_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.56.2-had28632_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/kealib-1.4.10-he7154bc_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.16.3-hc83ff2d_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h328b03d_1009.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.3.0-hf38bd82_1003.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.26.0-h67949de_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.6.7-h14c3975_1000.tar.bz2 https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.2-h714fa37_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/freetype-2.8-hab7d2ae_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/geotiff-1.4.2-h8e81d37_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.13.1-h2176d3f_1000.tar.bz2 https://repo.anaconda.com/pkgs/main/linux-64/gstreamer-1.14.0-hb453b48_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/kealib-1.4.7-h79811e5_5.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.16.2-hbb41f41_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-he469717_9.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.3.0-h0e734dc_3.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.26.0-hb1c47c0_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.3-h470a237_4.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h470a237_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/fontconfig-2.12.6-h49f89f6_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/gst-plugins-base-1.14.0-hbbd80ab_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.62.0-hbdb9355_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libpq-10.5-he29860b_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libspatialite-4.3.0a-h72746d6_18.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/python-3.6.6-h5001a0f_3.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.64.0-h01ee5af_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libpq-10.6-h13b8bad_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-4.3.0a-hb5ec416_1026.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/python-3.6.7-hd21baee_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.3-h14c3975_1004.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h14c3975_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.1.5-h14c3975_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.12-py_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/asn1crypto-0.24.0-py36_1003.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/backcall-0.1.0-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/attrs-18.2.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.1.0-py_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/cachetools-2.1.0-py_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/cairo-1.14.12-h7636065_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/certifi-2018.10.15-py36_0.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/cloudpickle-0.6.1-py36_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-vectors-2.3.1-py36_1000.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/curl-7.62.0-h74213dd_0.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/dask-core-1.0.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/decorator-4.3.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/entrypoints-0.2.3-py36_2.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.14.12-h80bd089_1005.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/certifi-2018.11.29-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/chardet-3.0.4-py36_1003.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-0.7.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/curl-7.64.0-h646f8bb_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/dask-core-1.1.1-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/decorator-4.3.2-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.14-py36_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/entrypoints-0.3-py36_1000.tar.bz2 +https://repo.anaconda.com/pkgs/main/linux-64/gst-plugins-base-1.14.0-hbbd80ab_1.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/httplib2-0.12.0-py36_1000.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/idna-2.8-py36_1000.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/ipython_genutils-0.2.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/kiwisolver-1.0.1-py36hf484d3e_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/markupsafe-1.1.0-py36h7b6447c_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/mistune-0.8.4-py36h7b6447c_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.15.4-py36h81de0dd_0.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/olefile-0.46-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pandocfilters-1.4.2-py36_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/parso-0.3.1-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pickleshare-0.7.5-py36_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/postgresql-10.5-h66035e0_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/prometheus_client-0.4.2-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/ptyprocess-0.6.0-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/imagesize-1.1.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/jeepney-0.4-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.0.1-py36h6bb024c_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.3.1-py36h14c3975_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-1.1.0-py36h14c3975_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/mccabe-0.6.1-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/mistune-0.8.4-py36h14c3975_1000.tar.bz2 +https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.15.4-py36hde5b4d6_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/olefile-0.46-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.4.2-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/parso-0.3.3-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pickleshare-0.7.5-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/postgresql-10.6-h66cca7a_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.5.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.5.0-py36h14c3975_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/ptyprocess-0.6.0-py36_1000.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.4.4-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.5.0-py_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.19-py_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pyparsing-2.3.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pytz-2018.7-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pyzmq-17.1.2-py36h14c3975_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/qt-5.9.5-h7e424d6_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/send2trash-1.5.0-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.1.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.3.1-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.6.8-py36_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/pytz-2018.9-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-17.1.2-py36h6afc9c9_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/qtpy-1.6.0-pyh8a2030e_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/rope-0.10.7-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.5.0-py_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.16.1-py36h470a237_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/simplekml-1.3.0-py_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/sip-4.19.8-py36hf484d3e_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/six-1.11.0-py36_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/testpath-0.4.2-py36_0.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/toolz-0.9.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/tornado-5.1.1-py36h7b6447c_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/wcwidth-0.1.7-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/webencodings-0.5.1-py36_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.11.5-py36h5e8e0c9_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/cycler-0.10.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/jedi-0.13.1-py36_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libdap4-3.19.1-h8fe5423_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libnetcdf-4.4.1.1-h816af47_8.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pexpect-4.6.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pillow-5.1.0-py36h3deb7b8_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/poppler-0.65.0-ha54bb34_0.tar.bz2 -https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.2.1-py_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pyqt-5.9.2-py36h751905a_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/python-dateutil-2.7.5-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/sip-4.18.1-py36hf484d3e_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/six-1.12.0-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-1.2.1-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-websupport-1.1.0-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/testpath-0.4.2-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.9.0-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/tornado-5.1.1-py36h14c3975_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/typed-ast-1.3.1-py36h14c3975_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.1.7-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.11.1-py36h14c3975_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/wurlitzer-1.0.2-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/babel-2.6.0-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.11.5-py36h9745a5d_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.10.0-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.9.0.1-py36h14c3975_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/gobject-introspection-1.56.1-py36h9e29830_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-1.9.0-he243708_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/jedi-0.13.2-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libdap4-3.19.1-hd48c02d_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.6.2-hbdf4f91_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/packaging-19.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pexpect-4.6.0-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pillow-5.4.1-py36h00a061d_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/poppler-0.67.0-h2fc8fa2_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.2.3-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.14.10-py36h14c3975_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.0-py_0.tar.bz2 +https://repo.anaconda.com/pkgs/main/linux-64/qt-5.6.3-h8bf5577_3.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/qtawesome-0.5.6-pyh8a2030e_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/rsa-3.4.2-py_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/setuptools-40.6.2-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/terminado-0.8.1-py36_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/traitlets-4.3.2-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/setuptools-40.8.0-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/terminado-0.8.1-py36_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/traitlets-4.3.2-py36_1000.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/uritemplate-3.0.0-py_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/bleach-3.0.2-py36_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-2.3.1-py36hdffb7b8_0.tar.bz2 -https://conda.anaconda.org/conda-forge/noarch/google-auth-1.6.1-py_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/jinja2-2.10-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/jsonschema-2.6.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/jupyter_core-4.4.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/libgdal-2.2.4-hc8d23f9_1.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/networkx-2.2-py36_1.tar.bz2 -https://conda.anaconda.org/conda-forge/noarch/oauth2client-4.1.2-py_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pygments-2.2.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.32.3-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/astroid-2.1.0-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/atk-2.25.90-hf2eb9ee_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/bleach-3.1.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-2.5-py36hb7f436b_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.36.12-h4f1c04b_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/google-auth-1.6.2-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/isort-4.3.4-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/jinja2-2.10-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/jsonschema-3.0.0a3-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-4.4.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-2.4.0-h982c1cc_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/networkx-2.2-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/oauth2client-4.1.3-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.40.14-hf0c64fd_1003.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.3.1-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.6.0-py36h13b7fb3_1008.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/wheel-0.32.3-py36_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/google-auth-httplib2-0.0.3-py_2.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/jupyter_client-5.2.3-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/nbformat-4.4.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/pip-18.1-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/prompt_toolkit-2.0.7-py36_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pyopenssl-18.0.0-py36_1000.tar.bz2 -https://conda.anaconda.org/conda-forge/noarch/google-api-python-client-1.7.5-py_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/ipython-7.2.0-py36h39e3cac_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/nbconvert-5.3.1-py36_0.tar.bz2 -https://conda.anaconda.org/conda-forge/noarch/earthengine-api-0.1.152-py_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/ipykernel-5.1.0-py36h39e3cac_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/jupyter_console-6.0.0-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/notebook-5.7.2-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/qtconsole-4.4.2-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/widgetsnbextension-3.4.2-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/ipywidgets-7.4.2-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/jupyter-1.0.0-py36_7.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/gdal-2.2.4-py36h637b7d7_1.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/imageio-2.4.1-py36_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-2.2.2-py36h0e671d2_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/mkl_fft-1.0.6-py36h7dd41cf_0.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/mkl_random-1.0.1-py36h4414c95_1.tar.bz2 -https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.15.4-py36h1d66e8a_0.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/pywavelets-1.0.1-py36hdd07704_0.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/scipy-1.1.0-py36hfa4b5c9_1.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/scikit-image-0.14.0-py36hf484d3e_1.tar.bz2 -https://conda.anaconda.org/anaconda/linux-64/scikit-learn-0.20.1-py36h4989274_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.31-h5baeb44_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-5.2.4-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/nbformat-4.4.0-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pip-19.0.2-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-2.0.8-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pylint-2.2.2-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pyopenssl-19.0.0-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.1.1-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/google-api-python-client-1.7.8-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/ipython-7.2.0-py36h24bf2e0_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/keyring-17.1.1-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-5.3.1-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/urllib3-1.24.1-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/earthengine-api-0.1.167-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/ipykernel-5.1.0-py36h24bf2e0_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/requests-2.21.0-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.0.0-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/notebook-5.7.4-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/qtconsole-4.4.3-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/sphinx-1.8.4-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/spyder-kernels-0.4.2-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/numpydoc-0.8.0-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/widgetsnbextension-3.4.2-py36_1000.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.4.2-py_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/spyder-3.3.3-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/jupyter-1.0.0-py_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/gdal-2.4.0-py36h1c6dbfb_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/imageio-2.5.0-py36_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.0.2-py36_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.0.2-py36h167e16e_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/mkl_fft-1.0.10-py36h14c3975_1.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/mkl_random-1.0.2-py36h637b7d7_2.tar.bz2 +https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.15.4-py36h7e9f1db_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.0.1-py36h3010b51_1000.tar.bz2 +https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.2.0-py36h7c811a0_0.tar.bz2 +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.14.2-py36hf484d3e_1.tar.bz2 +https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-0.20.2-py36hd81dba3_0.tar.bz2