Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Configuração

Para habilitarmos esta funcionalidade será necessario:

  1. 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}

  1. Logar no ambiente com algum usuario que possua acesso ao admin_console({host}/admin);
  2. 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}

  1. Executar o DS Reload e deslogar o usuario;
  2. 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:

mapas_menu.png

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\

grupos_gis.png

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*

object_gis.png

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:

gis_modal.png

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

  1. Na tela de criação/edição de um objeto GIS, devemos selecionar o seu tipo:

tipos.png

  1. Clicar no botão "Demarcar/Editar área";
  2. Selecionar a forma na toolBar que fica no canto superior esquerdo;
  3. Desenhar a forma;
  4. Ao concluir o desenho, irá aparecer a mensagem pedindo para fechar o modal e salvar as alterações no CRUD do objeto.

add_area.gif

Editando um objeto GIS existente

  1. Clicar no botão "Demarcar/Editar área";
  2. 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;
  3. Desenhe ou edite a forma;
  4. Ao concluir, irá aparecer a mensagem pedindo para fechar o modal e salvar as alterações no CRUD do objeto.

ezgif.com-gif-maker.gif

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.

gis_integration.png

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.

marte_integration.png

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.