Como o progresso do projeto foi objeto de vários artigos e atualizações, estamos fornecendo um documento resumido (PDF) no seguinte link
Resumo final: banco de dados do Geopackage ENC
Ele lhe dará uma visão geral completa e coerente de todas as etapas envolvidas na criação e no carregamento de um banco de dados ENC no QGis em formato de geopackage e de todos os elementos necessários (.bat, .py, .svg) para configurar uma simbologia automática apropriada.
O projeto para integrar os mapas ENC ao QGis na forma de Geopackage está concluído. Este artigo completa os dois artigos publicados anteriormente sobre a configuração e o gerenciamento do banco de dados do Geopackage.
No primeiro artigo: Criação de um banco de dados Geopackage para mapas ENC (Parte 1: criação do banco de dados), você encontrará os fundamentos do trabalho com geopacotes para integrar dados de arquivos S57 (ENC). Você deve começar por este artigo para entender o procedimento de importação de arquivos S57 com o ogr2ogr, bem como as várias etapas envolvidas na formatação dos dados. Você também poderá fazer download de todas as ferramentas (arquivos de comando .bat, scripts python) necessárias para concluir essas etapas.
Após a publicação desse artigo, continuamos a trabalhar em um procedimento equivalente, mas usando um banco de dados PostgreSQL/postgis. Isso nos permitiu encontrar várias melhorias no fluxo de trabalho inicial.
Um segundo artigo, Update(1): banco de dados ENC com Geopackage no QGis, atualiza o procedimento de importação (arquivos .bat com comandos ogr2ogr) para facilitar o gerenciamento de informações duplicadas. Essas duplicações ocorrem quando mapas em escalas diferentes são integrados ao mesmo banco de dados. A adição de um atributo de “finalidade” ao mapa ENC significa que somente informações exclusivas podem ser exibidas para cada finalidade do mapa.
Como o objetivo do projeto era produzir uma simbologia no QGis que fosse equivalente à dos mapas em papel, ainda havia um ponto a ser resolvido: levar em conta o parâmetro de “qualidade” da posição dos objetos geográficos. Esse é o principal ponto abordado neste artigo.
Os três artigos são complementares em termos de conteúdo, mas para os arquivos disponibilizados, baixe apenas os arquivos sugeridos neste artigo. Eles terminam com ‘V3’ e certifique-se de que está usando a versão mais recente.
O formato S57 e o GIS
Se você vai começar a trabalhar com arquivos S57 em um GIS, há alguns aspectos que você precisa conhecer para navegar sem problemas.
Em primeiro lugar, a estrutura dos arquivos S57 não corresponde às estruturas adotadas no GIS.
Em um GIS, você tem um objeto geográfico que é representado por uma tabela com dois tipos de informações: a geometria das entidades no objeto e os atributos dessas entidades.
Se você tiver outros objetos com geometrias idênticas, as informações geométricas serão duplicadas, uma vez em cada tabela.
No formato S57, o principal objetivo é otimizar o armazenamento de informações e, portanto, não duplicar informações. Se um objeto tiver uma entidade de ponto, será criado um ponto. Se outros objetos tiverem entidades localizadas nesse ponto, será usada a referência do ponto que já foi criado. Dessa forma, um ponto é descrito apenas uma vez no arquivo. O mesmo se aplica a polilinhas e superfícies. Portanto, um arquivo S57 terá uma série de tabelas contendo informações geométricas, conhecidas como “primitivas”:
- IsolatedNode (pontos)
- ConnectedNode (pontos)
- Edge (polilinhas)
- Face (polígonos)
A tabela de atributos para os vários objetos S57 contém apenas os atributos dos objetos.
O que complica a tarefa é que há dois atributos que se referem às geometrias: posacc (a precisão estimada da posição, um valor quantitativo) e quapos (a qualidade da posição, uma variável qualitativa).
Esses dois atributos podem ser encontrados nas tabelas primitivas.
Para mudar da estrutura S57 para uma estrutura GIS (shapefile, geopackage, postgis), usamos a biblioteca GDAL e seu comando ogr2ogr.
Esse comando criará tabelas GIS a partir da estrutura S57, criando uma tabela por objeto S57, atribuindo a geometria correspondente das tabelas primitivas a cada entidade e adicionando os atributos do objeto S57 a cada entidade. O rastreamento das primitivas usadas para a geometria de cada entidade pode ser encontrado no campo NAME_RCID das tabelas GIS, desde que as opções -oo “RETURN_LINKAGES=ON” -oo “LNAM_REFS=ON” tenham sido adicionadas à linha de comando do ogr2ogr.
A figura a seguir mostra uma camada do tipo ponto. O valor indicado no campo NAME_RCID é o RCID do ponto usado na tabela IsolatedNode.
A figura a seguir mostra um exemplo de uma camada do tipo linear. Os valores indicados no campo NAME_RCID são os dos RCIDs das polilinhas usadas na tabela Edge.
A figura a seguir mostra um exemplo de uma camada do tipo polígono. Os valores indicados no campo NAME_RCID são os das polilinhas usadas na tabela Edge.
Para recuperar os atributos QUAPOS e POSACC de cada entidade nas tabelas de tipo de ponto, precisamos recuperar os valores do ponto IsolatedNode e atribuí-los às tabelas dos vários objetos ENC.
Se os identificadores fossem diretamente os RCIDs nas tabelas ENC, poderíamos fazer uma junção entre cada tabela (soundg, obstrn,…) e IsolatedNode. Mas, como você pode ver nas imagens anteriores, o atributo NAME_RCID é do tipo stringlist, o que bloqueia essa solução. Portanto, desenvolvemos um script python que faz o trabalho quando os dados do S57->geopackage são carregados.
Download de arquivos V3
Você pode baixar todos os arquivos .bat e .py mencionados neste artigo a partir deste link.
Modificação dos comandos do ogr2ogr para importação de arquivos S57
Importação de camadas de “pontos
Para importar primitivas de arquivos S57, é necessário adicionar a opção -oo RETURN_PRIMITIVES = ON aos comandos de importação. No caso de pontos, você também precisa adicionar a opção -nlt MULTIPOINT, caso contrário, a tabela IsolatedNode será criada como um ponto e não haverá suporte para camadas multiponto.
O arquivo .bat para importação de camadas do tipo ponto será então :
Para executá-lo, abra uma janela do OSGeo4W Shell, vá para o diretório que contém os arquivos .bat e digite o comando:
.\mass_load_s57_points_V3.bat directory_files_000 path/pointsENC.gpkg
Primeiro, edite o arquivo para alterar as linhas:
python c:/testgpkgV3/update_geopackage_dsid_prp_prim.py “%output_geopackage%” “!file!”
e
python c:/testgpkgV3/add_posacc_quapos_to_pointsV3.py
Para inserir os caminhos que você escolheu para armazenar os scripts python.
O primeiro script, update_geopackage_dsid_V3.py, foi modificado para adicionar os atributos POSACC e QUAPOS a todas as tabelas de pontos, além de enc_chart, escala e finalidade, quando a troca S57->geopackage é feita.
O segundo script, add_posacc_quapos_to_pointsV3.py, uma vez que todos os arquivos S57 no diretório ENC tenham sido carregados, atualiza os valores desses atributos para cada entidade nas tabelas de pontos.
No exemplo a seguir, carregamos 7 mapas ENC no geopackage de importação pointsENC.gpkg.
Você pode ver que as tabelas do geopacote contêm os atributos POSACC e QUAPOS e que o último script preencheu os valores correspondentes a esses campos.
Na segunda parte dessa versão final, dedicada à simbologia, você verá o novo gerenciamento da camada “nature of seabed” (natureza do fundo do mar). Essa simbologia se baseia na criação de um atributo “Label” na camada SBDARE e no seu preenchimento com um script python Label_sbdare.py . Essa operação pode ser executada no banco de dados completo ou aqui, no geopackage pointsENC.gpkg. Como o cálculo leva algum tempo, recomendamos que você o faça nesse estágio. Consulte o artigo Mapas do geopacote ENC na versão final do QGis: parte 2 para obter instruções.
Importação de camadas de “linha
Para importar primitivas de arquivos S57, é necessário adicionar a opção -oo RETURN_PRIMITIVES = ON aos comandos de importação.
O arquivo .bat de importação de camada de linha será então :
Para executá-lo, abra uma janela do OSGeo4W Shell, vá para o diretório que contém os arquivos .bat e digite o comando:
.\mass_load_s57_lines_V3.bat directory_files_000 path/pointsENC.gpkg
Primeiro, edite o arquivo para alterar as linhas:
python c:/testgpkgV3/update_geopackage_dsid_prp_prim.py “%output_geopackage%” “!file!”
e
python c:/testgpkgV3/add_posacc_quapos_to_linesV3.py
para inserir os caminhos que você escolheu para armazenar os scripts python.
O segundo script, add_posacc_quapos_to_linesV3.py, depois que todos os arquivos S57 no diretório ENC tiverem sido carregados, atualiza os valores desses atributos para cada entidade nas tabelas de linhas.
No caso de tabelas de tipo de ponto, o vínculo entre o NAME_RCID das tabelas e o RCID da tabela IsolatedNode não levanta dúvidas. No entanto, no caso de polilinhas, para uma entidade geográfica, a lista de polilinhas diz respeito a várias entidades na camada Edge. Nós nos perguntamos se era possível que as polilinhas que compõem uma entidade, por exemplo, DEPCNT, tivessem valores QUAPOS diferentes.
Realizamos o teste em um banco de dados com 650 mapas ENC em todas as escalas. A camada DEPCNT continha 162.585 recursos. Apenas 38.731 tinham RCIDs na lista de NAME_RCIDs na tabela Edges com um valor QUAPOS diferente de zero. Encontramos 193 entidades DEPCNT que tinham valores QUAPOS diferentes em sua lista NAME_RCID. Como isso representa 0,1%, decidimos não levar em conta essa possibilidade, pois a complexidade da desconstrução de polilinhas é extrema.
Acontece que a tabela Edge resultante do driver ogr2ogr não apresenta problemas no nível do atributo (a união entre NAME_RCID e RCID é boa), mas as geometrias na tabela contêm quase metade das geometrias inválidas (linhas com um único ponto ou geometrias nulas). No entanto, as polilinhas das entidades S57 não apresentam erros.
Portanto, seria necessário reparar e reconstruir todas as geometrias Edge para poder desconstruir as geometrias DEPCNT de modo a não ter QUAPOS diferentes em cada caso.
No exemplo a seguir, carregamos 7 mapas ENC no geopackage de importação linesENC.gpkg
Importação de camadas de polígonos
Embora o formato S57 permita que os polígonos sejam usados como primitivos, essa opção não é usada. Portanto, não é necessário modificar a importação de dados de polígonos. As primitivas (Face) são solicitadas na linha de comando ogr2ogr, e os campos POSACC e QUAPOS são adicionados às tabelas para possível uso futuro, mas não é necessário adicionar um script para preencher os valores.
Clonagem e/ou adição de tabelas importadas ao geopacote ENC
Para o primeiro carregamento do S57, o script Python a seguir cria todas as tabelas nos três geopacotes de importação. Para cargas subsequentes, se a tabela já existir no geopacote ENC, os registros da tabela no geopacote de importação serão adicionados aos registros já presentes no ENC. Se, por outro lado, a tabela ainda não existir, ela será criada e preenchida com registros do geopacote de importação. No arquivo do geopacote ENC, as tabelas são prefixadas com pt_, li_ e pl_ para indicar seu tipo de geometria.
As seguintes alterações foram feitas no script em comparação com a V2:
- O SRC das tabelas do geopacote é preenchido durante a criação. O código EPSG:4326 é atribuído às geometrias.
# Créer une nouvelle couche de destination si elle n'existe pas
output_srs = osr.SpatialReference()
output_srs.ImportFromEPSG(4326) # Définir EPSG 4326
output_table = output_gpkg.CreateLayer(output_table_name, geom_type=input_table.GetGeomType(), options=["OVERWRITE=YES"], srs=output_srs)
- Forçar a criação do índice espacial em todas as tabelas do geopackage
# Créer l'index spatial
output_gpkg.ExecuteSQL(f"CREATE SPATIAL INDEX ON {output_table_name}")
A clonagem é realizada usando o código python: clone_or_append_tables_with_prefixV3.py
Certifique-se de alterar a linha que indica os nomes dos geopacotes que você criou com os arquivos .bat anteriores:
input_geopackages = [” c:/testgpkg/pointsENC.gpkg “, ” c:/testgpkg/LinesENC.gpkg “, ” c:/testgpkg/PolysENC.gpkg “]
com os geopacotes de importação que você escolheu e a linha
output_gpkg = ogr.Open(“c:/testgpkg/ENC.gpkg”, 1)
com o geopacote de banco de dados que você criou seguindo as instruções em Criação de um banco de dados do Geopackage para mapas ENC (parte 1: criação do banco de dados).
Depois que esse script for executado, seu banco de dados será atualizado com os novos arquivos S57.
Atualização de um banco de dados do geopacote V1 ou V2 para a versão 3
O procedimento que acabamos de descrever pode ser usado para criar um novo banco de dados de geopacote. Porém, se você já tiver um banco de dados criado, não será necessário refazer todo o trabalho. Aqui fornecemos o procedimento e as ferramentas necessárias para atualizar sua estrutura (POSAC e QUAPOSQ) e preencher os valores desses atributos para as tabelas existentes.
Faça o download dos arquivos para o procedimento aqui.
Os vários estágios dessa atualização são os seguintes:
1- Em um diretório que contenha todos os arquivos .000 que já foram carregados no banco de dados, execute um arquivo .bat, upgrade_V2_to_V3.bat, que cria um geopackage update.gpkg contendo as primitivas (IsolatedNode, ConnectedNode,Edge) dos arquivos S57.
.\ upgrade_V2_to_V3.ba directory_files_000 path/update.gpkg
2- Execute o script append_tables_upgrade.py no console do QGis Python. Certifique-se de alterar o caminho para o arquivo update.gpkg
input_geopackages = [“c:/testgpkgV2/update.gpkg”]
e para o seu banco de dados ENC
output_gpkg = ogr.Open(“c:/enc_db/ENC4.gpkg”, 1)
Esse script adiciona as primitivas ao banco de dados existente.
3- No console do QGis Python, execute o script add_fields_upgrade.py. Certifique-se de alterar o caminho para o arquivo .gpkg do seu banco de dados
geopackage = ogr.Open(“c:/enc_db/ENC4.gpkg”, 1)
Esse script cria os atributos POSACC e QUAPOS em todas as tabelas do banco de dados.
4-No console Python do QGis, execute o script add_posacc_quapos_upgrade_points.py. Certifique-se de alterar o caminho para o arquivo .gpkg do seu banco de dados e adicione tabelas para excluir se tiver criado outras tabelas no banco de dados.
#Chemin vers le GeoPackage
geopackage_path = “c:/enc_db/ENC4.gpkg”
#Liste des tables à exclure
tables_exclues = [“IsolatedNode”, “ConnectedNode”,”DSID”,”C_AGGR”,”C_ASSO”,”layer_styles”] # Ajoutez les noms des tables que vous souhaitez exclure
Esse script preencherá os campos POSACC e QUAPOS em todas as tabelas de tipo de ponto com os valores contidos na primitiva IsolatedNode.
5-No console do QGis Python, execute o script add_posacc_quapos_upgrade_lines.py. Certifique-se de alterar o caminho para o arquivo .gpkg do seu banco de dados e adicione tabelas para excluir se tiver criado outras tabelas no banco de dados.
#Chemin vers le GeoPackage
geopackage_path = “c:/enc_db/ENC4.gpkg”
#Liste des tables à exclure
tables_exclues = [“IsolatedNode”, “ConnectedNode”,”DSID”,”C_AGGR”,”C_ASSO”,”layer_styles”] # Ajoutez les noms des tables que vous souhaitez exclure
Esse script preencherá os campos POSACC e QUAPOS em todas as tabelas de tipo de linha com os valores contidos na primitiva Edge.