class MapRegion: def __init__(self, center=(41.8204600, 1.8676800), zoom=9): self.map = Map(center=center, zoom=zoom, basemap=basemaps.OpenStreetMap.HOT) polygon = Polygon(locations=[[]], color="green", fill_color="green") def handle_click(**kwargs): if kwargs.get('type') == 'click': pol = next(layer for layer in self.map.layers if isinstance(layer, Polygon)) coords = kwargs.get('coordinates') if (len(polygon.locations) == 0): pol.locations[0].extend([coords, coords]) else: pol.locations[0].insert(1, coords) self.map.remove_layer(pol) other = Polygon(locations=pol.locations, color="green", fill_color="green") self.map.add_layer(other) if kwargs.get('type') == 'contextmenu': pol = next(layer for layer in self.map.layers if isinstance(layer, Polygon)) self.map.remove_layer(pol) other = Polygon(locations=[[]], color="green", fill_color="green") self.map.add_layer(other) self.map.on_interaction(handle_click) self.map.add_layer(polygon) display(self.map) def get_region(self): locations = [[]] for layer in self.map.layers: if isinstance(layer, Polygon): locations[0] = [[loc[1], loc[0]] for loc in layer.locations[0]] if (len(locations[0]) > 0): locations[0].append(locations[0][0]) return locations[0]
from ipyleaflet import Map, basemaps, basemap_to_tiles def foo(p): print(p) m = Map( layers=(basemap_to_tiles(basemaps.NASAGIBS.ModisTerraTrueColorCR, "2017-04-08"), ), center=(52.204793, 360.121558), zoom=4, ) m.on_interaction(foo)
class DomainPicker: def __init__(self, n_days_old_satimg=1): t = datetime.datetime.now() - datetime.timedelta(days=n_days_old_satimg) t_str = t.strftime("%Y-%m-%d") self.m = Map( layers=[ basemap_to_tiles(basemaps.NASAGIBS.ModisTerraTrueColorCR, t_str), ], center=(52.204793, 360.121558), zoom=2, ) self.domain_coords = [] self.polygon = None self.marker_locs = {} self.m.on_interaction(self._handle_map_click) button_reset = Button(description="reset") button_reset.on_click(self._clear_domain) button_save = Button(description="save domain") button_save.on_click(self._save_domain) self.name_textfield = Text(value="domain_name", width=10) self.m.add_control(WidgetControl(widget=button_save, position="bottomright")) self.m.add_control(WidgetControl(widget=button_reset, position="bottomright")) self.m.add_control( WidgetControl(widget=self.name_textfield, position="bottomright") ) def _update_domain_render(self): if self.polygon is not None: self.m.remove_layer(self.polygon) if len(self.domain_coords) > 1: self.polygon = Polygon( locations=self.domain_coords, color="green", fill_color="green" ) self.m.add_layer(self.polygon) else: self.polygon = None def _handle_marker_move(self, marker, location, **kwargs): old_loc = marker.location new_loc = location idx = self.domain_coords.index(old_loc) self.domain_coords[idx] = new_loc self._update_domain_render() def _handle_map_click(self, **kwargs): if kwargs.get("type") == "click": loc = kwargs.get("coordinates") marker = Marker(location=loc) marker.on_move(partial(self._handle_marker_move, marker=marker)) self.domain_coords.append(loc) self.marker_locs[marker] = loc self.m.add_layer(marker) self._update_domain_render() def _clear_domain(self, *args, **kwargs): self.domain_coords = [] for marker in self.marker_locs.keys(): self.m.remove_layer(marker) self.marker_locs = {} self._update_domain_render() def _save_domain(self, *args, **kwargs): fn = "{}.domain.yaml".format(self.name_textfield.value) with open(fn, "w") as fh: yaml.dump(self.domain_coords, fh, default_flow_style=False) print("Domain points written to `{}`".format(fn))
self.m.remove_layer(self.geojson) self.geojson = None self.marker_or_geojson = None label = Label() file_upload = FileUpload(accept='.geojson,.json', multiple=False, description='Upload GeoJSON') m = Map(center=(-10, -60), zoom=4, interpolation='nearest', basemap=basemaps.CartoDB.DarkMatter) map_menu = Map_menu(m, label, file_upload) m.on_interaction(map_menu.show) file_upload.observe(map_menu.show_geojson, 'value') def to_webmercator(source, affine, bounds): with rasterio.Env(): rows, cols = source.shape src_transform = affine src_crs = {'init': 'EPSG:4326'} dst_crs = {'init': 'EPSG:3857'} dst_transform, width, height = rasterio.warp.calculate_default_transform( src_crs, dst_crs, cols, rows, *bounds) dst_shape = height, width destination = np.zeros(dst_shape) reproject(source, destination,
dist = dist.max() - dist dist[dist > np.percentile(dist, 5)] = 0 temp = np.cumsum(np.dot(dist, temps) + 0.05) + 20 - np.abs(x) / 2 time_series.y = temp def handle_interaction(**kwargs): if kwargs['type'] == 'click': generate_temp_series(*kwargs['coordinates']) msg = '%s Selected coordinates: %s, Temp: %d C Precipitation: %d mm\n' % ( datetime.now(), kwargs['coordinates'], random.randint( -20, 20), random.randint(0, 100)) out.value = add_log(msg) m.on_interaction(handle_interaction) def on_map_selected(change): m.layers = [ basemap_to_tiles(maps[basemap_selector.value]), weather_maps[heatmap_selector.value] ] basemap_selector.observe(on_map_selected, names='value') heatmap_selector.observe(on_map_selected, names='value') # In[18]: temp = TileLayer(