From 2958704b3b4e5bb11a6e37b36b3481761572e84d Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Sun, 17 Jan 2021 10:41:30 +0100 Subject: [PATCH 1/4] logical-source: implement Web of Things data retrieval adds Private Security Data reading, Web of Things Web API access, Web API custom header authentication --- src/main/java/be/ugent/rml/NAMESPACES.java | 5 + src/main/java/be/ugent/rml/Utils.java | 31 +- .../be/ugent/rml/access/AccessFactory.java | 69 + .../java/be/ugent/rml/access/WoTAccess.java | 85 + src/main/java/be/ugent/rml/cli/Main.java | 25 + .../java/be/ugent/rml/Mapper_WoT_Test.java | 81 + src/test/java/be/ugent/rml/TestCore.java | 61 + .../web-of-things/essence/iot-sensors.json | 12196 ++++++++++++++++ .../web-of-things/essence/mapping.ttl | 87 + .../web-of-things/essence/out-local-file.nq | 340 + .../essence/out-sparql-endpoint.nq | 340 + .../essence/private-security-data.ttl | 7 + 12 files changed, 13326 insertions(+), 1 deletion(-) create mode 100644 src/main/java/be/ugent/rml/access/WoTAccess.java create mode 100644 src/test/java/be/ugent/rml/Mapper_WoT_Test.java create mode 100644 src/test/resources/web-of-things/essence/iot-sensors.json create mode 100644 src/test/resources/web-of-things/essence/mapping.ttl create mode 100644 src/test/resources/web-of-things/essence/out-local-file.nq create mode 100644 src/test/resources/web-of-things/essence/out-sparql-endpoint.nq create mode 100644 src/test/resources/web-of-things/essence/private-security-data.ttl diff --git a/src/main/java/be/ugent/rml/NAMESPACES.java b/src/main/java/be/ugent/rml/NAMESPACES.java index a2aaa962..dd7fb96a 100644 --- a/src/main/java/be/ugent/rml/NAMESPACES.java +++ b/src/main/java/be/ugent/rml/NAMESPACES.java @@ -22,4 +22,9 @@ public class NAMESPACES { public static final String VOID = "http://rdfs.org/ns/void#"; public static final String XSD = "http://www.w3.org/2001/XMLSchema#"; public static final String CSVW = "http://www.w3.org/ns/csvw#"; + public static final String TD = "https://www.w3.org/2019/wot/td#"; + public static final String HCTL = "https://www.w3.org/2019/wot/hypermedia#"; + public static final String HTV = "http://www.w3.org/2011/http#"; + public static final String WOTSEC = "https://www.w3.org/2019/wot/security#"; + public static final String RMLP = "http://semweb.mmlab.be/ns/rmlp#"; } diff --git a/src/main/java/be/ugent/rml/Utils.java b/src/main/java/be/ugent/rml/Utils.java index ded3aaa3..fc6e8bb4 100644 --- a/src/main/java/be/ugent/rml/Utils.java +++ b/src/main/java/be/ugent/rml/Utils.java @@ -68,8 +68,12 @@ public static InputStream getInputStreamFromLocation(String location) throws IOE } public static InputStream getInputStreamFromLocation(String location, File basePath, String contentType) throws IOException { + return getInputStreamFromLocation(location, basePath, contentType, new HashMap()); + } + + public static InputStream getInputStreamFromLocation(String location, File basePath, String contentType, HashMap headers) throws IOException { if (isRemoteFile(location)) { - return getInputStreamFromURL(new URL(location), contentType); + return getInputStreamFromURL(new URL(location), contentType, headers); } else { return getInputStreamFromFile(getFile(location, basePath)); } @@ -186,6 +190,31 @@ public static InputStream getInputStreamFromURL(URL url, String contentType) { return inputStream; } + public static InputStream getInputStreamFromURL(URL url, String contentType, HashMap headers) { + InputStream inputStream = null; + try { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoOutput(true); + connection.setInstanceFollowRedirects(false); + connection.setRequestMethod("GET"); + connection.setRequestProperty("Accept", contentType); + // Set encoding if not set before + if(!headers.containsKey("charset")) { + headers.put("charset", "utf-8"); + } + // Apply all headers + headers.forEach((name, value) -> { + logger.debug(name + ": " + value); + connection.setRequestProperty(name, value); + }); + connection.connect(); + inputStream = connection.getInputStream(); + } catch (IOException ex) { + ex.printStackTrace(); + } + return inputStream; + } + public static InputStream getInputStreamFromFile(File file) throws FileNotFoundException { return new FileInputStream(file); } diff --git a/src/main/java/be/ugent/rml/access/AccessFactory.java b/src/main/java/be/ugent/rml/access/AccessFactory.java index 50fab061..c58c3373 100644 --- a/src/main/java/be/ugent/rml/access/AccessFactory.java +++ b/src/main/java/be/ugent/rml/access/AccessFactory.java @@ -8,7 +8,10 @@ import be.ugent.rml.term.NamedNode; import be.ugent.rml.term.Term; import org.apache.commons.lang.NotImplementedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.HashMap; import java.util.List; import static be.ugent.rml.Utils.isRemoteFile; @@ -20,6 +23,7 @@ public class AccessFactory { // The path used when local paths are not absolute. private String basePath; + private static final Logger logger = LoggerFactory.getLogger(AccessFactory.class); /** * The constructor of the AccessFactory. @@ -103,6 +107,71 @@ public Access getAccess(Term logicalSource, QuadStore rmlStore) { access = new LocalFileAccess(value, this.basePath); } + break; + case NAMESPACES.TD + "PropertyAffordance": + HashMap headers = new HashMap(); + + Term thing = Utils.getSubjectsFromQuads(rmlStore.getQuads(null, new NamedNode(NAMESPACES.TD + "hasPropertyAffordance"), source)).get(0); + + List form = Utils.getObjectsFromQuads(rmlStore.getQuads(source, new NamedNode(NAMESPACES.TD + "hasForm"), null)); + List targets = Utils.getObjectsFromQuads(rmlStore.getQuads(form.get(0), new NamedNode(NAMESPACES.HCTL + "hasTarget"), null)); + List contentTypes = Utils.getObjectsFromQuads(rmlStore.getQuads(form.get(0), new NamedNode(NAMESPACES.HCTL + "forContentType"), null)); + List headerList = Utils.getObjectsFromQuads(rmlStore.getQuads(form.get(0), new NamedNode(NAMESPACES.HTV + "headers"), null)); + + // Security schema & data + List securityConfiguration = Utils.getObjectsFromQuads(rmlStore.getQuads(thing, new NamedNode(NAMESPACES.TD + "hasSecurityConfiguration"), null)); + logger.warn("Security config: " + securityConfiguration.toString()); + for (Term sc: securityConfiguration) { + // TODO: support more security configurations + List securityIn = Utils.getObjectsFromQuads(rmlStore.getQuads(sc, new NamedNode(NAMESPACES.WOTSEC + "in"), null)); + List securityName = Utils.getObjectsFromQuads(rmlStore.getQuads(sc, new NamedNode(NAMESPACES.WOTSEC + "name"), null)); + List securityValue = Utils.getObjectsFromQuads(rmlStore.getQuads(sc, new NamedNode(NAMESPACES.RMLP + "token"), null)); + logger.warn("In: " + securityIn.toString()); + logger.warn("Name: " + securityName.toString()); + logger.warn("Value: " + securityValue.toString()); + try { + switch (securityIn.get(0).getValue()) { + case "header": { + logger.warn ("Applying security configuration of " + sc.getValue() + "in header"); + logger.warn("Name: " + securityName.get(0).getValue()); + logger.warn("Value: " + securityValue.get(0).getValue()); + headers.put(securityName.get(0).getValue(), securityValue.get(0).getValue()); + break; + } + case "query": + case "body": + case "cookie": + default: + throw new NotImplementedException(); + } + } + catch (IndexOutOfBoundsException e) { + logger.warn ("Unable to apply security configuration for " + sc.getValue()); + } + } + + if (targets.isEmpty()) { + throw new Error("No target found for TD Thing"); + } + + // TODO: determine which protocol is used to know which vocabulary is needed for the protocol specific part. + String target = targets.get(0).getValue(); + String contentType = contentTypes.isEmpty()? null: contentTypes.get(0).getValue(); + + // Retrieve HTTP headers + for (Term h: headerList) { + try { + logger.debug(h.toString()); + List headerName = Utils.getObjectsFromQuads(rmlStore.getQuads(h, new NamedNode(NAMESPACES.HTV + "fieldName"), null)); + List headerValue = Utils.getObjectsFromQuads(rmlStore.getQuads(h, new NamedNode(NAMESPACES.HTV + "fieldValue"), null)); + headers.put(headerName.get(0).getValue(), headerValue.get(0).getValue()); + } + catch(IndexOutOfBoundsException e) { + logger.warn("Unable to retrieve header name and value for " + h.getValue()); + continue; + } + }; + access = new WoTAccess(target, contentType, headers); break; default: throw new NotImplementedException(); diff --git a/src/main/java/be/ugent/rml/access/WoTAccess.java b/src/main/java/be/ugent/rml/access/WoTAccess.java new file mode 100644 index 00000000..ff4e3453 --- /dev/null +++ b/src/main/java/be/ugent/rml/access/WoTAccess.java @@ -0,0 +1,85 @@ +package be.ugent.rml.access; + +import be.ugent.rml.Utils; +import org.apache.jena.tdb.store.Hash; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import static be.ugent.rml.Utils.getHashOfString; +import static be.ugent.rml.Utils.getInputStreamFromURL; + +public class WoTAccess implements Access { + + private static final Logger logger = LoggerFactory.getLogger(WoTAccess.class); + private String location; + private String contentType; + private HashMap headers; + + /** + * This constructor of WoTAccess taking location and content type as arguments. + * @param location the location of the WoT Thing. + * @param contentType the content type of the WoT Thing. + */ + public WoTAccess (String location, String contentType, HashMap headers) { + this.location = location; + this.contentType = contentType; + this.headers = headers; + logger.debug("Created WoTAccess:\n\tlocation:" + this.location + "\n\tcontent-type:" + this.contentType); + logger.debug(headers.toString()); + headers.forEach((name, value) -> { + logger.debug("Header: " + name + ": " + value); + }); + } + + @Override + public InputStream getInputStream() throws IOException { + return getInputStreamFromURL(new URL(location), contentType, headers); + } + + /** + * This methods returns the datatypes of the WoT Thing. + * This method always returns null, because the datatypes can't be determined from a WoT Thing for the moment. + * @return the datatypes of the file. + */ + @Override + public Map getDataTypes() { + return null; + } + + @Override + public boolean equals(Object o) { + if (o instanceof WoTAccess) { + WoTAccess access = (WoTAccess) o; + return location.equals(access.getLocation()) && contentType.equals(access.getContentType()); + } else { + return false; + } + } + + @Override + public int hashCode() { + return getHashOfString(getLocation() + getContentType()); + } + + /** + * The method returns the location of the remote file. + * @return the location. + */ + public String getLocation() { + return location; + } + + /** + * This method returns the content type of the remote file. + * @return the content type. + */ + public String getContentType() { + return contentType; + } +} \ No newline at end of file diff --git a/src/main/java/be/ugent/rml/cli/Main.java b/src/main/java/be/ugent/rml/cli/Main.java index eafbef5a..17ac8471 100644 --- a/src/main/java/be/ugent/rml/cli/Main.java +++ b/src/main/java/be/ugent/rml/cli/Main.java @@ -51,6 +51,13 @@ public static void main(String[] args, String basePath) { .desc("one or more mapping file paths and/or strings (multiple values are concatenated). " + "r2rml is converted to rml if needed using the r2rml arguments.") .build(); + Option privateSecurityDataOption = Option.builder("psd") + .longOpt("privatesecuritydata") + .hasArg() + .numberOfArgs(Option.UNLIMITED_VALUES) + .desc("one or more private security files containing all private security information such as " + + "usernames, passwords, certificates, etc.") + .build(); Option outputfileOption = Option.builder("o") .longOpt("outputfile") .hasArg() @@ -116,6 +123,7 @@ public static void main(String[] args, String basePath) { .build(); options.addOption(mappingdocOption); + options.addOption(privateSecurityDataOption); options.addOption(outputfileOption); options.addOption(functionfileOption); options.addOption(removeduplicatesOption); @@ -180,6 +188,23 @@ public static void main(String[] args, String basePath) { System.exit(1); } + // Private security data is optionally + if (lineArgs.hasOption("psd")) { + // Read the private security data. + String[] mOptionValuePrivateSecurityData = getOptionValues(privateSecurityDataOption, lineArgs, configFile); + List lisPrivateSecurityData = Arrays.stream(mOptionValuePrivateSecurityData) + .map(Utils::getInputStreamFromFileOrContentString) + .collect(Collectors.toList()); + InputStream isPrivateSecurityData = new SequenceInputStream(Collections.enumeration(lisPrivateSecurityData)); + try { + rmlStore.read(isPrivateSecurityData, null, RDFFormat.TURTLE); + } catch (RDFParseException e) { + logger.debug(e.getMessage()); + logger.error(fatal, "Unable to parse private security data as Turtle. Does the file exist and is it valid Turtle?"); + System.exit(1); + } + } + // Convert mapping file to RML if needed. MappingConformer conformer = new MappingConformer(rmlStore, mappingOptions); diff --git a/src/test/java/be/ugent/rml/Mapper_WoT_Test.java b/src/test/java/be/ugent/rml/Mapper_WoT_Test.java new file mode 100644 index 00000000..32c4ecf1 --- /dev/null +++ b/src/test/java/be/ugent/rml/Mapper_WoT_Test.java @@ -0,0 +1,81 @@ +package be.ugent.rml; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; +import org.junit.Test; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import static org.junit.Assert.fail; + +public class Mapper_WoT_Test extends TestCore { + @Test + public void evaluate_essence() throws IOException { + HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); + server.createContext("/trashcans", new Mapper_WoT_Test.TrashCansFileHandler()); + server.setExecutor(null); // creates a default executor + server.start(); + + HashMap outPaths = new HashMap(); + outPaths.put("local-file", "./web-of-things/essence/out-local-file.nq"); + outPaths.put("sparql-endpoint", "./web-of-things/essence/out-sparql-endpoint.nq"); + doMapping("./web-of-things/essence/mapping.ttl", outPaths, "./web-of-things/essence/private-security-data.ttl"); + } + + static class TrashCansFileHandler implements HttpHandler { + @Override + public void handle(HttpExchange t) throws IOException { + String response = "couldn't load trashcan JSON file"; + try { + response = Utils.fileToString(Utils.getFile("./web-of-things/essence/iot-sensors.json")); + } catch (IOException ex) { + ex.printStackTrace(); + } + List contentType = new ArrayList<>(); + contentType.add("application/json"); + List key = t.getRequestHeaders().get("apikey"); + + // Check API key + try { + if (key.get(0).equals("123456789")) { + t.getResponseHeaders().put("Content-Type", contentType); + t.sendResponseHeaders(200, response.length()); + OutputStream os = t.getResponseBody(); + os.write(response.getBytes()); + os.close(); + } + // Wrong API key + else { + t.sendResponseHeaders(401, response.length()); + } + } + // No API key provided + catch (IndexOutOfBoundsException e) { + t.sendResponseHeaders(401, response.length()); + } + + } + } + + /*@Test + public void evaluate_compression() { + doMapping("./web-of-things/compression/mapping.ttl", "./web-of-things/compression/out.nq"); + } + + @Test + public void evaluate_encoding() { + doMapping("./web-of-things/encoding/mapping.ttl", "./web-of-things/encoding/out.nq"); + }*/ + /*@Test + public void evaluate_daiquiri() { + HashMap outPaths = new HashMap(); + outPaths.put("local-file", "./web-of-things/daiquiri/output-local-file.nq"); + doMapping("./web-of-things/daiquiri/mapping.ttl", outPaths); + }*/ +} \ No newline at end of file diff --git a/src/test/java/be/ugent/rml/TestCore.java b/src/test/java/be/ugent/rml/TestCore.java index 23861ded..f6566d25 100644 --- a/src/test/java/be/ugent/rml/TestCore.java +++ b/src/test/java/be/ugent/rml/TestCore.java @@ -12,11 +12,14 @@ import org.slf4j.LoggerFactory; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.nio.file.Path; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.junit.Assert.*; @@ -62,6 +65,30 @@ Executor createExecutor(String mapPath, List extraQuads, String parentPath new RecordsFactory(parentPath), Utils.getBaseDirectiveTurtle(mappingFile)); } + Executor createExecutorPrivateSecurityData(String mapPath, String privateSecurityDataPath) throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + // execute mapping file + URL url1 = classLoader.getResource(mapPath); + URL url2 = classLoader.getResource(privateSecurityDataPath); + + if (url1 != null) { + mapPath = url1.getFile(); + } + + if (url2 != null) { + privateSecurityDataPath = url2.getFile(); + } + + File mappingFile = new File(mapPath); + File privateSecurityDataFile = new File(privateSecurityDataPath); + QuadStore rmlStore = QuadStoreFactory.read(mappingFile); + rmlStore.read(new FileInputStream(privateSecurityDataFile), null, RDFFormat.TURTLE); + String parentPath = mappingFile.getParent(); + + return new Executor(rmlStore, + new RecordsFactory(parentPath), Utils.getBaseDirectiveTurtle(mappingFile)); + } + Executor createExecutor(String mapPath, String parentPath) throws Exception { return createExecutor(mapPath, new ArrayList<>(), parentPath); } @@ -122,6 +149,24 @@ public Executor doMapping(String mapPath, String outPath) { return null; } + /** + * This method executes a mapping with Logical Targets, compares it to the expected out, and returns the used Executor. + * @param mapPath The path of the mapping file. + * @param outPaths The paths of the files with the expected output. + * @return The Executor used to execute the mapping. + */ + public Executor doMapping(String mapPath, HashMap outPaths, String privateSecurityDataPath) { + try { + Executor executor = this.createExecutorPrivateSecurityData(mapPath, privateSecurityDataPath); + doMapping(executor, outPaths); + return executor; + } catch (Exception e) { + logger.error(e.getMessage(), e); + fail(); + } + return null; + } + /** * This method executes a mapping, compares it to the expected out, and returns the used Executor. * @param mapPath The path of the mapping file. @@ -153,6 +198,22 @@ void doMapping(Executor executor, String outPath) throws Exception { compareStores(filePathToStore(outPath), result); } + /** + * This method executes a mapping and compares with the expected output of Logical Targets. + * @param executor The Executor that is used to execute the mapping. + * @param outPaths The paths of the files with the expected output. + */ + void doMapping(Executor executor, HashMap outPaths) throws Exception { + // TODO: compare target with each output + QuadStore result = executor.execute(null); + result.removeDuplicates(); + for (Map.Entry entry: outPaths.entrySet()) { + String target = entry.getKey(); + String outPath = entry.getValue(); + compareStores(filePathToStore(outPath), result); + } + } + void doMappingExpectError(String mapPath) { ClassLoader classLoader = getClass().getClassLoader(); diff --git a/src/test/resources/web-of-things/essence/iot-sensors.json b/src/test/resources/web-of-things/essence/iot-sensors.json new file mode 100644 index 00000000..cd8ca440 --- /dev/null +++ b/src/test/resources/web-of-things/essence/iot-sensors.json @@ -0,0 +1,12196 @@ +[ + { + "id": "WasteContainer:Bigbelly:1504413", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark - herdenkingsplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-08-26T11:20:00.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T09:20:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.410527945, + 51.211220384 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-08-26T11:20:00.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1504413" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1504413", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506052", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Harmoniepark 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 1, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-17T15:35:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.410188596, + 51.201232449 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506052" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506052", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511847", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Peter De Grote Monument", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T07:50:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.394057875, + 51.214280319 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511847" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511847", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509881", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Meir - tussen Wapper en Australian Icecream - Zara", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T16:35:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.409871876, + 51.218013291 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509881" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509881", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511843", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Oever - thv nr. 26", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.4, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T18:45:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.396082275, + 51.217559961 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511843" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511843", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506048", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Squarepark Quebec", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T09:55:40.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.421580287, + 51.258251578 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506048" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506048", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509840", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gemeentepark Merksem 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-21T09:15:42.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.444532792, + 51.248259069 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509840" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509840", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506049", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "De Molen BBQ", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-13T12:50:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.388099313, + 51.235231934 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-10T07:07:06.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506049" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506049", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511834", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Park van Eeden - skatepark", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-24T11:20:51.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.396783333, + 51.162846667 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511834" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511834", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511840", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Groen Kwartier - Speelplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T23:46:06.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.421990632, + 51.203671782 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511840" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511840", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511819", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Kielpark - J. De Voslei", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T09:05:49.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.386428247, + 51.192053336 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511819" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511819", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509839", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Leysstraat - Schuin over Inno", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-06T07:50:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.412878124, + 51.218346444 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509839" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509839", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517299", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Droogdokkenpark", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-09-17T13:49:44.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T08:35:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.401517106, + 51.236164781 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517299" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517299", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511857", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Jan de Voslei - Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-21T14:25:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.387892141, + 51.190219182 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511857" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511857", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506045", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN BBQ 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:02:27.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-15T18:55:31.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.43141604, + 51.228647082 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506045" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506045", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506059", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Potvlietlaan - Berchem", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T16:30:41.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.44256344, + 51.204389939 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506059" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506059", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509834", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Meir - Bristol", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:17:25.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T07:30:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.407069524, + 51.218217905 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T13:02:26.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509834" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509834", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511842", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Munthof - Maarten Lutherplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-01T09:20:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.39657125, + 51.217101899 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511842" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511842", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506060", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Squarepark Dublin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-04-10T09:19:52.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.42260534, + 51.257327666 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506060" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506060", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517301", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Groot Schijn 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-23T08:50:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.484582604, + 51.216716559 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517301" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517301", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506072", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Villegaspark - Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-04T09:25:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.425199571, + 51.194868959 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506072" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506072", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509865", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gemeentepark Merksem 5", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-25T11:00:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.444564218, + 51.250565597 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509865" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509865", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1514804", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Bouckenborgpark - Merksem", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-28T09:05:37.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.452295, + 51.245835 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1514804" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1514804", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511820", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Runcvoortpark - Tennisveld", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-04-21T07:45:28.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.438935384, + 51.250070099 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511820" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511820", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1514799", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Sint-Andriesstraat - Picnicplaatsen", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T07:45:53.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.397323674, + 51.216443627 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1514799" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1514799", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506032", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Ellermansstraat", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:22:25.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T20:00:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.420465529, + 51.230010402 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:22:25.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506032" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506032", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506069", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark Rubenslei 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:39:34.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T09:25:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.412851099, + 51.2128571 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T15:29:32.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506069" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506069", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509867", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Speeltuin Demerstraat", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:02:27.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T09:05:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.428563325, + 51.229341957 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509867" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509867", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509880", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Waterfontein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:12:26.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:35:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.423965847, + 51.23098527 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509880" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509880", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511854", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Julius Vuylstekelaan - Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T20:00:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.380579014, + 51.228179751 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511854" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511854", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509864", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Te Boelaerpark Speelplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-04T08:30:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.454085796, + 51.199350407 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509864" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509864", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511856", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Albertpark 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-20T07:50:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.412544684, + 51.198989803 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511856" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511856", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509862", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Bremweide - kant Bischoppenhoflaan", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-24T19:50:30.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.477343256, + 51.235617625 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509862" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509862", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511823", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Runcvoortpark - hondenpark", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-22T15:25:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.441742036, + 51.247410983 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511823" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511823", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509858", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Veltwijckpark 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T07:55:47.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.423685792, + 51.277449858 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509858" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509858", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511832", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Arena - grote steen", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-15T12:15:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.460412031, + 51.20685142 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511832" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511832", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511859", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Theaterplein - voor Bar Gazet", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-10-02T10:10:19.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T16:05:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.410023338, + 51.214375787 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511859" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511859", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1504411", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark Quinten Matsijslei 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:39:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T15:45:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.41573587, + 51.214303138 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T15:34:31.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1504411" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1504411", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509847", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Nachtegalenpark - Ingang", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-30T10:40:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.408199169, + 51.183715292 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509847" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509847", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511850", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Sint-Andriesplaats", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T22:35:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.396791292, + 51.214964229 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511850" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511850", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509859", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Te Boelaerpark 4", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T09:10:35.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.452122722, + 51.200457016 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509859" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509859", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511837", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Hagelbergpark - Hondenweide", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-07T11:10:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.327200228, + 51.345012189 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511837" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511837", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509872", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gemeentepark Merksem 3", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-15T10:53:35.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.446507036, + 51.248602868 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509872" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509872", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506074", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Cadix BBQ", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T10:25:54.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.6, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.413960938, + 51.233128641 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506074" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506074", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506064", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Parkloods 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:07:25.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-09T17:41:07.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.6, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.427277682, + 51.22944655 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506064" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506064", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511846", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Lijnwaadmarkt", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T08:30:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.402282658, + 51.220609503 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511846" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511846", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509868", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gemeentepark Merksem 8", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-03-17T14:59:53.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.444677722, + 51.248891974 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509868" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509868", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506037", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Prieel 1 BBQ", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T10:45:53.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.444945938, + 51.190269426 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506037" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506037", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517304", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Groot Schijn 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-04T11:05:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.483231667, + 51.216945 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517304" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517304", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1514800", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Droogdokkenpark trap links", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T08:30:49.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.402278712, + 51.235417533 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T12:52:26.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1514800" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1514800", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506046", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark Herdenkingsbeeld", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-18T09:27:33.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 1, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-07-07T15:42:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.6, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.410533408, + 51.211209042 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:39:34.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506046" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506046", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509885", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Wapper - Rubenshuis", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T08:20:47.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.409116506, + 51.217706281 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-10T07:07:05.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509885" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509885", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509832", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Meir - Subway", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T19:10:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.412318344, + 51.218290572 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:22:25.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509832" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509832", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509866", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Den Brandt - Voorkant Kasteel", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T11:25:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.406118333, + 51.183316667 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509866" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509866", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509879", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Bremweide - kant E. Fahylaan", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-21T08:50:30.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.479910214, + 51.232547922 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509879" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509879", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509876", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Boekenbergpark-Deurnese IJsberen", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-28T11:40:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.462541769, + 51.197030218 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509876" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509876", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511824", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Sorghvliedt Park 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-24T11:20:51.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.351288676, + 51.170174704 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511824" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511824", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517303", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Groot Schijn 4", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T08:05:31.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.488195, + 51.216905 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517303" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517303", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509870", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Nachtegalenpark - Tegenover speelplaats", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T22:00:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.411829936, + 51.184843998 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509870" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509870", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509841", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gemeentepark Merksem 4", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:50:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.446454014, + 51.249476471 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509841" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509841", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506067", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Spoor Oost Noordersingel", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-08-26T11:20:00.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-04T13:00:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.447037503, + 51.222975753 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:32:25.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506067" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506067", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506043", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Prieel 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-03T14:25:35.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.4423862, + 51.188576219 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506043" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506043", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506053", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Villegaspark - Wandelpad", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T18:20:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.425333591, + 51.194325268 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506053" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506053", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509853", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Meir - hoek C&A en Australian", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T08:10:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.410463028, + 51.218039947 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509853" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509853", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511827", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Park Distelhoek", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-08T10:05:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.432177395, + 51.251642644 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511827" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511827", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1514801", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Zaha Hadidplein West", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-29T09:50:40.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.406824786, + 51.240552218 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1514801" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1514801", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506075", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Harmoniepark 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T18:20:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.410857856, + 51.201792247 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506075" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506075", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506041", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Parkloods 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:07:25.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-25T07:50:35.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.425505515, + 51.230230956 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506041" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506041", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511822", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Runcvoortpark - kiosk", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-24T11:20:51.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.441716667, + 51.247891554 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511822" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511822", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506058", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Krijgsbaan Outfort", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T11:25:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.350652135, + 51.166788371 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506058" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506058", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509856", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Nachtegalenpark - aan zitbanken", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-20T14:20:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.40686829, + 51.186913458 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509856" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509856", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511828", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Oude begraafplaats Merksem 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T11:00:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.448325634, + 51.249096632 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511828" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511828", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511831", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Steenplein, voor ponton", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:20:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.396790699, + 51.22221159 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511831" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511831", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509851", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Te Boelaerpark Midden", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T09:40:44.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.452170782, + 51.201774249 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509851" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509851", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506061", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark Quinten Matsijslei 4", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:44:34.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T15:00:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.417489974, + 51.210778671 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:44:34.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506061" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506061", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506040", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN School", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:22:25.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T07:45:54.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.421910209, + 51.230973488 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506040" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506040", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509882", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gemeentepark Merksem 6", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-15T12:18:35.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.447174295, + 51.250962437 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509882" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509882", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1514803", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gravenhof", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T08:20:47.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.348880234, + 51.176891312 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1514803" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1514803", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509874", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Boekenbergpark-The Park", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-10T08:50:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.463368211, + 51.197093209 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509874" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509874", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509850", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Theaterplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T14:50:37.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.409832629, + 51.214421273 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509850" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509850", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509875", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Jezusstraat - Glasbak", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-04T07:50:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.413084023, + 51.218586181 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509875" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509875", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509852", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Bischoppenhofpark - Oudkasteelplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T11:35:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:43:21.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.463217503, + 51.231419949 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509852" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509852", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509855", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Hof De Bist 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-01-06T13:28:21.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.442978566, + 51.282629941 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509855" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509855", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506054", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-18T09:27:33.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T15:40:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.415204689, + 51.213380352 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:49:31.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506054" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506054", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509838", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Put van Ekeren 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-31T13:25:45.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.389401667, + 51.284351667 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509838" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509838", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511830", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark Rubenslei 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:39:34.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T10:06:08.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.413134635, + 51.213079003 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T15:29:32.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511830" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511830", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509842", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Veltwijckpark 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-02T13:30:42.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.424314791, + 51.277863415 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-26T08:55:33.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509842" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509842", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509854", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Hof De Bist ingang", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-03T14:05:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.442214485, + 51.282171819 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-10T07:07:05.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509854" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509854", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509877", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Bremweide - kant Ter Heydelaan", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-12-05T11:02:24.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.6, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.472851034, + 51.230558452 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509877" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509877", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509878", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gemeentepark Merksem 7", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-10T11:35:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.446093333, + 51.249865293 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509878" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509878", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506038", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Kielpark 1 - speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:50:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.381484378, + 51.191357646 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506038" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506038", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509884", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Boekenbergpark-speelplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-28T11:35:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.462688755, + 51.197931999 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509884" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509884", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506070", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN BBQ1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:27:24.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T07:30:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.419644713, + 51.230778308 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506070" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506070", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511838", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Verdraagzaamheidsplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T07:55:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.415086205, + 51.206736551 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511838" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511838", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511848", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Mechelseplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T10:10:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.404649386, + 51.214066436 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511848" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511848", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511860", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Steytelinckpark - Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-20T09:20:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.403192876, + 51.169643462 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511860" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511860", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511829", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark Quinten Matsijslei 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:44:34.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T14:55:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.41596581, + 51.213254171 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T15:39:31.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511829" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511829", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506056", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Kielpark 2 BBQ", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T07:55:47.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.381773012, + 51.191875758 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506056" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506056", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1504410", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "SO Bar Oost", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:32:25.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-14T12:15:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.447282672, + 51.221588576 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:32:25.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1504410" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1504410", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511836", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Hagelbergpark Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-15T22:10:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.326245078, + 51.345531086 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511836" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511836", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509873", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Te Boelaerpark West", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T09:50:46.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.451033071, + 51.202408087 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509873" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509873", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506071", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Scheldewandeling - tunnel", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T09:36:06.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.387986876, + 51.220861958 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506071" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506071", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506078", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Albertpark 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T18:50:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.6, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:43:21.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.412651356, + 51.199703894 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506078" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506078", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1504429", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "SO Spoorweg", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:37:27.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-31T12:10:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.441612065, + 51.225984255 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:37:27.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1504429" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1504429", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1514802", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Zaha Hadidplein Zuid", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T21:20:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.407194169, + 51.240260351 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1514802" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1514802", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509860", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Boekenbergpark-Noord", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-19T10:45:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.464619086, + 51.200441349 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509860" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509860", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1514805", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Hoek Blauwbroekstraat - Kriekenstraat", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T09:30:42.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.401941016, + 51.226462771 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1514805" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1514805", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511852", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Hoogstraat thv frituur nr.1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T07:00:47.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.399186243, + 51.220524151 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T12:57:26.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511852" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511852", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506077", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Luchtbal BBQ", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-27T10:20:35.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.421884641, + 51.253027634 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506077" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506077", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509857", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Nachtegalenpark Brasserie Dikke Mee", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-29T10:55:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.405158494, + 51.187684951 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509857" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509857", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509883", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Bischoppenhofpark - midden", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-04T08:55:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:43:21.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.461606667, + 51.231576667 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509883" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509883", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506066", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Sloepenweg BBQ", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T09:25:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.400718496, + 51.237549866 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:37:27.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506066" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506066", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511835", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Arena - Speelplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T10:05:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.460148333, + 51.20602 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511835" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511835", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511858", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Steytelinckpark - Brug", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-20T10:55:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.403361142, + 51.169237984 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511858" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511858", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517300", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Droogdokkenpark - Brug", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-07-04T07:40:18.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-03T08:55:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.403222712, + 51.235441768 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517300" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517300", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506036", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Vis\u00e9straat", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-04-14T07:42:36.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T06:30:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.42499578, + 51.229449417 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:22:25.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506036" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506036", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509863", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Den Brandt Park - kant Della Faillelaan", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-30T09:20:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.403951667, + 51.179926667 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509863" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509863", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511833", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Fort Merksem - Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-21T09:20:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.458066667, + 51.263976667 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511833" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511833", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506063", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Halenstraat", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T08:57:26.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:46:08.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.433800389, + 51.228056589 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506063" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506063", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506068", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Krugerpark", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 1, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T11:05:38.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.440691613, + 51.216258926 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506068" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506068", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509871", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Put van Ekeren 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T07:15:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.390196458, + 51.282829385 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509871" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509871", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506057", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Harmoniepark 3", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:05:42.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.411859456, + 51.201605798 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506057" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506057", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1504414", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Quinten Matsijslei 3", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:44:34.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-03T07:45:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.416342974, + 51.212710762 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:44:34.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1504414" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1504414", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1506055", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Scheldewandeling- Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T11:40:45.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.388204952, + 51.2202285 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1506055" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1506055", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511825", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Sorghvliedt Park 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T09:15:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.3513906, + 51.169734352 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511825" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511825", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517302", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Groot Schijn 3", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-21T09:25:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.486555651, + 51.216944787 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517302" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517302", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509846", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Meir - Meirbrug aan metrohalte", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T08:30:49.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.405449193, + 51.218396817 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509846" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509846", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1504409", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "SO BBQ1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:32:25.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T15:40:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.446372062, + 51.220307638 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T14:27:27.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1504409" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1504409", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511855", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Bouckenborghpark - Ingang", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-02T09:05:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.450803864, + 51.246673432 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511855" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511855", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511821", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Runcvoortpark - Vijver", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T21:20:38.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.440605579, + 51.248531028 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511821" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511821", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511853", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Mastvest, Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-24T11:20:52.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.394934218, + 51.193517895 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511853" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511853", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509849", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Gemeentepark Merksem 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-12T10:35:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:24.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.446071463, + 51.247952818 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509849" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509849", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509848", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Den Brandt - Brug Kasteel", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-29T10:05:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.4056512, + 51.183367685 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509848" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509848", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509833", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Meir - aan Wapper - fontein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 1, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-30T16:25:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.408982819, + 51.218133297 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509833" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509833", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509869", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Deurne Bremweide - midden", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.2, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T00:25:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.478784057, + 51.233498056 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509869" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509869", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-22T06:42:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511849", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Viaduct Dam", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-11T09:17:26.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T07:50:45.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.423604339, + 51.230356832 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-01-28T10:02:24.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511849" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511849", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-01-28T10:02:24.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517312", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Steenplein 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-06T12:22:27.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:30:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.397293993, + 51.222508233 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-06T12:22:27.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517312" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517312", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:32:30.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517313", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Rode Kruisplein Deurne", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:37:26.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T07:55:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.454678333, + 51.220416667 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:37:26.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517313" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517313", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:37:26.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517311", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stella Marisstraat - School, Merksem", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:37:26.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T11:10:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.437378019, + 51.243048714 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:37:26.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517311" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517311", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:37:26.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517316", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Raoul Gregroirplein-Sportpaleis, Deurne", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:42:26.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T11:00:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.442985592, + 51.230119732 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:42:26.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517316" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517316", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:42:26.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517317", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Bredabaan Districthuis, Merksem", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-08-26T11:20:00.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:25:47.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.440821043, + 51.242215392 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:47:29.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517317" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517317", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:47:29.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517318", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Statiestraat-Station, Ekeren", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:52:31.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T00:35:49.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.433970929, + 51.281421915 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:52:31.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517318" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517318", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2018-11-26T17:52:31.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509835", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Speelweide - Ter Heydelaan", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-01-31T09:07:27.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-24T20:05:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.472521827, + 51.230831595 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-01-31T09:07:27.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509835" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509835", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-01-31T09:07:27.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517315", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Conscienceplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-05T18:32:27.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T09:15:37.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.404373959, + 51.221059582 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-05T18:32:27.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517315" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517315", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-05T18:32:27.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517305", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Maarschalk Geraardstraat-Pleintje Schemestraat", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-05T18:32:27.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T11:00:49.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.403563719, + 51.21232174 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-05T18:32:27.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517305" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517305", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-05T18:32:27.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517306", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Sint Jorispoort", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-05T18:32:27.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T17:40:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.407151905, + 51.212588278 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-06T09:32:33.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517306" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517306", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-02-05T18:32:27.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517310", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Bist", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-03-05T10:09:52.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-07-24T09:20:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-01-10T14:03:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.441183914, + 51.2825321 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-03-05T10:09:52.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517310" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + } + }, + { + "id": "WasteContainer:Bigbelly:1517314", + "type": "WasteContainer", + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T09:35:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517314" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + } + }, + { + "id": "WasteContainer:Bigbelly:1517307", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Droogdokkenpark straatkant", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-07-04T13:52:47.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-29T07:25:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:53:25.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.402770996, + 51.235972551 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-03-28T12:12:25.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517307" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517307", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-03-28T12:12:25.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517309", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Donksebeekpark - Firmin Mortierstraat", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-09T19:17:14.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-04T14:10:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.412748814, + 51.267079061 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-09T19:17:14.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517309" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517309", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-09T19:17:14.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511841", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "PSN Parkloods 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-12T11:02:10.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T06:40:42.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:03:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.427466527, + 51.229403616 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-12T11:02:10.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511841" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511841", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-12T11:02:10.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1517308", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Donksebeekpark - Pater Strackerstraat", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-09T19:17:14.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-03-05T11:14:50.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.414814115, + 51.269723339 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-09T19:17:14.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1517308" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1517308", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-04-09T19:17:14.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511826", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark Van Eyklei 1", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:29:35.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-01T09:25:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.415878952, + 51.210421601 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:29:35.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511826" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511826", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:29:35.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1511851", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark Van Eycklei 2", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:39:34.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-05T16:15:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.411337626, + 51.211059074 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-08-26T11:20:00.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1511851" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1511851", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-13T16:39:34.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1509836", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Stadspark-brug", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-19T10:07:52.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T15:25:47.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.414808178, + 51.212038402 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-19T10:07:52.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1509836" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1509836", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-06-19T10:07:52.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522192", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Valerius - Kielplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T08:49:54.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T11:10:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.376358333, + 51.191276667 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-12T09:24:46.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522192" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522192", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-12T09:24:46.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522187", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Robbedoes - Kielplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T08:44:46.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T11:00:48.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.376035504, + 51.191014122 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-12T09:24:46.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522187" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522187", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-12T09:24:46.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522191", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Shopping Center Inkom - Kielplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T08:44:45.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T11:05:41.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.376549909, + 51.190827987 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-12T09:24:47.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522191" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522191", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-12T09:24:47.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522186", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "TIR - Kielplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T08:49:54.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T11:10:38.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.376778461, + 51.191222899 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-12T09:24:46.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522186" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522186", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-12T09:24:46.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522182", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Centraal station", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:05:42.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.6, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.420431379, + 51.21759197 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522182" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522182", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522188", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Belvedere - hoek verrekijkers", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-15T08:00:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.6, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:43:20.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.400867288, + 51.235767501 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522188" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522188", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522193", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Scheldestraat speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-24T11:20:51.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:08:23.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.392750623, + 51.212068733 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522193" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522193", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:54:56.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522183", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "MAS", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:54.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.4, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-06T18:15:47.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.404866624, + 51.228105787 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:54.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522183" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522183", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:54.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522194", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Ossenmarkt", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:55.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-02-26T08:04:52.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.413420831, + 51.221824704 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:55.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522194" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522194", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:55.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522181", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Van Ertbonstraat - UGC", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:55.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T07:50:39.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T16:13:19.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.417040215, + 51.218309236 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:55.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522181" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522181", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-13T10:59:55.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522190", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Brilschanspark - Speeltuin", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:09.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-24T08:10:40.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.429424965, + 51.189107988 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:09.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522190" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522190", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:09.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522185", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Brilschanspark - Brug", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:09.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-04T07:50:36.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.429280257, + 51.191269312 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:09.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522185" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522185", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:09.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522189", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Brilschanspark - Ingang M. Auburtinlaan", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:10.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-24T14:50:42.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:48:22.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.430779373, + 51.189070025 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:10.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522189" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522189", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:50:10.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522184", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Lodewijk Van Berckenlaan - Speelplein", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:55:00.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-09-07T08:50:34.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-30T15:58:18.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.443987856, + 51.197612646 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:55:00.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522184" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522184", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2019-12-16T16:55:00.00Z" + } + } + } + }, + { + "id": "WasteContainer:Bigbelly:1522195", + "type": "WasteContainer", + "description": { + "type": "Text", + "value": "Kruispunt Jozef Van Poppel/Schotensesteenweg", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-10T07:07:05.00Z" + } + } + }, + "fillingLevel": { + "type": "Number", + "value": 0, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-08-30T09:05:33.00Z" + } + } + }, + "fullnessThreshold": { + "type": "Number", + "value": 0.8, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-10T07:07:05.00Z" + } + } + }, + "location": { + "type": "geo:json", + "value": { + "type": "Point", + "coordinates": [ + 4.481004328, + 51.225881791 + ] + }, + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-10T07:07:05.00Z" + } + } + }, + "refDevice": { + "type": "array", + "value": [ + "device-WasteContainer:Bigbelly:1522195" + ], + "metadata": {} + }, + "refWasteContainerModel": { + "type": "Text", + "value": "wastecontainermodel:bigbelly", + "metadata": {} + }, + "serialNumber": { + "type": "Text", + "value": "1522195", + "metadata": { + "timestamp": { + "type": "DateTime", + "value": "2020-06-10T07:07:05.00Z" + } + } + } + } +] diff --git a/src/test/resources/web-of-things/essence/mapping.ttl b/src/test/resources/web-of-things/essence/mapping.ttl new file mode 100644 index 00000000..d09fe15b --- /dev/null +++ b/src/test/resources/web-of-things/essence/mapping.ttl @@ -0,0 +1,87 @@ +@prefix rml: . +@prefix rr: . +@prefix ql: . +@prefix rdf: . +@prefix ex: . +@prefix td: . +@prefix htv: . +@prefix hctl: . +@prefix time: . +@prefix xsd: . +@prefix wotsec: . +@prefix formats: . +@prefix void: . +@prefix sd: . +@base . + +# API key in HTTP header +<#WotWebAPISecurity> a wotsec:APIKeySecurityScheme; + wotsec:in "header"; + wotsec:name "apikey"; +. + +<#WoTWebResource> a td:PropertyAffordance; + td:hasForm [ + # URL and content type + hctl:hasTarget "http://localhost:8000/trashcans"; + hctl:forContentType "application/json"; + # Read only + hctl:hasOperationType td:readproperty ; + # Set HTTP method and headers + htv:methodName "GET"; + htv:headers ([ + htv:fieldName "User-Agent"; + htv:fieldValue "RML Processor"; + ]); + ]; +. + +<#WoTWebAPI> a td:Thing; + td:hasPropertyAffordance <#WoTWebResource>; + td:hasSecurityConfiguration <#WotWebAPISecurity>; +. + +<#TriplesMap> a rr:TriplesMap; + rml:logicalSource [ + rml:source <#WoTWebResource>; + rml:referenceFormulation ql:JSONPath; + rml:iterator "$.[*]"; + rml:poll [ a time:GeneralDurationDescription; + time:minutes "5"^^xsd:integer; + ]; + ]; + # Local file + rml:logicalTarget [ + rml:target [ a void:Dataset; + void:dataDump ; + ]; + ]; + # SPARQL endpoint + rml:logicalTarget [ + rml:target <#SPARQLEndpoint>; + ]; + + rr:subjectMap [ + rr:template "http://example.org/bigbelly/{id}" + ]; + + rr:predicateObjectMap [ + rr:predicate ex:fillingLevel; + rr:objectMap [ + rml:reference "fillingLevel.value"; + ]; + ]; + + rr:predicateObjectMap [ + rr:predicate rdf:type; + rr:objectMap [ + rr:constant ex:Trashcan; + ]; + ]; +. + +<#SPARQLEndpoint> a sd:Service; + sd:endpoint ; + sd:supportedLanguage sd:SPARQL11Update; +. + diff --git a/src/test/resources/web-of-things/essence/out-local-file.nq b/src/test/resources/web-of-things/essence/out-local-file.nq new file mode 100644 index 00000000..3a69f945 --- /dev/null +++ b/src/test/resources/web-of-things/essence/out-local-file.nq @@ -0,0 +1,340 @@ + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "1" . + . + "0.8" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.2" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0.4" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.8" . + . + "0" . + . + "0.4" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . diff --git a/src/test/resources/web-of-things/essence/out-sparql-endpoint.nq b/src/test/resources/web-of-things/essence/out-sparql-endpoint.nq new file mode 100644 index 00000000..3a69f945 --- /dev/null +++ b/src/test/resources/web-of-things/essence/out-sparql-endpoint.nq @@ -0,0 +1,340 @@ + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "1" . + . + "0.8" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.2" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0.4" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.8" . + . + "0" . + . + "0.4" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . diff --git a/src/test/resources/web-of-things/essence/private-security-data.ttl b/src/test/resources/web-of-things/essence/private-security-data.ttl new file mode 100644 index 00000000..705958b0 --- /dev/null +++ b/src/test/resources/web-of-things/essence/private-security-data.ttl @@ -0,0 +1,7 @@ +@prefix rmlp: . +@base . + +# API key in HTTP header +<#WotWebAPISecurity> a rmlp:APISecuritydata; + rmlp:token "123456789"; +. From 7534d3aeff82bcd7a31ec7ced28bf22af92f4058 Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Sun, 17 Jan 2021 11:57:46 +0100 Subject: [PATCH 2/4] logical-source: add compression support rml:compression is used to retrieve the compression algorithm for deflating the retrieved data --- .../be/ugent/rml/access/AccessFactory.java | 10 ++++-- .../java/be/ugent/rml/access/COMPRESSION.java | 6 ++++ .../be/ugent/rml/access/LocalFileAccess.java | 26 +++++++++++++-- .../java/be/ugent/rml/Mapper_WoT_Test.java | 10 +++--- .../web-of-things/compression/mapping.ttl | 30 ++++++++++++++++++ .../web-of-things/compression/out.nq | 2 ++ .../web-of-things/compression/student.csv.gz | Bin 0 -> 43 bytes 7 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 src/main/java/be/ugent/rml/access/COMPRESSION.java create mode 100644 src/test/resources/web-of-things/compression/mapping.ttl create mode 100644 src/test/resources/web-of-things/compression/out.nq create mode 100644 src/test/resources/web-of-things/compression/student.csv.gz diff --git a/src/main/java/be/ugent/rml/access/AccessFactory.java b/src/main/java/be/ugent/rml/access/AccessFactory.java index c58c3373..158384bd 100644 --- a/src/main/java/be/ugent/rml/access/AccessFactory.java +++ b/src/main/java/be/ugent/rml/access/AccessFactory.java @@ -41,7 +41,13 @@ public AccessFactory(String basePath) { */ public Access getAccess(Term logicalSource, QuadStore rmlStore) { List sources = Utils.getObjectsFromQuads(rmlStore.getQuads(logicalSource, new NamedNode(NAMESPACES.RML + "source"), null)); + List compressions = Utils.getObjectsFromQuads(rmlStore.getQuads(logicalSource, new NamedNode(NAMESPACES.RML + "compression"), null)); Access access = null; + String compression = null; + + if(!compressions.isEmpty()) { + compression = compressions.get(0).getValue(); + } // check if at least one source is available. if (!sources.isEmpty()) { @@ -55,7 +61,7 @@ public Access getAccess(Term logicalSource, QuadStore rmlStore) { if (isRemoteFile(value)) { access = new RemoteFileAccess(value); } else { - access = new LocalFileAccess(value, this.basePath); + access = new LocalFileAccess(value, this.basePath, compression); } } else { // if not a literal, then we are dealing with a more complex description. @@ -104,7 +110,7 @@ public Access getAccess(Term logicalSource, QuadStore rmlStore) { if (isRemoteFile(value)) { access = new RemoteFileAccess(value); } else { - access = new LocalFileAccess(value, this.basePath); + access = new LocalFileAccess(value, this.basePath, null); } break; diff --git a/src/main/java/be/ugent/rml/access/COMPRESSION.java b/src/main/java/be/ugent/rml/access/COMPRESSION.java new file mode 100644 index 00000000..6052fa0a --- /dev/null +++ b/src/main/java/be/ugent/rml/access/COMPRESSION.java @@ -0,0 +1,6 @@ +package be.ugent.rml.access; + +public class COMPRESSION { + public static final String GZIP = "gzip"; + public static final String ZIP = "zip"; +} diff --git a/src/main/java/be/ugent/rml/access/LocalFileAccess.java b/src/main/java/be/ugent/rml/access/LocalFileAccess.java index 00eda2c6..cc63a4c4 100644 --- a/src/main/java/be/ugent/rml/access/LocalFileAccess.java +++ b/src/main/java/be/ugent/rml/access/LocalFileAccess.java @@ -3,7 +3,10 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.Charset; import java.util.Map; +import java.util.zip.GZIPInputStream; +import java.util.zip.ZipInputStream; import static be.ugent.rml.Utils.getHashOfString; import static be.ugent.rml.Utils.getInputStreamFromFile; @@ -16,15 +19,17 @@ public class LocalFileAccess implements Access { private String path; private String basePath; + private String compression; /** * This constructor takes the path and the base path of a file. * @param path the relative path of the file. * @param basePath the used base path. */ - public LocalFileAccess(String path, String basePath) { + public LocalFileAccess(String path, String basePath, String compression) { this.path = path; this.basePath = basePath; + this.compression = compression; } /** @@ -34,13 +39,28 @@ public LocalFileAccess(String path, String basePath) { */ @Override public InputStream getInputStream() throws IOException { + // Create File and allocate InputStream File file = new File(this.path); - if (!file.isAbsolute()) { file = getFile(this.basePath, this.path); } + InputStream in = getInputStreamFromFile(file); + + // Apply compression if necessary + if(this.compression != null) { + switch (this.compression) { + case COMPRESSION.ZIP: + in = new ZipInputStream(in); + break; + case COMPRESSION.GZIP: + in = new GZIPInputStream(in); + break; + default: + throw new IOException("Compression " + this.compression + " not implemented!"); + } + } - return getInputStreamFromFile(file); + return in; } /** diff --git a/src/test/java/be/ugent/rml/Mapper_WoT_Test.java b/src/test/java/be/ugent/rml/Mapper_WoT_Test.java index 32c4ecf1..092f9aec 100644 --- a/src/test/java/be/ugent/rml/Mapper_WoT_Test.java +++ b/src/test/java/be/ugent/rml/Mapper_WoT_Test.java @@ -63,15 +63,17 @@ public void handle(HttpExchange t) throws IOException { } } + @Test + public void evaluate_compression() { + doMapping("./web-of-things/compression/mapping.ttl", "./web-of-things/compression/out.nq"); + } + /*@Test public void evaluate_compression() { doMapping("./web-of-things/compression/mapping.ttl", "./web-of-things/compression/out.nq"); } - @Test - public void evaluate_encoding() { - doMapping("./web-of-things/encoding/mapping.ttl", "./web-of-things/encoding/out.nq"); - }*/ + */ /*@Test public void evaluate_daiquiri() { HashMap outPaths = new HashMap(); diff --git a/src/test/resources/web-of-things/compression/mapping.ttl b/src/test/resources/web-of-things/compression/mapping.ttl new file mode 100644 index 00000000..836c87e6 --- /dev/null +++ b/src/test/resources/web-of-things/compression/mapping.ttl @@ -0,0 +1,30 @@ +@prefix rr: . +@prefix foaf: . +@prefix ex: . +@prefix xsd: . +@prefix rml: . +@prefix ql: . + +@base . + + + a rr:TriplesMap; + + rml:logicalSource [ + rml:source "student.csv.gz"; + rml:referenceFormulation ql:CSV; + rml:compression "gzip"; + ]; + + rr:subjectMap [ + rr:template "http://example.com/{Name}" + ]; + + rr:predicateObjectMap [ + rr:predicate foaf:name; + rr:objectMap [ + rml:reference "Name" + ] + ]. + + diff --git a/src/test/resources/web-of-things/compression/out.nq b/src/test/resources/web-of-things/compression/out.nq new file mode 100644 index 00000000..73f40ddf --- /dev/null +++ b/src/test/resources/web-of-things/compression/out.nq @@ -0,0 +1,2 @@ + "Venus" . + diff --git a/src/test/resources/web-of-things/compression/student.csv.gz b/src/test/resources/web-of-things/compression/student.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..f0a25a02ab3e73fd5b6f2e1c47bc03ebd80423d6 GIT binary patch literal 43 zcmb2|=HS>S%96mqTwGF`lA2edmt0)N@Y(x}?^7=Cv)a1Pm>A+3Pc7qSU|;|MHDV5C literal 0 HcmV?d00001 From 856979bc9a7499bc7cc2754439de826fd864e525 Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Sun, 17 Jan 2021 18:15:11 +0100 Subject: [PATCH 3/4] logical-target: implement Logical Target support Maintain multiple stores to allow redirecting the generated triples to multiple different targets. Initially support local file dumps (VoID:Dataset + legacy file path string) and SPARQL endpoints (SD:Service) --- .gitignore | 4 +- src/main/java/be/ugent/rml/Executor.java | 60 +++- .../java/be/ugent/rml/MappingFactory.java | 17 +- src/main/java/be/ugent/rml/NAMESPACES.java | 1 + .../be/ugent/rml/PredicateObjectGraph.java | 11 +- .../rml/PredicateObjectGraphMapping.java | 6 +- .../be/ugent/rml/access/LocalFileAccess.java | 3 +- src/main/java/be/ugent/rml/cli/Main.java | 58 ++- .../java/be/ugent/rml/store/RDF4JStore.java | 3 + .../be/ugent/rml/target/LocalFileTarget.java | 142 ++++++++ .../rml/target/SPARQLEndpointTarget.java | 133 +++++++ src/main/java/be/ugent/rml/target/Target.java | 36 ++ .../be/ugent/rml/target/TargetFactory.java | 159 ++++++++ .../java/be/ugent/rml/Mapper_Compression.java | 10 + .../be/ugent/rml/Mapper_Logical_Target.java | 117 ++++++ .../java/be/ugent/rml/Mapper_WoT_Test.java | 25 +- src/test/java/be/ugent/rml/TestCore.java | 6 +- .../ugent/rml/readme/ReadmeFunctionTest.java | 3 +- .../java/be/ugent/rml/readme/ReadmeTest.java | 3 +- .../logical-target/local-file/mapping.ttl | 77 ++++ .../logical-target/local-file/out.nq | 340 ++++++++++++++++++ .../logical-target/private-security-data.ttl | 7 + .../logical-target/sparql/mapping.ttl | 82 +++++ .../logical-target/sparql/out.nq | 340 ++++++++++++++++++ 24 files changed, 1585 insertions(+), 58 deletions(-) create mode 100644 src/main/java/be/ugent/rml/target/LocalFileTarget.java create mode 100644 src/main/java/be/ugent/rml/target/SPARQLEndpointTarget.java create mode 100644 src/main/java/be/ugent/rml/target/Target.java create mode 100644 src/main/java/be/ugent/rml/target/TargetFactory.java create mode 100644 src/test/java/be/ugent/rml/Mapper_Compression.java create mode 100644 src/test/java/be/ugent/rml/Mapper_Logical_Target.java create mode 100644 src/test/resources/web-of-things/logical-target/local-file/mapping.ttl create mode 100644 src/test/resources/web-of-things/logical-target/local-file/out.nq create mode 100644 src/test/resources/web-of-things/logical-target/private-security-data.ttl create mode 100644 src/test/resources/web-of-things/logical-target/sparql/mapping.ttl create mode 100644 src/test/resources/web-of-things/logical-target/sparql/out.nq diff --git a/.gitignore b/.gitignore index e740cce3..096d3e1f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .idea -target +target/* rmlmapper.iml .DS_Store .settings @@ -8,4 +8,4 @@ rmlmapper.iml ojdbc*.jar pom-oracle.xml dependency-reduced-pom.xml -settings.xml \ No newline at end of file +settings.xml diff --git a/src/main/java/be/ugent/rml/Executor.java b/src/main/java/be/ugent/rml/Executor.java index b1710eba..76353111 100644 --- a/src/main/java/be/ugent/rml/Executor.java +++ b/src/main/java/be/ugent/rml/Executor.java @@ -6,6 +6,7 @@ import be.ugent.rml.metadata.MetadataGenerator; import be.ugent.rml.records.Record; import be.ugent.rml.records.RecordsFactory; +import be.ugent.rml.store.RDF4JStore; import be.ugent.rml.store.SimpleQuadStore; import be.ugent.rml.term.ProvenancedQuad; import be.ugent.rml.store.QuadStore; @@ -31,6 +32,7 @@ public class Executor { private HashMap> subjectCache; private QuadStore resultingQuads; private QuadStore rmlStore; + private HashMap targets; private RecordsFactory recordsFactory; private static int blankNodeCounter = 0; private HashMap mappings; @@ -52,33 +54,58 @@ public Executor(QuadStore rmlStore, RecordsFactory recordsFactory, FunctionLoade this.baseIRI = baseIRI; this.recordsHolders = new HashMap>(); this.subjectCache = new HashMap>(); + this.targets = new HashMap(); + // Legacy store for backwards compatibility if (resultingQuads == null) { this.resultingQuads = new SimpleQuadStore(); } else { this.resultingQuads = resultingQuads; } + + // Logical Target based output stores + for (Map.Entry tm: this.mappings.entrySet()) { + Term triplesMap = tm.getKey(); + Mapping mapping = tm.getValue(); + logger.debug("Initializing default QuadStore for all PredicateObjectMaps of TriplesMap: " + triplesMap); + QuadStore defaultStore = new RDF4JStore(); + this.targets.put(triplesMap, defaultStore); + for(PredicateObjectGraphMapping m: mapping.getPredicateObjectGraphMappings()) { + QuadStore store = defaultStore; + Term predicateObjectMap = m.getPredicateObjectMap(); + logger.debug("\tPredicateObjectMap:" + predicateObjectMap); + + // Check if we have a custom target for this PredicateObjectMap and override it if needed + List logicalTargets = Utils.getObjectsFromQuads(this.rmlStore.getQuads(predicateObjectMap, new NamedNode(NAMESPACES.RML + "logicalTarget"), null)); + if(!logicalTargets.isEmpty()) { + store = new RDF4JStore(); + logger.debug("\tFound Logical Target override, creating new QuadStore for this PredicateObjectMap"); + } + + this.targets.put(predicateObjectMap, store); + } + } } - public QuadStore execute(List triplesMaps, boolean removeDuplicates, MetadataGenerator metadataGenerator) throws Exception { + public HashMap execute(List triplesMaps, boolean removeDuplicates, MetadataGenerator metadataGenerator) throws Exception { BiConsumer pogFunction; if (metadataGenerator != null && metadataGenerator.getDetailLevel().getLevel() >= MetadataGenerator.DETAIL_LEVEL.TRIPLE.getLevel()) { pogFunction = (subject, pog) -> { - generateQuad(subject, pog.getPredicate(), pog.getObject(), pog.getGraph()); + generateQuad(subject, pog.getPredicate(), pog.getObject(), pog.getGraph(), pog.getPredicateObjectMap()); metadataGenerator.insertQuad(new ProvenancedQuad(subject, pog.getPredicate(), pog.getObject(), pog.getGraph())); }; } else { pogFunction = (subject, pog) -> { - generateQuad(subject, pog.getPredicate(), pog.getObject(), pog.getGraph()); + generateQuad(subject, pog.getPredicate(), pog.getObject(), pog.getGraph(), pog.getPredicateObjectMap()); }; } return executeWithFunction(triplesMaps, removeDuplicates, pogFunction); } - public QuadStore executeWithFunction(List triplesMaps, boolean removeDuplicates, BiConsumer pogFunction) throws Exception { + public HashMap executeWithFunction(List triplesMaps, boolean removeDuplicates, BiConsumer pogFunction) throws Exception { //check if TriplesMaps are provided if (triplesMaps == null || triplesMaps.isEmpty()) { triplesMaps = this.initializer.getTriplesMaps(); @@ -159,10 +186,12 @@ public QuadStore executeWithFunction(List triplesMaps, boolean removeDupli this.resultingQuads.removeDuplicates(); } - return resultingQuads; + // Add the legacy store to the list of targets as well + this.targets.put(new NamedNode("rmlmapper://legacy.store"), this.resultingQuads); + return this.targets; } - public QuadStore execute(List triplesMaps) throws Exception { + public HashMap execute(List triplesMaps) throws Exception { return this.execute(triplesMaps, false, null); } @@ -176,6 +205,7 @@ private List generatePredicateObjectGraphs(Mapping mapping ArrayList predicates = new ArrayList<>(); ArrayList poGraphs = new ArrayList<>(); poGraphs.addAll(alreadyNeededGraphs); + Term predicateObjectMap = pogMapping.getPredicateObjectMap(); if (pogMapping.getGraphMappingInfo() != null && pogMapping.getGraphMappingInfo().getTermGenerator() != null) { pogMapping.getGraphMappingInfo().getTermGenerator().generate(record).forEach(term -> { @@ -199,7 +229,7 @@ private List generatePredicateObjectGraphs(Mapping mapping if (objects.size() > 0) { //add pogs - results.addAll(combineMultiplePOGs(predicates, provenancedObjects, poGraphs)); + results.addAll(combineMultiplePOGs(predicates, provenancedObjects, poGraphs, predicateObjectMap)); } //check if we are dealing with a parentTriplesMap (RefObjMap) @@ -214,23 +244,29 @@ private List generatePredicateObjectGraphs(Mapping mapping objects = this.getAllIRIs(pogMapping.getParentTriplesMap()); } - results.addAll(combineMultiplePOGs(predicates, objects, poGraphs)); + results.addAll(combineMultiplePOGs(predicates, objects, poGraphs, predicateObjectMap)); } } return results; } - private void generateQuad(ProvenancedTerm subject, ProvenancedTerm predicate, ProvenancedTerm object, ProvenancedTerm graph) { + private void generateQuad(ProvenancedTerm subject, ProvenancedTerm predicate, ProvenancedTerm object, ProvenancedTerm graph, Term predicateObjectMap) { Term g = null; if (graph != null) { g = graph.getTerm(); } - if (subject != null && predicate != null & object != null) { + // Legacy store, used for backwards compatibility this.resultingQuads.addQuad(subject.getTerm(), predicate.getTerm(), object.getTerm(), g); + + // Logical Target based outputStores, write to target store + if (predicateObjectMap != null && this.targets.containsKey(predicateObjectMap)) { + QuadStore store = this.targets.get(predicateObjectMap); + store.addQuad(subject.getTerm(), predicate.getTerm(), object.getTerm(), g); + } } } @@ -335,7 +371,7 @@ public FunctionLoader getFunctionLoader() { return this.initializer.getFunctionLoader(); } - private List combineMultiplePOGs(List predicates, List objects, List graphs) { + private List combineMultiplePOGs(List predicates, List objects, List graphs, Term predicateObjectMap) { ArrayList results = new ArrayList<>(); if (graphs.isEmpty()) { @@ -345,7 +381,7 @@ private List combineMultiplePOGs(List pre predicates.forEach(p -> { objects.forEach(o -> { graphs.forEach(g -> { - results.add(new PredicateObjectGraph(p, o, g)); + results.add(new PredicateObjectGraph(p, o, g, predicateObjectMap)); }); }); }); diff --git a/src/main/java/be/ugent/rml/MappingFactory.java b/src/main/java/be/ugent/rml/MappingFactory.java index 7b878f6c..9a03de98 100644 --- a/src/main/java/be/ugent/rml/MappingFactory.java +++ b/src/main/java/be/ugent/rml/MappingFactory.java @@ -108,9 +108,8 @@ private void parseSubjectMap() throws Exception { predicateObjectGraphMappings.add(new PredicateObjectGraphMapping( new MappingInfo(subjectmap, predicateGenerator), new MappingInfo(subjectmap, objectGenerator), - null)); - - + null, + triplesMap)); } } else { throw new Exception(triplesMap + " has no Subject Map. Each Triples Map should have exactly one Subject Map."); @@ -133,16 +132,16 @@ private void parseObjectMapsAndShortcutsAndGeneratePOGGenerators(Term termMap, L parseObjectMapsAndShortcutsWithCallback(termMap, (oMappingInfo, childOrParent) -> { predicateMappingInfos.forEach(pMappingInfo -> { if (graphMappingInfos.isEmpty()) { - predicateObjectGraphMappings.add(new PredicateObjectGraphMapping(pMappingInfo, oMappingInfo, null)); + predicateObjectGraphMappings.add(new PredicateObjectGraphMapping(pMappingInfo, oMappingInfo, null, termMap)); } else { graphMappingInfos.forEach(gMappingInfo -> { - predicateObjectGraphMappings.add(new PredicateObjectGraphMapping(pMappingInfo, oMappingInfo, gMappingInfo)); + predicateObjectGraphMappings.add(new PredicateObjectGraphMapping(pMappingInfo, oMappingInfo, gMappingInfo, termMap)); }); } }); }, (parentTriplesMap, joinConditionFunctionExecutors) -> { predicateMappingInfos.forEach(pMappingInfo -> { - List pos = getPredicateObjectGraphMappingFromMultipleGraphMappingInfos(pMappingInfo, null, graphMappingInfos); + List pos = getPredicateObjectGraphMappingFromMultipleGraphMappingInfos(pMappingInfo, null, graphMappingInfos, termMap); pos.forEach(pogMappingInfo -> { pogMappingInfo.setParentTriplesMap(parentTriplesMap); @@ -515,15 +514,15 @@ private Term getTermType(Term map, boolean isObjectMap) { return termType; } - private List getPredicateObjectGraphMappingFromMultipleGraphMappingInfos(MappingInfo pMappingInfo, MappingInfo oMappingInfo, List gMappingInfos) { + private List getPredicateObjectGraphMappingFromMultipleGraphMappingInfos(MappingInfo pMappingInfo, MappingInfo oMappingInfo, List gMappingInfos, Term termMap) { ArrayList list = new ArrayList<>(); gMappingInfos.forEach(gMappingInfo -> { - list.add(new PredicateObjectGraphMapping(pMappingInfo, oMappingInfo, gMappingInfo)); + list.add(new PredicateObjectGraphMapping(pMappingInfo, oMappingInfo, gMappingInfo, termMap)); }); if (gMappingInfos.isEmpty()) { - list.add(new PredicateObjectGraphMapping(pMappingInfo, oMappingInfo, null)); + list.add(new PredicateObjectGraphMapping(pMappingInfo, oMappingInfo, null, termMap)); } return list; diff --git a/src/main/java/be/ugent/rml/NAMESPACES.java b/src/main/java/be/ugent/rml/NAMESPACES.java index dd7fb96a..e80ae719 100644 --- a/src/main/java/be/ugent/rml/NAMESPACES.java +++ b/src/main/java/be/ugent/rml/NAMESPACES.java @@ -27,4 +27,5 @@ public class NAMESPACES { public static final String HTV = "http://www.w3.org/2011/http#"; public static final String WOTSEC = "https://www.w3.org/2019/wot/security#"; public static final String RMLP = "http://semweb.mmlab.be/ns/rmlp#"; + public static final String FORMATS = "https://www.w3.org/ns/formats/"; } diff --git a/src/main/java/be/ugent/rml/PredicateObjectGraph.java b/src/main/java/be/ugent/rml/PredicateObjectGraph.java index b33848e3..1f147d31 100644 --- a/src/main/java/be/ugent/rml/PredicateObjectGraph.java +++ b/src/main/java/be/ugent/rml/PredicateObjectGraph.java @@ -1,22 +1,23 @@ package be.ugent.rml; import be.ugent.rml.term.ProvenancedTerm; +import be.ugent.rml.term.Term; public class PredicateObjectGraph { private ProvenancedTerm predicate; private ProvenancedTerm object; private ProvenancedTerm graph; + private Term predicateObjectMap; - public PredicateObjectGraph(ProvenancedTerm predicate, ProvenancedTerm object, ProvenancedTerm graph) { + public PredicateObjectGraph(ProvenancedTerm predicate, ProvenancedTerm object, ProvenancedTerm graph, Term predicateObjectMap) { this.predicate = predicate; this.object = object; this.graph = graph; + this.predicateObjectMap = predicateObjectMap; } - public ProvenancedTerm getPredicate() { - return predicate; - } + public ProvenancedTerm getPredicate() { return predicate; } public ProvenancedTerm getObject() { return object; @@ -25,4 +26,6 @@ public ProvenancedTerm getObject() { public ProvenancedTerm getGraph() { return graph; } + + public Term getPredicateObjectMap() { return predicateObjectMap; } } diff --git a/src/main/java/be/ugent/rml/PredicateObjectGraphMapping.java b/src/main/java/be/ugent/rml/PredicateObjectGraphMapping.java index 5d953478..2cbf1818 100644 --- a/src/main/java/be/ugent/rml/PredicateObjectGraphMapping.java +++ b/src/main/java/be/ugent/rml/PredicateObjectGraphMapping.java @@ -14,18 +14,22 @@ public class PredicateObjectGraphMapping { private final MappingInfo graphMappingInfo; private final List joinConditions; private Term parentTriplesMap; + private Term predicateObjectMap; - public PredicateObjectGraphMapping(MappingInfo predicateMappingInfo, MappingInfo objectMappingInfo, MappingInfo graphMappingInfo) { + public PredicateObjectGraphMapping(MappingInfo predicateMappingInfo, MappingInfo objectMappingInfo, MappingInfo graphMappingInfo, Term predicateObjectMap) { this.predicateMappingInfo = predicateMappingInfo; this.graphMappingInfo = graphMappingInfo; this.joinConditions = new ArrayList(); this.objectMappingInfo = objectMappingInfo; + this.predicateObjectMap = predicateObjectMap; } public Term getParentTriplesMap() { return parentTriplesMap; } + public Term getPredicateObjectMap() { return predicateObjectMap; } + public List getJoinConditions() { return joinConditions; } diff --git a/src/main/java/be/ugent/rml/access/LocalFileAccess.java b/src/main/java/be/ugent/rml/access/LocalFileAccess.java index cc63a4c4..7025a0f0 100644 --- a/src/main/java/be/ugent/rml/access/LocalFileAccess.java +++ b/src/main/java/be/ugent/rml/access/LocalFileAccess.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; +import java.util.Locale; import java.util.Map; import java.util.zip.GZIPInputStream; import java.util.zip.ZipInputStream; @@ -48,7 +49,7 @@ public InputStream getInputStream() throws IOException { // Apply compression if necessary if(this.compression != null) { - switch (this.compression) { + switch (this.compression.toLowerCase()) { case COMPRESSION.ZIP: in = new ZipInputStream(in); break; diff --git a/src/main/java/be/ugent/rml/cli/Main.java b/src/main/java/be/ugent/rml/cli/Main.java index 17ac8471..8d568ae7 100644 --- a/src/main/java/be/ugent/rml/cli/Main.java +++ b/src/main/java/be/ugent/rml/cli/Main.java @@ -1,6 +1,7 @@ package be.ugent.rml.cli; import be.ugent.rml.Executor; +import be.ugent.rml.NAMESPACES; import be.ugent.rml.Utils; import be.ugent.rml.access.DatabaseType; import be.ugent.rml.conformer.MappingConformer; @@ -11,6 +12,8 @@ import be.ugent.rml.store.QuadStore; import be.ugent.rml.store.RDF4JStore; import be.ugent.rml.store.SimpleQuadStore; +import be.ugent.rml.target.Target; +import be.ugent.rml.target.TargetFactory; import be.ugent.rml.term.NamedNode; import be.ugent.rml.term.Term; import ch.qos.logback.classic.Level; @@ -23,6 +26,7 @@ import org.eclipse.rdf4j.rio.RDFParseException; import java.io.*; +import java.nio.charset.Charset; import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -311,8 +315,9 @@ public static void main(String[] args, String basePath) { String startTimestamp = Instant.now().toString(); try { - QuadStore result = executor.execute(triplesMaps, checkOptionPresence(removeduplicatesOption, lineArgs, configFile), + HashMap targets = executor.execute(triplesMaps, checkOptionPresence(removeduplicatesOption, lineArgs, configFile), metadataGenerator); + QuadStore result = targets.get(new NamedNode("rmlmapper://legacy.store")); // Get stop timestamp for post mapping metadata String stopTimestamp = Instant.now().toString(); @@ -333,8 +338,9 @@ public static void main(String[] args, String basePath) { } result.copyNameSpaces(rmlStore); writeOutput(result, outputFile, outputFormat); + writeOutputLogicalTargets(targets, rmlStore, basePath); } catch (Exception e) { - logger.error(e.getMessage()); + e.printStackTrace(); } } } catch (ParseException exp) { @@ -346,6 +352,54 @@ public static void main(String[] args, String basePath) { } } + private static void writeOutputLogicalTargets(HashMap targets, QuadStore rmlStore, String basePath) throws Exception { + logger.debug("Writing to Logical Targets: " + targets); + TargetFactory targetFactory = new TargetFactory(basePath); + + // Go over each term and export to the Logical Target if needed + for (Map.Entry termTargetMapping: targets.entrySet()) { + Term term = termTargetMapping.getKey(); + QuadStore store = termTargetMapping.getValue(); + + if (term.getValue().equals("rmlmapper://legacy.store")) { + logger.debug("Skipping legacy store in Logical Target exporting"); + } + + logger.debug("Writing of " + term + " to Logical Targets"); + + // Check if we have a Logical Target for this TriplesMap or PredicateObjectMap: + List logicalTargets = Utils.getObjectsFromQuads(rmlStore.getQuads(term, new NamedNode(NAMESPACES.RML + "logicalTarget"), null)); + if(logicalTargets.isEmpty()) { + logger.debug(term + " has no specific Logical Targets, inheritance will be applied"); + continue; + } + + // For each Logical Target, output the accompanied store to it + for(Term lt: logicalTargets) { + logger.debug("Processing " + lt + " Logical Target export"); + Target target = targetFactory.getTarget(lt, rmlStore); + String serializationFormat = target.getSerializationFormat(); + Charset encoding = target.getEncoding(); + OutputStream outputFile = target.getOutputStream(); + + // If no encoding is available, use default encoding of the Java VM + if (encoding == null) { + encoding = Charset.defaultCharset(); + } + + // Set character encoding + Writer out = new BufferedWriter(new OutputStreamWriter(outputFile, encoding)); + + // Write store to target + store.write(out, serializationFormat); + + // Close OS resources + out.close(); + target.close(); + } + } + } + private static boolean checkOptionPresence(Option option, CommandLine lineArgs, Properties properties) { return lineArgs.hasOption(option.getOpt()) || (properties != null && properties.getProperty(option.getLongOpt()) != null diff --git a/src/main/java/be/ugent/rml/store/RDF4JStore.java b/src/main/java/be/ugent/rml/store/RDF4JStore.java index a3680069..13c1907d 100644 --- a/src/main/java/be/ugent/rml/store/RDF4JStore.java +++ b/src/main/java/be/ugent/rml/store/RDF4JStore.java @@ -133,6 +133,9 @@ public void write(Writer out, String format) throws Exception { case "nquads": Rio.write(model, out, RDFFormat.NQUADS); break; + case "ntriples": + Rio.write(model, out, RDFFormat.NTRIPLES); + break; default: throw new Exception("Serialization " + format + " not supported"); } diff --git a/src/main/java/be/ugent/rml/target/LocalFileTarget.java b/src/main/java/be/ugent/rml/target/LocalFileTarget.java new file mode 100644 index 00000000..01e6a361 --- /dev/null +++ b/src/main/java/be/ugent/rml/target/LocalFileTarget.java @@ -0,0 +1,142 @@ +package be.ugent.rml.target; + +import be.ugent.rml.access.COMPRESSION; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.Charset; +import java.util.Locale; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; + +import static org.apache.commons.io.FileUtils.getFile; + +/** + * This class represents a local file as target. + */ +public class LocalFileTarget implements Target { + + private String path; + private String basePath; + private String serializationFormat; + private Charset encoding; + private String compression; + private OutputStream outputStream; + private static final Logger logger = LoggerFactory.getLogger(LocalFileTarget.class); + + /** + * This constructor takes the path and the base path of a file. + * @param path the relative path of the file. + * @param basePath the used base path. + * @param serializationFormat serialization format to use. + * @param encoding encoding to use. + * @param compression compression to apply. + */ + public LocalFileTarget(String path, String basePath, String serializationFormat, Charset encoding, String compression) { + this.path = path; + this.basePath = basePath; + this.serializationFormat = serializationFormat; + this.encoding = encoding; + this.compression = compression; + } + + /** + * This method returns the OutputStream of the local file. + * @return an OutputStream. + * @throws IOException + */ + @Override + public OutputStream getOutputStream() throws IOException { + // Create File and allocate OutputStream + File file = new File(this.path); + if (!file.isAbsolute()) { + file = getFile(this.basePath, this.path); + } + this.outputStream = new FileOutputStream(file); + + // Apply compression if necessary + if(this.compression != null) { + switch (this.compression.toLowerCase()) { + case COMPRESSION.ZIP: + this.outputStream = new ZipOutputStream(this.outputStream); + break; + case COMPRESSION.GZIP: + this.outputStream = new GZIPOutputStream(this.outputStream); + break; + default: + throw new IOException("Compression " + this.compression + " not implemented!"); + } + } + + return this.outputStream; + } + + /** + * This method returns the serialization format of the local file. + * @return serialization format. + */ + @Override + public String getSerializationFormat() { + return serializationFormat; + } + + @Override + public boolean equals(Object o) { + if (o instanceof LocalFileTarget) { + LocalFileTarget target = (LocalFileTarget) o; + return path.equals(target.getPath()) && basePath.equals(target.getBasePath()); + } else { + return false; + } + } + + /** + * This method returns the path of the target. + * @return the relative path. + */ + public String getPath() { + return path; + } + + /** + * This method returns the base path of the target. + * @return the base path. + */ + public String getBasePath() { + return basePath; + } + + @Override + public String toString() { + return this.path; + } + + /** + * This method closes the target. + */ + @Override + public void close() { + logger.debug("Closing target"); + try { + this.outputStream.close(); + } + catch (Exception e) { + logger.error("Failed to close target: " + e); + } + } + + /** + * This method returns the file encoding. + * @return encoding + */ + @Override + public Charset getEncoding() { + return this.encoding; + } +} \ No newline at end of file diff --git a/src/main/java/be/ugent/rml/target/SPARQLEndpointTarget.java b/src/main/java/be/ugent/rml/target/SPARQLEndpointTarget.java new file mode 100644 index 00000000..99ff5346 --- /dev/null +++ b/src/main/java/be/ugent/rml/target/SPARQLEndpointTarget.java @@ -0,0 +1,133 @@ +package be.ugent.rml.target; + +import org.apache.http.client.HttpResponseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class SPARQLEndpointTarget implements Target { + + private final String url; + private final File tempFile; + private static final Logger logger = LoggerFactory.getLogger(SPARQLEndpointTarget.class); + private static final int BUFFER_SIZE = 8192; + private static final String serializationFormat = "ntriples"; + + /** + * This constructor takes an URL of the SPARQL endpoint as argument. + * @param url URL of the SPARQL endpoint + */ + public SPARQLEndpointTarget(String url) throws IOException { + this.url = url; + this.tempFile = File.createTempFile("rmlmapper-", ".nt"); + this.tempFile.deleteOnExit(); + } + + /** + * This method returns an OutputStream for the target. + * @return the OutputStream corresponding to the target. + * @throws IOException + */ + public OutputStream getOutputStream() throws IOException { + return new FileOutputStream(this.tempFile); + } + + /** + * This method returns the serialization format of the target. + * @return serialization format. + */ + @Override + public String getSerializationFormat() { + return this.serializationFormat; + } + + /** + * This method returns the url of the SPARQL endpoint target. + * @return url. + */ + public String getUrl() { + return this.url; + } + + @Override + public boolean equals(Object o) { + if (o instanceof SPARQLEndpointTarget) { + SPARQLEndpointTarget target = (SPARQLEndpointTarget) o; + return this.url.equals(target.getUrl()); + } else { + return false; + } + } + + /** + * This method closes the target. + * When closing a SPARQL endpoint target, the SPARQL UPDATE query is executed + * to update the SPARQL triple store with the exported triples. + */ + @Override + public void close() { + /* + Read the temporary file containing the exported triples. + Create a SPARQL UPDATE query + Push the triples to a SPARQL store using the SPARQL UPDATE query. + + TODO: Named graph support + */ + logger.debug("Closing target"); + + try { + // Create HTTP connection to SPARQL triple store + URL url = new URL(this.url); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestProperty("Content-Type", "application/sparql-update"); + connection.setRequestMethod("POST"); + connection.setDoOutput(true); + + // Create InputStream to read temporary file and OutputStream to write to connection + File turtle = new File(this.tempFile.getAbsolutePath()); + InputStream in = new FileInputStream(turtle); + OutputStream out = connection.getOutputStream(); + + // SPARQL UPDATE Query starts with 'INSERT DATA {' + out.write("INSERT DATA {".getBytes(StandardCharsets.UTF_8)); + + // Java 9 has .transferTo() to copy an InputStream into an OutputStream, instead of this: + byte[] buffer = new byte[BUFFER_SIZE]; + int length; + while ((length = in.read(buffer)) > 0) { + out.write(buffer, 0, length); + } + + // Query ends with '}' + out.write("}".getBytes(StandardCharsets.UTF_8)); + + // Throw error if query failed (HTTP status code >= 300) + int code = connection.getResponseCode(); + if (code >= HttpURLConnection.HTTP_MULT_CHOICE) { + throw new HttpResponseException(code, "Executing SPARQL UPDATE query failed (" + code + ")"); + } + + // Close streams + in.close(); + out.close(); + } + catch (Exception e) { + logger.error("Failed to close target: " + e); + } + } + + /** + * This method returns the file encoding. + * No file encoding is needed when interacting with SPARQL endpoints! + * @return encoding + */ + @Override + public Charset getEncoding() { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/be/ugent/rml/target/Target.java b/src/main/java/be/ugent/rml/target/Target.java new file mode 100644 index 00000000..f3880063 --- /dev/null +++ b/src/main/java/be/ugent/rml/target/Target.java @@ -0,0 +1,36 @@ +package be.ugent.rml.target; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.Charset; + +/** + * This interface represents the target of a knowledge graph. + * For example, a local file, a SOLID pod, a Triple Store, and so on. + */ +public interface Target { + + /** + * This method returns an OutputStream for the target. + * @return the OutputStream corresponding to the target. + * @throws IOException + */ + OutputStream getOutputStream() throws IOException; + + /** + * This method returns the serialization format of the target. + * @return serialization format. + */ + String getSerializationFormat(); + + /** + * This method closes the target. + */ + void close(); + + /** + * This method returns the encoding to use. + * @return encoding + */ + Charset getEncoding(); +} diff --git a/src/main/java/be/ugent/rml/target/TargetFactory.java b/src/main/java/be/ugent/rml/target/TargetFactory.java new file mode 100644 index 00000000..80417de2 --- /dev/null +++ b/src/main/java/be/ugent/rml/target/TargetFactory.java @@ -0,0 +1,159 @@ +package be.ugent.rml.target; + +import be.ugent.rml.NAMESPACES; +import be.ugent.rml.Utils; +import be.ugent.rml.store.QuadStore; +import be.ugent.rml.term.Literal; +import be.ugent.rml.term.NamedNode; +import be.ugent.rml.term.Term; +import org.apache.commons.lang3.NotImplementedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Locale; + +public class TargetFactory { + + // The path used when local paths are not absolute. + private String basePath; + private static final Logger logger = LoggerFactory.getLogger(TargetFactory.class); + + /** + * The constructor of the TargetFactory. + */ + public TargetFactory(String basePath) { + this.basePath = basePath; + } + + /** + * This method returns a Target instance based on the RML rules in rmlStore. + * @param logicalTarget the Logical Target for which the Target needs to be created. + * @param rmlStore a QuadStore with RML rules. + */ + public Target getTarget(Term logicalTarget, QuadStore rmlStore) throws NotImplementedException, IOException { + Target target = null; + Charset encoding = Charset.defaultCharset(); + String serializationFormat = "ntriples"; + String compression = null; + List targets = Utils.getObjectsFromQuads(rmlStore.getQuads(logicalTarget, + new NamedNode(NAMESPACES.RML + "target"), null)); + + // Read serialization format + try { + String sf = Utils.getObjectsFromQuads(rmlStore.getQuads(logicalTarget, new NamedNode(NAMESPACES.RML + "serialization"), null)).get(0).getValue(); + switch (sf) { + case NAMESPACES.FORMATS + "N-Triples": + serializationFormat = "ntriples"; + break; + case NAMESPACES.FORMATS + "N-Quads": + serializationFormat = "nquads"; + break; + case NAMESPACES.FORMATS + "JSON-LD": + serializationFormat = "jsonld"; + break; + case NAMESPACES.FORMATS + "Turtle": + serializationFormat = "turtle"; + break; + default: + throw new NotImplementedException("Serialization format " + sf + " not implemented!"); + } + } + catch (IndexOutOfBoundsException e) { + logger.debug("No serialization format specified, falling back to default N-triples"); + } + + // Read encoding + try { + String enc = Utils.getObjectsFromQuads(rmlStore.getQuads(logicalTarget, + new NamedNode(NAMESPACES.RML + "encoding"), null)).get(0).getValue().toLowerCase(Locale.ROOT); + switch (enc) { + case "utf-8": + encoding = StandardCharsets.UTF_8; + break; + case "utf-16": + encoding = StandardCharsets.UTF_16; + break; + case "iso-8859-1": + encoding = StandardCharsets.ISO_8859_1; + break; + default: + throw new NotImplementedException("Character encoding " + enc + " not implemented!"); + } + logger.debug("Encoding: " + encoding); + } + catch (IndexOutOfBoundsException e) { + logger.debug("No encoding specified, falling back to default UTF-8"); + } + + // Read encoding + try { + compression = Utils.getObjectsFromQuads(rmlStore.getQuads(logicalTarget, + new NamedNode(NAMESPACES.RML + "compression"), null)).get(0).getValue(); + logger.debug("Compression: " + compression); + } + catch (IndexOutOfBoundsException e) { + logger.debug("Compression disabled"); + } + + // Build target + if (!targets.isEmpty()) { + Term t = targets.get(0); + logger.debug("getTarget() for " + t.toString()); + + // Old Logical Source reference is supported for Logical Targets as well for backwards compatibility + if (targets.get(0) instanceof Literal) { + logger.debug("Logical Target is Literal"); + String location = targets.get(0).getValue(); + target = new LocalFileTarget(location, this.basePath, serializationFormat, encoding, compression); + } + else { + // If not a literal, then we are dealing with a more complex description. + String targetType = Utils.getObjectsFromQuads(rmlStore.getQuads(t, + new NamedNode(NAMESPACES.RDF + "type"), null)).get(0).getValue(); + logger.debug("Logical Target is IRI, target type: " + targetType); + + switch(targetType) { + case NAMESPACES.VOID + "Dataset": { // VoID Dataset + logger.debug("Logical Target is a VoID Dataset"); + String location = Utils.getObjectsFromQuads(rmlStore.getQuads(t, + new NamedNode(NAMESPACES.VOID + "dataDump"), null)).get(0).getValue(); + location = location.replace("file://", ""); // Local file starts with file:// + logger.debug("VoID datadump location: " + location); + target = new LocalFileTarget(location, this.basePath, serializationFormat, encoding, compression); + break; + } + case NAMESPACES.SD + "Service": { // SPARQL Service + logger.debug("Logical Target is a SD Service"); + String endpoint = Utils.getObjectsFromQuads(rmlStore.getQuads(t, + new NamedNode(NAMESPACES.SD + "endpoint"), null)).get(0).getValue(); + String supportedLanguage = Utils.getObjectsFromQuads(rmlStore.getQuads(t, + new NamedNode(NAMESPACES.SD + "supportedLanguage"), null)).get(0).getValue(); + logger.debug("SPARQL Service endpoint: " + endpoint); + logger.debug("SPARQL Service supported language: " + supportedLanguage); + + // Check SPARQL UPDATE compatibility + if (!supportedLanguage.equals(NAMESPACES.SD + "SPARQL11Update")) { + throw new IllegalArgumentException("SPARQL Service target must support SPARQL Update!"); + } + + // Try to instantiate a SPARQL endpoint + target = new SPARQLEndpointTarget(endpoint); + break; + } + default: { + throw new NotImplementedException("Not implemented"); + } + } + } + logger.debug("Target created: " + target); + return target; + } + else { + throw new Error("The Logical Target does not have target."); + } + } +} \ No newline at end of file diff --git a/src/test/java/be/ugent/rml/Mapper_Compression.java b/src/test/java/be/ugent/rml/Mapper_Compression.java new file mode 100644 index 00000000..46043560 --- /dev/null +++ b/src/test/java/be/ugent/rml/Mapper_Compression.java @@ -0,0 +1,10 @@ +package be.ugent.rml; + +import org.junit.Test; + +public class Mapper_Compression extends TestCore { + @Test + public void evaluate_compression() { + doMapping("./web-of-things/compression/mapping.ttl", "./web-of-things/compression/out.nq"); + } +} diff --git a/src/test/java/be/ugent/rml/Mapper_Logical_Target.java b/src/test/java/be/ugent/rml/Mapper_Logical_Target.java new file mode 100644 index 00000000..06ac8f02 --- /dev/null +++ b/src/test/java/be/ugent/rml/Mapper_Logical_Target.java @@ -0,0 +1,117 @@ +package be.ugent.rml; + +import com.sun.net.httpserver.HttpServer; +import org.apache.jena.fuseki.embedded.FusekiServer; +import org.apache.jena.riot.RDFDataMgr; +import org.apache.jena.sparql.core.DatasetGraphFactory; +import org.junit.*; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; + +public class Mapper_Logical_Target extends TestCore { + private static int PORTNUMBER_SPARQL; + private FusekiServer.Builder builder; + private FusekiServer server; + + @Test + public void evaluate_sparql_target() throws Exception { + // Create Web API + HttpServer webApi = HttpServer.create(new InetSocketAddress(8000), 0); + webApi.createContext("/trashcans", new Mapper_WoT_Test.TrashCansFileHandler()); + webApi.setExecutor(null); // creates a default executor + webApi.start(); + + // Replace PORT number in mapping file + String tempMappingPath = replacePortInMappingFile("./web-of-things/logical-target/sparql/mapping.ttl", "" + PORTNUMBER_SPARQL); + HashMap outPaths = new HashMap(); + outPaths.put("sparql", "./web-of-things/logical-target/sparql/out.nq"); + doMapping(tempMappingPath, outPaths, "./web-of-things/logical-target/private-security-data.ttl"); + + webApi.stop(0); + } + + @Test + public void evaluate_local_file_target() throws Exception { + // Create Web API + HttpServer webApi = HttpServer.create(new InetSocketAddress(8000), 0); + webApi.createContext("/trashcans", new Mapper_WoT_Test.TrashCansFileHandler()); + webApi.setExecutor(null); // creates a default executor + webApi.start(); + + HashMap outPaths = new HashMap(); + outPaths.put("local-file", "./web-of-things/logical-target/local-file/out.nq"); + doMapping("./web-of-things/logical-target/local-file/mapping.ttl", outPaths, "./web-of-things/logical-target/private-security-data.ttl"); + + webApi.stop(0); + } + + @Before + public void intialize() throws IOException { + // Create Fuseki SPARQL endpoint /ds1 + builder = FusekiServer.create(); + builder.setPort(PORTNUMBER_SPARQL); + builder.add("/ds1", DatasetGraphFactory.createTxnMem(), true); + this.server = builder.build(); + this.server.start(); + } + + @BeforeClass + public static void startServer() throws Exception { + try { + PORTNUMBER_SPARQL = Utils.getFreePortNumber(); + } catch (Exception ex) { + throw new Exception("Could not find a free port number for SPARQL testing."); + } + } + + @After + public void stopServer() { + if (server != null) { + server.stop(); + } + + System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog"); + System.setProperty("org.eclipse.jetty.LEVEL", "OFF"); + } + + private ServerSocket findRandomOpenPortOnAllLocalInterfaces() { + try ( ServerSocket socket = new ServerSocket(0) ) { + return socket; + } catch (IOException ex) { + throw new Error("Couldn't find an available port for the SPARQL tests."); + } + } + + /* + Replaces the "PORT" in the given mapping file to an available port and saves this in a new temp file + Returns the absolute path to the temp mapping file + */ + private String replacePortInMappingFile(String path, String port) { + try { + // Read mapping file + String mapping = new String(Files.readAllBytes(Paths.get(Utils.getFile(path).getAbsolutePath())), StandardCharsets.UTF_8); + + // Replace "PORT" in mapping file by new port + mapping = mapping.replace("PORT", port); + + // Write to temp mapping file + String fileName = port + ".ttl"; + Path file = Paths.get(fileName); + Files.write(file, Arrays.asList(mapping.split("\n"))); + + String absolutePath = Paths.get(Utils.getFile(fileName, null).getAbsolutePath()).toString(); + + return absolutePath; + } catch (IOException ex) { + throw new Error(ex.getMessage()); + } + } +} diff --git a/src/test/java/be/ugent/rml/Mapper_WoT_Test.java b/src/test/java/be/ugent/rml/Mapper_WoT_Test.java index 092f9aec..239dd41c 100644 --- a/src/test/java/be/ugent/rml/Mapper_WoT_Test.java +++ b/src/test/java/be/ugent/rml/Mapper_WoT_Test.java @@ -12,11 +12,9 @@ import java.util.HashMap; import java.util.List; -import static org.junit.Assert.fail; - public class Mapper_WoT_Test extends TestCore { @Test - public void evaluate_essence() throws IOException { + public void evaluate_essence_wot_support() throws IOException { HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); server.createContext("/trashcans", new Mapper_WoT_Test.TrashCansFileHandler()); server.setExecutor(null); // creates a default executor @@ -24,8 +22,9 @@ public void evaluate_essence() throws IOException { HashMap outPaths = new HashMap(); outPaths.put("local-file", "./web-of-things/essence/out-local-file.nq"); - outPaths.put("sparql-endpoint", "./web-of-things/essence/out-sparql-endpoint.nq"); doMapping("./web-of-things/essence/mapping.ttl", outPaths, "./web-of-things/essence/private-security-data.ttl"); + + server.stop(0); } static class TrashCansFileHandler implements HttpHandler { @@ -62,22 +61,4 @@ public void handle(HttpExchange t) throws IOException { } } - - @Test - public void evaluate_compression() { - doMapping("./web-of-things/compression/mapping.ttl", "./web-of-things/compression/out.nq"); - } - - /*@Test - public void evaluate_compression() { - doMapping("./web-of-things/compression/mapping.ttl", "./web-of-things/compression/out.nq"); - } - - */ - /*@Test - public void evaluate_daiquiri() { - HashMap outPaths = new HashMap(); - outPaths.put("local-file", "./web-of-things/daiquiri/output-local-file.nq"); - doMapping("./web-of-things/daiquiri/mapping.ttl", outPaths); - }*/ } \ No newline at end of file diff --git a/src/test/java/be/ugent/rml/TestCore.java b/src/test/java/be/ugent/rml/TestCore.java index f6566d25..95386ef4 100644 --- a/src/test/java/be/ugent/rml/TestCore.java +++ b/src/test/java/be/ugent/rml/TestCore.java @@ -193,7 +193,7 @@ public Executor doMapping(String mapPath, String outPath, String parentPath) { * @param outPath The path of the file with the expected output. */ void doMapping(Executor executor, String outPath) throws Exception { - QuadStore result = executor.execute(null); + QuadStore result = executor.execute(null).get(new NamedNode("rmlmapper://legacy.store")); result.removeDuplicates(); compareStores(filePathToStore(outPath), result); } @@ -205,7 +205,7 @@ void doMapping(Executor executor, String outPath) throws Exception { */ void doMapping(Executor executor, HashMap outPaths) throws Exception { // TODO: compare target with each output - QuadStore result = executor.execute(null); + QuadStore result = executor.execute(null).get(new NamedNode("rmlmapper://legacy.store")); result.removeDuplicates(); for (Map.Entry entry: outPaths.entrySet()) { String target = entry.getKey(); @@ -234,7 +234,7 @@ void doMappingExpectError(String mapPath) { try { Executor executor = new Executor(rmlStore, new RecordsFactory(mappingFile.getParent()), Utils.getBaseDirectiveTurtle(mappingFile)); - QuadStore result = executor.execute(null); + QuadStore result = executor.execute(null).get(new NamedNode("rmlmapper://legacy.store")); } catch (Exception e) { // I expected you! logger.warn(e.getMessage(), e); diff --git a/src/test/java/be/ugent/rml/readme/ReadmeFunctionTest.java b/src/test/java/be/ugent/rml/readme/ReadmeFunctionTest.java index b313876a..45d0cef8 100644 --- a/src/test/java/be/ugent/rml/readme/ReadmeFunctionTest.java +++ b/src/test/java/be/ugent/rml/readme/ReadmeFunctionTest.java @@ -8,6 +8,7 @@ import be.ugent.rml.store.QuadStore; import be.ugent.rml.store.QuadStoreFactory; import be.ugent.rml.store.RDF4JStore; +import be.ugent.rml.term.NamedNode; import org.junit.Test; import java.io.*; @@ -50,7 +51,7 @@ public void function() { Executor executor = new Executor(rmlStore, factory, functionLoader, outputStore, Utils.getBaseDirectiveTurtle(mappingStream)); // Execute the mapping - QuadStore result = executor.execute(null); + QuadStore result = executor.execute(null).get(new NamedNode("rmlmapper://legacy.store")); // Output the result BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); diff --git a/src/test/java/be/ugent/rml/readme/ReadmeTest.java b/src/test/java/be/ugent/rml/readme/ReadmeTest.java index fa065e10..9dc5386d 100644 --- a/src/test/java/be/ugent/rml/readme/ReadmeTest.java +++ b/src/test/java/be/ugent/rml/readme/ReadmeTest.java @@ -8,6 +8,7 @@ import be.ugent.rml.store.QuadStore; import be.ugent.rml.store.QuadStoreFactory; import be.ugent.rml.store.RDF4JStore; +import be.ugent.rml.term.NamedNode; import org.junit.Test; import java.io.*; @@ -46,7 +47,7 @@ public void standard() { Executor executor = new Executor(rmlStore, factory, functionLoader, outputStore, Utils.getBaseDirectiveTurtle(mappingStream)); // Execute the mapping - QuadStore result = executor.execute(null); + QuadStore result = executor.execute(null).get(new NamedNode("rmlmapper://legacy.store")); // Output the result BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); diff --git a/src/test/resources/web-of-things/logical-target/local-file/mapping.ttl b/src/test/resources/web-of-things/logical-target/local-file/mapping.ttl new file mode 100644 index 00000000..7d73fa07 --- /dev/null +++ b/src/test/resources/web-of-things/logical-target/local-file/mapping.ttl @@ -0,0 +1,77 @@ +@prefix rml: . +@prefix rr: . +@prefix ql: . +@prefix rdf: . +@prefix ex: . +@prefix td: . +@prefix htv: . +@prefix hctl: . +@prefix time: . +@prefix xsd: . +@prefix wotsec: . +@prefix formats: . +@prefix void: . +@prefix sd: . +@base . + +# API key in HTTP header +<#WotWebAPISecurity> a wotsec:APIKeySecurityScheme; + wotsec:in "header"; + wotsec:name "apikey"; +. + +<#WoTWebResource> a td:PropertyAffordance; + td:hasForm [ + # URL and content type + hctl:hasTarget "http://localhost:8000/trashcans"; + hctl:forContentType "application/json"; + # Read only + hctl:hasOperationType td:readproperty ; + # Set HTTP method and headers + htv:methodName "GET"; + htv:headers ([ + htv:fieldName "User-Agent"; + htv:fieldValue "RMLMapper v4.9.1"; + ]); + ]; +. + +<#WoTWebAPI> a td:Thing; + td:hasPropertyAffordance <#WoTWebResource>; + td:hasSecurityConfiguration <#WotWebAPISecurity>; +. + +<#TriplesMap> a rr:TriplesMap; + rml:logicalSource [ + rml:source <#WoTWebResource>; + rml:referenceFormulation ql:JSONPath; + rml:iterator "$.[*]"; + rml:poll [ a time:GeneralDurationDescription; + time:minutes "5"^^xsd:integer; + ]; + ]; + rml:logicalTarget [ + rml:target [ a void:Dataset; + void:dataDump ; + ]; + rml:serialization formats:N-Quads; + ]; + + rr:subjectMap [ + rr:template "http://example.org/bigbelly/{id}" + ]; + + rr:predicateObjectMap [ + rr:predicate ex:fillingLevel; + rr:objectMap [ + rml:reference "fillingLevel.value"; + ]; + ]; + + rr:predicateObjectMap [ + rr:predicate rdf:type; + rr:objectMap [ + rr:constant ex:Trashcan; + ]; + ]; +. diff --git a/src/test/resources/web-of-things/logical-target/local-file/out.nq b/src/test/resources/web-of-things/logical-target/local-file/out.nq new file mode 100644 index 00000000..3a69f945 --- /dev/null +++ b/src/test/resources/web-of-things/logical-target/local-file/out.nq @@ -0,0 +1,340 @@ + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "1" . + . + "0.8" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.2" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0.4" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.8" . + . + "0" . + . + "0.4" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . diff --git a/src/test/resources/web-of-things/logical-target/private-security-data.ttl b/src/test/resources/web-of-things/logical-target/private-security-data.ttl new file mode 100644 index 00000000..705958b0 --- /dev/null +++ b/src/test/resources/web-of-things/logical-target/private-security-data.ttl @@ -0,0 +1,7 @@ +@prefix rmlp: . +@base . + +# API key in HTTP header +<#WotWebAPISecurity> a rmlp:APISecuritydata; + rmlp:token "123456789"; +. diff --git a/src/test/resources/web-of-things/logical-target/sparql/mapping.ttl b/src/test/resources/web-of-things/logical-target/sparql/mapping.ttl new file mode 100644 index 00000000..136ee969 --- /dev/null +++ b/src/test/resources/web-of-things/logical-target/sparql/mapping.ttl @@ -0,0 +1,82 @@ +@prefix rml: . +@prefix rr: . +@prefix ql: . +@prefix rdf: . +@prefix ex: . +@prefix td: . +@prefix htv: . +@prefix hctl: . +@prefix time: . +@prefix xsd: . +@prefix wotsec: . +@prefix formats: . +@prefix void: . +@prefix sd: . +@base . + +# API key in HTTP header +<#WotWebAPISecurity> a wotsec:APIKeySecurityScheme; + wotsec:in "header"; + wotsec:name "apikey"; +. + +<#WoTWebResource> a td:PropertyAffordance; + td:hasForm [ + # URL and content type + hctl:hasTarget "http://localhost:8000/trashcans"; + hctl:forContentType "application/json"; + # Read only + hctl:hasOperationType td:readproperty ; + # Set HTTP method and headers + htv:methodName "GET"; + htv:headers ([ + htv:fieldName "User-Agent"; + htv:fieldValue "RMLMapper v4.9.1"; + ]); + ]; +. + +<#WoTWebAPI> a td:Thing; + td:hasPropertyAffordance <#WoTWebResource>; + td:hasSecurityConfiguration <#WotWebAPISecurity>; +. + +<#TriplesMap> a rr:TriplesMap; + rml:logicalSource [ + rml:source <#WoTWebResource>; + rml:referenceFormulation ql:JSONPath; + rml:iterator "$.[*]"; + rml:poll [ a time:GeneralDurationDescription; + time:minutes "5"^^xsd:integer; + ]; + ]; + rml:logicalTarget [ + rml:target [ a void:Dataset; + void:dataDump ; + ]; + rml:serialization formats:N-Quads; + ]; + + rr:subjectMap [ + rr:template "http://example.org/bigbelly/{id}" + ]; + + rr:predicateObjectMap [ + rr:predicate ex:fillingLevel; + rr:objectMap [ + rml:reference "fillingLevel.value"; + ]; + ]; + + rr:predicateObjectMap [ + rr:predicate rdf:type; + rr:objectMap [ + rr:constant ex:Trashcan; + ]; + ]; +. + +<#SPARQLEndpoint> a sd:Service; + sd:endpoint ; + sd:supportedLanguage sd:SPARQL11Update; +. diff --git a/src/test/resources/web-of-things/logical-target/sparql/out.nq b/src/test/resources/web-of-things/logical-target/sparql/out.nq new file mode 100644 index 00000000..3a69f945 --- /dev/null +++ b/src/test/resources/web-of-things/logical-target/sparql/out.nq @@ -0,0 +1,340 @@ + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "1" . + . + "0.8" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.2" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "1" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0.4" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0.2" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.8" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0.8" . + . + "0.8" . + . + "0" . + . + "0.4" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . + "0" . + . From 0c5e794496fe23751e40783a3c13cc61ccf59dca Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Sun, 17 Jan 2021 20:17:37 +0100 Subject: [PATCH 4/4] changelog: document changes Logical Target support, Web of Things support and compression support --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5ce0b75..96dd8aa2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## Unreleased +### Added +- Add Logical Target support +- Add Web of Things support +- Add compression support + ## [4.9.1] - 2020-12-04 ### Added