Văd biblioteci precum shape din shapely.geometry care acceptă conversie la binare WKB și WKT. Ceea ce nu reușesc să găsesc sunt îndrumări privind conversia în EWKB în mod specific.

Bănuiesc că acest lucru se datorează faptului că bibliotecile care acceptă conversia WKB acceptă și EWKB? De unde știu dacă creez un EWKB vs. WKB? Sunt toate WKB și EWKB (dar nu invers)?

Dacă EWKB este o extensie a WKB, cum aș verifica dacă, de exemplu, Shapely, acceptă formatul EWKB?

Încerc să înțeleg dacă EWKB este standard sau ceva care tocmai a fost creat pentru PostGIS (unde l-am văzut folosit) și cum mă pot asigura că datele pe care le produc pentru o funcție care se așteaptă ca EWKB să poată fi formatate corect.

Din cauza comentariului lui @shongololo, am vrut să adaug un fragment din ceea ce urmează în prezent pentru a genera WKB-ul formei din 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") 

Comentarii

  • Cu shapely utilizați modulul wkb și setați opțiunea hex la true, de exemplu wkb.loads (geom, hex = true)
  • Mulțumesc @ shongololo – Aveți vreo șansă să explicați ce face, inclusiv booleanul hexagonal ca parametru? Se pare că utilizați o bibliotecă wkb? Este de la Shapely?

Răspuns

Shapely se bazează pe GEOS, care citește / scrie nativ EWK B. Suportul pentru dimensiunea Z al EWKB (diferit de ISO) este bine susținut de GEOS / Shapely, dar obținerea / setarea SRID-urilor este o caracteristică ascunsă. Aici „o demonstrație rapidă:

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 

Rețineți că, dacă nu se utilizează SRID și geometriile sunt simple 2D, atunci ISO WKB și EWKB sunt aceleași.

Comentarii

  • Mulțumim, acesta este un răspuns minunat. Sper că nu a fost ' t " formă greșită " pentru a trece la cel mai bun răspuns, dar abordează cel mai direct întrebarea și oferă exemple care se aplică imediat.

Răspuns

Pentru a răspunde la întrebarea dvs.

Aveți vreo șansă de a explica ce face inclusiv booleanul hexagonal ca parametru?

Întoarce un șir codificat hexagonal. Modulul la care a făcut referire ( wkb) este un modul bine format.

Iată pagina documentație pentru bine. poate căuta în pagină (ctrl + f) shapely.wkb.loads.

posteritate, întrebarea citată mai sus a fost ca răspuns la un răspuns de către shongololo.

Cu bine utilizați modulul wkb și setați opțiunea hex la adevărat, de ex. wkb.loads (geom, hex = true) – shongololo

Comentarii

  • Mulțumesc. Și când hex este adevărat, produsul este un fișier EWKB? Asta înseamnă că tot EWKB este codificat hexagonal WKB? Am avut o " intuiție " că includerea SRID a fost, de asemenea, o componentă a EWKB și nu este inclusă în WKB în mod implicit. Aveți vreo șansă ca acest lucru să fie adevărat sau ceea ce spun chiar are sens în această privință?
  • Cred că WKB codificat hexagonal este EWKB. Cred că și tu ai dreptate când crezi că EWKB are un SRID. Iată un link către o altă întrebare . Primul răspuns explică multe despre EWKB. Aș sugera, de asemenea, să analizăm informațiile legate de răspuns.
  • Nu, WKB codificat hexagonal este doar o reprezentare non-binară a WKB. EWKB poate include un SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *