Как изменить цвет слоя шейп-файла в карте Leaflet в Django Admin на основе значения поля?
Я работаю над проектом GeoDjango, в котором я отображаю слой shapefile в Leaflet map, встроенном в интерфейс Django Admin. Мне нужно динамически раскрашивать геометрию (поле geom) на карте, основываясь на значении другого поля в модели под названием mean_ctrl. Django Admin с полем Geom
Вот цветовая схема, которую я хочу реализовать:
def get_color(mean_ctrl):
if mean_ctrl < 60:
return "#38A800"
elif 60.1 <= mean_ctrl <= 120:
return "#55FF00"
elif 120.1 <= mean_ctrl <= 170:
return "#FFFF00"
elif 170.1 <= mean_ctrl <= 220:
return "#FFAA00"
elif 220.1 <= mean_ctrl <= 270:
return "#FF0000"
else:
return "#C500FF"
Я ищу руководство о том, как применить эту цветовую схему к полю Geom на карте Leaflet в админке Django. Любое руководство будет очень полезным! Спасибо.
Чтобы динамически применять цвета на основе поля mean_ctrl
в вашем проекте GeoDjango, вы можете настроить карту Leaflet в интерфейсе Django Admin. Вот как это можно сделать:
Переопределить виджет карты в Django Admin: Настройте виджет карты, используемый для отображения геометрии в интерфейсе администратора.
Добавьте JavaScript для отображения цветов: Используйте JavaScript в шаблоне администратора, чтобы раскрасить геометрии в соответствии с полем
mean_ctrl
.
Пошаговое решение
Создайте пользовательский виджет администратора: Определите пользовательский виджет, расширив
AdminGeoWidget
и добавив JavaScript для установки цвета на основеmean_ctrl
.from django.contrib.gis import admin from django.forms import widgets class ColoredAdminGeoWidget(admin.widgets.OSMWidget): template_name = 'custom_geo_widget.html'
Использование JavaScript для применения цветов: Создайте пользовательский файл шаблона для виджета
custom_geo_widget.html
и внедрите в него JavaScript, который будет динамически изменять стиль каждой геометрии в зависимости от ееmean_ctrl
значения.{% load static %} <link rel="stylesheet" href="{% static 'path/to/leaflet.css' %}" /> <script src="{% static 'path/to/leaflet.js' %}"></script> <script type="text/javascript"> function getColor(mean_ctrl) { if (mean_ctrl < 60) return "#38A800"; else if (mean_ctrl <= 120) return "#55FF00"; else if (mean_ctrl <= 170) return "#FFFF00"; else if (mean_ctrl <= 220) return "#FFAA00"; else if (mean_ctrl <= 270) return "#FF0000"; else return "#C500FF"; } document.addEventListener("DOMContentLoaded", function () { // Assuming each geometry has an associated mean_ctrl property L.geoJSON(geojson_data, { style: function(feature) { return { color: getColor(feature.properties.mean_ctrl) }; } }).addTo(map); }); </script>
- Замените
geojson_data
переменной, в которой хранятся данные геометрии в формате GeoJSON. - Убедитесь, что каждая геометрия в вашем GeoJSON включает поле
mean_ctrl
в разделеfeature.properties
.
- Замените
Модифицируйте форму администратора Django Admin Form: В админке вашей модели используйте этот виджет для поля геометрии.
from django.contrib import admin from .models import YourModel from .widgets import ColoredAdminGeoWidget class YourModelAdmin(admin.ModelAdmin): formfield_overrides = { 'geom': {'widget': ColoredAdminGeoWidget}, } admin.site.register(YourModel, YourModelAdmin)
Эта настройка будет динамически применять вашу цветовую схему на основе значений mean_ctrl
, улучшая визуализацию карты в Django Admin. Дайте мне знать, если вам нужна дополнительная помощь с JavaScript или настройкой Leaflet!