Last active
May 23, 2023 15:13
-
-
Save caioerick/03b8e74b7c65f5198875c52df321f17f to your computer and use it in GitHub Desktop.
Rotina para conversão de arquivos .kml para .ldb para usar no Delft3D
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Rotina de conversão de arquivos KML para LDB | |
# Criado por Caio Erick em 23 mai 2023 | |
# Última edição em 23 mai 2023 às 11:59 | |
# | |
# Contato: | |
# [email protected] | |
# | |
# | |
# função para conversão de graus decimais para UTM | |
def df_degree2utm(dado): | |
import utm | |
for index, row in dado.iterrows(): | |
lon = dado.loc[index, 'lon'] | |
lat = dado.loc[index, 'lat'] | |
lon_utm = utm.from_latlon(lat, lon)[0] | |
lat_utm = utm.from_latlon(lat, lon)[1] | |
dado.loc[index, 'lat'] = lat_utm | |
dado.loc[index, 'lon'] = lon_utm | |
dado['lon'] = dado['lon'].round(2) | |
dado['lat'] = dado['lat'].round(2) | |
return dado | |
# função para retornar um dataframe a partir do KML | |
def return_df_from_kml(file): | |
from bs4 import BeautifulSoup | |
import shlex | |
# abre o conteúdo do arquivo kml | |
conteudo = open(file, "r").read() | |
soup = BeautifulSoup(conteudo, 'xml') | |
titles = soup.find_all(str("LineString")) | |
# puxa apenas as coordenadas do arquivo | |
coordenadas = [] | |
for title in titles: | |
coordenadas.append(title.get_text()) | |
dado = [] | |
for i in range(len(coordenadas)): | |
a = shlex.split(coordenadas[i], posix=False) | |
dado.append(a) | |
dado = dado[0][1:] | |
# transformando em dataframe | |
df = pd.DataFrame(dado) | |
df[['lon','lat','z']] = df[0].str.split(',', expand=True) | |
df = df[['lon','lat']] | |
df['lon'] = df['lon'].astype(float).round(6) | |
df['lat'] = df['lat'].astype(float).round(6) | |
# converte as coordenadas para UTM | |
df = df_degree2utm(df) | |
display(df.head()) | |
return df | |
# função para processar todas os arquivos .kml e salvar em um único arquivo .ldb | |
def processa_tudo(arquivos_kml, arquivo_final_ldb): | |
import time | |
data_criacao = time.strftime('%Y-%m-%d %H:%M:%S') | |
header = ["* Arquivo de linha de costa (.ldb) criado em {}\n".format(data_criacao), | |
"* Rotina: Caio Erick\n", | |
"* [email protected]\n", | |
"*\n", | |
"* Coordinate System = Cartesian\n", | |
"*\n"] | |
concat = pd.DataFrame() | |
# escrevendo o arquivo | |
with open(arquivo_final_ldb, "w") as file: | |
# adicionando o header | |
file.writelines(header) | |
# pra cada arquivo kml encontrado, vai adicionar as informações no arquivo_final_ldb que acabou de ser criado | |
cont_arquivo = 1 | |
for arquivo_kml in arquivos_kml: | |
df = return_df_from_kml(arquivo_kml) | |
file.write('*\nL00{:03d}\n'.format(cont_arquivo)) | |
file.write('{} 2\n'.format(len(df))) | |
file.write(df.to_string(index=False, header=None)) | |
file.write('\n') | |
df.insert(2, 'ldb', cont_arquivo) | |
concat = pd.concat([concat, df]).reset_index(drop=True) | |
cont_arquivo += 1 | |
print('Arquivo criado!') | |
arquivos_kml = ['Linha de costa 1.kml', 'Linha de costa 2.kml'] | |
arquivo_final_ldb = 'linha_de_costa_novo.ldb' | |
processa_tudo(arquivos_kml, arquivo_final_ldb) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment