Soy bastante nuevo en Python y QGIS pero estoy tratando de crear un algoritmo para un plugin de procesamiento que importará un CSV de IDs de Tweets. Luego los hidrata usando la librería Twarc de Python para obtener un CSV con metadatos extraídos de Twitter, y luego crear puntos a partir de sus coordenadas en el CSV. He llegado bastante lejos pero ahora he llegado a un muro.
Cuando ejecuto el script de mi plugin de procesamiento, QGIS se bloquea completamente y no da ningún mensaje de error. El último error que tuve fue un error que tiene que ver con QFileDialog así que sospecho que tiene que ver con eso, pero quitarlo sigue haciendo que QGIS se cuelgue.
Desgraciadamente, también forma parte de un proyecto importante para la universidad que debe presentarse dentro de dos días, y el personal docente no es demasiado servicial.
¿Tiene algún consejo específicamente con QGIS estrellarse debido a la secuencia de comandos, o en el código en general?
Estoy usando mac OS con QGIS 3.20 Odense.
Mi guión:
#importing the modules I think I need
from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import *
from twarc.client2 import Twarc2, expansions
import json
from twarc_csv import CSVConverter
from qgis.core import QgsCoordinateReferenceSystem
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QApplication, QFileDialog
class HydrateGeoTweetsAlgorithm(QgsProcessingAlgorithm):
#processing boilerplate
OUTPUT = 'OUTPUT'
INPUT = 'INPUT'
def initAlgorithm(self, config):
#importing csv of tweet IDs
self.addParameter(
QgsProcessingParameterFile(
self.INPUT,
self.tr('Input file')
)
)
#output point layer
self.addParameter(
QgsProcessingParameterFeatureSink(
self.OUTPUT,
self.tr('Output layer')
)
)
def processAlgorithm(self, parameters, context, feedback):
#asking user to specify a file to input
qfd = QFileDialog()
title = 'Open File'
path = "/Users/"
tweet_ids = QFileDialog.getOpenFileName(qfd, title, path)
#token you need to request from twitter API
t = Twarc2(bearer_token="")
#iterating over csv using twarc to hydrate each tweet ID
lookup = t.tweet_lookup(tweet_ids=tweet_ids)
for page in lookup:
result = expansions.flatten(page)
with open("results.jsonl", "w+") as f:
f.write(json.dumps(page) + "\n")
#converting jsonl to csv to get coordinates
with open("results.jsonl", "r") as infile:
with open("output.csv", "w") as outfile:
convert = CSVConverter(infile, outfile, json_encode_all=False, json_encode_lists=True, json_encode_text=False, inline_referenced_tweets=True, allow_duplicates=False, batch_size=1000)
convert.process()
#plotting points based on coordinates
for tweet in convert:
if tweet["geo.coordinates.coordinates"]:
processing.run("native:createpointslayerfromtable",
{'INPUT':'output.csv',
'XFIELD':'cooridnates[1]',
'YFIELD':'cooridnates[0]',
'ZFIELD':'',
'MFIELD':'',
'TARGET_CRS':QgsCoordinateReferenceSystem(''),
'OUTPUT':'\\Users\\tweet_points.shp'})
return QgsMapLayerRegistry.instance().addMapLayers([tweet_points.shp])
#other processing boilerplate
def name(self):
return 'Hydrate and plot tweets'
def displayName(self):
return self.tr(self.name())
def group(self):
return self.tr(self.groupId())
def groupId(self):
return ''
def tr(self, string):
return QCoreApplication.translate('Processing', string)
def createInstance(self):
return HydrateGeoTweetsAlgorithm()