OL3 wfs-t не проходит транзакция

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
geralt
Новоприбывший
Сообщения: 3
Зарегистрирован: 04 май 2016, 03:28
Репутация: 0

OL3 wfs-t не проходит транзакция

Сообщение geralt » 04 май 2016, 04:03

Доброго времени!
Начинаю изучать OpenLayers. Задача элементарная – есть база PostGIS/PostgreSQL, есть Geoserver с опубликованными слоями из этой базы, задача - редактировать эти слои через веб. Разобрался как слои отображать (WFS_T), как редактировать, но проблема в следующем – когда скрипт отправляет транзакцию, в ответ приходит следующее (смотрю firebug-ом):

Код: Выделить всё

<ows:ExceptionReport xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ows="http://www.opengis.net/ows" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/ows http://localhost:82/geoserver/schemas/ows/1.0.0/owsExceptionReport.xsd">
  <ows:Exception exceptionCode="NoApplicableCode">
    <ows:ExceptionText>No such feature type http://localhost:82/geoserver/cite:boundary-points</ows:ExceptionText>
  </ows:Exception>
</ows:ExceptionReport>
Я так понимаю, что я не правильно формирую транзакцию, но вот что я делаю не так, понять не могу. Прошу помочь найти косяк)
Сам пост запрос:

Код: Выделить всё

<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Insert>
<boundary-points xmlns="http://localhost:82/geoserver/cite">
<geometry>
<MultiPoint xmlns="http://www.opengis.net/gml">
<pointMember>
<Point>
<pos>131.0723876953125 46.3897705078125</pos>
</Point>
</pointMember>
</MultiPoint>
</geometry>
</boundary-points>
</Insert>
</Transaction>
Ну и весь код

Код: Выделить всё

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="css\ol.css"  type="text/css">
    <script src="Scripts\ol.js" type="text/javascript"></script>
    <script src="Scripts\jQuery_2.2.3.js" type="text/javascript"></script>
    <title>OL редактор</title>
    <style type="text/css">
        .edit {
            width: auto;
            background: #ccc;
            padding: 5px;
            padding-right: 20px;
            border: solid 1px black;
            float: left;
        }
    </style>
</head>
<body>
<DIV id="customControl" class="edit">
    <input type="button" id="customControlCreate" value="create"/>
    <input type="button" id="customControlEdit" value="edit"/>
    <input type="button" id="customControlDelete" value="delete"/>
    <input type="button" id="customControlSave" value="save"/>

</DIV>
<div id="map"></div>


<script type="text/javascript">
    var bounds = [130.39465, 42.2933078,
        139.0329652, 48.4645449];
    var interaction;

    var vectorSource = new ol.source.Vector({
        format: new ol.format.GeoJSON(),
        url: function(extent) {
            return 'http://localhost:82/geoserver/cite/wfs?service=WFS&' +
                    'version=1.1.0&request=GetFeature&typename=cite:boundary-polygon&' +
                    'outputFormat=application/json&srsname=EPSG:4326&' +
                    'bbox=' + extent.join(',') + ',EPSG:4326';
        },
        strategy: ol.loadingstrategy.tile(ol.tilegrid.createXYZ({
            maxZoom: 19
        }))
    });
    var vector = new ol.layer.Vector({
        source: vectorSource,
        style: new ol.style.Style({
            stroke: new ol.style.Stroke({
                color: 'rgba(69,139,116, 1.0)',
                width: 2
            }),
            fill: new ol.style.Fill({
                color: 'rgba(102, 205, 170, 1.0)'
            })
        })
    });
    var projection = new ol.proj.Projection({
        code: 'EPSG:4326',
        units: 'degrees',
        axisOrientation: 'neu'
    });
    var view = new ol.View({

        zoom: 12
    });

    var map = new ol.Map({
        layers: [vector],
        target: 'map',
        view: new ol.View({
            projection: projection
        })
    });


    map.addLayer(
            new ol.layer.Vector({
                source:
                        new ol.source.Vector({
                            format: new ol.format.GeoJSON(),
                            url: function(extent) {
                                return 'http://localhost:82/geoserver/cite/wfs?service=WFS&' +
                                        'version=1.1.0&request=GetFeature&typename=cite:water-line&' +
                                        'outputFormat=application/json&srsname=EPSG:4326&' +
                                        'bbox=' + extent.join(',') + ',EPSG:4326';
                            },
                            strategy: ol.loadingstrategy.tile(ol.tilegrid.createXYZ({
                                maxZoom: 19
                            }))
                        }),
                style: new ol.style.Style({
                    stroke: new ol.style.Stroke({
                        color: 'rgba(30, 144, 255, 1.0)',
                        width: 2
                    })
                })
            })
    );

    var fill = new ol.style.Fill({
        color: 'rgba(205, 102, 29, 0.4)'
    });
    var stroke = new ol.style.Stroke({
        color: '#8b4513',
        width: 1.25
    });
    var point = new ol.layer.Vector({
        source:
                new ol.source.Vector({
                    format: new ol.format.GeoJSON(),
                    url: function(extent) {
                        return 'http://localhost:82/geoserver/cite/wfs?service=WFS&' +
                                'version=1.1.0&request=GetFeature&typename=cite:boundary-points&' +
                                'outputFormat=application/json&srsname=EPSG:4326&' +
                                'bbox=' + extent.join(',') + ',EPSG:4326';
                    },
                    strategy: ol.loadingstrategy.tile(ol.tilegrid.createXYZ({
                        maxZoom: 19
                    }))
                }),
        style: new ol.style.Style({
            image: new ol.style.Circle({
                fill: fill,
                stroke: stroke,
                radius: 5
            }),
            fill: fill,
            stroke: stroke
        })
    })
    map.addLayer(point);
    map.getView().fit(bounds, map.getSize());
        var dirty = {};
    var formatWFS = new ol.format.WFS();
    var formatGML = new ol.format.GML({
        featureNS: 'http://localhost:82/geoserver/cite',
        featureType: 'boundary-points',
        srsName: 'EPSG:4326'
    });
//
    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('http://localhost:82/geoserver/cite/wfs', {
            type: 'POST',
            dataType: 'xml',
            processData: false,
            contentType: 'text/xml',
            data: str
        }).done();
    }
//text/xml
//
    $('#customControlCreate').on('click', function () {
        interaction = new ol.interaction.Draw({
            type: 'MultiPoint',
            source: point.getSource()
        });
        map.addInteraction(interaction);
        interaction.on('drawend', function(e) {
            transactWFS('insert',e.feature);
        });
    });
</script>
</body>

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OL3 wfs-t не проходит транзакция

Сообщение Denis Rykov » 04 май 2016, 10:02

Вам же GeoServer ясно даёт понять, что именно ему не нравится:

Код: Выделить всё

No such feature type http://localhost:82/geoserver/cite:boundary-points
Нет у вас слоя с таким именем.
Spatial is now, more than ever, just another column- The Geometry Column.

geralt
Новоприбывший
Сообщения: 3
Зарегистрирован: 04 май 2016, 03:28
Репутация: 0

Re: OL3 wfs-t не проходит транзакция

Сообщение geralt » 04 май 2016, 10:45

То что он его не находит это понятно) Дело в том что этот слой нормально отображается через OL
Спойлер

Код: Выделить всё

var point = new ol.layer.Vector({
        source:
                new ol.source.Vector({
                    format: new ol.format.GeoJSON(),
                    url: function(extent) {
                        return 'http://localhost:82/geoserver/cite/wfs?service=WFS&' +
                                'version=1.1.0&request=GetFeature&typename=cite:boundary-points&' +
                                'outputFormat=application/json&srsname=EPSG:4326&' +
                                'bbox=' + extent.join(',') + ',EPSG:4326';
                    },
                    strategy: ol.loadingstrategy.tile(ol.tilegrid.createXYZ({
                        maxZoom: 19
                    }))
                }),
        style: new ol.style.Style({
            image: new ol.style.Circle({
                fill: fill,
                stroke: stroke,
                radius: 5
            }),
            fill: fill,
            stroke: stroke
        })
    })
сейчас попробовал через транзакцию удалять точки из этого слоя - все проходит успешно, а вот создавать точки не получается.

Warden
Интересующийся
Сообщения: 25
Зарегистрирован: 16 сен 2015, 16:43
Репутация: 7
Откуда: Королёв

Re: OL3 wfs-t не проходит транзакция

Сообщение Warden » 06 июн 2016, 17:12

geralt писал(а): сейчас попробовал через транзакцию удалять точки из этого слоя - все проходит успешно, а вот создавать точки не получается.
В общем, тут может много чего лишнего, но делал я как то рисовалку, может разберете, что к чему.

Код: Выделить всё

var formatWFS = new ol.format.WFS();

	var formatGMLPoint = new ol.format.GML({
  		featureNS: 'geoportal',
  		featureType: 'user_point',
  		srsName: 'EPSG:3857'
  	});

	var transactWFSPoint = function(p,f) {
  		switch(p) {
  			case 'insert':
    		node = formatWFS.writeTransaction([f],null,null,formatGMLPoint);
    		break;
  			case 'update':
    		node = formatWFS.writeTransaction(null,[f],null,formatGMLPoint);
    		break;
  			case 'delete':
    		node = formatWFS.writeTransaction(null,null,[f],formatGMLPoint);
    		break;
   		}
  		s = new XMLSerializer();
  		str = s.serializeToString(node);
  		$.ajax('http://192.168.255.197:8080/geoserver/geoportal/wfs',{
  			async: false,
	    	type: 'POST',
	    	dataType: 'xml',
	    	processData: false,
	    	contentType: 'text/xml',
	    	data: str,
    	}).done();
  	};

  	var formatGMLLine = new ol.format.GML({
  		featureNS: 'geoportal',
  		featureType: 'user_line',
  		srsName: 'EPSG:3857'
  	});

	var transactWFSLine = function(p,f) {
  		switch(p) {
  			case 'insert':
    		node = formatWFS.writeTransaction([f],null,null,formatGMLLine);
    		break;
  			case 'update':
    		node = formatWFS.writeTransaction(null,[f],null,formatGMLLine);
    		break;
  			case 'delete':
    		node = formatWFS.writeTransaction(null,null,[f],formatGMLLine);
    		break;
   		}
  		s = new XMLSerializer();
  		str = s.serializeToString(node);
  		$.ajax('http://192.168.255.197:8080/geoserver/geoportal/wfs',{
  			async: false,
	    	type: 'POST',
	    	dataType: 'xml',
	    	processData: false,
	    	contentType: 'text/xml',
	    	data: str,
    	}).done();
  	};

  	var formatGMLPolygon = new ol.format.GML({
  		featureNS: 'geoportal',
  		featureType: 'user_polygon',
  		srsName: 'EPSG:3857'
  	});

	var transactWFSPolygon = function(p,f) {
  		switch(p) {
  			case 'insert':
    		node = formatWFS.writeTransaction([f],null,null,formatGMLPolygon);
    		break;
  			case 'update':
    		node = formatWFS.writeTransaction(null,[f],null,formatGMLPolygon);
    		break;
  			case 'delete':
    		node = formatWFS.writeTransaction(null,null,[f],formatGMLPolygon);
    		break;
   		}
  		s = new XMLSerializer();
  		str = s.serializeToString(node);
  		$.ajax('http://192.168.255.197:8080/geoserver/geoportal/wfs',{
  			async: false,
	    	type: 'POST',
	    	dataType: 'xml',
	    	processData: false,
	    	contentType: 'text/xml',
	    	data: str,
    	}).done();
  	};

******

draw_point.on('drawend', function(evt) {
		var feature = evt.feature;
		feature.set('type', 'Point');
		postFlag();
		transactWFSPoint('insert', feature);
		setTimeout(function(){
			location.reload()
		}, 500)
	}, this);
	
	draw_line.on('drawstart', function(evt) {
	}, this);

	draw_line.on('drawend', function(evt) {
		var feature = evt.feature;
		feature.set('type', 'Line');
		postFlag();
		transactWFSLine('insert', feature);
		setTimeout(function(){
			location.reload()
		}, 500)
	}, this);

	draw_polygon.on('drawstart', function(evt) {
	}, this);

	draw_polygon.on('drawend', function(evt) {
		var feature = evt.feature;
		feature.set('type', 'Polygon');
		postFlag();
		transactWFSPolygon('insert', feature);
		setTimeout(function(){
			location.reload()
		}, 500)
	}, this);
Здесь присутствует перезагрузка страницы при окончании рисовании для получение отрисованных точек уже из обновленной бд (чтобы пользователь не терялся, сделал запоминание экрана на том зуме и координатах, и при перезагрузке сразу же туда перемещал пользователя), чтобы можно было работать с новыми features, если не перезагрузить, то там косяки лезли, так как они ещё неадекватно воспринимались, как то так.

geralt
Новоприбывший
Сообщения: 3
Зарегистрирован: 04 май 2016, 03:28
Репутация: 0

Re: OL3 wfs-t не проходит транзакция

Сообщение geralt » 30 июн 2016, 09:07

Warden, спасибо. С этим вопрос разобрался, не корректно задавал featureNS, featureType + как выяснилось из книги Mastering OpenLayers 3 есть проблемы с транзакциями update если данные в wgs84, там значения координат надо менять местами.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: Semrush [Bot] и 26 гостей