def do_operation(self): """ perform survey data loading """ # input/output data checking already done during property set survey = self.inputs[0].value project = self.inputs[2].value tmp_survey_file = '%ssurvey_%s.shp' % (self._tmp_dir, get_unique_filename()) # load survey try: self._loadSurvey(survey, tmp_survey_file, project) except Exception as err: remove_shapefile(tmp_survey_file) raise OperatorError("Error Loading Survey\n%s" % err, self.__class__) try: # store loaded data tmp_survey_layername = 'survey_%s' % get_unique_filename() tmp_survey_layer = load_shapefile_verify( tmp_survey_file, tmp_survey_layername, [self._lon_field, self._lat_field, self._tax_field]) except Exception as err: raise OperatorError("Error Loading Survey\n%s" % err, self.__class__) self.outputs[0].value = tmp_survey_layer self.outputs[1].value = tmp_survey_file
def do_operation(self): """ perform create mapping scheme operation """ # input/output verification already performed during set input/ouput zone_layer = self.inputs[0].value zone_field = self.inputs[1].value fp_layer = self.inputs[2].value # merge with zone to get assignment tmp_join = 'joined_%s' % get_unique_filename() tmp_join_file = '%s%s.shp' % (self._tmp_dir, tmp_join) analyzer = QgsOverlayAnalyzer() try: analyzer.intersection(fp_layer, zone_layer, tmp_join_file) tmp_join_layer = load_shapefile_verify(tmp_join_file, tmp_join,[zone_field]) except AssertionError as err: raise OperatorError(str(err), self.__class__) except Exception as err: raise OperatorError(str(err), self.__class__) fields = { 0 : QgsField(self._lon_field, QVariant.Double), 1 : QgsField(self._lat_field, QVariant.Double), 2 : QgsField(zone_field, QVariant.String), } zone_idx = layer_field_index(tmp_join_layer, zone_field) fp_layername = 'fpc_%s' % get_unique_filename() fp_file = '%s%s.shp' % (self._tmp_dir, fp_layername) try: writer = QgsVectorFileWriter(fp_file, "utf-8", fields, QGis.WKBPoint, self._crs, "ESRI Shapefile") f = QgsFeature() for _f in layer_features(tmp_join_layer): centroid = _f.geometry().centroid().asPoint() lon = centroid.x() lat = centroid.y() zone_str = str(_f.attributeMap()[zone_idx].toString()).upper() f.setGeometry(QgsGeometry.fromPoint(QgsPoint(lon, lat))) f.addAttribute(0, QVariant(lon)) f.addAttribute(1, QVariant(lat)) f.addAttribute(2, QVariant(zone_str)) writer.addFeature(f) del writer except Exception as err: logAPICall.log(err, logAPICall.ERROR) remove_shapefile(fp_file) raise OperatorError("error creating joined grid: %s" % err, self.__class__) # load shapefile as layer fp_layer = load_shapefile(fp_file, fp_layername) if not fp_layer: raise OperatorError('Error loading footprint centroid file' % (fp_file), self.__class__) # clean up del tmp_join_layer remove_shapefile(tmp_join_file) self.outputs[0].value = fp_layer self.outputs[1].value = fp_file
def do_operation(self): """ perform survey data loading """ # input/output data checking already done during property set survey = self.inputs[0].value project = self.inputs[2].value tmp_survey_file = "%ssurvey_%s.shp" % (self._tmp_dir, get_unique_filename()) # load survey try: self._loadSurvey(survey, tmp_survey_file, project) except Exception as err: remove_shapefile(tmp_survey_file) raise OperatorError("Error Loading Survey\n%s" % err, self.__class__) try: # store loaded data tmp_survey_layername = "survey_%s" % get_unique_filename() tmp_survey_layer = load_shapefile_verify( tmp_survey_file, tmp_survey_layername, [self._lon_field, self._lat_field, self._tax_field] ) except Exception as err: raise OperatorError("Error Loading Survey\n%s" % err, self.__class__) self.outputs[0].value = tmp_survey_layer self.outputs[1].value = tmp_survey_file
def do_operation(self): """ perform create mapping scheme operation """ # input/output verification already performed during set input/ouput zone_layer = self.inputs[0].value zone_field = self.inputs[1].value count_field = self.inputs[2].value grid_layer = self.inputs[3].value zone_stats = {} zone_count_stats = {} gid_idx = layer_field_index(zone_layer, self._gid_field) count_idx = layer_field_index(zone_layer, count_field) for _f in layer_features(zone_layer): gid = _f.attributeMap()[gid_idx].toString() zone_stats[gid] = 0 zone_count_stats[gid] = _f.attributeMap()[count_idx].toDouble()[0] # create storage for temporary output data use_grid_db = grid_layer.dataProvider().featureCount( ) > MAX_FEATURES_IN_MEMORY if False: tmp_grid_db_file = '%sdb_%s.db' % (self._tmp_dir, get_unique_filename()) grid_points = bsddb.btopen(tmp_grid_db_file, 'c') else: grid_points = {} # merge to create stats tmp_join = 'joined_%s' % get_unique_filename() tmp_join_file = '%s%s.shp' % (self._tmp_dir, tmp_join) analyzer = QgsOverlayAnalyzer() try: analyzer.intersection(grid_layer, zone_layer, tmp_join_file) tmp_join_layer = load_shapefile_verify(tmp_join_file, tmp_join, [zone_field, count_field]) except AssertionError as err: raise OperatorError(str(err), self.__class__) except Exception as err: raise OperatorError(str(err), self.__class__) stats = layer_multifields_stats(tmp_join_layer, [zone_field, count_field]) if stats == False: raise OperatorError( "error creating statistic based on input files", self.__class__) zone_idx = layer_field_index(tmp_join_layer, zone_field) count_idx = layer_field_index(tmp_join_layer, count_field) lon_idx = layer_field_index(tmp_join_layer, self._lon_field) lat_idx = layer_field_index(tmp_join_layer, self._lat_field) gid_idx = layer_field_index(tmp_join_layer, self._gid_field) try: for _f in layer_features(tmp_join_layer): lon = _f.attributeMap()[lon_idx].toDouble()[0] lat = _f.attributeMap()[lat_idx].toDouble()[0] zone_str = str(_f.attributeMap()[zone_idx].toString()).upper() count_val = _f.attributeMap()[count_idx].toDouble()[0] gid = _f.attributeMap()[gid_idx].toString() # update stats zone_stats[gid] += 1 grid_points[self._make_key(zone_str, gid, lon, lat)] = 1 except Exception as err: raise OperatorError("error processing joined layer: " % err, self.__class__) # test for zones without a grid point assigned count_idx = layer_field_index(zone_layer, count_field) gid_idx = layer_field_index(zone_layer, self._gid_field) zone_idx = layer_field_index(zone_layer, zone_field) _x_off, _y_off = self._x_off / 2.0, self._y_off / 2.0 try: for _f in layer_features(zone_layer): centroid = _f.geometry().centroid().asPoint() zone_str = str(_f.attributeMap()[zone_idx].toString()).upper() count_val = _f.attributeMap()[count_idx].toDouble()[0] gid = _f.attributeMap()[gid_idx].toString() if zone_stats[gid] == 0: # get lower left corner lon = int(centroid.x() / DEFAULT_GRID_SIZE) * self._x_off + _x_off lat = int( centroid.y() / self._y_off) * self._y_off + _y_off #self._write_feature(writer, f, lon, lat, zone_str, count_val) zone_stats[gid] += 1 grid_points[self._make_key(zone_str, gid, lon, lat)] = 1 except Exception as err: raise OperatorError("error processing missing points: " % err, self.__class__) # output result fields = { 0: QgsField(self._lon_field, QVariant.Double), 1: QgsField(self._lat_field, QVariant.Double), 2: QgsField(zone_field, QVariant.String), 3: QgsField(count_field, QVariant.Double) } grid_layername = 'grid_%s' % (get_unique_filename()) grid_file = '%s%s.shp' % (self._tmp_dir, grid_layername) try: f = QgsFeature() writer = QgsVectorFileWriter(grid_file, "utf-8", fields, QGis.WKBPoint, self._crs, "ESRI Shapefile") for key, value in grid_points.iteritems(): [zone, zone_gid, lon, lat] = self._parse_key(key) f.setGeometry(QgsGeometry.fromPoint(QgsPoint(lon, lat))) """ f.setGeometry(QgsGeometry.fromPoint(QgsPoint(lon, lat))) f.addAttribute(0, QVariant(lon)) f.addAttribute(1, QVariant(lat)) f.addAttribute(2, QVariant(zone_str)) f.addAttribute(3, QVariant(count_val / total_features)) writer.addFeature(f) """ value = float( value) / zone_stats[zone_gid] * zone_count_stats[zone_gid] #grid_points[key] = value self._write_feature(writer, f, lon, lat, zone, value) del writer except Exception as err: raise OperatorError("error creating joined grid file: " % err, self.__class__) # load result layer grid_layer = load_shapefile(grid_file, grid_layername) if not grid_layer: raise OperatorError('Error loading joined grid file' % (grid_file), self.__class__) # clean up del tmp_join_layer remove_shapefile(tmp_join_file) self.outputs[0].value = grid_layer self.outputs[1].value = grid_file
def do_operation(self): """ perform create mapping scheme operation """ # input/output verification already performed during set input/ouput zone_layer = self.inputs[0].value zone_field = self.inputs[1].value fp_layer = self.inputs[2].value # merge with zone to get assignment tmp_join = 'joined_%s' % get_unique_filename() tmp_join_file = '%s%s.shp' % (self._tmp_dir, tmp_join) analyzer = QgsOverlayAnalyzer() try: analyzer.intersection(fp_layer, zone_layer, tmp_join_file) tmp_join_layer = load_shapefile_verify(tmp_join_file, tmp_join, [zone_field]) except AssertionError as err: raise OperatorError(str(err), self.__class__) except Exception as err: raise OperatorError(str(err), self.__class__) fields = { 0: QgsField(self._lon_field, QVariant.Double), 1: QgsField(self._lat_field, QVariant.Double), 2: QgsField(zone_field, QVariant.String), } zone_idx = layer_field_index(tmp_join_layer, zone_field) fp_layername = 'fpc_%s' % get_unique_filename() fp_file = '%s%s.shp' % (self._tmp_dir, fp_layername) try: writer = QgsVectorFileWriter(fp_file, "utf-8", fields, QGis.WKBPoint, self._crs, "ESRI Shapefile") f = QgsFeature() for _f in layer_features(tmp_join_layer): centroid = _f.geometry().centroid().asPoint() lon = centroid.x() lat = centroid.y() zone_str = str(_f.attributeMap()[zone_idx].toString()).upper() f.setGeometry(QgsGeometry.fromPoint(QgsPoint(lon, lat))) f.addAttribute(0, QVariant(lon)) f.addAttribute(1, QVariant(lat)) f.addAttribute(2, QVariant(zone_str)) writer.addFeature(f) del writer except Exception as err: logAPICall.log(err, logAPICall.ERROR) remove_shapefile(fp_file) raise OperatorError("error creating joined grid: %s" % err, self.__class__) # load shapefile as layer fp_layer = load_shapefile(fp_file, fp_layername) if not fp_layer: raise OperatorError( 'Error loading footprint centroid file' % (fp_file), self.__class__) # clean up del tmp_join_layer remove_shapefile(tmp_join_file) self.outputs[0].value = fp_layer self.outputs[1].value = fp_file
def do_operation(self): """ perform footprint load operation """ # input/output data checking already done during property set # load and verify popgrid_file = self.inputs[0].value pop_field = self.inputs[1].value popgrid_layername = 'zone_%s' % get_unique_filename() try: tmp_popgrid_layer = load_shapefile_verify(popgrid_file, popgrid_layername, [pop_field]) except AssertionError as err: raise OperatorError(str(err), self.__class__) logAPICall.log('tmp_fp_layer.crs().epsg() %s ' % tmp_popgrid_layer.crs().epsg(), logAPICall.DEBUG) if tmp_popgrid_layer.crs().epsg() != self._crs.epsg(): transform = QgsCoordinateTransform(tmp_popgrid_layer.crs(), self._crs) transform_required = True else: transform_required = False # output grid fields = { 0 : QgsField(GID_FIELD_NAME, QVariant.Int), 1 : QgsField(CNT_FIELD_NAME, QVariant.Double), } pop_idx = layer_field_index(tmp_popgrid_layer, pop_field) output_file = '%spop_grid_%s.shp' % (self._tmp_dir, get_unique_filename()) logAPICall.log('create outputfile %s ... ' % output_file, logAPICall.DEBUG) try: writer = QgsVectorFileWriter(output_file, "utf-8", fields, QGis.WKBPoint, self._crs, "ESRI Shapefile") f = QgsFeature() gid = 0 for _f in layer_features(tmp_popgrid_layer): # NOTE: geom.transform does projection in place to underlying C object # 1. get geometry geom = _f.geometry() # 2. change project if required if transform_required: geom = transform.transform(geom) # 3. write to file gid += 1 f.setGeometry(geom) f.addAttribute(0, QVariant(gid)) f.addAttribute(1, _f.attributeMap()[pop_idx]) writer.addFeature(f) del writer, f except Exception as err: remove_shapefile(output_file) raise OperatorError("error creating footprint centroids: %s" % err, self.__class__) popgrid_layername = 'popgrid_%s' % get_unique_filename() popgrid_layer = load_shapefile(output_file, popgrid_layername) if not popgrid_layer: raise OperatorError('Error loading footprint centroid file' % (output_file), self.__class__) # clean up del tmp_popgrid_layer # store data in output self.outputs[0].value = popgrid_layer self.outputs[1].value = output_file
def do_operation(self): """ perform create mapping scheme operation """ # input/output verification already performed during set input/ouput zone_layer = self.inputs[0].value zone_field = self.inputs[1].value count_field = self.inputs[2].value grid_layer = self.inputs[3].value zone_stats = {} zone_count_stats = {} gid_idx = layer_field_index(zone_layer, self._gid_field) count_idx = layer_field_index(zone_layer, count_field) for _f in layer_features(zone_layer): gid = _f.attributeMap()[gid_idx].toString() zone_stats[gid] = 0 zone_count_stats[gid] = _f.attributeMap()[count_idx].toDouble()[0] # create storage for temporary output data use_grid_db = grid_layer.dataProvider().featureCount() > MAX_FEATURES_IN_MEMORY if False: tmp_grid_db_file = '%sdb_%s.db' % (self._tmp_dir, get_unique_filename()) grid_points = bsddb.btopen(tmp_grid_db_file, 'c') else: grid_points = {} # merge to create stats tmp_join = 'joined_%s' % get_unique_filename() tmp_join_file = '%s%s.shp' % (self._tmp_dir, tmp_join) analyzer = QgsOverlayAnalyzer() try: analyzer.intersection(grid_layer, zone_layer, tmp_join_file) tmp_join_layer = load_shapefile_verify(tmp_join_file, tmp_join,[zone_field, count_field]) except AssertionError as err: raise OperatorError(str(err), self.__class__) except Exception as err: raise OperatorError(str(err), self.__class__) stats = layer_multifields_stats(tmp_join_layer, [zone_field, count_field]) if stats == False: raise OperatorError("error creating statistic based on input files", self.__class__) zone_idx = layer_field_index(tmp_join_layer, zone_field) count_idx = layer_field_index(tmp_join_layer, count_field) lon_idx = layer_field_index(tmp_join_layer, self._lon_field) lat_idx = layer_field_index(tmp_join_layer, self._lat_field) gid_idx = layer_field_index(tmp_join_layer, self._gid_field) try: for _f in layer_features(tmp_join_layer): lon = _f.attributeMap()[lon_idx].toDouble()[0] lat = _f.attributeMap()[lat_idx].toDouble()[0] zone_str = str(_f.attributeMap()[zone_idx].toString()).upper() count_val = _f.attributeMap()[count_idx].toDouble()[0] gid = _f.attributeMap()[gid_idx].toString() # update stats zone_stats[gid] += 1 grid_points[self._make_key(zone_str, gid, lon, lat)] = 1 except Exception as err: raise OperatorError("error processing joined layer: " % err, self.__class__) # test for zones without a grid point assigned count_idx = layer_field_index(zone_layer, count_field) gid_idx = layer_field_index(zone_layer, self._gid_field) zone_idx = layer_field_index(zone_layer, zone_field) _x_off, _y_off = self._x_off / 2.0, self._y_off / 2.0 try: for _f in layer_features(zone_layer): centroid = _f.geometry().centroid().asPoint() zone_str = str(_f.attributeMap()[zone_idx].toString()).upper() count_val = _f.attributeMap()[count_idx].toDouble()[0] gid = _f.attributeMap()[gid_idx].toString() if zone_stats[gid] == 0: # get lower left corner lon = int(centroid.x()/DEFAULT_GRID_SIZE)*self._x_off + _x_off lat = int(centroid.y()/self._y_off)*self._y_off + _y_off #self._write_feature(writer, f, lon, lat, zone_str, count_val) zone_stats[gid] += 1 grid_points[self._make_key(zone_str, gid, lon, lat)] = 1 except Exception as err: raise OperatorError("error processing missing points: " % err, self.__class__) # output result fields = { 0 : QgsField(self._lon_field, QVariant.Double), 1 : QgsField(self._lat_field, QVariant.Double), 2 : QgsField(zone_field, QVariant.String), 3 : QgsField(count_field, QVariant.Double) } grid_layername = 'grid_%s' % (get_unique_filename()) grid_file = '%s%s.shp' % (self._tmp_dir, grid_layername) try: f = QgsFeature() writer = QgsVectorFileWriter(grid_file, "utf-8", fields, QGis.WKBPoint, self._crs, "ESRI Shapefile") for key, value in grid_points.iteritems(): [zone, zone_gid, lon, lat] = self._parse_key(key) f.setGeometry(QgsGeometry.fromPoint(QgsPoint(lon, lat))) """ f.setGeometry(QgsGeometry.fromPoint(QgsPoint(lon, lat))) f.addAttribute(0, QVariant(lon)) f.addAttribute(1, QVariant(lat)) f.addAttribute(2, QVariant(zone_str)) f.addAttribute(3, QVariant(count_val / total_features)) writer.addFeature(f) """ value = float(value) / zone_stats[zone_gid] * zone_count_stats[zone_gid] #grid_points[key] = value self._write_feature(writer, f, lon, lat, zone, value) del writer except Exception as err: raise OperatorError("error creating joined grid file: " % err, self.__class__) # load result layer grid_layer = load_shapefile(grid_file, grid_layername) if not grid_layer: raise OperatorError('Error loading joined grid file' % (grid_file), self.__class__) # clean up del tmp_join_layer remove_shapefile(tmp_join_file) self.outputs[0].value = grid_layer self.outputs[1].value = grid_file
def do_operation(self): """ perform footprint load operation """ # input/output data checking already done during property set # load and verify popgrid_file = self.inputs[0].value pop_field = self.inputs[1].value popgrid_layername = 'zone_%s' % get_unique_filename() try: tmp_popgrid_layer = load_shapefile_verify(popgrid_file, popgrid_layername, [pop_field]) except AssertionError as err: raise OperatorError(str(err), self.__class__) logAPICall.log( 'tmp_fp_layer.crs().epsg() %s ' % tmp_popgrid_layer.crs().epsg(), logAPICall.DEBUG) if tmp_popgrid_layer.crs().epsg() != self._crs.epsg(): transform = QgsCoordinateTransform(tmp_popgrid_layer.crs(), self._crs) transform_required = True else: transform_required = False # output grid fields = { 0: QgsField(GID_FIELD_NAME, QVariant.Int), 1: QgsField(CNT_FIELD_NAME, QVariant.Double), } pop_idx = layer_field_index(tmp_popgrid_layer, pop_field) output_file = '%spop_grid_%s.shp' % (self._tmp_dir, get_unique_filename()) logAPICall.log('create outputfile %s ... ' % output_file, logAPICall.DEBUG) try: writer = QgsVectorFileWriter(output_file, "utf-8", fields, QGis.WKBPoint, self._crs, "ESRI Shapefile") f = QgsFeature() gid = 0 for _f in layer_features(tmp_popgrid_layer): # NOTE: geom.transform does projection in place to underlying C object # 1. get geometry geom = _f.geometry() # 2. change project if required if transform_required: geom = transform.transform(geom) # 3. write to file gid += 1 f.setGeometry(geom) f.addAttribute(0, QVariant(gid)) f.addAttribute(1, _f.attributeMap()[pop_idx]) writer.addFeature(f) del writer, f except Exception as err: remove_shapefile(output_file) raise OperatorError("error creating footprint centroids: %s" % err, self.__class__) popgrid_layername = 'popgrid_%s' % get_unique_filename() popgrid_layer = load_shapefile(output_file, popgrid_layername) if not popgrid_layer: raise OperatorError( 'Error loading footprint centroid file' % (output_file), self.__class__) # clean up del tmp_popgrid_layer # store data in output self.outputs[0].value = popgrid_layer self.outputs[1].value = output_file