Näen kirjastot, kuten shape
osoitteesta shapely.geometry
, jotka tukevat muuntaminen WKB- ja WKT-binaareiksi. Mitä en löydä, on ohjeet erityisesti EWKB: ksi siirtymisestä.
Epäilen tämän johtuvan siitä, että WKB-muunnosta tukevat kirjastot tukevat myös EWKB: tä? Mistä tiedän, luonko EWKB vs. WKB? Ovatko kaikki WKB myös EWKB (mutta eivät päinvastoin)?
Jos EWKB on WKB: n laajennus, kuinka voin tarkistaa, että esimerkiksi Shapely tukee EWKB-muotoa?
Yritän ymmärtää, onko EWKB vakio vai jotain, joka on juuri rakennettu PostGIS: ää varten (missä olen nähnyt sen käytetyn) ja kuinka voin varmistaa, että EWKB: n odottavalle toiminnolle tuottamani tiedot voidaan muotoilla oikein.
@shongololon kommentin takia halusin lisätä katkelman siitä, mitä aion tällä hetkellä luoda muodon WKB GeoJSONista.
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")
Kommentit
- Käytä wkb-moduulia muodollisesti ja aseta hex-asetukseksi true, esim. wkb.loads (geom, hex = true)
- Kiitos @shongololo – Mahdollisuudet voisit tarkentaa, mitä hex-looginen parametri mukaan lukien tekee? Näyttää siltä, että käytät kirjastoa wkb? Onko se peräisin Shapelystä?
Vastaus
Shapely perustuu GEOS: iin, joka lukee / kirjoittaa luonnollisesti EWK: ta B. GEOS / Shapely tukee hyvin EWKB: n Z-ulottuvuustukea (erilainen kuin ISO), mutta SRID-tunnusten saaminen / asettaminen on piilotettu ominaisuus. Tässä on nopea esittely:
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
Huomaa, että jos SRID: tä ei käytetä ja geometriat ovat yksinkertaisia 2D, ISO WKB ja EWKB ovat samat.
Kommentit
- Kiitos, tämä on loistava vastaus. Toivon, että sitä ei ollut ' t " huono muoto " vaihtaaksesi tämän parhaan vastauksen, mutta se vastaa suoraan kysymykseen ja tarjoaa välittömästi soveltuvia esimerkkejä.
Vastaa
Vastaa kysymykseesi
Voisitko tarkentaa, mitä hex-looginen parametri mukaan lukien tekee?
Se palauttaa heksakoodatun merkkijonon. Moduuli, johon hän viittasi ( wkb
) on muodokas moduuli.
Tässä on muotoilun -dokumentaatio -sivu. voi hakea sivulta (ctrl + f) sanaa shapely.wkb.loads
.
jälkipolville, edellä mainittu kysymys oli vastaus shongololon vastaukseen.
Käytä wkb-moduulia muodollisesti ja aseta hex-vaihtoehto tosi, esim. wkb.loads (geom, hex = true) – shongololo
Kommentit
- Kiitos. Ja kun hex on totta, tuote on EWKB-tiedosto? Tarkoittaako tämä, että kaikki EWKB on WKB-heksakoodattu? Minulla oli " aavistus " että SRID-sisällyttäminen oli myös EWKB: n osa eikä sitä ole oletusarvoisesti WKB: ssä. Kaikki mahdollisuudet, että tämä on totta tai mitä sanon, on jopa järkevää tältä osin?
- Uskon, että heksakoodattu WKB on EWKB. Mielestäni olet myös oikeassa ajattellessasi, että EWKB: llä on SRID. Tässä on linkki toiseen kysymykseen . Ensimmäinen vastaus selittää paljon EWKB: stä. Ehdotan myös, että tarkastellaan linkitettyä tietoa vastauksesta.
- Ei, heksakoodattu WKB on vain ei-binäärinen WKB: n esitys. EWKB voi sisältää SRID: n. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT