Geodjango OSMGeoAdmin:如何添加不同的图层

时间:2013-03-15 20:40:51

标签: django gis geodjango

我注意到Geodjango管理员的地图右边有一个菜单。

如何添加更多图层,而不仅仅是代表地图与管理员相关的模型字段的图层?

这是我的模型(model.py):

class Foresta(models.Model):

    nome = models.CharField("Nome", blank = False, max_length = 255)
    descrizione = tinymce_models.HTMLField("Descrizione", blank = True, help_text='Inserire una descrizione del bosco')
    slug = models.SlugField("Slug", blank = True)
    published = models.BooleanField("Pubblicato")
    ...

    coord = models.PointField("Coordinata punto foresta", blank = False)
    # GeoDjango-specific: a geometry field (MultiPolygonField), and
    # overriding the default manager with a GeoManager instance.
    mpoly = models.MultiPolygonField("Mappa foresta (poligono)", blank = False)
    objects = models.GeoManager()

这是我的管理模型(admin.py):

class ForestaAdmin(admin.OSMGeoAdmin):
    default_lon= 1308296
    default_lat= 5714101
    default_zoom= 9
    overlays = ('coord', 'mpoly')

我试过'覆盖'选项但没有成功!

2 个答案:

答案 0 :(得分:3)

您可以找到默认的OSMGeoAdmin设置here。不幸的是,看起来你不能像指定叠加元组一样简单。相反,您应该创建一个自定义地图模板,然后使用模板的路径覆盖ForestaAdmin类中的map_template选项。首先复制默认的openlayers模板,然后自定义javascript,将其他图层添加为其他OpenLayers Vector图层。

答案 1 :(得分:0)

您可以使用olwidget http://docs.olwidget.org/en/latest/django-olwidget.html。它允许您编辑和显示不同的层(Django管理员内部和外部)。但是,根据您运行的Django版本,您可能会发现很难使用它。

最后,我设法按照@garnetb的说法修改了(我的案例)中的openlayers.js文件:

/usr/local/lib/python2.7/dist-packages/django/contrib/gis/templates/gis/admin/openlayers.js

如果您无法找到它,只需在osm.html和/或openlayers.html中查找。所以,这是我设法添加第二层的方式。我的目标是添加一个" visual"只有图层,但如果要编辑控件,则可以轻松修改控件。所以,让我们假设你有一个像这样的模型:

class Lines(gis_models.Model):
name = gis_models.CharField(max_length=10)
geom = gis_models.MultiLineStringField(srid=4326)
geom_points = gis_models.MultiPointField(srid=4326, null=True)
objects = gis_models.GeoManager()
def __unicode__(self):
    return self.name

所以你看,有2个元素正在加载,第一个是行,第二个是点。所以我的目标是在我使用这些点时添加这些线作为视觉参考。为了能够做到这一点,请转到openlayers.js并查找定义基础层的部分并添加类似的内容。

// Base Layer
    {% if field_name != "geom" %}

    geom_layer = new OpenLayers.Layer.Vector("visual");
    {{ module }}.map.addLayer(geom_layer);
    var wkt_vis = document.getElementById('id_geom').value;
    if (wkt_vis){
        var features = {{ module }}.read_wkt(wkt_vis);
        geom_layer.addFeatures(features);
    }
    else {
        alert("no wkt id field");
    }   

{% endif %}

if ({{ module }}.is_point) {
    var style = new OpenLayers.Style({
        pointRadius : 4,
        strokeColor : 'red',
        strokeWidth : 2,
        strokeOpacity : 1,
        fillColor : 'white',
        fillOpacity : 1
    });

    var layer_style = new OpenLayers.StyleMap({
        'default' : style,
    });
    {{ module }}.layers.vector = new OpenLayers.Layer.Vector(" {{ field_name }}", {styleMap : layer_style});
}
else {
    {{ module }}.layers.vector = new OpenLayers.Layer.Vector(" {{ field_name }}");
}

正如您所看到的,整个想法是为每个图层加载了openlayers.js,但您仍然可以访问其他对象。这个配置给我留下了一个方便的管理员,我在这里显示了两张地图。在第一个中,我展示了线条,我可以修改它们。在第二个中,我将线条显示为参考,并且这些点是可编辑的。第二部分向您展示如何设置点样式(以防万一......)这只是一个简化的例子。如果您需要更多详细信息,请告诉我们。我还设法添加了一个"删除功能"控制。我只使用基于Django 1.6的GeoDjango来尝试这个,但是它应该与其他版本一起使用,只要它们以相同的方式使用openlayers.js。