Skip to Content

concave_hull2.py

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. #title :concave_hull12.py
  4. #description :script accompagnant l'article "Sur la création des enveloppes concaves (concave hull) et les divers moyens d'y parvenir".
  5. #auteur :M.Laloux
  6. #date :20140930
  7. #==============================================================================
  8.  
  9. from shapely.geometry import shape
  10. from shapely.ops import polygonize
  11. import fiona
  12. import numpy as np
  13. import subprocess
  14. # chemin de l'exécutable hull
  15. hull_path = "./hull"
  16. # lecture du fichier shapefile
  17. points = [[shape(point['geometry']).x,shape(point['geometry']).y] for point in fiona.open("points_test.shp")]
  18. # ou directement
  19. points = [(point['geometry']['coordinates'][0],point['geometry']['coordinates'][1]) for point in fiona.open("points_test.shp")]
  20. # création du fichier nécessaire au programme hull
  21. infile='test.txt'
  22. with open(infile, 'w') as f:
  23. np.savetxt(f, points, delimiter=' ', fmt="%0.7f %0.7f\n")
  24. # appel du programme et obtention de l'alpha shape en fonction d'un rayon de recherche
  25. def get_alpha_shape(infile,rayon):
  26. commande = "%s -A -aa %s -r -m10000000 -oN -oFpoints < %s" % (hull_path, str(rayon), infile)
  27. print >> sys.stderr, "Running command: %s" % command
  28. retcode = subprocess.call(commande, shell=True)
  29. # hull sauve automatiquement le résultat dans un fichier nommé hout-alf
  30. results_file = open("hout-alf")
  31. results_file.next()
  32. results_indices = [[int(i) for i in line.rstrip().split()] for line in results_file]
  33. results_file.close()
  34. result = [(points[i], points[j]) for i,j in results_indices]
  35. return result
  36. .....
  37. finding alpha shape; output to hout-alf
  38. alpha=1212.26
  39. rayon = 100
  40. alpha_shape = get_alpha_shape(infile,rayon)
  41. # polygone résultant avec la fonction polygonize de Shapely qu'il est ensuite possible de sauver avrc Fiona
  42. resultat= list(polygonize(alpha_shape))