agrobot_base/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html

401 lines
18 KiB
HTML
Raw Blame History

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<script>
L_NO_TOUCH = false;
L_DISABLE_3D = false;
</script>
<style>html, body {width: 100%;height: 100%;margin: 0;padding: 0;}</style>
<style>#map {position:absolute;top:0;bottom:0;right:0;left:0;}</style>
<script src="folium/leaflet.js"></script>
<script src="folium/jquery-3.7.1.min.js"></script>
<script src="folium/bootstrap.bundle.min.js"></script>
<script src="folium/leaflet.awesome-markers.js"></script>
<link rel="stylesheet" href="folium/leaflet.css"/>
<link rel="stylesheet" href="folium/bootstrap.min.css"/>
<link rel="stylesheet" href="folium/bootstrap.min.css"/>
<link rel="stylesheet" href="folium/all.min.css"/>
<link rel="stylesheet" href="folium/leaflet.awesome-markers.css"/>
<link rel="stylesheet" href="folium/leaflet.awesome.rotate.min.css"/>
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
#map_5ccd27c8efed2f1d5f821cab9236ab21 {
position: relative;
width: 100.0%;
height: 100.0%;
left: 0.0%;
top: 0.0%;
}
.leaflet-container { font-size: 1rem; }
</style>
</head>
<body>
<div class="folium-map" id="map_5ccd27c8efed2f1d5f821cab9236ab21" ></div>
</body>
<script>
var map_5ccd27c8efed2f1d5f821cab9236ab21 = L.map(
"map_5ccd27c8efed2f1d5f821cab9236ab21",
{
center: [-22.213058416666666, -47.381547499999996],
crs: L.CRS.EPSG3857,
zoom: 12,
zoomControl: true,
preferCanvas: false,
}
);
var tile_layer_9147458df3f36d24646c83b8de0dce25 = L.tileLayer(
"https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
);
tile_layer_9147458df3f36d24646c83b8de0dce25.addTo(map_5ccd27c8efed2f1d5f821cab9236ab21);
var trajetosSelecionados = {};
var RuasSelecionadas = [];
function enviarSelecaoParaServidor() {
client.publish("selecao_ruas_mapa", JSON.stringify(RuasSelecionadas), function (err) {
/*if (!err) {
console.log("Mensagem publicada com sucesso");
} else {
console.error("Falha ao publicar mensagem", err);
}*/
});
}
function geo_json_04db30abe29c98f8b704fb7bbb35c27c_onEachFeature(feature, layer) {
layer.on({
click: function(e) {
// Verificar se o trajeto j<> est<73> selecionado
if (trajetosSelecionados[feature.id]) {
// Se j<> est<73> selecionado, reverta para a cor original e remova da sele<6C><65>o
e.target.setStyle({
color: '#3388ff' // Cor original
});
delete trajetosSelecionados[feature.id];
RuasSelecionadas.splice(RuasSelecionadas.indexOf(feature.id), 1);
} else {
// Se n<>o est<73> selecionado, mude a cor para indicar sele<6C><65>o e adicione ao objeto de sele<6C><65>o
e.target.setStyle({
color: 'blue' // Cor de sele<6C><65>o
});
trajetosSelecionados[feature.id] = true;
RuasSelecionadas.push(feature.id);
}
enviarSelecaoParaServidor();
}/*, mouseover: function(e) {
// Mostrar tooltip com o ID da geometria quando o mouse passar sobre a linha
var tooltip = L.tooltip({
direction: 'auto', // Leaflet determina a melhor posi<73><69>o
sticky: true // Faz com que o tooltip siga o cursor do mouse
})
.setContent('Rua ' + feature.id); // Define o conte<74>do do tooltip
// Abre o tooltip na posi<73><69>o atual do mouse
var latLng = e.latlng;
tooltip.setLatLng(latLng);
layer.bindTooltip(tooltip).openTooltip(latLng);
}*/
});
};
var geo_json_04db30abe29c98f8b704fb7bbb35c27c = L.geoJson(null, {
onEachFeature: geo_json_04db30abe29c98f8b704fb7bbb35c27c_onEachFeature,
});
function geo_json_04db30abe29c98f8b704fb7bbb35c27c_add (data) {
geo_json_04db30abe29c98f8b704fb7bbb35c27c
.addData(data);
}
geo_json_04db30abe29c98f8b704fb7bbb35c27c_add({"features": [{"geometry": {"coordinates": [[-47.3815305, -22.213009], [-47.381530166666664, -22.213009], [-47.38152816666667, -22.213008833333333], [-47.38152766666666, -22.213008833333333], [-47.3815275, -22.213008833333333], [-47.381527166666665, -22.213008833333333], [-47.381528333333335, -22.213007833333332], [-47.3815315, -22.21300383333333], [-47.381532666666665, -22.213001666666667], [-47.38153366666667, -22.212998833333334], [-47.381534, -22.212990666666666], [-47.3815325, -22.212985333333332], [-47.381526666666666, -22.2129765], [-47.381525333333336, -22.212974166666665], [-47.38152566666667, -22.212974833333334], [-47.38152983333333, -22.212982666666665], [-47.3815305, -22.212983833333332], [-47.38152566666667, -22.21298133333333], [-47.38152316666667, -22.212980166666668], [-47.381521, -22.212979166666667], [-47.38151583333333, -22.2129785], [-47.38151533333333, -22.212979333333333], [-47.381516, -22.212979833333332], [-47.381516166666664, -22.21298], [-47.3815185, -22.212979666666666], [-47.381518, -22.2129795], [-47.381517833333334, -22.2129795], [-47.38152266666667, -22.212981833333334], [-47.3815235, -22.212982166666666], [-47.3815295, -22.212984666666667], [-47.38153283333333, -22.21298566666667], [-47.38153333333333, -22.212985833333335], [-47.381529, -22.212989166666667], [-47.38152733333333, -22.212990833333333], [-47.38152516666667, -22.212994333333334], [-47.381523666666666, -22.212996], [-47.38152266666667, -22.212997], [-47.381519, -22.213001], [-47.3815185, -22.213001666666667], [-47.381512666666666, -22.213006833333335], [-47.381508, -22.213010166666667], [-47.381505, -22.213013833333335], [-47.3815015, -22.213023166666666], [-47.381501, -22.213028], [-47.381502166666664, -22.213038166666667], [-47.381502, -22.213043333333335], [-47.381502, -22.213052833333332], [-47.381504166666666, -22.213057666666668], [-47.38150666666667, -22.213062833333332], [-47.38151116666667, -22.21307283333333], [-47.38151216666667, -22.213077333333334], [-47.38151366666666, -22.213084], [-47.3815145, -22.213088666666668], [-47.381517, -22.213092166666666], [-47.3815215, -22.21309533333333], [-47.38152266666667, -22.213096], [-47.3815255, -22.213096333333333], [-47.3815285, -22.2130975], [-47.3815315, -22.213099166666666], [-47.3815385, -22.213101166666668], [-47.381541666666664, -22.213102833333334], [-47.381549666666665, -22.21311], [-47.381554666666666, -22.213113333333332], [-47.381561, -22.213115], [-47.381571, -22.2131175], [-47.38157483333333, -22.213119], [-47.381578, -22.213125833333333], [-47.381581, -22.213127833333335], [-47.381585, -22.213130666666668], [-47.38158633333333, -22.213132166666668], [-47.381587333333336, -22.213133], [-47.381587333333336, -22.213133833333334], [-47.381588, -22.213134], [-47.38158883333333, -22.213135166666667], [-47.38159, -22.213137], [-47.381590333333335, -22.213137833333334], [-47.38159233333333, -22.213139666666667], [-47.38159316666667, -22.213140833333334], [-47.381593, -22.213140666666668], [-47.381592833333336, -22.2131405], [-47.381593, -22.213140833333334], [-47.38159383333333, -22.213142333333334], [-47.381594, -22.213142666666666], [-47.381594, -22.213142666666666]], "id": null, "type": "LineString"}, "id": 0, "properties": {"Dist1": 0.0, "Dist2": 0.0, "Id": "1", "Length": 33.462942499632895, "Name": "17_12_2024_08_33_02"}, "type": "Feature"}], "type": "FeatureCollection"});
geo_json_04db30abe29c98f8b704fb7bbb35c27c.addTo(map_5ccd27c8efed2f1d5f821cab9236ab21);
</script>
<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(map_5ccd27c8efed2f1d5f821cab9236ab21);
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>
function trajeto_dinamico_json_onEachFeature(feature, layer) {
layer.on({
});
};
var trajeto_dinamico_json = L.geoJson(null, {
onEachFeature: trajeto_dinamico_json_onEachFeature,
style: function(feature) {
return {color: 'green'};
}
}
);
function trajeto_dinamico_json_add (data) {
trajeto_dinamico_json.addData(data);
}
trajeto_dinamico_json_add({"features": []});
trajeto_dinamico_json.addTo(map_5ccd27c8efed2f1d5f821cab9236ab21);
function adicionarGeometriaDinamica(novaGeometria) {
trajeto_dinamico_json.addData(novaGeometria);
}
function adicionarCoordenadaDinamica(idGeometria, coordenadas) {
var feature = trajeto_dinamico_json.toGeoJSON().features.find(f => f.id === idGeometria);
if (feature) {
feature.geometry.coordinates = [];
coordenadas.forEach(x => feature.geometry.coordinates.push([x.longitude, x.latitude]));
var ft = feature;
trajeto_dinamico_json.clearLayers();
trajeto_dinamico_json.addData(ft);
} else {
console.log("Feature com ID " + idGeometria + " nao encontrada.");
}
}
adicionarGeometriaDinamica({
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": []
},
"properties": {"Dist1": 0.0, "Dist2": 0.0, "Id": 1517, "Length": 21.724783283, "Name": "Projeto"},
"id": "TjD"
});
</script>
<script src="folium/mqtt.min.js"></script>
<script src="folium/leaflet.rotatedMarker.js"></script>
<script>
let posicaoAtualEquipamento = {
lat: 0,
long: 0
};
let posicaoAtualBase = {
lat: 0,
long: 0
};
var customIcon = L.icon({
iconUrl: 'folium/images/position_marker.png',
iconSize: [32, 32],
iconAnchor: [16, 16],
popupAnchor: [0, -16]
});
var marcadorEquipamento = L.marker([0, 0], {
icon: customIcon
}).addTo(map_5ccd27c8efed2f1d5f821cab9236ab21);
var marcadorBase = L.marker([0, 0], {}).addTo(map_5ccd27c8efed2f1d5f821cab9236ab21);
var icon = L.AwesomeMarkers.icon(
{"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"}
);
marcadorBase.setIcon(icon);
// Conectar ao broker MQTT
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conex<65>o segura
// Quando conectado, inscreva-se no t<>pico desejado
client.on('connect', function () {
console.log('Conectado ao broker MQTT');
// Inscrever-se no t<>pico
client.subscribe('coordenadas_gps', function (err) {
if (!err) {
console.log("Inscricao bem-sucedida no topico");
} else {
console.error("Falha na inscricao do topico", err);
}
});
client.subscribe('trajetoria_dinamica', function (err) {
if (!err) {
console.log("Inscricao bem-sucedida no topico");
} else {
console.error("Falha na inscricao do topico", err);
}
});
client.subscribe('selecao_ruas_mapa', function (err) {
if (!err) {
console.log("Inscricao bem-sucedida no topico");
} else {
console.error("Falha na inscricao do topico", err);
}
});
});
// Lidar com mensagens recebidas para o topico inscrito
client.on('message', function (topic, message) {
var dados = JSON.parse(message);
if (topic === "trajetoria_dinamica") {
adicionarCoordenadaDinamica("TjD", dados); // "Tj" <20> o ID da feature no GeoJSON
}
else if (topic === "coordenadas_gps") {
// A mensagem e um Buffer, converta para string ou objeto conforme necessario
//console.log(`Mensagem recebida no topico '${topic}': ${message.toString()}`);
var id = dados.id;
var novaLatitude = dados.latitude;
var novaLongitude = dados.longitude;
var novaPosicao = [novaLatitude, novaLongitude];
var orientacao = dados.orientacao;
var foco = dados.foco;
if (id == 1) {
marcadorBase.setLatLng(novaPosicao);
// Calcular angulo de rotacao
var angulo = dados.orientacao;
posicaoAtualBase.lat = novaPosicao[0];
posicaoAtualBase.long = novaPosicao[1];
// Rotacionar o marcador para o angulo calculado
marcadorBase.setRotationAngle(angulo);
}
else {
marcadorEquipamento.setLatLng(novaPosicao);
// Calcular angulo de rotacao
var angulo = dados.orientacao;
posicaoAtualEquipamento.lat = novaPosicao[0];
posicaoAtualEquipamento.long = novaPosicao[1];
// Rotacionar o marcador para o angulo calculado
marcadorEquipamento.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
}
if (foco) {
map_5ccd27c8efed2f1d5f821cab9236ab21.setView(novaPosicao, map_5ccd27c8efed2f1d5f821cab9236ab21.getZoom());
}
}
else if (topic === 'selecao_ruas_mapa') {
var selecionadas = dados;
if (selecionadas.length != RuasSelecionadas.length) {
atualizarSelecaoRuas(selecionadas);
}
}
});
// Fun<75><6E>o para atualizar a sele<6C><65>o das ruas e mudar a cor no mapa
function atualizarSelecaoRuas(selecionadas) {
selecionadas = JSON.parse(selecionadas);
RuasSelecionadas = Array.isArray(selecionadas) ? [...selecionadas] : [];
geo_json_04db30abe29c98f8b704fb7bbb35c27c.eachLayer(function (layer) {
if (RuasSelecionadas.includes(parseInt(layer.feature.id))) {
layer.setStyle({ color: 'blue' });
} else {
layer.setStyle({ color: '#3388ff' }); // Cor original
}
});
}
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {
// Converter latitudes e longitudes de graus para radianos
const latA = P1latitude * (Math.PI / 180.0);
const lonA = P1longitude * (Math.PI / 180.0);
const latB = P2latitude * (Math.PI / 180.0);
const lonB = P2longitude * (Math.PI / 180.0);
// Calcular a diferen<65>a de longitude
const deltaLon = lonB - lonA;
// Calcular a dire<72><65>o
const y = Math.sin(deltaLon) * Math.cos(latB);
const x = Math.cos(latA) * Math.sin(latB) - Math.sin(latA) * Math.cos(latB) * Math.cos(deltaLon);
const direcaoRadianos = Math.atan2(y, x);
// Converter a dire<72><65>o de radianos para graus
let direcaoGraus = direcaoRadianos * (180.0 / Math.PI);
// Normalizar a dire<72><65>o para que esteja no intervalo de 0 a 360 graus
direcaoGraus = (direcaoGraus + 360) % 360;
return direcaoGraus;
}
</script>
</html>