Vedo librerie come shape
da shapely.geometry
che supportano conversione in binari WKB e WKT. Quello che non riesco a trovare è una guida specifica per la conversione in EWKB.
Sospetto che ciò sia dovuto al fatto che le librerie che supportano la conversione WKB supportano anche EWKB? Come faccio a sapere se sto creando un EWKB vs WKB? Tutti i WKB sono anche EWKB (ma non viceversa)?
Se EWKB è unestensione di WKB, come posso verificare che, ad esempio, Shapely, supporti il formato EWKB?
Sto cercando di capire se EWKB è standard o qualcosa che è stato appena creato per PostGIS (dove lho visto usato) e come posso assicurarmi che i dati che sto producendo per una funzione che prevede che EWKB possano essere formattati correttamente.
A causa del commento di @shongololo, volevo aggiungere uno snippet di ciò che sto per generare attualmente per generare il WKB della forma da 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")
Commenti
- Con shapely usa il modulo wkb e imposta lopzione hex su true, ad es. wkb.loads (geom, hex = true)
- Grazie @shongololo – Cè qualche possibilità che tu possa approfondire cosa sta facendo linclusione di esadecimale booleano come parametro? Sembra che tu stia usando una libreria wkb? È di Shapely?
Answer
Shapely si basa su GEOS, che legge / scrive nativamente EWK B. Il supporto della dimensione Z di EWKB (diverso da ISO) è ben supportato da GEOS / Shapely, ma ottenere / impostare SRID è una caratteristica nascosta. Ecco “una rapida demo:
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
Nota che se SRID non viene utilizzato e le geometrie sono 2D semplici, ISO WKB ed EWKB sono uguali.
Commenti
- Grazie, questa è una risposta eccezionale. Spero che non fosse ' t " formato errato " per passare alla risposta migliore, ma affronta più direttamente la domanda e fornisce esempi immediatamente applicabili.
Rispondi
Per rispondere alla tua domanda
Cè qualche possibilità che potresti elaborare su cosa sta facendo linclusione del booleano esadecimale come parametro?
Restituisce una stringa codificata esadecimale. Il modulo a cui si riferiva ( wkb
) è un modulo formoso.
Ecco la pagina della documentazione per shapely. Tu può cercare shapely.wkb.loads
nella pagina (ctrl + f).
Per posteri, la domanda sopra citata era in risposta a una risposta di shongololo.
Con shapely usa il modulo wkb e imposta lopzione hex su true, ad es. wkb.loads (geom, hex = true) – shongololo
Commenti
- Grazie. E quando hex è vero, il prodotto è un file EWKB? Significa che tutto ciò che è EWKB è codificato in esadecimale WKB? Avevo " intuizione " che linclusione SRID fosse anche un componente di EWKB e non è inclusa in WKB per impostazione predefinita. Cè qualche possibilità che questo sia vero o quello che sto dicendo ha anche senso a questo proposito?
- Credo che WKB con codifica esadecimale sia EWKB. Penso che tu abbia anche ragione nel pensare che EWKB abbia un SRID. Ecco un link a unaltra domanda . La prima risposta spiega molto su EWKB. Suggerirei anche di guardare le informazioni collegate dalla risposta.
- No, WKB con codifica esadecimale è solo una rappresentazione non binaria di WKB. EWKB può includere un SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT