agrobot_base/AgroBase/AgroBase/Python/Scripts/map-load.py

162 lines
5.4 KiB
Python

import geopandas as gpd
import json
import sys
import folium
import requests
import re
def internet_disponivel():
"""Verifica se há conexão com a internet."""
url = 'http://www.google.com/'
timeout = 5
try:
_ = requests.get(url, timeout=timeout)
return True
except requests.ConnectionError:
return False
# Argumentos e configurações iniciais
pathFiles = sys.argv[1]
fileName = sys.argv[2]
outputName = sys.argv[3]
outputMapName = sys.argv[4]
apiEndpoit = sys.argv[5]
pastaSaida = 'Python/Output/'
# Carregar o arquivo shapefile contendo a geometria
input_shapefile = pathFiles + fileName + '.shp'
data_geometry = gpd.read_file(input_shapefile)
# Calcular os limites (bounds) da geometria
minx, miny, maxx, maxy = data_geometry.total_bounds
center = [(miny + maxy) / 2, (minx + maxx) / 2]
# Verificar se há conexão com a internet
if internet_disponivel():
m = folium.Map(location=center, zoom_start=12)
else:
m = folium.Map(location=center, zoom_start=12, tiles=None)
# Converter o GeoDataFrame para GeoJSON e adicionar ao mapa
geojson_data = data_geometry.to_json()
folium.GeoJson(geojson_data).add_to(m)
# Salvar o mapa interativo em um arquivo HTML
m.save(pastaSaida + outputMapName)
# Caminho completo para o arquivo HTML gerado
caminho_completo_html = pastaSaida + outputMapName
# Abrir o arquivo HTML para leitura e escrita
with open(caminho_completo_html, 'r+') as arquivo_html:
# Ler o conteúdo do arquivo
conteudo_html = arquivo_html.read()
# Usar expressão regular para encontrar o ID do mapa
padrao_id_mapa = re.compile(r'id="map_(.*?)"')
resultado_busca = padrao_id_mapa.search(conteudo_html)
# Verificar se encontrou um ID de mapa
if resultado_busca:
id_mapa = 'map_' + resultado_busca.group(1)
else:
raise ValueError("Não foi possível encontrar o ID do mapa no arquivo HTML.")
# Script JavaScript para adicionar ao HTML, com o ID do mapa substituído
script_atualizacao_marcador = f"""
<script>
function trajeto_json_onEachFeature(feature, layer) {{
layer.on({{
}});
}};
var trajeto_json = L.geoJson(null, {{
onEachFeature: trajeto_json_onEachFeature,
style: function(feature) {{
return {{color: 'red'}};
}}
}}
);
function trajeto_json_add (data) {{
trajeto_json.addData(data);
}}
trajeto_json_add({{"features": []}});
trajeto_json.addTo({id_mapa});
function adicionarGeometria(novaGeometria) {{
trajeto_json.addData(novaGeometria);
}}
function saoCoordenadasIguais(coord1, coord2, tolerancia) {{
return Math.abs(coord1[0] - coord2[0]) < tolerancia && Math.abs(coord1[1] - coord2[1]) < tolerancia;
}}
function adicionarCoordenada(idGeometria, novaCoordenada) {{
var feature = trajeto_json.toGeoJSON().features.find(f => f.id === idGeometria);
if (feature) {{
var ultima = [0.0,0.0];
if (feature.geometry.coordinates.length > 0) {{
ultima = feature.geometry.coordinates[feature.geometry.coordinates.length - 1];
}}
if (!saoCoordenadasIguais(ultima, novaCoordenada, 0.000001)) {{
feature.geometry.coordinates.push(novaCoordenada);
var ft = feature;
trajeto_json.clearLayers();
trajeto_json.addData(ft);
}}
}} else {{
console.log("Feature com ID " + idGeometria + " não encontrada.");
}}
}}
adicionarGeometria({{
"type": "Feature",
"geometry": {{
"type": "LineString",
"coordinates": []
}},
"properties": {{"Dist1": 0.0, "Dist2": 0.0, "Id": 1517, "Length": 21.724783283, "Name": "Projeto"}},
"id": "Tj"
}});
</script>
<script>
var marcadorDinamico = L.marker([0, 0], {{
icon: L.AwesomeMarkers.icon({{
icon: 'info-sign',
markerColor: 'red',
prefix: 'glyphicon'
}})
}}).addTo({id_mapa});
function atualizarMarcador() {{
fetch('{apiEndpoit}')
.then(function(response) {{
return response.json();
}})
.then(function(dados) {{
var novaLatitude = dados.latitude;
var novaLongitude = dados.longitude;
var novaPosicao = [novaLatitude, novaLongitude];
marcadorDinamico.setLatLng(novaPosicao);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
}})
.catch(function(error) {{
console.error('Erro ao atualizar o marcador:', error);
}});
}}
// Atualiza o marcador a cada 2 segundos
setInterval(atualizarMarcador, 2000);
</script>
"""
# Inserir o script no conteúdo HTML
conteudo_atualizado = conteudo_html.replace('</html>', script_atualizacao_marcador + '</html>')
# Agora, reabrir o arquivo para escrita e sobrescrever o conteúdo com a versão atualizada
with open(caminho_completo_html, 'w') as arquivo_html:
arquivo_html.write(conteudo_atualizado)