I needed marmotta-loader-kiwi to support geometry imports for postgres on
MARMOTTA-584, so I coded up a solution - however, I apologize for not
having the time right now to make clean commits/PRs for this.

Here's some jumpstart info in case someone wants to get this feature on the
timeline:

KiWiPostgresHandler uses "COPY [...] FROM STDIN (FORMAT csv)" to bulk load
triples into postgres. So, the "gvalue" column of an insert node needs to
be in a format that PostGIS understands[1]; which happens to be a strict
EWKT (strict because it does not allow spaces after geometry type, e.g.,
"POINT(" is acceptable but "POINT  (" will throw an error.)

The other challenge is setting the CRS/SRID with the serialized geometry
value - somewhere along the import process, the loader needs to replace
GeoSPARQL's CRS format with its corresponding SRID code, e.g. replacing "<
http://www.opengis.net/def/crs/OGC/1.3/CRS84>" with "SRID=4326;" at the
beginning of the WKT string. I think this should be discussed on how to
support various CRS IRI => SRID mappings.

The rest of implementation is pretty straightforward. I'm including below
the diffs of my hacked-together code. Hope this helps!


*commons/marmotta-sesame-tools/marmotta-model-vocabs/src/main/java/org/apache/marmotta/commons/vocabulary/GEOSPARQL.java
*
+package org.apache.marmotta.commons.vocabulary;
+
+import org.openrdf.model.URI;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.ValueFactoryImpl;
+
+/**
+ * Created by blake on 8/26/16.
+ */
+public class GEOSPARQL {
+    public static final String NAMESPACE = "
http://www.opengis.net/ont/geosparql#";;
+    public static final String PREFIX = "geosparql";
+
+    /**
+     * The Well-Known-Text IRI of geometry literals
+     */
+    public static final URI wktLiteral;
+
+    static {
+        ValueFactory factory = ValueFactoryImpl.getInstance();
+        wktLiteral = factory.createURI(GEOSPARQL.NAMESPACE, "wktLiteral");
+    }
+}

*libraries/kiwi/kiwi-loader/src/main/java/org/apache/marmotta/kiwi/loader/generic/KiWiHandler.java*
+import org.apache.marmotta.commons.vocabulary.GEOSPARQL;
*...*
+                } else if(type.equals(GEOSPARQL.wktLiteral)) {
+                    result = connection.loadLiteral(sanitizeString(value),
rtype);
+
+                    if(result == null) {
+                        result = new
KiWiGeometryLiteral(sanitizeString(value), rtype, importDate);
+                    }
+                    else {
+                        nodesLoaded++;
+                    }


*libraries/kiwi/kiwi-loader/src/main/java/org/apache/marmotta/kiwi/loader/pgsql/PGCopyUtil.java
*
-                log.warn("geometries are not yet supported on bulk
imports");
+                KiWiGeometryLiteral l = (KiWiGeometryLiteral)n;
+                createNodeList(rowArray, l.getId(), l.getClass(),
l.getContent(), null, null, null, null, null, l.getDatatype(),
l.getLocale(), l.getCreated(), l.getContent());
*...*
+        // schema v5
         if (a.length == 12) {
-            a[11] = geom; //schema v5
+            if(geom == null) {
+                a[11] = null;
+            }
+            else {
+                a[11] = geom
+
.replaceFirst("^<http://www\\.opengis\\.net/def/crs/OGC/1\\.3/CRS84>\\s*",
"SRID=4326;")  // convert CRS => SRID
+                        .replaceFirst("\\s+(", "(");  // PostGIS does not
allow spaces after WKT geometry type
+            }
         }

[1] - http://stackoverflow.com/a/11137004/1641160

 - Blake

Reply via email to