2016-06-15 2 views
1

Итак, у меня есть веб-приложение, которое работает и может добавлять точки и строки в существующие таблицы Postgis, получая данные от Geoserver. Мне нужен следующий конкретный бит функциональности:Как вставить атрибуты в WFS с помощью OpenLayers?

Я хочу, чтобы пользователи также могли добавлять информацию об атрибутах в каждую точку интерфейса карты. Как и в каждой точке, которую они рисуют на карте, должно быть что-то, что позволяет пользователю также вводить некоторые текстовые данные в столбец.

Я пробовал читать несколько вопросов здесь, но ни один из них не обеспечил решение для точечного векторного слоя.

Как это сделать?

бит я для загрузки и размещая точечные WFS является:

var vectorSource2 = new ol.source.Vector({ 
loader: function(extent, resolution, projection) { 
var url2 = 'http://localhost:8080/geoserver/wfs?service=WFS&' + 
'version=1.1.0&request=GetFeature&typename=BFTchambers:chamber2&' + 
'outputFormat=text/javascript&format_options=callback:loadFeatures2' + 
'&bbox=' + extent.join(','); 
$.ajax({url: url2, dataType: 'jsonp', jsonp: false}) 
.done(function(response) { 
    pointWFS = new ol.format.WFS(), 
    sourceVector2.addFeatures(pointWFS.readFeatures(response)) 
    }); 
}, 
strategy: ol.loadingstrategy.tile(ol.tilegrid.createXYZ({ 
maxZoom: 20 
})), 
}); 

window.loadFeatures2 = function(response) { 
console.log("Point features were drawn"); 
vectorSource2.addFeatures(geojsonFormat.readFeatures(response)); 
}; 
var formatWFS2 = new ol.format.WFS(); 
var pointGML = new ol.format.GML({ 
featureNS: 'http://geoserver.org/bftchamber', 
featureType: 'chamber2', 
}); 

var pointWFS = function(p,f) { 
switch(p) { 
case 'insert': 
    node = formatWFS2.writeTransaction([f],null,null,pointGML); 
    break; 
case 'update': 
    node = formatWFS2.writeTransaction(null,[f],null,pointGML); 
    break; 
case 'delete': 
    node = formatWFS2.writeTransaction(null,null,[f],pointGML); 
    break; 
} 
s = new XMLSerializer(); 
str = s.serializeToString(node); 
$.ajax('http://localhost:8080/geoserver/wfs',{ 
    type: 'POST', 
    dataType: 'xml', 
    processData: false, 
    contentType: 'text/xml', 
    data: str 
    }).done(); 
    console.log(" point features were posted to server"); 
} 
case 'btnDrawPoint': 
    interaction = new ol.interaction.Draw({ 
     type: 'Point', 
     source: layerVector.getSource() 
    }); 
    map.addInteraction(interaction); 
    interaction.on('drawend', function(e) { 
     pointWFS('insert',e.feature); 
    }); 
    break; 
+0

Просто позвоните f.set ('foo', 'bar'), где «bar» - это вход от вашего пользователя, прежде чем передать его в writeTransaction – bartvde

+0

@bartvde can пожалуйста, уточните это? Я новичок с openlayers и Javascript – Luffydude

ответ

1

просто добавить атрибут путь @bartvde предлагает.

Например, используя свой собственный пример

interaction.on('drawend', function(e) { //pass an attribute to the feature var featureWithAttribute = e.feature.set('foo', 'bar'); pointWFS('insert',featureWithAttribute); });

Так эта модификация будет посылать функцию держит геометрию, а также, атрибут для имени столбца foo удерживающий значение bar.

Теперь, если вы хотите, чтобы пользователь мог ввести текст:

interaction.on('drawend', function(e) { 
    //pass an attribute to the feature 
    var myAttrValue = prompt("Enter Attribute", ""); 
    var myFeature= e.feature; 
    if (myAttrValue != null) { 
    myFeature.set('foo', myAttrValue); 
    } 

    pointWFS('insert',myFeature); 
}); 

Конечно, это всего лишь пример использования функции ПРОМТ по умолчанию JS. Но вы можете использовать свой UI api, чтобы получить аналогичное поведение.

+0

Он работал как шарм! Не могу поверить, что я пытался посмотреть в документации OpenLayers, как это сделать, когда было возможно использовать подсказку. Мне любопытно, как использовать UI api? – Luffydude

+1

Ну, это зависит от того, что вы используете для создания пользовательского интерфейса (User Inetrface). Например, если вы используете jquery, вы можете добавить диалог, чтобы пользователь мог добавить свой текст. Если вы не используете какой-либо api, тогда функция js promt достаточно. Рад помочь амиго – pavlos

 Смежные вопросы

  • Нет связанных вопросов^_^