Exemplo n.º 1
0
    def test_issue_121(self):
        """Test that point symbol size can be set from style (issue 121).
        .. seealso:: https://github.com/AIFDR/inasafe/issues/121
        """
        layer, layer_type = load_layer('kecamatan_jakarta_osm_centroids.shp')
        del layer_type
        # Note the float quantity values below
        style_info = {'target_field': 'KEPADATAN', 'style_classes': [
            {'opacity': 1, 'max': 200, 'colour': '#fecc5c',
             'min': 45, 'label': 'Low', 'size': 1},
            {'opacity': 1, 'max': 350, 'colour': '#fd8d3c',
             'min': 201, 'label': 'Medium', 'size': 2},
            {'opacity': 1, 'max': 539, 'colour': '#f31a1c',
             'min': 351, 'label': 'High', 'size': 3}]}

        print 'Setting style with point sizes should work.'
        set_vector_graduated_style(layer, style_info)

        # Now validate the size values were set as expected

        # new symbology - subclass of QgsFeatureRendererV2 class
        renderer = layer.rendererV2()
        layer_type = renderer.type()
        assert layer_type == 'graduatedSymbol'
        size = 1
        for renderer_range in renderer.ranges():
            symbol = renderer_range.symbol()
            symbol_layer = symbol.symbolLayer(0)
            actual_size = symbol_layer.size()
            message = ((
                'Expected symbol layer 0 for range %s to have'
                ' a size of %s, got %s') %
                (size, size, actual_size))
            assert size == actual_size, message
            size += 1
Exemplo n.º 2
0
    def test_issue121(self):
        """Test that point symbol size can be set from style (issue 121).
        .. seealso:: https://github.com/AIFDR/inasafe/issues/121
        """
        myLayer, myType = load_layer('kecamatan_jakarta_osm_centroids.shp')
        del myType
        # Note the float quantity values below
        myStyleInfo = {'target_field': 'KEPADATAN', 'style_classes': [
            {'opacity': 1, 'max': 200, 'colour': '#fecc5c',
             'min': 45, 'label': 'Low', 'size': 1},
            {'opacity': 1, 'max': 350, 'colour': '#fd8d3c',
             'min': 201, 'label': 'Medium', 'size': 2},
            {'opacity': 1, 'max': 539, 'colour': '#f31a1c',
             'min': 351, 'label': 'High', 'size': 3}]}
        myMessage = 'Setting style with point sizes should work.'
        try:
            set_vector_graduated_style(myLayer, myStyleInfo)
        except:
            raise Exception(myMessage)
        # Now validate the size values were set as expected

        # new symbology - subclass of QgsFeatureRendererV2 class
        myRenderer = myLayer.rendererV2()
        myType = myRenderer.type()
        assert myType == 'graduatedSymbol'
        mySize = 1
        for myRange in myRenderer.ranges():
            mySymbol = myRange.symbol()
            mySymbolLayer = mySymbol.symbolLayer(0)
            myActualSize = mySymbolLayer.size()
            myMessage = (('Expected symbol layer 0 for range %s to have'
                          ' a size of %s, got %s') %
                          (mySize, mySize, myActualSize))
            assert mySize == myActualSize, myMessage
            mySize += 1
Exemplo n.º 3
0
    def test_issue121(self):
        """Test that point symbol size can be set from style (issue 121).
        .. seealso:: https://github.com/AIFDR/inasafe/issues/121
        """
        myLayer, myType = load_layer('kecamatan_jakarta_osm_centroids.shp')
        del myType
        # Note the float quantity values below
        myStyleInfo = {
            'target_field':
            'KEPADATAN',
            'style_classes': [{
                'opacity': 1,
                'max': 200,
                'colour': '#fecc5c',
                'min': 45,
                'label': 'Low',
                'size': 1
            }, {
                'opacity': 1,
                'max': 350,
                'colour': '#fd8d3c',
                'min': 201,
                'label': 'Medium',
                'size': 2
            }, {
                'opacity': 1,
                'max': 539,
                'colour': '#f31a1c',
                'min': 351,
                'label': 'High',
                'size': 3
            }]
        }
        myMessage = 'Setting style with point sizes should work.'
        try:
            set_vector_graduated_style(myLayer, myStyleInfo)
        except:
            raise Exception(myMessage)
        # Now validate the size values were set as expected

        if myLayer.isUsingRendererV2():
            # new symbology - subclass of QgsFeatureRendererV2 class
            myRenderer = myLayer.rendererV2()
            myType = myRenderer.type()
            assert myType == 'graduatedSymbol'
            mySize = 1
            for myRange in myRenderer.ranges():
                mySymbol = myRange.symbol()
                mySymbolLayer = mySymbol.symbolLayer(0)
                myActualSize = mySymbolLayer.size()
                myMessage = (('Expected symbol layer 0 for range %s to have'
                              ' a size of %s, got %s') %
                             (mySize, mySize, myActualSize))
                assert mySize == myActualSize, myMessage
                mySize += 1
Exemplo n.º 4
0
    def test_issue_121(self):
        """Test that point symbol size can be set from style (issue 121).
        .. seealso:: https://github.com/AIFDR/inasafe/issues/121
        """
        layer, layer_type = load_layer('kecamatan_jakarta_osm_centroids.shp')
        del layer_type
        # Note the float quantity values below
        style_info = {
            'target_field':
            'KEPADATAN',
            'style_classes': [{
                'opacity': 1,
                'max': 200,
                'colour': '#fecc5c',
                'min': 45,
                'label': 'Low',
                'size': 1
            }, {
                'opacity': 1,
                'max': 350,
                'colour': '#fd8d3c',
                'min': 201,
                'label': 'Medium',
                'size': 2
            }, {
                'opacity': 1,
                'max': 539,
                'colour': '#f31a1c',
                'min': 351,
                'label': 'High',
                'size': 3
            }]
        }

        print 'Setting style with point sizes should work.'
        set_vector_graduated_style(layer, style_info)

        # Now validate the size values were set as expected

        # new symbology - subclass of QgsFeatureRendererV2 class
        renderer = layer.rendererV2()
        layer_type = renderer.type()
        assert layer_type == 'graduatedSymbol'
        size = 1
        for renderer_range in renderer.ranges():
            symbol = renderer_range.symbol()
            symbol_layer = symbol.symbolLayer(0)
            actual_size = symbol_layer.size()
            message = (('Expected symbol layer 0 for range %s to have'
                        ' a size of %s, got %s') % (size, size, actual_size))
            assert size == actual_size, message
            size += 1
Exemplo n.º 5
0
 def test_issue230(self):
     """Verify that we give informative errors when style is not correct
        .. seealso:: https://github.com/AIFDR/inasafe/issues/230
     """
     myPath = test_data_path('impact')
     myVectorLayer, myType = load_layer('polygons_for_styling.shp', myPath)
     del myType
     myStyle = {'legend_title': u'Population Count',
                'target_field': 'population',
                'style_classes':
                [{'transparency': 0,
                  'min': [0],  # <-- intentionally broken list not number!
                  'max': 139904.08186340332,
                  'colour': '#FFFFFF',
                  'size': 1,
                  'label': u'Nil'},
                 {'transparency': 0,
                  'min': 139904.08186340332,
                  'max': 279808.16372680664,
                  'colour': '#38A800',
                  'size': 1,
                  'label': u'Low'},
                 {'transparency': 0,
                  'min': 279808.16372680664,
                  'max': 419712.24559020996,
                  'colour': '#79C900',
                  'size': 1,
                  'label': u'Low'},
                 {'transparency': 0,
                  'min': 419712.24559020996,
                  'max': 559616.32745361328,
                  'colour': '#CEED00',
                  'size': 1,
                  'label': u'Low'},
                 {'transparency': 0,
                  'min': 559616.32745361328,
                  'max': 699520.4093170166,
                  'colour': '#FFCC00',
                  'size': 1,
                  'label': u'Medium'},
                 {'transparency': 0,
                  'min': 699520.4093170166,
                  'max': 839424.49118041992,
                  'colour': '#FF6600',
                  'size': 1,
                  'label': u'Medium'},
                 {'transparency': 0,
                  'min': 839424.49118041992,
                  'max': 979328.57304382324,
                  'colour': '#FF0000',
                  'size': 1,
                  'label': u'Medium'},
                 {'transparency': 0,
                  'min': 979328.57304382324,
                  'max': 1119232.6549072266,
                  'colour': '#7A0000',
                  'size': 1,
                  'label': u'High'}]}
     try:
         set_vector_graduated_style(myVectorLayer, myStyle)
     except StyleError:
         # Exactly what should have happened
         return
     except Exception, e:
         print str(e)
Exemplo n.º 6
0
    def aggregate(self, theSafeImpactLayer):
        """Do any requested aggregation post processing.

        Performs Aggregation postprocessing step by

            * creating a copy of the dataset clipped by the impactlayer
              bounding box
            * stripping all attributes beside the aggregation attribute
            * delegating to the appropriate aggregator for raster and vectors

        :raises: ReadLayerError
        """

        if not self.isValid:
            raise InvalidAggregatorError

        myMessage = m.Message(
            m.Heading(self.tr('Aggregating results'), **PROGRESS_UPDATE_STYLE),
            m.Paragraph(self.tr(
                'This may take a little while - we are aggregating the impact'
                ' by %1').arg(self.layer.name())))
        self._sendMessage(myMessage)

        myQGISImpactLayer = safe_to_qgis_layer(theSafeImpactLayer)
        if not myQGISImpactLayer.isValid():
            myMessage = self.tr('Error when reading %1').arg(myQGISImpactLayer)
            # noinspection PyExceptionInherit
            raise ReadLayerError(myMessage)
        myLayerName = str(self.tr('%1 aggregated to %2').arg(
            myQGISImpactLayer.name()).arg(self.layer.name()))

        #delete unwanted fields
        myProvider = self.layer.dataProvider()
        myFields = myProvider.fields()

        #mark important attributes as needed
        self._setPersistantAttributes()
        myUnneededAttributes = []

        for i in myFields:
            if (myFields[i].name() not in
                    self.attributes.values()):
                myUnneededAttributes.append(i)
        LOGGER.debug('Removing this attributes: ' + str(myUnneededAttributes))
        # noinspection PyBroadException
        try:
            self.layer.startEditing()
            myProvider.deleteAttributes(myUnneededAttributes)
            self.layer.commitChanges()
        # FIXME (Ole): Disable pylint check for the moment
        # Need to work out what exceptions we will catch here, though.
        except:  # pylint: disable=W0702
            myMessage = self.tr('Could not remove the unneeded fields')
            LOGGER.debug(myMessage)

        del myUnneededAttributes, myProvider, myFields
        self.keywordIO.update_keywords(
            self.layer, {'title': myLayerName})

        self.statisticsType, self.statisticsClasses = (
            self.keywordIO.get_statistics(myQGISImpactLayer))

        #call the correct aggregator
        if myQGISImpactLayer.type() == QgsMapLayer.VectorLayer:
            self._aggregateVectorImpact(myQGISImpactLayer, theSafeImpactLayer)
        elif myQGISImpactLayer.type() == QgsMapLayer.RasterLayer:
            self._aggregateRasterImpact(myQGISImpactLayer)
        else:
            myMessage = self.tr('%1 is %2 but it should be either vector or '
                                'raster').\
                arg(myQGISImpactLayer.name()).arg(myQGISImpactLayer.type())
            # noinspection PyExceptionInherit
            raise ReadLayerError(myMessage)

        # show a styled aggregation layer
        if self.showIntermediateLayers:
            if self.statisticsType == 'sum':
                #style layer if we are summing
                myProvider = self.layer.dataProvider()
                myAttr = self._sumFieldName()
                myAttrIndex = myProvider.fieldNameIndex(myAttr)
                myProvider.select([myAttrIndex], QgsRectangle(), False)
                myFeature = QgsFeature()
                myHighestVal = 0

                while myProvider.nextFeature(myFeature):
                    myAttrMap = myFeature.attributeMap()
                    myVal, ok = myAttrMap[myAttrIndex].toInt()
                    if ok and myVal > myHighestVal:
                        myHighestVal = myVal

                myClasses = []
                myColors = ['#fecc5c', '#fd8d3c', '#f31a1c']
                myStep = int(myHighestVal / len(myColors))
                myCounter = 0
                for myColor in myColors:
                    myMin = myCounter
                    myCounter += myStep
                    myMax = myCounter

                    myClasses.append(
                        {'min': myMin,
                         'max': myMax,
                         'colour': myColor,
                         'transparency': 30,
                         'label': '%s - %s' % (myMin, myMax)})
                    myCounter += 1

                myStyle = {'target_field': myAttr,
                           'style_classes': myClasses}
                set_vector_graduated_style(self.layer, myStyle)
            else:
                #make style of layer pretty much invisible
                myProps = {'style': 'no',
                           'color_border': '0,0,0,127',
                           'width_border': '0.0'
                           }
                # noinspection PyCallByClass,PyTypeChecker,PyArgumentList
                mySymbol = QgsFillSymbolV2.createSimple(myProps)
                myRenderer = QgsSingleSymbolRendererV2(mySymbol)
                self.layer.setRendererV2(myRenderer)
                self.layer.saveDefaultStyle()