Jag ser bibliotek som shape
från shapely.geometry
som stöder konvertering till WKB- och WKT-binärer. Vad jag inte kan hitta är vägledning för konvertering till EWKB specifikt.
Jag misstänker att detta beror på att bibliotek som stöder WKB-konvertering också stöder EWKB? Hur vet jag om jag skapar en EWKB vs WKB? Är alla WKB också EWKB (men inte tvärtom)?
Om EWKB är en förlängning av WKB, hur skulle jag kontrollera det, säg Shapely, stöder EWKB-format?
Jag försöker förstå om EWKB är standard eller något som just byggdes för PostGIS (där jag har sett det används) och hur jag kan se till att data jag producerar för en funktion som förväntar sig att EWKB kan formateras korrekt.
På grund av @shongololos kommentar ville jag lägga till ett utdrag av vad jag för närvarande ska generera WKB för formen från 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
- Använd välformad wkb-modul och ställ in hexalternativet till true, t.ex. wkb.loads (geom, hex = true)
- Tack @shongololo – Någon chans att du kan utarbeta vad inklusive hex boolean som parameter gör? Ser ut som om du använder ett bibliotek wkb? Är det från Shapely?
Svar
Shapely är baserat på GEOS, som inbyggt läser / skriver EWK B. Z-dimensionens stöd för EWKB (skiljer sig från ISO) stöds väl av GEOS / Shapely, men att få / ställa in SRID är en dold funktion. Här är en snabb 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
Observera att om SRID inte används och geometrier är enkla 2D, så är ISO WKB och EWKB desamma.
Kommentarer
- Tack, det här är ett fantastiskt svar. Jag hoppas att det inte var ' t " dålig form " för att byta till det bästa svaret, men det adresserar frågan direkt och ger exempel som är omedelbart tillämpliga.
Svar
För att svara på din fråga
Någon chans att du kan utveckla vad inklusive hex boolean som parameter gör?
Det returnerar en hexkodad sträng. Modulen han hänvisade till ( wkb
) är en välformad modul.
Här är dokumentation sidan för välformad. Du kan söka på sidan (ctrl + f) för shapely.wkb.loads
.
För eftertiden var frågan som citerades ovan som svar på ett svar från shongololo.
Använd välformad wkb-modulen och ställ in hexalternativet till sant, t.ex. wkb.loads (geom, hex = true) – shongololo
Kommentarer
- Tack. Och när hex är sant är produkten en EWKB-fil? Betyder det att allt EWKB är är WKB hex-kodat? Jag hade en " hunch " att SRID-inkludering också var en del av EWKB och inte ingår i WKB som standard. Någon chans att detta är sant eller vad jag säger till och med vettigt i det avseendet?
- Jag tror att hex-kodad WKB är EWKB. Jag tror att du också har rätt i att EWKB har ett SRID. Här är en länk till en annan fråga . Det första svaret förklarar mycket om EWKB. Jag föreslår också att man tittar på den länkade informationen från svaret.
- Nej, hex-kodad WKB är bara en icke-binär representation av WKB. EWKB kan inkludera ett SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT