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
