def generateIsochrones(point, profile, costingOptions, intervals, colors, basename, overwrite=True): response = valhalla.isochrones(point, profile, costingOptions, intervals, colors) features = getFeaturesFromResponse(response) for interval, feature in zip(intervals[::-1], features): # FIXME: we should use the 'contour' property in the feature to be sure of the contour line that we are # drawing, but due to a bug in qgis json parser, this property appears to be always set to '0' layername = "{} min - {}".format(interval, basename) try: # FIXME: we do not consider if there are several layers with the same name here existinglayer = QgsProject.instance().mapLayersByName(layername)[0] if overwrite: QgsProject.instance().removeMapLayer(existinglayer.id()) else: raise OverwriteError( tr("layer {layername} already exists and overwrite is {overwrite}" ).format(layername=layername, overwrite=overwrite)) except IndexError: LOG.debug("this layer was not found: {}".format(layername)) layer = QgsVectorLayer( "Polygon?crs=epsg:4326&field=centerx:double&field=centery:double&field=interval:double", layername, "memory", ) pr = layer.dataProvider() qgsfeature = QgsFeature() qgsfeature.setAttributes([point.x(), point.y(), interval]) qgsfeature.setGeometry(feature.geometry()) pr.addFeatures([qgsfeature]) layer.updateExtents() QgsProject.instance().addMapLayer(layer) outlineColor = QColor(0, 0, 0) # Set opacity to 75% or C0 in hex (25% transparency) fillColor = QColor("#C0" + feature["color"][1:]) renderer = QgsSingleSymbolRenderer.defaultRenderer( QgsWkbTypes.PolygonGeometry) symbol = renderer.symbol() symbol.setColor(fillColor) symbol.symbolLayer(0).setStrokeColor(outlineColor) layer.setRenderer(renderer)
def _downloadAndUnzip(self, itemid): self.progress_bar = QProgressBar() self.progress_bar.setMinimum(0) self.progress_bar.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.progess_message_bar = self.iface.messageBar().createMessage( tr("Downloading...")) self.progess_message_bar.layout().addWidget(self.progress_bar) self.iface.messageBar().pushWidget(self.progess_message_bar, Qgis.Info) # FIXME: the signal is always emitted # self.iface.messageBar().widgetRemoved.connect(self.widget_removed) def extract_data(tmpPath, itemid): LOG.debug("Extract data") try: targetFolder = DataCatalogueClient.folderForDataItem(itemid) QDir(targetFolder).removeRecursively() unzip.unzip(tmpPath, targetFolder) QFile(tmpPath).remove() except Exception as e: LOG.debug("Error on extracting data %s" % e) url = f"{self.url}/content/items/{itemid}/data" tmpDir = QDir.tempPath() filename = f"{itemid}.zip" tmpPath = QDir.cleanPath(os.path.join(tmpDir, filename)) loop = QEventLoop() self.downloader = QgsFileDownloader(QUrl(url), tmpPath) self.downloader.downloadProgress.connect(self.update_progress) self.downloader.downloadCompleted.connect(self.download_finished) self.downloader.downloadCompleted.connect( partial(extract_data, tmpPath, itemid)) self.downloader.downloadCanceled.connect(self.download_canceled) self.downloader.downloadExited.connect(loop.quit) loop.exec_()
def generateIsochrones(point, profile, costingOptions, intervals, colors, basename, overwrite=True): response = valhalla.isochrones(point, profile, costingOptions, intervals, colors) features = getFeaturesFromResponse(response) if costingOptions.get("shortest"): suffix = "km" else: suffix = "min" for interval, feature in zip(intervals[::-1], features): # FIXME: we should use the 'contour' property in the feature to be sure of the contour line that we are # drawing, but due to a bug in qgis json parser, this property appears to be always set to '0' layername = "{} {} - {}".format(interval, suffix, basename) try: # FIXME: we do not consider if there are several layers with the same name here existinglayer = QgsProject.instance().mapLayersByName(layername)[0] if overwrite: QgsProject.instance().removeMapLayer(existinglayer.id()) else: raise OverwriteError( tr("layer {layername} already exists and overwrite is {overwrite}" ).format(layername=layername, overwrite=overwrite)) except IndexError: LOG.debug("this layer was not found: {}".format(layername)) layer = QgsVectorLayer( "Polygon?crs=epsg:4326&field=centerx:double&field=centery:double&field=interval:double", layername, "memory", ) pr = layer.dataProvider() qgsfeature = QgsFeature() qgsfeature.setAttributes([point.x(), point.y(), interval]) qgsfeature.setGeometry(feature.geometry()) pr.addFeatures([qgsfeature]) layer.updateExtents() QgsProject.instance().addMapLayer(layer) outlineColor = QColor(0, 0, 0) # Set opacity to 40% or 66 in hex (65% transparency) fillColor = QColor("#66" + feature["color"][1:]) renderer = QgsSingleSymbolRenderer.defaultRenderer( QgsWkbTypes.PolygonGeometry) symbol = renderer.symbol() symbol.setColor(fillColor) symbol.symbolLayer(0).setStrokeColor(outlineColor) layer.setRenderer(renderer) # Add center of reachability center_point_layer_name = tr("Center of {basename}").format( basename=basename) try: existinglayer = QgsProject.instance().mapLayersByName( center_point_layer_name)[0] if overwrite: QgsProject.instance().removeMapLayer(existinglayer.id()) else: raise OverwriteError( tr("layer {layername} already exists and overwrite is {overwrite}" ).format(layername=center_point_layer_name, overwrite=overwrite)) except IndexError: LOG.debug( "this layer was not found: {}".format(center_point_layer_name)) center_point = QgsVectorLayer( "Point?crs=epsg:4326", center_point_layer_name, "memory", ) pr = center_point.dataProvider() qgsfeature = QgsFeature() qgsfeature.setGeometry(QgsGeometry.fromPointXY(point)) pr.addFeatures([qgsfeature]) # symbology path = ":/kadas/icons/pin_red" symbol = QgsSvgMarkerSymbolLayer(path) symbol.setSize(10) symbol.setVerticalAnchorPoint(QgsMarkerSymbolLayer.Bottom) center_point.renderer().symbol().changeSymbolLayer(0, symbol) QgsProject.instance().addMapLayer(center_point)
def download_canceled(self): pushWarning(tr("Download is canceled!")) LOG.debug("Download is canceled")
def func(*args, **kw): if ValhallaClient.getInstance().isAvailable(): method(*args, **kw) else: pushWarning(tr("Valhalla is not installed or it cannot be found"))
route_html_template = ( """ <table border="0" style="border-collapse: collapse; width: 100%; height: 100%;"> <tbody> <tr> <td style="width: 100%; background-color: #333f4f; text-align: center;"> <p> <img src="{icon}" alt="" width="100" height="100" style="display: block; margin-left: auto; margin-right: auto;" /> </p> <h2 style="text-align: center;"><span style="color: #ffffff;">{dist}<br/>{message}</span></h> </td> </tr> <tr> <td style="width: 100%; background-color: #adb9ca; text-align: left; font-size:12pt">""" + tr("Then") + """ <img src="{icon2}" width="32" height="32" /> {dist2}<br/> {message2}</td> </tr> <tr> <td style="width: 100%; background-color: #44546a;"> <p style="text-align: left;"> <span style="color: #ffffff; font-size:10pt">""" + tr("Speed") + """ {speed:.2f} km/h</span><br /> <span style="color: #ffffff; font-size:10pt">""" + tr("Time Left") + """ {timeleft}</span><br /> <span style="color: #ffffff; font-size:10pt">""" + tr("Dist Left") + """ {distleft}</span><br />