Le KML, kesaco ?

Le langage KML (Keyhole Markup Language) a été développé pour Google Earth, au départ appelé « Keyhole Earth Viewer ». Ce langage créé par Keyhole, Inc. a été acheté par Google en 2004. Le programme Google Earth était le premier à permettre l’affichage et la modification graphique des fichiers KML. Le nom « Keyhole » rend hommage aux satellites de reconnaissance KH, le premier système de reconnaissance militaire américain mis en orbite en 1976 pour effectuer la surveillance aérienne.
Google a proposé le langage KML à l’Open Géospatial Consortium (OGC®) pour lui permettre d’évoluer dans le processus consensuel de l’OGC® et en faire une norme ouverte pour tous les géonavigateurs.

Dans sa version native, la cartographie de Qlik Sense accepte seulement le format KML comme fichier cartographique. L’ajout de ce type de données dans le modèle de données de notre application va nous permettre de l’enrichir énormément, avec notamment des axes d’analyses supplémentaires, la possibilité d’utiliser la visualisation cartographique de manière plus poussée (multi couches).
Cependant lorsque l’on ouvre un fichier KML, nous pouvons voir ceci :

Utilisation du KML dans la cartographie native de Qlik Sense

A première vue, il va être compliqué d’intégrer ces données dans notre modèle (pas de clé primaire, rien de distinctif entre nos lignes).

Dans les entrailles du KML avec Qlik Sense

Il ne faut pas oublier que notre fichier KML est aussi lisible en XML et nous allons découvrir qu’il possède des informations cachées qui jusqu’à présent ne nous étaient pas accessibles.

Grâce à Qlik Sense, nous allons pouvoir voir et exploiter ces données en XML.

Utilisation du KML dans la cartographie native de Qlik Sense

Nous pouvons découvrir qu’il y a 6 tables qui sont extraites du fichier KML, ainsi nous pouvons voir qu’il y a beaucoup plus d’informations qu’aux premiers abords !

Cependant, les informations ne sont pas directement exploitables. Il nous faut retravailler les données pour pouvoir les exploiter. Pour exploiter au mieux la richesse du contenu d’un KML, nous allons devoir récupérer les champs et réorganiser les données pour obtenir une table exploitable.

Voici ci-dessous un exemple de routine pour exploiter au mieux un fichier KML :

Création d’une routine de transformation du KML en table exploitable

Le KML : Les différents paramètres de la routine KML To Table

  • vType : type de données du KML (Point ou Area)
  • vAdresse : chaine de connexion vers le KML depuis la librairie Exemple : lib://Data/Carto/laposte_hexasmal/laposte_hexasmal.kml
  • vRootSchemaData : Chemin de connexion issue de la lecture XML du fichier KML. Exemple : kml/Document/Folder/Placemark/ExtendedData/SchemaData
  • vKMLTableIs : indication de lecture du fichier KML (indication récupérer lors de l’ouverture du fichier en mode de lecture KML)
  • vQVD : indique si la routine doit enregistrer les données au format QVD

Script de création de la routine du KML To Table

Sub KML_to_Table (vType,vAdresse,vRootSchemaData,vKMLTableIs,vQVD)
//--- Définition des variables
Set vLib;
Set vFolder ;
Set vFile ;

for a=1 to SubStringCount('$(vAdresse)','/')+1
Switch a
Case 1
vLib = SubField('$(vAdresse)','/',1)&'/';
Case 2
vFolder ='$(vFolder)';
Case (SubStringCount('$(vAdresse)','/')+1)
vFile = Subfield(SubField('$(vAdresse)','/',-1),'.',1)
// vFile = Subfield(SubField(replace('$(vAdresse)','-','_'),'/',-1),'.',1)
Default
vFolder ='$(vFolder)/'&SubField('$(vAdresse)','/',a)
End Switch
next;

Set vRoot= '$(vLib)$(vFolder)';
Set vPath = '[$(vRoot)/$(vFile).kml]';
Set vQVDPath = '[$(vRoot)/$(vFile).qvd]';
let vTableName = Subfield(SubField(replace('$(vAdresse)','-','_'),'/',-1),'.',1);// '$(vFile)';

//-- création d'une table vide
$(vTableName)_temp:
load 1 as junk
AutoGenerate(1);

//-- Chargement des entêtes de champs issue du fichier KML (table SimpleField)
Field:
LOAD distinct
name
FROM $(vPath)
(XmlSimple, table is [kml/Document/Schema/SimpleField]);

//-- pour chaque champ
set vCpt=1;
For Each vName in FieldValueList('name')

trace '----------------------- $(vName) --------------------------';

if $(vName) =1 then
// Si on est au premier champ créer on concatène les informations dans la table vide
concatenate ($(vTableName)_temp)
LOAD
// On créé un identifiant pour chaque ligne
'p'&rowno() as NameID,
// On renseigne la valeur du champ pour chaque ligne
TEXT(SimpleData%Table) as '$(vName)'
FROM $(vPath)
(XmlSimple, table is [$(vRootSchemaData)/SimpleData])
where name = '$(vName)';
else
// pour les autres champs que le premier on vient jointer les informations
// afin d'ajouter les champs dans la table en construction
left join ($(vTableName)_temp)
LOAD
'p'&rowno() as NameID,
TEXT(SimpleData%Table) as '$(vName)'
FROM $(vPath)
(XmlSimple, table is [$(vRootSchemaData)/SimpleData])
where name = '$(vName)';
endif
vCpt=$(vCpt)+1;
next vName;
drop Field junk from $(vTableName)_temp;
drop table Field;

noconcatenate
// Nous procédons à l'ajout des données cartographiques proprement dite à notre table
$(vTableName):
load * RESIDENT $(vTableName)_temp;
left join ($(vTableName))
LOAD
'p'&rowno() as NameID,
// *,
[$(vFile).Name] as Name,
[$(vFile).$(vType)] as $(vType)
FROM $(vPath)
(kml, Table is [$(vKMLTableIs)]);

// On associe nos données cartographiques à un tag pour que Qlik Sense puisse les utiliser au mieux dans le modèle
if $(vType)='Area'then
TAG FIELDS $(vType) WITH $geomultipolygon;
else
TAG FIELDS $(vType) WITH $geopoint;
end if;

drop table $(vTableName)_temp;
// On autorise ou non la mise en QVD de la table obtenue
if '$(vQVD)'='OUI' then
Store $(vTableName) into '$(vQVDPath) (qvd)';
end if
End Sub

// exemple d'appel de la routine :
Call KML_to_Table(
'Point','lib://Data/Carto/laposte_hexasmal/laposte_hexasmal','kml/Document/Placemark/ExtendedData/SchemaData','laposte_hexasmal');

Utilisation du KML dans la cartographie native de Qlik Sense

A l’issue du chargement, cela nous permet de récupérer une table fonctionnelle que l’on pourra aisément intégrer dans notre modèle de données.

Le KLM et l’Open Data

A noter : Les données que l’on récupère en Open Data n’étant pas forcément toutes structurées de la même façon, des modifications mineures peuvent être nécessaires dans le script de la routine ci-dessus.

Vous souhaitez aller plus loin et vous former à Qlik Sense ? Nos consultants experts certifiés Qlik sont aussi formateurs. Découvrez notre formation Qlik Sense.

Vous recherchez des consultants certifiés Qlik ? Besoin d'être accompagné dans vos projets Qlik ? Next Decision est là ! Contactez-nous !