def testBestPathFinder(self): """Test full process to obtain layers (points and Lines layers) """ import tempfile outputFolder = tempfile.mkdtemp("frd") polylineThreshold = 5 parameters = { "min_slope_pct": 0, "max_slope_pct": 10, "semi_size": 2, "penalty_factor_xy": 40, "penalty_factor_z": 40 } finder = oq.BestPathFinder(self.input_dtm, self.exclusion_areas_layer) finder.set_parameters(parameters) finder.set_output_folder(outputFolder) raw_layer = finder.create_raw_output_layer() simplified_layer = finder.create_simplified_output_layer( polylineThreshold) for point_index in af.waypoints_list(self.input_v_layer): finder.add_segment_to(point_index) self.assertEqual(raw_layer.dataProvider().featureCount(), 179) self.assertTrue(simplified_layer.isValid())
def test_coords_and_indexes(self): """Test conversion between coordinates and indexes """ waypoints_coords_list = af.waypoints_list(self.input_v_layer) wpts_index_array, ds_geotransform = af.coord_to_index( self.input_dtm, waypoints_coords_list) q_coords = af.index_to_coord(ds_geotransform, wpts_index_array) np.testing.assert_allclose(np.array(waypoints_coords_list), q_coords)
def processRouteOptimization(self): """This function manages the progressBar """ iface.messageBar().clearWidgets() progressMessageBar = iface.messageBar() progress = QProgressBar() progress.setMaximum(100) progressMessageBar.pushWidget(progress) waypointsLayer = QgsProject.instance().mapLayersByName( self.waypointsLayerComboBox.currentText())[0] try: ok, message = inputs_checker.check_layers( self.finder.dtm["layer"], waypointsLayer, self.finder.exclusion_areas["layer"]) if not ok: raise ValueError(message) waypoints = af.waypoints_list(waypointsLayer) for idx, point_coords in enumerate(waypoints): def updateProgress(value): progress.setValue( max( 0, float(value) / (len(waypoints) - 1) + (idx - 1) * 100.0 / (len(waypoints) - 1))) progress.repaint() self.finder.optimizer.progress_callback = updateProgress self.finder.add_segment_to(point_coords) for _ in range(10): QgsApplication.instance().processEvents() self.finder.raw_layer.triggerRepaint() self.iface.mapCanvas().refresh() for _ in range(10): QgsApplication.instance().processEvents() except ValueError as e: self.showMessageBox(unicode(e), u"Error del optimizador") self.showMessageBar( u"Forest Road Designer: ha fallado la optimización", u"Error", QgsMessageBar.WARNING) return False return True
def testExclusionUtility(self): """Test if exclusion utility is working """ import tempfile from qgis.core import QGis outputFolder = tempfile.mkdtemp("frd") parameters = { "min_slope_pct": 0, "max_slope_pct": 10, "semi_size": 2, "penalty_factor_xy": 40, "penalty_factor_z": 40 } finder = oq.BestPathFinder(self.input_dtm, self.exclusion_areas_layer) finder.set_parameters(parameters) finder.set_output_folder(outputFolder) raw_layer = finder.create_raw_output_layer() for point_index in af.waypoints_list(self.input_v_layer): finder.add_segment_to(point_index) raw_layer = finder.create_raw_output_layer() self.assertTrue(raw_layer) provider = raw_layer.dataProvider().getFeatures() puntos_geom = [] for elem in provider: geom2 = elem.geometry() if geom2.wkbType() == QGis.WKBPoint: puntos_geom.append(geom2) exc_provider = self.exclusion_areas_layer.dataProvider().getFeatures() exc_geoms = [] for elem in exc_provider: geom1 = elem.geometry() exc_geoms.append(geom1) contenido = [] for elem_exc in self.exclusion_areas_layer.dataProvider().getFeatures( ): for elem in raw_layer.dataProvider().getFeatures(): geom2 = elem.geometry() geom1 = elem_exc.geometry() if geom1.contains(geom2): contenido.append(geom2) self.assertEqual(contenido, [])