Suite

Mise à jour vers GeoServer/Oracle depuis OpenLayers ?

Mise à jour vers GeoServer/Oracle depuis OpenLayers ?


J'ai suivi l'exemple pour configurer une transaction WFS avec succès :

http://dev.openlayers.org/examples/wfs-protocol-transactions.html

Mon environnement est GeoServer 2.6.1/OpenLayers 2.12.1. Je reçois les 4 icônes de la barre d'outils dans le coin supérieur droit. (dessiner, modifier, supprimer, enregistrer). J'ai utilisé une couche connectée à une table oracle dans le géoserveur en tant que couche modifiable.

Maintenant, lorsque je clique sur le bouton "Enregistrer", cela n'ajoute pas d'enregistrement à cette table. Bien sûr, je ne m'y attendais pas car il ne sait même pas quelle valeur clé je veux mettre (en tant que customerid) lorsqu'il crée un nouvel enregistrement avec des données de caractéristique ; il ne sait pas non plus quel enregistrement mettre à jour la géométrie car il s'agit d'une valeur clé existante (ID client). Le calque modifiable que j'ai créé sur la base du lien ci-dessus est :

// Couche VECTOR éditable par les clients var saveStrategy = new OpenLayers.Strategy.Save(); clients = new OpenLayers.Layer.Vector("Customers", { stratégies : [new OpenLayers.Strategy.BBOX(), saveStrategy], projection : new OpenLayers.Projection("EPSG:2236"), protocole : new OpenLayers.Protocol. WFS({ version : "1.1.0", srsName : "EPSG:2236", url : "http://server01:8085/geoserver/sf/wfs", featurePrefix : "sf", featureType : "customers", featureNS : "http://a.org/layers01", geometryName : "GEOMETRIE" }) });

La table Oracle elle-même comporte les champs suivants :

-customerId -geometry -date_updated

Comment effectuer des insertions via openlayers/geoserver/jusqu'à la table Oracle ? (Pour inclure la valeur clé et la géométrie, etc.) J'aimerais que l'exemple ci-dessus enregistre réellement la géométrie dans un enregistrement spécifique de la table. Je ne sais pas comment procéder à ce sujet.


Je suis capable de faire des inserts ! Il crée un nouveau customerId avec une géométrie correcte. Cependant, il incrémente la clé primaire de un, mais ignore la valeur que je place dans added_feature.attributes.customerId pour une nouvelle clé customerId. Et je n'arrive pas du tout à le mettre à jour.

J'ai défini le customerId dans la méthode FeatureAdded et défini l'état sur OpenLayers.State.UPDATE. J'ai également vérifié que le customerId que j'ai placé dans la variable add_feature.attributes.customerId existe dans la table. Voici l'erreur que j'obtiens lorsque j'essaye une mise à jour :

java.lang.RuntimeException : L'analyse a échoué pour FeatureId : java.lang.NullPointerException L'analyse a échoué pour FeatureId : java.lang.NullPointerException

Je n'ai pas essayé la combinaison de Geoserver et d'Oracle, mais je suppose que le WFS-T devrait fonctionner comme il le fait lorsque j'utilise PostGIS comme base de données.

Tout d'abord, je pense que vous devriez découvrir POURQUOI vos fonctionnalités ne sont pas stockées (contraintes NOT NULL violées, contraintes de vérification ou quelque chose comme ça). Dans votre interface Web Geoserver, vous pouvez vérifier que dans la section "Services-->WFS", le niveau de service est défini sur transactionnel ou complet.

Dans votre javascript, vous pouvez enregistrer des événements pour votre stratégie de sauvegarde pour en savoir plus quand la stratégie de sauvegarde est déclenchée, quand elle échoue et quand elle peut être sauvegardée avec succès :

var saveStrategy = new OpenLayers.Strategy.Save(); function showSuccessMsg(e){ console.log("Transaction terminée avec succès"); //console.log(e); } fonction showFailureMsg(e){ alert(e.response.error.exceptionReport.exceptions[0].texts[0]); //console.log(e); } function saveStart(event) { console.log('save layer start'); } saveStrategy.events.register("success",", showSuccessMsg); saveStrategy.events.register('start', null, saveStart); saveStrategy.events.register('fail', null, showFailureMsg);

Bien sûr, vous devriez également jeter un œil à vos outils de débogage (par exemple firebug pour voir dans la console ou l'onglet réseau ce qui se passe) Et enfin, vous pouvez consulter les fichiers journaux de votre SGBD.

Si vous savez pourquoi vous ne pouvez pas enregistrer, vous pouvez adapter votre code afin de définir les attributs que vous souhaitez enregistrer. Pour insérer de nouvelles fonctionnalités, vous pouvez par exemple enregistrer la fonctionnalité ajoutée-événement pour obtenir la fonctionnalité ajoutée et définir ses attributs :

var draw = new OpenLayers.Control.DrawFeature( wfs, OpenLayers.Handler.Polygon, { title: "Draw Feature", displayClass: "olControlDrawFeaturePolygon", multi: true } ); draw.events.register("featureadded",", FeatureAdded); function FeatureAdded(object){ console.log('feature added'); var added_feature = object.feature; added_feature.state = OpenLayers.State.INSERT; // la version statique doit être remplacée par l'interaction utilisateur.add_feature.attributes.customerId = 42442;} map.addControl(draw);

Si vous avez défini les propriétés que vous devez définir, vous pouvez déclencher la stratégie de sauvegarde (ce qui est fait lorsque vous cliquez sur le bouton de sauvegarde)

saveStrategy.save();

Comme étapes suivantes, vous pouvez utiliser des moyens plus dynamiques pour attribuer les attributs (par exemple, textfields et document.getElementById.innerHTML)

Si tout cela fonctionne bien, vous pouvez utiliser le modifyfeature-control pour mettre à jour la géométrie et les attributs. Si vous mettez à jour des entités, n'oubliez pas de définir l'état de la fonctionnalité sur OpenLayers.State.UPDATE


Voir la vidéo: GeoServer Web GIS: Web Map Tile Service WMTS Publishing with PostGIS EN