def get_custom_extent(self, rec): layer_extension = self.layer.extent() source = self.layer.crs() target = self.map_crs if source != target: transform = QgsCoordinateTransform(source, target) layer_extension = transform.transform(layer_extension) if rec.intersects(layer_extension): extension = rec.intersect(layer_extension) self.paint_extent(extension) self.iface.actionPan().trigger() self.get_z_max_z_min() self.ini_dimensions() else: QMessageBox.warning(self, self.tr("Attention"), self.tr("Print extent defined outside layer extent"))
def layer_extent(self): layers = self.iface.legendInterface().layers() select_layer_dialog = SelectLayer_dialog.Dialog(layers) if select_layer_dialog.exec_(): layer = select_layer_dialog.get_layer() if layer: rec = get_layer(layer).extent() source = self.layer.crs() target = self.map_crs if source != target: transform = QgsCoordinateTransform(source, target) rec = transform.transform(rec) self.paint_extent(rec) self.get_z_max_z_min() self.ini_dimensions()
def get_custom_extent(self, rec): layer_extension = self.layer.extent() source = self.layer.crs() target = self.map_crs if source != target: transform = QgsCoordinateTransform(source, target) layer_extension = transform.transform(layer_extension) if rec.intersects(layer_extension): extension = rec.intersect(layer_extension) self.paint_extent(extension) self.iface.actionPan().trigger() self.get_z_max_z_min() self.ini_dimensions() else: QMessageBox.warning( self, self.tr("Attention"), self.tr("Print extent defined outside layer extent"))
def matrix_dem_build(self, dem_dataset, height, width, scale, spacing_mm, roi_x_max, roi_x_min, roi_y_min, h_base, z_scale, projected): # Calculate DEM parameters dem_col = dem_dataset.RasterXSize dem_row = dem_dataset.RasterYSize geotransform = dem_dataset.GetGeoTransform() dem_x_min = geotransform[0] dem_y_max = geotransform[3] dem_y_min = dem_y_max + dem_row * geotransform[5] dem_x_max = dem_x_min + dem_col * geotransform[1] if not projected: spacing_deg = spacing_mm * (roi_x_max - roi_x_min) / width row_stl = int(math.ceil(height / spacing_mm) + 1) col_stl = int(math.ceil(width / spacing_mm) + 1) matrix_dem = [range(col_stl) for i in range(row_stl)] var_y = height for i in range(row_stl): self.updateProgress.emit() QApplication.processEvents() var_x = 0 for j in range(col_stl): # Model coordinate x(mm), y(mm) x_model = round(var_x, 2) y_model = round(var_y, 2) # Model maps geo_coordinates if projected: x = x_model * scale / 1000 + roi_x_min y = y_model * scale / 1000 + roi_y_min else: x = x_model * spacing_deg / spacing_mm + roi_x_min y = y_model * spacing_deg / spacing_mm + roi_y_min # Model layer geo_coordinates to query z value point = QgsPoint(x, y) source = self.parameters["crs_map"] target = self.parameters["crs_layer"] if source != target: transform = QgsCoordinateTransform(source, target) point = transform.transform(point) x = point.x() y = point.y() # From x(m) get Column in DEM file col_dem = (x - dem_x_min) * dem_col / (dem_x_max - dem_x_min) col_dem = int(math.floor(col_dem)) if col_dem == dem_col: col_dem -= 1 # From y(m) get Row in DEM file row_dem = (dem_y_max - y) * dem_row / (dem_y_max - dem_y_min) row_dem = int(math.floor(row_dem)) if row_dem == dem_row: row_dem -= 1 # Model coordinate z(mm) if col_dem < 0 or row_dem < 0: z_model = 2 elif self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0] <= h_base: z_model = 2 elif math.isnan( self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0]): z_model = 2 else: z_model = round( (self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0] - h_base) / scale * 1000 * z_scale, 2) + 2 matrix_dem[i][j] = self.pto(x=x_model, y=y_model, z=z_model) var_x += spacing_mm if var_x > width: var_x = width var_y = spacing_mm * (row_stl - (i + 2)) if self.quit: return 0 return matrix_dem
def matrix_dem_build(self, dem_dataset, height, width, scale, spacing_mm, roi_x_max, roi_x_min, roi_y_min, h_base, z_scale, projected): # Calculate DEM parameters dem_col = dem_dataset.RasterXSize dem_row = dem_dataset.RasterYSize geotransform = dem_dataset.GetGeoTransform() dem_x_min = geotransform[0] dem_y_max = geotransform[3] dem_y_min = dem_y_max + dem_row * geotransform[5] dem_x_max = dem_x_min + dem_col * geotransform[1] if not projected: spacing_deg = spacing_mm * (roi_x_max - roi_x_min) / width row_stl = int(math.ceil(height / spacing_mm) + 1) col_stl = int(math.ceil(width / spacing_mm) + 1) matrix_dem = [range(col_stl) for i in range(row_stl)] var_y = height for i in range(row_stl): self.updateProgress.emit() QApplication.processEvents() var_x = 0 for j in range(col_stl): # Model coordinate x(mm), y(mm) x_model = round(var_x, 2) y_model = round(var_y, 2) # Model maps geo_coordinates if projected: x = x_model * scale / 1000 + roi_x_min y = y_model * scale / 1000 + roi_y_min else: x = x_model * spacing_deg / spacing_mm + roi_x_min y = y_model * spacing_deg / spacing_mm + roi_y_min # Model layer geo_coordinates to query z value point = QgsPoint(x, y) source = self.parameters["crs_map"] target = self.parameters["crs_layer"] if source != target: transform = QgsCoordinateTransform(source, target) point = transform.transform(point) x = point.x() y = point.y() # From x(m) get Column in DEM file col_dem = (x - dem_x_min) * dem_col / (dem_x_max - dem_x_min) col_dem = int(math.floor(col_dem)) if col_dem == dem_col: col_dem -= 1 # From y(m) get Row in DEM file row_dem = (dem_y_max - y) * dem_row / (dem_y_max - dem_y_min) row_dem = int(math.floor(row_dem)) if row_dem == dem_row: row_dem -= 1 # Model coordinate z(mm) if col_dem < 0 or row_dem < 0: z_model = 2 elif self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0] <= h_base: z_model = 2 elif math.isnan(self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0]): z_model = 2 else: z_model = round((self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0] - h_base) / scale * 1000 * z_scale, 2) + 2 matrix_dem[i][j] = self.pto(x=x_model, y=y_model, z=z_model) var_x += spacing_mm if var_x > width: var_x = width var_y = spacing_mm * (row_stl - (i + 2)) if self.quit: return 0 return matrix_dem
def get_z_max_z_min(self): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) roi = QgsRectangle(self.roi_x_min, self.roi_y_min, self.roi_x_max, self.roi_y_max) source = self.map_crs target = self.layer.crs() transform = QgsCoordinateTransform(source, target) rec = transform.transform(roi) x_max = rec.xMaximum() x_min = rec.xMinimum() y_max = rec.yMaximum() y_min = rec.yMinimum() x_off = int(math.floor((x_min - self.raster_x_min) * self.cols / (self.raster_x_max - self.raster_x_min))) y_off = int(math.floor((self.raster_y_max - y_max) * self.rows / (self.raster_y_max - self.raster_y_min))) col_size = int(math.floor((x_max - x_min) / self.cell_size)) row_size = int(math.floor((y_max - y_min) / self.cell_size)) if x_off < 0: x_off = 0 if y_off < 0: y_off = 0 if x_off >= self.cols: x_off = self.cols - 1 if y_off >= self.rows: y_off = self.rows - 1 if x_off + col_size > self.cols: col_size = self.cols - x_off if row_size + row_size > self.rows: row_size = self.rows - y_off provider = self.layer.dataProvider() path = provider.dataSourceUri() path_layer = path.split('|') dem_dataset = gdal.Open(path_layer[0]) data = self.get_dem_z(dem_dataset, x_off, y_off, col_size, row_size) if data is not None: self.z_max = max(data) self.z_min = self.z_max no_data = dem_dataset.GetRasterBand(1).GetNoDataValue() if min(data) == no_data: for z_cell in data: if z_cell != no_data and z_cell < self.z_min: self.z_min = z_cell elif math.isnan(min(data)): self.z_max = 0 self.z_min = 0 for z_cell in data: if not math.isnan(z_cell): if self.z_min > z_cell: self.z_min = z_cell if self.z_max < z_cell: self.z_max = z_cell else: self.z_min = min(data) if self.z_min < 0: self.z_min = 0 self.z_max = round(self.z_max, 3) self.z_min = round(self.z_min, 3) self.ui.ZMaxLabel.setText(str(self.z_max) + ' m') self.ui.ZMinLabel.setText(str(self.z_min) + ' m') dem_dataset = None band = None QApplication.restoreOverrideCursor()
from qgis._core import QgsCoordinateTransform, QgsCoordinateReferenceSystem,\ QgsProject from qgis.core import QgsPointXY x, y = -112.0, 13.0 crs = QgsCoordinateReferenceSystem(4326) # wgs84 crsnuevo = QgsCoordinateReferenceSystem(26912) # NAD 83 / UTM Zpne 12 trform = QgsCoordinateTransform(crs, crsnuevo, QgsProject.instance()) ptutm = trform.transform(QgsPointXY(x, y)) print("punto utm:", ptutm) ptwgs = trform.transform(ptutm, QgsCoordinateTransform.ReverseTransform) print("punto wgs:", ptwgs)
def get_z_max_z_min(self): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) roi = QgsRectangle(self.roi_x_min, self.roi_y_min, self.roi_x_max, self.roi_y_max) source = self.map_crs target = self.layer.crs() transform = QgsCoordinateTransform(source, target) rec = transform.transform(roi) x_max = rec.xMaximum() x_min = rec.xMinimum() y_max = rec.yMaximum() y_min = rec.yMinimum() x_off = int( math.floor((x_min - self.raster_x_min) * self.cols / (self.raster_x_max - self.raster_x_min))) y_off = int( math.floor((self.raster_y_max - y_max) * self.rows / (self.raster_y_max - self.raster_y_min))) col_size = int(math.floor((x_max - x_min) / self.cell_size)) row_size = int(math.floor((y_max - y_min) / self.cell_size)) if x_off < 0: x_off = 0 if y_off < 0: y_off = 0 if x_off >= self.cols: x_off = self.cols - 1 if y_off >= self.rows: y_off = self.rows - 1 if x_off + col_size > self.cols: col_size = self.cols - x_off if row_size + row_size > self.rows: row_size = self.rows - y_off provider = self.layer.dataProvider() path = provider.dataSourceUri() path_layer = path.split('|') dem_dataset = gdal.Open(path_layer[0]) data = self.get_dem_z(dem_dataset, x_off, y_off, col_size, row_size) if data is not None: self.z_max = max(data) self.z_min = self.z_max no_data = dem_dataset.GetRasterBand(1).GetNoDataValue() if min(data) == no_data: for z_cell in data: if z_cell != no_data and z_cell < self.z_min: self.z_min = z_cell elif math.isnan(min(data)): self.z_max = 0 self.z_min = 0 for z_cell in data: if not math.isnan(z_cell): if self.z_min > z_cell: self.z_min = z_cell if self.z_max < z_cell: self.z_max = z_cell else: self.z_min = min(data) if self.z_min < 0: self.z_min = 0 self.z_max = round(self.z_max, 3) self.z_min = round(self.z_min, 3) self.ui.ZMaxLabel.setText(str(self.z_max) + ' m') self.ui.ZMinLabel.setText(str(self.z_min) + ' m') dem_dataset = None band = None QApplication.restoreOverrideCursor()