コード例 #1
0
    def test_identify_features_river_test(self):
        """Test for identify_features on the River_Test dataset."""
        sungai_layer = get_temp_shapefile_layer(
            RIVER_TEST_SHP, 'River_Test')
        _, output_layer = identify_features(
            sungai_layer, 1, console_progress_callback)

        num_sinks = 0
        num_wells = 0
        num_unseparated = 0
        wells = []
        for feature in output_layer.getFeatures():
            point = feature.geometry().asPoint().toString(17)
            result = [feature.geometry().asPoint(), feature.attributes()[3]]
            message = '%s is not found %s' % (point, feature.id())
            # self.assertIn(result, expected_result, message)
            if result[1] == 'Sink':
                num_sinks += 1
            if result[1] == 'Well':
                num_wells += 1
                wells.append(point)
            if result[1] == 'Unseparated':
                num_unseparated += 1

        message = ('There should be %s sinks, but I got %s' % (10, num_sinks))
        self.assertEqual(10, num_sinks, message)

        message = ('There should be %s wells, but I got %s' % (15, num_wells))
        self.assertEqual(16, num_wells, message)

        message = ('There should be %s unseparated, but I got %s' % (
            5, num_unseparated))
        self.assertEqual(4, num_unseparated, message)

        message = ('There should be %s features, but I got %s' %
                   (119, output_layer.featureCount()))
        self.assertEqual(119, output_layer.featureCount(), message)

        remove_temp_layer(sungai_layer.source())
コード例 #2
0
    def test_identify_features_sungai_baru(self):
        """Test for identify_features on the sungai baru dataset."""
        sungai_layer = get_temp_shapefile_layer(
            SUNGAI_BARU_SHP, 'sungai_baru')
        _, output_layer = identify_features(
            sungai_layer, 1, console_progress_callback)

        features_count = output_layer.featureCount()
        expected_result = [
            [QgsPoint(4505079.78066084068268538, 5820617.32926965225487947),
             'Watershed'],
            [QgsPoint(4505796.71872960310429335, 5819594.76427788194268942),
             'Unseparated'],
            [QgsPoint(4505201.38892469275742769, 5818932.09107278566807508),
             'Unclear Bifurcation'],
            [QgsPoint(4505994.16670085769146681, 5818944.59937320277094841),
             'Confluence'],
            [QgsPoint(4505423.69021992385387421, 5819349.8841874785721302),
             'Pseudo node'],
            [QgsPoint(4504424.25703522842377424, 5819771.00726572517305613),
             'Branch'],
            [QgsPoint(4504424.25681891199201345, 5821004.36726346984505653),
             'Well'],
            [QgsPoint(4506321.54563129413872957, 5820690.89381018560379744),
             'Sink'],
            [QgsPoint(4505706.96817480307072401, 5820597.46010562963783741),
             'Self Intersection'],
            [QgsPoint(4504954.79498676210641861, 5819664.31516459211707115),
             'Intersection'],
            [QgsPoint(4504516.27684732060879469, 5820388.85559526737779379),
             'Segment Center'],
            [QgsPoint(4505459.87090463936328888, 5820124.74861902091652155),
             'Segment Center'],
            [QgsPoint(4505597.77781277894973755, 5818938.34522299282252789),
             'Segment Center'],
            [QgsPoint(4505298.45680753327906132, 5818640.22502889111638069),
             'Segment Center'],
            [QgsPoint(4505874.24493211694061756, 5818746.94614691846072674),
             'Segment Center'],
            [QgsPoint(4505905.3135033342987299, 5820416.27267749048769474),
             'Segment Center'],
            [QgsPoint(4504960.94927519094198942, 5819710.47232702653855085),
             'Segment Center'],
            [QgsPoint(4506065.1831744248047471, 5819712.94692023564130068),
             'Segment Center'],
            [QgsPoint(4504974.16828893031924963, 5819660.41915996465831995),
             'Segment Center'],
            [QgsPoint(4504515.96725786849856377, 5819123.59523478243499994),
             'Segment Center'],
            [QgsPoint(4505754.27464655786752701, 5818549.32406418491154909),
             'Sink']
        ]

        for feature in output_layer.getFeatures():
            point = feature.geometry().asPoint().toString(17)
            result = [feature.geometry().asPoint(), feature.attributes()[3]]
            message = '%s is not found %s' % (point, feature.id())
            self.assertIn(result, expected_result, message)

        message = ('There should be %s features, but I got %s' %
                   (len(expected_result), features_count))
        self.assertEqual(features_count, len(expected_result), message)

        remove_temp_layer(sungai_layer.source())
コード例 #3
0
    def test_identify_features_dgn(self):
        """Test for identify_features on the dgn test dataset."""
        layer = get_temp_shapefile_layer(DGN_SHP, 'dgn_lines')
        _, output_layer = identify_features(
            layer, THRESHOLD, callback=console_progress_callback)
        num_wells = 0
        num_sinks = 0
        num_branches = 0
        num_confluences = 0
        num_pseudo_nodes = 0
        num_watersheds = 0
        num_self_intersections = 0
        num_segment_center = 0
        num_intersections = 0
        num_unseparated = 0
        for f in output_layer.getFeatures():
            node_type = f.attributes()[3]
            if node_type == 'Well':
                num_wells += 1
            if node_type == 'Sink':
                num_sinks += 1
            if node_type == 'Branch':
                num_branches += 1
            if node_type == 'Confluence':
                num_confluences += 1
            if node_type == 'Pseudo node':
                num_pseudo_nodes += 1
            if node_type == 'Watershed':
                num_watersheds += 1
            if node_type == 'Self Intersection':
                num_self_intersections += 1
            if node_type == 'Segment Center':
                num_segment_center += 1
            if node_type == 'Intersection':
                num_intersections += 1
            if node_type == 'Unseparated':
                num_unseparated += 1

        print 'wells', num_wells
        print 'sinks', num_sinks
        print 'branches', num_branches
        print 'confluences', num_confluences
        print 'pseudo nodes', num_pseudo_nodes
        print 'watersheds', num_watersheds
        print 'self intersections', num_self_intersections
        print 'segment center', num_segment_center
        print 'unseparated', num_unseparated

        feature_count = output_layer.featureCount()
        message = (
            'There should be 24005 features, but I got %s' % feature_count)
        self.assertEqual(feature_count, 24005, message)

        message = (
            'There should be 12 intersections / kreuzung, but I got %s' % i)
        self.assertEqual(num_intersections, 12, message)

        message = 'There should be 1893 pseudo node, but I got %s' % i
        self.assertEqual(num_pseudo_nodes, 1893, message)

        message = 'There should be 847 wells / quelle, but I got %s' % i
        self.assertEqual(num_wells, 847, message)

        message = 'There should be 125 sinks / senke, but I got %s' % i
        self.assertEqual(num_sinks, 125, message)

        message = (
            'There should be 186 branches / verzweigung, but I got %s' % i)
        self.assertEqual(num_branches, 186, message)

        message = (
            'There should be 867 confluences / Zusammenfluss, but I '
            'got %s' % i)
        self.assertEqual(num_confluences, 867, message)

        remove_temp_layer(layer.source())
コード例 #4
0
    def run(self):
        """Run method that performs all the real work."""
        message_bar = self.iface.messageBar().createMessage(
            self.tr('Extracting stream features'),
            self.tr('Please stand by while calculation is in progress.'),
            self.iface.mainWindow())

        progress_bar = QProgressBar()
        progress_bar.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
        # Need to implement a separate worker thread if we want cancel
        #cancel_button = QPushButton()
        #cancel_button.setText(self.tr('Cancel'))
        #cancel_button.clicked.connect(worker.kill)
        message_bar.layout().addWidget(progress_bar)
        #message_bar.layout().addWidget(cancel_button)
        self.iface.messageBar().pushWidget(
            message_bar, self.iface.messageBar().INFO)
        self.message_bar = message_bar

        def progress_callback(current, maximum, message=None):
            """GUI based callback implementation for showing progress.

            :param current: Current progress.
            :type current: int

            :param maximum: Maximum range (point at which task is complete.
            :type maximum: int

            :param message: Optional message to display in the progress bar
            :type message: str, QString
            """
            if message is not None:
                message_bar.setText(message)
            if progress_bar is not None:
                progress_bar.setMaximum(maximum)
                progress_bar.setValue(current)

        settings = QSettings()
        distance = settings.value(
            'stream-feature-extractor/search-distance', 0, type=float)
        load_intermediate_layer = settings.value(
            'stream-feature-extractor/load-intermediate-layer',
            False,
            type=bool)
        # noinspection PyBroadException
        try:
            intermediate_layer, nodes = identify_features(
                self.iface.activeLayer(),
                threshold=distance,
                callback=progress_callback)
        except Exception:
            LOGGER.exception('A failure occurred calling identify_features.')
            self.iface.messageBar().popWidget(message_bar)
            self.iface.messageBar().pushMessage(
                self.tr('Feature extraction error.'),
                self.tr('Please check logs for details.'),
                level=QgsMessageBar.CRITICAL,
                duration=5)
            return

        # Get rid of the message bar again.
        self.iface.messageBar().popWidget(message_bar)

        self._load_nodes_with_style(nodes)

        if load_intermediate_layer:
            QgsMapLayerRegistry.instance().addMapLayer(intermediate_layer)

        #QgsMapLayerRegistry.instance().addMapLayers([layer])
        self.iface.messageBar().pushMessage(
            self.tr('Extraction completed.'),
            self.tr('Use "Layer->Save as" to save the results permanently.'),
            level=QgsMessageBar.INFO,
            duration=10)