Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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