Skip to content

Instantly share code, notes, and snippets.

@caioerick
Last active May 23, 2023 15:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save caioerick/03b8e74b7c65f5198875c52df321f17f to your computer and use it in GitHub Desktop.
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
# 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:
# contato@caioerick.me
#
#
# 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",
"* contato@caioerick.me\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