This is an automated email from the ASF dual-hosted git repository.

micklich pushed a commit to branch 1272-buffer-processor
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit 5a3802640fd9ead910d0e3ee9d2df08068d84b86
Author: micklich <[email protected]>
AuthorDate: Mon Feb 13 01:35:47 2023 +0100

    #1272 add buffer point processor
---
 .../streampipes/processors/geo/jvm/GeoJvmInit.java |   4 +-
 .../bufferpoint/BufferPointProcessor.java          | 158 +++++++++++++++++++++
 .../documentation.md                               |  79 +++++++++++
 .../icon.png                                       | Bin 0 -> 13832 bytes
 .../strings.en                                     |  20 +++
 5 files changed, 260 insertions(+), 1 deletion(-)

diff --git 
a/streampipes-extensions/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/GeoJvmInit.java
 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/GeoJvmInit.java
index 13776f657..214531d11 100644
--- 
a/streampipes-extensions/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/GeoJvmInit.java
+++ 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/GeoJvmInit.java
@@ -29,6 +29,7 @@ import 
org.apache.streampipes.messaging.kafka.SpKafkaProtocolFactory;
 import org.apache.streampipes.messaging.mqtt.SpMqttProtocolFactory;
 import org.apache.streampipes.processors.geo.jvm.config.ConfigKeys;
 import 
org.apache.streampipes.processors.geo.jvm.jts.processor.buffergeometry.BufferGeomProcessor;
+import 
org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint.BufferPointProcessor;
 import 
org.apache.streampipes.processors.geo.jvm.jts.processor.epsg.EpsgProcessor;
 import 
org.apache.streampipes.processors.geo.jvm.jts.processor.latlngtojtspoint.LatLngToJtsPointProcessor;
 import 
org.apache.streampipes.processors.geo.jvm.jts.processor.reprojection.ReprojectionProcessor;
@@ -72,7 +73,8 @@ public class GeoJvmInit extends ExtensionsModelSubmitter {
             new TrajectoryFromPointsProcessor(),
             new SpeedCalculatorProcessor(),
             new ReprojectionProcessor(),
-            new BufferGeomProcessor())
+            new BufferGeomProcessor(),
+            new BufferPointProcessor())
         .registerMessagingFormats(
             new JsonDataFormatFactory(),
             new CborDataFormatFactory(),
diff --git 
a/streampipes-extensions/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/jts/processor/bufferpoint/BufferPointProcessor.java
 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/jts/processor/bufferpoint/BufferPointProcessor.java
new file mode 100644
index 000000000..890d255cc
--- /dev/null
+++ 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/jts/processor/bufferpoint/BufferPointProcessor.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint;
+
+import org.apache.streampipes.commons.exceptions.SpRuntimeException;
+import org.apache.streampipes.model.DataProcessorType;
+import org.apache.streampipes.model.graph.DataProcessorDescription;
+import org.apache.streampipes.model.runtime.Event;
+import org.apache.streampipes.model.schema.PropertyScope;
+import org.apache.streampipes.processors.geo.jvm.jts.helper.SpGeometryBuilder;
+import org.apache.streampipes.processors.geo.jvm.jts.helper.buffer.CapStyle;
+import 
org.apache.streampipes.processors.geo.jvm.jts.helper.buffer.SpBufferBuilder;
+import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
+import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
+import org.apache.streampipes.sdk.helpers.EpProperties;
+import org.apache.streampipes.sdk.helpers.EpRequirements;
+import org.apache.streampipes.sdk.helpers.Labels;
+import org.apache.streampipes.sdk.helpers.Locales;
+import org.apache.streampipes.sdk.helpers.Options;
+import org.apache.streampipes.sdk.helpers.OutputStrategies;
+import org.apache.streampipes.sdk.utils.Assets;
+import org.apache.streampipes.wrapper.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.wrapper.routing.SpOutputCollector;
+import org.apache.streampipes.wrapper.standalone.ProcessorParams;
+import org.apache.streampipes.wrapper.standalone.StreamPipesDataProcessor;
+
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.Point;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BufferPointProcessor extends StreamPipesDataProcessor {
+  public static final String GEOM_KEY = "geometry-key";
+  public static final String EPSG_KEY = "epsg-key";
+  public static final String CAP_KEY = "cap-style-key";
+  public static final String SEGMENTS_KEY = "segments-key";
+  public static final String SIMPLIFY_FACTOR_KEY = "simplify-factor-key";
+  public static final String DISTANCE_KEY = "distance-key";
+  public static final String GEOM_RUNTIME = "geometry-buffer";
+  public static final String EPSG_RUNTIME = "epsg-buffer";
+  private String geometryMapper;
+  private String epsgMapper;
+  private Integer capStyle;
+  private Integer segments;
+  private Double simplifyFactor;
+  private Double distance;
+  private static final Logger LOG = 
LoggerFactory.getLogger(BufferPointProcessor.class);
+
+  @Override
+  public DataProcessorDescription declareModel() {
+    return 
ProcessingElementBuilder.create("org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint")
+        .category(DataProcessorType.GEO)
+        .withAssets(Assets.DOCUMENTATION, Assets.ICON)
+        .withLocales(Locales.EN)
+        .requiredStream(StreamRequirementsBuilder
+            .create()
+            .requiredPropertyWithUnaryMapping(
+                
EpRequirements.domainPropertyReq("http://www.opengis.net/ont/geosparql#Geometry";),
+                Labels.withId(GEOM_KEY),
+                PropertyScope.MEASUREMENT_PROPERTY)
+            .requiredPropertyWithUnaryMapping(
+                
EpRequirements.domainPropertyReq("http://data.ign.fr/def/ignf#CartesianCS";),
+                Labels.withId(EPSG_KEY),
+                PropertyScope.MEASUREMENT_PROPERTY)
+            .build())
+        .outputStrategy(OutputStrategies.append(
+                EpProperties.stringEp(
+                    Labels.withId(GEOM_KEY),
+                    GEOM_RUNTIME,
+                    "http://www.opengis.net/ont/geosparql#Geometry";
+                ),
+                EpProperties.numberEp(
+                    Labels.withId(EPSG_KEY),
+                    EPSG_RUNTIME,
+                    "http://data.ign.fr/def/ignf#CartesianCS";
+                )
+            )
+        )
+        .requiredSingleValueSelection(
+            Labels.withId(CAP_KEY),
+            Options.from(
+                CapStyle.Square.name(),
+                CapStyle.Round.name())
+        )
+        .requiredIntegerParameter(
+            Labels.withId(SEGMENTS_KEY),
+            8
+        )
+        .requiredFloatParameter(
+            Labels.withId(SIMPLIFY_FACTOR_KEY),
+            0.01f
+        )
+        .requiredFloatParameter(
+            Labels.withId(DISTANCE_KEY)
+        )
+        .build();
+  }
+
+  @Override
+  public void onInvocation(ProcessorParams parameters, SpOutputCollector 
spOutputCollector,
+                           EventProcessorRuntimeContext runtimeContext) throws 
SpRuntimeException {
+
+    this.geometryMapper = 
parameters.extractor().mappingPropertyValue(GEOM_KEY);
+    this.epsgMapper = parameters.extractor().mappingPropertyValue(EPSG_KEY);
+    String readCapStyle = parameters.extractor().selectedSingleValue(CAP_KEY, 
String.class);
+    this.segments = parameters.extractor().singleValueParameter(SEGMENTS_KEY, 
Integer.class);
+    this.simplifyFactor = 
parameters.extractor().singleValueParameter(SIMPLIFY_FACTOR_KEY, Double.class);
+    this.distance = parameters.extractor().singleValueParameter(DISTANCE_KEY, 
Double.class);
+
+    // transform names to numbers
+    this.capStyle = 1;
+    if (readCapStyle.equals(CapStyle.Square.name())) {
+      this.capStyle = CapStyle.Square.getNumber();
+    } else if (readCapStyle.equals(CapStyle.Flat.name())) {
+      this.capStyle = CapStyle.Flat.getNumber();
+    }
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) throws 
SpRuntimeException {
+    String geom = 
event.getFieldBySelector(geometryMapper).getAsPrimitive().getAsString();
+    Integer epsg = 
event.getFieldBySelector(epsgMapper).getAsPrimitive().getAsInt();
+    Geometry geometry = SpGeometryBuilder.createSPGeom(geom, epsg);
+
+
+    if (geometry instanceof Point) {
+      Geometry buffer = SpBufferBuilder.createSpBuffer((Point) geometry, 
distance, capStyle, segments, simplifyFactor);
+
+      if (!buffer.isEmpty()) {
+        event.addField(GEOM_RUNTIME, buffer.toText());
+        event.addField(EPSG_RUNTIME, buffer.getSRID());
+        collector.collect(event);
+      } else {
+        LOG.warn("An empty polygon geometry is created and is not parsed into 
the stream");
+      }
+    } else {
+      LOG.warn("Only points are supported but input type is " + 
geometry.getGeometryType());
+    }
+  }
+  @Override
+  public void onDetach() throws SpRuntimeException {
+  }
+}
diff --git 
a/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/documentation.md
 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/documentation.md
new file mode 100755
index 000000000..191b3642f
--- /dev/null
+++ 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/documentation.md
@@ -0,0 +1,79 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~    http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+## Buffer Point Geometry
+
+<p align="center">
+    <img src="icon.png" width="150px;" class="pe-image-documentation"/>
+</p>
+
+***
+
+## Description
+
+Creates a buffer polygon geometry from a point geometry
+***
+
+## Required inputs
+
+* WKT of a JTS Point Geometry
+* Integer value representing EPSG code
+* Distance
+* Cap Style
+* Simplify Factor
+* Quadrant Segments
+***
+
+## Configuration
+
+
+### 1st parameter
+Input Point Geometry
+
+### 2nd parameter
+EPSG code value
+
+### 3rd parameter
+Distance
+The buffer distance around in geometry in meter
+
+### 4rd parameter
+Cap Style
+CAP_ROUND - the usual round end caps
+CAP_SQUARE - end caps are squared off at the buffer distance beyond the line 
ends
+
+
+### 5rd parameter
+Simplify Factor
+The default simplify factor Provides an accuracy of about 1%, which matches 
the accuracy of the
+default Quadrant Segments parameter.
+
+### 6rd parameter
+Quadrant Segments
+The default number of facets into which to divide a fillet of 90 degrees.
+
+***
+
+## Output
+
+<p align="center">
+    <img src="output.png" width="500;" class="pe-image-documentation"/>
+</p>
+
+### Example
+
diff --git 
a/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/icon.png
 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/icon.png
new file mode 100755
index 000000000..7a8e8fea4
Binary files /dev/null and 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/icon.png
 differ
diff --git 
a/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/strings.en
 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/strings.en
new file mode 100755
index 000000000..488586bf1
--- /dev/null
+++ 
b/streampipes-extensions/streampipes-processors-geo-jvm/src/main/resources/org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint/strings.en
@@ -0,0 +1,20 @@
+org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint.title=Geo 
Buffer Point
+org.apache.streampipes.processors.geo.jvm.jts.processor.bufferpoint.description=Creates
 a polygon buffer from a point
+
+geometry-key.title=JTS Point Event
+geometry-key.description=Single Point Event which will be added to the 
trajectory
+
+epsg-key.title=JTS Point
+epsg-key.description=JTS Point
+
+cap-style-key.title=Cap Style Parameter
+cap-style-key.description= Cap style
+
+segments-key.title=Quadrant segments
+segments-key.description= Accuracy of approximation for circular arcs
+
+simplify-factor-key.title=Simplify factor
+simplify-factor-key.description=Simplify factor
+
+distance-key.title=Distance
+distance-key.description=Distance in meters with radius of the buffer
\ No newline at end of file

Reply via email to