1 votos

¿Por qué el método arcgis.geometry.buffer falla en supuestas geometrías vacías?

Estoy tratando de almacenar en el búfer algunos resultados después de consultar un servicio de características utilizando el arcgis API para Python:

from arcgis.gis import GIS
from arcgis.features import FeatureLayerCollection
from arcgis.geometry import Geometry, buffer

# obtain the LOMR feature
nfhl_url = "https://hazards.fema.gov/gis/nfhl/rest/services/public/NFHL/MapServer"
nfhl = FeatureLayerCollection(nfhl_url)
lomr = nfhl.layers[1]

# define the desired spatial ref for the project
sr = 2876 # NAD83(HARN) / Colorado North (ftUS)

# start an anonymous GIS session
anon_gis = GIS()

# query the service
boulder_lomrs = lomr.query(where="DFIRM_ID = '08013C'", out_sr=sr)

# create a list of geometries to buffer
lomr_geoms = [l.geometry for l in boulder_lomrs.features]

# buffer the polygons
lomr_buffer = buffer(geometries=lomr_geoms, 
                     in_sr=sr, 
                     distances=[1], 
                     unit='ftUS', 
                     out_sr=sr, 
                     buffer_sr=sr, 
                     union_results=True, 
                     gis=anon_gis)

El error que recibo es:

Exception: Unable to complete operation.
The operation was attempted on an empty geometry.
(Error Code: 400)

Sin embargo, he comprobado que todas las geometrías en lomr_geoms son válidos y no están vacíos. Esto me hace pensar que estoy haciendo algo mal con las referencias espaciales y/o las unidades.

¿Por qué recibo este error? El Documentación de ESRI sobre el método del buffer no es muy específico en cuanto a la sintaxis, y afirman erróneamente que unit se derivará del in_sr (he probado a ejecutar el buffer sin el parámetro unit y falló porque es obligatorio).

EDITAR 1

He intentado redefinir cómo se construye la lista de geometrías:

# create a list of geometries to buffer
lomr_geoms = [Geometry(l.geometry) for l in boulder_lomrs.features]

# buffer the polygons
lomr_buffer = buffer(geometries=lomr_geoms, 
                     in_sr=sr, 
                     distances=[1], 
                     unit='ftUS', 
                     out_sr=sr, 
                     buffer_sr=sr, 
                     union_results=True, 
                     gis=anon_gis)

Me sigue apareciendo el mismo código de error, pero por un motivo diferente:

Exception: Unable to complete operation.
(Error Code: 400)

0voto

Aleksandr Dubinsky Puntos 215

Resulta que era un problema con las unidades. Según esto Tema de GitHub Es porque el usuario tiene que introducir la unidad como una de las constantes que entran en ArcObjects.

Ver esta tabla de referencia para obtener la unidad correcta para sus necesidades.

En conjunto, el cambio sólo tenía que ser:

lomr_buffer = buffer(geometries=lomr_geoms, 
                     in_sr=sr, 
                     distances=[1], 
                     unit=9003, #US Survey ft 
                     out_sr=sr, 
                     buffer_sr=sr, 
                     union_results=True, 
                     gis=anon_gis)

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