Jeg ser biblioteker som shape
fra shapely.geometry
der understøtter konvertering til WKB og WKT binære filer. Hvad jeg ikke kan finde, er vejledning til konvertering til EWKB specifikt.
Jeg formoder, at dette skyldes, at biblioteker, der understøtter WKB-konvertering, også understøtter EWKB? Hvordan ved jeg, om jeg opretter en EWKB vs WKB? Er alle WKB også EWKB (men ikke omvendt)?
Hvis EWKB er en udvidelse af WKB, hvordan ville jeg så kontrollere, at vi siger, Shapely, understøtter EWKB-format?
Jeg prøver at forstå, om EWKB er standard eller noget, der lige er bygget til PostGIS (hvor jeg har set det brugt), og hvordan jeg kan sikre, at data, jeg producerer til en funktion, der forventer, at EWKB kan formateres korrekt.
På grund af @shongololos kommentar ville jeg tilføje et uddrag af det, jeg i øjeblikket vil generere WKB for 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
- Brug wkb-modulet med velformet og indstil hex-indstillingen til true, f.eks. wkb.loads (geom, hex = true)
- Tak @shongololo – Enhver chance for at du kunne uddybe hvad inklusive hex boolesk som en parameter gør? Ser ud til at du bruger et bibliotek wkb? Er det fra Shapely?
Svar
Shapely er baseret på GEOS, som indbygget læser / skriver EWK B. Z-dimension understøttelse af EWKB (forskellig fra ISO) understøttes godt af GEOS / Shapely, men at få / indstille SRIDer er en skjult funktion. Her er “en hurtig 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
Bemærk, at hvis SRID ikke bruges, og geometrierne er enkle 2D, så er ISO WKB og EWKB de samme.
Kommentarer
- Tak, dette er et fantastisk svar. Jeg håber, det ikke var ' t " dårlig form " for at skifte dette til det bedste svar, men det adresserer mest spørgsmålet og giver eksempler, der er umiddelbart anvendelige.
Svar
For at svare på dit spørgsmål
Enhver chance for, at du kunne uddybe, hvad inklusive hex boolean som parameter gør?
Det returnerer en hex-kodet streng. Det modul, han henviste til ( wkb
) er et velformet modul.
Her er dokumentationen side til formet. Du kan søge på siden (ctrl + f) for shapely.wkb.loads
.
For eftertiden var spørgsmålet, der blev citeret ovenfor, svar på et svar fra shongololo.
Brug velformet wkb-modulet og indstil hex-indstillingen til sand, f.eks. wkb.loads (geom, hex = true) – shongololo
Kommentarer
- Tak. Og når hex er sandt, er produktet en EWKB-fil? Betyder det, at alt, hvad EWKB er, er WKB hex-kodet? Jeg havde en " hunch " at SRID-inkludering også var en komponent i EWKB og ikke er inkluderet i WKB som standard. Enhver chance for, at dette er sandt, eller hvad jeg siger, giver endda mening i den henseende?
- Jeg tror, at hex-kodet WKB er EWKB. Jeg tror, du også har ret i at tro, at EWKB har et SRID. Her er et link til et andet spørgsmål . Det første svar forklarer meget om EWKB. Jeg vil også foreslå at se på de sammenkædede oplysninger fra svaret.
- Nej, hex-kodet WKB er bare en ikke-binær repræsentation af WKB. EWKB kan omfatte et SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT