Serwer QGIS wysyła AKTUALIZACJĘ… GDZIE NULL do postgis w warstwie WFS

9

Korzystam z serwera Windows Server 2012.

PostgreSQL 9.3.5, 64-bitowy

POSTGIS 2.1.3

QGIS Server 2.6.1-2

QGIS Desktop 2.8.3 i 2.12

Korzystam z tabletu Microsoft Surface Pro 4 za pomocą QGIS Desktop 2.12 do edycji niektórych warstw przechowywanych w bazie danych Postgresql. Warstwy na tablecie to warstwy WFS obsługiwane przez serwer QGIS.

Podczas edytowania w Google po wstawieniu niektórych danych w warstwie w celu wymuszenia przesłania danych i zapisania ich na serwerze czasami aktualizacja nie jest wykonywana w bazie danych.

Widzę, że żądanie HTTP POST dociera do serwera ok, ale czasami nie widzę zatwierdzenia (aktualizacji) w bazie danych, a innym razem działa poprawnie i wykonuje zatwierdzenie.

W dziennikach QGIS Server widzę (zaktualizowałem dane 3 funkcji w QGIS Desktop):

//QGIS SERVER RECEIVED HTTP POST FROM QGIS DESKTOP

[4852][11:11:19] ********************new request*************** [4852][11:11:19] remote ip: 192.168.144.20 [4852][11:11:19] CONTENT_TYPE: text/xml [4852][11:11:19] HTTP_USER_AGENT: Mozilla/5.0 QGIS/2.8.2-Wien [4852][11:11:19] MAP:D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs
[4852][11:11:19] REQUEST:Transaction
[4852][11:11:19] REQUEST_BODY:<Transaction xmlns="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
service="WFS" xsi:schemaLocation="http://www.qgis.org/gml
http://eudala2.getxo.net/qgis/qgis_mapserv.fcgi.exe?map=D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs&amp;SERVICE=WFS&amp;VERSION=1.0.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=getxo_alumbrado_arquetas_registros_cajas&amp;SRSNAME=EPSG:23030"
xmlns:gml="http://www.opengis.net/gml"><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.3"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.4"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo</Name><Value
xmlns="http://www.opengis.net/wfs">A</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_tapa</Name><Value
xmlns="http://www.opengis.net/wfs">B</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">estado</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">O</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_union_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">N</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_estado_union_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_intervencion</Name><Value
xmlns="http://www.opengis.net/wfs">OTR</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">m_codcalle</Name><Value
xmlns="http://www.opengis.net/wfs">20</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.5"/></Filter></Update></Transaction>
[4852][11:11:19] SERVICE:WFS
[4852][11:11:19] SRSNAME:EPSG:23030
[4852][11:11:19] VERSION:1.0.0
[4852][11:11:22] Request finished in 2977 ms

Ok, kiedy przeglądam dzienniki PostgreSQL, widzę, że aktualizacja ma klauzulę WHERE NULL, która niczego nie aktualizuje ..

//POSTGRESQL UPDATE QUERIES
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN:  exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN:  exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "tipo"='A',"tipo_tapa"='B',"estado"='D',"p_tierra_tipo_electrodo_tierra"='O',"p_tierra_tipo_union_electrodo_tierra"='N',"p_tierra_estado_union_tierra"='D',"tipo_intervencion"='OTR',"m_codcalle"='20',"id_modelo"=0,"alumbrado"='t'
WHERE NULL

Widzę w danych POST, że QGIS Server wie, która funkcja wymaga aktualizacji przy użyciu wewnętrznego numeru „fid”. Z drugiej strony moja warstwa ma pole „id” jako klucz podstawowy. Gdzieś, kiedy wykonuje mapowanie z wewnętrznego identyfikatora QGIS na identyfikator mojej warstwy, gubi się i dodaje GDZIE null do zapytania zamiast dodawać gdzie id = 1510.

Zabawne jest to, że pracują od 40 dni i hej dostali ten problem tylko raz, ale od zeszłego tygodnia mieli ten problem codziennie ... Od tego czasu czasami działa, a czasem nie. Ponownie wysyłam żądanie POST http od klienta korzystającego z serwera proxy Fiddles i ten sam post HTTP czasami działa, a innym razem nie.

Przetestowałem to w QGIS Desktop 2.8, 2.10 i 2.12 i zdarza się we wszystkich (QGIS Server to 2.6.1). Przetestowałem to również na różnych warstwach z tym samym wynikiem.

Nie wiem, czy jest jakiś błąd lub konfiguracja warstwy, której nie wykonuję poprawnie na serwerze ...


AKTUALIZACJA 03.03.2016

Zaktualizowałem zarówno QGIS Server, jak i QGIS Desktop do wersji 2.12.3 i problem nadal występuje.

Po wielu dniach testów w końcu odkryłem, kiedy pojawia się problem. Zdarza się to, gdy zapisuję zmiany warstwy w QGIS (przez WFS-T), a jednocześnie inny użytkownik ładuje Mapę Lizmap . Lizmap używa również qgis-server.

Wygląda na to, że podczas ładowania mapy Lizmap powoduje, że serwer jest zajęty, a po otrzymaniu żądania aktualizacji WFS-T serwer QGIS nie jest w stanie poprawnie zbudować zapytania SQL UPDATE. Przykład:

Jeśli ładowanie Lizmap odbywa się w momencie odebrania postu WFS-T, zapytanie PostgreSQL wygenerowane na serwerze qgis-server to:

2016-03-03 11:47:30 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL

Z drugiej strony, jeśli qgis-server nie podaje danych ładującej się Lizmapie po przybyciu WFS-T, wygenerowane zapytanie PostgreSQL to:

2016-03-03 11:46:21 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1' 

Zwróć uwagę na różnicę w klauzuli where. Ten pierwszy nic nie robi. Drugi działa dobrze.

Nie wiem, czy mogę dostroić Apache lub jakiekolwiek pliki konfiguracyjne dla qgis-server, aby rozwiązać ten problem.

Próbowałem podać serwerowi znacznie więcej sprzętu (4 rdzenie i 16 GB pamięci RAM) bez chnage.


Wszystkie aktualizacje oprogramowania wykonuję przy użyciu OSGEO4W. Czytałem gdzieś, że pakiety Apache i PHP nie były aktualizowane od lat. Spróbuję zaktualizować je ręcznie i sprawdzę, czy wersja apache lub php nie jest przyczyną problemu.


AKTUALIZACJA 16.03.2016

Zaktualizowałem pakiety Apache i PHP i problem nadal występuje. Po kilku testach odkryłem, że jeśli zapiszę zmiany edycji (przez WFS) podczas ładowania mapy Lizmap, zapisywanie nie powiedzie się, ale w niektórych przypadkach nadal się nie udaje, chociaż nie ładuje się Lizmap (na niższym wolumenie). Jest to problem w QGIS Server (qgis_mapserv.fcgi.exe).

Egidi
źródło
Czy możesz pokazać dzienniki serwera QGIS, gdy działa? Zakładam, że wyglądają tak samo, ale musimy potwierdzić to założenie.
alexGIS
@alexGIS Tak, są takie same. Napisałem odpowiedź z rozwiązaniem problemu. Dzięki za pomoc!
Egidi

Odpowiedzi:

7

Wreszcie Matthias Kuhn , jeden z twórców QGIS, dał mi klucz.

Klauzula WHERE jest zbudowany sprawdzanie typ klucza podstawowego tabeli. To powinna być całkowita i niektóre z moich tabel Widziałem, że typ był numeryczna (8,0).

Te tabele i klucze podstawowe zostały wcześniej utworzone przez aplikację innej firmy.

Zmieniłem typ na Integer i wszystkie testy, które przeprowadziłem od tego czasu, zadziałały (wykonałem ponad 100 testów edycji przez WFS, co moim zdaniem wystarczy, aby stwierdzić, że problem został rozwiązany)

Egidi
źródło