2.11. Expressões Lógicas
Problema 1: Escreva um programa que pergunte ao usuário o valor de um ano qualquer e que o informe se o ano é ou não bissexto.
Dica
Anos bissextos ocorrem a cada quatro anos, exceto anos múltiplos de 100 que não são múltiplos de 400.
Solução:
# a função input permite ao usuário inserir um valor durante a execução
ano = int(input("Ano: "))
# a expressão lógica a seguir verifica se um número é bissexto
bissexto = ano % 4 == 0 and (ano % 100 != 0 or ano % 400 == 0)
print("O ano", ano, "é bissexto?", bissexto)
Nota
Saber se um ano é bissexto é importante no contexto de Sensoriamento Remoto, pois isso impacta nas datas de aquisição das imagens pelos satélites.
Problema 2: Considerando os elementos geométricos e os casos numerados de 1 a 6 na Figura 2.11, construa expressões lógicas que ajudem a responder às seguintes perguntas:
Os elementos geométricos dos casos 4 e 5 satisfazem o relacionamento espacial
Touches
?Todos os casos apresentados envolvendo elementos geométricos lineares (casos 1, 2 e 3) representam de fato exemplos de relacionamento espacial
Touches
?
Dica
Para solução desse problema, será utiliza o pacote Python denominado Shapely. Esse pacote não faz parte da biblioteca padrão do Python, sendo uma contribuição de terceiros. Mais detalhes sobre os tipos geométricos e a Shapely serão vistos mais adiante no curso, nas Seções 5.2 e 5.3.
Abaixo é apresentado como instalar a Shapely de acordo com os instaladores de pacotes Python conhecicos como pip
e conda
.
O pip é um dos principais instaladores de pacotes do Python. A comunidade de software livre costuma hospedar os pacotes em um repositório central denominado PyPI (Python Package Index). O pip
por padrão, consegue instalar pacotes disponíveis nesse repositório.
Supondo que você esteja usando a distribuição padrão do Python, disponível em https://www.python.org (Python Software Foundation), vamos criar um ambiente virtual para isolar as bibliotecas que serão utilizadas ao longo do curso. O módulo venv, da biblioteca padrão do Python, permite criar esse tipo de ambiente virtual para isolar os pacotes (ou bibliotecs) que serão instalados. Para criar um ambiente virtual denominado venv
, faça:
python3 -m venv venv
Após a criação do ambiente, é necessário ativá-lo:
source venv/bin/activate
Aproveite para atualizar alguns pacotes básicos desse ambiente:
pip install --upgrade pip setuptools wheel
Por último, instale a biblioteca Shapely:
pip install shapely
Assegure-se que esse pacote tenha sido instalado e verifique sua versão:
python -c 'import shapely; print(shapely.__version__)'
Uma saída como a mostrada abaixo deve ser apresentada:
2.0.3
A distribuição Python da Anaconda acompanha um instalador e gerenciador de ambientes chamado conda. Vamos começar criando um ambiente denominado prog-geo
com a versão 3.11 do Python:
conda create --name prog-geo python=3.11
O novo ambiente deve aparecer na lista de ambientes disponíveis:
conda env list
Em seguida, ative esse ambiente:
conda activate prog-geo
Instale o pacote Shapely a partir do canal conda-forge:
conda install --channel conda-forge shapely
Assegure-se que esse pacote tenha sido instalado e verifique sua versão:
python -c 'import shapely; print(shapely.__version__)'
Uma saída como a mostrada abaixo deve ser apresentada:
2.0.1
Solução:
Nota
Também iremos utilizar uma representação textual para os elementos geométricos conhecida por WKT ou Well-known text (Seção 5.3).
Vamos considerar a seguinte representação WKT para as geometrias:
Caso 4:
POLYGON( ( 9 6, 9 8, 12 8, 12 6, 9 6 ) ) POLYGON( ( 12 7, 15 9, 15 5, 12 7 ) )
Caso 5:
POLYGON( ( 1 1, 1 3, 4 3, 4 1, 1 1 ) ) POLYGON( ( 4 2, 4 4, 6 4, 6 2, 4 2 ) )
Para responder à primeira pergunta, podemos construir o seguinte trecho de código:
from shapely import from_wkt
pol1 = from_wkt('POLYGON( ( 9 6, 9 8, 12 8, 12 6, 9 6 ) )')
pol2 = from_wkt('POLYGON( ( 12 7, 15 9, 15 5, 12 7 ) )')
pol3 = from_wkt('POLYGON( ( 1 1, 1 3, 4 3, 4 1, 1 1 ) )')
pol4 = from_wkt('POLYGON( ( 4 2, 4 4, 6 4, 6 2, 4 2 ) )')
caso4 = pol1.touches(pol2)
caso5 = pol3.touches(pol4)
resultado = caso4 and caso5
print(resultado)
Para responder a segunda pergunta, considere a seguinte representação WKT para as geometrias:
Caso 1:
LINESTRING( 1 7, 1 9, 3 9 ) LINESTRING( 1 9, 3 7 )
Caso 2:
LINESTRING( 1 4, 2 6 ) LINESTRING( 2 6, 3 4 )
Caso 3:
LINESTRING( 5 6, 5 8, 7 8 ) LINESTRING( 6 6, 6 9 )
O trecho de código abaixo mostra como construir as geometrias lineares e realizar os testes topológicos:
from shapely import from_wkt l1 = from_wkt('LINESTRING( 1 7, 1 9, 3 9 )') l2 = from_wkt('LINESTRING( 1 9, 3 7 )') caso1 = l1.touches(l2) l3 = from_wkt('LINESTRING( 1 4, 2 6 )') l4 = from_wkt('LINESTRING( 2 6, 3 4 )') caso2 = l3.touches(l4) l5 = from_wkt('LINESTRING( 5 6, 5 8, 7 8 )') l6 = from_wkt('LINESTRING( 6 6, 6 9 )') caso3 = l5.touches(l6) print(caso1 and caso2 and caso3)
Nota
Suponha que o exercício anterior solicitasse a escrita de uma mensagem diferente na tela dependendo do resultado verdadeiro ou falso dos testes. Exemplo:
Os casos 1, 2 e 3 são exemplos do relacionamento espacial Touches
Pelo menos um dos casos (1 ou 2 ou 3) não representa o relacionamento espacial Touches
Nesse caso, precisamos estruturar o programa dependendo de uma condição lógica. A próxima seção irá discutir o uso das estruturas condicionais para possibilitar controlar o fluxo de execução de programas.