2024-07-03 00:14:42 +02:00
2024-07-03 00:14:42 +02:00
2024-06-27 01:51:49 +02:00
2024-06-27 00:48:41 +02:00
2024-06-27 00:48:41 +02:00
2024-06-27 00:48:41 +02:00
2024-06-27 01:51:33 +02:00
2024-06-27 00:48:41 +02:00
2024-06-27 01:51:49 +02:00

Django: Map-Location

Adds a fully-static location field (Leaflet) to manage location-based data without the need for a full-fledged GeoDjango installation. ... when all you need is a visual position chooser.

screenshot

Install

  1. Add to your INSTALLED_APPS
INSTALLED_APPS = [
    ...,
    'map_location',
]
  1. Create Map-Location field
from map_location.fields import LocationField

class Place(models.Model):
    location = LocationField('Pos', blank=True, null=True, options={
        'map': {
            'center': [52.52, 13.40],
            'zoom': 12,
        },
        # 'markerZoom': 18
        # 'tileLayer': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
        # 'tileOptions': {
        #     attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
        # },
        # 'locate': {
        #     'returnToPrevBounds': True,
        #     'showPopup': False,
        # },
    })

Options Paramter

Key Info
map Map Options (default: {center: [20, -25], zoom: 2})
markerZoom Initial zoom scale (on load) if a marker is set. (default: 18)
tileLayer TileLayer urlTemplate (default: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
tileOptions TileLayer Options (default: {})
locate Leaflet.Locate Options (default: {returnToPrevBounds: true, showPopup: false})

Usage

You can access the location by its parts (place.location.lat & place.location.long) or by its string value (str(place.location) or just place.location) which will return a comma-separated string (lat,long). This string format is also used for database storage (with a precision of 6 digits, or up to 11 cm).

Example

If you export your location as json, you can use a fully static map:

_JSON_ = {'loc': [place.location.lat, place.location.long]}
<script src="/static/leaflet/leaflet.js"></script>
<script src="/static/leaflet/locate/L.Control.Locate.min.js"></script>
<link rel="stylesheet" href="/static/leaflet/leaflet.css" />
<link rel="stylesheet" href="/static/leaflet/locate/L.Control.Locate.css" />
...
<div id="map-id"></div>
...
<script>
    const osm = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
    const map = L.map('map-id', {
        layers: [osm],
        center: [52.52, 13.40],
        zoom: 14,
    });
    L.control.locate({
        returnToPrevBounds: true,
        showPopup: false,
    }).addTo(map);
    L.marker(L.latLng(_JSON_.loc)).addTo(map);
    ...
</script>

See Leaflet docs for configuration options.

License

This project is licensed under MIT and includes:

Description
Fully-static Leaflet location/position field without GeoDjango.
https://pypi.org/project/django-map-location/ Readme 479 KiB
Languages
CSS 67%
Python 16.8%
JavaScript 11.2%
Makefile 3.2%
HTML 1.8%