Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
 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)))
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
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)
Exemplo n.º 13
0
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
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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)
Exemplo n.º 17
0
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
Exemplo n.º 18
0
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': '&copy; <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='&copy; <a href="https://here.com">HERE.com</a>',
        name="HERE." + kwargs.get("scheme", "normal.day"),
        **kwargs)
Exemplo n.º 19
0
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))))
Exemplo n.º 20
0
    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
Exemplo n.º 21
0
    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
Exemplo n.º 22
0
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
Exemplo n.º 24
0
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
Exemplo n.º 25
0
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
Exemplo n.º 26
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
Exemplo n.º 27
0
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())
Exemplo n.º 29
0
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",
Exemplo n.º 30
0
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