Oracle Locator & Google Maps
Le partage de données géographiques entre outils repose sur l’utilisation de formats d’échange standardisées. KML est un de ces formats et il est supporté notamment par Google Maps.
Oracle Locator permet de produire des données dans ce format à l’aide de la fonction SDO_UTIL.TO_KMLGEOMETRY. Les fichiers au format KML peuvent ensuite être importées dans Google Maps (via My Maps) afin d’en obtenir une représentation cartographique.
Dans le billet précédent, on a récupéré les position GPS de tout les ponts enjambant la Loire entre Nevers et Tours. Cela a permis de calculer approximativement la longueur du fleuve (en sommant les distances inter-ponts). Ici, on va utiliser les mêmes données mais dans le but de représenter la position 43 ponts sur Google Maps.
La fonction TO_KMLGEOMETRY prend un objet SDO_GEOMETRY en entrée et renvoie un CLOB contenant un fragment XML.
Ici, l’objet SDO_GEOMETRY sera construit à partir des attributs:
- SDO_GTYPE (attribut scalaire) valorisé à la valeur 2005 (géométrie 2D « 2 », de type multipoint « 5 »).
- SDO_SRID valorisé (attribut scalaire) à 8307 qui correspond au système de positionnement géodésique WGS84 utilisé par les GPS.
- SDO_ELEM_INFO_ARRAY (attribut tabulaire) valorisé avec les données 1, 1, et n (n étant le nombre de points de la structure multipoint – 43 dans notre cas)
- SDO_ORDINATE_ARRAY (attribut tabulaire) valorisé avec une succession des informations longitude puis latitude de chaque point. Ce dernier attribut est peuplé en faisant un BULK COLLECT des informations de la table LOC_PONTS_LOIRE.
Une fois récupéré le CLOB en sortie de l’appel de SDO_UTIL.TO_KMLGEOMETRY, on convertit ce dernier au format XMLType. Cela permet d’y adjoindre à l’aide des fonctions XML quelques attributs (prologue, balises kml, document et Placemark) afin de produire un fichier KML correctement structuré.
Le résultat est à nouveau convertit en CLOB avant d’être affiché.
L’ensemble de l’opération est réalisée à l’aide du bloc PL/SQL suivant:
SQL> set serveroutput on
SQL> set lines 32767
SQL> spool C:\RTI\ponts_Loire.kml
SQL>
SQL> DECLARE
2 l_kmlclob CLOB;
3 l_geom SDO_GEOMETRY;
4 l_coords sdo_ordinate_array;
5 l_nb NUMBER;
6 l_kmlxml XMLTYPE;
7 l1 CLOB;
8 BEGIN
9 SELECT f
10 BULK COLLECT INTO l_coords
11 FROM (SELECT seq, longitude f, 1 rn FROM LOC_PONTS_LOIRE
12 UNION ALL
13 SELECT seq, latitude, 2 rn FROM LOC_PONTS_LOIRE)
14 ORDER BY seq, rn;
15
16 l_nb := l_coords.COUNT / 2;
17
18 SELECT sdo_geometry (2005,
19 8307,
20 NULL,
21 sdo_elem_info_array (1, 1, l_nb),
22 l_coords)
23 INTO l_geom
24 FROM DUAL;
25
26 l_kmlclob := SDO_UTIL.TO_KMLGEOMETRY (l_geom);
27 l_kmlxml := XMLTYPE.createXML (l_kmlclob);
28
29 SELECT XMLROOT (
30 XMLELEMENT (
31 "kml",
32 xmlattributes ('http://earth.google.com/kml/2.2' AS "xmlns"),
33 XMLELEMENT (
34 "Document",
35 XMLCONCAT (
36 XMLELEMENT (
37 "name",
38 'Position des ponts sur la Loire entre Nevers et Tours'),
39 XMLELEMENT ("Placemark", l_kmlxml)))),
40 VERSION '1.0" encoding="ISO-8859-1').getClobVal ()
41 INTO l1
42 FROM DUAL;
43
44 DBMS_OUTPUT.put_line (l1);
45 END;
46 /
<?xml version="1.0" encoding="ISO-8859-1"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
<name>Position des ponts sur la Loire entre Nevers et Tours</name>
<Placemark>
<MultiGeometry>
<Point>
<extrude>0</extrude>
<tessellate>0</tessellate>
<altitudeMode>relativeToGround</altitudeMode>
<coordinates>3.158804,46.983663 </coordinates>
</Point>
< ... >
< ... >
< ... >
<Point>
<extrude>0</extrude>
<tessellate>0</tessellate>
<altitudeMode>relativeToGround</altitudeMode>
<coordinates>0.685248,47.399097 </coordinates>
</Point>
</MultiGeometry>
</Placemark>
</Document>
</kml>
PL/SQL procedure successfully completed.
SQL>
SQL> spool off
SQL>
Le fichier KML complet est accessible ici (l’extension doit être changée en « .kml » avant import dans My Maps): ponts_Loire
Ce dernier peut alors être importé dans Google My Maps à partir du lien « Import »:
Les points sont alors affichés sous la forme de calque sur une carte Google Maps:
