Vejo bibliotecas como shape de shapely.geometry que suportam conversão para binários WKB e WKT. O que não consigo encontrar são orientações sobre como converter especificamente para EWKB.

Suspeito que seja porque as bibliotecas que oferecem suporte à conversão de WKB também oferecem suporte a EWKB. Como posso saber se estou criando um EWKB versus WKB? Todos os WKB também são EWKB (mas não o contrário)?

Se EWKB for uma extensão de WKB, como eu verificaria se, digamos, Shapely, é compatível com o formato EWKB?

Estou tentando entender se o EWKB é padrão ou algo que acabou de ser construído para PostGIS (onde vi ser usado) e como posso ter certeza de que os dados que estou produzindo para uma função que espera EWKB podem ser formatados corretamente.

Por causa do comentário de @shongololo “, eu queria adicionar um snippet do que irei gerar atualmente o WKB da forma do 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") 

Comentários

  • Com modelagem, use o módulo wkb e defina a opção hex para true, por exemplo, wkb.loads (geom, hex = true)
  • Obrigado @shongololo – Alguma chance de você poder elaborar sobre o que a inclusão do booleano hexadecimal como parâmetro está fazendo? Parece que você está usando uma biblioteca wkb? Isso é do Shapely?

Resposta

Shapely é baseado em GEOS, que lê / escreve EWK nativamente B. O suporte de dimensão Z de EWKB (diferente de ISO) é bem suportado por GEOS / Shapely, mas obter / definir SRIDs é um recurso oculto. Aqui está uma demonstração rápida:

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 

Observe que se SRID não for usado e as geometrias forem 2D simples, então ISO WKB e EWKB são iguais.

Comentários

  • Obrigado, esta é uma resposta excelente. Espero que não tenha sido ' t " forma inadequada " para mudar para a melhor resposta, mas aborda mais diretamente a questão e fornece exemplos que são imediatamente aplicáveis.

Resposta

Para responder à sua pergunta

Alguma chance de você poder entrar em detalhes sobre o que a inclusão do booleano hexadecimal como parâmetro está fazendo?

Ele está retornando uma string codificada em hexadecimal. O módulo ao qual ele se referiu ( wkb) é um módulo modelado.

Aqui está a página de documentação para modelado. Você pode pesquisar a página (ctrl + f) por shapely.wkb.loads.

Por posteridade, a pergunta citada acima foi em resposta a uma resposta de shongololo.

Com bem-feito, use o módulo wkb e defina a opção hex para verdadeiro, por exemplo, wkb.loads (geom, hex = true) – shongololo

Comentários

  • Obrigado. E quando hex é verdadeiro, o produto é um arquivo EWKB? Isso significa que todo o EWKB é codificado em hexadecimal WKB? Tive um " palpite " de que a inclusão de SRID também era um componente do EWKB e não está incluído no WKB por padrão. Alguma chance disso ser verdade ou o que estou dizendo faz sentido a esse respeito?
  • Eu acredito que WKB codificado em hexadecimal é EWKB. Acho que você também está correto em pensar que o EWKB tem um SRID. Aqui está um link para outra pergunta . A primeira resposta explica muito sobre o EWKB. Eu também sugeriria olhar para as informações vinculadas da resposta.
  • Não, o WKB codificado em hexadecimal é apenas uma representação não binária do WKB. O EWKB pode incluir um SRID. postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *