Skip to content

Commit

Permalink
improvements towards import rdf layer
Browse files Browse the repository at this point in the history
  • Loading branch information
situx committed Sep 20, 2024
1 parent ec44111 commit c1a3f05
Show file tree
Hide file tree
Showing 8 changed files with 514 additions and 163 deletions.
6 changes: 6 additions & 0 deletions dialogs/tool/importrdflayerdialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from qgis.PyQt.QtCore import QRegExp
from qgis.PyQt.QtGui import QRegExpValidator
from ...tasks.processing.extractnamespacetask import ExtractNamespaceTask
from ...tasks.processing.extractlayertask import ExtractLayerTask

from ...util.ui.uiutils import UIUtils
from ...tasks.processing.convertcrstask import ConvertCRSTask
Expand Down Expand Up @@ -36,9 +37,14 @@ def __init__(self, triplestoreconf={}, maindlg=None, parent=None, title="Import
self.dlg = parent
self.maindlg = maindlg
self.inputRDFFileWidget.fileChanged.connect(self.extractClasses)
self.addSelectedLayersButton.clicked.connect(self.extractLayers)


def extractClasses(self,filename):
self.tsk=ExtractNamespaceTask("Extracting namespaces from "+str(filename),filename,None,self.layerSelectBox,self.prefixes,None)
QgsApplication.taskManager().addTask(self.tsk)

def extractLayers(self):
self.task=ExtractLayerTask("Extracting layers from "+str(self.inputRDFFileWidget.filePath()),self.inputRDFFileWidget.filePath(),self.layerSelectBox.checkedItemsData(),self.triplestoreconf,self.prefixes,None)
QgsApplication.taskManager().addTask(self.task)

2 changes: 1 addition & 1 deletion dialogs/ui/importrdflayer.ui
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="5" column="0" colspan="2">
<widget class="QPushButton" name="convertToRDFButton">
<widget class="QPushButton" name="addSelectedLayersButton">
<property name="text">
<string>Add Selected Layers</string>
</property>
Expand Down
71 changes: 40 additions & 31 deletions tasks/processing/extractlayertask.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,59 +5,68 @@
from qgis.PyQt.QtWidgets import QMessageBox
from rdflib import Graph, URIRef, RDF
from ...util.sparqlutils import SPARQLUtils
from ...util.layerutils import LayerUtils
from qgis.core import QgsProject, QgsVectorLayer
import json

MESSAGE_CATEGORY = 'ExtractLayerTask'

class ExtractLayerTask(QgsTask):

def __init__(self, description, graphname,toextract,triplestoreconf,resultfolder=".",prefixes=None, progress=None):
def __init__(self, description, graphname,toextract,triplestoreconf,prefixes=None, progress=None):
super().__init__(description, QgsTask.CanCancel)
self.exception = None
self.progress = progress
self.graphname = graphname
self.prefixes=resultfolder
self.prefixes=prefixes
self.triplestoreconf=triplestoreconf
self.toextract=toextract
self.layers=[]
QgsMessageLog.logMessage(str(self.toextract),
MESSAGE_CATEGORY, Qgis.Info)
QgsMessageLog.logMessage(str(self.graphname),
MESSAGE_CATEGORY, Qgis.Info)


def run(self):
def run(self):
try:
g = Graph()
g.parse(self.graphname, format="ttl")
namespacetosub = {}
for toex in self.toextract:
for sub in g.subjects(None, RDF.type, URIRef(toex)):
for predobj in sub.predicate_objects():

ns = SPARQLUtils.instanceToNS(sub)
if self.prefixes is not None and "reversed" in self.prefixes and ns in self.prefixes["reversed"]:
self.recognizedns.add(ns)
else:
self.namespaces.add(ns)
if ns not in namespacetosub:
namespacetosub[ns] = set()
namespacetosub[ns].add(sub)
res = self.identifyDataClasses(g, namespacetosub)
self.nstodataclass = res["nsd"]
self.classset = res["clsset"]
return True
except Exception as e:
self.exception = e
return False
#try:
g = Graph()
g.parse(self.graphname, format="ttl")
for toex in self.toextract:
if "owl" not in str(toex) and "rdf" not in str(toex):
QgsMessageLog.logMessage(str(toex),
MESSAGE_CATEGORY, Qgis.Info)
layergraph = Graph()
for sub in g.subjects(RDF.type, URIRef(toex),True):
QgsMessageLog.logMessage(str(sub),
MESSAGE_CATEGORY, Qgis.Info)
for trip in g.triples((sub,None,None)):
layergraph.add(trip)
res=LayerUtils.subGraphToLayer(layergraph,False, self.triplestoreconf, True, False)
#QgsMessageLog.logMessage(str(res[0]), MESSAGE_CATEGORY, Qgis.Info)
self.layers.append(QgsVectorLayer(json.dumps(res[0], sort_keys=True), "unicorn_" + str(SPARQLUtils.labelFromURI(str(toex))), "ogr"))
return True
#except Exception as e:
# self.exception = e
# QgsMessageLog.logMessage(str(e),
# MESSAGE_CATEGORY, Qgis.Info)
# return False
return True

def finished(self, result):
self.progress.close()
#self.progress.close()
if result:
iface.messageBar().pushMessage("Exported layer successfully to " + str(self.filename[0]) + "!", "OK",
level=Qgis.Success)
QgsMessageLog.logMessage(str(len(self.layers)),
MESSAGE_CATEGORY, Qgis.Info)
for layer in self.layers:
QgsProject.instance().addMapLayer(layer)
iface.messageBar().pushMessage("Successfully extracted layers from "+str(self.graphname)+"!", "OK",level=Qgis.Success)
msgBox = QMessageBox()
msgBox.setText("Layer converted to and saved as "+str(self.filename[0]))
msgBox.setText("Layer extracted from "+str(self.graphname))
msgBox.exec()
else:
msgBox = QMessageBox()
msgBox.setText("An error occurred while converting the layer converted to "+str(self.filename[0]))
msgBox.setText("An error occurred while extracting layers from "+str(self.graphname))
msgBox.exec()


7 changes: 3 additions & 4 deletions util/export/layer/layerexporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ def layerToTTLString(layer, prefixes, vocab="GeoSPARQL", literaltype=["WKT"], ur
# MESSAGE_CATEGORY, Qgis.Info)
# QgsMessageLog.logMessage("FIELDNAMES: "+str(vocab),
# MESSAGE_CATEGORY, Qgis.Info)
ttlstring = set()
graph=Graph()
first = 0
if exportNameSpace is None or exportNameSpace == "":
Expand Down Expand Up @@ -116,7 +115,7 @@ def layerToTTLString(layer, prefixes, vocab="GeoSPARQL", literaltype=["WKT"], ur
"_")),URIRef("http://www.opengis.net/ont/crs/asProj"),Literal(str(
layercrs.toProj4()).replace("\"", "\\\""),datatype="http://www.opengis.net/ont/crs/proj4Literal")))
ccrs = ConvertCRS()
ttlstring = ccrs.convertCRSFromWKTStringSet(layercrs.toWkt(), ttlstring)
graph = ccrs.convertCRSFromWKTStringSet(layercrs.toWkt(), graph)
init = True
for f in layer.getFeatures():
geom = f.geometry()
Expand All @@ -133,7 +132,7 @@ def layerToTTLString(layer, prefixes, vocab="GeoSPARQL", literaltype=["WKT"], ur
graph.add((URIRef(str(curclassid)), RDFS.type, OWL.Class))
else:
curclassid = f["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
graph = LayerUtils.exportGeometryType(curid, geom, vocab, literaltype, init, ttlstring)
graph = LayerUtils.exportGeometryType(curid, geom, vocab, literaltype, init, graph)
if init:
init = False
fieldcounter = -1
Expand Down Expand Up @@ -229,7 +228,7 @@ def layerToTTLString(layer, prefixes, vocab="GeoSPARQL", literaltype=["WKT"], ur
graph.add((URIRef(prop), RDFS.range, XSD.string))
if first < 10:
first = first + 1
return ccrs.ttlhead + "".join(ttlstring)
return graph


@staticmethod
Expand Down
Loading

0 comments on commit c1a3f05

Please sign in to comment.