INTRO:我有一个geopandas dataframe df_osm (点和多边形)如下:
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我的目标是用星系团制作一张叶图。我能够用下面的代码行创建映射,一切看起来都很好:
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函数中包括以下条目:
tooltip=folium.GeoJsonTooltip(fields=['name'])然而,当我显示地图时,所有多边形和标记都没有任何工具提示。你能提出一个聪明而优雅的方法来实现我的目标吗?
发布于 2022-09-29 19:15:51
我没有答案,只有一个可重复的MWE。使用地质公园自然地球城市作为数据
观察
MarkerCluster悬停工作,显示城市名称,并指定集群MarkerCluster中无悬停,使用完全相同的代码为它们构建上单击层时,才会显示悬停。
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()。下面的代码显示了如何执行这个# 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发布于 2022-09-30 08:11:22
我能够用以下技巧解决我的问题:
中分裂位势
- List of points
- List of polygons然后把它们分别地画出来:
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)最后,分别绘制所有内容:
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)
mhttps://stackoverflow.com/questions/73899005
复制相似问题