我注意到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')
我试过'覆盖'选项但没有成功!
答案 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。