2 votos

¿Por qué psycopg2 "SELECT ST_AsBinary(geom)" devuelve "<buffer de sólo lectura...>"?

Estoy intentando recuperar polígonos de una base de datos postgresql y me encuentro con varios problemas. En primer lugar, he sido capaz de obtener ST_AsText(geom) para trabajar en conjunto con arcpy.FromWKT() pero la precisión se pierde como se describe en el Documentos de PostGIS :

El formato WKT no mantiene la precisión, así que para evitar el truncamiento flotante, utilice el formato ST_AsBinary o ST_AsEWKB para el transporte.

Pero cuando intento utilizar ST_AsBinary o ST_AsEWKB con arcpy.FromWKB Me salen estos errores:

cur.execute("SELECT ST_AsBinary(geom) FROM master.modeled_yield_hotspots WHERE model_id = 4;")
lsTemp = cur.fetchall()
lsGeom = []
for j in range(0, len(lsTemp)):
    lsGeom.append(arcpy.FromWKB(lsTemp[j]))
arcpy.CopyFeatures_management(lsGeom, pathScratchGDB + "fcHotspots")

Traceback (most recent call last):
  File "C:\SmartFarm_Tools\python_scripts\testing.py", line 24, in <module>
    lsGeom.append(arcpy.FromWKB(lsTemp[j]))
  File "C:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\__init__.py", line 1640, in FromWKB
    return gp.createObject("geometry", byte_array, None, spatial_reference)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\geoprocessing\_base.py", line 379, in createObject
    self._gp.CreateObject(*gp_fixargs(args, True)))
RuntimeError: Object: CreateObject cannot create geometry from inputs

Si imprimo lsTemp[j] Me sale lo siguiente:

(<read-only buffer for 0x0000000012808190, size 82146, offset 0 at 0x0000000003092F10>,)

¿Qué es un read-only buffer ? ¿Cómo puedo sacar el WKB de Postgis y meterlo en una clase de característica o en un shapefile?

3voto

hernan43 Puntos 566

Parece que de la documentación que arcpy.FromWKB espera un bytearray que puede obtenerse mediante la función bytearray() función :

cur.execute("""
    SELECT ST_AsBinary(geom)
    FROM master.modeled_yield_hotspots
    WHERE model_id = %s;
""", (4,))
lsGeom = []
for r in cur:
    lsGeom.append(arcpy.FromWKB(bytearray(r[0])))

2voto

traveler Puntos 56

Si ya estás interactuando con tus datos en PostGIS usando ArcPy, podrías simplemente usar un SearchCursor, manipular los datos como sea necesario, y luego insertarlos en una clase de característica shapefile/fGDB usando un InsertCursor.

No necesitas usar Psycopg2 para sacar los datos, el SearchCursor puede encargarse de eso.

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