Voici une carte de contour pour laquelle tous les polygones de niveaux sont disponibles.
Laissez-vous demander comment lisser les polygones en conservant tous les sommets à leur emplacement exact?
En effet, le contour étant créé au-dessus d’une donnée de grille, vous pouvez alors suggérer de lisser les données de la grille afin que le contour résultant soit plus lisse. Notez que cela ne fonctionne pas comme je le souhaite car la fonction de lissage, telle que le filtre gaussien, supprimera les petits paquets de données et modifiera la plage de la troisième variable, par exemple la hauteur non autorisée dans mon application.
En fait, je cherche un morceau de code (de préférence en Python ) capable de lisser des polygones 2D (tout type: convexe, concave, s'entrecroisant, etc.) raisonnablement indolore (oublier les pages de codes) et précis.
Pour votre information, il existe une fonction dans ArcGIS qui le fait parfaitement, mais l’utilisation d’applications commerciales tierces n’est pas mon choix pour cette question.
1)
Scipy.interpolate:
Comme vous le voyez, les splines obtenues (en rouge) ne sont pas satisfaisantes!
2)
Voici le résultat en utilisant le code donné ici . Cela ne fonctionne pas bien!
3)
Pour moi, la meilleure solution devrait être quelque chose comme la figure suivante dans laquelle un carré est lissé progressivement en ne modifiant qu'une seule valeur. J'espère un concept similaire pour lisser toute forme de polygone.
Satisfaire à la condition que spline passe les points:
4)
Voici mon implémentation de "l'idée de whuber" ligne par ligne en Python sur ses données. Il y a peut-être des bugs car les résultats ne sont pas bons.
K = 2 est un désastre et donc pour k> = 4.
5)
J'ai supprimé un point de l'emplacement problématique et la spline résultante est maintenant identique à celle de whuber. Mais il reste une question que pourquoi la méthode ne fonctionne pas pour tous les cas?
6)
Un bon lissage des données de whuber peut être le suivant (dessiné par un logiciel de graphisme vectoriel) dans lequel un point supplémentaire a été ajouté sans à-coups (comparer avec update
4):
sept)
Voir le résultat de la version Python du code de whuber pour certaines formes emblématiques:
Notez que la méthode semble ne pas fonctionner pour les polylignes. Pour la polyligne d’angle (contour), le vert est ce que je veux, mais j’ai eu le rouge. Ceci doit être traité car les cartes de contour sont toujours des polylignes, bien que les polylignes fermées puissent être traitées comme des polygones, comme dans mes exemples. En outre, le problème apparu dans la mise à jour 4 n’a pas encore été résolu.
8) [mon dernier]
Voici la solution finale (pas parfaite!):
N'oubliez pas que vous devrez faire quelque chose à propos de la zone indiquée par les étoiles. Il y a peut-être un bogue dans mon code ou la méthode proposée nécessite un développement supplémentaire pour prendre en compte toutes les situations et fournir les résultats souhaités.