O Github não renderiza os mapas deste notebook, para visualização completa acesse https://nbviewer.jupyter.org/github/elipsesoftware/epmprocessor/blob/master/epmwebapi/exemplos/maps.ipynb
Para esse exemplo vamos utilizar a biblioteca Folium, que de forma simples, utiliza a API gratuita de mapas Leaflet. E a biblioteca geopy para, a partir de um endereço, localizar a latitude e longitude para inserir pontos no mapa.
# se ainda não possui a biblioteca Folium e Geopy, instale executando esse comando a partir do próprio Jupyter Notebook.
import sys
!{sys.executable} -m pip install folium geopy
#importando as bibliotecas que serão utilizadas
import epmwebapi as epm
from epmwebapi.dataobjectattributes import DataObjectAttributes
from epmwebapi.dataobjectsfilter import DataObjectsFilter
from epmwebapi.dataobjectsfilter import DataObjectsFilterType
from epmwebapi.domainfilter import DomainFilter
import datetime
import folium
from geopy.geocoders import Nominatim
import getpass
import pandas as pd
Exemplo 1
Adicionando localização, zoom inicial e marcador no mapa.
#cria o mapa e defina a localização e o zoom inicial.
mapa = folium.Map(location=[-25.4284,-49.879873],zoom_start=7)
#insere a marca em uma localização específica.
folium.Marker([-25.4284,-49.2733], popup='Curitiba').add_to(mapa)
mapa
Exemplo 2
Utilizando o Elipse DataModel foram criadas variáveis no EPM para armazenar a localização de objetos modelados no sistema SCADA(E3) que controla o sistema de ar condicionado das filiais da Elipse. O nome dessa variável é "Location". Através da epmwebapi vamos localizar essas variáveis e mostrar no mapa a localização cadastrada.
#Conexão ao EPM Server
user = input('EPM user:')
password = getpass.getpass("EPM password:")
#crie o objeto de conexão informando os endereços do EPM Webserver(Authentication Port e WEB API Port), usuário e senha.
connection = epm.EpmConnection('http://localhost:44333', 'http://localhost:44332', user, password)
Busca da variável "Location"
Aqui faremos uma busca pela estrutura de dados criada pelo Elipse DataModel e retornaremos o valor da propriedade Location de cada uma das filiais.
basePath = '/Models/ElipseDataModel/DataModel/Elipse/'
filiais = ['[Elipse-RS]','[Elipse-PR]','[Elipse-SP]','[Elipse-MG]','[Elipse-RJ]']
locations = []
for filial in filiais:
path = basePath + filial
#busca do caminho do objeto no EPM Server que retorna um OrderedDict.
local = connection.getObjects([path])
#transforma em lista os valores e busca o indice zero
obj = list(local.values())[0]
#transforma em lista as propriedades e busca o indice zero
propriedade = list(obj.enumProperties().values())[0]
#faz a leitura da propriedade
data = propriedade.read()
#adiciona a lista o valor retornado pela leitura
locations.append(data.value)
locations
Convertendo o endereço em geolocalização usando a biblioteca geopy e adicionando marcadores ao mapa
mapa = folium.Map(location=[-25.4284,-49.879873],zoom_start=5)
for local in locations:
geolocator = Nominatim(user_agent="example_map")
location = geolocator.geocode(local)
print((location.latitude, location.longitude))
folium.Marker([location.latitude,location.longitude]).add_to(mapa)
mapa
Exemplo 3 - Mostrando informações no marcador
Inserindo uma tabela de valores no Popup do marcador. Clique para visualizar
#valores demonstração
df = pd.DataFrame(data=[['10:00','12.2', '1284'], ['12:00','15.6', '1740'],['14:00','16.0','1790']], columns=['Timestamp','WindSpeed', 'Power'])
html = df.to_html(classes='table table-striped table-hover table-condensed table-responsive')
popup = folium.Popup(html)
mapa = folium.Map(location=[37.20,140.02],zoom_start=11)
folium.Marker([37.20,140.02], popup=popup).add_to(mapa)
mapa
Gerando mapas de calor (Heatmap)
Utilizamos essa visualização para conhecer a concentração de locais em determinadas regiões do mapa.
from folium.plugins import HeatMap
#valores de demonstraçao com localizações e pesos.
data =[[ -25.1726, -49.2568, 19. ],
[ -25.2785, -49.1556, 32. ],
[ -25.4216, -49.9809, 80. ],
[ -25.7384, -49.3848, 29. ],
[ -25.9678, -49.9915, 12. ],
[ -25.5659, -49.8574, 26. ],
[ -26.5092, -49.0137, 42. ],
[ -26.7384, -49.782 , 57. ],
[ -26.2312, -49.5896, 35. ]]
m = folium.Map([-25.4284,-49.879873], tiles='stamentoner', zoom_start=7)
HeatMap(data).add_to(m)
m
#valores de demonstraçao com localizações e pesos.
data =[[ -25.1726, -49.2568, 19. ],
[ -25.2785, -49.1556, 32. ],
[ -25.4216, -49.9809, 80. ],
[ -25.7384, -49.3848, 29. ],
[ -25.9678, -49.9915, 12. ],
[ -25.5659, -49.8574, 26. ],
[ -26.5092, -49.0137, 42. ],
[ -26.7384, -49.782 , 57. ],
[ -26.2312, -49.5896, 35. ]]
m = folium.Map([-25.4284,-49.879873], tiles='stamentoner', zoom_start=8)
for item in data:
folium.CircleMarker(
radius=item[2],
location=[item[0], item[1]],
color='#3186cc',
fill=True,
fill_color='#3186cc'
).add_to(m)
m