#1 Tue 31 March 2015 17:42
- kabou
- Participant occasionnel
- Date d'inscription: 13 Jun 2013
- Messages: 10
[Geoext] probléme avec la fonction save de commit
Bonjour,
J'utilise le tutoriel de geoext afin d'editer,créer et supprimer des données géométriques que je rajouter via wfs à mon shp ( sur geoserver).
j'utilise ce tuto :
http://girona-geoext-workshop.readthedo … /wfst.html
j'arrive donc à modifier des géométries , à en enlever...mais je n'arrive pas vraiment à enregistrer les nouvelles géométries : elles s'affichent sur la carte lorsque j'utilise le bouton de création ( avec la fonction drawfeature ) et je peux rajouter/modifier les attributs sur le editorgrid mais une fois j'utilise la fonction save . Pouf ! Il reste les attributs dans le vectorlayer mais pas de géométrie : Une explication ? Ca fait un petit bout de temps que je tourne en rond
le code :
Code:
Ext.onReady(function() {
//declarer le proxy cgi a utiliser
OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url=";
// [1] - layer
var lieu1 = new OpenLayers.Layer.WMS(
"lieunordtest"
,"geoserver/test1/wms?"
,{
//width: '426',
srs: 'EPSG:22391',
layers: 'lieunordtest',
//height: '1024',
//styles: style1',
format:'image/png',
isBaseLayer: true
}
);
// [1] - layer
var Info1 = new OpenLayers.Layer.WMS(
"Info_nord"
,"geoserver/test1/wms?"
,{
//width: '426',
srs: 'EPSG:22391',
layers: 'Info_nord',
//height: '1024',
styles: 'Nimp',
format:'image/png',
transparent: 'true'
//isBaseLayer: true
}
);
var mapUI = new GeoExt.MapPanel({
map: {
//niveau de zoom
numZoomLevels: 25,
//le systeme de projection par defaut est le 4326
//systeme de projection
//unité
//max extent
projection: "EPSG:22391",
units: 'm',
maxExtent: new OpenLayers.Bounds(512118, 383858, 541842, 409867),
controls: [
new OpenLayers.Control.Navigation()
,new OpenLayers.Control.PanPanel()
,new OpenLayers.Control.ZoomPanel(),
new OpenLayers.Control.MousePosition(),//renvoie la position de la souris
new OpenLayers.Control.LayerSwitcher(),//selectionnneur de couche
new OpenLayers.Control.SelectFeature,
new OpenLayers.Control.Snapping
]
}
,region : 'center'
,title : 'map'
,layers: [lieu1,Info1]
}
);
//ajout du vecteur a editer
var vectorLayer = new OpenLayers.Layer.Vector("Editable features");
mapUI.map.addLayer(vectorLayer);
//ajouter des controls
var modifyControl = new OpenLayers.Control.ModifyFeature(
vectorLayer, {autoActivate: true},{standalone: true}
);
var drawControl = new OpenLayers.Control.DrawFeature(
vectorLayer,
OpenLayers.Handler.Polygon,
{handlerOptions: {multi: true}}
);
mapUI.map.addControl(modifyControl);
mapUI.map.addControl(drawControl);
//modifyControl.activate();
vectorLayer.events.on({
featureselected: function(evt) { modifyControl.activate(); },
featureunselected: function(evt) { modifyControl.deactivate(); }
});
// [3] - Data Panel
var dataPanel = new Ext.Panel({
region : 'west'
,layout : 'fit'
,width : 150
});
var tab=[];
//tree panel
tab.push({
xtype: "treepanel",
ref: "tree",
region: "west",
width: 200,
autoScroll: true,
enableDD: true,
root: new GeoExt.tree.LayerContainer({
expanded: true
}),
bbar: [{
text: "Remove from Map",
handler: function() {
var node = app.tree.getSelectionModel().getSelectedNode();
if (node && node.layer instanceof OpenLayers.Layer.WMS) {
mapUI.map.removeLayer(node.layer);
}
}
}]});
// appeler les couches du stock pour les afficher
tab.push({
xtype: "grid",
ref: "capsGrid",
title: "Available Layers",
region: "north",
height: 150,
viewConfig: {forceFit: true},
store: new GeoExt.data.WMSCapabilitiesStore({
url: "geoserver/test1/wms?SERVICE=WMS&REQUEST=GetCapabilities&VERSION=1.1.1",
autoLoad: true
}),
columns: [
{header: "Name", dataIndex: "name", sortable: true},
{header: "Title", dataIndex: "title", sortable: true},
{header: "Abstract", dataIndex: "abstract"}
],
bbar: [{
text: "Add to Map",
handler: function() {
app.capsGrid.getSelectionModel().each(function(record) {
var clone = record.clone();
clone.getLayer().mergeNewParams({
format: "image/png",
transparent: true
});
mapUI.layers.add(clone);
mapUI.map.zoomToExtent(
OpenLayers.Bounds.fromArray(clone.get("llbbox"))
);
});
}
}]
});
// wfs affichage de store et synchronisation avec la map
tab.push({
xtype: "editorgrid",
ref: "featureGrid",
title: "Feature Table",
region: "south",
height: 150,
sm: new GeoExt.grid.FeatureSelectionModel(),
store: new GeoExt.data.FeatureStore({
fields: [
{name: "id", type: "string"},
{name: "name", type: "string"},
{name: "nom", type: "string"}
],
proxy: new GeoExt.data.ProtocolProxy({
protocol: new OpenLayers.Protocol.WFS({
version: "1.1.0",
url: "http://localhost:8081/geoserver/wfs",
featurePrefix: 'test1', //geoserver worspace name
featureType: "Info_nord", //geoserver Layer Name
srsName: "EPSG:22391",
featureNS: "test1", //
geometryName: "the_geometry" // field in Feature Type details with type "Geometry"
})
}),
autoLoad: true
}),
columns: [
{header: "id", dataIndex: "id", editor: {xtype: "textfield"}},
{header: "name", dataIndex: "name", editor: {xtype: "textfield"}},
{header: "nom", dataIndex: "nom", editor: {xtype: "textfield"}}
],
bbar:
[{
text: "Delete",
handler: function() {
app.featureGrid.store.featureFilter = new OpenLayers.Filter({
evaluate: function(feature) {
return feature.state != OpenLayers.State.DELETE;
}
});
app.featureGrid.getSelectionModel().each(function(rec) {
var feature = rec.getFeature();
//modifyControl.unselectFeature(feature);
vectorLayer.removeFeatures([feature]);
if (feature.state != OpenLayers.State.INSERT) {
feature.state = OpenLayers.State.DELETE;
vectorLayer.addFeatures([feature]);
}
});
}}, new GeoExt.Action({
control: drawControl,
text: "Create",
enableToggle: true
}),
{
text: "Save",
handler: function() {
app.featureGrid.store.proxy.protocol.commit(
vectorLayer.features, {
callback: function() {
var layers = mapUI.layers;
for (var i=layers.length-1; i>=0; --i) {
layers[i].redraw(true);
}
app.featureGrid.store.reload();
}
});
}
}]
});
//fonction qui lit les attributs de la couche
var rawAttributeData;
var read = OpenLayers.Format.WFSDescribeFeatureType.prototype.read;
OpenLayers.Format.WFSDescribeFeatureType.prototype.read = function() {
rawAttributeData = read.apply(this, arguments);
return rawAttributeData;
};
//fonction qui reconfigure les parametres de l'affichage du grid selon la selection du node
function reconfigure(store, url) {
var fields = [], columns = [], geometryName, geometryType;
// regular expression to detect the geometry column
var geomRegex = /gml:(Multi)?(Point|Line|Polygon|Surface|Geometry).*/;
// mapping of xml schema data types to Ext JS data types
var types = {
"xsd:int": "int",
"xsd:short": "int",
"xsd:long": "int",
"xsd:string": "string",
"xsd:dateTime": "string",
"xsd:double": "float",
"xsd:decimal": "float",
"Line": "Path",
"Surface": "Polygon"
};
store.each(function(rec) {
var type = rec.get("type");
var name = rec.get("name");
var match = geomRegex.exec(type);
if (match) {
// we found the geometry column
geometryName = name;
// Geometry type for the sketch handler:
// match[2] is "Point", "Line", "Polygon", "Surface" or "Geometry"
geometryType = types[match[2]] || match[2];
} else {
// we have an attribute column
fields.push({
name: name,
type: types[type]
});
columns.push({
xtype: types[type] == "string" ?
"gridcolumn" :
"numbercolumn",
dataIndex: name,
header: name,
// textfield editor for strings, numberfield for others
editor: {
xtype: types[type] == "string" ?
"textfield" :
"numberfield"
}
});
}
});
app.featureGrid.reconfigure(new GeoExt.data.FeatureStore({
autoLoad: true,
proxy: new GeoExt.data.ProtocolProxy({
protocol: new OpenLayers.Protocol.WFS({
url: url,
version: "1.1.0",
featureType: rawAttributeData.featureTypes[0].typeName,
featureNS: rawAttributeData.targetNamespace,
srsName: "EPSG:22391",
geometryName: geometryName,
//nombre de champ maximal a afficher
maxFeatures: 250
})
}),
fields: fields
}), new Ext.grid.ColumnModel(columns));
app.featureGrid.store.bind(vectorLayer);
app.featureGrid.getSelectionModel().bind(vectorLayer);
// Set the correct sketch handler according to the geometryType
drawControl.handler = new OpenLayers.Handler[geometryType](
drawControl, drawControl.callbacks, drawControl.handlerOptions
);
}
//appel de la fonction de changement d'attributs
function setLayer(model, node) {
if(!node || node.layer instanceof OpenLayers.Layer.Vector) {
return;
}
vectorLayer.removeAllFeatures();
app.featureGrid.reconfigure(
new Ext.data.Store(),
new Ext.grid.ColumnModel([])
);
var layer = node.layer;
var url = layer.url.split("?")[0]; // the base url without params
var schema = new GeoExt.data.AttributeStore({
url: url,
// request specific params
baseParams: {
"SERVICE": "WFS",
"REQUEST": "DescribeFeatureType",
"VERSION": "1.1.0",
"TYPENAME": layer.params.LAYERS
},
autoLoad: true,
listeners: {
"load": function(store) {
app.featureGrid.setTitle(layer.name);
reconfigure(store, url);
}
}
});
}
//appeler le popup, layers fixera les couches a afficher
info = new OpenLayers.Control.WMSGetFeatureInfo({
autoActivate: true,
//choisir les couches a afficher
layers: mapUI.map.layers,
infoFormat: "application/vnd.ogc.gml",
maxFeatures: 1,
eventListeners: {
"getfeatureinfo": function(e) {
var items = [];
Ext.each(e.features, function(feature) {
items.push({
xtype: "propertygrid",
title: feature.fid,
source: feature.attributes
});
});
new GeoExt.Popup({
title: "Feature Info",
width: 200,
height: 200,
layout: "accordion",
anchored: true,
map: mapUI.map,
location: e.xy,
items: items
}).show();
}
}
});
//rajouter le control popup
//mapUI.map.addControl(info);
//activer le popup
//info.activate();
//integrer la carte dans le tableau
tab.push(mapUI);
//interface finale
// [4] - Final User Interface
app=new Ext.Viewport({
layout: "border"
,items:tab
});
app.tree.getSelectionModel().on(
"selectionchange", setLayer
);
app.featureGrid.store.bind(vectorLayer);
app.featureGrid.getSelectionModel().bind(vectorLayer);
var sm = app.featureGrid.getSelectionModel();
sm.unbind();
sm.bind(vectorLayer);
sm.on("beforerowselect", function() { sm.clearSelections(); });
}); //EOF Ext.onReady
</script>
</head>
<body>
<div id="gxmap"></div>
</body>
</html>Merci !
Dernière modification par kabou (Tue 31 March 2015 17:44)
Hors ligne


