Je vois des bibliothèques telles que shape
de shapely.geometry
qui prennent en charge conversion en binaires WKB et WKT. Ce que je ne trouve pas, ce sont des conseils sur la conversion en EWKB en particulier.
Je suppose que cest parce que les bibliothèques qui prennent en charge la conversion WKB prennent également en charge EWKB? Comment savoir si je crée un EWKB vs WKB? Est-ce que tous les WKB sont également EWKB (mais pas linverse)?
Si EWKB est une extension de WKB, comment pourrais-je vérifier que, disons, Shapely prend en charge le format EWKB?
Jessaie de comprendre si EWKB est standard ou quelque chose qui vient dêtre construit pour PostGIS (où je lai vu utilisé) et comment je peux massurer que les données que je produis pour une fonction qui sattend à ce que EWKB puissent être correctement formatées.
À cause du commentaire de @shongololo, je voulais ajouter un extrait de ce que je vais actuellement générer le WKB de la forme à partir de 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")
Commentaires
- Avec shapely, utilisez le module wkb et définissez loption hex sur true, par exemple wkb.loads (geom, hex = true)
- Merci @shongololo – Pourriez-vous nous expliquer ce que fait linclusion du booléen hexadécimal comme paramètre? On dirait que vous utilisez une bibliothèque wkb? Est-ce de Shapely?
Réponse
Shapely est basé sur GEOS, qui lit / écrit nativement EWK B. La prise en charge de la dimension Z de EWKB (différente de ISO) est bien prise en charge par GEOS / Shapely, mais lobtention / la définition des SRID est une fonctionnalité cachée. Voici « une démo rapide:
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
Notez que si le SRID nest pas utilisé et que les géométries sont simples 2D, alors ISO WKB et EWKB sont les mêmes.
Commentaires
- Merci, cest une réponse formidable. Jespère que ce nétait pas ' t " mauvaise forme " pour passer à la meilleure réponse, mais il répond le plus directement à la question et fournit des exemples immédiatement applicables.
Réponse
Pour répondre à votre question
Y a-t-il une chance que vous puissiez élaborer sur ce que fait linclusion du booléen hexadécimal comme paramètre?
Il renvoie une chaîne codée hexadécimal. Le module auquel il fait référence ( wkb
) est un module galbé.
Voici la page de documentation pour galbé. Vous peut rechercher la page (ctrl + f) pour shapely.wkb.loads
.
Pour postérité, la question citée ci-dessus était en réponse à une réponse de shongololo.
Avec galbé utilisez le module wkb et définissez loption hexadécimale sur true, par exemple wkb.loads (geom, hex = true) – shongololo
Commentaires
- Merci. Et quand hex est vrai, le produit est un fichier EWKB? Cela signifie-t-il que tous les EWKB sont encodés en hexadécimal WKB? Javais " lintuition " que linclusion SRID était également un composant dEWKB et nest pas incluse dans WKB par défaut. Y a-t-il une chance que cela soit vrai ou ce que je dis a même un sens à cet égard?
- Je crois que le WKB hexadécimal est EWKB. Je pense que vous avez également raison de penser que EWKB a un SRID. Voici un lien vers une autre question . La première réponse en explique beaucoup sur EWKB. Je suggérerais également de regarder les informations liées à partir de la réponse.
- Non, WKB hexadécimal est juste une représentation non binaire de WKB. EWKB peut inclure un SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT