Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB