Jeg ser biblioteker som shape
fra shapely.geometry
som støtter konvertering til WKB- og WKT-binærfiler. Det jeg ikke finner er veiledning om konvertering til EWKB spesifikt.
Jeg mistenker at dette er fordi biblioteker som støtter WKB-konvertering også støtter EWKB? Hvordan vet jeg om jeg oppretter en EWKB vs WKB? Er alle WKB også EWKB (men ikke omvendt)?
Hvis EWKB er en utvidelse av WKB, hvordan vil jeg sjekke det, si Shapely, støtter EWKB-format?
Jeg prøver å forstå om EWKB er standard eller noe som nettopp ble bygget for PostGIS (der jeg har sett det brukt), og hvordan jeg kan sørge for at dataene jeg produserer for en funksjon som forventer at EWKB kan formateres riktig.
På grunn av @shongololos kommentar, ønsket jeg å legge til et utdrag av det jeg skal for øyeblikket for å generere WKB av formen fra 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")
Kommentarer
- Bruk velformet wkb-modulen og sett hex-alternativet til true, f.eks. wkb.loads (geom, hex = true)
- Takk @shongololo – Enhver sjanse for at du kan utdype hva inkludert hex boolean som parameter gjør? Ser ut som om du bruker et bibliotek wkb? Er det fra Shapely?
Svar
Shapely er basert på GEOS, som naturlig leser / skriver EWK B. Z-dimensjonsstøtten til EWKB (forskjellig fra ISO) støttes godt av GEOS / Shapely, men å få / sette SRID er en skjult funksjon. Her er en rask 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
Merk at hvis SRID ikke brukes og geometriene er enkle 2D, så er ISO WKB og EWKB de samme.
Kommentarer
- Takk, dette er et kjempefint svar. Jeg håper det ikke var ' t " dårlig form " for å bytte dette til det beste svaret, men det adresserer mest direkte spørsmålet og gir eksempler som er umiddelbart anvendelige.
Svar
For å svare på spørsmålet ditt
Enhver sjanse for at du kan utdype hva inkludert hex boolean som parameter gjør?
Det returnerer en hex-kodet streng. Modulen han refererte til ( wkb
) er en velskapt modul.
Her er dokumentasjon -siden for formfull. Du kan søke på siden (ctrl + f) for shapely.wkb.loads
.
For ettertiden var spørsmålet sitert ovenfor som svar på et svar fra shongololo.
Bruk velformet wkb-modulen og sett hex-alternativet til sant, f.eks. wkb.loads (geom, hex = true) – shongololo
Kommentarer
- Takk. Og når hex er sant, er produktet en EWKB-fil? Betyr det at alt EWKB er er WKB hex-kodet? Jeg hadde en " hunch " at SRID-inkludering også var en del av EWKB og ikke er inkludert i WKB som standard. Enhver sjanse for at dette er sant, eller det jeg sier, gir mening i den forbindelse?
- Jeg tror at hex-kodet WKB er EWKB. Jeg tror du også har rett i å tro at EWKB har et SRID. Her er en lenke til et annet spørsmål . Det første svaret forklarer mye om EWKB. Jeg vil også foreslå å se på den koblede informasjonen fra svaret.
- Nei, hex-kodet WKB er bare en ikke-binær representasjon av WKB. EWKB kan inkludere et SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT