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

Mapas XMOVA Location

Esse tipo de mapa necessita apenas que algumas configurações basicas sejam executadas para que os items sejam efetivamente exibidos, em geral, este tipo de mapa utiliza o registro de location para exibição dos marcadores. exemplo:

  1. Criar um EntryPoint com FILE_OR_DOMAIN = "XMOVALOCATION";
  2. Definir no campo TABELA a tabela "EQP";
  3. Definir no campo FIELD o campo da tabela "nfs_sync_req_xmova_auth" que sera o vinculo com o SEQ_DB do equipamento(normalmente seqEquipamento);
INSERT INTO nfs_entry_point(SEQ_DB, FILE_OR_DOMAIN, `ACTION`, XMOVA_INSTALLCODE, XMOVA_INSTALLCODE_VERSION, EMPRESA, FILIAL, `LOCAL`, TABELA, ENTRY_NUM, CODE, VERSION, BUILD, ATIVO, CODETYPE, FIELD, DESCRIPTION, INS_DH, UPD_DH, NFS_USER, DB_USER)
VALUES(33, 'XMOVALOCATION', NULL, 9999, '9999', 9999, 9999, 9999, 'EQUIPAMENTO', NULL, NULL, 0, 0, 1, 'SQL', 'seqEquipamento', 'MAPAS', '2018-09-28 11:32:48', '2018-09-28 11:32:48', NULL, NULL);

Para esse tipo de mapa será necessario passarmos a tabela referente ao objeto que será exibido na tela, alem do nome do campo que contem o SEQ_DB e que vai fazer a relação do objeto com a sua location(no exemplo usamos o campo seqEquipamento). { .is-warning }

map.png

  • Exemplo de mapa para a tabela FUNCIONARIO usando location.

Tracking

Por padrão o tracking esta disponivel para este tipo de mapa, para isso basta executar os seguintes passos:

  1. No mapa com as ultimas localizações, selecione o objeto que deseja ver o trajeto;
  2. Defina na aba "Parâmetros" o periodo do trajeto;
  3. Clique no marcador do objeto e no botão azul "Tracking";
  4. Feito isso a aba com o trajeto será aberta. Video demonstração

Dados via Entry point

Este tipo de mapa permite que os dados venham diretamente de consultas feitas via entry point, para isso devemos realizar as consultas e retornala no $this->outputValues em um formato que é esperado pela biblioteca de renderização de mapas utilizada atualmente no sistema(Leflet).

parametros:

  • _config: Configuração do mapa como nome da camada, etc...;
  • _jsonReturn: Json que será utilizado para renderização das areas no mapa;
  • _aLists: Lista de registros.

Exemplos

Mapas de clientes:

EntryPoint clientes(MAPS): https://smartos.c.simova.com.br/gis/tracking/FUNCIONARIO/9/0?popup=1

$_jsonReturn = ['status' => [], 'config' => [], 'layers' => [], 'lists' => []];
$_config['mapName'] = 'Cliente';
$_aLists['layersClientes'] = [];

$clientesList = Dao::table('CLIENTE')
			->select(['SEQ_DB','POSICAO_PLAT','POSICAO_PLON','POSICAO_DH','DESCRICAO','CODIGO','UPD_DH'])
            ->whereIsNotNull('POSICAO_PLAT')
			->whereIsNotNull('POSICAO_PLON')
            ->limit(9999999)
            ->get();

$geoFenceDistance = 100;
foreach ($clientesList as $_seq => $_obj) {
	if (!empty($_obj['POSICAO_PLAT']) && !empty($_obj['POSICAO_PLON'])) {
		$geofence = [];
		if ($geoFenceDistance > 0) {
			$geofence = Utils::getArrayFromBoundingBox(floatval($_obj['POSICAO_PLAT']), floatval($_obj['POSICAO_PLON']), $geoFenceDistance);
		}
		$datePOS = isset($_obj['POSICAO_DH']) ? $_obj['POSICAO_DH'] : $_obj['UPD_DH'];
		array_push($_aLists['layersClientes'],
			array('date_pos' => $datePOS,
				'date_pos_str' => $datePOS,
				'plat' => $_obj['POSICAO_PLAT'],
				'plon' => $_obj['POSICAO_PLON'],
				'popup' => $_obj['DESCRICAO'],
				'label' => $_obj['DESCRICAO'],
				'geofence'=> json_encode($geofence),
				'popup_json' => json_encode(array(
						'CLIENTE' => $_obj['CODIGO'],
						'COORDENADAS' => $_obj['POSICAO_PLAT'].' '.$_obj['POSICAO_PLON'],
						'DESCRIÇÃO' => $_obj['DESCRICAO']
						)
					),
				'popup_end' => "<div class='text-center'>".\html\nfsUi::buttonCrudSeq('CLIENTE',$_obj['SEQ_DB'],$_obj['CODIGO'])."</div>",
				'icon' => ''
			)
		);
	}
}
$_config['layersClientes']['showDescricao'] = true;
array_push($_jsonReturn['layers'], array('name' => 'Cliente','list' => 'layersClientes','mtype' => 'url'));

/** envia os valores para saida do entry point */
$this->outputValues = compact('_config', '_jsonReturn', '_aLists');

Mapa de torres:

tower.png

$_jsonReturn = ['status' => [], 'config' => [], 'layers' => [], 'lists' => []];
$_config['mapName'] = 'Torres com cerca eletrônica';
$_aLists['torres'] = [];

$statusTorre = \core\TabelaBO::getAllDataToArrayKey("STATUS_TORRE","SEQ_DB");
$towers = \core\TabelaBO::getAllDataToArrayKey("ENERGY_TOWER","SEQ_DB");
$towerType = \core\TabelaBO::getAllDataToArrayKey("ENERGY_TOWER_TYPE","SEQ_DB");
$parametros = \core\TabelaBO::getAllDataToArrayKey("PARAMETRO_GERAL","SEQ_DB");
$geoFenceDistance = 100;
foreach ($towers as $_seq => $_obj) {
	if (!empty($_obj['POSICAO_PLAT']) && !empty($_obj['POSICAO_PLON'])) {
		foreach ($parametros as $param) {
			if ($_obj['LOCAL'] == $param['LOCAL']){
				if(!empty($param['CERCA_TORRE']) and $param['CERCA_TORRE'] > 0){
					$geoFenceDistance = intval($param['CERCA_TORRE']);
				}
				else{
					if(!empty($param['CERCA_PADRAO']) and $param['CERCA_PADRAO'] > 0){
						$geoFenceDistance = intval($param['CERCA_PADRAO']);
					}
				}
			}
		}
		
		$geofence = [];
		if ($geoFenceDistance > 0) {
			$geofence = Utils::getArrayFromBoundingBox(floatval($_obj['POSICAO_PLAT']), floatval($_obj['POSICAO_PLON']), $geoFenceDistance);
		}
		$datePOS = isset($_obj['POSICAO_DH']) ? $_obj['POSICAO_DH'] : $_obj['UPD_DH'];
		array_push($_aLists['torres'],
			array('date_pos' => $datePOS,
				'date_pos_str' => $datePOS,
				'plat' => $_obj['POSICAO_PLAT'],
				'plon' => $_obj['POSICAO_PLON'],
				'popup' => $_obj['DESCRICAO'],
				'label' => $_obj['DESCRICAO'],
				'geofence'=> json_encode($geofence),
				'popup_json' => json_encode(array(
						'TORRE' => $_obj['CODIGO'],
						'COORDENADAS' => $_obj['POSICAO_PLAT'].' '.$_obj['POSICAO_PLON'],
						'DESCRIÇÃO' => $_obj['DESCRICAO']
						)
					),
				'popup_end' => "<div class='text-center'>".\html\nfsUi::buttonCrudSeq('ENERGY_TOWER',$_obj['SEQ_DB'],$_obj['CODIGO'])."</div>",
				'icon' => $statusTorre[$_obj['STATUS_TORRE_SEQ_DB']]['ICON']
			)
		);
	}
}
$_config['torres']['showDescricao'] = true;
array_push($_jsonReturn['layers'], array('name' => 'Torres','list' => 'torres','mtype' => 'url'));
$this->outputValues = compact('_config', '_jsonReturn', '_aLists');

Filtros

Para adicionarmos filtros nos mapas gerados por entry point primeiramente devemos nos certificar que tabela nfs_gis_maps existe no ambiente, caso não exista, execute o comando CREATE DS/DDL FULL no admin console, que ela será criada. exemplo de filtro:

INSERT INTO nfs_gis_maps
(SEQ_DB, NAME, DISPLAY_NAME, FILTERS, ENABLED, INS_DH, UPD_DH, NFS_USER, DB_USER)
VALUES(1, 'action_do_entrypoint_de_mapa', 'Clientes Max', '{
	"inicio": {
		"type": "Date",
		"options": {
			"label": "De",
			"required": false
		}
	},
    "fim": {
        "type": "Date",
        "options": {
            "label": "Até",
            "required": false,
			"language": ''pt-BR''
        }
    },
    "cliente": {
		"type": "Table",
		"options": {
			"label": "Cliente",
			"required": false,
			"multiple": true
		}
	},
	"numero": {
		"type": "Decimal",
		"options": {
			"label": "Numero",
			"required": false
		}
	},
 	"codigo": {
        "type": "Text",
        "options": {
            "label": "Código",
            "required": false
        }
    },
	"hasEqp": {
    	"type": "Choice",
   		"options": {
    		"label": "Tem Equipamento?",
			"required": false,
    		"choices": {
        		"Sim": "1",
				"Não": "0"
      		}
    	}
  	},
	"limit": {
		"type": "Integer",
		"options": {
			"label": "Limite",
			"required": true
		}
	},
}
', 1, '2023-06-19 09:51:26', '2023-06-28 14:18:58', NULL, NULL);

feito isso os valores que os usuario preencher no filtro, será enviado e poderá ser acessado no entry point através da variavel $this->inputValues, desta forma:

$_jsonReturn = ['status' => [], 'config' => [], 'layers' => [], 'lists' => []];
$_config['mapName'] = 'Cliente';
$_aLists['layersClientes'] = [];

$filters = $this->inputValues ?? [];

if (!empty($filters)) {
	/** Criação do objeto Dao */
	$dao = Dao::table('CLIENTE')
			->select(['SEQ_DB','POSICAO_PLAT','POSICAO_PLON','POSICAO_DH','DESCRICAO','CODIGO','UPD_DH', 'FLAG_TEM_EQUIPAMENTO'])
            ->whereIsNotNull('POSICAO_PLAT')
			->whereIsNotNull('POSICAO_PLON');

	/** Adição dos Filtros */
	extract($filters);
	if($inicio && $fim) {
		$dao->whereDateBetween('POSICAO_DH', $inicio, $fim);
	}
	if($cliente) {
		$dao->whereIn('SEQ_DB', $cliente);
	}
	if ($codigo) {
		$dao->where(['CODIGO' => $codigo]);
	}
	if ($hasEqp) {
		$dao->where(['FLAG_TEM_EQUIPAMENTO' => $hasEqp]);
	}
	if($limit) {
		$dao->limit($limit);
	}
	/** Consulta do banco */
	$clientesList = $dao->get();
}

$geoFenceDistance = 0;
foreach ($clientesList as $_seq => $_obj) {
	if (!empty($_obj['POSICAO_PLAT']) && !empty($_obj['POSICAO_PLON'])) {
		$geofence = [];
		if ($geoFenceDistance > 0) {
			$geofence = Utils::getArrayFromBoundingBox(floatval($_obj['POSICAO_PLAT']), floatval($_obj['POSICAO_PLON']), $geoFenceDistance);
		}
		$datePOS = isset($_obj['POSICAO_DH']) ? $_obj['POSICAO_DH'] : $_obj['UPD_DH'];
		array_push($_aLists['layersClientes'],
			array('date_pos' => $datePOS,
				'date_pos_str' => $datePOS,
				'plat' => $_obj['POSICAO_PLAT'],
				'plon' => $_obj['POSICAO_PLON'],
				'popup' => $_obj['DESCRICAO'],
				'label' => $_obj['DESCRICAO'],
				'geofence'=> json_encode($geofence),
				'popup_json' => json_encode(array(
						'CLIENTE' => $_obj['CODIGO'],
						'COORDENADAS' => $_obj['POSICAO_PLAT'].' '.$_obj['POSICAO_PLON'],
						'DESCRIÇÃO' => $_obj['DESCRICAO']
						)
					),
				'popup_end' => "<div class='text-center'>".\html\nfsUi::buttonCrudSeq('CLIENTE',$_obj['SEQ_DB'],$_obj['CODIGO'])."</div>",
				'icon' => ''
			)
		);
	}
}
$_config['layersClientes']['showDescricao'] = true;
array_push($_jsonReturn['layers'], array('name' => 'Cliente','list' => 'layersClientes','mtype' => 'url'));

$this->outputValues = compact('_config', '_jsonReturn', '_aLists');