Camadas WMS, KMZ, KML
Podemos adicionar cadas externas nos nossos mapas Marte e mapas GIS através de entry points "MAPS-LAYERS-EXTERNAL"
Configuração
Criar um entryPoint com o FILE_OR_DOMAIN = MAPS-LAYERS-EXTERNAL
O Conteúdo dele deve ser, como exemplo:
$externalLayers[] = ["type" => "kml",
"Name" => "Teste KML"
,"Url" => "/assets/etc/Teste_KML.kml"];
$externalLayers[] = ["type" => "kmz",
"Name" => "Simova"
,"Url" => "/assets/etc/Simova.kmz"];
return $externalLayers;
Exemplo de chamada ao portal WMS com api esri
$externalLayers[] = ["Name" => "UPs-Silv-MS-2"
,"Url" => "https://portalgis.suzano.com.br/server/rest/services/Desenvolvimento/PLANTIO_MS_T1/MapServer/"
,"Layers" => ['UP']];
return $externalLayers;
Exemplo com conteúdo KML dentro do entryPoint (ou pode vir de um cadastro, api, etc):
$content = "<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<name>Teste KML.kml</name>
<StyleMap id="m_ylw-pushpin">
<Pair>
<key>normal</key>
<styleUrl>#s_ylw-pushpin</styleUrl>
</Pair>
<Pair>
<key>highlight</key>
<styleUrl>#s_ylw-pushpin_hl</styleUrl>
</Pair>
</StyleMap>
<Style id="s_ylw-pushpin_hl">
<IconStyle>
<scale>1.3</scale>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
</Icon>
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
</IconStyle>
<LineStyle>
<color>ff2c5dfd</color>
<width>2.9</width>
</LineStyle>
<PolyStyle>
<color>807899f7</color>
<colorMode>random</colorMode>
</PolyStyle>
</Style>
<Style id="s_ylw-pushpin">
<IconStyle>
<scale>1.1</scale>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
</Icon>
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
</IconStyle>
<LineStyle>
<color>ff2c5dfd</color>
<width>2.9</width>
</LineStyle>
<PolyStyle>
<color>807899f7</color>
<colorMode>random</colorMode>
</PolyStyle>
</Style>
<Placemark>
<name>Teste KML</name>
<styleUrl>#m_ylw-pushpin</styleUrl>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-49.98030955391177,-20.11809369236751,0 -50.24076996027695,-20.18153182836599,0 -50.54669615017947,-20.5268783615084,0 -50.71789044379601,-21.52543068234906,0 -50.39520524821304,-21.71558335465463,0 -49.39739572821397,-22.27000319158382,0 -48.51880265648861,-21.88970888360517,0 -48.24752126546238,-21.56225003094103,0 -48.92921058980514,-20.99788546319585,0 -48.24565122044976,-20.87519670753311,0 -48.18302886940717,-20.65207767618273,0 -48.21348486326866,-20.44782877579947,0 -48.41990936243072,-20.41806673823675,0 -48.64766134424571,-20.55323262129171,0 -49.09207205295417,-20.53042843073673,0 -49.39189442510747,-20.47850528508822,0 -49.58803631627013,-20.37846921394921,0 -49.98030955391177,-20.11809369236751,0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>";
$externalLayers[] = ["type" => "kmlcontent",
"Name" => "Simova content"
,"content" => $content];
return $externalLayers;
Popup
Foto
Foi criado um metodo chamado showImage() utilizando a classe nfsUi que prove um componente html capaz de exibir uma imagem baseada na Tabela, Coluna e SEQ_DB da mesma.
Sintaxe básica de implementação
\html\nfsUi::showImage('tabela','coluna','seq_db')
Exemplo de uso em um entrypoint
array_push($_aLists['apontamentos_semana'],
array('date_pos'=>$dataApt,
'date_pos_str'=>$dataApt,
'plat'=>$latApt,
'plon'=>$lonApt,
'popup'=> $objTorre['DESCRICAO'],
'label'=> $objTorre['DESCRICAO'].(empty($seqApt) ? $seqApt : ' *****'),
'popup_json'=>json_encode(array(
'COORDENADAS'=>$objTorre['POSICAO_PLAT'].' '.$objTorre['POSICAO_PLON'],
'DESCRICAO'=>$objTorre['DESCRICAO'],
'ATIVIDADE REALIZADA'=>$descAtividade,
'ENCARREGADO'=>$descEncarregado,
'DATA'=>$dataApt,
)
),
'popup_end'=>\html\nfsUi::showImage('APONTAMENTO_MO_PRODUCAO','FOTO_THUMBNAIL',$seqDBMoProd)."<div class=text-center'>".\html\nfsUi::buttonCrudSeq('ENERGY_TOWER',$objTorre['SEQ_DB'],$objTorre['DESCRICAO']).' '.\html\nfsUi::buttonCrudFK('APONTAMENTO_MO','SEQ_DB',$seqDB,'','Abrir Apontamentos')."</div>",'icon'=>$towerType[$tipo]['ICON']
)
);
Exemplo de entrypoint completo
$_jsonReturn = ['status' => [], 'config' => [], 'layers' => [], 'lists' => []];
$_config['mapName'] = 'Apontamentos da Semana';
$user = \core\xDS::getUser();
$empresa = $user->EMPRESA_ATUAL;
$local = $user->LOCAL_ATUAL;
$filial = $user->FILIAL_ATUAL;
$_aLists['apontamentos_semana'] = [];
$towerType = \core\TabelaBO::getAllDataToArrayKey("ENERGY_TOWER_TYPE","SEQ_DB");
$towers = \core\TabelaBO::getAllDataToArrayKey("ENERGY_TOWER","SEQ_DB");
$sql = "SELECT mo.SEQ_DB, mo.SEQ_DB_DEVICE, mo.INI_DH, concat(f.CRACHA,' - ',f.NOME) as FUNCIONARIO, mo.TORRE_SEQ_DB, a.DESCRICAO, mo.POSICAO_PLAT, mo.POSICAO_PLON, mop.SEQ_DB as SEQ_DB_MO_PROD
FROM app_apontamento_mo mo
inner join app_atividade a ON mo.ATIVIDADE_SEQ_DB = a.SEQ_DB
inner join app_funcionario f on mo.FUNCIONARIO_SEQ_DB = f.SEQ_DB
inner join app_apontamento_mo_producao mop on mo.SEQ_DB_DEVICE_MASTER_SEQ_DB = mop.SEQ_DB_DEVICE_MASTER_SEQ_DB and mo.seq_db_device_relacional = mop.seq_db_device_relacional
where mo.empresa = {$empresa} and mo.filial = {$filial} and mo.local = {$local}
and mo.INI_DH between DATE_SUB(CURDATE(),INTERVAL 30 day) and CURDATE()
order by INI_DH DESC";
$aptos = \core\ConexaoDB::query($sql, $params = []);
foreach($aptos as $apt){
$seqDB = $apt['SEQ_DB'];
$seqDBMoProd = $apt['SEQ_DB_MO_PROD'];
$torreSeqDb = $apt['TORRE_SEQ_DB'];
$seqApt = $apt['SEQ_DB_DEVICE'];
$dataApt = $apt['INI_DH'];
$descAtividade = $apt['DESCRICAO'];
$descEncarregado = $apt['FUNCIONARIO'];
$latApt = $apt['POSICAO_PLAT'];
$lonApt = $apt['POSICAO_PLON'];
if(!empty($latApt) and !empty($lonApt) and !empty($torreSeqDb)){
$objTorre = $towers[$torreSeqDb] ?? null;
if (empty($objTorre)) {
continue;
}
// $sqlTorre = "select et.SEQ_DB as SEQ_DB, et.NOME, et.CODIGO, et.DESCRICAO, et.POSICAO_PLAT, et.POSICAO_PLON, et.POSICAO_DH, et.UPD_DH, et.ENERGY_TOWER_TYPE_SEQ_DB
// from app_energy_tower et where et.ATIVO = 1 and et.DELETED = 0 and (et.POSICAO_PLAT is not null and et.POSICAO_PLON is not null)
// and et.empresa = {$empresa} and et.filial = {$filial} and et.local = {$local} and et.SEQ_DB = {$torre}";
// $torresMO = \core\ConexaoDB::query($sqlTorre, $params = []);
$tipo = $objTorre['ENERGY_TOWER_TYPE_SEQ_DB'];
array_push($_aLists['apontamentos_semana'],
array('date_pos'=>$dataApt,
'date_pos_str'=>$dataApt,
'plat'=>$latApt,
'plon'=>$lonApt,
'popup'=> $objTorre['DESCRICAO'],
'label'=> $objTorre['DESCRICAO'].(empty($seqApt) ? $seqApt : ' *****'),
'popup_json'=>json_encode(array(
'COORDENADAS'=>$objTorre['POSICAO_PLAT'].' '.$objTorre['POSICAO_PLON'],
'DESCRICAO'=>$objTorre['DESCRICAO'],
'ATIVIDADE REALIZADA'=>$descAtividade,
'ENCARREGADO'=>$descEncarregado,
'DATA'=>$dataApt,
)
),
'popup_end'=>\html\nfsUi::showImage('APONTAMENTO_MO_PRODUCAO','FOTO_THUMBNAIL',$seqDBMoProd)."<div class=text-center'>".\html\nfsUi::buttonCrudSeq('ENERGY_TOWER',$objTorre['SEQ_DB'],$objTorre['DESCRICAO']).' '.\html\nfsUi::buttonCrudFK('APONTAMENTO_MO','SEQ_DB',$seqDB,'','Abrir Apontamentos')."</div>",'icon'=>$towerType[$tipo]['ICON']
)
);
}
}
$_config['apontamentos_semana']['showDescricao'] = true;
array_push($_jsonReturn['layers'], array('name' => 'Apontamentos-da-Semana','list' => 'apontamentos_semana','mtype' => 'dot'));