def run(self) -> str: """Run the query. :return: The result of the query. :rtype: str :raise OverpassBadRequestException: :raise NetWorkErrorException: :raise OverpassTimeoutException: """ self.download() for message in self.errors: self.is_query_timed_out(message) self.too_many_request(message) self.is_bad_request(message) LOGGER.error(message) if len(self.errors): raise NetWorkErrorException('Overpass API', ', '.join(self.errors)) osm_file = QFileInfo(self.result_path) if not osm_file.exists() and not osm_file.isFile(): # Do not raise a QuickOSM exception here # It must be a bug from QuickOSM raise FileNotFoundError self.check_file(self.result_path) # Everything went fine return self.result_path
def query(self, query): """ Perform a nominatim query @param query: Query to execute @type query: str @raise NetWorkErrorException @return: the result of the query @rtype: str """ url_query = QUrl(self.__url) query = QUrl.toPercentEncoding(query) url_query.addEncodedQueryItem('q', query) url_query.addQueryItem('info', 'QgisQuickOSMPlugin') request = QNetworkRequest(url_query) request.setRawHeader("User-Agent", "QuickOSM") self.network_reply = self.network.get(request) self.loop = QEventLoop() self.network.finished.connect(self._end_of_request) self.loop.exec_() if self.network_reply.error() == QNetworkReply.NoError: return json.loads(self.data) else: raise NetWorkErrorException(suffix="Nominatim API")
def query(self, query): """ Make a query to the overpass @param query:Query to execute @type query:str @raise OverpassBadRequestException,NetWorkErrorException, OverpassTimeoutException @return: the result of the query @rtype: str """ url_query = QUrl(self.__url + 'interpreter') # The output format can be forced (JSON or XML) if self.__output: query = re.sub(r'output="[a-z]*"', 'output="' + self.__output + '"', query) query = re.sub(r'\[out:[a-z]*', '[out:' + self.__output, query) # noinspection PyCallByClass # encoded_query = QUrl.toPercentEncoding(query) query_string = QUrlQuery() query_string.addQueryItem('data', query) query_string.addQueryItem('info', 'QgisQuickOSMPlugin') url_query.setQuery(query_string) request = QNetworkRequest(url_query) # request.setRawHeader("User-Agent", "QuickOSM") self.network_reply = self.network.get(request) self.loop = QEventLoop() self.network.finished.connect(self._end_of_request) self.loop.exec_() if self.network_reply.error() == QNetworkReply.NoError: file_obj = codecs.open(self.result_path, 'r', 'utf-8') file_obj.seek(0, 2) fsize = file_obj.tell() file_obj.seek(max(fsize - 1024, 0), 0) lines = file_obj.readlines() lines = lines[-10:] # Get last 10 lines timeout = '<remark> runtime error: Query timed out in "[a-z]+" ' \ 'at line [\d]+ after ([\d]+) seconds. </remark>' if re.search(timeout, ''.join(lines)): raise OverpassTimeoutException else: return self.result_path elif self.network_reply.error() == QNetworkReply.UnknownContentError: raise OverpassBadRequestException else: raise NetWorkErrorException(suffix="Overpass OSM API")
def query(self, query): """ Make a query to the overpass @param query:Query to execute @type query:str @raise OverpassBadRequestException,NetWorkErrorException, OverpassTimeoutException @return: the result of the query @rtype: str """ url_query = QUrl(self.__url + 'interpreter') # The output format can be forced (JSON or XML) if self.__output: query = re.sub(r'output="[a-z]*"', 'output="' + self.__output + '"', query) query = re.sub(r'\[out:[a-z]*', '[out:' + self.__output, query) # noinspection PyCallByClass encoded_query = QUrl.toPercentEncoding(query) url_query.addEncodedQueryItem('data', encoded_query) url_query.addQueryItem('info', 'QgisQuickOSMPlugin') url_query.setPort(80) proxy = get_proxy() if proxy: self.network.setProxy(proxy) request = QNetworkRequest(url_query) request.setRawHeader("User-Agent", "QuickOSM") self.network_reply = self.network.get(request) self.loop = QEventLoop() self.network.finished.connect(self._end_of_request) self.loop.exec_() if self.network_reply.error() == QNetworkReply.NoError: timeout = '<remark> runtime error: Query timed out in "[a-z]+" ' \ 'at line [\d]+ after ([\d]+) seconds. </remark>' if re.search(timeout, self.data): raise OverpassTimeoutException else: return self.data elif self.network_reply.error() == QNetworkReply.UnknownContentError: raise OverpassBadRequestException else: raise NetWorkErrorException(suffix="Overpass API")
def query(self, query): """ Make a query to the xapi @param query:Query to execute @type query:str @raise Exception : Bad, should be a ExceptionQuickOSM @return: the result of the query @rtype: str """ query = query.encode('utf8') url_query = self.__url + query try: data = urllib2.urlopen(url=url_query).read() except urllib2.HTTPError: raise NetWorkErrorException(suffix="XAPI") return data
def run(self): """Run the query. @raise OverpassBadRequestException,NetWorkErrorException, OverpassTimeoutException @return: The result of the query. @rtype: str """ loop = QEventLoop() downloader = QgsFileDownloader( self._url, self.result_path, delayStart=True) downloader.downloadExited.connect(loop.quit) downloader.downloadError.connect(self.error) downloader.downloadCanceled.connect(self.canceled) downloader.downloadCompleted.connect(self.completed) downloader.startDownload() loop.exec_() for message in self.errors: self.is_query_timed_out(message) self.is_bad_request(message) LOGGER.error(message) if len(self.errors): raise NetWorkErrorException('Overpass API', ', '.join(self.errors)) osm_file = QFileInfo(self.result_path) if not osm_file.exists() and not osm_file.isFile(): # Do not raise a QuickOSM exception here # It must be a bug from QuickOSM raise FileNotFoundError self.check_file(self.result_path) # Everything went fine return self.result_path
def error(messages): for msg in messages: LOGGER.error(msg) raise NetWorkErrorException(msg)
def error(messages): for message in messages: LOGGER.error(message) raise NetWorkErrorException('Nominatim API', ', '.join(messages))
def error(self, messages: str): """Display the status in logger""" for message in messages: LOGGER.error(message) raise NetWorkErrorException('Nominatim API', ', '.join(messages))