Suite

Erreur lors de l'enregistrement de l'attribut d'entité avec Openlayers


J'essaie OpenLayers.Control.GetFeature pour obtenir la fonctionnalité de la couche WFS :

function editTool() { var edit = new OpenLayers.Control.GetFeature({ protocole : OpenLayers.Protocol.WFS.fromWMSLayer(Vidagis.CurrentMap.map.layers[1]), clic : true, box : true, multipleKey : "shiftKey ", toggleKey: "ctrlKey" }, { displayClass: 'pan no-follow', allowDepress: true }); edit.events.register("featureselected", this, function (e) { currentFeature = e.feature; // obtenir la fonctionnalité de gestionnaire actuelle changeHtmlForm(storeFeature(e)); unlockUpdate(storeFeature(e).data); $( function () { $("#smalldialog").dialog({ position: { my: 'right', at: 'right' }, maxHeight: 400, maxWidth: 300, autoOpen: false, show: { effect: "blind ", durée : 1000 }, masquer : { effet : "exploser", durée : 1000 } }); $("#smalldialog").dialog("open"); }); }); retourner l'édition ; // retourne le contrôle d'édition }

cela fonctionne bien et je peux obtenir des attributs de fonction à partir de l'événement featureselected. maintenant j'attribue des valeurs à currentFeature

CurrentFeature = e.feature;

Ensuite, j'écris une fonction pour modifier les attributs currentFeature

// Modifier les attributs d'entité function setFeatureAttributes(e) { e.attributes['code_2004'] = 124; retour e; }

enfin, fonction de sauvegarde

function UpdateFeature() { var feature=setFeatureAttribute(currentFeature); feature.state = OpenLayers.State.UPDATE; saveStrategy.save([fonctionnalité]); }

Déclarer la variable :

var currentFeature; var saveStrategy = new OpenLayers.Strategy.Save(); // déclencher l'événement de sauvegarde saveStrategy.events.on({ 'success': function (event) { alert('Changes save'); }, 'fail': function (event) { alert('Error! Changes not save') ; }, portée : ceci });

Mais lorsque j'appelle le navigateur UpdateFeature(), signalez l'erreur

Uncaught TypeError : impossible de lire la propriété 'projection' de null

Comment puis-je le réparer?


Vous avez une faute de frappe dans votre code :

var feature=setFeatureAttribute(currentFeature);

vous appelez setFeatureAttribute mais votre fonction s'appelle setFeatureAttributes

function setFeatureAttributes(e) {

En dehors de cela, je n'ai jamais utilisé saveStrategy sans utiliser une couche WFS auparavant. Ce qui fonctionne vraiment, c'est d'ajouter la fonctionnalité que vous obtenez de votre contrôle à une couche WFS filtrée et d'utiliser savesStrategy pour cette couche. Je viens de faire un petit essai et ça marche :

//var wms= // votre couche wms… var QueryFilter=new OpenLayers.Filter.Comparison({ type : OpenLayers.Filter.Comparison.EQUAL_TO, propriété : "code_2004", valeur : "-1" // quelque chose qui fait n'existe pas dans votre ensemble de données }); wfs= new OpenLayers.Layer.Vector("Editable Features", { stratégies : [new OpenLayers.Strategy.BBOX(), saveStrategy], projection : // votre protocole de projection : // votre protocole, filtre : QueryFilter // Important : filtrer pour avoir un calque vide }); map.addLayers([wms_layer ,wfs]); function editTool() { var edit = new OpenLayers.Control.GetFeature({ protocole : OpenLayers.Protocol.WFS.fromWMSLayer(wms_layer), click : true, box : true, multipleKey : "shiftKey", toggleKey : "ctrlKey", formatOptions : { outputFormat : "text/xml" }, featureType : 'polygons', featurePrefix : 'your prefix', geometryName : 'geom', maxFeatures : 10 }, { displayClass : 'pan no-follow', allowDepress : true }) ; edit.events.register("clickout", this, function(e) { // AJOUTER UNE FONCTIONNALITÉ À LA COUCHE WFS wfs.removeFeatures([e.feature]); }); edit.events.register("featureselected", this, function (e) { currentFeature = e.feature; // obtenir la fonctionnalité de gestionnaire actuelle // SUPPRIMER LA COUCHE DE WFS_LAYER wfs.addFeatures([currentFeature]); //changeHtmlForm(storeFeature (e)); //unlockUpdate(storeFeature(e).data); //console.log(currentFeature.attributes); //setFeatureAttributes(currentFeature); $(function () { $("#smalldialog").dialog ({ position : { my : 'right', at : 'right' }, maxHeight : 400, maxWidth : 300, autoOpen : false, show : { effect : "blind", duration : 1000 }, hide : { effect : " exploser", durée : 1000 } }); $("#smalldialog").dialog("open"); }); }); map.addControl(modifier); edit.activate(); //retourne l'édition ; // renvoie le contrôle d'édition } function setFeatureAttributes(e) { //e.attributes['gfname'] = 124; e.attributes['gfname'] = prompt("quel attribut voulez-vous enregistrer ?"); //console.log(e); retour e; } function UpdateFeature() { var feature=setFeatureAttributes(currentFeature); console.log(fonction); feature.state = OpenLayers.State.UPDATE; saveStrategy.save( //[fonctionnalité] ); }