Más

¿Actualizando de nuevo a GeoServer / Oracle desde OpenLayers?

¿Actualizando de nuevo a GeoServer / Oracle desde OpenLayers?


He seguido el ejemplo para configurar una transacción WFS con éxito:

http://dev.openlayers.org/examples/wfs-protocol-transactions.html

Mi entorno es GeoServer 2.6.1 / OpenLayers 2.12.1. Tengo los 4 iconos de la barra de herramientas en la esquina superior derecha. (dibujar, modificar, borrar, guardar). Usé una capa que está conectada a una tabla de Oracle en geoserver como capa editable.

Ahora, cuando hago clic en el botón "guardar", no agrega un registro a esa tabla. Por supuesto, no lo esperaba porque ni siquiera sabe qué valor clave quiero poner (como id de cliente) cuando crea un nuevo registro con datos de características; ni sabe qué registro actualizar la geometría, ya que es un valor clave existente (ID de cliente). La capa editable que creé en base al enlace anterior es:

// Clientes Editable VECTOR Layer var saveStrategy = new OpenLayers.Strategy.Save (); clientes = nuevo OpenLayers.Layer.Vector ("Clientes", {estrategias: [nuevo OpenLayers.Strategy.BBOX (), saveStrategy], proyección: nuevo OpenLayers.Projection ("EPSG: 2236"), protocolo: nuevo OpenLayers.Protocol. WFS ({versión: "1.1.0", srsName: "EPSG: 2236", url: "http: // server01: 8085 / geoserver / sf / wfs", featurePrefix: "sf", featureType: "clientes", featureNS : "http://a.org/layers01", geometryName: "GEOMETRY"})});

La propia tabla de Oracle tiene los siguientes campos:

-customerId -geometry -date_updated

¿Cómo realizo inserciones a través de openlayers / geoserver / hasta la tabla de Oracle? (Para incluir el valor clave y la geometría, etc.) Me gustaría que el ejemplo anterior realmente guarde la geometría en un registro específico en la tabla. No estoy seguro de cómo proceder con esto.


¡Puedo hacer inserciones! Crea un nuevo ID de cliente con la geometría correcta. Sin embargo, incrementa la clave principal en uno, pero ignora el valor que coloco en added_feature.attributes.customerId para una nueva clave customerId. Y no puedo conseguir que se actualice en absoluto.

Establecí el customerId en el método FeatureAdded y establecí el estado en OpenLayers.State.UPDATE. También verifiqué que el customerId que coloqué en la variable added_feature.attributes.customerId existe en la tabla. Este es el error que obtengo cuando intento una actualización:

java.lang.RuntimeException: Error de análisis para FeatureId: java.lang.NullPointerException Error de análisis para FeatureId: java.lang.NullPointerException

No he probado la combinación de Geoserver y Oracle, pero supongo que el WFS-T debería funcionar de inmediato como lo hace cuando uso PostGIS como base de datos.

En primer lugar, creo que debe averiguar POR QUÉ sus características no se almacenan (restricciones NO NULAS violadas, restricciones de verificación o algo así). En su Geoserver WebUI, puede verificar que en la sección "Servicios -> WFS" el nivel de servicio esté configurado como transaccional o completo.

En su javascript, puede registrar algunos eventos para su estrategia de guardado para obtener más información cuando se activa la estrategia de guardado, cuando falla y cuando se puede guardar con éxito:

var saveStrategy = new OpenLayers.Strategy.Save (); function showSuccessMsg (e) {console.log ("Transacción completada con éxito"); //console.log(e); } función showFailureMsg (e) {alerta (e.response.error.exceptionReport.exceptions [0] .texts [0]); //console.log(e); } función saveStart (evento) {console.log ('guardar inicio de capa'); } saveStrategy.events.register ("éxito", ", showSuccessMsg); saveStrategy.events.register ('start', null, saveStart); saveStrategy.events.register ('fail', null, showFailureMsg);

Por supuesto, también debería echar un vistazo a sus herramientas de depuración (por ejemplo, firebug para ver en la consola o en la pestaña de red lo que está sucediendo). Y por último, pero no menos importante, puede buscar en los archivos de registro de su DBMS.

Si sabe por qué no puede guardar, puede adaptar su código para que pueda establecer los atributos que desea guardar. Para insertar nuevas características, por ejemplo, puede registrar el evento featureadded para obtener la característica agregada y establecer sus atributos:

var draw = new OpenLayers.Control.DrawFeature (wfs, OpenLayers.Handler.Polygon, {title: "Draw Feature", displayClass: "olControlDrawFeaturePolygon", multi: true}); draw.events.register ("featureadded", ", FeatureAdded); function FeatureAdded (object) {console.log ('feature added'); var added_feature = object.feature; added_feature.state = OpenLayers.State.INSERT; // la versión estática debe ser reemplazada por la interacción del usuario added_feature.attributes.customerId = 42442;} map.addControl (dibujar);

Si ha configurado las propiedades que necesita configurar, puede activar la estrategia saveStrategy (qué se hace cuando hace clic en el botón Guardar)

saveStrategy.save ();

Como pasos siguientes, puede utilizar formas más dinámicas para asignar los atributos (por ejemplo, campos de texto y document.getElementById.innerHTML)

Si todo esto funciona bien, puede usar el control de modificación de características para actualizar la geometría y los atributos. Si actualiza las características, no olvide establecer el estado de características en OpenLayers.State.UPDATE