def set_up_for_map(cls, map: ipyleaflet.Map, layer: ipyleaflet.TileLayer, manager: TileManager) -> None: "Create a new or set up an existing `MapObserver` for an `ipyleaflet.Map`" try: notifiers = map._trait_notifiers["window_url"]["change"] except KeyError: map_observer = None else: for map_observer in notifiers: if isinstance(map_observer, cls): break else: map_observer = None if map_observer is None: map_observer = cls(map) # If we're swapping a new manager into an existing Layer instance, stop the old one old_manager = map_observer.layers.setdefault(layer, manager) if old_manager is not manager: assert old_manager.token != manager.token old_manager.cancel_all() TOKEN_TO_TILE_MANAGER.pop(old_manager.token, None) map_observer.layers[layer] = manager _update_server_stats_children() # Update the layer URL if necessary if base_url := cls.base_url_from_window_location(map.window_url): new_url = manager.url(base_url) if new_url != layer.url: layer.url = new_url layer.redraw()
def switch(basemap_name): if len(a_map.layers) == 1: a_map.layers = tuple([TileLayer(**get_basemap(basemap_name))]) else: old_basemap = [ l for l in a_map.layers if type(l) == TileLayer ][0] a_map.substitute_layer(old_basemap, TileLayer(**get_basemap(basemap_name)))
def __init__(self, **kwargs): if "center" not in kwargs: kwargs["center"] = [40, -100] if "zoom" not in kwargs: kwargs["zoom"] = 4 if "scroll_wheel_zoom" not in kwargs: kwargs["scroll_wheel_zoom"] = True super().__init__(**kwargs) if "height" not in kwargs: self.layout.height = "600px" else: self.layout.height = kwargs["height"] self.add_control(FullScreenControl()) self.add_control(LayersControl(position="topright")) self.add_control(DrawControl(position="topleft")) self.add_control(MeasureControl()) self.add_control(ScaleControl(position="bottomleft")) main_toolbar(self) if "google_map" not in kwargs: layer = TileLayer( url="https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}", attribution="Google", name="Google Maps", ) self.add_layer(layer) else: if kwargs["google_map"] == "ROADMAP": layer = TileLayer( url="https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}", attribution="Google", name="Google Maps", ) self.add_layer(layer) elif kwargs["google_map"] == "HYBRID": layer = TileLayer( url="https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}", attribution="Google", name="Google Satellite", ) self.add_layer(layer)
def on_preview_button_clicked(b): global result, m, cmap, smap, fmap, bmap, w_changemap jet = 'black,blue,cyan,yellow,red' smap = ee.Image(result.get('smap')).byte() cmap = ee.Image(result.get('cmap')).byte() fmap = ee.Image(result.get('fmap')).byte() bmap = ee.Image(result.get('bmap')).byte() cmaps = ee.Image.cat(cmap, smap, fmap, bmap).rename(['cmap', 'smap', 'fmap'] + timestamplist1[1:]) downloadpath = cmaps.getDownloadUrl({'scale': 10}) w_text.value = 'Download change maps from this URL:\n' + downloadpath + '\nNote: This may be unreliable' if w_changemap.value == 'First': mp = smap mx = count elif w_changemap.value == 'Last': mp = cmap mx = count else: mp = fmap mx = count / 2 if len(m.layers) > 1: m.remove_layer(m.layers[1]) m.add_layer( TileLayer(url=GetTileLayerUrl( mp.visualize(min=0, max=mx, palette=jet, opacity=w_opacity.value)))) w_export_ass.disabled = False
def init_map(): lat = 73. lon = 45.748445 center = [lat, lon] zoom = 4 m = Map(default_tiles=TileLayer(opacity=1.0), center=center, zoom=zoom) return m
def display_basemap(mosaic_name, m, out, color): """display the planet mosaic basemap on the map""" out.add_msg(cm.map.tiles) # set the color if necessary color_option = "" if color == "default" else f"&proc={color}" # remove the existing layers with planet attribution for layer in m.layers: if layer.attribution == planet.attribution: m.remove_layer(layer) # create a new Tile layer on the map layer = TileLayer( url=planet.basemaps.format(key=planet.key, mosaic_name=mosaic_name)+color_option, name="Planet© Mosaic", attribution=planet.attribution, show_loading = True ) # insert the mosaic bewteen CardoDB and the country border ie position 1 # we have already removed the planet layers so I'm sure that nothing is in # The grid and the country are build before and if we are here I'm also sure that there are 3 layers in the map tmp_layers = list(m.layers) tmp_layers.insert(1, layer) m.layers = tuple(tmp_layers) return
def __init__(self, grassimg): self.grassimg = grassimg self.draw_control = None self.zoom = 15 self.center = self.centermap() self.m = Map(default_tiles=TileLayer(opacity=1.0), center=self.center, zoom=self.zoom)
def on_preview_button_clicked(b): global cmap, smap, fmap, bmap, avimg, avimglog, count, watermask watermask = ee.Image('UMD/hansen/global_forest_change_2015').select( 'datamask').eq(1) try: jet = 'black,blue,cyan,yellow,red' rgy = 'black,red,green,yellow' smap = ee.Image(result.get('smap')).byte() cmap = ee.Image(result.get('cmap')).byte() fmap = ee.Image(result.get('fmap')).byte() bmap = ee.Image(result.get('bmap')).byte() avimg = ee.Image(ee.List(result.get('avimgs')).get(-1)).clip(poly) avimglog = ee.Image(result.get('avimglog')).byte().clip(poly) palette = jet txt = 'Series length: %i images, previewing ...\n' % count if w_changemap.value == 'First': mp = smap mx = count txt += 'Interval of first change:\n blue = early, red = late' elif w_changemap.value == 'Last': mp = cmap mx = count txt += 'Interval of last change:\n blue = early, red = late' elif w_changemap.value == 'Frequency': mp = fmap mx = count / 2 txt += 'Change frequency :\n blue = few, red = many' else: sel = int(w_bmap.value) sel = min(sel, count - 1) sel = max(sel, 1) txt += 'Bitemporal: %s-->%s\n' % (timestamplist1[sel - 1], timestamplist1[sel]) txt += 'red = positive definite, green = negative definite, yellow = indefinite' mp = bmap.select(sel - 1).clip(poly) palette = rgy mx = 3 w_text.value = txt if len(m.layers) > 3: m.remove_layer(m.layers[3]) if not w_Q.value: mp = mp.reproject(crs=archive_crs, scale=float(w_exportscale.value)) if w_maskwater.value == True: mp = mp.updateMask(watermask) if w_maskchange.value == True: mp = mp.updateMask(mp.gt(0)) m.add_layer( TileLayer(url=GetTileLayerUrl( mp.visualize( min=0, max=mx, palette=palette, opacity=w_opacity.value)))) w_export_ass.disabled = False w_export_drv.disabled = False w_export_series.disabled = False w_export_atsf.disabled = False except Exception as e: w_text.value = 'Error: %s' % e
def on_run_button_clicked(b): global result,m,collection,count,timestamplist1, \ w_startdate,w_enddate,w_orbitpass,w_changemap, \ w_relativeorbitnumber,w_significance,w_median, \ collectionmean try: w_text.value = 'running...' collection = ee.ImageCollection('COPERNICUS/S1_GRD') \ .filterBounds(poly) \ .filterDate(ee.Date(w_startdate.value), ee.Date(w_enddate.value)) \ .filter(ee.Filter.eq('transmitterReceiverPolarisation', ['VV','VH'])) \ .filter(ee.Filter.eq('resolution_meters', 10)) \ .filter(ee.Filter.eq('instrumentMode', 'IW')) \ .filter(ee.Filter.eq('orbitProperties_pass', w_orbitpass.value)) if w_relativeorbitnumber.value > 0: collection = collection.filter(ee.Filter.eq('relativeOrbitNumber_start', int(w_relativeorbitnumber.value))) if w_platform.value != 'Both': collection = collection.filter(ee.Filter.eq('platform_number', w_platform.value)) collection = collection.sort('system:time_start') acquisition_times = ee.List(collection.aggregate_array('system:time_start')).getInfo() count = len(acquisition_times) if count<2: raise ValueError('Less than 2 images found') timestamplist = [] for timestamp in acquisition_times: tmp = time.gmtime(int(timestamp)/1000) timestamplist.append(time.strftime('%x', tmp)) # make timestamps in YYYYMMDD format timestamplist = [x.replace('/','') for x in timestamplist] timestamplist = ['T20'+x[4:]+x[0:4] for x in timestamplist] # in case of duplicates add running integer timestamplist1 = [timestamplist[i] + '_' + str(i+1) for i in range(len(timestamplist))] relativeorbitnumbers = map(int,ee.List(collection.aggregate_array('relativeOrbitNumber_start')).getInfo()) rons = list(set(relativeorbitnumbers)) txt = 'Images found: %i, platform: %s \n'%(count,w_platform.value) txt += 'Acquisition dates: '+timestamplist[0]+'...'+timestamplist[-1]+'\n' txt += 'Relative orbit numbers: '+str(rons)+'\n' if len(rons)==1: txt += 'Mean incidence angle: %f'%get_incidence_angle(collection.first()) else: txt += 'Mean incidence angle: (select a rel. orbit)' w_text.value = txt pcollection = collection.map(get_vvvh) pList = pcollection.toList(100) first = ee.Dictionary({'imlist':ee.List([]),'poly':poly}) imList = ee.Dictionary(pList.iterate(clipList,first)).get('imlist') result = ee.Dictionary(omnibus(imList,w_significance.value,w_median.value)) w_preview.disabled = False # display mean of the full collection collectionmean = collection.mean() \ .select(0) \ .clip(poly) if len(m.layers)>1: m.remove_layer(m.layers[1]) m.add_layer(TileLayer(url=GetTileLayerUrl( collectionmean.visualize(min=-25, max=10,opacity = 1)))) except Exception as e: w_text.value = 'Error: %s'%e
def on_preview_button_clicked(b): global result, m, cmap, smap, fmap, bmap, w_changemap landmask = ee.Image('UMD/hansen/global_forest_change_2015').select( 'datamask').eq(1) jet = 'black,blue,cyan,yellow,red' rgy = 'black,red,green,yellow' smap = ee.Image(result.get('smap')).byte() cmap = ee.Image(result.get('cmap')).byte() fmap = ee.Image(result.get('fmap')).byte() bmap = ee.Image(result.get('bmap')).byte() cmaps = ee.Image.cat(cmap, smap, fmap, bmap).rename(['cmap', 'smap', 'fmap'] + timestamplist1[1:]) downloadpath = cmaps.getDownloadUrl({'scale': w_exportscale.value}) txt = 'Download change maps from this URL (may be unreliable):\n' txt += downloadpath + '\n' palette = jet if w_changemap.value == 'First': mp = smap mx = count txt += 'Interval of first change:\n blue = early, red = late' elif w_changemap.value == 'Last': mp = cmap mx = count txt += 'Interval of last change:\n blue = early, red = late' elif w_changemap.value == 'Frequency': mp = fmap mx = count / 2 txt += 'Interval of change frequency :\n blue = few, red = many' else: sel = int(w_bmap.value) sel = min(sel, count - 1) sel = max(sel, 1) txt = 'Bitemporal: %s-->%s\n' % (timestamplist1[sel - 1], timestamplist1[sel]) txt += 'red = positive definite, green = negative definite, yellow = indefinite' mp = bmap.select(sel - 1).clip(poly) palette = rgy mx = 3 w_text.value = txt if len(m.layers) > 1: m.remove_layer(m.layers[1]) if not w_Q.value: mp = mp.reproject(crs=archive_crs, scale=float(w_exportscale.value)) if w_maskland.value == True: mp = mp.updateMask(landmask) if w_maskchange.value == True: mp = mp.updateMask(mp.gt(0)) m.add_layer( TileLayer(url=GetTileLayerUrl( mp.visualize( min=0, max=mx, palette=palette, opacity=w_opacity.value)))) w_export_ass.disabled = False w_export_drv.disabled = False w_export_series.disabled = False
def __init__(self, **kwargs): """Map class """ if "center" not in kwargs: kwargs["center"] = [40, -100] if "zoom" not in kwargs: kwargs['zoom'] = 4 if "scroll_wheel_zoom" not in kwargs: kwargs["scroll_wheel_zoom"] = True super().__init__(**kwargs) if "height" not in kwargs: self.layout.height = "600px" else: self.layout.height = kwargs['height'] self.add_control(FullScreenControl()) self.add_control(LayersControl(position="bottomright")) self.add_control(DrawControl(position="topleft")) self.add_control(MeasureControl()) self.add_control(ScaleControl(position="bottomleft")) main_toolbar(self) if "google_map" not in kwargs or kwargs["google_map"] == "ROADMAP": layer = TileLayer( url="https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}", attribution="Google", name="Google Maps") self.add_layer(layer) elif kwargs["google_map"] == "HYBRID": layer = TileLayer( url="https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}", attribution="Google", name="Google Satellite") self.add_layer(layer) if 'in_csv' in kwargs: in_csv = kwargs['in_csv'] x = kwargs['x'] y = kwargs['y'] header = kwargs['header'] self.add_points_from_csv(in_csv, x, y, header)
def on_review_button_clicked(b): watermask = ee.Image('UMD/hansen/global_forest_change_2015').select('datamask').eq(1) with w_out: try: asset = ee.Image(w_exportassetsname.value) center = ee.Geometry.Polygon(ee.Geometry(asset.get('system:footprint')).coordinates()) \ .centroid().coordinates().getInfo() center.reverse() m.center = center bnames = asset.bandNames().getInfo()[3:-2] count = len(bnames) jet = 'black,blue,cyan,yellow,red' rcy = 'black,red,cyan,yellow' smap = asset.select('smap').byte() cmap = asset.select('cmap').byte() fmap = asset.select('fmap').byte() bmap = asset.select(list(range(3,count+3)),bnames).byte() palette = jet w_out.clear_output() print('Series length: %i images, reviewing (please wait for raster overlay) ...'%(count+1)) if w_changemap.value=='First': mp = smap mx = count print('Interval of first change:\n blue = early, red = late') elif w_changemap.value=='Last': mp = cmap mx = count print('Interval of last change:\n blue = early, red = late') elif w_changemap.value=='Frequency': mp = fmap mx = count/2 print('Change frequency :\n blue = few, red = many') else: sel = int(w_bmap.value)-1 sel = min(sel,count-1) sel = max(sel,0) if sel>0: print('Bitemporal: %s --> %s'%(bnames[sel-1],bnames[sel])) else: print('Bitemporal: image1 --> %s'%bnames[sel]) print('red = positive definite, cyan = negative definite, yellow = indefinite') mp = bmap.select(sel) palette = rcy mx = 3 if len(m.layers)>3: m.remove_layer(m.layers[3]) if w_maskwater.value==True: mp = mp.updateMask(watermask) if w_maskchange.value==True: mp = mp.updateMask(mp.gt(0)) m.add_layer(TileLayer(url=GetTileLayerUrl(mp.visualize(min=0, max=mx, palette=palette,opacity = w_opacity.value)))) w_export_ass.disabled = False w_export_drv.disabled = False w_export_atsf.disabled = False except Exception as e: print('Error: %s'%e)
def map_thick(df1,df2,cols): lat = 73. lon = 45.748445 center = [lat, lon] zoom = 4 m = Map(default_tiles=TileLayer(opacity=1.0), center=center, zoom=zoom) map_ice_thick(df1,m,cols) map_ice_thick(df2,m,cols) #display(m) return m
def on_preview_button_clicked(b): global cmap,smap,fmap,bmap,avimgs,avimg,pvQ,avimglog,count,watermask watermask = ee.Image('UMD/hansen/global_forest_change_2015').select('datamask').eq(1) with w_out: try: jet = 'black,blue,cyan,yellow,red' rcy = 'black,red,cyan,yellow' smap = ee.Image(result.get('smap')).byte() cmap = ee.Image(result.get('cmap')).byte() fmap = ee.Image(result.get('fmap')).byte() bmap = ee.Image(result.get('bmap')).byte() # the atsf avimgs = ee.List(result.get('avimgs')) avimg = ee.Image(ee.List(result.get('avimgs')).get(-1)).clip(poly) avimglog = ee.Image(result.get('avimglog')).byte().clip(poly) # for control pvQ = ee.Image(result.get('pvQ')) palette = jet w_out.clear_output() print('Series length: %i images, previewing (please wait for raster overlay) ...'%count) if w_changemap.value=='First': mp = smap mx = count print('Interval of first change:\n blue = early, red = late') elif w_changemap.value=='Last': mp=cmap mx = count print('Interval of last change:\n blue = early, red = late') elif w_changemap.value=='Frequency': mp = fmap mx = count/2 print('Change frequency :\n blue = few, red = many') else: sel = int(w_bmap.value) sel = min(sel,count-1) sel = max(sel,1) print('Bitemporal: %s-->%s'%(timestamplist1[sel-1],timestamplist1[sel])) print('red = positive definite, cyan = negative definite, yellow = indefinite') mp = bmap.select(sel-1).clip(poly) palette = rcy mx = 3 if len(m.layers)>3: m.remove_layer(m.layers[3]) if not w_Q.value: mp = mp.reproject(crs=archive_crs,scale=float(w_exportscale.value)) if w_maskwater.value==True: mp = mp.updateMask(watermask) if w_maskchange.value==True: mp = mp.updateMask(mp.gt(0)) m.add_layer(TileLayer(url=GetTileLayerUrl(mp.visualize(min=0, max=mx, palette=palette,opacity = w_opacity.value)))) w_export_ass.disabled = False w_export_drv.disabled = False w_export_atsf.disabled = False except Exception as e: print('Error: %s'%e)
def run(): global m,dc,center center = list(reversed(poly.centroid().coordinates().getInfo())) m = Map(center=center, zoom=11, layout={'height':'400px'}) osm = basemap_to_tiles(basemaps.OpenStreetMap.HOT) mb = TileLayer(url="https://api.mapbox.com/styles/v1/mapbox/satellite-streets-v9/tiles/256/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWNhbnR5IiwiYSI6ImNpcjRsMmJxazAwM3hoeW05aDA1cmNkNzMifQ.d2UbIugbQFk2lnU8uHwCsQ") sm_control = SplitMapControl(left_layer=osm,right_layer=mb) m.add_control(dc) m.add_control(sm_control) display(m) display(box)
def get_map(self, **kwargs): """Return an ipyleaflet map centered on this project's center Args: **kwargs: additional arguments to pass to Map initializations """ default_url = ('https://cartodb-basemaps-{s}.global.ssl.fastly.net/' 'light_all/{z}/{x}/{y}.png') return Map(default_tiles=TileLayer(url=kwargs.get('url', default_url)), center=self.get_center(), scroll_wheel_zoom=kwargs.get('scroll_wheel_zoom', True), **kwargs)
def create_map_obj(center=[30, 5], zoom=2): """ Creates a new ipyleaflet map object that defaults to a view of the entire world. Can specify center """ if leaflet_enabled is False: return "IPywidgets and ipyleaflet support disabled." else: m = Map(default_tiles=TileLayer(opacity=1.0), center=center, zoom=zoom, layout=ipywidgets.Layout(height="600px")) return m
def basemap_to_tiles(basemap, **kwargs): """Return a TileLayer instance with information for HERE map tiles. Example: >>> basemap_to_tiles(apikey="foobar") {'url': 'https://3.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/normal.day/{z}/{x}/{y}/256/png8?lg=eng&apiKey=foobar', 'min_zoom': 1, 'max_zoom': 18, 'attribution': '© <a href="https://here.com">HERE.com</a>', 'name': 'HERE'} """ return TileLayer( url=build_tiles_url(**basemap, **kwargs), min_zoom=kwargs.get("min_zoom", 1), max_zoom=kwargs.get("max_zoom", 18), attribution='© <a href="https://here.com">HERE.com</a>', name="HERE." + kwargs.get("scheme", "normal.day"), **kwargs)
def on_preview_button_clicked(b): global result,m,cmap,smap,fmap,bmap,w_changemap jet = 'black,blue,cyan,yellow,red' smap = ee.Image(result.get('smap')).byte() cmap = ee.Image(result.get('cmap')).byte() fmap = ee.Image(result.get('fmap')).byte() bmap = ee.Image(result.get('bmap')).byte() opacity = w_opacity.value if w_changemap.value=='First': mp = smap mx = count elif w_changemap.value=='Last': mp=cmap mx = count else: mp = fmap mx = count/2 if len(m.layers)>1: m.remove_layer(m.layers[1]) m.add_layer(TileLayer(url=GetTileLayerUrl( mp.visualize(min=0, max=mx, palette=jet,opacity = opacity))))
def update_image(self, change): # remove any existing image for l in self.layers: self.map.remove_layername(l) self.layers = [] # if nothing is selected exit immediately if self.w_date.v_model is None: return # build the start and end date ased on the planet parameters start = timedelta(days=-self.alert_model.days_before) end = timedelta(days=self.alert_model.days_after) # retreive the layer from planet items = cs.get_planet_items( self.alert_model.api_key, self.buffer, self.current_day + start, self.current_day + end, self.alert_model.cloud_cover, ) for i, e in enumerate(items): date = pd.to_datetime( e["properties"]["acquired"]).strftime("%Y-%m-%d") item_type = e["properties"]["item_type"] id_ = e["id"] name = f"{item_type} {date} ({i})" self.map.add_layer( TileLayer( url=cp.planet_tile_url.format(item_type, id_, self.alert_model.api_key), name=name, attribution="Imagery © Planet Labs Inc.", )) self.layers.append(name) return
def MercatorPlot(self): ##### LOAD A GeoJSON MAP FOR THE PLOTTING center = [ np.min(self.lats) + (np.max(self.lats) - np.min(self.lats)) / 2, np.min(self.lons) + (np.max(self.lons) - np.min(self.lons)) / 2 ] #center = [0, 0] zoom = 4 if self.proj == 'laea': tls = TileLayer( opacity=1.0, url= 'https://{s}.tiles.arcticconnect.org/osm_3575/{z}/{x}/{y}.png', zoom=0, max_zoom=10, attribution= 'Map data (c) <a href="https://webmap.arcticconnect.org/">ArcticConnect</a> . Data (c) <a href="http://osm.org/copyright">OpenStreetMap</a>' ) M = Map(default_tiles=tls, center=center, zoom=zoom) else: M = Map(center=center, zoom=zoom) ##### PLOT THE PRODUCT ON TOP OF THE MAP WITH ImageOverlay imgName = self.out + '.png' try: img_bounds = [self.bottomleft, self.topright] except: img_bounds = [(np.min(self.lats), np.min(self.lons)), (np.max(self.lats), np.max(self.lons))] io = ImageOverlay(url=imgName, bounds=img_bounds) M.add_layer(io) return M
def on_preview_button_clicked(b): global nbands try: w_text.value = 'iteration started, please wait ...\n' # iMAD inputlist = ee.List.sequence(1, w_iterations.value) first = ee.Dictionary({ 'done': ee.Number(0), 'scale': ee.Number(w_scale.value), 'niter': ee.Number(0), 'image': image1.addBands(image2).clip(poly), 'allrhos': [ee.List.sequence(1, nbands)], 'chi2': ee.Image.constant(0), 'MAD': ee.Image.constant(0) }) result = ee.Dictionary(inputlist.iterate(imad, first)) MAD = ee.Image(result.get('MAD')).rename(madnames) niter = ee.Number(result.get('niter')).getInfo() # threshold nbands = MAD.bandNames().length() chi2 = ee.Image(result.get('chi2')).rename(['chi2']) pval = chi2cdf(chi2, nbands).subtract(1).multiply(-1) tst = pval.gt(ee.Image.constant(0.0001)) MAD = MAD.where(tst, ee.Image.constant(0)) allrhos = ee.Array(result.get('allrhos')).toList() txt = 'Canonical correlations: %s \nIterations: %i\n' % (str( allrhos.get(-1).getInfo()), niter) w_text.value += txt if len(m.layers) > 3: m.remove_layer(m.layers[3]) MAD2 = MAD.select(1).rename('b') ps = MAD2.reduceRegion(ee.Reducer.percentile([1, 99])).getInfo() mn = ps['b_p1'] mx = ps['b_p99'] m.add_layer( TileLayer(url=GetTileLayerUrl(MAD2.visualize(min=mn, max=mx)))) except Exception as e: w_text.value = 'Error: %s\n Retry collect/preview or export to assets' % e
def generate_route_map(pathToGeojson, zoomLevel=11): with open(pathToGeojson, "r") as f: data = json.load(f) ctrLon, ctrLat = np.mean(np.array( data['features'][0]['geometry']['coordinates']), axis=0) url = "http://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png" provider = TileLayer(url=url, opacity=1) center = [ctrLat, ctrLon] m = Map(default_tiles=provider, center=center, zoom=zoomLevel) m.layout = Layout(width='100%', height='800px') trueRouteCoords, resampledCoords, gpsRouteCoords, \ displacementLines, gpsMatchCoords = data['features'] g = GeoJSON(data=FeatureCollection([trueRouteCoords, gpsMatchCoords])) m.add_layer(g) for coords in resampledCoords['geometry']['coordinates']: cm = Circle(location=coords[::-1], radius=10, weight=1, color='#ff0000', opacity=1.0, fill_opacity=0.4, fill_color='#ff0000') m.add_layer(cm) for coords in gpsRouteCoords['geometry']['coordinates']: cm = Circle(location=coords[::-1], radius=10, weight=1, color='#0000ff', opacity=1.0, fill_opacity=0.4, fill_color='#0000ff') m.add_layer(cm) g = GeoJSON(data=displacementLines) m.add_layer(g) return m
def on_preview_button_clicked(b): global cmap try: w_text.value = 'iteration started, please wait ...' MAD = ee.Image(result.get('MAD')).rename(madnames) # threshold nbands = MAD.bandNames().length() chi2 = ee.Image(result.get('chi2')).rename(['chi2']) pval = chi2cdf(chi2, nbands).subtract(1).multiply(-1) tst = pval.gt(ee.Image.constant(0.0001)) MAD = MAD.where(tst, ee.Image.constant(0)) allrhos = ee.Array(result.get('allrhos')).toList() txt = 'Canonical correlations: %s \n' % str(allrhos.get(-1).getInfo()) w_text.value = txt if len(m.layers) > 1: m.remove_layer(m.layers[1]) MAD1 = MAD.select(0).rename('b') ps = MAD1.reduceRegion(ee.Reducer.percentile([2, 98])).getInfo() mn = ps['b_p2'] mx = ps['b_p98'] m.add_layer( TileLayer(url=GetTileLayerUrl(MAD1.visualize(min=mn, max=mx)))) except Exception as e: w_text.value = 'Error: %s\n Retry run/preview or export to assets' % e
mosaicsSeries = 'global_quarterly_2016q1_mosaic' # Planet tile server base URL (Planet Explorer Mosaics Tiles) mosaicsTilesURL_base = 'https://tiles0.planet.com/experimental/mosaics/planet-tiles/' + mosaicsSeries + '/gmap/{z}/{x}/{y}.png' # Planet tile server url mosaicsTilesURL = mosaicsTilesURL_base + '?api_key=' + api_keys[ "PLANET_API_KEY"] # Map Settings # Define colors colors = {'blue': "#009da5"} # Define initial map center lat/long #NEXT STEP WOULD BE TO CAL A CITY AND RETRIEVE THE COORDINATES, Then use the name later on. center = [lat, long] # Define initial map zoom level zoom = 13 # Set Map Tiles URL planetMapTiles = TileLayer(url=mosaicsTilesURL) # Create the map m = Map( center=center, zoom=zoom, default_tiles=planetMapTiles # Uncomment to use Planet.com basemap ) # Define the draw tool type options polygon = {'shapeOptions': {'color': colors['blue']}} rectangle = {'shapeOptions': {'color': colors['blue']}} # Create the draw controls # @see https://github.com/ellisonbg/ipyleaflet/blob/master/ipyleaflet/leaflet.py#L293 dc = DrawControl(polygon=polygon, rectangle=rectangle) # Initialize an action counter variable actionCount = 0
def ee_tile_layer( ee_object, vis_params={}, name="Layer untitled", shown=True, opacity=1.0 ): """Converts and Earth Engine layer to ipyleaflet TileLayer. Args: ee_object (Collection|Feature|Image|MapId): The object to add to the map. vis_params (dict, optional): The visualization parameters. Defaults to {}. name (str, optional): The name of the layer. Defaults to 'Layer untitled'. shown (bool, optional): A flag indicating whether the layer should be on by default. Defaults to True. opacity (float, optional): The layer's opacity represented as a number between 0 and 1. Defaults to 1. """ image = None if ( not isinstance(ee_object, ee.Image) and not isinstance(ee_object, ee.ImageCollection) and not isinstance(ee_object, ee.FeatureCollection) and not isinstance(ee_object, ee.Feature) and not isinstance(ee_object, ee.Geometry) ): err_str = "\n\nThe image argument in 'addLayer' function must be an instace of one of ee.Image, ee.Geometry, ee.Feature or ee.FeatureCollection." raise AttributeError(err_str) if ( isinstance(ee_object, ee.geometry.Geometry) or isinstance(ee_object, ee.feature.Feature) or isinstance(ee_object, ee.featurecollection.FeatureCollection) ): features = ee.FeatureCollection(ee_object) width = 2 if "width" in vis_params: width = vis_params["width"] color = "000000" if "color" in vis_params: color = vis_params["color"] image_fill = features.style(**{"fillColor": color}).updateMask( ee.Image.constant(0.5) ) image_outline = features.style( **{"color": color, "fillColor": "00000000", "width": width} ) image = image_fill.blend(image_outline) elif isinstance(ee_object, ee.image.Image): image = ee_object elif isinstance(ee_object, ee.imagecollection.ImageCollection): image = ee_object.mosaic() map_id_dict = ee.Image(image).getMapId(vis_params) tile_layer = TileLayer( url=map_id_dict["tile_fetcher"].url_format, attribution="Google Earth Engine", name=name, opacity=opacity, visible=shown, ) return tile_layer
def clickablemap(center=[48.790153, 2.327395], zoom=13, layout=ipywidgets.Layout(width='100%', height='500px')): # look at: http://leaflet.github.io/Leaflet.draw/docs/examples/basic.html import json from ipyleaflet import (Map, Rectangle, Polygon, TileLayer, ImageOverlay, DrawControl, GeoJSON) #%matplotlib inline # %matplotlib notebook # google tileserver # https://stackoverflow.com/questions/9394190/leaflet-map-api-with-google-satellite-layer mosaicsTilesURL = 'https://mt1.google.com/vt/lyrs=s,h&x={x}&y={y}&z={z}' # Hybrid: s,h; Satellite: s; Streets: m; Terrain: p; # Map Settings # Define colors colors = {'blue': "#009da5"} # Define initial map center lat/long #center = [48.790153, 2.327395] # Define initial map zoom level #zoom = 13 # Create the map m = Map(center=center, zoom=zoom, scroll_wheel_zoom=True, layout=layout) # using custom basemap m.clear_layers() m.add_layer(TileLayer(url=mosaicsTilesURL)) # Define the draw tool type options polygon = {'shapeOptions': {'color': colors['blue']}} rectangle = {'shapeOptions': {'color': colors['blue']}} ## Create the draw controls ## @see https://github.com/ellisonbg/ipyleaflet/blob/master/ipyleaflet/leaflet.py#L293 #dc = DrawControl( # polygon = polygon, # rectangle = rectangle #) dc = DrawControl( polygon={'shapeOptions': { 'color': '#0000FF' }}, polyline={'shapeOptions': { 'color': '#0000FF' }}, circle={'shapeOptions': { 'color': '#0000FF' }}, rectangle={'shapeOptions': { 'color': '#0000FF' }}, ) # Initialize an action counter variable m.actionCount = 0 m.AOIs = [] # Register the draw controls handler def handle_draw(self, action, geo_json): # Increment the action counter #global actionCount m.actionCount += 1 # Remove the `style` property from the GeoJSON geo_json['properties'] = {} # Convert geo_json output to a string and prettify (indent & replace ' with ") geojsonStr = json.dumps(geo_json, indent=2).replace("'", '"') m.AOIs.append(json.loads(geojsonStr)) # Attach the draw handler to the draw controls `on_draw` event dc.on_draw(handle_draw) m.add_control(dc) # add a custom function to create and add a Rectangle layer # (LESS USEFUL THAN add_geojson) def add_rect(*args, **kwargs): r = Rectangle(*args, **kwargs) return m.add_layer(r) m.add_rectangle = add_rect # add a custom function to create and add a Polygon layer def add_geojson(*args, **kwargs): # ugly workaround to call without data=aoi if 'data' not in kwargs: kwargs['data'] = args[0] args2 = [i for i in args[1:-1]] else: args2 = args r = GeoJSON(*args2, **kwargs) return m.add_layer(r) m.add_GeoJSON = add_geojson # Display return m
def get_layer(self): """Returns a TileLayer for display using ipyleaflet""" return TileLayer(url=self.tms())
More WMS basemaps can be found at the following websites: 1. USGS National Map: https://viewer.nationalmap.gov/services/ 2. MRLC NLCD Land Cover data: https://viewer.nationalmap.gov/services/ 3. FWS NWI Wetlands data: https://www.fws.gov/wetlands/Data/Web-Map-Services.html Source/Credit: Dr. Qiusheng Wu - https://github.com/giswqs/geemap/blob/master/geemap/basemaps.py """ from box import Box from ipyleaflet import TileLayer, WMSLayer, basemap_to_tiles import ipyleaflet.basemaps as ipybasemaps _ee_basemaps = { "ROADMAP": TileLayer( url="https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}", attribution="Google", name="Google Maps", ), "SATELLITE": TileLayer( url="https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}", attribution="Google", name="Google Satellite", ), "TERRAIN": TileLayer( url="https://mt1.google.com/vt/lyrs=p&x={x}&y={y}&z={z}", attribution="Google", name="Google Terrain", ), "HYBRID": TileLayer( url="https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}", attribution="Google",
def on_collect_button_clicked(b): global result,collection,count,imList,poly,timestamplist1,timestamps2, \ s2_image,rons,mean_incidence,collectionmean,archive_crs,coords,wc try: if (w_collection.value == 'COPERNICUS/S1_GRD') or (w_collection.value == ''): w_text.value = 'running on GEE archive COPERNICUS/S1_GRD ...' coords = ee.List(poly.bounds().coordinates().get(0)) collection = getS1collection(coords) if w_relativeorbitnumber.value > 0: collection = collection.filter( ee.Filter.eq('relativeOrbitNumber_start', int(w_relativeorbitnumber.value))) if w_platform.value != 'Both': collection = collection.filter( ee.Filter.eq('platform_number', w_platform.value)) collection = collection.sort('system:time_start') acquisition_times = ee.List( collection.aggregate_array('system:time_start')).getInfo() count = len(acquisition_times) if count < 2: raise ValueError('Less than 2 images found') timestamplist = [] for timestamp in acquisition_times: tmp = time.gmtime(int(timestamp) / 1000) timestamplist.append(time.strftime('%x', tmp)) # make timestamps in YYYYMMDD format timestamplist = [x.replace('/', '') for x in timestamplist] timestamplist = ['T20' + x[4:] + x[0:4] for x in timestamplist] timestamplist = timestamplist[::int(w_stride.value)] # in case of duplicates add running integer timestamplist1 = [ timestamplist[i] + '_' + str(i + 1) for i in range(len(timestamplist)) ] count = len(timestamplist) if count < 2: raise ValueError('Less than 2 images found, decrease stride') relativeorbitnumbers = map( int, ee.List(collection.aggregate_array( 'relativeOrbitNumber_start')).getInfo()) rons = list(set(relativeorbitnumbers)) txt = 'running on GEE archive ...' txt += 'Images found: %i, platform: %s \n' % (count, w_platform.value) txt += 'Number of 10m pixels contained: %i \n' % math.floor( poly.area().getInfo() / 100.0) txt += 'Acquisition dates: %s\n' % str(timestamplist) txt += 'Relative orbit numbers: ' + str(rons) + '\n' if len(rons) == 1: mean_incidence = get_incidence_angle(collection.first()) txt += 'Mean incidence angle: %f' % mean_incidence else: mean_incidence = 'undefined' txt += 'Mean incidence angle: (select one rel. orbit)' pcollection = collection.map(get_vvvh) collectionfirst = ee.Image(pcollection.first()) w_exportscale.value = collectionfirst.projection().nominalScale( ).getInfo() pList = pcollection.toList(500) first = ee.Dictionary({ 'imlist': ee.List([]), 'poly': poly, 'enl': ee.Number(w_enl.value), 'ctr': ee.Number(0), 'stride': ee.Number(int(w_stride.value)) }) imList = ee.List( ee.Dictionary(pList.iterate(clipList, first)).get('imlist')) # get a vorschau as collection mean collectionmean = collection.mean().select(0, 1).clip(poly).rename( 'b0', 'b1') percentiles = collectionmean.reduceRegion( ee.Reducer.percentile([2, 98]), scale=w_exportscale.value, maxPixels=10e9) mn = ee.Number(percentiles.get('b0_p2')) mx = ee.Number(percentiles.get('b0_p98')) vorschau = collectionmean.select(0).visualize( min=mn, max=mx, opacity=w_opacity.value) else: txt = 'running on local collection %s ...\n' % w_collection.value collection = ee.ImageCollection(w_collection.value) count = collection.size().getInfo() txt += 'Images found: %i\n' % count collectionfirst = ee.Image(collection.first()) poly = collectionfirst.geometry() coords = ee.List(poly.bounds().coordinates().get(0)) center = poly.centroid().coordinates().getInfo() center.reverse() m.center = center w_exportscale.value = collectionfirst.projection().nominalScale( ).getInfo() if collectionfirst.get('system:time_start').getInfo() is not None: acquisition_times = ee.List( collection.aggregate_array('system:time_start')).getInfo() timestamplist1 = [] for timestamp in acquisition_times: tmp = time.gmtime(int(timestamp) / 1000) timestamplist1.append(time.strftime('%x', tmp)) timestamplist1 = [x.replace('/', '') for x in timestamplist1] timestamplist1 = [ 'T20' + x[4:] + x[0:4] for x in timestamplist1 ] txt += 'Acquisition dates: %s' % str(timestamplist1) else: timestamplist1 = ['T%i' % (i + 1) for i in range(count)] txt += 'No time property available: acquisitions: %s' % str( timestamplist1) # get a vorschau from collection mean collectionmean = collection.mean().clip(poly) percentiles = collectionmean.select(0).rename('b0').reduceRegion( ee.Reducer.percentile([2, 98]), scale=w_exportscale.value, maxPixels=10e9) mn = ee.Number(percentiles.get('b0_p2')) mx = ee.Number(percentiles.get('b0_p98')) vorschau = collectionmean.select(0).visualize( min=mn, max=mx, opacity=w_opacity.value) imList = collection.toList(100) # get GEE S1 archive crs for eventual image series export archive_crs = ee.Image(getS1collection(coords).first()).select( 0).projection().crs().getInfo() # run the algorithm result = omnibus(imList, w_significance.value, w_enl.value, w_median.value) w_preview.disabled = False w_export_atsf.disabled = True s2_image = None # display collection or S2 if len(m.layers) > 3: m.remove_layer(m.layers[3]) if w_S2.value: # display sentinel-2 if available collection2 = getS2collection(coords) count1 = collection2.size().getInfo() if count1 > 0: s2_image = ee.Image(collection2.first()).select( ['B8', 'B4', 'B3']).clip(poly) percentiles = s2_image.reduceRegion(ee.Reducer.percentile( [2, 98]), scale=w_exportscale.value, maxPixels=10e9) mn = percentiles.values(['B8_p2', 'B4_p2', 'B3_p2']) mx = percentiles.values(['B8_p98', 'B4_p98', 'B3_p98']) vorschau = s2_image.visualize(min=mn, max=mx, opacity=w_opacity.value) timestamp = s2_image.get('system:time_start').getInfo() timestamp = time.gmtime(int(timestamp) / 1000) timestamp = time.strftime('%x', timestamp).replace('/', '') timestamps2 = '20' + timestamp[4:] + timestamp[0:4] txt += '\nSentinel-2 from %s' % timestamps2 w_text.value = txt m.add_layer(TileLayer(url=GetTileLayerUrl(vorschau))) except Exception as e: w_text.value = 'Error: %s' % e