def test_rectangle_from_wkt(self): """Test we can a create a rectangle from a WKT.""" rectangle = wkt_to_rectangle('POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))') self.assertTrue(isinstance(rectangle, QgsRectangle)) rectangle = wkt_to_rectangle('POLYGON ((0 1, 1 1, 1 0, 0 0))') self.assertIsNone(rectangle)
def test_rectangle_from_wkt(self): """Test we can a create a rectangle from a WKT.""" rectangle = wkt_to_rectangle('POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))') self.assertTrue(isinstance(rectangle, QgsRectangle)) rectangle = wkt_to_rectangle('POLYGON ((0 1, 1 1, 1 0, 0 0))') self.assertIsNone(rectangle)
def prepare_impact_function(self): """Create analysis as a representation of current situation of IFCW.""" # Impact Functions impact_function = ImpactFunction() impact_function.callback = self.progress_callback # Layers impact_function.hazard = self.parent.hazard_layer impact_function.exposure = self.parent.exposure_layer aggregation = self.parent.aggregation_layer if aggregation: impact_function.aggregation = aggregation impact_function.use_selected_features_only = ( setting('useSelectedFeaturesOnly', False, bool)) else: mode = setting('analysis_extents_mode') if self.extent.user_extent: # This like a hack to transform a geometry to a rectangle. # self.extent.user_extent is a QgsGeometry. # impact_function.requested_extent needs a QgsRectangle. wkt = self.extent.user_extent.exportToWkt() impact_function.requested_extent = wkt_to_rectangle(wkt) impact_function.requested_extent_crs = self.extent.crs elif mode == HAZARD_EXPOSURE_VIEW: impact_function.requested_extent = ( self.iface.mapCanvas().extent()) impact_function.requested_extent_crs = self.extent.crs # We don't have any checkbox in the wizard for the debug mode. impact_function.debug_mode = False return impact_function
def __init__(self, iface, parent=None, extent=None, crs=None): """Constructor for the dialog. :param iface: A Quantum GIS QGisAppInterface instance. :type iface: QGisAppInterface :param parent: Parent widget of this dialog. :type parent: QWidget :param extent: Extent of the user's preferred analysis area. :type extent: QgsRectangle :param crs: CRS for user defined analysis extent. :type crs: QgsCoordinateReferenceSystem """ QDialog.__init__(self, parent) self.setupUi(self) icon = resources_path('img', 'icons', 'set-extents-tool.svg') self.setWindowIcon(QIcon(icon)) self.iface = iface self.parent = parent self.canvas = iface.mapCanvas() self.previous_map_tool = None # Prepare the map tool self.tool = RectangleMapTool(self.canvas) self.previous_map_tool = self.canvas.mapTool() if extent is None: # Use the current map canvas extents as a starting point self.tool.set_rectangle(self.canvas.extent()) else: if isinstance(extent, QgsGeometry): # In InaSAFE V4, the extent is a QgsGeometry. # This like a hack to transform a geometry to a rectangle. extent = wkt_to_rectangle(extent.exportToWkt()) # Ensure supplied extent is in current canvas crs transform = QgsCoordinateTransform( crs, self.canvas.mapSettings().destinationCrs()) transformed_extent = transform.transformBoundingBox(extent) self.tool.set_rectangle(transformed_extent) self._populate_coordinates() # Observe inputs for changes self.x_minimum.valueChanged.connect(self._coordinates_changed) self.y_minimum.valueChanged.connect(self._coordinates_changed) self.x_maximum.valueChanged.connect(self._coordinates_changed) self.y_maximum.valueChanged.connect(self._coordinates_changed) # Draw the rubberband self._coordinates_changed() # Wire up button events self.capture_button.clicked.connect(self.start_capture) # Handle cancel cancel_button = self.button_box.button(QtGui.QDialogButtonBox.Cancel) cancel_button.clicked.connect(self.reject) # Make sure to reshow this dialog when rectangle is captured self.tool.rectangle_created.connect(self.stop_capture) # Setup ok button self.ok_button = self.button_box.button(QtGui.QDialogButtonBox.Ok) self.ok_button.clicked.connect(self.accept) # Set up context help self.help_button = self.button_box.button(QtGui.QDialogButtonBox.Help) # Allow toggling the help button self.help_button.setCheckable(True) self.help_button.toggled.connect(self.help_toggled) self.main_stacked_widget.setCurrentIndex(1) # Reset / Clear button clear_button = self.button_box.button(QtGui.QDialogButtonBox.Reset) clear_button.setText(self.tr('Clear')) clear_button.clicked.connect(self.clear) # Populate the bookmarks list and connect the combobox self._populate_bookmarks_list() self.bookmarks_list.currentIndexChanged.connect( self.bookmarks_index_changed) # Reinstate the last used radio button mode = setting('analysis_extents_mode', HAZARD_EXPOSURE_VIEW) if mode == HAZARD_EXPOSURE_VIEW: self.hazard_exposure_view_extent.setChecked(True) elif mode == EXPOSURE: self.exposure_only.setChecked(True) elif mode == HAZARD_EXPOSURE: self.hazard_exposure_only.setChecked(True) elif mode == HAZARD_EXPOSURE_BOOKMARK: self.hazard_exposure_bookmark.setChecked(True) elif mode == HAZARD_EXPOSURE_BOUNDINGBOX: self.hazard_exposure_user_extent.setChecked(True) self.show_warnings.setChecked( setting('show_extent_warnings', True, bool)) self.show_confirmations.setChecked( setting('show_extent_confirmations', True, bool))
def __init__(self, iface, parent=None, extent=None, crs=None): """Constructor for the dialog. :param iface: A Quantum GIS QGisAppInterface instance. :type iface: QGisAppInterface :param parent: Parent widget of this dialog. :type parent: QWidget :param extent: Extent of the user's preferred analysis area. :type extent: QgsRectangle :param crs: CRS for user defined analysis extent. :type crs: QgsCoordinateReferenceSystem """ QDialog.__init__(self, parent) self.setupUi(self) self.iface = iface self.parent = parent self.canvas = iface.mapCanvas() self.previous_map_tool = None # Prepare the map tool self.tool = RectangleMapTool(self.canvas) self.previous_map_tool = self.canvas.mapTool() if extent is None: # Use the current map canvas extents as a starting point self.tool.set_rectangle(self.canvas.extent()) else: if isinstance(extent, QgsGeometry): # In InaSAFE V4, the extent is a QgsGeometry. # This like a hack to transform a geometry to a rectangle. extent = wkt_to_rectangle(extent.exportToWkt()) # Ensure supplied extent is in current canvas crs transform = QgsCoordinateTransform( crs, self.canvas.mapSettings().destinationCrs()) transformed_extent = transform.transformBoundingBox(extent) self.tool.set_rectangle(transformed_extent) self._populate_coordinates() # Observe inputs for changes self.x_minimum.valueChanged.connect(self._coordinates_changed) self.y_minimum.valueChanged.connect(self._coordinates_changed) self.x_maximum.valueChanged.connect(self._coordinates_changed) self.y_maximum.valueChanged.connect(self._coordinates_changed) # Draw the rubberband self._coordinates_changed() # Wire up button events self.capture_button.clicked.connect(self.start_capture) # Handle cancel cancel_button = self.button_box.button(QtGui.QDialogButtonBox.Cancel) cancel_button.clicked.connect(self.reject) # Make sure to reshow this dialog when rectangle is captured self.tool.rectangle_created.connect(self.stop_capture) # Setup ok button self.ok_button = self.button_box.button(QtGui.QDialogButtonBox.Ok) self.ok_button.clicked.connect(self.accept) # Set up context help self.help_button = self.button_box.button(QtGui.QDialogButtonBox.Help) # Allow toggling the help button self.help_button.setCheckable(True) self.help_button.toggled.connect(self.help_toggled) self.main_stacked_widget.setCurrentIndex(1) # Reset / Clear button clear_button = self.button_box.button(QtGui.QDialogButtonBox.Reset) clear_button.setText(self.tr('Clear')) clear_button.clicked.connect(self.clear) # Populate the bookmarks list and connect the combobox self._populate_bookmarks_list() self.bookmarks_list.currentIndexChanged.connect( self.bookmarks_index_changed) # Reinstate the last used radio button mode = setting('analysis_extents_mode', HAZARD_EXPOSURE_VIEW) if mode == HAZARD_EXPOSURE_VIEW: self.hazard_exposure_view_extent.setChecked(True) elif mode == EXPOSURE: self.exposure_only.setChecked(True) elif mode == HAZARD_EXPOSURE: self.hazard_exposure_only.setChecked(True) elif mode == HAZARD_EXPOSURE_BOOKMARK: self.hazard_exposure_bookmark.setChecked(True) elif mode == HAZARD_EXPOSURE_BOUNDINGBOX: self.hazard_exposure_user_extent.setChecked(True) self.show_warnings.setChecked( setting('show_extent_warnings', True, bool)) self.show_confirmations.setChecked( setting('show_extent_confirmations', True, bool))
def test_minimum_extent(self): """Test we can compute the minimum extent in the IF.""" # Without aggregation layer hazard_layer = load_test_vector_layer('hazard', 'flood_multipart_polygons.shp') exposure_layer = load_test_vector_layer('exposure', 'roads.shp') impact_function = ImpactFunction() impact_function.exposure = exposure_layer impact_function.hazard = hazard_layer status, message = impact_function.prepare() self.assertEqual(PREPARE_SUCCESS, status, message) message = ( 'Test about the minimum extent without an aggregation layer is ' 'failing.') self.assertTrue( compare_wkt( 'Polygon ((' '106.8080099999999959 -6.19531000000000009, ' '106.8080099999999959 -6.16752599999999962, ' '106.83456946836641066 -6.16752599999999962, ' '106.83456946836641066 -6.19531000000000009, ' '106.8080099999999959 -6.19531000000000009))', impact_function.analysis_extent.exportToWkt()), message) # Without aggregation layer but with a requested_extent hazard_layer = load_test_vector_layer('hazard', 'flood_multipart_polygons.shp') exposure_layer = load_test_vector_layer('exposure', 'roads.shp') impact_function = ImpactFunction() impact_function.exposure = exposure_layer impact_function.hazard = hazard_layer impact_function.requested_extent = wkt_to_rectangle( 'POLYGON ((' '106.772279 -6.237576, ' '106.772279 -6.165415, ' '106.885165 -6.165415, ' '106.885165 -6.237576, ' '106.772279 -6.237576' '))') impact_function.requested_extent_crs = QgsCoordinateReferenceSystem( 4326) status, message = impact_function.prepare() self.assertEqual(PREPARE_SUCCESS, status, message) message = ( 'Test about the minimum extent without an aggregation layer but ' 'with a requested extent is failing.') self.assertTrue( compare_wkt( 'Polygon ((' '106.8080099999999959 -6.19531000000000009, ' '106.8080099999999959 -6.16752599999999962, ' '106.83456946836641066 -6.16752599999999962, ' '106.83456946836641066 -6.19531000000000009, ' '106.8080099999999959 -6.19531000000000009))', impact_function.analysis_extent.exportToWkt()), message) # With an aggregation layer, without selection hazard_layer = load_test_vector_layer('gisv4', 'hazard', 'classified_vector.geojson') exposure_layer = load_test_vector_layer('gisv4', 'exposure', 'building-points.geojson') aggregation_layer = load_test_vector_layer('gisv4', 'aggregation', 'small_grid.geojson') impact_function = ImpactFunction() impact_function.aggregation = aggregation_layer impact_function.exposure = exposure_layer impact_function.hazard = hazard_layer impact_function.use_selected_features_only = False impact_function.aggregation.select(0) status, message = impact_function.prepare() self.assertEqual(PREPARE_SUCCESS, status, message) message = ( 'Test about the minimum extent with an aggregation layer is ' 'failing.') self.assertTrue( compare_wkt( 'Polygon ((106.9033179652593617 -6.18324454090033182, ' '106.90331796525939012 -6.2725478115989306, ' '106.72365490843547775 -6.2725478115989306, ' '106.72365490843547775 -6.18324645462287137, ' '106.72365490843547775 -6.09392810187095257, ' '106.81348643684744104 -6.09392810187095257, ' '106.9033179652593617 -6.09392810187095257, ' '106.9033179652593617 -6.18324454090033182))', impact_function.analysis_extent.exportToWkt()), message) # With an aggregation layer, with selection impact_function.use_selected_features_only = True impact_function.aggregation = aggregation_layer status, message = impact_function.prepare() self.assertEqual(PREPARE_SUCCESS, status, message) message = ( 'Test about the minimum extent with an aggregation layer and ' 'a selection is failing.') self.assertTrue( compare_wkt( 'Polygon ((106.72365490843547775 -6.09392810187095257, ' '106.81348643684744104 -6.09392810187095257, ' '106.81348643684744104 -6.18324645462287137, ' '106.72365490843547775 -6.18324645462287137, ' '106.72365490843547775 -6.09392810187095257))', impact_function.analysis_extent.exportToWkt()), message)
def test_minimum_extent(self): """Test we can compute the minimum extent in the IF.""" # Without aggregation layer hazard_layer = load_test_vector_layer( 'hazard', 'flood_multipart_polygons.shp') exposure_layer = load_test_vector_layer('exposure', 'roads.shp') impact_function = ImpactFunction() impact_function.exposure = exposure_layer impact_function.hazard = hazard_layer status, message = impact_function.prepare() self.assertEqual(PREPARE_SUCCESS, status, message) message = ( 'Test about the minimum extent without an aggregation layer is ' 'failing.') self.assertTrue( compare_wkt( 'Polygon ((' '106.8080099999999959 -6.19531000000000009, ' '106.8080099999999959 -6.16752599999999962, ' '106.83456946836641066 -6.16752599999999962, ' '106.83456946836641066 -6.19531000000000009, ' '106.8080099999999959 -6.19531000000000009))', impact_function.analysis_extent.exportToWkt()), message ) # Without aggregation layer but with a requested_extent hazard_layer = load_test_vector_layer( 'hazard', 'flood_multipart_polygons.shp') exposure_layer = load_test_vector_layer('exposure', 'roads.shp') impact_function = ImpactFunction() impact_function.exposure = exposure_layer impact_function.hazard = hazard_layer impact_function.requested_extent = wkt_to_rectangle( 'POLYGON ((' '106.772279 -6.237576, ' '106.772279 -6.165415, ' '106.885165 -6.165415, ' '106.885165 -6.237576, ' '106.772279 -6.237576' '))') impact_function.requested_extent_crs = QgsCoordinateReferenceSystem( 4326) status, message = impact_function.prepare() self.assertEqual(PREPARE_SUCCESS, status, message) message = ( 'Test about the minimum extent without an aggregation layer but ' 'with a requested extent is failing.') self.assertTrue( compare_wkt( 'Polygon ((' '106.8080099999999959 -6.19531000000000009, ' '106.8080099999999959 -6.16752599999999962, ' '106.83456946836641066 -6.16752599999999962, ' '106.83456946836641066 -6.19531000000000009, ' '106.8080099999999959 -6.19531000000000009))', impact_function.analysis_extent.exportToWkt()), message ) # With an aggregation layer, without selection hazard_layer = load_test_vector_layer( 'gisv4', 'hazard', 'classified_vector.geojson') exposure_layer = load_test_vector_layer( 'gisv4', 'exposure', 'building-points.geojson') aggregation_layer = load_test_vector_layer( 'gisv4', 'aggregation', 'small_grid.geojson') impact_function = ImpactFunction() impact_function.aggregation = aggregation_layer impact_function.exposure = exposure_layer impact_function.hazard = hazard_layer impact_function.use_selected_features_only = False impact_function.aggregation.select(0) status, message = impact_function.prepare() self.assertEqual(PREPARE_SUCCESS, status, message) message = ( 'Test about the minimum extent with an aggregation layer is ' 'failing.') self.assertTrue( compare_wkt( 'Polygon ((106.9033179652593617 -6.18324454090033182, ' '106.90331796525939012 -6.2725478115989306, ' '106.72365490843547775 -6.2725478115989306, ' '106.72365490843547775 -6.18324645462287137, ' '106.72365490843547775 -6.09392810187095257, ' '106.81348643684744104 -6.09392810187095257, ' '106.9033179652593617 -6.09392810187095257, ' '106.9033179652593617 -6.18324454090033182))', impact_function.analysis_extent.exportToWkt()), message ) # With an aggregation layer, with selection impact_function.use_selected_features_only = True impact_function.aggregation = aggregation_layer status, message = impact_function.prepare() self.assertEqual(PREPARE_SUCCESS, status, message) message = ( 'Test about the minimum extent with an aggregation layer and ' 'a selection is failing.') self.assertTrue( compare_wkt( 'Polygon ((106.72365490843547775 -6.09392810187095257, ' '106.81348643684744104 -6.09392810187095257, ' '106.81348643684744104 -6.18324645462287137, ' '106.72365490843547775 -6.18324645462287137, ' '106.72365490843547775 -6.09392810187095257))', impact_function.analysis_extent.exportToWkt()), message )