Как изменить уровень масштабирования карты по умолчанию в админке Geo django? - PullRequest
5 голосов
/ 05 мая 2020

Недавно я изучал Geo Django, я изо всех сил пытаюсь настроить уровень масштабирования по умолчанию для карты openstreet, отображаемой в моем разделе администратора. Ниже представлено то, что я пробовал, но безрезультатно, пожалуйста, помогите.

from django.contrib.gis import admin

class LocationAdmin(admin.OSMGeoAdmin):
    default_zoom = 5

admin_site.register(ReferenceSpaceLocation, LocationAdmin)
  • Моя модель

    class ReferenceSpaceLocation(models.Model):
    
        geometry = models.GeometryField()
    

enter image description here

1 Ответ

4 голосов
/ 13 мая 2020

Ваше значение c case

Значение по умолчанию для point_zoom с OSMGeoAdmin - 14, что похоже на ваше текущее значение. Попробуйте перезаписать point_zoom в LocationAdmin. Как объясняется ниже, это должно работать, если вы используете PointField или MultiPointField.

Как будет определяться уровень масштабирования:

Уровень масштабирования по умолчанию будет зависеть от нескольких разных факторов:

  • Если нет данных для отображения (например, вы смотрите на новый экземпляр), будет использоваться default_zoom. Это можно установить следующим образом:
class LocationAdmin(admin.OSMGeoAdmin):
    default_zoom = 5
  • Если мы используем поля PointField или MultiPointField, тогда похоже, что вместо point_zoom будет использоваться значение default_zoom. Это может быть установлено следующим образом:
class LocationAdmin(admin.OSMGeoAdmin):
    point_zoom = 10
  • В противном случае уровень масштабирования будет установлен автоматически в зависимости от границ данных.

Почему в этом случае?

Если вы посмотрите исходный код, вы увидите следующее в js файле, который запускает это представление администратора:

// django/contrib/gis/templates/gis/admin/openlayers.js

    var wkt = document.getElementById('{{ id }}').value;
    if (wkt){
        ...

        // Zooming to the bounds.
        {{ module }}.map.zoomToExtent(admin_geom.geometry.getBounds());
        if ({{ module }}.is_point){
            {{ module }}.map.zoomTo({{ point_zoom }});
        }
    } else {
        {% localize off %}
        {{ module }}.map.setCenter(new OpenLayers.LonLat({{ default_lon }}, {{ default_lat }}), {{ default_zoom }});
        {% endlocalize %}
    }

Это означает, что:

  • если мы не имеем дело с данными, то мы находимся в предложении else в приведенном выше коде. В самом конце строки видно, что используется default_zoom.
  • Если мы используем поля PointField или MultiPointField, то {{module}}.is_point истинно, и, как видно, point_zoom.
  • Если ни одно из вышеперечисленных случаев не выполняется, мы видим, что выполняется следующее: zoomToExtent(admin_geom.geometry.getBounds()).
...