You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by mi...@apache.org on 2020/05/21 04:33:20 UTC

[incubator-streampipes-extensions] branch feature/geodesicCalc updated: introducing GeographicLib Geodesic Calculation

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

micklich pushed a commit to branch feature/geodesicCalc
in repository https://gitbox.apache.org/repos/asf/incubator-streampipes-extensions.git


The following commit(s) were added to refs/heads/feature/geodesicCalc by this push:
     new 650c420  introducing GeographicLib Geodesic Calculation
650c420 is described below

commit 650c4201526481cbfdcad24d83a71e38146349ad
Author: micklich <fl...@disy.net>
AuthorDate: Thu May 21 06:32:59 2020 +0200

    introducing GeographicLib Geodesic Calculation
---
 streampipes-processors-geo-jvm/pom.xml             | 25 ++++++++---
 .../util => jts/helper}/SpLengthCalculator.java    | 51 +++++++++++++---------
 .../distancecalculator/DistanceCalculator.java     |  2 +-
 .../DistanceCalculatorController.java              |  4 +-
 .../StaticDistanceCalculator.java                  |  4 +-
 .../StaticDistanceCalculatorController.java        |  2 +-
 6 files changed, 56 insertions(+), 32 deletions(-)

diff --git a/streampipes-processors-geo-jvm/pom.xml b/streampipes-processors-geo-jvm/pom.xml
index 11db712..0a81d59 100644
--- a/streampipes-processors-geo-jvm/pom.xml
+++ b/streampipes-processors-geo-jvm/pom.xml
@@ -17,7 +17,8 @@
   ~
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>streampipes-extensions</artifactId>
         <groupId>org.apache.streampipes</groupId>
@@ -27,6 +28,13 @@
 
     <artifactId>streampipes-processors-geo-jvm</artifactId>
 
+    <properties>
+        <geographiclib.version>1.50</geographiclib.version>
+        <javax.measur.version>1.0</javax.measur.version>
+        <tec.units.version>1.0.3</tec.units.version>
+        <si.uom.version>1.0</si.uom.version>
+    </properties>
+
     <dependencies>
         <!-- StreamPipes dependencies -->
         <dependency>
@@ -87,24 +95,31 @@
             <version>1.16.1</version>
         </dependency>
 
+        <dependency>
+            <groupId>net.sf.geographiclib</groupId>
+            <artifactId>GeographicLib-Java</artifactId>
+            <version>${geographiclib.version}</version>
+        </dependency>
 
-
+        <!-- units -->
         <dependency>
             <groupId>javax.measure</groupId>
             <artifactId>unit-api</artifactId>
-            <version>1.0</version>
+            <version>${javax.measur.version}</version>
         </dependency>
+
         <dependency>
             <groupId>tec.units</groupId>
             <artifactId>unit-ri</artifactId>
-            <version>1.0.3</version>
+            <version>${tec.units.version}</version>
         </dependency>
 
         <dependency>
             <groupId>si.uom</groupId>
             <artifactId>si-units</artifactId>
-            <version>1.0</version>
+            <version>${si.uom.version}</version>
         </dependency>
+
         <dependency>
             <groupId>org.apache.streampipes</groupId>
             <artifactId>streampipes-measurement-units</artifactId>
diff --git a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/util/SpLengthCalculator.java b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/jts/helper/SpLengthCalculator.java
similarity index 76%
rename from streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/util/SpLengthCalculator.java
rename to streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/jts/helper/SpLengthCalculator.java
index 495546b..3a4c0a6 100644
--- a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/util/SpLengthCalculator.java
+++ b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/jts/helper/SpLengthCalculator.java
@@ -1,13 +1,12 @@
-package org.apache.streampipes.processors.geo.jvm.processor.util;
+package org.apache.streampipes.processors.geo.jvm.jts.helper;
 
+
+import net.sf.geographiclib.Geodesic;
+import net.sf.geographiclib.GeodesicData;
 import si.uom.SI;
 import tec.units.ri.quantity.Quantities;
 import tec.units.ri.unit.MetricPrefix;
 
-
-//import com.github.jqudt.Quantity;
-//import com.github.jqudt.Unit;
-
 import javax.measure.Quantity;
 import javax.measure.Unit;
 import javax.measure.quantity.Length;
@@ -18,10 +17,10 @@ public class SpLengthCalculator {
 
   private final double EARTHRADIUS = 6378137; //meters
 
-  private final Unit<Length> M = SI.METRE;
-  private final Unit<Length> KM = MetricPrefix.KILO(M);
-  private final Unit<Length> MILE = M.multiply(1609344).divide(1000);
-  private final Unit<Length> FOOT = M.multiply(3048).divide(10000);
+  private final Unit<Length> METER = SI.METRE;
+  private final Unit<Length> KM = MetricPrefix.KILO(METER);
+  private final Unit<Length> MILE = METER.multiply(1609344).divide(1000);
+  private final Unit<Length> FOOT = METER.multiply(3048).divide(10000);
 
   public enum ValidLengthUnits {
     METER(1), KM(2), MILE(3), FOOT(4);
@@ -43,7 +42,7 @@ public class SpLengthCalculator {
 
   // ========================= constructor
   public SpLengthCalculator(int decimalPosition) {
-    this.length = Quantities.getQuantity(-9999, M);
+    this.length = Quantities.getQuantity(-9999, METER);
     this.decimalPosition = decimalPosition;
   }
 
@@ -82,6 +81,7 @@ public class SpLengthCalculator {
 
 
   // unit Transformation
+
   /**
    * convert  Quantity<Length>  value to Unit<Length>
    *
@@ -90,7 +90,7 @@ public class SpLengthCalculator {
   public void convertUnit(ValidLengthUnits value) {
     switch (value.getNumber()) {
       case 1:
-        setLength(this.length.to(M));
+        setLength(this.length.to(METER));
         break;
       case 2:
         setLength(this.length.to(KM));
@@ -112,7 +112,7 @@ public class SpLengthCalculator {
   public void convertUnit(int value) {
     switch (value) {
       case 1:
-        setLength(this.length.to(M));
+        setLength(this.length.to(METER));
         break;
       case 2:
         setLength(this.length.to(KM));
@@ -164,17 +164,28 @@ public class SpLengthCalculator {
   }
 
 
-  public void calcGeodesicDistance(double lat1, double lng1, double lat2, double lng2) {
-     // using haversine formula
-    double dLat = Math.toRadians(lat2-lat1);
-    double dLng = Math.toRadians(lng2-lng1);
-    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
+  public void calcGeodesicDistanceOld(double lat1, double lng1, double lat2, double lng2) {
+    // using haversine formula
+    double dLat = Math.toRadians(lat2 - lat1);
+    double dLng = Math.toRadians(lng2 - lng1);
+    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
         Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
-            Math.sin(dLng/2) * Math.sin(dLng/2);
-    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
+            Math.sin(dLng / 2) * Math.sin(dLng / 2);
+    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
     float dist = (float) (EARTHRADIUS * c);
 
-    setLength(dist, M);
+    setLength(dist, METER);
   }
 
+
+  public void calcGeodesicDistance(double lat1, double lng1, double lat2, double lng2) {
+    //uses WGS847 Ellipsoid
+    Geodesic geod = Geodesic.WGS84;
+    // calculates all kind of parameters via Inverse method
+    GeodesicData dist = geod.Inverse(lat1, lng1, lat2, lng2);
+    // we only need s12 parameter -> length
+    double result = dist.s12;
+
+    setLength(result, METER);
+  }
 }
diff --git a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/distancecalculator/DistanceCalculator.java b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/distancecalculator/DistanceCalculator.java
index 4d0072b..406285d 100644
--- a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/distancecalculator/DistanceCalculator.java
+++ b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/distancecalculator/DistanceCalculator.java
@@ -20,7 +20,7 @@ package org.apache.streampipes.processors.geo.jvm.processor.distancecalculator;
 
 import org.apache.streampipes.logging.api.Logger;
 import org.apache.streampipes.model.runtime.Event;
-import org.apache.streampipes.processors.geo.jvm.processor.util.SpLengthCalculator;
+import org.apache.streampipes.processors.geo.jvm.jts.helper.SpLengthCalculator;
 import org.apache.streampipes.wrapper.context.EventProcessorRuntimeContext;
 import org.apache.streampipes.wrapper.routing.SpOutputCollector;
 import org.apache.streampipes.wrapper.runtime.EventProcessor;
diff --git a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/distancecalculator/DistanceCalculatorController.java b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/distancecalculator/DistanceCalculatorController.java
index 0d7de4c..fb13876 100644
--- a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/distancecalculator/DistanceCalculatorController.java
+++ b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/distancecalculator/DistanceCalculatorController.java
@@ -22,7 +22,7 @@ import org.apache.streampipes.model.DataProcessorType;
 import org.apache.streampipes.model.graph.DataProcessorDescription;
 import org.apache.streampipes.model.graph.DataProcessorInvocation;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.processors.geo.jvm.processor.util.SpLengthCalculator;
+import org.apache.streampipes.processors.geo.jvm.jts.helper.SpLengthCalculator;
 import org.apache.streampipes.sdk.builder.PrimitivePropertyBuilder;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
@@ -46,8 +46,6 @@ public class DistanceCalculatorController extends StandaloneEventProcessingDecla
   private static final String DECIMAL_POSITION_KEY = "decimalPosition-key";
   private static final String UNIT_KEY = "unit-key";
 
-  private static final String CALCULATED_DISTANCE_KEY = "calculatedDistance";
-
   protected final static String LENGTH_RUNTIME = "geodesicDistance";
   protected final static String UNIT_RUNTIME = "geodesicDistanceUnit";
 
diff --git a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/staticdistancecalculator/StaticDistanceCalculator.java b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/staticdistancecalculator/StaticDistanceCalculator.java
index 6b680a4..9bc3598 100644
--- a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/staticdistancecalculator/StaticDistanceCalculator.java
+++ b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/staticdistancecalculator/StaticDistanceCalculator.java
@@ -17,9 +17,8 @@
 package org.apache.streampipes.processors.geo.jvm.processor.staticdistancecalculator;
 
 import org.apache.streampipes.commons.exceptions.SpRuntimeException;
-import org.apache.streampipes.logging.api.Logger;
 import org.apache.streampipes.model.runtime.Event;
-import org.apache.streampipes.processors.geo.jvm.processor.util.SpLengthCalculator;
+import org.apache.streampipes.processors.geo.jvm.jts.helper.SpLengthCalculator;
 import org.apache.streampipes.wrapper.context.EventProcessorRuntimeContext;
 import org.apache.streampipes.wrapper.routing.SpOutputCollector;
 import org.apache.streampipes.wrapper.runtime.EventProcessor;
@@ -71,6 +70,7 @@ public class StaticDistanceCalculator implements EventProcessor<StaticDistanceCa
 
       collector.collect(event);
 
+
     } else {
       if ((SpGeometryBuilder.isInWGSCoordinateRange(latitude, -90, 90))) {
         throw new SpRuntimeException("Input of Latitude value is out of range. Value: "
diff --git a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/staticdistancecalculator/StaticDistanceCalculatorController.java b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/staticdistancecalculator/StaticDistanceCalculatorController.java
index 814259f..1d424b2 100644
--- a/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/staticdistancecalculator/StaticDistanceCalculatorController.java
+++ b/streampipes-processors-geo-jvm/src/main/java/org/apache/streampipes/processors/geo/jvm/processor/staticdistancecalculator/StaticDistanceCalculatorController.java
@@ -20,7 +20,7 @@ import org.apache.streampipes.model.DataProcessorType;
 import org.apache.streampipes.model.graph.DataProcessorDescription;
 import org.apache.streampipes.model.graph.DataProcessorInvocation;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.processors.geo.jvm.processor.util.SpLengthCalculator;
+import org.apache.streampipes.processors.geo.jvm.jts.helper.SpLengthCalculator;
 import org.apache.streampipes.sdk.builder.PrimitivePropertyBuilder;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;