import leafmap from leafmap import pmtiles_style import solara import ipyleaflet # THings to come: # TODO: Calculate some metrics given the area. # TODO: add a raster to the toy # TODO: Dynamically check the center of the map and change what's displayed depending on that. # variables zoom = solara.reactive(2) center = solara.reactive((20, 0)) # Euromap info eurocrops_pmtiles = "https://s3.us-west-2.amazonaws.com/us-west-2.opendata.source.coop/cholmes/eurocrops/eurocrops-all.pmtiles" original_style = { "version": 8, "sources": { "source": { "type": "vector", "url": "pmtiles://https://s3.us-west-2.amazonaws.com/us-west-2.opendata.source.coop/cholmes/eurocrops/eurocrops-all.pmtiles", "attribution": "PMTiles", } }, "layers": [ { "id": "eurocrops_point", "source": "source", "source-layer": "eurocrops", "type": "circle", "paint": {"circle-color": "#8dd3c7", "circle-radius": 5}, "filter": ["==", ["geometry-type"], "Point"], }, { "id": "eurocrops_stroke", "source": "source", "source-layer": "eurocrops", "type": "line", "paint": {"line-color": "#8dd3c7", "line-width": 1}, "filter": ["==", ["geometry-type"], "LineString"], }, { "id": "eurocrops_fill", "source": "source", "source-layer": "eurocrops", "type": "fill", "paint": {"fill-color": "#8dd3c7", "fill-opacity": 0.5}, "filter": ["==", ["geometry-type"], "Polygon"], }, ], } style = original_style del style["version"] del style["sources"] q_url = "https://storage.googleapis.com/ahp-research/overture/pmtiles/overture.pmtiles" q_style = { "layers": [ { "id": "admins", "source": "example_source", "source-layer": "admins", "type": "fill", "paint": {"fill-color": "#BDD3C7", "fill-opacity": 0.1}, }, { "id": "buildings", "source": "example_source", "source-layer": "buildings", "type": "fill", "paint": {"fill-color": "#FFFFB3", "fill-opacity": 0.5}, }, { "id": "places", "source": "example_source", "source-layer": "places", "type": "fill", "paint": {"fill-color": "#BEBADA", "fill-opacity": 0.5}, }, { "id": "roads", "source": "example_source", "source-layer": "roads", "type": "line", "paint": {"line-color": "#FB8072"}, }, ], } # self.add_pmtiles(url, name='PMTiles', style=style) class Map(leafmap.Map): def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self.add_basemap("CartoDB.DarkMatter") self.add_pmtiles( eurocrops_pmtiles, style=style, name="Euro Crops", overlay=True, show=True, zoom_to_layer=True, ) # print(pmtiles_style(eurocrops_pmtiles)) # print(style) # self.add_pmtiles( # q_url, # # style=pmtiles_style(q_url), # style=q_style, # name="Quisheng Layer", # overlay=True, # show=True, # zoom_to_layer=True, # ) # self.add_my_pmtiles() # self.add_stac_gui() ## TODO: make sure I need this def add_my_pmtiles(self, **kwargs): layer = ipyleaflet.PMTilesLayer(url=eurocrops_pmtiles, style=style) self.add(layer) @solara.component def Page(): with solara.Column(style={"min-width": "500px"}): # solara components support reactive variables # solara.SliderInt(label="Zoom level", value=zoom, min=1, max=20) # using 3rd party widget library require wiring up the events manually # using zoom.value and zoom.set Map.element( # type: ignore # m = Map.element( # type: ignore zoom=zoom.value, on_zoom=zoom.set, center=center.value, on_center=center.set, scroll_wheel_zoom=True, toolbar_ctrl=False, data_ctrl=False, height="780px", )