Widzę biblioteki, takie jak shape
z shapely.geometry
, które obsługują konwersja do plików binarnych WKB i WKT. To, czego nie mogę znaleźć, to wskazówki dotyczące przejścia na EWKB.
Podejrzewam, że dzieje się tak dlatego, że biblioteki obsługujące konwersję WKB obsługują również EWKB? Skąd mam wiedzieć, czy tworzę EWKB czy WKB? Czy wszystkie WKB są również EWKB (ale nie na odwrót)?
Jeśli EWKB jest rozszerzeniem WKB, jak mogę sprawdzić, czy, powiedzmy, Shapely obsługuje format EWKB?
Próbuję zrozumieć, czy EWKB jest standardem, czy czymś, co zostało właśnie zbudowane dla PostGIS (gdzie widziałem, że jest używane) i jak mogę się upewnić, że dane, które tworzę dla funkcji, która oczekuje EWKB, mogą być poprawnie sformatowane.
Ze względu na komentarz @shongololo, chciałem dodać fragment tego, co zamierzam obecnie wygenerować WKB kształtu z 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")
Komentarze
- Z shapely użyj modułu wkb i ustaw opcję hex na true, np. wkb.loads (geom, hex = true)
- Dzięki @shongololo – Czy jest szansa, że mógłbyś wyjaśnić, co robi, w tym szesnastkowy boolean jako parametr? Wygląda na to, że używasz biblioteki wkb? Czy to pochodzi z Shapely?
Odpowiedź
Shapely jest oparty na GEOS, który natywnie czyta / zapisuje EWK B. Obsługa wymiaru Z w EWKB (inna niż ISO) jest dobrze obsługiwana przez GEOS / Shapely, ale pobieranie / ustawianie SRID jest ukrytą funkcją. Oto krótkie 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
Zauważ, że jeśli SRID nie jest używany, a geometrie są proste 2D, to ISO WKB i EWKB są takie same.
Komentarze
- Dziękuję, to świetna odpowiedź. Mam nadzieję, że nie ' t zły formularz ", aby przełączyć to na najlepszą odpowiedź, ale najbardziej bezpośrednio odpowiada na pytanie i zawiera przykłady, które można natychmiast zastosować.
Odpowiedź
Aby odpowiedzieć na Twoje pytanie
Jest jakaś szansa, że mógłbyś wyjaśnić, co robi włączenie szesnastkowej wartości logicznej jako parametru?
Zwraca ciąg zakodowany szesnastkowo. wkb
) to zgrabny moduł.
Oto strona dokumentacji dla shapely. może przeszukać stronę (ctrl + f) pod kątem shapely.wkb.loads
.
Dla zacytowane powyżej pytanie było odpowiedzią na odpowiedź shongololo.
Z shapely użyj modułu wkb i ustaw opcję hex na true, np. wkb.loads (geom, hex = true) – shongololo
Komentarze
- Dziękujemy. A jeśli wartość hex jest prawdą, produktem jest plik EWKB? Czy to oznacza, że wszystkie EWKB są kodowane szesnastkowo WKB? Miałem " przeczucie ", że włączenie SRID było również składnikiem EWKB i domyślnie nie jest uwzględnione w WKB. Czy jest jakaś szansa, że to prawda lub to, co mówię, ma sens w tym względzie?
- Uważam, że WKB zakodowany szesnastkowo to EWKB. Myślę, że masz również rację sądząc, że EWKB ma SRID. Oto link do innego pytania . Pierwsza odpowiedź wiele wyjaśnia o EWKB. Sugerowałbym również przyjrzenie się połączonym informacjom z odpowiedzi.
- Nie, WKB zakodowany szesnastkowo jest po prostu niebinarną reprezentacją WKB. EWKB może zawierać SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT