ArcGis c'est génial, ShapeLib c'est de la merde

Posté le Fri 20 February 2015 dans Boulot
Temps de lecture estimé : 5 minute(s).

Cela fait plus de 6 ans que je travaille activement dans les SIG. Ou plus précisément, dans le développement de logiciels utilisant les SIG. Et cela fait environ 4 ans que je travaille avec ArcGis. J'ai commencé avec ArcGis 10.0, et je travaille actuellement avec la version 10.2.2. Si je devais résumer ces 4 années d'expérience en 1 phrase, je dirais la chose suivante : ArcGis c'est génial, ShapeLib c'est de la merde. Bien entendu, j'expose ici ma vue en tant que technicien, développeur et architecte SIG.

Note : Je parle ici de ArcGis ShapeLib, et non de MapTools ShapeLib

ArcGis c'est génial

Oui, dans l'ensemble, ArcGis c'est génial. Il y a certes quelques bugs, mais quand on voit la quantité de choses que l'on peut faire, et la facilité avec laquelle elles peuvent être faites, on peut vivre avec ces quelques bugs. La couche serveur est vraiment bien fichue. La création et la publication de services avec ArcMap est facile. Le scripting en python permet de faire à peu près ce qu'on veut. Les APIs sont performantes, intuitives, et rapides à mettre en œuvre. En outre, il y a énormément d'exemples d'utilisation accessibles en ligne. Les outils d'analyse spatiale sont nombreux, et même s'ils sont parfois peut performants, les résultats sont là. La couche Network Analyst fonctionne dans l'ensemble plutôt bien.

Bref, j'ai bien sûr rencontré quelques problèmes, comme par exemple avec le Network Analyst si on change la tolérance par défaut des coordonnées Z d'un système de coordonnées, ou avec l'API silverlight qui ne gère pas correctement les appels aux services raster pour l'identification d'altitude, ou encore un paramètre de configuration qu'il fallait mettre à true pour lui donner la valeur false, et inversement. Mais ce genre de bugs existent dans toutes les applications.

ShapeLib c'est de la merde

Par contre, il y a un composant dans ArcGis qui dépasse absolument tout ce que j'ai connu jusqu'à présent en termes de bugs et de non-fiabilité. Il s'agit de l'extension ShapeLib fournie avec ArcGis permettant d'ajouter à une base de données (Oracle dans mon cas) certaines fonctionnalités spatiales plus ou moins avancées. Et de pouvoir ensuite utiliser ces nouvelles fonctionnalités en SQL. Et là, je ne peux qu'être consterné devant tous les problèmes auxquels j'ai déjà été confronté. Je ne les compte même plus.

Lecture de géométries

Premier exemple, la simple lecture d'une géométrie au format WKB : select sde.st_asbinary(shape) from table where id=1;

Unitairement, aucun problème. Par contre, quand on commence à avoir un grand nombre d'opérations spatiales qui se sont succédées dans la même session Oracle, tout à coup cette opération va renvoyer des valeurs incohérentes. Je ne parle même pas ici d'erreur ou de crash, mais des valeurs incohérentes. Ce qui est bien plus grave. Cela signifie qu'on va lire des données fausses, qu'on va les utiliser pour calculer d'autres valeurs, et on va ensuite sauvegarder ces valeurs, etc... Cette erreur risque clairement du pourrir totalement et irréversiblement les données présentes dans une base de données.

Solution : Il semble que le problème ne soit pas présent avec la lecture des géométries au format WKT. Nous utilisons donc cette fonctionnalité pour l'instant. Et nous avons désactivé le pool des sessions Oracle, histoire que les sessions ne soient pas réutilisées pour des connexions futures.

Sauvegarde de géométries

Second cas, la sauvegarde d'une nouvelle géométrie. insert into table(id, shape) values (1, sde.st_geomfromtext(wkt, SRID));

Là, même unitairement, ça ne passe pas pour toutes les géométries. Bon, là au moins, ça plante. Mais bon... Quelqu'un peut-il m'expliquer comment je fais du coup pour sauver mes données en base si les fonctions d'insertion plantent ? Ce problème a été remonté à Esri Suisse, puis à Esri Allemagne, pour terminer chez Esri USA. Nous avons attendu un patch pendant plusieurs mois. Et pendant ce temps là, nous ne pouvions pas sauvegarder certaines géométries en base... Et en attendant, je fais quoi avec un logiciel qui risque de planter à chaque sauvegarde ?

Solution (si on peut appeler cela une solution) : nous avons écrit un code permettant de sauvegarder directement les géométries sous leur forme binaire dans la base Oracle, sans passer par ShapeLib. Cette solution n'est bien entendu pas viable à long terme, mais elle a le mérite de fonctionner en attendant un patch.

Exploitation des géométries

Si j'ai réussi à lire et sauvegarder mes données, j'ai envie de pouvoir faire des calculs avec. Shapelib met à disposition des requêtes spatiales permettant de faire des analyses géographiques. Et bien certaines fonctions spatiales renvoient des exceptions Oracle de manière totalement aléatoire. select id, sde.st_intersects(shape, sde.st_geomfromtext(wkt, SRID))) from table;

Cette simple requête peut renvoyer au choix : ORA-29902, ORA-29903, ORA-28579, ORA 28576. Dans tous les cas, le vrai message d'erreur est le suivant : ORA-28579: network error during callback from external procedure agent

En gros : Quelque-chose a merdé. J'ai pas plus d'infos. Démerde-toi. Et le plus drôle (ou pas), c'est que si j’exécute la même requête 2 fois consécutives, je reçois une erreur Oracle la première fois, et la seconde fois tout se passe bien. Enfin pas toujours non plus...

Solution : Nous avons patché notre code comme suit : try {   result = ReadWithShapeLib(cmd); } catch (OracleException e) {   switch (e.Number)   {     case 29903:     case 29902:     case 28579:     case 28576:       // ORA-28579: network error during callback from external procedure agent       // We try to read a second time       result = ReadWithShapeLib(cmd);       break;     default:       throw;   } }

Conclusion

ArcGis permet de faire tellement de choses complexes, parfois avec une facilité déconcertante. Mais pourquoi les opérations les plus simples telles que l'accès aux géométries sont-elles tellement buguées ? C'est totalement incroyable...

Pour terminer, une simple question :

  • Si je ne sais pas lire mes données de manière 100% fiable
  • Si je ne sais pas si je vais pouvoir sauvegarder mes données
  • Si je ne suis pas sûr de pouvoir traiter et exploiter mes données

Comment est-ce que je fais pour créer un logiciel fiable ?

ArcGis c'est génial, ShapeLib c'est vraiment de la merde