Skip to content

Commit 96e9193

Browse files
committed
Improved support for native Neo4j point types for storing locations
This commit includes support for procedures, as well as a critical bugfix.
1 parent 665566d commit 96e9193

File tree

5 files changed

+239
-36
lines changed

5 files changed

+239
-36
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ The Neo4j Spatial Plugin is available for inclusion in the server version of Neo
229229
* [v0.25.5 for Neo4j 3.3.5](https://github.com/neo4j-contrib/m2/blob/master/releases/org/neo4j/neo4j-spatial/0.25.5-neo4j-3.3.5/neo4j-spatial-0.25.5-neo4j-3.3.5-server-plugin.jar?raw=true)
230230
* [v0.25.6 for Neo4j 3.4.5](https://github.com/neo4j-contrib/m2/blob/master/releases/org/neo4j/neo4j-spatial/0.25.6-neo4j-3.4.5/neo4j-spatial-0.25.6-neo4j-3.4.5-server-plugin.jar?raw=true)
231231
* [v0.25.7 for Neo4j 3.4.9](https://github.com/neo4j-contrib/m2/blob/master/releases/org/neo4j/neo4j-spatial/0.25.7-neo4j-3.4.9/neo4j-spatial-0.25.7-neo4j-3.4.9-server-plugin.jar?raw=true)
232-
* [v0.26.0 for Neo4j 3.4.9](https://github.com/neo4j-contrib/m2/blob/master/releases/org/neo4j/neo4j-spatial/0.26.0-neo4j-3.4.9/neo4j-spatial-0.26.0-neo4j-3.4.9-server-plugin.jar?raw=true)
232+
* [v0.26.1 for Neo4j 3.4.9](https://github.com/neo4j-contrib/m2/blob/master/releases/org/neo4j/neo4j-spatial/0.26.1-neo4j-3.4.9/neo4j-spatial-0.26.1-neo4j-3.4.9-server-plugin.jar?raw=true)
233233

234234
For versions up to 0.15-neo4j-2.3.4:
235235

@@ -345,7 +345,7 @@ Add the following repositories and dependency to your project's pom.xml:
345345
<dependency>
346346
<groupId>org.neo4j</groupId>
347347
<artifactId>neo4j-spatial</artifactId>
348-
<version>0.26.0-neo4j-3.4.9</version>
348+
<version>0.26.1-neo4j-3.4.9</version>
349349
</dependency>
350350
~~~
351351

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<modelVersion>4.0.0</modelVersion>
2222
<artifactId>neo4j-spatial</artifactId>
2323
<groupId>org.neo4j</groupId>
24-
<version>0.26.0-neo4j-3.4.9</version>
24+
<version>0.26.1-neo4j-3.4.9</version>
2525
<name>Neo4j - Spatial Components</name>
2626
<description>Spatial utilities and components for Neo4j</description>
2727
<url>http://components.neo4j.org/${project.artifactId}/${project.version}</url>

src/main/java/org/neo4j/gis/spatial/encoders/NativePointEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public void setConfiguration(String configuration) {
8484
String[] fields = configuration.split(":");
8585
if (fields.length > 0) locationProperty = fields[0];
8686
if (fields.length > 1) bboxProperty = fields[1];
87-
if (fields.length > 2) crs = Neo4jCRS.findCRS(fields[1]);
87+
if (fields.length > 2) crs = Neo4jCRS.findCRS(fields[2]);
8888
}
8989
}
9090

src/main/java/org/neo4j/gis/spatial/procedures/SpatialProcedures.java

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,104 @@ public Stream<NodeResult> addSimplePointLayerWithConfig(
294294
}
295295
}
296296

297+
@Procedure(value="spatial.addNativePointLayer", mode=WRITE)
298+
@Description("Adds a new native point layer, returns the layer root node")
299+
public Stream<NodeResult> addNativePointLayer(
300+
@Name("name") String name,
301+
@Name(value = "indexType", defaultValue = RTREE_INDEX_NAME) String indexType,
302+
@Name(value = "crsName", defaultValue = UNSET_CRS_NAME) String crsName) {
303+
SpatialDatabaseService sdb = wrap(db);
304+
Layer layer = sdb.getLayer(name);
305+
if (layer == null) {
306+
return streamNode(sdb.createLayer(name, NativePointEncoder.class, SimplePointLayer.class, sdb.resolveIndexClass(indexType), null, selectCRS(crsName)).getLayerNode());
307+
} else {
308+
throw new IllegalArgumentException("Cannot create existing layer: " + name);
309+
}
310+
}
311+
312+
@Procedure(value="spatial.addNativePointLayerGeohash", mode=WRITE)
313+
@Description("Adds a new native point layer with geohash based index, returns the layer root node")
314+
public Stream<NodeResult> addNativePointLayerGeohash(
315+
@Name("name") String name,
316+
@Name(value = "crsName", defaultValue = WGS84_CRS_NAME) String crsName) {
317+
SpatialDatabaseService sdb = wrap(db);
318+
Layer layer = sdb.getLayer(name);
319+
if (layer == null) {
320+
return streamNode(sdb.createLayer(name, NativePointEncoder.class, SimplePointLayer.class, LayerGeohashPointIndex.class, null, selectCRS(crsName)).getLayerNode());
321+
} else {
322+
throw new IllegalArgumentException("Cannot create existing layer: " + name);
323+
}
324+
}
325+
326+
@Procedure(value="spatial.addNativePointLayerZOrder", mode=WRITE)
327+
@Description("Adds a new native point layer with z-order curve based index, returns the layer root node")
328+
public Stream<NodeResult> addNativePointLayerZOrder(@Name("name") String name) {
329+
SpatialDatabaseService sdb = wrap(db);
330+
Layer layer = sdb.getLayer(name);
331+
if (layer == null) {
332+
return streamNode(sdb.createLayer(name, NativePointEncoder.class, SimplePointLayer.class, LayerZOrderPointIndex.class, null, DefaultGeographicCRS.WGS84).getLayerNode());
333+
} else {
334+
throw new IllegalArgumentException("Cannot create existing layer: " + name);
335+
}
336+
}
337+
338+
@Procedure(value="spatial.addNativePointLayerHilbert", mode=WRITE)
339+
@Description("Adds a new native point layer with hilbert curve based index, returns the layer root node")
340+
public Stream<NodeResult> addNativePointLayerHilbert(@Name("name") String name) {
341+
SpatialDatabaseService sdb = wrap(db);
342+
Layer layer = sdb.getLayer(name);
343+
if (layer == null) {
344+
return streamNode(sdb.createLayer(name, NativePointEncoder.class, SimplePointLayer.class, LayerHilbertPointIndex.class, null, DefaultGeographicCRS.WGS84).getLayerNode());
345+
} else {
346+
throw new IllegalArgumentException("Cannot create existing layer: " + name);
347+
}
348+
}
349+
350+
@Procedure(value="spatial.addNativePointLayerXY", mode=WRITE)
351+
@Description("Adds a new native point layer with the given properties for x and y coordinates, returns the layer root node")
352+
public Stream<NodeResult> addNativePointLayer(
353+
@Name("name") String name,
354+
@Name("xProperty") String xProperty,
355+
@Name("yProperty") String yProperty,
356+
@Name(value = "indexType", defaultValue = RTREE_INDEX_NAME) String indexType,
357+
@Name(value = "crsName", defaultValue = UNSET_CRS_NAME) String crsName) {
358+
SpatialDatabaseService sdb = wrap(db);
359+
Layer layer = sdb.getLayer(name);
360+
if (layer == null) {
361+
if (xProperty != null && yProperty != null) {
362+
return streamNode(sdb.createLayer(name, NativePointEncoder.class, SimplePointLayer.class,
363+
sdb.resolveIndexClass(indexType), sdb.makeEncoderConfig(xProperty, yProperty),
364+
selectCRS(hintCRSName(crsName, yProperty))).getLayerNode());
365+
} else {
366+
throw new IllegalArgumentException("Cannot create layer '" + name + "': Missing encoder config values: xProperty[" + xProperty + "], yProperty[" + yProperty + "]");
367+
}
368+
} else {
369+
throw new IllegalArgumentException("Cannot create existing layer: " + name);
370+
}
371+
}
372+
373+
@Procedure(value="spatial.addNativePointLayerWithConfig", mode=WRITE)
374+
@Description("Adds a new native point layer with the given configuration, returns the layer root node")
375+
public Stream<NodeResult> addNativePointLayerWithConfig(
376+
@Name("name") String name,
377+
@Name("encoderConfig") String encoderConfig,
378+
@Name(value = "indexType", defaultValue = RTREE_INDEX_NAME) String indexType,
379+
@Name(value = "crsName", defaultValue = UNSET_CRS_NAME) String crsName) {
380+
SpatialDatabaseService sdb = wrap(db);
381+
Layer layer = sdb.getLayer(name);
382+
if (layer == null) {
383+
if (encoderConfig.indexOf(':') > 0) {
384+
return streamNode(sdb.createLayer(name, NativePointEncoder.class, SimplePointLayer.class,
385+
sdb.resolveIndexClass(indexType), encoderConfig,
386+
selectCRS(hintCRSName(crsName, encoderConfig))).getLayerNode());
387+
} else {
388+
throw new IllegalArgumentException("Cannot create layer '" + name + "': invalid encoder config '" + encoderConfig + "'");
389+
}
390+
} else {
391+
throw new IllegalArgumentException("Cannot create existing layer: " + name);
392+
}
393+
}
394+
297395
public static final String UNSET_CRS_NAME = "";
298396
public static final String WGS84_CRS_NAME = "wgs84";
299397

0 commit comments

Comments
 (0)