def join_field2(dest_layer, source_layer, target_field_name, join_field_name, field_names_subset, prefix = ""): fields = [] target_attrs = [f.name() for f in dest_layer.pendingFields()] for attr in field_names_subset: field = source_layer.pendingFields().field(attr) field.setName(prefix + attr) if field.name() not in target_attrs: if field.length() > 254: field.setLength(254) fields.append(field) dest_layer.writer.addAttributes(fields) dest_layer.updateFields() source_values = {} for feature in source_layer.getFeatures(): source_values[feature[join_field_name]] = \ {attr: feature[attr] for attr in field_names_subset} chunk_size = 512 to_change = {} progress = ProgressBar(dest_layer.featureCount()) for feature in dest_layer.getFeatures(): attrs = {} for attr in field_names_subset: fieldId = feature.fieldNameIndex(prefix + attr) value = None if feature[target_field_name] in source_values: value = source_values[feature[target_field_name]][attr] attrs[fieldId] = value to_change[feature.id()] = attrs progress.update() if len(to_change) == chunk_size: dest_layer.writer.changeAttributeValues(to_change) to_change = {} if len(to_change) > 0: dest_layer.writer.changeAttributeValues(to_change)
def _test_reproject2(self): """Less memory usage than reproject1 but slower""" target_crs = QgsCoordinateReferenceSystem(4326) crs_transform = QgsCoordinateTransform(self.obj2.crs(), target_crs) chunk_size = 512 to_add = [] to_clean = [] progress = ProgressBar(self.obj2.featureCount()) for feature in self.obj2.getFeatures(): geom = feature.geometry() geom.transform(crs_transform) out_feat = QgsFeature() out_feat.setGeometry(geom) out_feat.setAttributes(feature.attributes()) to_add.append(out_feat) to_clean.append(feature.id()) progress.update() if len(to_add) == chunk_size: self.obj2.deleteFeatures(to_clean) self.obj2.writer.addFeatures(to_add) to_add = [] to_clean = [] if len(to_add) > 0: self.obj2.deleteFeatures(to_clean) self.obj2.writer.addFeatures(to_add) self.obj2.setCrs(target_crs) self.obj2.updateExtents()
def test_update0(self, mock_sys): pb = ProgressBar(0) progress = random.randint(0, 99999) pb.update(progress) self.assertTrue(mock_sys.stdout.write.called) output = mock_sys.stdout.write.call_args_list[0][0][0] self.assertEquals( output.split(': ')[1], '%.1fK\r' % (progress / 1024.0))
def test_update100(self, mock_sys): pb = ProgressBar(1000) pb.update(1100) self.assertEquals(pb.progress, 1000) self.assertTrue(mock_sys.stdout.write.called) output = mock_sys.stdout.write.call_args_list[0][0][0] self.assertEquals(output.count('#'), pb.bar_len) self.assertEquals(output.count('-'), 0)
def test_update(self, mock_sys): pb = ProgressBar(1000) progress = random.randint(0, 9) pb.update(100 * progress) self.assertEquals(pb.progress, 100 * progress) self.assertTrue(mock_sys.stdout.write.called) output = mock_sys.stdout.write.call_args_list[0][0][0] self.assertEquals(output.count('#'), int(pb.bar_len * progress / 10.0)) self.assertEquals(output.count('-'), int(pb.bar_len * (10 - progress) / 10.0))
def _test_append1(self): layer = self.building_gml self.obj.setCrs(layer.crs()) to_add = [] progress = ProgressBar(layer.featureCount()) for feature in layer.getFeatures(): to_add.append(self.obj.copy_feature(feature)) progress.update() if to_add: self.obj.writer.addFeatures(to_add) assert self.obj.featureCount() == self.building_gml.featureCount()
def test_append(self): layer = self.address_gml self.obj.setCrs(layer.crs()) chunk_size = 512 to_add = [] progress = ProgressBar(layer.featureCount()) for feature in layer.getFeatures(): to_add.append(self.obj.copy_feature(feature)) progress.update() if len(to_add) == chunk_size: self.obj.writer.addFeatures(to_add) to_add = [] if len(to_add) > 0: self.obj.writer.addFeatures(to_add) assert self.obj.featureCount() == layer.featureCount()
def test_append2(self): """As fast as append but with much less memory usage""" layer = self.building_gml self.obj2.setCrs(layer.crs()) chunk_size = 512 to_add = [] progress = ProgressBar(layer.featureCount()) for feature in layer.getFeatures(): to_add.append(self.obj2.copy_feature(feature)) progress.update() if len(to_add) == chunk_size: self.obj2.writer.addFeatures(to_add) to_add = [] if len(to_add) > 0: self.obj2.writer.addFeatures(to_add) assert self.obj2.featureCount() == self.building_gml.featureCount()
def test_reproject3(self): target_crs = QgsCoordinateReferenceSystem(4326) crs_transform = QgsCoordinateTransform(self.obj2.crs(), target_crs) chunk_size = 512 to_change = {} progress = ProgressBar(self.obj2.featureCount()) for feature in self.obj2.getFeatures(): geom = QgsGeometry(feature.geometry()) geom.transform(crs_transform) to_change[feature.id()] = geom progress.update() if len(to_change) == chunk_size: self.obj2.writer.changeGeometryValues(to_change) to_change = {} if len(to_change) > 0: self.obj2.writer.changeGeometryValues(to_change) self.obj2.setCrs(target_crs) self.obj2.updateExtents()
def _test_reproject1(self): target_crs = QgsCoordinateReferenceSystem(4326) crs_transform = QgsCoordinateTransform(self.obj2.crs(), target_crs) to_add = [] to_clean = [] progress = ProgressBar(self.obj2.featureCount()) for feature in self.obj2.getFeatures(): geom = feature.geometry() geom.transform(crs_transform) out_feat = QgsFeature() out_feat.setGeometry(geom) out_feat.setAttributes(feature.attributes()) to_add.append(out_feat) to_clean.append(feature.id()) progress.update() self.obj2.deleteFeatures(to_clean) self.obj2.writer.addFeatures(to_add) self.obj2.setCrs(target_crs) self.obj2.updateExtents()
def test_init(self): p = ProgressBar(1000) self.assertEquals(p.total, 1000) self.assertEquals(p.progress, 0)