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]
Example #2
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)
Example #3
0
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))
Example #4
0
            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,
Example #5
0
        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(