Análise topográfica em Python
Luis Moura / 2019-08-02
O texto desta página, encontra-se em formato PDF, e pode ser acedido aqui.
Resumo
Criação de Perfis Topográficos e Curvas de Nível, através do uso de Python.
Dois exemplos são apresentados:
- Exemplo simples
- E um exemplo mais complexo
Ambos os exemplos, apresentam uma forma rápida e simples, de desenhar perfis em 3D e curvas de nível.
O código utilizado, foi adaptado do website Density and Contour Plots | Python Data Science Handbook e de um autor desconhecido.
Perfis Topográficos e Curvas de Nível
Existem vários softwares no mercado especializados em levantamentos topográficos e de modo nenhum, Python é um substituto para eles, no entanto, existem situações em que o uso de Python é justificado. No meu caso particular, não tenho nenhum software topográfico instalado nos meus computadores, mas se precisar de fazer um levantamento (simples), é bom saber que tenho uma ferramenta que o pode fazer. E o melhor de tudo, é grátis, sem ter que gastar centenas ou milhares, em licenças anuais.
Exemplo simples
Um exemplo básico que serve de introdução ao código. Para a criação de modelo topográfico, são necessárias 3 coordenadas para cada ponto. Neste caso, serão usados 15 pontos, com as coordenadas x, y e z.
x = [1000,1000,1000,1000,1000,5000,5000,5000,5000,5000,
10000,10000,10000,10000,10000]
y = [13,21,29,37,45,13,21,29,37,45,13,21,29,37,45]
z = [75.2,79.21,80.02,81.2,81.62,84.79,87.38,87.9,88.54,
88.56,88.34,89.66,90.11,90.79,90.87]
E a criação de um modelo 3D, é feito a partir das coordenadas previamente definidas:
fig = plt.figure(figsize=(13,6.5))
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, z, cmap=cm.GnBu_r, linewidth=0.2)
ax.view_init(10, -110)
#label axes
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y',fontsize=14)
ax.set_zlabel('z',fontsize=14)
plt.tight_layout()
plt.show()
Mas em vez de um perfil 3D, pode optar-se por um 2D. Usando os mesmos 15 pontos utilizadas na criação da imagem anterior:
def plot_contour(x,y,z,resolution = 50,contour_method='linear'):
resolution = str(resolution)+'j'
X,Y = np.mgrid[min(x):max(x):complex(resolution), min(y):max(y):complex(resolution)]
points = [[a,b] for a,b in zip(x,y)]
Z = griddata(points, z, (X, Y), method=contour_method)
return X,Y,Z
X,Y,Z = plot_contour(x,y,z,resolution = 50,contour_method='linear')
with plt.style.context("seaborn-white"):
fig, ax = plt.subplots(figsize=(13,8))
ax.scatter(x,y, color="black", linewidth=9, edgecolor="ivory", s=50)
contours=ax.contourf(X,Y,Z,20, cmap='GnBu_r',origin="lower")
plt.colorbar(contours, shrink=0.67,label="Altitude [m]")
plt.clabel(contours, inline=True, fontsize=8, fmt='%.1f')
Assim, e de uma forma simples, é criado um modelo 2D, que através da utilização de cores, torna possível a identificação do comportamento topográfico.
Este será o tipo de modelo mais simples. No entanto, existe sempre a possibilidade da criação de modelos mais complexos1.
criação de modelos complexos. No entanto, existe um limite (em tempo e custo) para quando deixa de ser vantajoso o desenvolvimento desse mesmo código em detrimento de software já existente.
Exemplo mais complexo
A base de dados encontra-se guardada em Dropbox, e é composta por 85 pontos.
Os primeiros 5 pontos, são apresentados na tabela seguinte.
x | y | z |
---|---|---|
12100 | 8300 | 37.1531 |
5300 | 8700 | 31.4993 |
3500 | 13900 | 36.9185 |
5100 | 1900 | 24.0156 |
9900 | 13700 | 35.0411 |
A leitura da base de dados é feita através de Pandas: Python Data Analysis Library
df = pd.read_csv('https://www.dropbox.com/s/6dyfc4fl5slhgry/ZoneA.dat?raw=1',
sep=' ',
header=9,
usecols=[0, 1, 2],
names=['x', 'y', 'thick']
)
df.rename(columns={'thick':'z'},
inplace=True)
Nota: Código completo no final deste post.
Uma vez obtida a informação da base de dados, é possível a representação das curvas de nível.
E usando a mesma base de dados, pode ser criado um modelo 3D.
fig = plt.figure(figsize=(15,7.5))
ax = fig.gca(projection='3d')
triang = mtri.Triangulation(df.x, df.y)
ax.plot_trisurf( triang ,df.z, cmap="gist_earth", linewidth=0.2,antialiased=True, shade=False)
ax.view_init(20, -75)
plt.title('Elevação 3D', fontsize=16)
#label axes
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y',fontsize=14)
ax.set_zlabel('z',fontsize=14)
plt.tight_layout()
plt.show()
Assim, de uma forma simples e com uma dúzia de linhas de código, é possível a
criação de modelos que podem ser facilmente incorporados em relatórios. Qualquer
um dos modelos pode ser guardado como PDF, e para isso basta adicionar ao final
do código: plt.savefig("nome.pdf")
Tudo nestas imagens pode ser alterado, desde orientação da imagem, cores, qualidade dos detalhes, texto, etc. Logicamente, uma maior complexidade, requer um maior número de linhas de código, mas se o principal objectivo é a criação de bons modelos da forma o mais simples possível, os dois exemplos em cima são um bom ponto de partida.
Código
Código completo usado neste post
- É possível a criação em
Python
de código que permite a análise e ↩