def gee_layer_make_xml(self): eelayer = self.iface.activeLayer() dest_dir = QgsProject.instance().absolutePath() or os.getcwd() dest_name = eelayer.name().replace('/', '_') + '.xml' dest_file = os.path.join(dest_dir, dest_name) source_xml = eelayer.dataProvider().dataSourceUri() dest_xml, _ = QFileDialog.getSaveFileName(self.dlg, 'Select output file', dest_file, 'XML files (*.xml)') if dest_xml: shutil.copyfile(source_xml, dest_xml) newname = os.path.splitext(os.path.basename(dest_xml))[0] newlayer = QgsRasterLayer(dest_xml, newname) if newlayer.isValid(): imageid = eelayer.customProperty('ee-image-id') date = eelayer.customProperty('ee-image-date') qml = eelayer.customProperty('ee-image-qml') extent = eelayer.customProperty('ee-image-wkt') # load qml must be first since this clean all custom properties if qml is not None: if isfile(qml + '_' + QSettings().value('locale/userLocale') + '.qml'): newlayer.loadNamedStyle( qml + '_' + QSettings().value('locale/userLocale') + '.qml') else: newlayer.loadNamedStyle(qml + '.qml') newlayer.setCustomProperty('ee-image', 'XML') newlayer.setCustomProperty('ee-image-id', imageid) newlayer.setCustomProperty('ee-image-date', date) newlayer.setCustomProperty( 'ee-image-bands', eelayer.customProperty('ee-image-bands')) newlayer.setCustomProperty( 'ee-image-scale', eelayer.customProperty('ee-image-scale')) newlayer.setCustomProperty( 'ee-image-b_min', eelayer.customProperty('ee-image-b_min')) newlayer.setCustomProperty( 'ee-image-b_max', eelayer.customProperty('ee-image-b_max')) newlayer.setCustomProperty( 'ee-image-palette', eelayer.customProperty('ee-image-palette')) newlayer.setCustomProperty('ee-image-qml', qml) newlayer.setCustomProperty('ee-image-wkt', extent) if date is not None: newlayer.setAbstract( f"ee.Image('{imageid}') \n\nDate: {date}") else: newlayer.setAbstract(f"ee.Image('{imageid}')") bb = QgsRectangle.fromWkt(extent) newlayer.setExtent(bb) QgsProject.instance().addMapLayer(newlayer) QgsProject.instance().layerTreeRoot().findLayer( newlayer.id()).setItemVisibilityChecked(False)
def add_ee_image_layer(imageid, name, date, bands, scale, b_min=None, b_max=None, palette=None, qml=None, extent=None, shown=False, destination=None): nbands = len(bands) # if nbands > 3: # rgb = ee.Image(imageid).select(bands[0:3]) # pan = ee.Image(imageid).select(bands[3]) # huesat = rgb.rgbToHsv().select('hue', 'saturation') # image = ee.Image.cat(huesat, pan).hsvToRgb().select([0, 1, 2], bands[0:3]) # nbands = 3 # else: image = ee.Image(imageid) if not any([b_min, b_max, palette, qml]): image_stats = image.select(bands[0:nbands]).reduceRegion(ee.Reducer.minMax(), None, scale, None, None, False, 1.0E13).getInfo() b_min = [image_stats[bands[n] + '_min'] for n in range(nbands)] b_max = [image_stats[bands[n] + '_max'] for n in range(nbands)] # b_min = [image_stats[bands[0] + '_min'], image_stats[bands[1] + '_min'], image_stats[bands[2] + '_min']] # b_max = [image_stats[bands[0] + '_max'], image_stats[bands[1] + '_max'], image_stats[bands[2] + '_max']] rgb = image.visualize(bands=bands[0:nbands], min=b_min, max=b_max, palette=palette) tms = get_ee_image_tms(rgb) if extent is None: image_geojson = get_ee_image_bb(rgb) extent = geojson_to_wkt(image_geojson) bb = QgsRectangle.fromWkt(extent) url = tms_to_gdalurl(tms) xml = get_gdal_xml(url, nbands=nbands+1) # vfn = write_vsimem_xml(xml) # changed to named temporary file tmp, fn = write_xmlfile(xml, name, dest=destination) layer = QgsRasterLayer(fn, name) if layer.isValid(): if qml is not None: if isfile(qml + '_' + QSettings().value('locale/userLocale') + '.qml'): layer.loadNamedStyle(qml + '_' + QSettings().value('locale/userLocale') + '.qml') else: layer.loadNamedStyle(qml + '.qml') layer.setExtent(bb) if tmp: layer.setCustomProperty('ee-image', 'MEM') else: layer.setCustomProperty('ee-image', 'XML') layer.setCustomProperty('ee-image-id', imageid) layer.setCustomProperty('ee-image-date', date) layer.setCustomProperty('ee-image-bands', bands) layer.setCustomProperty('ee-image-scale', scale) layer.setCustomProperty('ee-image-b_min', b_min) layer.setCustomProperty('ee-image-b_max', b_max) layer.setCustomProperty('ee-image-palette', palette) layer.setCustomProperty('ee-image-qml', qml) layer.setCustomProperty('ee-image-wkt', extent) # else: # layer.setAbstract(f"ee.Image('{imageid}')") # if len(bands) < 4: # try: # layer.setCustomProperty('ee-image-stats', image_stats) # except NameError: # pass if date is not None: layer.setAbstract(f"ee.Image('{imageid}') \n\nDate: {date}") else: layer.setAbstract(f"ee.Image('{imageid}')") QgsProject.instance().addMapLayer(layer) if not shown: QgsProject.instance().layerTreeRoot().findLayer(layer.id()).setItemVisibilityChecked(shown)
def addLayer(self, index, old=None, addToMap=True): item = index.data(role=Qt.UserRole) if not isinstance(item, LayerItem): return if not self.plugin.setLoading(True): return addedData = [] if isinstance(item, VectorItem): connector = self.getConnector() self.plugin.msgBar = ProgressMessageBar(self.iface, self.tr("Downloading layer '%s'...")%item.name, connector=connector) self.plugin.msgBar.setValue(10) connector.downloadingProgress.connect(self.plugin.updateDownloadProgress) data = connector.diviGetLayerFeatures(item.id) layers = [] if data: permissions = connector.getUserPermission(item.id, 'layer') self.plugin.msgBar.setBoundries(50, 50) #Disable rendering for changing symbology self.iface.mapCanvas().setRenderFlag(False) layers = self.plugin.addLayer(data['features'], item, permissions, addToMap=addToMap) for layer in layers: #Set symbols based on layer geometry type item.setQgisStyle(layer) self.iface.layerTreeView().refreshLayerSymbology(layer.id()) self.iface.mapCanvas().setRenderFlag(True) addedData.extend( layers ) item.items.extend( addedData ) self.plugin.msgBar.setValue(100) aborted = self.plugin.msgBar.aborted self.plugin.msgBar.close() self.plugin.msgBar = None if aborted: # fix_print_with_import print('Aborted') elif not layers: #User can select geometry type in message bar widget = self.iface.messageBar().createMessage( self.tr("Warning"), self.tr(u"Layer '%s' is empty. To open it in QGIS you need to select geometry type.") % item.name ) button = QToolButton(widget) button.setText(self.tr("Add layer as...")) button.setPopupMode(QToolButton.InstantPopup) menu = QMenu(button) def load_layer_as(geom_type): self.plugin.loadLayerType(item = item, geom_type = geom_type) self.iface.messageBar().clearWidgets() menu.addAction(QgsApplication.getThemeIcon('/mIconPointLayer.svg'), self.tr('Points'), lambda: load_layer_as(geom_type='MultiPoint')) menu.addAction(QgsApplication.getThemeIcon('/mIconLineLayer.svg'), self.tr('Linestring'), lambda: load_layer_as(geom_type='MultiLineString')) menu.addAction(QgsApplication.getThemeIcon('/mIconPolygonLayer.svg'), self.tr('Polygons'), lambda: load_layer_as(geom_type='MultiPolygon')) button.setMenu( menu ) widget.layout().addWidget(button) self.iface.messageBar().pushWidget(widget, Qgis.Warning) elif isinstance(item, TableItem): if Qgis.QGIS_VERSION_INT < 21400: self.iface.messageBar().pushMessage('DIVI', self.tr(u'QGIS 2.14 or later is required for loading DIVI tables.'), Qgis.Critical, duration = 3 ) else: self.plugin.msgBar = ProgressMessageBar(self.iface, self.tr("Downloading table '%s'...")%item.name) self.plugin.msgBar.setValue(10) connector = self.getConnector() connector.downloadingProgress.connect(self.plugin.updateDownloadProgress) data = connector.diviGetTableRecords(item.id) if data: permissions = connector.getUserPermission(item.id, 'table') self.plugin.msgBar.setBoundries(50, 50) addedData.append( self.plugin.addTable(data['header'], data['data'], item, permissions, addToMap=addToMap) ) item.items.extend( addedData ) self.plugin.msgBar.setValue(100) self.plugin.msgBar.close() self.plugin.msgBar = None elif isinstance(item, RasterItem): if Qgis.QGIS_VERSION_INT < 21800: self.iface.messageBar().pushMessage('DIVI', self.tr(u'QGIS 2.18 or later is required for loading DIVI rasters.'), Qgis.Critical, duration = 3 ) else: uri = item.getUri(self.token) uri = uri.replace("b'", "").replace("'", "") QgsMessageLog.logMessage( uri, 'DIVI') r = QgsRasterLayer(uri, item.name, 'wms') r.setCustomProperty('DiviId', item.id) if item.extent is not None: #Set extent for raster layer bbox = self.transform2mercator.transformBoundingBox( QgsRectangle( item.extent['st_xmin'], item.extent['st_ymin'], item.extent['st_xmax'], item.extent['st_ymax'] )) r.setExtent( bbox ) addedData.append( r ) item.items.extend( addedData ) if addToMap: QgsProject.instance().addMapLayer(r) elif isinstance(item, WmsItem): uri = item.getUri() QgsMessageLog.logMessage( uri, 'DIVI') r = QgsRasterLayer(uri, item.name, 'wms') r.setCustomProperty('DiviId', item.id) addedData.append( r ) item.items.extend( addedData ) if addToMap: QgsProject.instance().addMapLayer(r) elif isinstance(item, BasemapItem): uri = item.getUri() QgsMessageLog.logMessage( uri, 'DIVI') r = QgsRasterLayer(uri, item.name, 'wms') r.setCustomProperty('DiviId', item.id) addedData.append( r ) item.items.extend( addedData ) if addToMap: QgsProject.instance().addMapLayer(r) else: return index.model().dataChanged.emit(index.parent().parent(), index) self.plugin.setLoading(False) return addedData