Skip to content

Commit 1ea034a

Browse files
btozerConengmo
authored andcommitted
Mouse Position plugin (#916)
Add MousePosition plugin. It shows a small label in the corner of the window with the coordinates corresponding to your current mouse position.
1 parent 057fdbe commit 1ea034a

File tree

4 files changed

+188
-0
lines changed

4 files changed

+188
-0
lines changed

CHANGES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
- Update leaflet to 1.3.4 (ocefpaf #939)
55
- More options (tms, opacity, kwargs) in TileLayer (mpickering #948)
6+
- Add MousePosition plugin (btozer #916)
67

78

89
0.6.0

examples/plugin-MousePosition.ipynb

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 1,
6+
"metadata": {
7+
"collapsed": true
8+
},
9+
"outputs": [],
10+
"source": [
11+
"import folium\n",
12+
"from folium.plugins import MousePosition"
13+
]
14+
},
15+
{
16+
"cell_type": "code",
17+
"execution_count": 2,
18+
"metadata": {},
19+
"outputs": [
20+
{
21+
"data": {
22+
"text/html": [
23+
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfNDg5ODFhZDE1Njk4NDc0ZmFiNDIwMWFiODI5MWE3MDAgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4ucmF3Z2l0LmNvbS9hcmRoaS9MZWFmbGV0Lk1vdXNlUG9zaXRpb24vYzMyZjFjODQvc3JjL0wuQ29udHJvbC5Nb3VzZVBvc2l0aW9uLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG4ucmF3Z2l0LmNvbS9hcmRoaS9MZWFmbGV0Lk1vdXNlUG9zaXRpb24vYzMyZjFjODQvc3JjL0wuQ29udHJvbC5Nb3VzZVBvc2l0aW9uLmNzcyIvPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF80ODk4MWFkMTU2OTg0NzRmYWI0MjAxYWI4MjkxYTcwMCIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfNDg5ODFhZDE1Njk4NDc0ZmFiNDIwMWFiODI5MWE3MDAgPSBMLm1hcCgKICAgICAgICAnbWFwXzQ4OTgxYWQxNTY5ODQ3NGZhYjQyMDFhYjgyOTFhNzAwJywgewogICAgICAgIGNlbnRlcjogWzAsIDBdLAogICAgICAgIHpvb206IDEsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKICAgIAogICAgCiAgICB2YXIgdGlsZV9sYXllcl81YTgyY2U1ZWI4OWU0NjNkYjI1N2JhZmU4MjZjNzA2ZCA9IEwudGlsZUxheWVyKAogICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzQ4OTgxYWQxNTY5ODQ3NGZhYjQyMDFhYjgyOTFhNzAwKTsKICAgIAoKICAgICAgICB2YXIgbW91c2VfcG9zaXRpb25fNTBhZDM4ODcxMmU5NGJkMGEwOTdjYzk0MzI2Zjg5OGIgPSBuZXcgTC5Db250cm9sLk1vdXNlUG9zaXRpb24oCiAgICAgICAgICAgIHsKICAiZW1wdHlTdHJpbmciOiAiVW5hdmFpbGFibGUiLAogICJsbmdGaXJzdCI6IGZhbHNlLAogICJudW1EaWdpdHMiOiA1LAogICJwb3NpdGlvbiI6ICJib3R0b21yaWdodCIsCiAgInByZWZpeCI6ICIiLAogICJzZXBhcmF0b3IiOiAiIDogIgp9KTsKICAgICAgICBtb3VzZV9wb3NpdGlvbl81MGFkMzg4NzEyZTk0YmQwYTA5N2NjOTQzMjZmODk4Yi5vcHRpb25zWyJsYXRGb3JtYXR0ZXIiXSA9IHVuZGVmaW5lZDsKICAgICAgICBtb3VzZV9wb3NpdGlvbl81MGFkMzg4NzEyZTk0YmQwYTA5N2NjOTQzMjZmODk4Yi5vcHRpb25zWyJsbmdGb3JtYXR0ZXIiXSA9IHVuZGVmaW5lZDsKICAgICAgICBtYXBfNDg5ODFhZDE1Njk4NDc0ZmFiNDIwMWFiODI5MWE3MDAuYWRkQ29udHJvbChtb3VzZV9wb3NpdGlvbl81MGFkMzg4NzEyZTk0YmQwYTA5N2NjOTQzMjZmODk4Yik7CgogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
24+
],
25+
"text/plain": [
26+
"<folium.folium.Map at 0x1ae35394b70>"
27+
]
28+
},
29+
"execution_count": 2,
30+
"metadata": {},
31+
"output_type": "execute_result"
32+
}
33+
],
34+
"source": [
35+
"# Create a folium map\n",
36+
"m = folium.Map()\n",
37+
"\n",
38+
"# Add a mouse position plugin with default parameters\n",
39+
"m.add_child(MousePosition())"
40+
]
41+
},
42+
{
43+
"cell_type": "code",
44+
"execution_count": 3,
45+
"metadata": {},
46+
"outputs": [
47+
{
48+
"data": {
49+
"text/html": [
50+
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfOTNlZjlmMDA5MjM1NDc3OThjZmM3OTBiMDRhMjk3ODMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4ucmF3Z2l0LmNvbS9hcmRoaS9MZWFmbGV0Lk1vdXNlUG9zaXRpb24vYzMyZjFjODQvc3JjL0wuQ29udHJvbC5Nb3VzZVBvc2l0aW9uLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG4ucmF3Z2l0LmNvbS9hcmRoaS9MZWFmbGV0Lk1vdXNlUG9zaXRpb24vYzMyZjFjODQvc3JjL0wuQ29udHJvbC5Nb3VzZVBvc2l0aW9uLmNzcyIvPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF85M2VmOWYwMDkyMzU0Nzc5OGNmYzc5MGIwNGEyOTc4MyIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfOTNlZjlmMDA5MjM1NDc3OThjZmM3OTBiMDRhMjk3ODMgPSBMLm1hcCgKICAgICAgICAnbWFwXzkzZWY5ZjAwOTIzNTQ3Nzk4Y2ZjNzkwYjA0YTI5NzgzJywgewogICAgICAgIGNlbnRlcjogWzAsIDBdLAogICAgICAgIHpvb206IDEsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKICAgIAogICAgCiAgICB2YXIgdGlsZV9sYXllcl9mZmY1Y2ExNDU0NWQ0OTBkOTJiYWEyNTFmY2FiN2E2YSA9IEwudGlsZUxheWVyKAogICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzkzZWY5ZjAwOTIzNTQ3Nzk4Y2ZjNzkwYjA0YTI5NzgzKTsKICAgIAoKICAgICAgICB2YXIgbW91c2VfcG9zaXRpb25fMGFkOWI5YWY4NTUxNDk0YmJmM2RlODJlYTA0YTVmMWMgPSBuZXcgTC5Db250cm9sLk1vdXNlUG9zaXRpb24oCiAgICAgICAgICAgIHsKICAiZW1wdHlTdHJpbmciOiAiTmFOIiwKICAibG5nRmlyc3QiOiB0cnVlLAogICJudW1EaWdpdHMiOiAyMCwKICAicG9zaXRpb24iOiAidG9wcmlnaHQiLAogICJwcmVmaXgiOiAiQ29vcmRpbmF0ZXM6IiwKICAic2VwYXJhdG9yIjogIiB8ICIKfSk7CiAgICAgICAgbW91c2VfcG9zaXRpb25fMGFkOWI5YWY4NTUxNDk0YmJmM2RlODJlYTA0YTVmMWMub3B0aW9uc1sibGF0Rm9ybWF0dGVyIl0gPSBmdW5jdGlvbihudW0pIHtyZXR1cm4gTC5VdGlsLmZvcm1hdE51bShudW0sIDMpICsgJyDCuiAnO307OwogICAgICAgIG1vdXNlX3Bvc2l0aW9uXzBhZDliOWFmODU1MTQ5NGJiZjNkZTgyZWEwNGE1ZjFjLm9wdGlvbnNbImxuZ0Zvcm1hdHRlciJdID0gZnVuY3Rpb24obnVtKSB7cmV0dXJuIEwuVXRpbC5mb3JtYXROdW0obnVtLCAzKSArICcgwrogJzt9OzsKICAgICAgICBtYXBfOTNlZjlmMDA5MjM1NDc3OThjZmM3OTBiMDRhMjk3ODMuYWRkQ29udHJvbChtb3VzZV9wb3NpdGlvbl8wYWQ5YjlhZjg1NTE0OTRiYmYzZGU4MmVhMDRhNWYxYyk7CgogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
51+
],
52+
"text/plain": [
53+
"<folium.folium.Map at 0x1ae35359908>"
54+
]
55+
},
56+
"execution_count": 3,
57+
"metadata": {},
58+
"output_type": "execute_result"
59+
}
60+
],
61+
"source": [
62+
"# Create another folium map\n",
63+
"m = folium.Map()\n",
64+
"\n",
65+
"# Define a Javascript function that formats the coordinate value\n",
66+
"# that is passed to it.\n",
67+
"formatter = \"function(num) {return L.Util.formatNum(num, 3) + ' º ';};\"\n",
68+
"\n",
69+
"# Add a mouse position plugin with custom parameters\n",
70+
"m.add_child(MousePosition(position='topright', separator=' | ',\n",
71+
" empty_string='NaN', lng_first=True,\n",
72+
" num_digits=20, prefix=\"Coordinates:\",\n",
73+
" lat_formatter=formatter,\n",
74+
" lng_formatter=formatter))"
75+
]
76+
}
77+
],
78+
"metadata": {
79+
"kernelspec": {
80+
"display_name": "Python 3",
81+
"language": "python",
82+
"name": "python3"
83+
},
84+
"language_info": {
85+
"codemirror_mode": {
86+
"name": "ipython",
87+
"version": 3
88+
},
89+
"file_extension": ".py",
90+
"mimetype": "text/x-python",
91+
"name": "python",
92+
"nbconvert_exporter": "python",
93+
"pygments_lexer": "ipython3",
94+
"version": "3.6.1"
95+
}
96+
},
97+
"nbformat": 4,
98+
"nbformat_minor": 1
99+
}

folium/plugins/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from folium.plugins.heat_map_withtime import HeatMapWithTime
2222
from folium.plugins.marker_cluster import MarkerCluster
2323
from folium.plugins.measure_control import MeasureControl
24+
from folium.plugins.mouse_position import MousePosition
2425
from folium.plugins.polyline_text_path import PolyLineTextPath
2526
from folium.plugins.scroll_zoom_toggler import ScrollZoomToggler
2627
from folium.plugins.terminator import Terminator
@@ -41,6 +42,7 @@
4142
'HeatMapWithTime',
4243
'MarkerCluster',
4344
'MeasureControl',
45+
'MousePosition',
4446
'PolyLineTextPath',
4547
'ScrollZoomToggler',
4648
'Terminator',

folium/plugins/mouse_position.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from __future__ import (absolute_import, division, print_function)
4+
5+
import json
6+
7+
from branca.element import CssLink, Figure, JavascriptLink, MacroElement
8+
9+
from jinja2 import Template
10+
11+
12+
class MousePosition(MacroElement):
13+
"""Add a field that shows the coordinates of the mouse position.
14+
15+
Uses the Leaflet plugin by Ardhi Lukianto under MIT license.
16+
https://github.com/ardhi/Leaflet.MousePosition
17+
18+
Parameters
19+
----------
20+
position : str, default 'bottomright'
21+
The standard Control position parameter for the widget.
22+
separator : str, default ' : '
23+
Character used to separate latitude and longitude values.
24+
empty_string : str, default 'Unavailable'
25+
Initial text to display.
26+
lng_first : bool, default False
27+
Whether to put the longitude first or not.
28+
Set as True to display longitude before latitude.
29+
num_digits : int, default '5'
30+
Number of decimal places included in the displayed
31+
longitude and latitude decimal degree values.
32+
prefix : str, default ''
33+
A string to be prepended to the coordinates.
34+
lat_formatter : str, default None
35+
Custom Javascript function to format the latitude value.
36+
lng_formatter : str, default None
37+
Custom Javascript function to format the longitude value.
38+
39+
Examples
40+
--------
41+
>>> fmtr = "function(num) {return L.Util.formatNum(num, 3) + ' º ';};"
42+
>>> MousePosition(position='topright', separator=' | ', prefix="Mouse:",
43+
... lat_formatter=fmtr, lng_formatter=fmtr)
44+
45+
"""
46+
_template = Template("""
47+
{% macro script(this, kwargs) %}
48+
49+
var {{ this.get_name() }} = new L.Control.MousePosition(
50+
{{ this.options }});
51+
{{ this.get_name() }}.options["latFormatter"] = {{ this.lat_formatter }};
52+
{{ this.get_name() }}.options["lngFormatter"] = {{ this.lng_formatter }};
53+
{{ this._parent.get_name() }}.addControl({{ this.get_name() }});
54+
55+
{% endmacro %}
56+
""") # noqa
57+
58+
def __init__(self, position='bottomright', separator=' : ',
59+
empty_string='Unavailable', lng_first=False, num_digits=5,
60+
prefix='', lat_formatter=None, lng_formatter=None):
61+
62+
super(MousePosition, self).__init__()
63+
self._name = 'MousePosition'
64+
65+
options = {
66+
'position': position,
67+
'separator': separator,
68+
'emptyString': empty_string,
69+
'lngFirst': lng_first,
70+
'numDigits': num_digits,
71+
'prefix': prefix,
72+
}
73+
self.options = json.dumps(options, sort_keys=True, indent=2)
74+
self.lat_formatter = lat_formatter or 'undefined'
75+
self.lng_formatter = lng_formatter or 'undefined'
76+
77+
def render(self, **kwargs):
78+
super(MousePosition, self).render()
79+
80+
figure = self.get_root()
81+
assert isinstance(figure, Figure), ('You cannot render this Element '
82+
'if it is not in a Figure.')
83+
84+
figure.header.add_child(JavascriptLink('https://cdn.rawgit.com/ardhi/Leaflet.MousePosition/c32f1c84/src/L.Control.MousePosition.js')) # noqa
85+
86+
figure.header.add_child(CssLink('https://cdn.rawgit.com/ardhi/Leaflet.MousePosition/c32f1c84/src/L.Control.MousePosition.css')) # noqa

0 commit comments

Comments
 (0)