Mais

Como criar um arquivo de texto contendo nomes de camadas no QGIS?

Como criar um arquivo de texto contendo nomes de camadas no QGIS?


Meu QGIS ToC contém grupos de camadas e algumas camadas que não pertencem a nenhum grupo.

Gostaria de criar um arquivo de texto contendo o nome das camadas que não pertencem a nenhum grupo.

Existe uma maneira automatizada de fazer isso?


Você pode fazer isso a partir do console QGIS Python. Siga este fluxo de trabalho:

  1. Abra o console QGIS Python

  2. Ajuste a seguinte linha para coincidir com o caminho do seu arquivo de texto e copie a linha inteira para o console QGIS Python:

    textFilePath = '/tmp/non_grouped_layers.txt'

    Como você pode ver, no exemplo acima, quero criar um arquivo de texto chamado 'non_grouped_layers.txt' na pasta/ tmp /, Estou em uma máquina GNU / Linux.

  3. Pressione Enter.

  4. Copie o seguinte snippet de código para o console QGIS Python e, depois disso, pressione Enter algumas vezes:

    # Obtenha uma referência da árvore de camadas root = QgsProject.instance (). LayerTreeRoot () tree = root.children () # Obtenha nomes de camadas não agrupadas nonGrouped = [] para o nó na árvore: if isinstance (node, QgsLayerTreeLayer) : nonGrouped.append (node.layerName ()) #Salve a lista não agrupada como arquivo de texto f = open (textFilePath, 'wt') f.write (' n'.join (nonGrouped)) f.close ()

Agora você deve ter seu arquivo de texto com a lista de camadas não agrupadas.


Na captura de tela você pode ver meu arranjo QGIS ToC e o arquivo de texto que recebo ao executar o trecho de código.

Se você enfrentar problemas, me diga.


QGIS: identificador único para uma camada

Às vezes, você precisa identificar dados de maneira exclusiva. Tenho um cliente para o qual gerei pontos e esses pontos devem ser únicos.

1. Abra seus dados no QGIS & # 8211 neste exemplo, tenho pontos que foram gerados e estão dentro de um limite.

2. Abra a tabela de atributos e alterne o modo de edição no arquivo de ponto.

3. Neste caso, eu & # 8217 não terei apenas um número exclusivo & # 8211, mas também adicionarei algumas letras a ele. Como exemplo M1. Abra a calculadora de campo.

4. Há duas maneiras de fazer isso & # 8211, uma é usando a função $ id e a outra é usando a função $ rownum. Ambas as funções podem ser localizadas em Registro na lista de funções.


Como faço para criar um arquivo e gravá-lo?

Java 7 os usuários podem usar a classe Files para gravar em arquivos:

Existem utilitários úteis para isso:

Observe também que você posso use um FileWriter, mas ele usa a codificação padrão, o que geralmente é uma má ideia - é melhor especificar a codificação explicitamente.

Abaixo está a resposta original anterior ao Java 7

Se você já tem o conteúdo que deseja gravar no arquivo (e não gerado em tempo real), a adição java.nio.file.Files no Java 7 como parte da E / S nativa fornece a maneira mais simples e eficiente de alcançar seus objetivos.

Basicamente, criar e gravar em um arquivo é apenas uma linha, além disso uma chamada de método simples!

O exemplo a seguir cria e grava em 6 arquivos diferentes para mostrar como eles podem ser usados:

Uma maneira muito simples de criar e gravar em um arquivo em Java:

Aqui está um pequeno programa de exemplo para criar ou substituir um arquivo. É a versão longa para que possa ser entendida mais facilmente.

Usar try () fechará o stream automaticamente. Esta versão é curta, rápida (com buffer) e permite a escolha da codificação.

Esse recurso foi introduzido no Java 7.

Aqui, estamos inserindo uma string em um arquivo de texto:

Podemos facilmente criar um novo arquivo e adicionar conteúdo a ele.

Se você deseja ter uma experiência relativamente tranquila, também pode dar uma olhada no pacote IO do Apache Commons, mais especificamente na classe FileUtils.

Nunca se esqueça de verificar as bibliotecas de terceiros. Joda-Time para manipulação de data, Apache Commons Lang StringUtils para operações de string comuns e outros podem tornar seu código mais legível.

Java é uma ótima linguagem, mas a biblioteca padrão às vezes é um pouco de baixo nível. Poderoso, mas de baixo nível.

Uma vez que o autor não especificou se eles exigem uma solução para versões Java que foram EoL'd (pela Sun e IBM, e estas são tecnicamente as JVMs mais difundidas), e devido ao fato de que a maioria das pessoas parece ter respondido a pergunta do autor antes de ser especificado que é um texto (não binário) arquivo, decidi dar minha resposta.

Em primeiro lugar, o Java 6 geralmente atingiu o fim de vida e, como o autor não especificou que precisa de compatibilidade de legado, acho que significa automaticamente Java 7 ou superior (Java 7 ainda não foi EoL da IBM). Portanto, podemos olhar diretamente para o tutorial de E / S do arquivo: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html

  • Muitos métodos não lançavam exceções quando falhavam, portanto, era impossível obter uma mensagem de erro útil. Por exemplo, se a exclusão de um arquivo falhou, o programa receberia uma "falha de exclusão", mas não saberia se era porque o arquivo não existia, o usuário não tinha permissões ou havia algum outro problema.
  • O método de renomeação não funcionou de forma consistente em todas as plataformas.
  • Não havia suporte real para links simbólicos.
  • Mais suporte para metadados era desejado, como permissões de arquivo, proprietário do arquivo e outros atributos de segurança. O acesso aos metadados do arquivo era ineficiente.
  • Muitos dos métodos de arquivo não foram escalonados. Solicitar uma grande listagem de diretório em um servidor pode resultar em um travamento. Diretórios grandes também podem causar problemas de recursos de memória, resultando em negação de serviço.
  • Não era possível escrever um código confiável que pudesse percorrer recursivamente uma árvore de arquivos e responder apropriadamente se houvesse links simbólicos circulares.

Bem, isso exclui java.io.File. Se um arquivo não pode ser escrito / anexado, você pode nem saber o porquê.

Aqui está um exemplo (simplificado):

Exemplo simplificado (Java 8 ou superior):

Esses métodos requerem esforço mínimo por parte do autor e devem ser preferidos a todos os outros ao gravar em arquivos [texto].

Aqui estão algumas das maneiras possíveis de criar e gravar um arquivo em Java:

Usando FileOutputStream

Usando FileWriter

Usando PrintWriter

Usando OutputStreamWriter

Para mais informações, verifique este tutorial sobre Como ler e gravar arquivos em Java.

Se você, por algum motivo, deseja separar o ato de criar e escrever, o equivalente em Java do toque é

createNewFile () faz uma verificação de existência e cria o arquivo atomicamente. Isso pode ser útil se você quiser garantir que foi o criador do arquivo antes de gravá-lo, por exemplo.

a melhor maneira é usar Java7: Java 7 apresenta uma nova maneira de trabalhar com o sistema de arquivos, junto com uma nova classe de utilitário - Arquivos. Usando a classe Files, podemos criar, mover, copiar, excluir arquivos e diretórios e também pode ser usada para ler e gravar em um arquivo.

Escreva com FileChannel Se você estiver lidando com arquivos grandes, o FileChannel pode ser mais rápido do que o IO padrão. O código a seguir grava String em um arquivo usando FileChannel:

Escreva com DataOutputStream

Grave com FileOutputStream

Vamos agora ver como podemos usar FileOutputStream para gravar dados binários em um arquivo. O código a seguir converte uma String int bytes e grava os bytes em um arquivo usando um FileOutputStream:

Escreva com PrintWriter podemos usar um PrintWriter para gravar texto formatado em um arquivo:

Escreva com BufferedWriter: use BufferedWriter para gravar uma String em um novo arquivo:

acrescente uma string ao arquivo existente:

Acho que este é o caminho mais curto:

Para criar o arquivo sem substituir o arquivo existente:

Vale a pena tentar o Java 7+:

A maneira mais simples que posso encontrar:

Provavelmente só funcionará para 1.7+.

No Java 8, use Arquivos e caminhos e usando a construção try-with-resources.

Apenas uma linha! caminho e linha são cordas

Leitura e gravação de arquivos usando input e outputstream:

Basta incluir este pacote:

E então você pode usar este código para escrever o arquivo:

Se estivermos usando Java 7 e superior e também soubermos o conteúdo a ser adicionado (anexado) ao arquivo, podemos usar o método newBufferedWriter no pacote NIO.

Existem alguns pontos a serem observados:

  1. É sempre um bom hábito especificar a codificação do conjunto de caracteres e, para isso, temos constantes na classe StandardCharsets.
  2. O código usa a instrução try-with-resource, na qual os recursos são fechados automaticamente após a tentativa.

Embora OP não tenha solicitado, mas apenas no caso de querermos pesquisar linhas com alguma palavra-chave específica, por exemplo, confidencial, podemos usar APIs de fluxo em Java:

Existem algumas maneiras simples, como:

Você pode até criar um arquivo temporário usando um propriedade do sistema, que será independente de qual sistema operacional você está usando.

Usando a biblioteca Guava do Google, podemos criar e gravar um arquivo com muita facilidade.

O exemplo cria um novo arquivo fruits.txt no diretório raiz do projeto.

Lendo a coleção com os clientes e salvando em arquivo, com JFilechooser.

Existem pelo menos várias maneiras de criar um arquivo e gravá-lo:

Arquivos pequenos (1.7)

Você pode usar um dos métodos de gravação para gravar bytes, ou linhas, em um arquivo.

Esses métodos cuidam da maior parte do trabalho para você, como abrir e fechar o fluxo, mas não se destinam ao tratamento de arquivos grandes.

Gravando um arquivo maior usando I / O de fluxo em buffer (1.7)

O pacote java.nio.file suporta E / S de canal, que move dados em buffers, ignorando algumas das camadas que podem causar gargalos de E / S de fluxo.

Essa abordagem é preferencial devido ao seu desempenho eficiente, especialmente ao concluir uma grande quantidade de operações de gravação. As operações em buffer têm esse efeito, pois não precisam chamar o método de gravação do sistema operacional para cada byte, reduzindo operações de E / S caras.

Usando NIO API para copiar (e criar um novo) um arquivo com um Outputstream (1.7)

Existem também métodos adicionais que permitem copiar todos os bytes de um fluxo de entrada para um arquivo.

FileWriter (texto) (& lt1.7)

Grava diretamente no arquivo (menos desempenho) e deve ser usado apenas quando o número de gravações é menor. Usado para gravar dados orientados a caracteres em um arquivo.

FileOutputStream (binário) (& lt1.7)

FileOutputStream destina-se a gravar fluxos de bytes brutos, como dados de imagem.

Com essa abordagem, deve-se considerar sempre escrever uma matriz de bytes em vez de escrever um byte de cada vez. O aumento de velocidade pode ser bastante significativo - até 10 vezes maior ou mais. Portanto, é recomendável usar os métodos de gravação (byte []) sempre que possível.


Se você quiser verificar a soma / hash de ambos, algo como isso funcionará

echo & quot $ filename & quot | xargs -n1 -I <> bash -c 'echo & quot $ 1 & quot cat & quot $ 1 & quot' x <> | shasum

quando eu mudo o nome de um arquivo, isso não afeta sua soma de verificação (eu tentei SHA-1, SHA-256 e MD5).

Bem, isso é um pouco uma conexão falsa. SHA-1, SHA-256 e MD5 não calculam hashes de arquivos ou nomes de arquivos, eles calculam hashes de fluxos de bits. Portanto, o resultado que você obtém depende inteiramente do que você escolhe fornecer como entrada, e você não mostrou isso.

Agora, você talvez tenha usado os utilitários sha1sum, sha256sum e md5sum e, de fato, eles apenas incluem o conteúdo do arquivo fornecido nos dados a serem hash. Não é o nome do arquivo, nem os bits de permissão, informações do proprietário, carimbos de data / hora ou outros metadados.

Mas não tenho para ser feito assim. Aqui estão os hashes SHA-256 de dois arquivos e seus nomes:

O script simplesmente adiciona os nomes dos arquivos aos dados em hash. Outro aplicativo pode incluir metadados na entrada de hash junto com o conteúdo do arquivo ou incluir hashes que cobrem apenas parte dos dados.

Obviamente, incluir o nome do arquivo tem a desvantagem de que até mesmo o mesmo arquivo pode ser referenciado por nomes diferentes e, portanto, pode ter vários hashes distintos:

Adicionar timestamps, proprietários e outros itens à equação quase garantem que os hashes sejam diferentes depois que o arquivo for copiado para outro sistema, tornando a utilidade do hash bastante questionável. Até mesmo o nome do arquivo pode ser perdido ou alterado.

Se você quiser incluir os metadados no hash, provavelmente é mais fácil colocar o (s) arquivo (s) em um arquivo tar, ou algum outro contêiner que armazena os metadados que você achar úteis, e hash e copiar isso. Depois de extrair o arquivo (conteúdo) do arquivo, os metadados no sistema de arquivos podem ser diferentes, mas você ainda pode verificar o arquivo de onde o arquivo veio.


Preparando o documento do mapa para exportação

Depois de criar seu indicador de extensão e registrar as informações necessárias para seu script, configure o documento do mapa para que você não veja o indicador de extensão ou mapa inserido em todas as páginas.

  1. Mova o quadro de dados que contém o mapa inserido para fora da área imprimível da página.
  2. Altere a extensão do mapa inserido para algo muito maior do que a extensão do seu quadro de dados principal para que o indicador de extensão não apareça nas páginas que você não deseja.
  3. Salve seu documento de mapa.

Como abrir um arquivo OVR

Você precisa de um software adequado como ArcGIS para abrir um arquivo OVR. Sem o software adequado, você receberá uma mensagem do Windows "Como você deseja abrir este arquivo?" ou "O Windows não pode abrir este arquivo"ou um alerta semelhante do Mac / iPhone / Android. Se você não conseguir abrir o arquivo OVR corretamente, tente clicar com o botão direito ou manter pressionado o arquivo. Em seguida, clique em" Abrir com "e escolha um aplicativo. Você também pode exibir um arquivo OVR diretamente no navegador:. Basta arrastar o arquivo para a janela do navegador e soltá-lo.


Não acho que uniq seja necessariamente a ferramenta certa para isso, já que se destina a arquivos separados por espaços em branco ou de largura fixa (aparente a partir de suas duas opções relacionadas a & quotcolumn & quot sendo --skip-fields e --skip-chars), enquanto o que você tem aqui são dados do tipo XML, onde nem as larguras das colunas são fixas nem existem separadores triviais de um caractere entre as colunas (os valores de groupName etc. podem, em princípio, conter espaços em branco).

Em vez disso, eu usaria ferramentas destinadas a lidar com XML.

Uma opção que evita ter que escrever um script por conta própria seria a filtragem baseada em XPath. Como XPath pode ser usado para filtrar por exclusividade pode ser entendido a partir de respostas como essas - os elementos importantes da sintaxe são os eixos following-sibling :: e precedente-sibling ::. Ferramentas de linha de comando para avaliar expressões XPath podem ser encontradas nas respostas a esta pergunta. Dos que experimentei, o mais fácil de instalar foi o basex (sugerido aqui), por isso vou usá-lo a seguir.

Se entendi sua pergunta corretamente, você deseja reduzir as linhas (elementos XML) com o mesmo groupName para apenas a última linha (ou houve outro motivo para escolher a linha com directoryId = & quot1 & quot?). Para um documento XML como este:

onde tivemos que envolver tudo em um elemento raiz (Grupos) para torná-lo um XML bem formado, esse requisito pode ser alcançado com a seguinte expressão XPath:

/ Groups / Group seleciona os elementos a serem retornados, que são filtrados usando a expressão em []. @ seleciona atributos e irmão seguinte :: corresponde a todos os elementos irmãos subsequentes do atual (cf. aqui).


Segunda-feira, 5 de abril de 2021

Como resolver: Não é possível carregar a biblioteca compartilhada 'libSkiaSharp' ao tentar executar um aplicativo AvaloniaUI .NET 5

Eu estava tentando executar um simples .NET 5 aplicativo que usa a plataforma cruzada AvaloniaUI biblioteca de interface gráfica do usuário em Ubuntu 20.04. Mais informações sobre AvaloniaUI pode ser encontrado em https://avaloniaui.net/. Mas depois de executar o comando $ dotnet run, as mensagens de erro de exceção aparecem reclamando da falta de libSkiaSharp arquivo de objeto compartilhado, conforme mostrado na imagem abaixo.

Após algumas investigações, consegui resolver o problema removendo os binários dotnet SDK que vêm do Ubuntude Foto Repositórios PPA, que são instalados quando o seguinte comando é executado:


Em vez de usar o repositório do Ubuntu, o oficial Microsoft o instalador de https://dotnet.microsoft.com/download/dotnet/5.0 deve ser usado.

Depois de instalar o SDK oficial, a execução do aplicativo abre a interface gráfica do aplicativo sem nenhuma mensagem de erro, conforme mostrado a seguir.



O pypdfocr não é mais compatível desde 2016 e notei alguns problemas por não ser mantido. ocrmypdf (módulo) faz um trabalho semelhante e pode ser usado assim:

Depois de saber que o Tesseract agora também pode produzir PDFs pesquisáveis, encontrei o sanduíche de script: http://www.tobias-elze.de/pdfsandwich/

depois de instalar dependências (esta pode não ser a lista completa)

Eu segui o guia do script para compilar a partir do código-fonte

Compilar de fontes

pdfsandwich é um software de código aberto (licença: GPL). Você pode baixar os fontes como pacote .tar.bz2 da área de download no site do projeto ou verificá-los por subversion:

Se OCaml estiver instalado em seu sistema, você pode compilar e instalar da seguinte maneira:


Identifique as colunas de localização X, Y

Nossos nomes de coluna incluem vários campos que podem conter informações espaciais. As colunas plot_locations_HARV $ easting e plot_locations_HARV $ northing contêm valores de coordenadas. Podemos confirmar isso observando as primeiras seis linhas de nossos dados.

Temos valores de coordenadas em nosso quadro de dados. Para converter nosso quadro de dados em um objeto sf, também precisamos saber o CRS associado a esses valores de coordenadas.

Existem várias maneiras de descobrir o CRS de dados espaciais em formato de texto.

  1. Podemos verificar os metadados do arquivo na esperança de que o CRS tenha sido registrado nos dados.
  2. Podemos explorar o próprio arquivo para ver se as informações do CRS estão incorporadas no cabeçalho do arquivo ou em algum lugar nas colunas de dados.

Seguindo as colunas leste e norte, há uma coluna geodeticDa e utmZone. Estes parecem conter informações CRS (datum e projeção). Vamos ver os próximos.

Não é comum armazenar informações do CRS em uma coluna. Mas este arquivo específico contém informações CRS dessa forma. As colunas geodeticDa e utmZone contêm as informações que nos ajudam a determinar o CRS:

Em Quando os dados vetoriais não se alinham - Manipulando projeção espacial e CRS em R, aprendemos sobre os componentes de uma string proj4. Temos tudo o que precisamos para atribuir um CRS ao nosso quadro de dados.

Para criar o proj4 associado ao UTM Zona 18 WGS84, podemos consultar a projeção no site de Referência Espacial, que contém uma lista de formatos CRS para cada projeção. A partir daqui, podemos extrair a string proj4 para UTM Zone 18N WGS84.

No entanto, se tivermos outros dados na projeção UTM Zone 18N, é muito mais fácil usar a função st_crs () para extrair o CRS no formato proj4 desse objeto e atribuí-lo ao nosso novo objeto espacial. Já vimos este CRS antes com nosso site de estudo Harvard Forest (point_HARV).

A saída acima mostra que o arquivo de forma de pontos está na zona UTM 18N. Podemos, portanto, usar o CRS desse objeto espacial para converter nosso dataframe não espacial em um objeto sf.

A seguir, vamos criar um objeto crs que podemos usar para definir o CRS do nosso objeto sf quando o criamos.