Ich sehe Bibliotheken wie shape
von shapely.geometry
, die dies unterstützen Konvertierung in WKB- und WKT-Binärdateien. Was ich nicht finden kann, ist eine Anleitung zur spezifischen Umstellung auf EWKB.
Ich vermute, das liegt daran, dass Bibliotheken, die die WKB-Konvertierung unterstützen, auch EWKB unterstützen. Woher weiß ich, ob ich eine EWKB gegen eine WKB erstelle? Sind alle WKB auch EWKB (aber nicht umgekehrt)?
Wenn EWKB eine Erweiterung von WKB ist, wie würde ich überprüfen, ob beispielsweise Shapely das EWKB-Format unterstützt?
Ich versuche zu verstehen, ob EWKB Standard ist oder etwas, das nur für PostGIS erstellt wurde (wo ich es verwendet habe) und wie ich sicherstellen kann, dass Daten, die ich für eine Funktion produziere, die EWKB erwartet, korrekt formatiert werden können. P. >
Aufgrund des Kommentars von @shongololo wollte ich einen Ausschnitt dessen hinzufügen, was ich derzeit tun werde, um die WKB der Form aus GeoJSON zu generieren.
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")
Kommentare
- Verwenden Sie bei formschönem Gebrauch das wkb-Modul und setzen Sie die Hex-Option auf true, z. B. wkb.loads (geom, hex = true)
- Danke @shongololo – Gibt es eine Möglichkeit, herauszufinden, was das Einbeziehen des Hex-Booleschen Wertes als Parameter bewirkt? Sieht aus, als würden Sie eine Bibliothek wkb verwenden? Ist das von Shapely?
Antwort
Shapely basiert auf GEOS, das EWK nativ liest / schreibt B. B. Die Z-dimensionale Unterstützung von EWKB (anders als ISO) wird von GEOS / Shapely gut unterstützt, aber das Abrufen / Einstellen von SRIDs ist eine versteckte Funktion. Hier „eine schnelle 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
Beachten Sie, dass ISO WKB und EWKB identisch sind, wenn SRID nicht verwendet wird und die Geometrien einfach 2D sind.
Kommentare
- Danke, dies ist eine großartige Antwort. Ich hoffe, es war nicht ' t " schlechte Form ", um dies auf die beste Antwort umzuschalten, aber es geht am direktesten auf die Frage ein und liefert Beispiele, die sofort anwendbar sind.
Antwort
Um auf Ihre Frage zu antworten
Gibt es eine Möglichkeit, näher darauf einzugehen, was das Einbeziehen des Hex-Booleschen Wertes als Parameter bewirkt?
Es wird eine hexadezimal codierte Zeichenfolge zurückgegeben. Das Modul, auf das er verwies ( wkb
) ist ein formschönes Modul.
Hier ist die Dokumentationsseite für formschöne kann die Seite (Strg + f) nach shapely.wkb.loads
durchsuchen.
Für Nachwelt war die oben zitierte Frage eine Antwort auf eine Antwort von Shongololo.
Verwenden Sie das wkb-Modul formschön und setzen Sie die Hex-Option auf true, z. wkb.loads (geom, hex = true) – shongololo
Kommentare
- Danke. Und wenn hex wahr ist, ist das Produkt eine EWKB-Datei? Bedeutet das, dass alle EWKB WKB hexadezimal codiert sind? Ich hatte eine " Vermutung ", dass die SRID-Aufnahme auch eine Komponente von EWKB war und standardmäßig nicht in WKB enthalten ist. Gibt es eine Chance, dass dies wahr ist oder was ich sage, in dieser Hinsicht überhaupt Sinn macht?
- Ich glaube, dass hexadezimal codiertes WKB EWKB ist. Ich denke, Sie haben auch Recht damit, dass die EWKB eine SRID hat. Hier ist ein Link zu einer anderen Frage . Die erste Antwort erklärt viel über EWKB. Ich würde auch vorschlagen, die verknüpften Informationen aus der Antwort zu betrachten.
- Nein, hexadezimal codiertes WKB ist nur eine nicht-binäre Darstellung von WKB. EWKB kann eine SRID enthalten. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT