WFS.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
  2. * full list of contributors). Published under the 2-clause BSD license.
  3. * See license.txt in the OpenLayers distribution or repository for the
  4. * full text of the license. */
  5. /**
  6. * @requires OpenLayers/Format/GML.js
  7. * @requires OpenLayers/Console.js
  8. * @requires OpenLayers/Lang.js
  9. */
  10. /**
  11. * Class: OpenLayers.Format.WFS
  12. * Read/Write WFS.
  13. *
  14. * Inherits from:
  15. * - <OpenLayers.Format.GML>
  16. */
  17. OpenLayers.Format.WFS = OpenLayers.Class(OpenLayers.Format.GML, {
  18. /**
  19. * Property: layer
  20. * {<OpenLayers.Layer>}
  21. */
  22. layer: null,
  23. /**
  24. * APIProperty: wfsns
  25. * {String}
  26. */
  27. wfsns: "http://www.opengis.net/wfs",
  28. /**
  29. * Property: ogcns
  30. * {String}
  31. */
  32. ogcns: "http://www.opengis.net/ogc",
  33. /**
  34. * Constructor: OpenLayers.Format.WFS
  35. * Create a WFS-T formatter. This requires a layer: that layer should
  36. * have two properties: geometry_column and typename. The parser
  37. * for this format is subclassed entirely from GML: There is a writer
  38. * only, which uses most of the code from the GML layer, and wraps
  39. * it in transactional elements.
  40. *
  41. * Parameters:
  42. * options - {Object}
  43. * layer - {<OpenLayers.Layer>}
  44. */
  45. initialize: function(options, layer) {
  46. OpenLayers.Format.GML.prototype.initialize.apply(this, [options]);
  47. this.layer = layer;
  48. if (this.layer.featureNS) {
  49. this.featureNS = this.layer.featureNS;
  50. }
  51. if (this.layer.options.geometry_column) {
  52. this.geometryName = this.layer.options.geometry_column;
  53. }
  54. if (this.layer.options.typename) {
  55. this.featureName = this.layer.options.typename;
  56. }
  57. },
  58. /**
  59. * Method: write
  60. * Takes a feature list, and generates a WFS-T Transaction
  61. *
  62. * Parameters:
  63. * features - {Array(<OpenLayers.Feature.Vector>)}
  64. */
  65. write: function(features) {
  66. var transaction = this.createElementNS(this.wfsns, 'wfs:Transaction');
  67. transaction.setAttribute("version","1.0.0");
  68. transaction.setAttribute("service","WFS");
  69. for (var i=0; i < features.length; i++) {
  70. switch (features[i].state) {
  71. case OpenLayers.State.INSERT:
  72. transaction.appendChild(this.insert(features[i]));
  73. break;
  74. case OpenLayers.State.UPDATE:
  75. transaction.appendChild(this.update(features[i]));
  76. break;
  77. case OpenLayers.State.DELETE:
  78. transaction.appendChild(this.remove(features[i]));
  79. break;
  80. }
  81. }
  82. return OpenLayers.Format.XML.prototype.write.apply(this,[transaction]);
  83. },
  84. /**
  85. * Method: createFeatureXML
  86. *
  87. * Parameters:
  88. * feature - {<OpenLayers.Feature.Vector>}
  89. */
  90. createFeatureXML: function(feature) {
  91. var geometryNode = this.buildGeometryNode(feature.geometry);
  92. var geomContainer = this.createElementNS(this.featureNS, "feature:" + this.geometryName);
  93. geomContainer.appendChild(geometryNode);
  94. var featureContainer = this.createElementNS(this.featureNS, "feature:" + this.featureName);
  95. featureContainer.appendChild(geomContainer);
  96. for(var attr in feature.attributes) {
  97. var attrText = this.createTextNode(feature.attributes[attr]);
  98. var nodename = attr;
  99. if (attr.search(":") != -1) {
  100. nodename = attr.split(":")[1];
  101. }
  102. var attrContainer = this.createElementNS(this.featureNS, "feature:" + nodename);
  103. attrContainer.appendChild(attrText);
  104. featureContainer.appendChild(attrContainer);
  105. }
  106. return featureContainer;
  107. },
  108. /**
  109. * Method: insert
  110. * Takes a feature, and generates a WFS-T Transaction "Insert"
  111. *
  112. * Parameters:
  113. * feature - {<OpenLayers.Feature.Vector>}
  114. */
  115. insert: function(feature) {
  116. var insertNode = this.createElementNS(this.wfsns, 'wfs:Insert');
  117. insertNode.appendChild(this.createFeatureXML(feature));
  118. return insertNode;
  119. },
  120. /**
  121. * Method: update
  122. * Takes a feature, and generates a WFS-T Transaction "Update"
  123. *
  124. * Parameters:
  125. * feature - {<OpenLayers.Feature.Vector>}
  126. */
  127. update: function(feature) {
  128. if (!feature.fid) { OpenLayers.Console.userError(OpenLayers.i18n("noFID")); }
  129. var updateNode = this.createElementNS(this.wfsns, 'wfs:Update');
  130. updateNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName);
  131. updateNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
  132. var propertyNode = this.createElementNS(this.wfsns, 'wfs:Property');
  133. var nameNode = this.createElementNS(this.wfsns, 'wfs:Name');
  134. var txtNode = this.createTextNode(this.geometryName);
  135. nameNode.appendChild(txtNode);
  136. propertyNode.appendChild(nameNode);
  137. var valueNode = this.createElementNS(this.wfsns, 'wfs:Value');
  138. var geometryNode = this.buildGeometryNode(feature.geometry);
  139. if(feature.layer){
  140. geometryNode.setAttribute(
  141. "srsName", feature.layer.projection.getCode()
  142. );
  143. }
  144. valueNode.appendChild(geometryNode);
  145. propertyNode.appendChild(valueNode);
  146. updateNode.appendChild(propertyNode);
  147. // add in attributes
  148. for(var propName in feature.attributes) {
  149. propertyNode = this.createElementNS(this.wfsns, 'wfs:Property');
  150. nameNode = this.createElementNS(this.wfsns, 'wfs:Name');
  151. nameNode.appendChild(this.createTextNode(propName));
  152. propertyNode.appendChild(nameNode);
  153. valueNode = this.createElementNS(this.wfsns, 'wfs:Value');
  154. valueNode.appendChild(this.createTextNode(feature.attributes[propName]));
  155. propertyNode.appendChild(valueNode);
  156. updateNode.appendChild(propertyNode);
  157. }
  158. var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter');
  159. var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId');
  160. filterIdNode.setAttribute("fid", feature.fid);
  161. filterNode.appendChild(filterIdNode);
  162. updateNode.appendChild(filterNode);
  163. return updateNode;
  164. },
  165. /**
  166. * Method: remove
  167. * Takes a feature, and generates a WFS-T Transaction "Delete"
  168. *
  169. * Parameters:
  170. * feature - {<OpenLayers.Feature.Vector>}
  171. */
  172. remove: function(feature) {
  173. if (!feature.fid) {
  174. OpenLayers.Console.userError(OpenLayers.i18n("noFID"));
  175. return false;
  176. }
  177. var deleteNode = this.createElementNS(this.wfsns, 'wfs:Delete');
  178. deleteNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName);
  179. deleteNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
  180. var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter');
  181. var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId');
  182. filterIdNode.setAttribute("fid", feature.fid);
  183. filterNode.appendChild(filterIdNode);
  184. deleteNode.appendChild(filterNode);
  185. return deleteNode;
  186. },
  187. /**
  188. * APIMethod: destroy
  189. * Remove ciruclar ref to layer
  190. */
  191. destroy: function() {
  192. this.layer = null;
  193. },
  194. CLASS_NAME: "OpenLayers.Format.WFS"
  195. });