2016-01-13 54 views
1

我試圖上的OpenLayers WFS-T 3用下面的代碼:的OpenLayers 3 - WFS-T:幾何領域的變化名

var formatWFS = new ol.format.WFS(); 
var formatGML = new ol.format.GML({ 
    featureNS: 'http://argeomatica.com', 
    featureType: 'playa_sample', 
    srsName: 'EPSG:3857' 
    }); 
var transactWFS = function(p,f) { 
    switch(p) { 
    case 'insert': 
    node = formatWFS.writeTransaction([f],null,null,formatGML); 
    break; 
    case 'update': 
    node = formatWFS.writeTransaction(null,[f],null,formatGML); 
    break; 
    case 'delete': 
    node = formatWFS.writeTransaction(null,null,[f],formatGML); 
    break; 
    } 
    s = new XMLSerializer(); 
    str = s.serializeToString(node); 
    $.ajax('https://gsx.geolytix.net/geoserver/geolytix_wfs',{ 
    type: 'POST', 
    dataType: 'xml', 
    processData: false, 
    contentType: 'text/xml', 
    data: str 
    }).done(); 
    } 

然而,當我運行一個更新事務(AJAX調用),它將幾何列作爲「幾何」發送。我需要改變它是大寫的 「GEOM」:

...

<Property> 
<Name>geometry</Name> 

...

應該是: ...

<Property> 
<Name>GEOM</Name> 

...

我試着用啊設置功能我找到的idden屬性(geometryName_):

f.geometryName_ =「GEOM」;

但這並不奏效。任何幫助改變功能傳遞「GEOM」到ajax調用將不勝感激。由於

更新#1

正如巴特建議,我加setGeometryName:

case 'update': 
    f.setGeometryName("GEOM"); 
    node = formatWFS.writeTransaction(null,[f],null,formatGML); 
    break; 

但引起的OpenLayers 3個JS的錯誤了:

ol.interaction.Modify.prototype.addFeature_ 
.. 
if (geometry.getType() in this.SEGMENT_WRITERS) <-- errors out here 

錯誤:無法獲取屬性getType對象爲空

+0

您需要在功能上使用setGeometryName。這將通過格式獲取。 – bartvde

+0

巴特,嘗試了你的建議,但沒有奏效。見上面的更新#1。 –

+0

您需要確保在特徵的值中幾何體在該關鍵點下。設置名稱後,feature.getGeometry()會產生什麼結果? – bartvde

回答

1

問題解決了!

創建瞭解決問題的解決方法。如果有人有更好的解決方案,請張貼您的答案。

第1步 - 修改開關/ case語句如下:

... 

case 'insert': 

// Insert Parameter for new GEOMETRY NODE 
f.set('GEOM', f.getGeometry()); 

node = formatWFS.writeTransaction([f], null, null, formatGML); 

// Remove default lower case geometry node 
removeLowerCaseGeometryNodeForInsert(node); 

break; 

case 'update': 

// Update Parameter for new GEOMETRY NODE 
f.set('GEOM', f.getGeometry()); 

node = formatWFS.writeTransaction(null, [f], null, formatGML); 

// Remove lower case geometry node which will cause update to fail 
removeNodeForWfsUpdate(node, "geometry"); 

break; 

... 

第2步 - 添加以下功能代碼:

function removeLowerCaseGeometryNodeForInsert(node) 
{ 

    var geometryNodes = node.getElementsByTagName("geometry"), element; 
    while (geometryNode = geometryNodes[0]) 
    { 
    geometryNode.parentNode.removeChild(geometryNode); 
    } 

} 

function removeNodeForWfsUpdate(node, valueToRemove) 
{ 
    var propNodes = node.getElementsByTagName("Property"); 
    for (var i = 0; i < propNodes.length; i++) 
    { 
    var propNode = propNodes[i]; 
    var propNameNode = propNode.firstElementChild; 
    var propNameNodeValue = propNameNode.firstChild; 
    if (propNameNodeValue.nodeValue === valueToRemove) 
    { 
     propNode.parentNode.removeChild(propNode); 
     break; 
    } 
    } 
} 
+0

您從Met Kiani得到了更好的解決方案。應該被標記爲接受:) – Solidus

2

我假設你畫有OL的特徵.transaction.Draw如果是這種情況,您需要在繪製交互對象中設置幾何名稱geometryName:'the_geom' befor you call'drawend'event

var interaction = new ol.interaction.Draw({ 
    type: 'MultiPolygon', 
    source: Source, 
    geometryName:'the_geom' 
}); 

如果在繪製完成後設置geometryName(錯誤使用feature.setGeometryName()),則openlayers將向服務器發送空對象。

+0

這個答案完美,應該接受:) – Solidus