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