Contourner deux limites de Google Fusion Tables

Petite exposition de deux limites constatées sur Google Fusion Tables (GFT) mais aussi sur les "rustines" utilisables pour les contourner.

Limite n°1 : la superposition de zones

Il peut arriver, surtout si vous piochez dans différentes sources cartographiques, que des zones décrites en KML se superposent. Si vous vous contentez d'une intégration basique dans GFT, vous risquez de tiquer très vite :

Le cas présent a été créé en mixant deux types de données :

  • les bans de communes où se trouve/trouvait le Grand hamster d'Alsace
  • les zones de protection trouvées sur le site de la DREAL Alsace

On distingue trois zones un peu enfouies et un peu visibles, quand elles devraient se trouver strictement au-dessus des bans communaux.

Rustine associée : la création de calques

Il va falloir contourner cet obstacle en utilisant l'API de Google Maps. Le principe est le suivant :

  • créer deux calques vides (de mémoire, on peut en créer jusqu'à cinq différents par carte)
  • assigner une ou des zones à chacun d'eux
  • initialiser le calque du dessous en premier, et le calque du dessus en dernier

Voici le script associé (pour activer le scroll horizontal, survolez le code) :

<script type="text/javascript">
var layer1=null;
var layer2=null;
var map=null;
var infowindow=new google.maps.InfoWindow();

function initialize(){

//on définit le centre de la carte
var selestat=new google.maps.LatLng(48.2593860,7.4542410);

//on configure l'ossature de la carte
map=new google.maps.Map(document.getElementById('map_canvas'),{center:selestat,zoom:9,mapTypeId:'roadmap'});

//on remplit le premier calque avec toutes les zones hors protection

layer1=new google.maps.FusionTablesLayer({suppressInfoWindows:true,styleId:2,query:{select:'Zone',where:"'Statut-num' not equal to 3",from:'1FRn48g46ZkKmh-yB0G78jaJ7DsPagdfps2ckQnI'},map:map});

//on remplit le second avec les zones de protection

layer2=new google.maps.FusionTablesLayer({suppressInfoWindows:true,query:{select:'Zone',where:"'Statut-num' = 3",from:'1FRn48g46ZkKmh-yB0G78jaJ7DsPagdfps2ckQnI'},styles:[{polygonOptions:{fillColor:"#000000",fillOpacity:0.0001}},{where:"'Statut-num' = 3",polygonOptions:{fillColor:"#31a354",fillOpacity:0.8,strokeColor:"#ffffff",}}]});

//on initialise le premier calque

setTimeout("layer1.setMap(map);",1);

//puis le second, en veillant bien à la marge de temps

setTimeout("layer2.setMap(map);",100);

//à chaque clic, on active la fonction open IW

google.maps.event.addListener(layer1,'click',openIW);
google.maps.event.addListener(layer2,'click',openIW);};

//que voici ici

function openIW(evt){evt.infoWindowHtml="<b>Nom de la zone :</b> "+evt.row['Nom de la zone'].value+"<br>"+"<b>Statut :</b> "+evt.row['Statut'].value;infowindow.setContent(evt.infoWindowHtml);infowindow.setPosition(evt.latLng);infowindow.open(map);}

</script>

Vous pourrez apprécier le résultat en cliquant sur le lien suivant.

Limite n° 2 : les zones trop complexes

Vous venez de téléchargez les zones qu'il vous fallait, téléchargées directement en KML et donc interprétables directement sur GFT. Vous en avez déjà eu un aperçu, et savez à peu près à quoi vous attendre (ici, c'est la zone hachurée en rouge qui nous intéresse) :

Capture d'écran du site de la DREAL Alsace

Capture d'écran du site de la DREAL Alsace

Mais, lorsque vous chargez pour la première fois votre rendu, vous obtenez ceci :

Étonnant, non ? Après demande d'aide sur un groupe de discussion, la faille est purement technique : une cellule de GFT supporte au maximum 1 million de caractères. Un de plus, et c'est le black-out, comme entre Sélestat et Obernai.

Rustine associée : la simplification, coûte que coûte

Bon, mais alors, comment faire pour  diminuer le nombre de caractère ? Penchons-nous sur une partie (tronquée) de notre zone à problèmes :

<MultiGeometry>
<Polygon>

<outerBoundaryIs>

<LinearRing>

<coordinates>8.230925,48.967454 8.22923,48.969628 8.227593,48.972079 8.226413,48.973975 8.225447,48.974871 8.224236,48.975543 8.222365,48.975924 8.220712,48.975951 8.219443,48.97587 8.216443,48.97563 8.214456,48.975007 8.212748,48.97419 8.211427,48.973291 8.209732,48.971987 8.208498,48.971129 8.206726,48.970469 8.204308,48.969912 8.202388,48.969159 8.200769,48.968266 8.199212,48.96781 8.198487,48.967945 8.197029,48.968738 8.195824,48.969454 8.195622,48.970213 8.196446,48.971316 8.197161,48.972074 8.197304,48.972725 8.196833,48.973397 8.196133,48.97472 8.195225,48.976486 8.194577,48.977293 8.194013,48.977752 8.193464,48.977852 8.192358,48.977762 8.190589,48.977489 8.189755,48.977259 8.188496,48.977131 8.18754,48.977151 8.18672,48.977408 8.186057,48.977712 8.185334,48.978107 8.184981,48.978251 8.184142,48.978336 8.183474,48.978369 8.182668,48.978382 8.181452,48.978279 8.179705,48.978212 8.177979,48.978207 8.175749,48.978334 8.173568,48.97854 8.171415,48.978744 8.171148,48.978685 8.171597,48.977816 8.171769,48.977276 8.171279,48.976931 8.170418,48.976712 8.16949,48.97673 8.168698,48.976868 8.168092,48.977087 8.167361,48.977393 8.166708,48.977425 8.16636,48.977369 8.165863,48.977222 8.165207,48.977228 8.164745,48.977376 8.164172,48.977522 8.163513,48.977509 8.162699,48.977449 8.162507,48.977449 8.161093,48.977897 8.16055,48.978437 8.160277,48.978433 8.15939,48.977981 8.159228,48.977628 8.158608,48.977596 8.15817,48.977959 8.156279,48.978186 8.155724,48.977754 8.155287,48.977884 8.154868,48.97758 8.153954</coordinates>
</LinearRing>
</outerBoundaryIs>

<innerBoundaryIs>
<LinearRing>
<coordinates> 7.70195,48.670728 7.702946,48.670881 7.703979,48.67097 7.705009,48.670969 7.706609,48.670914 7.707175,48.670906 7.708563,48.671023 7.709311,48.671323 7.709919,48.671899 7.710494,48.672576 7.710852,48.673019 7.711356,48.673842 7.711503,48.674286</coordinates>
</LinearRing>
</innerBoundaryIs>
<innerBoundaryIs>
<LinearRing>
<coordinates> 7.70195,48.670728 7.702946,48.670881 7.703979,48.67097 7.705009,48.670969 7.706609,48.670914 7.707175,48.670906 7.708563,48.671023 7.709311,48.671323 7.709919,48.671899 7.710494,48.672576 7.710852,48.673019 7.711356,48.673842 7.711503</coordinates>
</LinearRing>
</innerBoundaryIs>

</Polygon>
</MultiGeometry>

L'aire est construite un peu comme une sculpture :

  • d'abord, on dessine "grossièrement" les contours principaux entre les balises
  • ensuite, on peaufine en creusant à l'intérieur grâce aux balises

Après ce constat, la solution coule de source ; enlever assez de balises superficielles pour arriver en-dessous de la limite maximale du million de caractères. Personnellement, j'ai procédé de cette façon :

  • en utilisant un éditeur de code, type jEdit, pour repérer et enlever les fameuses balises
  • en vérifiant que je n'enlevais pas de partie trop importante, en visualisant de temps à autre mon KML dans l'excellent QGis

Et avec un peu de ténacité, la zone est enfin réapparue. Vous en trouverez ici un aperçu, avec en prime une superposition de calques.