首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将工具提示添加到一个集群的每一个项目中?

如何将工具提示添加到一个集群的每一个项目中?
EN

Stack Overflow用户
提问于 2022-09-29 16:41:10
回答 2查看 164关注 0票数 0

INTRO:我有一个geopandas dataframe df_osm (点和多边形)如下:

代码语言:javascript
复制
geometry                                              name
0  POLYGON ((1.46423 43.56901, 1.46428 43.56847, ...  A
1  POLYGON ((1.38403 43.60532, 1.38319 43.60517, ...  B
2  POLYGON ((1.48632 43.53240, 1.48744 43.53285, ...  C
3  POLYGON ((1.40321 43.57974, 1.40315 43.57974, ...  D
4  POLYGON ((1.46420 43.57225, 1.46553 43.57278, ...  E

我的目标是用星系团制作一张叶图。我能够用下面的代码行创建映射,一切看起来都很好:

代码语言:javascript
复制
m = folium.Map(location=[df_cdm.latitude.mean(),df_cdm.longitude.mean()], zoom_start=15, tiles='CartoDB positron', max_zoom = 20)

m_cluster = MarkerCluster(name='OSM').add_to(m)
for i, row in df_osm.iterrows():
    
    sim_geo = gpd.GeoSeries(row['geometry'])
    geo_j = sim_geo.to_json()
    geo_j = folium.GeoJson(data=geo_j,
                           style_function=lambda x: {'fillColor': 'orange'})
    geo_j.add_to(m_cluster)

m

问题:我的目标是将一个工具提示添加到显示其名称的dataframe的每个项中。在互联网上阅读时,我发现我应该在folium.GeoJson函数中包括以下条目:

代码语言:javascript
复制
tooltip=folium.GeoJsonTooltip(fields=['name'])

然而,当我显示地图时,所有多边形和标记都没有任何工具提示。你能提出一个聪明而优雅的方法来实现我的目标吗?

EN

回答 2

Stack Overflow用户

发布于 2022-09-29 19:15:51

我没有答案,只有一个可重复的MWE。使用地质公园自然地球城市作为数据

观察

  1. 添加标记不带MarkerCluster悬停工作,显示城市名称,并指定集群
  2. 添加标记在MarkerCluster中无悬停,使用完全相同的代码为它们构建
  3. 添加标记,图层控件将它们全部显示。只有在

上单击层时,才会显示悬停。

代码语言:javascript
复制
import geopandas as gpd
import numpy as np
import shapely.ops
import folium, folium.plugins

gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_cities"))

# sample some points to make a voronoi to cluster points
r = np.random.RandomState(13)
gdf_ = gdf.sample(5, random_state=r)

gdf_clusters = gpd.GeoDataFrame(
    geometry=gpd.GeoSeries(
        shapely.ops.voronoi_diagram(gdf_.dissolve()["geometry"].values[0]).geoms
    ),
    crs=gdf_.crs,
)

gdf = (
    gpd.sjoin(gdf, gdf_clusters)
    .rename(columns={"index_right": "cluster"})
    .sort_values(["cluster", "name"])
)

# add some columns for hover...
gdf_clusters = gdf_clusters.join(
    gdf.groupby("cluster").agg(first=("name", "first"), last=("name", "last"))
)

# create folium map, simple way
m = gdf_clusters.reset_index().explore(name="polys")

# cluster the points added to marker clusters...
for c, d in gdf.groupby("cluster"):
    m_c = folium.plugins.MarkerCluster(name=f"mc: {c}").add_to(m)
    fields = d.drop(columns="geometry").columns.tolist()
    markers = folium.GeoJson(
        name = f"m: {c}",
        data=d.__geo_interface__,
        tooltip=folium.GeoJsonTooltip(fields),

    )
    markers.add_to(m_c) 
    # markers.add_to(m)

folium.LayerControl().add_to(m)
m

更新

  • 工具提示不适用于用GeoJson()创建的标记,标记
  • 也适用于单独创建的Marker()。下面的代码显示了如何执行这个

代码语言:javascript
复制
# cluster the points added to marker clusters...
for c, d in gdf.groupby("cluster"):
    m_c = folium.plugins.MarkerCluster(name=f"mc: {c}")
    for _, row in d.iterrows():
        folium.Marker(
            location=[row.geometry.y, row.geometry.x],
            tooltip=f"""<b>name</b>: {row["name"]}""",
        ).add_to(m_c)

    m_c.add_to(m)

folium.LayerControl().add_to(m)
m
票数 1
EN

Stack Overflow用户

发布于 2022-09-30 08:11:22

我能够用以下技巧解决我的问题:

  • 在2

中分裂位势

代码语言:javascript
复制
- List of points
- List of polygons

然后把它们分别地画出来:

代码语言:javascript
复制
mask = df_osm['geometry'].geom_type=='Point'
df_osm_point = df_osm[mask].reset_index(drop=True)
df_osm_polygons = df_osm[~mask].reset_index(drop=True)

最后,分别绘制所有内容:

代码语言:javascript
复制
import folium
from folium.plugins import BeautifyIcon, MarkerCluster, Fullscreen

cols = df_osm.columns[1:] # Exclude geometry column

m = folium.Map(location=[df_cdm.latitude.mean(),df_cdm.longitude.mean()], zoom_start=15, tiles='CartoDB positron', max_zoom = 20)

m_cluster = MarkerCluster(name='OSM').add_to(m)
for i, row in df_osm_point.iterrows():
    
    tooltip = ""
    for col in cols:
        if row[col]!='':
            tooltip += f"<b>{col}</b>: {row[col]}<br>"
    
    folium.Marker(location=[row['latitude'], row['longitude']],
                  tooltip=tooltip).add_to(m_cluster)

    
for _, row in df_osm_polygons.iterrows():
    
    tooltip = ""
    for col in cols:
        if row[col]!='':
            tooltip += f"<b>{col}</b>: {row[col]}<br>"
            
    sim_geo = gpd.GeoSeries(row['geometry']).simplify(tolerance=0.001)
    geo_j = sim_geo.to_json()
    geo_j = folium.GeoJson(data=geo_j,
                           style_function=lambda x: {'fillColor': 'orange'})
    folium.Tooltip(tooltip).add_to(geo_j)
    geo_j.add_to(m)


m_cluster = MarkerCluster(name='OTHER').add_to(m)
for i, row in df_cdm.iterrows():
    
    tooltip = f"""<p><b>Source</b>: {row['source']}<br>
                  <b>name</b>: {row['name']}<br>
                  <b>address</b>: {row['address']}<br>
                  <b>website</b>: {row['website']}<br>
                  <b>latitude</b>: {row['latitude']}<br>
                  <b>longitude</b>: {row['longitude']}</p>"""
    
    folium.Marker(location=[row['latitude'], row['longitude']],
                  tooltip=tooltip,
                  icon=folium.Icon(color='green',icon_color='black')).add_to(m_cluster)

Fullscreen(position='topright',
force_separate_button=True
).add_to(m)
folium.LayerControl().add_to(m)

m
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73899005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档