如何在 Geodjango 的管理员中更改地图的默认缩放级别?

chr*_*mbo 6 django django-admin geodjango openstreetmap

我最近一直在研究 GeoDjango,我正在努力自定义管理部分中显示的 openstreet 地图的默认缩放级别。以下是我尝试过的,但没有效果,请帮助。

from django.contrib.gis import admin

class LocationAdmin(admin.OSMGeoAdmin):
    default_zoom = 5

admin_site.register(ReferenceSpaceLocation, LocationAdmin)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Tim*_*Tim 5

您的具体情况

point_zoomwith的默认值OSMGeoAdmin是 14,这就是你现在的样子。尝试覆盖point_zoomLocationAdmin。如下所述,如果您正在使用PointFieldMultiPointField

如何确定缩放级别:

默认缩放级别将取决于几个不同的事情:

  • 如果没有要显示的数据(例如,您正在查看一个新实例),default_zoom则将使用 。这可以设置如下:
class LocationAdmin(admin.OSMGeoAdmin):
    default_zoom = 5
Run Code Online (Sandbox Code Playgroud)
  • 如果我们正在使用这些字段PointFieldMultiPointField那么看起来point_zoom将使用该值而不是default_zoom. 这可以设置如下:
class LocationAdmin(admin.OSMGeoAdmin):
    point_zoom = 10
Run Code Online (Sandbox Code Playgroud)
  • 否则,缩放级别将根据数据的边界自动设置。

为什么会这样?

如果您查看源代码,您将在运行该管理视图的 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 %}
    }
Run Code Online (Sandbox Code Playgroud)

这意味着:

  • 如果我们没有处理任何数据,那么我们就在上面代码的 else 子句中。就在行尾,可以看到default_zoom被使用了。
  • 如果我们使用字段PointFieldor MultiPointFieldthen{{module}}.is_point为真,并且可以看出point_zoom是使用。
  • 如果没有上述情况下,我们可以看到以下规则执行:zoomToExtent(admin_geom.geometry.getBounds())