Buongiorno.Volevo chiedere cortesemente aiuto nel risolvere un problema in cui 
mi sono imbatutto.Mi spiego brevemente. L'appliazione è stata sviluppata lato 
client facendo ricorso a OpenLayers,mentre il server con Django con 
l'estensione GeoDjango per dialogare con il database PostGIS sottostante.L'idea 
era di salvare questi poligono e di associarci un nome. Quindi qual è la 
procedura (per ora un po' arzigogolata):disegnato il poligono facendo click 
sull'oggetto stesso, appare un popup per l'inserimento del nome, 
quindicliccando sul classico pulsante di salvataggio di OpenLayers viene fatta 
una chiamata post ajax con jQuery,che passa la descrizione del poligono in WKT 
e il server provvede a memorizzarla sul dB.Tutto funziona bene se non che, se 
prima di salvare il poligono con il tasto salva, provo a modificarlo con la 
ModifyFeaturedi
 OpenaLayers, la selezione dell'oggetto non fuziona più! Questo accade 
tra l'altro solo se esco dalla modalità di modifica poligonocliccando 
all'esterno dello stesso! In caso contrario ciò non accade.Sembra essere un 
problema legato alla logica di OpenLayers, che chissa cosa combina quando passo 
dalla SelectFeature allaModifyFeature e viceversa. Posto il codice in questione 
dove sono presenti i controlli.

Ciao e grazie
Fabio Benevento
var map_overlays = [];
var map, vectorLayer;

var out_options = {
                'internalProjection': new OpenLayers.Projection("EPSG:900913"),
                'externalProjection': new OpenLayers.Projection("EPSG:4326")
            };
var format = new OpenLayers.Format.WKT(out_options);

var lat=41.932
var lon=12.420
var zoom=6

function onPopupClose(evt) {
	selectControl.unselect(selectedFeature);
}
function onFeatureSelect(feature) {
	selectedFeature = feature;
	popup = new OpenLayers.Popup.FramedCloud("chicken",
	feature.geometry.getBounds().getCenterLonLat(),
	null,
	'Nome oggetto: <input id=\'name_polygon\' value="'+nome_poligono+'">',
	null, true, onPopupClose);
	feature.popup = popup;
	map.addPopup(popup);
}
function onFeatureUnselect(feature) {
	map.removePopup(feature.popup);
	feature.popup.destroy();
	feature.popup = null;
} 

var DeleteFeature = OpenLayers.Class(OpenLayers.Control, {
    initialize: function(layer, options) {
        OpenLayers.Control.prototype.initialize.apply(this, [options]);
        this.layer = layer;
        this.handler = new OpenLayers.Handler.Feature(
            this, layer, {click: this.clickFeature}
        );
    },
    clickFeature: function(feature) {
        // if feature doesn't have a fid, destroy it
        if(feature.id == undefined) {
            this.layer.destroyFeatures([feature]);
        } else {
            feature.state = OpenLayers.State.DELETE;
            this.layer.events.triggerEvent("afterfeaturemodified", 
                                           {feature: feature});
            feature.renderIntent = "select";
            this.layer.drawFeature(feature);
        }
    },
    setMap: function(map) {
        this.handler.setMap(map);
        OpenLayers.Control.prototype.setMap.apply(this, arguments);
    },
    CLASS_NAME: "OpenLayers.Control.DeleteFeature"
});

var SaveFeature = OpenLayers.Class(OpenLayers.Control, {
    initialize: function(layer, options) {
        OpenLayers.Control.prototype.initialize.apply(this, [options]);
        this.layer = layer;
        this.handler = new OpenLayers.Handler.Feature(
            this, layer, {click: this.clickFeature}
        );
    },
    clickFeature: function(feature){
					serialize(feature);
					if(feature.inserted == OpenLayers.State.INSERT){
						if (!feature.style) {
							feature.style = OpenLayers.Util.extend({}, 
											OpenLayers.Feature.Vector.style["default"]);
										}
						feature.style.fillColor = "#FF0000";
						this.layer.redraw();
					}
	},
    setMap: function(map) {
        this.handler.setMap(map);
        OpenLayers.Control.prototype.setMap.apply(this, arguments);
    },
    CLASS_NAME: "OpenLayers.Control.SaveFeature"
});


var size = new OpenLayers.Size(21,25);
var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
var icon = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker-blue.png', size, offset);
var markers;

		
// ***
// *** Map
// ***
function map_init() {
	 map = new OpenLayers.Map ("map", {
            controls:[ 
			new OpenLayers.Control.Navigation(),
                       new OpenLayers.Control.PanZoomBar(),
                       new OpenLayers.Control.ScaleLine(),
                       new OpenLayers.Control.Permalink('permalink'),
                       new OpenLayers.Control.MousePosition(),                    
                       new OpenLayers.Control.Attribution()
				      ],
				maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
                maxResolution: 156543.0399,
                numZoomLevels: 19,
                units: 'm',
            projection: new OpenLayers.Projection("EPSG:900913"),
            displayProjection: new OpenLayers.Projection("EPSG:4326")
            } );
			
			var wmsLayer = new OpenLayers.Layer.WMS("OpenLayers WMS", "http://vmap0.tiles.osgeo.org/wms/vmap0";, {layers:"basic"});
			   
			// Google Layers          
			var gmap = new OpenLayers.Layer.Google("Google Map", {sphericalMercator:true, numZoomLevels: 21});
            var gphy = new OpenLayers.Layer.Google("Google Physical", {type: google.maps.MapTypeId.TERRAIN,sphericalMercator:true, numZoomLevels: 16} );
			var gsat = new OpenLayers.Layer.Google("Google Satellite", {type: google.maps.MapTypeId.SATELLITE, sphericalMercator:true,numZoomLevels: 21} );
 
			// Bing Maps layers
			var aerial = new OpenLayers.Layer.VirtualEarth("Bing Satellite", {type: VEMapStyle.Aerial, sphericalMercator:true, numZoomLevels: 19});
			var shaded = new OpenLayers.Layer.VirtualEarth("Bing Map", {type: VEMapStyle.Shaded, sphericalMercator:true, numZoomLevels: 21});
 
			// Yahoo layers
			var yahoosat = new OpenLayers.Layer.Yahoo("Yahoo Satellite",{'type': YAHOO_MAP_SAT, 'sphericalMercator': true,  numZoomLevels:18 });
			var yahoostreet = new OpenLayers.Layer.Yahoo( "Yahoo Street", { 'sphericalMercator': true, numZoomLevels:18 } );
 
			vectorLayer = new OpenLayers.Layer.Vector("Poligoni", {sphericalMercator:true});
			
			markers = new OpenLayers.Layer.Markers( "Markers" , {sphericalMercator:true});

 
		map.addLayers([ gmap,gphy,gsat,yahoosat,yahoostreet,aerial,shaded,wmsLayer,markers,vectorLayer ] );
 
		
	 selectControl = new OpenLayers.Control.SelectFeature(vectorLayer,
                {onSelect: onFeatureSelect, onUnselect: onFeatureUnselect, clickout: true});
	map.addControl(selectControl);
	selectControl.activate();
	
	vectorLayer.events.on({
						  'beforefeaturemodified': function(evt) {
							  console.log("Selected " + evt.feature.id  + " for modification");
						  },
						  'afterfeaturemodified': function(evt) {
						  if(is_int(evt.feature.id)){
							  if(evt.feature.state == OpenLayers.State.DELETE){
									delete_stored_feature_polygon(evt.feature.id);
							  } 
							  else {
									var str = format.write(evt.feature);
									modify_stored_feature_polygon(str, evt.feature.id);
							  }
						  }
					}
	});
	
       var panel = new OpenLayers.Control.Panel({
        displayClass: 'customEditingToolbar',
        allowDepress: true
    });
    
    var draw = new OpenLayers.Control.DrawFeature(
        vectorLayer, OpenLayers.Handler.Polygon,
        {
            title: "Draw Feature",
            displayClass: "olControlDrawFeaturePolygon",
        }
    );
    
    var edit = new OpenLayers.Control.ModifyFeature(vectorLayer, {
        title: "Modify Feature",
        displayClass: "olControlModifyFeature",
		stopSingle: false
    });

    var del = new DeleteFeature(vectorLayer, {
		title: "Delete Feature",
		displayClass: "olControlDeleteFeature"
	});
   
    var save = new SaveFeature(vectorLayer, {
		title: "Save Feature",
		displayClass: "olControlSaveFeature"
	});
	
	var navControl = new OpenLayers.Control.Navigation({title: 'Pan/Zoom'});

    panel.addControls([del, save, draw, edit, navControl]);
	panel.defaultControl = navControl;
    map.addControl(panel);
	
	
	map.addControl(new OpenLayers.Control.LayerSwitcher());


 
        var lonLat = new OpenLayers.LonLat( lon ,lat )
          .transform(
            new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
            map.getProjectionObject() // to Spherical Mercator Projection
          );
 
		
		map.setCenter (lonLat, zoom); 
}

_______________________________________________
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
Non inviate messaggi commerciali.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.
599 iscritti al 30.6.2012

Rispondere a