#1 Tue 04 June 2013 15:25
- Geo
- Participant occasionnel
- Lieu: Liège (Belgique)
- Date d'inscription: 18 Sep 2007
- Messages: 27
[GeoExt-GeoServer] - Sauver modification suite à WPS
Bonjour à tous,
Ce post pour faire remonter l'implémentation de la fonction "Split polygon" dans une application GeoExt et pour vous poser une question a posteriori
Je développe une application WebGIS avec Geoserver (2.1.1) et GeoExt (OL 2.12). Mes données sont stockées dans une BD Postgis (1.5)
J'ai récemment eu besoin d'implémenter un outil permettant de spliter des polygones en plusieurs parties via cette application. En suivant la documentation (http://blog.opengeo.org/2012/07/24/spli … rocess-p2/) je me suis tourné vers les WPS (via le process gs:SplitPolygon) pour réaliser cette opération.
La fonction marche très bien dans mon application. Le process renvoie bien une réponse sous forme WKT et remplace visuellement les polygones d’origine par les polygones splittés. Je vous mets le code en espérant que cela puisse aide quelqu'un
Les fonctions:
Code:
/********************************************************************************** * Split control ********************************************************************************/ function handleSplitDraw(event) { var splitter = event.feature; var features = map.layers[2].features; var candidates = OpenLayers.Array.filter(map.layers[2].features, function(feature) { var hit = false; if (feature.geometry.intersects(splitter.geometry)) { hit = true; } return hit; }); var candidate; for (var i=0, ii=candidates.length; i<ii; ++i) { candidate = candidates[i]; if (candidate.geometry.intersects(splitter.geometry)) { map.layers[2].removeFeatures([candidate]); executeSplit(candidate, splitter); } } return false; } // Construct and issue the WPS execute request. var wktFormat = new OpenLayers.Format.WKT(); var wpsFormat = new OpenLayers.Format.WPSExecute(); function executeSplit(poly, line) { //This data structure can be derived from the DescribeProcess request. var doc = this.wpsFormat.write({ identifier: "gs:SplitPolygon", dataInputs: [{ identifier: "polygon", data: { complexData: { mimeType: "application/wkt", value: wktFormat.write(poly) } } }, { identifier: "line", data: { complexData: { mimeType: "application/wkt", value: wktFormat.write(line) } } }], responseForm: { rawDataOutput: { mimeType: "application/wkt", identifier: "result" } } }); // Post the request and expect success. Failure case could be handled. OpenLayers.Request.POST({ url: "http://localhost:8080/geoserver/wps", data: doc, success: function(response) { handleSuccess(response, poly); } }); } /** * When response comes in, parse it as WKT and replace the split features with * results. If the response doesn't contain WKT (no split), add back the * original feature that was removed above. */ function handleSuccess(response, poly) { var features = wktFormat.read(response.responseText); if (features && features.length > 0) { map.layers[2].addFeatures(features); } else { // map.layers[1].addFeatures([poly]); } }
Les contrôles
Code:
var drawLine = new OpenLayers.Control.DrawFeature( map.layers[2], OpenLayers.Handler.Path ); mapPanel.map.addControls(drawLine]);
Et la définition du WFS
Code:
saveStrategy = new OpenLayers.Strategy.Save(); wfs_layer = new OpenLayers.Layer.Vector( "Editable plot Layer", { styleMap: WFSStyle, eventListeners: { sketchcomplete: function(event) { var proceed = true; if (event.feature.geometry instanceof OpenLayers.Geometry.LineString) { handleSplitDraw(event); proceed = false; } return proceed; } }, visibility: false, strategies: [new OpenLayers.Strategy.BBOX(), saveStrategy], projection: new OpenLayers.Projection("EPSG:4326"), protocol: new OpenLayers.Protocol.WFS({ version: "1.1.0", url: "note_url", featureNS : "FNS", featureType: "fname", geometryName: "the_geom", extractAttributes: true, schema: "myschema" }) } ),
Je cherche maintenant à enregistrer les modifications géométriques apportées aux polygones à leur division. Pour l'ajout, la suppression et les modifications géométriques classiques (ajout ou modification à partir de vertex), je sauve les modifications par la définition d'un "SaveStrategy". Malheureusement, les modifications apportées suite au WPS ne sont pas repercutées et je ne vois pas comment faire a priori pour les enregistrer de façon permanente.
Quelqu'un a-t-il un retour d'expérience par rapport à ce problème?
Merci
Geoffroy
Hors ligne