Бесплатная, с открытым исходным кодом библиотека DjangoAdminGeomap предназначена для отображения объектов на карте в админке Django.

Существует полноценный многофункциональный ГИС фреймворк GeoDjango. При его использовании в админке Django можно отображать объекты на карте. Однако GeoDjango имеет большой список зависимостей от различных библиотек и особенности установки этих библиотек на различных платформах.

Если вам требуется только отображение объектов на карте в админке Django, то можно использовать библиотеку DjangoAdminGeomap. У нее нет дополнительных требований к именам и типам данных полей в таблицах базы данных и отсутствуют зависимости при установке.

Для отображения картографических данных DjangoAdminGeomap использует JavaScript фреймворк OpenLayers. Источником картографических данных являются данные проекта OpenStreetMap.

Установка

pip install django-admin-geomap

После установки нужно подключить библиотеку к вашему проекту Django, внеся изменения в файл settings.py.

Изменения в settings.py

Для подключения DjangoAdminGeomap к вашему проекту нужно добавить в файл settings.py в ключ TEMPLATES путь на каталог templates библиотеки.

TEMPLATES = [
  {
    'DIRS': ['path/to/installed/django_admin_geomap/templates'],
  },
]

Включать библиотеку в список INSTALLED_APPS в settings.py не нужно.

Исходные данные

Допустим, у нас в БД имеется таблица, записи которой содержат данные о координатах.

# models.py
from django.db import models

class Location(models.Model):
    name = models.CharField(max_length=100)
    lon = models.FloatField()  # долгота
    lat = models.FloatField()  # широта

При работе с этой таблицей в админке мы хотим видеть карту с расположенными на ней объектами из этой таблицы.

Отображение списка объектов на карте

Чтобы включить отображение объектов Location на карте в админке Django нужно внести изменения в класс модели в файле models.py и в файл настроек админки admin.py.

В список наследования класса Location нужно добавить "примесный" класс django_admin_geomap.GeoItem и определить два свойства: geomap_longitude и geomap_latitude. Эти свойства должны возвращать долготу и широту объекта в виде строки.

# models.py
from django.db import models
from django_admin_geomap import GeoItem

class Location(models.Model, GeoItem):

    @property
    def geomap_longitude(self):
        return str(self.lon)

    @property
    def geomap_latitude(self):
        return str(self.lat)

В файле admin.py при регистрации модели нужно использовать класс django_admin_geomap.ModelAdmin.

# admin.py
from django.contrib import admin
from django_admin_geomap import ModelAdmin
from .models import Location

admin.site.register(Location, ModelAdmin)

После внесения данных изменений в админке на странице со списком объектов Location под таблицей будет отображаться карта с маркерами в местах расположения этих объектов.

Отображение редактируемого объекта на карте

Для отображения на карте объекта в форме редактирования/просмотра необходимо дополнительно указать идентификаторы полей в форме Django, в которых находятся значения долготы и широты объекта.

Для нашего класса Location админка Django автоматически присваивает этим полям формы идентификаторы id_lon и id_lat. В файл admin.py нужно внести следующие изменения.

# admin.py
from django.contrib import admin
from django_admin_geomap import ModelAdmin
from .models import Location

class Admin(ModelAdmin):
    geomap_field_longitude = "id_lon"
    geomap_field_latitude = "id_lat"

admin.site.register(Location, Admin)

После внесения данных изменений в админке на странице просмотра/редактирования объекта Location будет отображаться карта с маркером в месте расположения объекта.

При редактировании можно менять положение объекта, перетаскивая его значок по карте при помощи мыши (нужно навести курсор мыши на нижнюю часть значка до появления на нем синей точки).

При добавлении нового объекта его положение можно задать кликом на карте. Далее маркер нового объекта можно перетаскивать, аналогично редактированию.

Дополнительные настройки

Библиотека позволяет настраивать вид карты и объектов, задавая специальные свойства у класса модели и класса django_admin_geomap.ModelAdmin.

Значок маркера объекта на карте

Свойство geomap_icon у класса модели задает путь на значок маркера. Можно использовать разные значки в зависимости от состояния конкретного объекта.

По умолчанию используется строка https://maps.google.com/mapfiles/ms/micons/red.png

# models.py
from django.db import models
from django_admin_geomap import GeoItem

class Location(models.Model, GeoItem):

    @property
    def geomap_icon(self):
        return self.default_icon

Текст во всплывающем блоке при клике мышью по маркеру на карте

Свойства geomap_popup_view и geomap_popup_edit у класса модели задают HTML код, который используется во всплывающем блоке при клике мышью по маркеру на карте. Свойство geomap_popup_view задает код для пользователя без прав на изменение объекта, а свойство geomap_popup_edit - для пользователя, который имеет права на редактирование.

По умолчанию оба свойства возвращают строковое представление объекта.

# models.py
from django.db import models
from django_admin_geomap import GeoItem

class Location(models.Model, GeoItem):

    @property
    def geomap_popup_view(self):
        return "<strong>{}</strong>".format(str(self))

    @property
    def geomap_popup_edit(self):
        return self.geomap_popup_view

Значок маркера нового объекта

Свойство geomap_new_feature_icon класса django_admin_geomap.ModelAdmin задает путь на значок маркера при добавлении нового объекта.

По умолчанию используется значок для отображения объектов на карте.

# admin.py
from django_admin_geomap import ModelAdmin

class Admin(ModelAdmin):
    geomap_new_feature_icon = "/myicon.png"

Масштаб и центр карты при отображении списка объектов

Вы можете менять масштаб и положение центра карты, задавая свойства geomap_default_longitude, geomap_default_latitude и geomap_default_zoom у класса django_admin_geomap.ModelAdmin.

По умолчанию центр карты располагается в точке с координатами "0.0", "0.0" и используется масштаб "1".

# admin.py
from django_admin_geomap import ModelAdmin

class Admin(ModelAdmin):
    geomap_default_longitude = "95.1849"
    geomap_default_latitude = "64.2637"
    geomap_default_zoom = "3"

Масштаб карты при редактировании/просмотре объекта

При редактировании/просмотре объекта центр карты совпадает с местом расположения объекта, а масштаб карты можно задать, используя свойство geomap_item_zoom у класса django_admin_geomap.ModelAdmin.

По умолчанию этот масштаб равен "13".

# admin.py
from django_admin_geomap import ModelAdmin

class Admin(ModelAdmin):
    geomap_item_zoom = "10"

Размер карты по вертикали

При отображении карта занимает максимально возможный размер по горизонтали, а размер по вертикали можно задать через свойство geomap_height у класса django_admin_geomap.ModelAdmin. Значение должно быть строкой, допустимой в определении CSS стиля.

По умолчанию "500px".

# admin.py
from django_admin_geomap import ModelAdmin

class Admin(ModelAdmin):
    geomap_height = "300px"

Комментарии (9)


  1. endlessnights
    16.09.2021 15:24
    +1

    Как раз такое искал, спасибо. Может такое же есть и для вьюшек, чтобы показывать одну карту и на ней выводить метки с ссылкой на посты?


    1. vb64 Автор
      16.09.2021 15:48
      +1

      Для вьюшек не думал, как там там все к одному знаменателю привести. В админке же все достаточно стандартно.

      Если сформулируйте с примером, что именно нужно, то в исью проекта на гитхабе закиньте запрос, может чего придумается.


    1. vb64 Автор
      17.09.2021 20:38

      В общем, выкатил версию 1.1 с поддержкой регулярных вьюшек джанги, как я себе это представляю. Можно обновиться через pip.

      Поправленное описание с этой фичей вот тут: https://github.com/vb64/django.admin.geomap/blob/main/READMEru.md


  1. Gim6626
    19.09.2021 03:43

    Интересно, спасибо. Но видя заголовок про отображение и карты, я ожидал хотя бы один скриншот, как это собственно после настройки выглядит.


    1. vb64 Автор
      19.09.2021 10:10

      Я добавлял скриншот, когда делал пост в песочницу. Но после публикации он куда-то делся.

      Можно на странице проекта на гитхабе посмотреть:
      https://github.com/vb64/django.admin.geomap/blob/main/READMEru.md


  1. x-tray
    21.09.2021 02:20
    +1

    1. vb64 Автор
      21.09.2021 08:40

      Угу, я раньше тоже везде GoogleMaps использовал. Но там нужен аккаунт GoogleCloud с привязанной карточкой для оплаты, т.к. все API (в т.ч. и GoogleMaps) платные.

      Это не было большой проблемой, т.к. у каждого сервиса есть бесплатный лимит запросов, которого обычно вполне хватает на небольшую нагрузку. Плюс в админке GoogleCloud была замечательная настройка "максимальный суточный бюджет". При его превышении сервисы просто переставали работать до конца текущих суток, когда лимит сбрасывался и начинал считаться по новой.

      Но пару лет назад этот предохранитель убрали и ввели развесистый API для контроля объема использованных ресурсов по каждому сервису. Т.е. надо самому все это кодить и контролировать. Если за этим не следить, и не понимать, какие именно ресурсы и в каком объеме потребляет твой проект на GoogleCloud, то в конце месяца можно легко получить счет на сотни и тысячи USD для совершенно невинного на первый взгляд учебного проекта.

      Вообщем, GoogleCloud стал крайне жесток к новичкам. Поэтому рекомендовать его сейчас людям, ранее не имевшим дел с GoogleCloud, я бы не стал.


      1. x-tray
        26.09.2021 12:21

        ну тогда GeoDjango + leaflet и будет счастье


        1. vb64 Автор
          26.09.2021 12:50

          Про GeoDjango в начале своего поста написал. Тащить тяжелую артиллерию с ее списком зависимостей в маленький проект для простой задачи отображения значков на карте не всегда удобно.