[OpenLayers-Trac] Problem with select feature and modify feature

armstrong1985 at libero.it armstrong1985 at libero.it
Thu Jun 28 03:10:23 PDT 2012


Good morning.
 I have a problem with the controls and SelectFeature ModifyFeature.
 If I edit a feature and I click outside of the same feature, the selection control does not trigger more events.
 I tried to update to new version of OpenLayers 2.12, but this does not work no more. This is my code:    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); 
}
Where is the problem?Thanks in advance
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/openlayers-trac/attachments/20120628/7613a615/attachment.html>


More information about the Trac mailing list