test.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from qgis._core import QgsWkbTypes
  2. from qgis.core import QgsVectorLayer, QgsFeature
  3. # 加载Shapefile
  4. layer = QgsVectorLayer("E:\\projects\\遥感技术部需求\\裁剪栅格\\data\\grid.shp", "grid", "ogr")
  5. D = 40
  6. d = 2
  7. # 检查图层是否加载成功
  8. if not layer.isValid():
  9. print("图层加载失败!")
  10. else:
  11. # 遍历每一个Feature
  12. for feature in layer.getFeatures():
  13. # 获取每个Feature的几何信息
  14. geometry = feature.geometry()
  15. # 判断几何类型,如果是点类型,可以直接获取坐标
  16. if geometry.type() == QgsWkbTypes.PointGeometry:
  17. point = geometry.asPoint() # 返回点的坐标 (x, y)
  18. print(f"点坐标: {point}")
  19. # 如果是线或面类型,获取所有坐标
  20. elif geometry.type() == QgsWkbTypes.LineGeometry:
  21. for point in geometry.asPolyline(): # 获取线的所有点
  22. print(f"线坐标: {point}")
  23. elif geometry.type() == QgsWkbTypes.PolygonGeometry:
  24. rings = None
  25. try:
  26. rings = geometry.asPolygon()
  27. except Exception as e:
  28. rings = geometry.asMultiPolygon()
  29. rings = rings[0]
  30. finally:
  31. print("读取完成")
  32. for ring in rings: # 获取面的所有点(包括外环和内环)
  33. if len(ring) != 5:
  34. print("要素错误!")
  35. continue
  36. print("开始计算")
  37. p1 = ring[0]
  38. p2 = ring[1]
  39. p3 = ring[2]
  40. p4 = ring[3]
  41. # ymax = int((max(p1.x(), p2.x(), p3.x(), p4.x()) + D) / d) * d
  42. # xmin = int((min(p1.x(), p2.x(), p3.x(), p4.x()) - D) / d) * d
  43. # ymin = int((min(p1.y(), p2.y(), p3.y(), p4.y()) - D) / d) * d
  44. # xmax = int((max(p1.y(), p2.y(), p3.y(), p4.y()) + D) / d) * d
  45. ymax = int((max(p1.y(), p2.y(), p3.y(), p4.y()) + D) / d) * d
  46. xmin = int((min(p1.x(), p2.x(), p3.x(), p4.x()) - D) / d) * d
  47. ymin = int((min(p1.y(), p2.y(), p3.y(), p4.y()) - D) / d) * d
  48. xmax = int((max(p1.x(), p2.x(), p3.x(), p4.x()) + D) / d) * d
  49. print(f"{xmin},{ymin},{xmax},{ymax}")
  50. # for point in ring:
  51. # print(f"面坐标: {point}")