import folium
from folium.plugins import MarkerCluster
m = folium.Map(location=[44, -73], zoom_start=5)
marker_cluster = MarkerCluster().add_to(m)
folium.Marker(
location=[40.67, -73.94],
popup="Add popup text here.",
icon=folium.Icon(color="green", icon="ok-sign"),
).add_to(marker_cluster)
folium.Marker(
location=[44.67, -73.94],
popup="Add popup text here.",
icon=folium.Icon(color="red", icon="remove-sign"),
).add_to(marker_cluster)
folium.Marker(
location=[44.67, -71.94],
popup="Add popup text here.",
icon=None,
).add_to(marker_cluster)
m
import numpy as np
size = 100
lons = np.random.randint(-180, 180, size=size)
lats = np.random.randint(-90, 90, size=size)
locations = list(zip(lats, lons))
popups = ["lon:{}<br>lat:{}".format(lon, lat) for (lat, lon) in locations]
Adding all icons in a single call
icon_create_function = """\
function(cluster) {
return L.divIcon({
html: '<b>' + cluster.getChildCount() + '</b>',
className: 'marker-cluster marker-cluster-large',
iconSize: new L.Point(20, 20)
});
}"""
from folium.plugins import MarkerCluster
m = folium.Map(
location=[np.mean(lats), np.mean(lons)], tiles="Cartodb Positron", zoom_start=1
)
marker_cluster = MarkerCluster(
locations=locations,
popups=popups,
name="1000 clustered icons",
overlay=True,
control=True,
icon_create_function=icon_create_function,
)
marker_cluster.add_to(m)
folium.LayerControl().add_to(m)
m
Explicit loop allow for customization in the loop.
%%time
m = folium.Map(
location=[np.mean(lats), np.mean(lons)],
tiles='Cartodb Positron',
zoom_start=1
)
marker_cluster = MarkerCluster(
name='1000 clustered icons',
overlay=True,
control=False,
icon_create_function=None
)
for k in range(size):
location = lats[k], lons[k]
marker = folium.Marker(location=location)
popup = 'lon:{}<br>lat:{}'.format(location[1], location[0])
folium.Popup(popup).add_to(marker)
marker_cluster.add_child(marker)
marker_cluster.add_to(m)
folium.LayerControl().add_to(m);
CPU times: user 17.8 ms, sys: 3.64 ms, total: 21.4 ms Wall time: 21.8 ms
<folium.map.LayerControl at 0x7fe027f27f10>
m
FastMarkerCluster
is not as flexible as MarkerCluster but, like the name suggests, it is faster.
from folium.plugins import FastMarkerCluster
%%time
m = folium.Map(
location=[np.mean(lats), np.mean(lons)],
tiles='Cartodb Positron',
zoom_start=1
)
FastMarkerCluster(data=list(zip(lats, lons))).add_to(m)
folium.LayerControl().add_to(m);
CPU times: user 5.66 ms, sys: 0 ns, total: 5.66 ms Wall time: 4.98 ms
<folium.map.LayerControl at 0x7fe026469610>
m
callback = """\
function (row) {
var icon, marker;
icon = L.AwesomeMarkers.icon({
icon: "map-marker", markerColor: "red"});
marker = L.marker(new L.LatLng(row[0], row[1]));
marker.setIcon(icon);
return marker;
};
"""
m = folium.Map(
location=[np.mean(lats), np.mean(lons)], tiles="Cartodb Positron", zoom_start=1
)
FastMarkerCluster(data=list(zip(lats, lons)), callback=callback).add_to(m)
m