extent.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from qgis._core import QgsRectangle
  2. from qgis.core import QgsVectorLayer, QgsFeature, QgsGeometry, QgsVectorFileWriter, QgsField, QgsWkbTypes
  3. from PyQt5.QtCore import QVariant
  4. # 输入shapefile路径
  5. input_shp = "E:\\projects\\遥感技术部需求\\裁剪栅格\\data\\grid.shp"
  6. # 输出shapefile路径
  7. output_shp = "E:\\projects\\遥感技术部需求\\裁剪栅格\\data\\grid_extent.shp"
  8. expand_distance = 50
  9. # 加载输入shapefile
  10. input_layer = QgsVectorLayer(input_shp, "input_layer", "ogr")
  11. if not input_layer.isValid():
  12. print(f"Failed to load input shapefile: {input_shp}")
  13. else:
  14. # 获取输入图层的字段信息
  15. fields = input_layer.fields()
  16. # 创建输出shapefile
  17. writer = QgsVectorFileWriter(output_shp, 'UTF-8', fields, QgsWkbTypes.MultiPolygon, input_layer.crs(),
  18. 'ESRI Shapefile')
  19. output_layer = QgsVectorLayer(output_shp, "output_shp", "ogr")
  20. # 检查文件是否成功创建
  21. if writer.hasError() != QgsVectorFileWriter.NoError:
  22. print(f"Error creating output shapefile: {output_shp}")
  23. else:
  24. # 遍历输入shapefile中的要素
  25. for feature in input_layer.getFeatures():
  26. # 获取要素的geometry和extent
  27. geometry = feature.geometry()
  28. extent = geometry.boundingBox() # 获取要素的extent(bounding box)
  29. # 对extent进行外扩
  30. # 使用 grow 方法来将bounding box外扩100米
  31. # extent.grow(expand_distance) # 扩展100米
  32. # print(f"Feature ID: {feature.id()}, Extent: {extent}")
  33. # 获取四至坐标
  34. minX = extent.xMinimum()
  35. maxX = extent.xMaximum()
  36. minY = extent.yMinimum()
  37. maxY = extent.yMaximum()
  38. # 手动扩展extent,向四个方向扩展100米
  39. expanded_minX = minX - expand_distance # 向左扩展
  40. expanded_maxX = maxX + expand_distance # 向右扩展
  41. expanded_minY = minY - expand_distance # 向下扩展
  42. expanded_maxY = maxY + expand_distance # 向上扩展
  43. # 创建新的扩展后的QgsRectangle
  44. expanded_extent = QgsRectangle(expanded_minX, expanded_minY, expanded_maxX, expanded_maxY)
  45. # 使用extent创建一个新的几何(矩形geometry)
  46. new_geometry = QgsGeometry.fromRect(expanded_extent)
  47. # 创建一个新的要素,并将新几何设置到要素中
  48. new_feature = QgsFeature(fields) # 创建新的空要素,使用相同的字段定义
  49. new_feature.setGeometry(new_geometry) # 设置新的几何(extent)
  50. # 复制原始要素的属性到新的要素
  51. new_feature.setAttributes(feature.attributes()) # 将原要素的属性复制到新要素
  52. # 将修改后的要素添加到输出shapefile
  53. writer.addFeature(new_feature)
  54. # 完成写入并关闭输出文件
  55. del writer
  56. print(f"Features copied from {input_shp} to {output_shp} with modified extent.")