3 votos

Descargando muchos datos de WFS

El problema es que tengo una gran cantidad de datos para descargar de un WFS. He probado este método con diferentes errores en el camino. Primero intenté con PyQGIS con este script:

uri = "http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map"
layer = QgsVectorLayer( uri, "mi capa wfs", "WFS" )
crs=QgsCoordinateReferenceSystem(4326)
res = QgsVectorFileWriter.writeAsVectorFormat( layer,
                                                r'Ruta...edifita.shp',
                                               'Sistema', # encoding
                                               crs, #crs
                                              'Shapefile de ESRI'
       )

if res != QgsVectorFileWriter.NoError:
    print ('Número de error:', res)
else:
    print ("¡WFS guardado!")

Extractado de aquí: ¿Cómo guardar una capa de WFS directamente en el disco usando QGIS o PyQGIS?

Este método me da el siguiente error:

exec(open('C:/Users/JORDI~1.PAG/AppData/Local/Temp/tmpac2ti1a7.py'.encode('utf-8')).read())
Número de error: (8, '')

También intenté este otro método de la misma fuente:

ogr2ogr -f "Shapefile de ESRI" "...ruta..." WFS:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map" 

Sin embargo, me da estos 2 errores:

ERROR 1: Código de error HTTP: 504                                                                                                                     ERROR 1: Error devuelto por el servidor: Código de error HTTP: 504 (0) 

No estoy seguro si los errores son causados por la gran cantidad de datos o algo más.

¿Qué piensas?

7voto

Abhi Puntos 13

El problema está en el propio servidor WFS y no en tu enfoque. Para explicarlo, veamos paso a paso.

La URL del WFS es: http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map

Antes de descargar los datos, veamos la descripción de este servicio WFS y veamos qué capas forman parte de esta fuente utilizando una llamada de solo lectura ogrinfo.

ogrinfo  WFS:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map"

Este comando devuelve

INFO: Apertura de `WFS:http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map'
      usando el controlador `WFS' exitosa.
Metadatos:
  ABSTRACT=Edificato dei capoluoghi di provincia. I capoluoghi di provincia rappresentati sono quelli relativi all'anno 2003. Scala 1:10.000
  PROVIDER_NAME=Geoportale Nazionale - Ministero dell'Ambiente e della Tutela del Territorio e del Mare
  TITLE=Edificato dei capoluoghi di provincia
1: ED.EDIFICATO.CAPOLUOGHI. (título: Edificato) (Superficie Múltiple)

lo cual menciona que hay 1 capa con el nombre "ED.EDIFICATO.CAPOLUOGHI." y tiene una geometría de Superficie Múltiple.

A continuación, intentamos cargar metadatos de esta capa, para ver cuáles son las extensiones, sistema de coordenadas, etc., información para la capa "ED.EDIFICATO.CAPOLUOGHI." utilizando el mismo comando ogrinfo y pasando el nombre de la capa al final.

ogrinfo  WFS:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map" ED.EDIFICATO.CAPOLUOGHI.

Esto da la siguiente salida

INFO: Apertura de `WFS:http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map'
      usando el controlador `WFS' exitosa.
Metadatos:
  ABSTRACT=Edificato dei capoluoghi di provincia. I capoluoghi di provincia rappresentati sono quelli relativi all'anno 2003. Scala 1:10.000
  PROVIDER_NAME=Geoportale Nazionale - Ministero dell'Ambiente e della Tutela del Territorio e del Mare
  TITLE=Edificato dei capoluoghi di provincia

Nombre de la capa: ED.EDIFICATO.CAPOLUOGHI.
Metadatos:
  ABSTRACT=La tabella asociada contiene las siguientes informaciones principales: id_edifici, identificativo unico dell'edificio; quota_suolo, quota del suolo espressa in metri sul livello del mare; quota_gronda, quota della gronda dell'edificio espressa in metri sul livello del mare; altezza, altezza dell'edificio espressa in metri sul livello del mare; tipologia, tipologia di edificio espressa da un valore numerico variabile tra 1 e 4; area_, area di base dell'edificio espressa in metri quadri;perimetro, perimetro di base dell'edificio espresso in metri.
  KEYWORD_1=Edifici
  KEYWORD_2=Edilizia
  KEYWORD_3=Edificio
  TITLE=Edificato
Geometría: Superficie Múltiple
ERROR 1: Código de error HTTP: 504
ERROR 1: Error devuelto por el servidor: Código de error HTTP: 504 (0)

Ves que el servidor WFS se está tardando en descargar los metadatos de la capa en sí misma y por eso el ogr2ogr también está fallando al descargar los datos reales, independientemente de las opciones de paginación que proporciones.

Este es un problema del servidor WFS, solo puedo suponer que los datos están alojados en un Mapserver pero están proxificados con un servidor web como NGINX o Apache y la conexión entre el servidor web y el geoservidor probablemente se está agotando el tiempo. En cuanto a una alternativa, no veo una solución a menos que sea solucionado por el servidor mismo.

5voto

Peter Puntos 11

Tengo problemas para cargar el servicio Edifici al que has enlazado, tanto a través de QGIS, Python y el navegador. El documento GetCapabilities se carga, pero el contenido no lo hace.

He probado con otro servicio del mismo sitio que funciona bien.

Alluvioni_Estensione de http://www.pcn.minambiente.it/mattm/en/wfs-service/

He tenido éxito guardando solicitudes grandes de WFS de otros servicios usando un código similar a este:

from requests import Request
import geopandas as gpd

#url = 'http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map&service=wfs&request=getFeature&version=1.0.0&typename=ED.EDIFICATO.CAPOLUOGHI.'
url = 'http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Alluvioni_Estensione.map&service=wfs&request=getFeature&version=1.0.0&typename=ITH2018_Estensione_HPH'

q = Request('GET', url).prepare().url
df = gpd.read_file(q, format='GML')
df.crs = 'EPSG:4326'

df.to_file('output.shp')

2voto

Joe Puntos 16

Ese servidor no se comporta exactamente como GDAL cree que lo hace. Si realmente necesitas obtener los datos, puedes hacerlo con paginación manual. Aunque el servidor admita solo WFS 1.1.0 y la paginación se introdujo en WFS 2.0.0, ese servidor (es MapServer) admite &StartIndex como una opción de proveedor. Eso está documentado en la documentación de GDAL https://gdal.org/drivers/vector/wfs.html

Algunos servidores (como MapServer >= 6.0) admiten el uso de STARTINDEX que permite hacer las solicitudes por "página", y así evitar descargar todo el contenido de la capa en una sola solicitud. La paginación se introdujo en WFS 2.0.0 pero los servidores también pueden admitirla como una opción específica del proveedor con WFS 1.0.0 y 1.1.0.

  1. Primera solicitud que comienza desde el principio

http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map&service=WFS&version=1.1.0&request=GetFeature&typename=ED.EDIFICATO.CAPOLUOGHI.&maxfeatures=1000

Guardar la respuesta en un archivo

  1. Segunda solicitud

http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map&service=WFS&version=1.1.0&request=GetFeature&typename=ED.EDIFICATO.CAPOLUOGHI.&MaxFeatures=1000&StartIndex=1000

Guardar la respuesta en un archivo

  1. Siguientes solicitudes:

Aumentar el valor de StartIndex

Cuando hayas recolectado todos los lotes, combina los resultados, por ejemplo

ogr2ogr -f gpkg wfs.gpkg batch1.gml -nln data_from_wfs
ogr2ogr -f gpkg -update -append wfs.gpkg batch2.gml -nln data_from_wfs
...

2voto

Joe Puntos 16

Es posible obtener datos de ese servicio utilizando la forma alternativa de conectarse al servidor WFS con un archivo GDAL WFS-XML como se documenta en https://gdal.org/drivers/vector/wfs.html

También es posible especificar el nombre de un archivo XML cuyo contenido coincida con la siguiente sintaxis (el elemento debe ser los primeros bytes del archivo): ...

El archivo de descripción del servicio tiene los siguientes elementos adicionales como hijos inmediatos del elemento OGRWFSDataSource que pueden ser configurados opcionalmente. ...

PagingAllowed: Establecer en ON si se debe habilitar el paginado. Ver la sección "Solicitud de paginado". PageSize: Tamaño de página cuando se habilita el paginado. Ver la sección "Solicitud de paginado".

Copie y pegue el siguiente texto y guárdelo como "wfs.xml" en su computadora.

  http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Edifici.map
  ON
  1000

A continuación, ejecute el comando

ogrinfo wfs.xml

Abra el archivo wfs.xml, debería contener ahora muchos más datos. Luego puede convertir todos los datos del servicio WFS en GeoPackage con el comando

ogr2ogr -f gpkg wfs.gpkg wfs.xml

Si desea seguir lo que está haciendo GDAL, use el comando

ogr2ogr -f gpkg wfs.gpkg wfs.xml --debug on

Según la documentación, también debería ser posible proporcionar las opciones PagingAllowed y PageSize desde la línea de comando como opciones de configuración. Intenté hacerlo sin éxito, pero tal vez use de alguna manera una sintaxis incorrecta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X