def create_memory_layer(self, layer): """Create an in-memory copy of an existing vector layer.""" data_provider = layer.dataProvider() # create the layer path defining geometry type and reference system geometry_type = QGis.vectorGeometryType(layer.geometryType()) crs_id = layer.crs().authid() path = geometry_type + '?crs=' + crs_id + '&index=yes' # create the memory layer and get a reference to the data provider memory_layer = QgsVectorLayer(path, 'Cartogram', 'memory') memory_layer_data_provider = memory_layer.dataProvider() # copy all attributes from the source layer to the memory layer memory_layer.startEditing() memory_layer_data_provider.addAttributes( data_provider.fields().toList()) memory_layer.commitChanges() # copy all features from the source layer to the memory layer for feature in data_provider.getFeatures(): memory_layer_data_provider.addFeatures([feature]) return memory_layer
def action_triggered(self, *args): action = self.actiongroup.checkedAction() layer = self.activelayercombo.currentLayer() self.clear_line() if not action: return if not action == self.measureaction and ( not layer or not layer.type() == QgsMapLayer.VectorLayer): return color = self.current_action_color actiondata = {} if action == self.measureaction: self.measuredialog.show() actiondata['mode'] = self.mode geomtype = None layerid = None else: self.measuredialog.hide() geomtype = QGis.vectorGeometryType(layer.geometryType()) layerid = layer.id() data = dict(action=action.objectName(), layer=layerid, geom=geomtype, actiondata=actiondata, color=color) self.earthmine.updateAction(data)
def load_layer_features(self, point=None, layers=None): # TODO Move this logic into the viewer and let it track it's position if point is None and self.marker.map_pos is None: return if point is None: point = self.marker.map_pos area, units = self.distancearea() rect = search_area(units, area, point) if layers is None: layers = self.visible_layers() for layer in layers: transform = self.coordinatetransform(layer) # Transform the rect source = self.canvas.mapRenderer().destinationCrs() dest = layer.crs() recttransform = QgsCoordinateTransform(source, dest) rect = recttransform.transformBoundingBox(rect) features = list(get_features_in_area(layer, rect, transform, self.canvas.mapSettings())) geomtype = layer.geometryType() layerdata = dict(id=layer.id(), geomtype=QGis.vectorGeometryType(geomtype)) self.viewer.load_features(layerdata, features)
def action_triggered(self, *args): action = self.actiongroup.checkedAction() layer = self.activelayercombo.currentLayer() self.clear_line() if not action: return if not action == self.measureaction and (not layer or not layer.type() == QgsMapLayer.VectorLayer): return color = self.current_action_color actiondata = {} if action == self.measureaction: self.measuredialog.show() actiondata['mode'] = self.mode geomtype = None layerid = None else: self.measuredialog.hide() geomtype = QGis.vectorGeometryType(layer.geometryType()) layerid = layer.id() data = dict(action=action.objectName(), layer=layerid, geom=geomtype, actiondata=actiondata, color=color) self.earthmine.updateAction(data)
def load_layer_features(self, point=None, layers=None): # TODO Move this logic into the viewer and let it track it's position if point is None and self.marker.map_pos is None: return if point is None: point = self.marker.map_pos area, units = self.distancearea() rect = search_area(units, area, point) if layers is None: layers = self.visible_layers() for layer in layers: transform = self.coordinatetransform(layer) # Transform the rect source = self.canvas.mapRenderer().destinationCrs() dest = layer.crs() recttransform = QgsCoordinateTransform(source, dest) rect = recttransform.transformBoundingBox(rect) features = list( get_features_in_area(layer, rect, transform, self.canvas.mapSettings())) geomtype = layer.geometryType() layerdata = dict(id=layer.id(), geomtype=QGis.vectorGeometryType(geomtype)) self.viewer.load_features(layerdata, features)
def layer_feature_added(self, layer, featureid): if not self.viewer: return feature = layer.getFeatures(QgsFeatureRequest(featureid)).next() renderer = layer.rendererV2() transform = self.coordinatetransform(layer) featuredata = to_feature_data(layer.id(), feature, renderer, transform) geomtype = layer.geometryType() layerdata = dict(id=layer.id(), geomtype=QGis.vectorGeometryType(geomtype)) self.viewer.load_features(layerdata, featuredata)
def layer_feature_added(self, layer, featureid): if not self.viewer: return feature = layer.getFeatures(QgsFeatureRequest(featureid)).next() renderer = layer.rendererV2() transform = self.coordinatetransform(layer) featuredata = to_feature_data(layer.id(), feature, renderer, transform) geomtype = layer.geometryType() layerdata = dict(id=layer.id(), geomtype=QGis.vectorGeometryType(geomtype)) self.viewer.load_features(layerdata, featuredata)
def to_feature_data(layerid, feature, renderer, transform): """ Transform the feature into the data for the viewer to use. :param feature: QgsFeature :param renderer: :param transform: :return: """ def polylinenodes(polyline): nodes = [] for point in polyline: point = transform.transform( point, QgsCoordinateTransform.ReverseTransform) location = dict(lat=point.y(), lng=point.x()) nodes.append(location) return nodes geom = feature.geometry() geomtype = geom.type() featuredata = [] data = dict(id=feature.id(), layerid=layerid, color=get_color(renderer, feature), geomtype=QGis.vectorGeometryType(geomtype)) if geomtype == QGis.Point: geom = geom.asPoint() point = transform.transform(geom, QgsCoordinateTransform.ReverseTransform) try: z = feature['Z'] if not z: z = 0 except KeyError: z = 0 location = dict(lat=point.y(), lng=point.x(), z=z) data['nodes'] = [location] featuredata.append(data) elif geomtype == QGis.Line: if geom.isMultipart(): # Copy the data for each polyline for polyline in geom.asMultiPolyline(): newdata = copy.copy(data) newdata['nodes'] = polylinenodes(polyline) featuredata.append(newdata) else: data['nodes'] = polylinenodes(geom.asPolyline()) featuredata.append(data) return featuredata
def to_feature_data(layerid, feature, renderer, transform): """ Transform the feature into the data for the viewer to use. :param feature: QgsFeature :param renderer: :param transform: :return: """ def polylinenodes(polyline): nodes = [] for point in polyline: point = transform.transform(point, QgsCoordinateTransform.ReverseTransform) location = dict(lat=point.y(), lng=point.x()) nodes.append(location) return nodes geom = feature.geometry() geomtype = geom.type() featuredata = [] data = dict( id=feature.id(), layerid=layerid, color=get_color(renderer, feature), geomtype=QGis.vectorGeometryType(geomtype) ) if geomtype == QGis.Point: geom = geom.asPoint() point = transform.transform(geom, QgsCoordinateTransform.ReverseTransform) try: z = feature["Z"] if not z: z = 0 except KeyError: z = 0 location = dict(lat=point.y(), lng=point.x(), z=z) data["nodes"] = [location] featuredata.append(data) elif geomtype == QGis.Line: if geom.isMultipart(): # Copy the data for each polyline for polyline in geom.asMultiPolyline(): newdata = copy.copy(data) newdata["nodes"] = polylinenodes(polyline) featuredata.append(newdata) else: data["nodes"] = polylinenodes(geom.asPolyline()) featuredata.append(data) return featuredata