From b09d0e98541edc7122d992e85547741ffd57f72a Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Sat, 26 Nov 2016 19:33:54 +0700 Subject: Implement polyline geofence --- src/org/traccar/helper/DistanceCalculator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/org/traccar/helper/DistanceCalculator.java') diff --git a/src/org/traccar/helper/DistanceCalculator.java b/src/org/traccar/helper/DistanceCalculator.java index 3452597ab..ceeee4be4 100644 --- a/src/org/traccar/helper/DistanceCalculator.java +++ b/src/org/traccar/helper/DistanceCalculator.java @@ -33,4 +33,20 @@ public final class DistanceCalculator { return d * 1000; } + public static double distanceToInterval( + double pointLat, double pointLon, double lat1, double lon1, double lat2, double lon2) { + double d0 = distance(pointLat, pointLon, lat1, lon1); + double d1 = distance(lat1, lon1, lat2, lon2); + double d2 = distance(lat2, lon2, pointLat, pointLon); + if (Math.pow(d0, 2) > Math.pow(d1, 2) + Math.pow(d2, 2)) { + return d2; + } + if (Math.pow(d2, 2) > Math.pow(d1, 2) + Math.pow(d0, 2)) { + return d0; + } + double halfP = (d0 + d1 + d2) * 0.5; + double area = Math.sqrt(halfP * (halfP - d0) * (halfP - d1) * (halfP - d2)); + return 2 * area / d1; + } + } -- cgit v1.2.3 From c814f3f3556422d9e7e49d6b958621058293c1ac Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Sat, 26 Nov 2016 20:06:35 +0700 Subject: Add license header --- src/org/traccar/geofence/GeofencePolyline.java | 16 ++++++++++++++++ src/org/traccar/helper/DistanceCalculator.java | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'src/org/traccar/helper/DistanceCalculator.java') diff --git a/src/org/traccar/geofence/GeofencePolyline.java b/src/org/traccar/geofence/GeofencePolyline.java index 60d7b0605..e99987207 100644 --- a/src/org/traccar/geofence/GeofencePolyline.java +++ b/src/org/traccar/geofence/GeofencePolyline.java @@ -1,3 +1,19 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 Andrey Kunitsyn (andrey@traccar.org) + * + * Licensed 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.traccar.geofence; import java.text.ParseException; diff --git a/src/org/traccar/helper/DistanceCalculator.java b/src/org/traccar/helper/DistanceCalculator.java index ceeee4be4..873e84977 100644 --- a/src/org/traccar/helper/DistanceCalculator.java +++ b/src/org/traccar/helper/DistanceCalculator.java @@ -1,5 +1,6 @@ /* - * Copyright 2014 Anton Tananaev (anton@traccar.org) + * Copyright 2014 - 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 Andrey Kunitsyn (andrey@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. -- cgit v1.2.3 From 5ea4572553a84126b7e9f06c822e1a183413a558 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Sun, 27 Nov 2016 10:18:13 +0700 Subject: - Rename function - Fix formatting --- src/org/traccar/geofence/GeofencePolyline.java | 2 +- src/org/traccar/helper/DistanceCalculator.java | 2 +- .../org/traccar/geofence/GeofencePolylineTest.java | 25 ++++++++-------------- .../org/traccar/helper/DistanceCalculatorTest.java | 6 +++--- 4 files changed, 14 insertions(+), 21 deletions(-) (limited to 'src/org/traccar/helper/DistanceCalculator.java') diff --git a/src/org/traccar/geofence/GeofencePolyline.java b/src/org/traccar/geofence/GeofencePolyline.java index e99987207..cadc69da6 100644 --- a/src/org/traccar/geofence/GeofencePolyline.java +++ b/src/org/traccar/geofence/GeofencePolyline.java @@ -38,7 +38,7 @@ public class GeofencePolyline extends GeofenceGeometry { public boolean containsPoint(double latitude, double longitude) { double longitude360 = longitude + Coordinate.DEGREE360; for (int i = 1; i < coordinates.size(); i++) { - if (DistanceCalculator.distanceToInterval( + if (DistanceCalculator.distanceToLine( latitude, longitude360, coordinates.get(i - 1).getLat(), coordinates.get(i - 1).getLon360(), coordinates.get(i).getLat(), coordinates.get(i).getLon360()) <= distance) { return true; diff --git a/src/org/traccar/helper/DistanceCalculator.java b/src/org/traccar/helper/DistanceCalculator.java index 873e84977..88d4ef8a4 100644 --- a/src/org/traccar/helper/DistanceCalculator.java +++ b/src/org/traccar/helper/DistanceCalculator.java @@ -34,7 +34,7 @@ public final class DistanceCalculator { return d * 1000; } - public static double distanceToInterval( + public static double distanceToLine( double pointLat, double pointLon, double lat1, double lon1, double lat2, double lon2) { double d0 = distance(pointLat, pointLon, lat1, lon1); double d1 = distance(lat1, lon1, lat2, lon2); diff --git a/test/org/traccar/geofence/GeofencePolylineTest.java b/test/org/traccar/geofence/GeofencePolylineTest.java index df939d8ba..e281c3dd6 100644 --- a/test/org/traccar/geofence/GeofencePolylineTest.java +++ b/test/org/traccar/geofence/GeofencePolylineTest.java @@ -12,7 +12,7 @@ public class GeofencePolylineTest { String test = "LINESTRING (55.75474 37.61823, 55.75513 37.61888, 55.7535 37.6222, 55.75315 37.62165)"; GeofenceGeometry geofenceGeometry = new GeofencePolyline(); try { - geofenceGeometry.fromWkt(test); + geofenceGeometry.fromWkt(test); } catch (ParseException e){ Assert.assertTrue("ParseExceprion: " + e.getMessage(), true); } @@ -22,33 +22,26 @@ public class GeofencePolylineTest { @Test public void testContainsPolyline1Interval() { String test = "LINESTRING (56.83777 60.59833, 56.83766 60.5968)"; - try { - GeofenceGeometry geofenceGeometry = new GeofencePolyline(test, 35); - Assert.assertTrue(geofenceGeometry.containsPoint(56.83801, 60.59748)); - - ((GeofencePolyline) geofenceGeometry).setDistance(15); - Assert.assertTrue(!geofenceGeometry.containsPoint(56.83801, 60.59748)); - + GeofenceGeometry geofenceGeometry = new GeofencePolyline(test, 35); + Assert.assertTrue(geofenceGeometry.containsPoint(56.83801, 60.59748)); + ((GeofencePolyline) geofenceGeometry).setDistance(15); + Assert.assertTrue(!geofenceGeometry.containsPoint(56.83801, 60.59748)); } catch (ParseException e){ Assert.assertTrue("ParseExceprion: " + e.getMessage(), true); } } - @Test public void testContainsPolyline3Intervals() { String test = "LINESTRING (56.836 60.6126, 56.8393 60.6114, 56.83887 60.60811, 56.83782 60.5988)"; - try { - GeofenceGeometry geofenceGeometry = new GeofencePolyline(test, 15); - Assert.assertTrue(geofenceGeometry.containsPoint(56.83847, 60.60458)); - Assert.assertTrue(!geofenceGeometry.containsPoint(56.83764, 60.59725)); - Assert.assertTrue(!geofenceGeometry.containsPoint(56.83861, 60.60822)); - + GeofenceGeometry geofenceGeometry = new GeofencePolyline(test, 15); + Assert.assertTrue(geofenceGeometry.containsPoint(56.83847, 60.60458)); + Assert.assertTrue(!geofenceGeometry.containsPoint(56.83764, 60.59725)); + Assert.assertTrue(!geofenceGeometry.containsPoint(56.83861, 60.60822)); } catch (ParseException e){ Assert.assertTrue("ParseExceprion: " + e.getMessage(), true); } } - } diff --git a/test/org/traccar/helper/DistanceCalculatorTest.java b/test/org/traccar/helper/DistanceCalculatorTest.java index 2ce54c583..22e41c9a3 100644 --- a/test/org/traccar/helper/DistanceCalculatorTest.java +++ b/test/org/traccar/helper/DistanceCalculatorTest.java @@ -12,11 +12,11 @@ public class DistanceCalculatorTest { } @Test - public void testDistanceToInterval() { - Assert.assertEquals(DistanceCalculator.distanceToInterval( + public void testDistanceToLine() { + Assert.assertEquals(DistanceCalculator.distanceToLine( 56.83801, 60.59748, 56.83777, 60.59833, 56.83766, 60.5968), 33.0, 5.0); - Assert.assertEquals(DistanceCalculator.distanceToInterval( + Assert.assertEquals(DistanceCalculator.distanceToLine( 56.83753, 60.59508, 56.83777, 60.59833, 56.83766, 60.5968), 105.0, 5.0); } -- cgit v1.2.3