Road warriors: (Auto-)updating a "Current location" note, great for Obsidian Leaflet!

Road warriors: (Auto-)updating a “Current location” note, great for Obsidian Leaflet!

I’m impressed about all the features @valentine.195 adds to the Obsidian Leaflet map plugin, one of the latest being immediate response to changing the location: [lat, lon] entry in notes, and picking up a map center and “nearby” overlay from a note’s YAML.

That said, not everyone has a GPS-enabled laptop (I do, fortunately, but it only works when having a WAN connection), so I thought it might be useful to get an (approximate) geo location from the machine’s/network’s IP address instead.

This way, one could still update one’s location while being in a hotel, at a friend’s place or sitting in a conference. Thus, you could have a current “Nearby” map note in Obsidian, to find what places to visit or where to go for lunch.

The Python script

So let’s make a little Python3 script that does exactly that:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# location-update
# print current location, gotten from IP address
# Also write an Obsidian Markdown "Current Location" file.
# This can be used in a crontab, for automatic updating.
# MCH 2021-06-09 v0.1.0

__author__ = 'Matthias C. Hormann'
__version__ = '0.1.0'

import sys
import datetime
try:
    import geocoder
except ImportError:
    print("'geocoder' not installed, try 'pip install geocoder'.")
    sys.exit()

# CHANGE YOUR FILE LOCATION HERE!
file = "/home/matthias/Dokumente/Schreiben/Locations/-Current Location.md"

try:
    g = geocoder.ip('me')
except:
    print("Could not determine your location, no file changed.")
    sys.exit()

if g.ok:
    try:
        with open(file, "w") as f:
            f.write("""---
date: {date}
location: {location}
address: "{address}"
mapmarker: Current
nearby: 10 km
---

### My current location

Current location: **`=this.location`**

Current address: **`=this.address`**

Last update: `=this.date`

*Note:* This should update automatically, via a cron job. **If it does not**,
*use `location-update` in a terminal for a manual update.*
""".format(
                date = datetime.datetime.now().replace(microsecond=0).isoformat(),
                location = str(g.latlng),
                address = g.address
            )
            )

    except:
        print("Error: Could not write to '" + file + "'")

    print('location:', g.latlng)

else:

    print("Could not determine your location, no file changed.")

sys.exit()

This will require the geocoder module to be installed (pip install geocoder) and should be saved in either your ~/bin/ or your ~/.local/bin/ folder (assuming you use Linux). I saved it as location-update. (On Windows machinery, you might have to add a .py extension.)

Edit this file using a normal text editor, and put the correct file path for your “current location” note into it. Use an absolute path, i.e. one starting with /home/…, because ~ and $HOME won’t work when using this in a crontab, for automated updates. Yes, that is possible!

Try if it works by typing location-update in a terminal window. It should create a note like this:

---
date: 2021-06-09T13:38:15
location: [48.2418, 10.3632]
address: "Krumbach, Bavaria, DE"
mapmarker: Current
nearby: 10 km
---

### My current location

Current location: **`=this.location`**

Current address: **`=this.address`**

Last update: `=this.date`

*Note:* This should update automatically, via a cron job. **If it does not**,
*use `location-update` in a terminal for a manual update.*

In my case, that’s in /home/matthias/Dokumente/Schreiben/Locations/-Current Location.md.

You can of course alter the text to your personal preferences.

Usage with Dataview

You can now use the information in other notes, using Dataview. Assuming your note was called -Current Location.md, you can access your current location, map radius, approximate address and date/time of last update like so (with ` added around the commands):

  • =[[-Current Location]].location
  • =[[-Current Location]].nearby
  • =[[-Current Location]].address
  • =[[-Current Location]].date

Usage with Obsidian Leaflet maps

I’ve set up a “Current” marker in Obsidian Leaflet to go with this:

Here is an example of a (self-updating) “Nearby” map:

## Nearby

People, locations and events within `=[[-Current Location]].nearby` around location `=[[-Current Location]].location` (`=[[-Current Location]].address`).

```leaflet
id: Nearby
markerFile: [[-Current Location]]
height: 500px
minZoom: 1
maxZoom: 18
unit: km
overlayTag: nearby
overlayColor: 'rgba(218, 165, 32, .6)'
coordinates: [[-Current Location]]
zoomTag: nearby
```

And here is how it looks like:

After you’ve arrived somewhere and connected to their WiFi, just run location-update and BOOM! the map will magically update.

Putting it in a crontab for fully-automated use

This is normally not needed, but can be done. Edit your crontab (crontab -e) and add a line like the following, assuming you have location-update in your ~/bin/ folder, and want an update every 15 minutes:

*/15 * * * * $HOME/bin/location-update

Voilà!

Hope this is useful for some of us!

3 Likes