Configuração
Para habilitarmos esta funcionalidade será necessario:
- Adicionar o parâmetro GIS_ENABLED na tabela nfs_core_par_parametros, exemplo:
INSERT INTO nfs_core_par_parametros(EMPRESA, FILIAL, `LOCAL`, NOME, CONTEUDO, TIPO)
VALUES(1, 9999, 9999, 'GIS_ENABLED', '1', 1);
Caso o ambiente possua o parâmetro MARTE_ENABLED = 1, a camada de objetos GIS, ficará habilitada por padrão {.is-tip}
- Logar no ambiente com algum usuario que possua acesso ao admin_console({host}/admin);
- Executar o DS/DDL create; com isso, as seguintes tabelas serão criadas:
- gis_group: Grupos de objetos GIS;
- gis_object: Objetos GIS.
Os SEQ_DB 10020 e 10099, são reservados para os menus Cadastro("Mapas e Localizações") e Grupos GIS(Mapa) respectivamente. {.is-warning}
- Executar o DS Reload e deslogar o usuario;
- Ao logar novamente no sistema, no menu de "Mapas e Localizações" deverá aparecer o submenu de cadastros, o qual contêm os CRUDS para os Grupos e Objetos GIS, o mapa "Grupos GIS"* também deverá aparecer no menu; exemplo:
Grupos GIS
Representa os agrupamentos de Objetos GIS, possuindo as seguintes caracteristicas:
- ID: Identificação única do grupo;
- Descrição: Nome atribuído ao grupo;
- Cor das Áreas: Este atributo é opcional, caso seja selecionada uma cor, todos os objetos GIS pertencentes a este grupo, serão exibidos nos mapas na cor escolhida(exceto marker(pontos));
- Tag: Funciona como palavra-chave, sendo utilizado por exemplo no envio de Alerts;
- Detectar Entrada: Detecta a entrada de elementos nas áreas;
- Detectar Entrada: Detecta a saída de elementos nas áreas;
- Velocidade mínima: Atribui uma velocidade minima para as áreas;
- Velocidade máxima: Atribui uma velocidade máxima para as áreas;
caminho: {host}/t/gis_group\
Objetos GIS
Representação dos elementos GIS, possui as seguintes caracteristicas:
- ID: Identificação unica do objeto;
- Descrição: Nome atribuido ao objeto;
- Grupo: Grupo GIS ao qual o objeto pertence;
- Tag: Funciona como palavra-chave, sendo utilizado por exemplo no envio de Alerts;
- Tipo: Define o tipo(forma) da area, podendo ser: Ponto, Área/Poligono ou Linha;
- Detectar Entrada: Detecta a entrada de elementos na área especifica;
- Detectar Entrada: Detecta a saida de elementos na área especifica;
- Velocidade mínima: Atribui uma velocidade minima para a área especifica;
- Velocidade máxima: Atribui uma velocidade máxima para a área especifica;
- GeoJSON: Ao clicar no botão Demarcar/Editar área e criar alguma área, aqui ficará o GEOJson da área; GEOJsons de terceiros tambem poderão ser inseridos nesta área geojson.io.
- Exibir automaticamente nos mapas: Ao marcar esta opção, o objeto GIS será renderizado automaticamente ao abrir algum mapa GIS ou Marte.
*caminho: {host}/t/gis_object*
Demarcar/Editar Objetos GIS
Ao acessar o CRUD de criação ou edição de um objeto GIS, podemos clicar no botão "Demarcar/Editar área", com isso um modal com um mapa contendo os objetos cadastrados e ferramentas para desenho ou edição do objeto atual, irá aparecer:
Caso você precise apenas visualizar o mapa, sem criar ou editar algum objeto GIS, poderá acessa-lo pelo mapa "Grupos GIS" em "Mapas e Localizações. {.is-tip}
Criando uma novo objeto GIS
- Na tela de criação/edição de um objeto GIS, devemos selecionar o seu tipo:
- Clicar no botão "Demarcar/Editar área";
- Selecionar a forma na toolBar que fica no canto superior esquerdo;
- Desenhar a forma;
- Ao concluir o desenho, irá aparecer a mensagem pedindo para fechar o modal e salvar as alterações no CRUD do objeto.
Editando um objeto GIS existente
- Clicar no botão "Demarcar/Editar área";
- Selecionaro botão de edição ou a forma desejada(caso queira que a nova forma substitua a anterior) na toolBar que fica no canto superior esquerdo;
- Desenhe ou edite a forma;
- Ao concluir, irá aparecer a mensagem pedindo para fechar o modal e salvar as alterações no CRUD do objeto.
Integração com mapas GIS
Caso o ambiente possua algum objeto GIS cadastrado, o grupo correspondente a este objeto, irá aparecer como uma camada disponivel em mapas GIS.
Ao clicar em algum grupo, os objetos GIS pertencentes a este grupo, serão exibidos no mapa.
Objetos GIS que possuam a opção "Exibir automaticamente nos mapas" habilitada, vão ser exibidos assim que o mapa carregar, sendo o grupo correspondente a este objeto, adicionado como uma camada no mapa. Esta opção pode ser habilitada, ao criar ou editar um objeto GIS, nas telas de CRUD mostradas em: Objetos GIS. {.is-tip}
Integração com mapas MARTE
Caso o ambiente possua algum objeto GIS cadastrado, a aba Grupos GIS estará disponivel no menu do mapa e o grupo correspondente a esta objeto, irá aparecer como uma camada disponivel na aba de Grupos GIS.
Ao clicar em algum grupo, os objetos GIS pertencentes a este grupo, serão exibidos no mapa.
Objetos GIS que possuam a opção "Exibir automaticamente nos mapas" habilitada, vão ser exibidos assim que o mapa Marte carregar, sendo o grupo correspondente a este objeto, adicionado como uma camada no mapa. Esta opção pode ser habilitada, ao criar ou editar um objeto GIS, nas telas de CRUD mostradas em: Objetos GIS. {.is-tipp}
Configuração Alerts
TODO: Adicionar docs de configuração GEOFENCE, ENTRY_POINTS E AGENDAMENTO
Atualmente é possivel configurar Alerts para entradas e saídas em áreas da camada GIS, para isso devemos criar um topico no alerts, com um dos seguintes padrões de NOME:
- GEOFENCEGROUP_ENTRY{TAG DO GRUPO}: Envia alerta de entrada nas áreas do grupo ;
- GEOFENCEGROUP_ENTRY{TAG DO GRUPO}: Envia alerta de saída nas áreas do grupo;
- GEOFENCEOBJECT_ENTRY{TAG DO OBJECT}: Envia alerta de entrada na área específica;
- GEOFENCEOBJECT_ENTRY{TAG DO OBJECT}: Envia alerta de saída na área específica.
Após a criação do tópico, será necessario atribui-lo a um grupo ou usuario do Alerts.
Devido ao grande número de objetos GIS que podem ser cadastrados, a utilização desta opção em objetos GIS, deve ser feita apenas em casos de extrema necessidade, caso contrario, utilizar a detecção de acordo com o grupo deste objeto. {.is-danger}
Para que o Alerta sejá efetivamente enviado, verificar se a opção de Detectar entrada e/ou saída foi habilitada para o grupo ou objeto em questão. {.is-warning}
Camada de estados e municipios
É possível registrarmos em qual estado/município um apontamento foi realizado, para isso temos que fazer algumas configurações.
Definindo os grupos
Adicionar os grupos padrões para as regiões na tabela app_gis_group:
-- Inserir grupos padrões para regiões
INSERT INTO app_gis_group(SEQ_DB, EMPRESA, FILIAL, `LOCAL`,ATIVO, DELETED, DESCRICAO, COR, TAG, DETECT_ENTRY, DETECT_EXIT, GIS_GROUP_MASTER_SEQ_DB, INS_USUARIO_SEQ_DB, ID)
VALUES(100, 9999, 9999, 9999, 1, 0, 'País', NULL, '#PAIS', 0, 0, null, 1, 100);
INSERT INTO app_gis_group(SEQ_DB,EMPRESA, FILIAL, `LOCAL`,ATIVO, DELETED, DESCRICAO, COR, TAG, DETECT_ENTRY, DETECT_EXIT, GIS_GROUP_MASTER_SEQ_DB, INS_USUARIO_SEQ_DB, ID)
VALUES(101, 9999, 9999, 9999, 1, 0, 'Estado', NULL, '#ESTADO', 0, 0, 100, 1, 101);
INSERT INTO app_gis_group(SEQ_DB, EMPRESA, FILIAL, `LOCAL`, ATIVO, DELETED, DESCRICAO, COR, TAG, DETECT_ENTRY, DETECT_EXIT, GIS_GROUP_MASTER_SEQ_DB, INS_USUARIO_SEQ_DB, ID)
VALUES(102, 9999, 9999, 9999, 1, 0, 'Município', NULL, '#MUNICIPIO', 0, 0, 101, 1, 102);
Feito isso será necessário gerar os arquivos sql que contem os estados e municípios para serem inseridos no banco pelo core: cd tests e depois php importacao_geojson_regioes.php ou usar os arquivos sql enconstrados em https://drive.google.com/drive/folders/1VAVRLwQNSnEcrZDn32482ggmNZxm1mCb?usp=sharing(valido apenas para estados e municipios brasileiros). {.is-warning}
Relacionando os estados aos municípios
Após inserir os objetos na tabela de objetos GIS(app_gis_object), devemos atribuir os estados de cada município:
-- Adiciona o estado de cada municipio
create temporary table states select * from app_gis_object ngo where GROUP_SEQ_DB = 101;
update app_gis_object obj set
obj.GIS_OBJECT_MASTER_SEQ_DB = (
select stt.SEQ_DB from states stt
where ST_Intersects(ST_GeomFromText(ST_AsText(ST_Centroid(ST_GeomFromText(ST_AsText(obj.GEOM_DATA)))),4326), stt.GEOM_DATA)
) where obj.GROUP_SEQ_DB = 102;
Preparando a tabela de apontamento
Alguns campos deverão ser adicionados para que seja registrado os o estado e município no apontamento:
-- Atualizações tabela de apontamento
INSERT INTO nfs_core_ds_tabela_campo(TABELA_NOME, NOME, SYS, SEND_XMOVA, GRID, GRID_MOBILE, DESCRICAO, DESCRICAO_RESUMIDA, TIPO, OBRIGATORIO, TAMANHO, TAMANHO_DECIMAL, MASCARA, INSERT_UPDATE, DISABLED, HINT, LINK, VALIDACAO, OPCOES, VALOR_DEFAULT, VALIDACAO_VIEW, FILTRO_VIEW, TOOLTIP_MESSAGE, PROPERTIES)
VALUES('APONTAMENTO_MAQUINA', 'GIS_OBJECT_CITY_SEQ_DB', 0, 1, 1, 1, 'Cidade', 'Cidade', 'BIGINT', NULL, NULL, NULL, NULL, 'IU', '0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO nfs_core_ds_tabela_campo(TABELA_NOME, NOME, SYS, SEND_XMOVA, GRID, GRID_MOBILE, DESCRICAO, DESCRICAO_RESUMIDA, TIPO, OBRIGATORIO, TAMANHO, TAMANHO_DECIMAL, MASCARA, INSERT_UPDATE, DISABLED, HINT, LINK, VALIDACAO, OPCOES, VALOR_DEFAULT, VALIDACAO_VIEW, FILTRO_VIEW, TOOLTIP_MESSAGE, PROPERTIES)
VALUES('APONTAMENTO_MAQUINA', 'GIS_OBJECT_STATE_SEQ_DB', 0, 1, 1, 1, 'Estado', 'Estado', 'BIGINT', NULL, NULL, NULL, NULL, 'IU', '0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO nfs_core_ds_tabela_campo(TABELA_NOME, NOME, SYS, SEND_XMOVA, GRID, GRID_MOBILE, DESCRICAO, DESCRICAO_RESUMIDA, TIPO, OBRIGATORIO, TAMANHO, TAMANHO_DECIMAL, MASCARA, INSERT_UPDATE, DISABLED, HINT, LINK, VALIDACAO, OPCOES, VALOR_DEFAULT, VALIDACAO_VIEW, FILTRO_VIEW, TOOLTIP_MESSAGE, PROPERTIES)
VALUES('APONTAMENTO_MAQUINA', 'GIS_ST', 1, 1, 1, 1, 'Status processamento GIS', 'processamento GIS', 'TINT', NULL, NULL, NULL, NULL, 'IU', '0', NULL, NULL, NULL, NULL, '0', NULL, NULL, NULL, NULL);
-- Depois de executar o create DS/DDL
alter table app_apontamento_maquina
add constraint app_apt_city_fk foreign key (GIS_OBJECT_CITY_SEQ_DB) references app_gis_object(SEQ_DB),
add constraint app_apt_state_fk foreign key (GIS_OBJECT_STATE_SEQ_DB) references app_gis_object(SEQ_DB);
Criando o agendamento(scheduler)
Adicionaremos uma agendamento que irá executar a cada 10(dez) minutos,o qual ira utilizar o método services\GisService::setAptGisUfRegion($nomeTabelaApontamento), o qual irá processar os apontamentos:
INSERT INTO nfs_core_scheduler
(NAME, DESCRIPTION, CODE_ENTRY_POINT, EMPRESA, FILIAL, `LOCAL`, ATIVO, CRON_EXPRESSION, LAST_EXECUTED, EXECUTED)
VALUES( 'update_aptgis_state_n_city', 'Worker para update dos estados e municipios na tabela de apontamentos', 'services\\GisService::setAptGisUfRegion('apontamento_maquina');
', 1, 1, 1, 1, '*/10 * * * *', '2022-03-23 11:58:06', 1);
Processamento GIS(GIS_ST):
- Pega os registro com GIS_ST=0, POSICAO_PLAT e POSICAO_PLON não nuls e gera o POSICAO_GEOM, altera o GIS_ST para 1;
- Define os municípios dos registros com GIS_ST = 1, altera o GIS_ST para 2;
- Define os estados de registro com o município já definido, altera o GIS_ST para 3.