Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FeatureGroups named using numeric string always placed first in LayerControl #2021

Open
JuliusGoelz opened this issue Oct 30, 2024 · 5 comments

Comments

@JuliusGoelz
Copy link

JuliusGoelz commented Oct 30, 2024

Describe the bug
Adding multiple FeatureGroups to a LayerControl where some are named using a numerical string causes those groups to always come first in the layer control on the map, even though feature groups named using alphanumeric strings are unsorted and sortLayers argument is set to False.

Screenshot (edited, original one accidentally showed the solution using the workaround described below):

image

I have not managed to find any documentation saying that this is intended behaviour.

To Reproduce

import folium

m = folium.Map(location=[0, 0], zoom_start=6)

fg1 = folium.FeatureGroup("z")
m.add_child(fg1)

fg2 = folium.FeatureGroup("a")
m.add_child(fg2)

fg3 = folium.FeatureGroup("2a")
m.add_child(fg3)

fg4 = folium.FeatureGroup("1")
m.add_child(fg4)

folium.Marker([-1, -1]).add_to(fg1)
folium.Marker([1, 1]).add_to(fg2)
folium.Marker([-1, 1]).add_to(fg3)
folium.Marker([1, -1]).add_to(fg4)

folium.LayerControl(collapsed=False, sortLayers=False).add_to(m)

m

Expected behavior
FeatureGroups appearing in the LayerControl in the order they were added to the map when sortLayers argument is set to False.

In the case of the example: z -> a -> 2a -> 1

Environment (please complete the following information):

  • Jupyter Notebook
  • Python version: 3.12.6
  • folium version 0.18.0

Additional context

--

Possible solutions

  • Inserting a space/any other symbol after the number makes it appear where I would expect it to
  • I tried supplying a js sortFunction to LayerControl as a string, but it resulted in the layer control not showing up. Is this not supposed to be used in Python?
@hansthen
Copy link
Collaborator

I can at least confirm the behavior. However, I also cannot see anything wrong with the generated code on our side. We keep the order in which the items are added to the map. Perhaps it is an issue with the underlying Leaflet code.

@hansthen
Copy link
Collaborator

There is a comment similar to yours in this merge request Leaflet/Leaflet#4227, where they also note that numerical keys break the sort order.

@hansthen
Copy link
Collaborator

@JuliusGoelz This seems to be an issue with an upstream package. You might want to file your issue with the Leaflet project. However, since the issues is already known I would not hold your breath for them to fix it anytime to soon.

@JuliusGoelz
Copy link
Author

@hansthen Thank you for looking into it! The issue can be closed as far as I'm concerned, I'm just not quite sure which of the two options to choose, though.

@hansthen
Copy link
Collaborator

@JuliusGoelz I think your first solution would be perfect as a workaround.

Your second solution (providing a custom javascript sort function) should also work. However, you must make sure to wrap the javascript code in a JsCode object. There are some examples on how to do that here: https://python-visualization.github.io/folium/latest/user_guide/plugins/realtime.html.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants