123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- # -*- coding: utf-8 -*-
- __author__ = 'wanger'
- __description__ = '处理渔网数据 判断网格是否为自由 增加标签'
- __date__ = '2024-11-25'
- __copyright__ = '(C) 2024 by siwei'
- __revision__ = '1.0'
- import os
- from PyQt5.QtCore import QVariant
- from qgis.PyQt.QtCore import QCoreApplication
- from qgis._core import QgsSpatialIndex, QgsField, QgsRectangle
- from qgis.core import (QgsVectorLayer,
- QgsProcessingAlgorithm,
- QgsProcessingParameterFile)
- class FishNetProcessingAlgorithm(QgsProcessingAlgorithm):
- INPUT = 'INPUT'
- def tr(self, string):
- return QCoreApplication.translate('Processing', string)
- def createInstance(self):
- return FishNetProcessingAlgorithm()
- def name(self):
- return 'makeFishNet'
- def displayName(self):
- return self.tr('网格数据预处理')
- def group(self):
- return self.tr('栅格元数据生成')
- def groupId(self):
- return 'metadata'
- def shortHelpString(self):
- return self.tr("将输入的网格数据进行检查,将接边自由的要素做标记。")
- def initAlgorithm(self, config=None):
- self.addParameter(QgsProcessingParameterFile(
- self.INPUT,
- '网格数据',
- extension='shp' # 设置文件过滤器,只允许选择shp文件
- ))
- def cacl(self, neighbors):
- if len(neighbors) == 0:
- return "自由"
- else:
- return None
- # 执行
- def processAlgorithm(self, parameters, context, feedback):
- shp_file_path = self.parameterAsString(parameters, self.INPUT, context)
- # 检查文件路径是否有效
- if not os.path.exists(shp_file_path):
- feedback.reportError(f"指定的文件路径 {shp_file_path} 不存在!")
- return {}
- # 加载Shapefile为QgsVectorLayer
- layer = QgsVectorLayer(shp_file_path, "Vector Layer", 'ogr')
- layer.startEditing()
- grid_width = 100 # 替换为实际网格宽度
- grid_height = 100 # 替换为实际网格高度
- if layer.featureCount() > 0:
- # 获取第一个要素
- feature = next(layer.getFeatures())
- geom = feature.geometry()
- # 获取要素的边界矩形(bounding box)
- bounds = geom.boundingBox()
- # 计算宽度和高度
- grid_width = bounds.width()
- grid_height = bounds.height()
- print(f"网格宽度:{grid_width}")
- print(f"网格高度:{grid_height}")
- else:
- print("图层没有任何要素!")
- return {
- "状态": "图层没有任何要素!"
- }
- # 为图层添加邻居字段
- layer.startEditing()
- for field in ["east", "west", "south", "north"]:
- if field not in [f.name() for f in layer.fields()]:
- layer.dataProvider().addAttributes([QgsField(field, QVariant.String)])
- layer.updateFields()
- # 创建空间索引
- spatial_index = QgsSpatialIndex(layer)
- # 设置误差值 过滤掉仅仅是边线重叠的数据
- tolerance = grid_width if grid_width < grid_height else grid_height
- tolerance = tolerance / 5
- print(f"网格边界容差:{tolerance}")
- # 遍历图层中的所有要素
- for feature in layer.getFeatures():
- geom = feature.geometry()
- extent = geom.boundingBox()
- # 获取网格宽度和高度
- width = grid_width
- height = grid_height
- # 构造东西南北方向的矩形
- west_extent = QgsRectangle(extent.xMinimum() - width + tolerance, extent.yMinimum() + tolerance,
- extent.xMinimum() - tolerance,
- extent.yMaximum() - tolerance)
- east_extent = QgsRectangle(extent.xMaximum() + tolerance, extent.yMinimum() + tolerance,
- extent.xMaximum() + width - tolerance,
- extent.yMaximum() - tolerance)
- south_extent = QgsRectangle(extent.xMinimum() + tolerance, extent.yMinimum() - height + tolerance,
- extent.xMaximum() - tolerance,
- extent.yMinimum() - tolerance)
- north_extent = QgsRectangle(extent.xMinimum() + tolerance, extent.yMaximum() + tolerance,
- extent.xMaximum() - tolerance,
- extent.yMaximum() + height - tolerance)
- # 查询每个方向是否有其他网格
- west_neighbors = spatial_index.intersects(west_extent)
- east_neighbors = spatial_index.intersects(east_extent)
- south_neighbors = spatial_index.intersects(south_extent)
- north_neighbors = spatial_index.intersects(north_extent)
- neighbor_geometries = {
- "north": self.cacl(north_neighbors),
- "south": self.cacl(south_neighbors),
- "west": self.cacl(west_neighbors),
- "east": self.cacl(east_neighbors)
- }
- for direction, value in neighbor_geometries.items():
- feature[direction] = value
- layer.updateFeature(feature)
- # 保存编辑
- layer.commitChanges()
- print("邻居计算完成!")
- return {
- "状态": "处理成功"
- }
|