Criação de um banco de dados Geopackage para mapas ENC (parte 2: adição de simbologia)

A primeira parte do projeto Financiamento colaborativo para a integração de dados marinhos no QGIS foi concluída, graças às contribuições de ORANGE Marine, Geoconceptos Uruguay, Janez Avzec e Gaetan Mas. Nossos mais sinceros agradecimentos a todos eles. Publicamos aqui o conteúdo final dessa parte do projeto.
A primeira parte trata da criação e do gerenciamento do banco de dados, e esta segunda parte trata da simbologia S57 no QGis.

Adição de simbologia a um geopackage

A simbologia padrão para as tabelas em um geopackagee está contida em uma tabela chamada layer_styles, que só é criada se você usar a opção salvar por padrão no botão de estilo.

Depois de clonar as tabelas no arquivo ENC, a tabela não existe. Portanto, vamos importar a tabela que contém toda a simbologia dos mapas ENC.

Baixar layer_natsurfV1.gpkg

Esse geopackagee contém uma tabela, chamada layer_styles, com as definições de simbologia para todas as tabelas S57, bem como uma tabela chamada natsurf, que será usada para formatar a renderização da tabela “nature of the seabed” (SBDARE).

Para integrar essas tabelas ao seu arquivo ENC (aqui ENC.gpkg):

No QGis, abra o gerenciador de banco de dados.

  1. Você já deve ter a conexão geopackage->ENC.gpkg; caso contrário, clique com o botão direito do mouse em “Geopackage”->nova conexão e aponte para o arquivo ENC.gpkg.
  2. Conecte-se à tabela layers_natsurf.gpkg baixada (clique com o botão direito do mouse em “Geopackage” ->nova conexão e, em seguida, aponte para o geopackage baixado)
  3. Selecione layer_styles em layers_natsurf.gpkg e, em seguida, clique com o botão direito do mouse em->add to canvas e você terá a tabela layer_styles na lista de camadas carregadas.
  4. Selecione natsurf em layers_natsurf.gpkg e, em seguida, clique com o botão direito do mouse em->adicionar à tela e você terá a tabela natsurf na lista de camadas carregadas.
  5. Selecione o geopackage ENC.gpkg no gerenciador de banco de dados.
  6. No menu Tabela, selecione Importar camada/arquivo
  7. Na lista de camadas, selecione layer_styles e, em seguida, OK
  8. Repita a operação para a camada natsurf.

A versão atual de layer_styles contém layouts de simbologia para 153 camadas. Lembre-se de verificar regularmente se há alguma atualização disponível para download.

Essa simbologia usa símbolos svg que você precisa baixar em seu computador. Clique aqui para fazer download de um diretório “náutico” que contém todos os símbolos svg de que você precisa, além de um diretório chamado “XML” com símbolos adicionais para QGis.

Símbolos SVG

Por padrão, as referências aos símbolos svg são feitas em um diretório “C:/nautical”. Você tem várias opções:

1- Descompacte o arquivo nautical em um diretório c:/nautical em seu computador

Em seguida, não é necessário fazer mais nada. O layer_styles encontrará os símbolos svg sem nenhum problema.

2- Você deseja salvar o diretório nautical em um diretório de sua escolha

Nesse caso, você precisa modificar a tabela layer_styles para que ela encontre os símbolos.

Abra o gerenciador de banco de dados QGis.

  1. Selecione a tabela layer_styles em seu geopackage
  2. Abra uma janela SQL
  3. Digite a consulta:
  4. UPDATE layer_styles
  5. SET styleQML = REPLACE(styleQML, ‘C:/nautical’, ‘Your path’);
  6. Clique no botão Run (Executar)

3- Você deseja salvar o diretório náutico no diretório do geopackage ENC.

Nesse caso, as referências aos símbolos svg serão relativas ao Geopackage e você poderá usá-lo em várias máquinas. Nesse caso, seguiremos o mesmo procedimento acima, mas a consulta SQL será:

UPDATE layer_styles
SET styleQML = REPLACE(styleQML, ‘C:/nautical’, ‘nautical’);

Obviamente, o projeto deve ser configurado para armazenar caminhos relativos (Propriedades do projeto -> Geral->Salvar caminhos->Relativo).

Símbolos XML

Os símbolos XML baixados correspondem a simbologias QGis adicionais. Eles são usados na formatação de alguns dos símbolos S57. Você pode procurá-los e instalá-los em seus repositórios tradicionais, mas, para simplificar o trabalho, colocamos todos os arquivos XML necessários no arquivo de download.

Para fazer isso,

  1. abra o gerenciador de estilos (Preferências->Gerenciador de estilos)
  2. Clique no botão Import/Export (Importar/Exportar)
  3. No campo File (Arquivo), aponte para o arquivo XML que deseja carregar e clique em Import (Importar)
  4. Repita a operação para todos os arquivos XML carregadosouvrez le gestionnaire de style (Préférences->Gestionnaire de style)

Algumas simbologias especiais

A grande maioria das simbologias de camada S57 não requer cuidados especiais. A simbologia é definida por padrão no geopackage e é carregada e exibida automaticamente.
Entretanto, há três camadas que requerem atenção especial.

1- A camada LUZES

As várias luzes nos mapas ENC podem ser de dois tipos: luzes de setor, o que significa que a cor da luz é diferente dependendo do ângulo a partir do qual ela é vista, ou luzes simples, visíveis em 360°.

Além disso, a simbologia usada nas cartas náuticas de papel e a usada pelo software de exibição digital ENC não é a mesma.

A simbologia que implementamos atende a todos esses critérios.

Ao carregar a camada LIGHTS, você a verá no painel de camadas:

Por padrão, a simbologia ENC é exibida.

A primeira linha corresponde às luzes do setor e a segunda às luzes simples.

Para semáforos de setor, a simbologia é a mesma, quer você use um visualizador ou um mapa em papel. No entanto, para semáforos simples, você pode escolher o tipo de simbologia. Se você desmarcar a segunda linha e marcar a terceira, obterá uma simbologia do tipo “papel”:

A camada SOUNDG (sondagens batimétricas)

A exibição dos valores de sondagem depende de sua qualidade: se forem confiáveis, a fonte deve ser itálica, mas se não forem totalmente confiáveis, devem ser exibidos em uma fonte normal.

A qualidade das sondas é armazenada na camada M_QUAL dos arquivos S57.

Por padrão, a simbologia da camada SOUNDG leva em conta a qualidade das sondas. Portanto, a camada pl_M_QUAL deve ser carregada no projeto QGis. Ela é invisível quando exibida, mas é usada para rotular as entidades SOUNDG:

O processo envolve o cruzamento das duas camadas para obter o valor de qualidade de cada sonda a partir dos polígonos pl_M_qual. Naturalmente, o número de sondas pode tornar esse estágio bastante longo. Se estiver trabalhando com zoneadores grandes e um grande número de sondas, você pode optar por não levar em conta a qualidade. Para fazer isso, baixe o seguinte arquivo qml: soundg.qml. Você terá dois arquivos qml: o que usa M_qual e o que não usa.

Abra as propriedades da camada SOUNDG, clique no botão Estilo (canto inferior esquerdo), depois em Carregar um estilo e aponte para o arquivo baixado. Todas as sondas serão exibidas muito rapidamente, sem levar em conta a qualidade.

A camada SBDARE (natureza do fundo do mar)

O gerenciamento da simbologia dessa camada é bastante complicado porque envolve o processamento de dois campos do tipo lista. A lista de tipos de leito deve ser combinada com a granulometria de cada fração.

O código a seguir é a expressão usada para gerar os rótulos, que é incluída por padrão:

étiquettes SBDARE

CASE 
  WHEN regexp_substr("NATSUR", '\\((\\d+):') = '1'THEN 
	CASE
		WHEN "NATQUA" IS NOT NULL THEN  
		with_variable('NTS',lpad(regexp_substr("NATSUR", ':(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ':(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS,2)) AND "NATSURT" = trim(left(@NTS,2))))
		WHEN "NATQUA" IS NULL THEN  
		with_variable('NTS',regexp_substr("NATSUR", ':(\\d+)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS))
		ELSE '?'
		
	END
 WHEN regexp_substr("NATSUR", '\\((\\d+):') = '2' THEN 
	CASE
		WHEN  regexp_substr("NATQUA", '\\((\\d+):') = '1' THEN  
		with_variable('NTS',lpad(regexp_substr("NATSUR", ':(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ':(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS,2)) AND "NATSURT" = trim(left(@NTS,2))))  || '.'  || with_variable('NTS2',regexp_substr("NATSUR", ',(\\d+)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS2))
			
		WHEN "NATQUA" IS NULL THEN  
		with_variable('NTS',regexp_substr("NATSUR", ':(\\d+)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS))  || '.' || 
			with_variable('NTS2',regexp_substr("NATSUR", ',(\\d+)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS2))
		WHEN  regexp_substr("NATQUA", '\\((\\d+):') = '2' THEN  
	 with_variable('NTS',lpad(regexp_substr("NATSUR", ':(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ':(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS,2)) AND "NATSURT" = trim(left(@NTS,2))))  || '.'  || 
			with_variable('NTS2',lpad(regexp_substr("NATSUR", ',(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ',(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS2,2)) AND "NATSURT" = trim(left(@NTS2,2))))
			end
WHEN regexp_substr("NATSUR", '\\((\\d+):') = '3' THEN 	 
		CASE
		WHEN  regexp_substr("NATQUA", '\\((\\d+):') = '1' THEN  
		with_variable('NTS',lpad(regexp_substr("NATSUR", ':(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ':(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS,2)) AND "NATSURT" = trim(left(@NTS,2))))  || '.'  || with_variable('NTS2',regexp_substr("NATSUR", ',(\\d+)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS2))|| '.' || 
			with_variable('NTS3',regexp_substr("NATSUR", ',(\\d+)\\)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS3) )
			
		WHEN "NATQUA" IS NULL THEN  
		with_variable('NTS',regexp_substr("NATSUR", ':(\\d+)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS))  || '.' || 
			with_variable('NTS2',regexp_substr("NATSUR", ',(\\d+)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS2))|| '.' || 
			with_variable('NTS3',regexp_substr("NATSUR", ',(\\d+)\\)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS3) )
		WHEN  regexp_substr("NATQUA", '\\((\\d+):') = '2' THEN  
	 with_variable('NTS',lpad(regexp_substr("NATSUR", ':(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ':(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS,2)) AND "NATSURT" = trim(left(@NTS,2))))  || '.'  || 
			with_variable('NTS2',lpad(regexp_substr("NATSUR", ',(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ',(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS2,2)) AND "NATSURT" = trim(left(@NTS2,2)))) || '.' || 
			with_variable('NTS3',regexp_substr("NATSUR", ':(\\d+)'),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" IS NULL AND "NATSURT" = @NTS3) )
		WHEN  regexp_substr("NATQUA", '\\((\\d+):') = '3' THEN  
	 with_variable('NTS',lpad(regexp_substr("NATSUR", ':(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ':(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS,2)) AND "NATSURT" = trim(left(@NTS,2))))  || '.'  || 
			with_variable('NTS2',lpad(regexp_substr("NATSUR", ',(\\d+)\\)'),2,'  ') || lpad(regexp_substr("NATQUA", ',(\\d+)\\)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS2,2)) AND "NATSURT" = trim(left(@NTS2,2)))) || '.' || 
			with_variable('NTS4',lpad(regexp_substr("NATSUR", ',(\\d+)'),2,'  ') || lpad(regexp_substr("NATQUA", ',(\\d+)'),2,'  '),
			aggregate(layer:= 'natsurf',aggregate:='max',expression:= "ETIQ",
			filter:= "NATQUAT" = trim(right(@NTS4,2)) AND "NATSURT" = trim(left(@NTS4,2))))
			end
		
END
   

Esse código foi simplificado (sim!) pelo armazenamento das 143 combinações possíveis de natureza e fração em uma tabela externa: natsurf.

Para que a simbologia funcione, a tabela natsurf deve ser adicionada à lista de camadas do projeto:

BÔNUS: Algumas maneiras de trabalhar com um grande número de camadas

Carregar todas as camadas do geopacote

Você pode carregar todas as camadas do Geopackage diretamente clicando e arrastando o nome do geopackage do painel do explorador para o painel de camadas.

É aberta uma janela na qual você pode selecionar as camadas que deseja carregar. Para carregar todas as camadas, basta clicar em Selecionar tudo e, em seguida, em Adicionar uma camada.

Todas as camadas são então carregadas. Dependendo do número de arquivos S57 carregados em seu banco de dados, pode levar muito tempo para formatar a janela.

As camadas que consomem muitos recursos são as camadas que vimos anteriormente (luzes, sondas e natureza do plano de fundo). Você pode desmarcá-las para acelerar o carregamento.

Outra maneira mais eficaz é definir a escala mínima de exibição para suas camadas. Com 150 camadas carregadas, defini-las uma a uma está fora de questão. Fornecemos um script Python que permite definir a escala mínima de exibição para todas as camadas selecionadas no painel Layers. Depois de salvar o projeto, essas configurações serão usadas sempre que você o abrir.

O script Python para definir a escala mínima de exibição para as camadas selecionadas é o seguinte:

setminscale.py

# Récupérer la vue des couches
layer_tree_view = iface.layerTreeView()

# Récupérer les couches sélectionnées
selected_layers = layer_tree_view.selectedLayers()

# Définir l'échelle minimale pour chaque couche sélectionnée
for layer in selected_layers:
    # Définir l'échelle minimale (par exemple, 1:50000)
    min_scale = 250000
    
    # Définir l'échelle minimale d'affichage pour la couche
    layer.setScaleBasedVisibility(True)
    layer.setMinimumScale(min_scale)
    print(f"L'échelle d'affichage de la couche {layer.name()} a été définie sur {min_scale}.")

[/stextbox ]

Você pode baixá-lo aqui.

O projeto do banco de dados S57 com o Geopackage chegou ao fim. Agora estamos começando a implementar um procedimento equivalente usando um banco de dados PostgreSQL/Postgis. Por favor, ajude-nos a concluir esse projeto!

[/give_form id="12172"]

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *