Thank for the patch, Blake. When you'll have time, send it as a PR to have a better code review.
On Aug 30, 2016 12:39 AM, "Blake Regalia" <[email protected]> wrote: > 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 >
