opengeos/solara-geospatial

Leafmap error when using the display() function of Solara.

Closed this issue · 1 comments

I would like to develop a simple app to display country boundaries polygon. I tried to use callback from Solara select component to make the previous polygon disappear and add new polygon to Leafmap. So I need display() function to show Leafmap. I found that when I open the URL. it always show error "RuntimeError: Widget has no comm". Error will gone by made some trick to make Solara server refresh.
Please help to advise.

Here is my code.

import leafmap
import solara
import pandas as pd
import geopandas as gpd

country_url = "https://naciscdn.org/naturalearth/110m/cultural/ne_110m_admin_0_countries.zip"
country_gdf = gpd.read_file(country_url)
countries = country_gdf["NAME"].values.tolist()
countries.sort()

class Map(leafmap.Map):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def change_country(self):
        if len(self.layers) > 1:
            self.remove_layer(self.layers[1]) # Idx#1 is country polygon layer
        select_country_gdf = country_gdf[country_gdf.NAME == country.value]    
        self.add_gdf(select_country_gdf)
        self.zoom_to_gdf(select_country_gdf)
        return

def select_country():
    change_cselect_country_gdf = country_gdf[country_gdf.NAME == country.value]
    m.change_country()

m = Map()
m.element(scroll_wheel_zoom=True,
          toolbar_ctrl=False,
          data_ctrl=False,
          )
country = solara.reactive("Thailand")
select_country()

@solara.component
def Page():
    with solara.Columns([3, 2]):
        with solara.Column():
            display(m)

        with solara.Column():
            solara.Markdown("Select country")
            solara.Select(label="country", value=country, values=countries, on_value=select_country())

Here is error message.

Traceback (most recent call last):
  File "/data/user1/mambaforge/envs/webgis_py38/lib/python3.8/site-packages/reacton/core.py", line 1647, in _render
    root_element = el.component.f(*el.args, **el.kwargs)
  File "/data/user1/project/webgis/country_disp.py", line 45, in Page
    solara.Select(label="country", value=country, values=countries, on_value=select_country())
  File "/data/user1/project/webgis/country_disp.py", line 26, in select_country
    m.change_country()
  File "/data/user1/project/webgis/country_disp.py", line 18, in change_country
    self.remove_layer(self.layers[1]) # Idx#1 is country polygon layer
  File "/data/user1/mambaforge/envs/webgis_py38/lib/python3.8/site-packages/ipyleaflet/leaflet.py", line 2541, in remove_layer
    self.remove(rm_layer)
  File "/data/user1/mambaforge/envs/webgis_py38/lib/python3.8/site-packages/ipyleaflet/leaflet.py", line 2684, in remove
    if item.model_id not in self._layer_ids:
  File "/data/user1/mambaforge/envs/webgis_py38/lib/python3.8/site-packages/solara/server/patch.py", line 360, in model_id_debug
    raise RuntimeError("Widget has no comm, you are probably using a widget that was closed. The widget is:\n" + repr(self))
RuntimeError: Widget has no comm, you are probably using a widget that was closed. The widget is:
GeoJSON(data={'type': 'FeatureCollection', 'features': [{'id': '91', 'type': 'Feature', 'properties': {'featurecla': 'Admin-0 country', 'scalerank': 1, 'LABELRANK': 3, 'SOVEREIGNT': 'Thailand', 'SOV_A3': 'THA', 'ADM0_DIF': 0, 'LEVEL': 2, 'TYPE': 'Sovereign country', 'TLC': '1', 'ADMIN': 'Thailand', 'ADM0_A3': 'THA', 'GEOU_DIF': 0, 'GEOUNIT': 'Thailand', 'GU_A3': 'THA', 'SU_DIF': 0, 'SUBUNIT': 'Thailand', 'SU_A3': 'THA', 'BRK_DIFF': 0, 'NAME': 'Thailand', 'NAME_LONG': 'Thailand', 'BRK_A3': 'THA', 'BRK_NAME': 'Thailand', 'BRK_GROUP': None, 'ABBREV': 'Thai.', 'POSTAL': 'TH', 'FORMAL_EN': 'Kingdom of Thailand', 'FORMAL_FR': None, 'NAME_CIAWF': 'Thailand', 'NOTE_ADM0': None, 'NOTE_BRK': None, 'NAME_SORT': 'Thailand', 'NAME_ALT': None, 'MAPCOLOR7': 3, 'MAPCOLOR8': 6, 'MAPCOLOR9': 8, 'MAPCOLOR13': 1, 'POP_EST': 69625582.0, 'POP_RANK': 16, 'POP_YEAR': 2019, 'GDP_MD': 543548, 'GDP_YEAR': 2019, 'ECONOMY': '5. Emerging region: G20', 'INCOME_GRP': '3. Upper middle income', 'FIPS_10': 'TH', 'ISO_A2': 'TH', 'ISO_A2_EH': 'TH', 'ISO_A3': 'THA', 'ISO_A3_EH': 'THA', 'ISO_N3': '764', 'ISO_N3_EH': '764', 'UN_A3': '764', 'WB_A2': 'TH', 'WB_A3': 'THA', 'WOE_ID': 23424960, 'WOE_ID_EH': 23424960, 'WOE_NOTE': 'Exact WOE match as country', 'ADM0_ISO': 'THA', 'ADM0_DIFF': None, 'ADM0_TLC': 'THA', 'ADM0_A3_US': 'THA', 'ADM0_A3_FR': 'THA', 'ADM0_A3_RU': 'THA', 'ADM0_A3_ES': 'THA', 'ADM0_A3_CN': 'THA', 'ADM0_A3_TW': 'THA', 'ADM0_A3_IN': 'THA', 'ADM0_A3_NP': 'THA', 'ADM0_A3_PK': 'THA', 'ADM0_A3_DE': 'THA', 'ADM0_A3_GB': 'THA', 'ADM0_A3_BR': 'THA', 'ADM0_A3_IL': 'THA', 'ADM0_A3_PS': 'THA', 'ADM0_A3_SA': 'THA', 'ADM0_A3_EG': 'THA', 'ADM0_A3_MA': 'THA', 'ADM0_A3_PT': 'THA', 'ADM0_A3_AR': 'THA', 'ADM0_A3_JP': 'THA', 'ADM0_A3_KO': 'THA', 'ADM0_A3_VN': 'THA', 'ADM0_A3_TR': 'THA', 'ADM0_A3_ID': 'THA', 'ADM0_A3_PL': 'THA', 'ADM0_A3_GR': 'THA', 'ADM0_A3_IT': 'THA', 'ADM0_A3_NL': 'THA', 'ADM0_A3_SE': 'THA', 'ADM0_A3_BD': 'THA', 'ADM0_A3_UA': 'THA', 'ADM0_A3_UN': -99, 'ADM0_A3_WB': -99, 'CONTINENT': 'Asia', 'REGION_UN': 'Asia', 'SUBREGION': 'South-Eastern Asia', 'REGION_WB': 'East Asia & Pacific', 'NAME_LEN': 8, 'LONG_LEN': 8, 'ABBREV_LEN': 5, 'TINY': -99, 'HOMEPART': 1, 'MIN_ZOOM': 0.0, 'MIN_LABEL': 2.7, 'MAX_LABEL': 8.0, 'LABEL_X': 101.073198, 'LABEL_Y': 15.45974, 'NE_ID': 1159321305, 'WIKIDATAID': 'Q869', 'NAME_AR': 'تايلاند', 'NAME_BN': 'থাইল্যান্ড', 'NAME_DE': 'Thailand', 'NAME_EN': 'Thailand', 'NAME_ES': 'Tailandia', 'NAME_FA': 'تایلند', 'NAME_FR': 'Thaïlande', 'NAME_EL': 'Ταϊλάνδη', 'NAME_HE': 'תאילנד', 'NAME_HI': 'थाईलैण्ड', 'NAME_HU': 'Thaiföld', 'NAME_ID': 'Thailand', 'NAME_IT': 'Thailandia', 'NAME_JA': 'タイ王国', 'NAME_KO': '태국', 'NAME_NL': 'Thailand', 'NAME_PL': 'Tajlandia', 'NAME_PT': 'Tailândia', 'NAME_RU': 'Таиланд', 'NAME_SV': 'Thailand', 'NAME_TR': 'Tayland', 'NAME_UK': 'Таїланд', 'NAME_UR': 'تھائی لینڈ', 'NAME_VI': 'Thái Lan', 'NAME_ZH': '泰国', 'NAME_ZHT': '泰國', 'FCLASS_ISO': 'Admin-0 country', 'TLC_DIFF': None, 'FCLASS_TLC': 'Admin-0 country', 'FCLASS_US': None, 'FCLASS_FR': None, 'FCLASS_RU': None, 'FCLASS_ES': None, 'FCLASS_CN': None, 'FCLASS_TW': None, 'FCLASS_IN': None, 'FCLASS_NP': None, 'FCLASS_PK': None, 'FCLASS_DE': None, 'FCLASS_GB': None, 'FCLASS_BR': None, 'FCLASS_IL': None, 'FCLASS_PS': None, 'FCLASS_SA': None, 'FCLASS_EG': None, 'FCLASS_MA': None, 'FCLASS_PT': None, 'FCLASS_AR': None, 'FCLASS_JP': None, 'FCLASS_KO': None, 'FCLASS_VN': None, 'FCLASS_TR': None, 'FCLASS_ID': None, 'FCLASS_PL': None, 'FCLASS_GR': None, 'FCLASS_IT': None, 'FCLASS_NL': None, 'FCLASS_SE': None, 'FCLASS_BD': None, 'FCLASS_UA': None, 'style': {'color': 'black', 'fillColor': 'black'}}, 'geometry': {'type': 'Polygon', 'coordinates': (((105.21877689007889, 14.273211778210694), (104.28141808473661, 14.416743068901367), (102.98842207236163, 14.225721136934467), (102.34809939983302, 13.394247341358223), (102.5849324890267, 12.186594956913282), (101.68715783081996, 12.645740057826572), (100.83180952352487, 12.627084865769206), (100.9784672383692, 13.412721665902566), (100.09779747925111, 13.406856390837433), (100.01873253784456, 12.307001044153354), (99.47892052612363, 10.846366685423547), (99.15377241414316, 9.963061428258555), (99.22239871622676, 9.239255479362427), (99.87383182169813, 9.20786204674512), (100.27964684448622, 8.295152899606052), (100.45927412313276, 7.429572658717177), (101.01732791545273, 6.856868597842478), (101.62307905477806, 6.74062246340192), (102.14118696493638, 6.221636053894628), (101.81428185425798, 5.8108084171742425), (101.15421878459387, 5.691384182147715), (101.07551557821336, 6.2048670516159214), (100.25959638875696, 6.6428248152895435), (100.0857568705271, 6.4644894474502905), (99.69069054565576, 6.8482127954335965), (99.51964155476963, 7.34345388430276), (98.9882528015123, 7.907993068875328), (98.503786248776, 8.382305202666288), (98.339661899817, 7.794511623562386), (98.15000939330582, 8.350007432483878), (98.25915001830626, 8.973922837759801), (98.55355065307305, 9.932959906448545), (99.03812055867398, 10.960545762572437), (99.58728600463972, 11.892762762901697), (99.19635379435167, 12.80474843998867), (99.21201175333609, 13.269293728076464), (99.09775516153876, 13.827502549693278), (98.43081912637987, 14.622027696180837), (98.1920740091914, 15.123702500870351), (98.53737592976572, 15.308497422746084), (98.90334842325676, 16.17782420497612), (98.49376102091135, 16.83783559820793), (97.85912275593486, 17.567946071843664), (97.37589643757354, 18.445437730375815), (97.79778283080441, 18.627080389881755), (98.25372399291561, 19.708203029860044), (98.95967573445488, 19.752980658440947), (99.54330936075931, 20.186597601802063), (100.11598758341785, 20.417849636308187), (100.54888105672688, 20.109237982661128), (100.60629357300316, 19.508344427971224), (101.2820146016517, 19.462584947176765), (101.03593143107777, 18.408928330961615), (101.05954756063517, 17.51249725999449), (102.11359175009248, 18.109101670804165), (102.41300499879162, 17.932781683824288), (102.99870568238771, 17.9616946476916), (103.20019209189374, 18.309632066312773), (103.9564766784853, 18.24095408779688), (104.7169470560925, 17.42885895433008), (104.7793205098688, 16.44186493577145), (105.58903852745016, 15.570316066952858), (105.54433841351769, 14.723933620660418), (105.21877689007889, 14.273211778210694)),)}, 'bbox': (97.37589643757354, 5.691384182147715, 105.58903852745016, 20.417849636308187)}], 'bbox': (97.37589643757354, 5.691384182147715, 105.58903852745016, 20.417849636308187)}, hover_style={'weight': 4, 'fillOpacity': 0}, name='Untitled', style={'color': '#3388ff', 'weight': 2, 'opacity': 1, 'fill': True, 'fillColor': '#3388ff', 'fillOpacity': 0.2})