Buffer.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. """
  2. ***************************************************************************
  3. Buffer.py
  4. ---------------------
  5. Date : August 2012
  6. Copyright : (C) 2012 by Victor Olaya
  7. Email : volayaf at gmail dot com
  8. ***************************************************************************
  9. * *
  10. * This program is free software; you can redistribute it and/or modify *
  11. * it under the terms of the GNU General Public License as published by *
  12. * the Free Software Foundation; either version 2 of the License, or *
  13. * (at your option) any later version. *
  14. * *
  15. ***************************************************************************
  16. """
  17. __author__ = 'Victor Olaya'
  18. __date__ = 'August 2012'
  19. __copyright__ = '(C) 2012, Victor Olaya'
  20. from qgis.core import (Qgis,
  21. QgsFeature,
  22. QgsGeometry,
  23. QgsFeatureRequest,
  24. QgsFeatureSink)
  25. def buffering(feedback, context, sink, distance, field, useField, source, dissolve, segments, endCapStyle=1,
  26. joinStyle=1, miterLimit=2):
  27. if useField:
  28. field = source.fields().lookupField(field)
  29. outFeat = QgsFeature()
  30. current = 0
  31. total = 100.0 / source.featureCount() if source.featureCount() else 0
  32. # With dissolve
  33. if dissolve:
  34. attributes_to_fetch = []
  35. if useField:
  36. attributes_to_fetch.append(field)
  37. features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes(attributes_to_fetch))
  38. buffered_geometries = []
  39. for inFeat in features:
  40. if feedback.isCanceled():
  41. break
  42. attrs = inFeat.attributes()
  43. if useField:
  44. value = attrs[field]
  45. else:
  46. value = distance
  47. inGeom = inFeat.geometry()
  48. buffered_geometries.append(inGeom.buffer(float(value), segments, Qgis.EndCapStyle(endCapStyle), Qgis.JoinStyle(joinStyle), miterLimit))
  49. current += 1
  50. feedback.setProgress(int(current * total))
  51. final_geometry = QgsGeometry.unaryUnion(buffered_geometries)
  52. outFeat.setGeometry(final_geometry)
  53. outFeat.setAttributes(attrs)
  54. sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
  55. else:
  56. features = source.getFeatures()
  57. # Without dissolve
  58. for inFeat in features:
  59. if feedback.isCanceled():
  60. break
  61. attrs = inFeat.attributes()
  62. if useField:
  63. value = attrs[field]
  64. else:
  65. value = distance
  66. inGeom = inFeat.geometry()
  67. outFeat = QgsFeature()
  68. outGeom = inGeom.buffer(float(value), segments, Qgis.EndCapStyle(endCapStyle), Qgis.JoinStyle(joinStyle), miterLimit)
  69. outFeat.setGeometry(outGeom)
  70. outFeat.setAttributes(attrs)
  71. sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
  72. current += 1
  73. feedback.setProgress(int(current * total))