def exportTrack(iesGraph, track, output="file", epsgCode="4326"): #The track dictionary should already have min and max timestamps for the pings it contains ies.initialiseGraph(iesGraph=iesGraph) #Add a parent observation obs = ies.instantiate(iesGraph=iesGraph, _class=ies.observation) ies.startsIn(iesGraph=iesGraph, item=obs, timeString=track["minDateTime"].isoformat()) ies.endsIn(iesGraph=iesGraph, item=obs, timeString=track["maxDateTime"].isoformat()) measures = dict({}) #Now add the measure classes for Speed Over Ground and Course Over Ground...and knots for the Unit Of Measure measures["sogClass"] = ies.instantiate(iesGraph=iesGraph, _class=ies.classOfMeasure, instance=URIRef(ies.dataUri + "SpeedOverGround")) measures["cogClass"] = ies.instantiate(iesGraph=iesGraph, _class=ies.classOfMeasure, instance=URIRef(ies.dataUri + "CourseOverGround")) measures["knots"] = ies.instantiate(iesGraph=iesGraph, _class=ies.unitOfMeasure, instance=URIRef(ies.dataUri + "Knots")) measures["degTN"] = ies.instantiate(iesGraph=iesGraph, _class=ies.unitOfMeasure, instance=URIRef(ies.dataUri + "DegreesTrueNorth")) ies.addName(iesGraph=iesGraph, item=measures["sogClass"], nameString="Speed Over Ground") ies.addName(iesGraph=iesGraph, item=measures["cogClass"], nameString="Course Over Ground") ies.addName(iesGraph=iesGraph, item=measures["knots"], nameString="knots") ies.addName(iesGraph=iesGraph, item=measures["degTN"], nameString="degrees true North") #add the location transponder - We don't know this is necessarily a vessel. All we know is that we have a LocationTransponder. lt = ies.createLocationTransponder(iesGraph=iesGraph, mmsi=track["id"]) obsvd = ies.instantiate(iesGraph=iesGraph, _class=ies.observedTarget) ies.addToGraph(iesGraph=iesGraph, subject=obsvd, predicate=ies.ipo, obj=lt) ies.addToGraph(iesGraph=iesGraph, subject=obsvd, predicate=ies.ipi, obj=obs) #now go through the individual location observations and add those... for ping in track["pings"]: createLocationObservation(iesGraph=iesGraph, ping=ping, transponder=lt, obs=obs, measures=measures) if output == "kafka": ies.sendToKafka(iesGraph=iesGraph, kProducer=kafkaBroker, kTopic=iesKafkaTopic) else: ies.saveRdf( iesGraph, './data/track' + track["id"] + '-' + str(track["counter"]) + '.ies.ttl')
iso3166ThreeLetterCountryCode, idClass=ies.iso3166A3, idUri=URIRef("http://iso.org/iso3166-alpha3#" + iso3166ThreeLetterCountryCode + "_code")) ies.addToGraph(iesGraph, port, ies.ipao, country) sailing = ies.instantiate(iesGraph, ies.sailing) vu = ies.instantiate(iesGraph, ies.vehicleUsed) ies.addToGraph(iesGraph, vu, ies.ipo, vessel) ies.addToGraph(iesGraph, vu, ies.ipi, sailing) arrival = ies.instantiate(iesGraph, ies.arrival) ies.addToGraph(iesGraph, arrival, ies.ieo, sailing) ies.addToGraph(iesGraph, arrival, ies.il, port) ies.assessPwProbability( iesGraph, [sailing, vu, arrival], TrackAnalytics, probability, True, assessmentDT) #Add the probability of the coopering def testDestination(): predictedDestination( iesGraph, '234234000', [["Pontefract", "GB POF", "GBR", 0.5], ["Hull", "GB HUL", "GBR", 0.3], ["Ackworth", "GB AMT ", "GBR", 0.2]], "2021-08-12T09:00:00") ies.saveRdf(iesGraph, "ta-pred-dest.ttl") iesGraph = ies.initialiseGraph() TrackAnalytics = ies.createSystem( iesGraph, "TrackAnalytics", URIRef("http://trackanalytics.dstl.gov.uk/TrackAnalytics")) testCooper() #testDestination()
trackDict[mmsi]["minDateTime"] = dt if len(trackDict[mmsi]["pings"]) >= batchSize: #batch size for track has been reached, time to export a track exportTrack(graph, trackDict[mmsi], output) trackDict[mmsi]["minDateTime"] = None trackDict[mmsi]["maxDateTime"] = None trackDict[mmsi]["pings"] = [] trackDict[mmsi]["counter"] = trackDict[mmsi]["counter"] + 1 else: trackDict[mmsi] = { "id": mmsi, "pings": [row], "minDateTime": dt, "maxDateTime": dt, "counter": 0 } sleep(delay) #Set up the rdf graph graph = ies.initialiseGraph(None) #Now process the data in the database (each row comes out as a tuple) # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # MMSI, BaseDateTime, LAT, LON, SOG, COG, Heading, VesselName, IMO, CallSign, VesselType, Status, Length, Width, Draft, Cargo #The important thing here is whether or not you use Kafka. Change the global useKafka variable at the top of the script to change this. processDatabase(dbFileName=aisDB, delay=pingDelay, batchSize=trackSize, output=iesOutput)