Veo bibliotecas como shape de shapely.geometry que admiten conversión a binarios WKB y WKT. Lo que no puedo encontrar es una guía sobre cómo convertir a EWKB específicamente.

¿Sospecho que esto se debe a que las bibliotecas que admiten la conversión WKB también admiten EWKB? ¿Cómo sé si estoy creando un EWKB vs WKB? ¿Todos los WKB son también EWKB (pero no al revés)?

Si EWKB es una extensión de WKB, ¿cómo comprobaría que, digamos, Shapely, admite el formato EWKB?

Estoy tratando de entender si EWKB es estándar o algo que se acaba de construir para PostGIS (donde lo he visto usar) y cómo puedo asegurarme de que los datos que estoy produciendo para una función que espera que EWKB se puedan formatear correctamente.

Debido al comentario de @shongololo, quería agregar un fragmento de lo que voy a generar actualmente para generar el WKB de la forma de GeoJSON.

from shapely.geometry import shape import binascii # convert geom to wkb format geom_str = json.dumps(route["geometry"]) geom_geo = geojson.loads(geom_str) geom_shp = shape(geom_geo) geom_wkb = geom_shp.to_wkb() geom_cln = binascii.hexlify(geom_wkb).decode("ascii") 

Comentarios

  • Con shapely, use el módulo wkb y establezca la opción hexadecimal en true, por ejemplo, wkb.loads (geom, hex = true)
  • Gracias @shongololo – ¿Alguna posibilidad de que puedas explicar qué está haciendo incluir el booleano hexadecimal como parámetro? ¿Parece que estás usando una biblioteca wkb? ¿Es de Shapely?

Answer

Shapely se basa en GEOS, que lee / escribe de forma nativa EWK B. El soporte de dimensión Z de EWKB (diferente de ISO) está bien soportado por GEOS / Shapely, pero obtener / configurar SRID es una característica oculta. Aquí hay una demostración rápida:

from shapely import geos, wkb, wkt # Show EWKB p = wkt.loads("POINT Z(1 2 3)") print(p.wkb_hex) # This is little endian EWKB with just PointZ bit set # 0101000080000000000000F03F00000000000000400000000000000840 # Change a the default mode to add this, if SRID is set geos.WKBWriter.defaults["include_srid"] = True # Get/Set SRID print(geos.lgeos.GEOSGetSRID(p._geom)) # 0, or unset # Set it to EPSG:4326 geos.lgeos.GEOSSetSRID(p._geom, 4326) print(p.wkb_hex) # This is little endian EWKB with SRID and PointZ bit set # 01010000A0E6100000000000000000F03F00000000000000400000000000000840 # And for fun, change the output to big endian geos.WKBWriter.defaults["big_endian"] = True print(p.wkb_hex) # 00A0000001000010E63FF000000000000040000000000000004008000000000000 

Tenga en cuenta que si no se utiliza SRID y las geometrías son 2D simples, ISO WKB y EWKB son iguales.

Comentarios

  • Gracias, esta es una excelente respuesta. Espero que no haya sido ' t " forma incorrecta " para cambiar esto a la mejor respuesta, pero aborda la pregunta de manera más directa y proporciona ejemplos que son inmediatamente aplicables.

Responder

Para responder a su pregunta

¿Alguna posibilidad de que puedas explicar qué está haciendo incluir el booleano hexadecimal como parámetro?

Está devolviendo una cadena codificada en hexadecimal. El módulo al que se refirió ( wkb) es un módulo bien proporcionado.

Aquí está la página de documentación para shapely. puede buscar en la página (ctrl + f) shapely.wkb.loads.

Para posteridad, la pregunta citada anteriormente fue en respuesta a una respuesta de shongololo.

Con bien proporcionado, use el módulo wkb y establezca la opción hexadecimal en verdadero, p. wkb.loads (geom, hex = true) – shongololo

Comentarios

  • Gracias. Y cuando hexadecimal es verdadero, ¿el producto es un archivo EWKB? ¿Significa eso que todo EWKB está codificado en hexadecimal WKB? Tuve una " corazonada " de que la inclusión de SRID también era un componente de EWKB y no está incluida en WKB por defecto. ¿Alguna posibilidad de que esto sea cierto o que lo que estoy diciendo tenga sentido en ese sentido?
  • Creo que WKB con codificación hexadecimal es EWKB. Creo que también tiene razón al pensar que EWKB tiene un SRID. Aquí hay un enlace a otra pregunta . La primera respuesta explica mucho sobre EWKB. También sugeriría mirar la información vinculada de la respuesta.
  • No, WKB codificado en hexadecimal es solo una representación no binaria de WKB. EWKB puede incluir un SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *