Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Folium FeatureGroup in Python

I am trying to create maps using Folium Feature group. The feature group will be from a pandas dataframe row. I am able to achieve this when there is one data in the dataframe. But when there are more than 1 in the dataframe, and loop through it in the for loop I am not able to acheive what I want. Please find attached the code in Python.

from folium import Map, FeatureGroup, Marker, LayerControl

mapa = Map(location=[35.11567262307692,-89.97423444615382], zoom_start=12,
           tiles='Stamen Terrain')

feature_group1 = FeatureGroup(name='Tim')
feature_group2 = FeatureGroup(name='Andrew')
feature_group1.add_child(Marker([35.035075, -89.89969], popup='Tim'))
feature_group2.add_child(Marker([35.821835, -90.70503], popup='Andrew'))
mapa.add_child(feature_group1)
mapa.add_child(feature_group2)
mapa.add_child(LayerControl())

mapa

My dataframe contains the following:

Name                             Address  
0                      Dollar Tree #2020                    3878 Goodman Rd.   
1                      Dollar Tree #2020                    3878 Goodman Rd.   
2            National Guard Products Inc                    4985 E Raines Rd   
3   434 SAVE A LOT C MID WEST 434 Kelvin                    3240 Jackson Ave   
4                        WALGREENS 06765                   108 E HIGHLAND DR   
5                               Aldi #69                  4720 SUMMER AVENUE   
6                  Richmond, Christopher              1203 Chamberlain Drive   


         City State Zipcode           Group  
0   Horn Lake    MS   38637  Johnathan Shaw   
1   Horn Lake    MS   38637    Tony Bonetti   
2     Memphis    TN   38118    Tony Bonetti   
3     Memphis    TN   38122    Tony Bonetti   
4   JONESBORO    AR   72401   Josh Jennings   
5     Memphis    TN   38122   Josh Jennings   
6     Memphis    TN   38119   Josh Jennings   


                                         full_address      Color  sequence  \
0             3878 Goodman Rd.,Horn Lake,MS,38637,USA       blue         1   
1             3878 Goodman Rd.,Horn Lake,MS,38637,USA  cadetblue         1   
2               4985 E Raines Rd,Memphis,TN,38118,USA  cadetblue         2   
3               3240 Jackson Ave,Memphis,TN,38122,USA  cadetblue         3   
4            108 E HIGHLAND DR,JONESBORO,AR,72401,USA     yellow         1   
5             4720 SUMMER AVENUE,Memphis,TN,38122,USA     yellow         2   
6         1203 Chamberlain Drive,Memphis,TN,38119,USA     yellow         3   


     Latitude  Longitude  
0   34.962637 -90.069019  
1   34.962637 -90.069019  
2   35.035367 -89.898428  
3   35.165115 -89.952624  
4   35.821835 -90.705030  
5   35.148707 -89.903760  
6   35.098829 -89.866838  

The same when I am trying to loop through in the for loop, I am not able to achieve what I need. :

from folium import Map, FeatureGroup, Marker, LayerControl

mapa = Map(location=[35.11567262307692,-89.97423444615382], zoom_start=12,tiles='Stamen Terrain')
#mapa.add_tile_layer()
for i in range(0,len(df_addresses)): 
feature_group = FeatureGroup(name=df_addresses.iloc[i]['Group'])
    feature_group.add_child(Marker([df_addresses.iloc[i]['Latitude'], df_addresses.iloc[i]['Longitude']], 
                  popup=('Address: ' + str(df_addresses.iloc[i]['full_address']) + '<br>'
                    'Tech: ' + str(df_addresses.iloc[i]['Group'])),
                                   icon = plugins.BeautifyIcon(
                                    number= str(df_addresses.iloc[i]['sequence']),
                                    border_width=2,
                                    iconShape= 'marker',
                                    inner_icon_style= 'margin-top:2px',
                                     background_color  = df_addresses.iloc[i]['Color'],
                 )))
    mapa.add_child(feature_group)
mapa.add_child(LayerControl())
like image 921
Lalitha Venkatasubramanian Avatar asked Sep 14 '26 04:09

Lalitha Venkatasubramanian


2 Answers

This is an example dataset because I didn't want to format your df. That said, I think you'll get the idea.

print(df_addresses)
    Latitude  Longitude Group
0  34.962637 -90.069019     B
1  34.962637 -90.069019     B
2  35.035367 -89.898428     A
3  35.165115 -89.952624     B
4  35.821835 -90.705030     A
5  35.148707 -89.903760     A
6  35.098829 -89.866838     A

After I create the map object(maps), I perform a groupby on the group column. I then iterate through each group. I first create a FeatureGroup with the grp_name(A or B). And for each group, I iterate through that group's dataframe and create Markers and add them to the FeatureGroup

mapa = folium.Map(location=[35.11567262307692,-89.97423444615382], zoom_start=12,
           tiles='Stamen Terrain')

for grp_name, df_grp in df_addresses.groupby('Group'):
    feature_group = folium.FeatureGroup(grp_name)
    for row in df_grp.itertuples():
        folium.Marker(location=[row.Latitude, row.Longitude]).add_to(feature_group)
    feature_group.add_to(mapa)

folium.LayerControl().add_to(mapa)
mapa

enter image description here

like image 72
Bob Haffner Avatar answered Sep 16 '26 19:09

Bob Haffner


Regarding the stamenterrain query, if you're referring to the appearance in the control box you can remove this by declaring your map with tiles=None and adding the TileLayer separately with control set to false: folium.TileLayer('Stamen Terrain', control=False).add_to(mapa)

like image 26
myu Avatar answered Sep 16 '26 19:09

myu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!