2013-03-15 3 views
1

Geodjango 관리자의지도에는 오른쪽 메뉴가 있습니다.Geodjango OSMGeoAdmin : 다른 레이어를 추가하는 방법

관리자가 맵과 관련된 모델 필드를 나타내는 레이어보다 더 많은 레이어를 추가하려면 어떻게해야합니까?

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

내가 '오버레이'옵션을하지만 성공하지 않고 시도 : 이것은 내 관리 모델 (admin.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() 

:

내 모델 (model.py)입니다 !

답변

1

기본 OSMGeoAdmin 설정 here을 찾을 수 있습니다. 불행히도, 오버레이 튜플을 지정하는 것만 큼 간단하게이 작업을 수행 할 수있는 것처럼 보이지 않습니다. 대신 사용자 지정지도 서식 파일을 만든 다음 ForestaAdmin 클래스의 map_template 옵션을 서식 파일의 경로로 재정의해야합니다. 먼저 기본 openlayers 템플릿을 복사하고 자바 스크립트를 사용자 정의하여 다른 레이어를 추가 OpenLayers Vector 레이어로 추가하십시오.

0

olwidget http://docs.olwidget.org/en/latest/django-olwidget.html을 사용할 수 있습니다. 그것은 당신이 편집하고 다른 레이어 (내부 및 외부 장고 관리자)를 표시 할 수 있습니다. 그러나 실행중인 Django 버전에 따라 사용하기 어려울 수도 있습니다.

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

당신이 단지에서 찾아 찾을 수없는 경우 :

마지막으로, 나는 여기에 (내 경우)에있는 openlayers.js 파일을 수정하여 말했다 @garnetb로 할 관리 osm.html 및/또는 openlayers.html. 그래서 이것은 제가 두 번째 레이어를 추가하는 방법입니다. 내 목표는 "시각적 인"유일한 레이어를 추가하는 것이었지만 편집하려는 경우 컨트롤을 쉽게 수정할 수 있습니다. 그래서,이 같은 모델이 가정하자 :

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 

그래서 당신이 볼을 부하되는 두 요소가, 첫 번째는 선이고 두 번째는 점이다. 그래서 제 목표는 포인트로 작업 할 때 라인을 시각적 인 참조로 추가하는 것입니다. 이를 수행하려면 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를 사용하는 한 다른 버전에서도 작동합니다.

관련 문제