I want to change the icon of the marker in .explore to a house icon.
I have read the documentation of geopandas.GeoDataFrame.explore and folium, still not able to understand it.
geo_df.explore(m=m
,column='pop'
,tooltip={"name","pop"}
,cmap='summer'
,style_kwds=dict(stroke=True,weight=1,color='black', opacity=0.5, fillOpacity=0.9)
,marker_kwds=dict(radius=5,icon=folium.Icon(icon='house-blank'))
,name="Residental"
)
The icon represents the position of the house and I set colormap base on an integer value.
Also, is there a way to make a radius size don't change when zoom?
There is a feature in folium GeoJson Marker and a feature in geopandas flexible style function that can be used to meet your requirement
marker_type
and marker_kwds
so that a DivIcon is usedcolumn
and cmap
parametersimport geopandas as gpd
import folium
import numpy as np
geo_df = gpd.read_file(gpd.datasets.get_path("naturalearth_cities"))
geo_df["pop"] = np.random.randint(1, 5, len(geo_df))
m = None
m = geo_df.explore(
m=m,
column="pop",
tooltip={"name", "pop"},
cmap="summer",
style_kwds=dict(
style_function=lambda x: {
"html": f"""<span class="fa fa-home"
style="color:{x["properties"]["__folium_color"]};
font-size:14px"></span>"""
},
),
marker_type="marker",
marker_kwds=dict(icon=folium.DivIcon()),
name="Residental",
height=300,
width=300,
)
m
using this as inspiration Injecting CSS and JavaScript into folium
import geopandas as gpd
import folium
import numpy as np
geo_df = gpd.read_file(gpd.datasets.get_path("naturalearth_cities"))
geo_df["pop"] = np.random.randint(1, 5, len(geo_df))
m = None
m = geo_df.explore(
m=m,
column="pop",
tooltip={"name", "pop"},
cmap="summer",
style_kwds=dict(
style_function=lambda x: {
"html": f"""<span class="fa fa-home"
style="color:{x["properties"]["__folium_color"]};">
</span>"""
},
),
marker_type="marker",
marker_kwds=dict(icon=folium.DivIcon(class_name="mapIcon")),
name="Residental",
height=300,
width=500,
)
# inject html into the map html
m.get_root().html.add_child(
folium.Element(
"""
<style>
.mapIcon {
font-size:large;
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
}
</style>
<script type="text/javascript">
window.onload = function(){
var sizeFromZoom = function(z){return z<3 ? "small" : (0.5*z)+"em"}
var updateIconSizes = function(){
var mapZoom = {mapObj}.getZoom();
var txtSize = sizeFromZoom(mapZoom);
$(".mapIcon").css("font-size", txtSize);
}
updateIconSizes();
{mapObj}.on("zoomend", updateIconSizes);
}
</script>
""".replace(
"{mapObj}", m.get_name()
)
)
)
m