├── .gitignore ├── LICENSE ├── README.md ├── pom.xml └── src ├── main └── java │ └── com │ └── goebl │ └── simplify │ ├── AbstractSimplify.java │ ├── Point.java │ ├── Point3D.java │ ├── Point3DExtractor.java │ ├── PointExtractor.java │ ├── Simplify.java │ └── Simplify3D.java └── test ├── java └── com │ └── goebl │ └── simplify │ ├── GpsLocationTest.java │ ├── Simplify3DTest.java │ └── SimplifyTest.java ├── reference-impl ├── README.md ├── index.js ├── lib │ ├── simplify.js │ └── test-data.js └── package.json └── resources ├── gps-track.txt ├── points-1.0-hq.txt ├── points-1.0-sq.txt ├── points-1.5-hq.txt ├── points-1.5-sq.txt ├── points-2.0-hq.txt ├── points-2.0-sq.txt ├── points-4.0-hq.txt ├── points-4.0-sq.txt ├── points-5.0-hq.txt ├── points-5.0-sq.txt └── points-all.txt /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | target 4 | *.log 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Heinrich Göbl 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simplify-java # 2 | 3 | Simplification of a 2D-polyline or a 3D-polyline. 4 | 5 | * Uses Radial-Distance algorithm (fast) or Douglas-Peucker (high quality) algorithm 6 | * Port of [mourner / simplify-js](https://github.com/mourner/simplify-js), a High-performance JavaScript 2D/3D 7 | polyline simplification library by Vladimir Agafonkin 8 | * Can handle arbitrary objects carrying coordinates (2D, 3D) 9 | * either by implementing an interface 10 | * or by providing a helper extracting the coordinates 11 | * Leaves the objects untouched, just creates a new array referencing the simplified points 12 | * requires Java 5 13 | * Maven Build 14 | * JUnit-tested 15 | * 94% lines covered 16 | * reference data is created by "original" JavaScript implementation (Version 1.1.0) 17 | 18 | # Example # 19 | 20 | ```java 21 | // create an instance of the simplifier (empty array needed by List.toArray) 22 | Simplify simplify = new Simplify(new MyPoint[0]); 23 | 24 | // here we have an array with hundreds of points 25 | Point[] allPoints = ... 26 | double tolerance = ... 27 | boolean highQuality = true; // Douglas-Peucker, false for Radial-Distance 28 | 29 | // run simplification process 30 | Point[] lessPoints = simplify.simplify(allPoints, tolerance, highQuality); 31 | ``` 32 | 33 | **Please note** 34 | The algorithm squares differences of x, y and z coordinates. If this difference is less than 1, 35 | the square of it will get even less. In such cases, the tolerance has negative effect. 36 | 37 | Solution: multiply your coordinates by a factor so the values are shifted in a way so that taking 38 | the square of the differences creates greater values. 39 | 40 | If your Points don't have the `com.goebl.simplify.Point` interface, you can implement it on your 41 | Point-Class, or (better w.r.t. separation of concerns) provide an implementation of the 42 | `PointExtractor` interface. 43 | 44 | Here is an example (taken from the test cases): 45 | 46 | Example for your own point-class, let's assume it's not possible/desirable to 47 | let it implement com.goebl.simplify.Point interface: 48 | 49 | ```java 50 | public class LatLng { 51 | private final double lat; 52 | private final double lng; 53 | 54 | public LatLng(double lat, double lng) { 55 | this.lat = lat; 56 | this.lng = lng; 57 | } 58 | 59 | public double getLat() { 60 | return lat; 61 | } 62 | 63 | public double getLng() { 64 | return lng; 65 | } 66 | } 67 | ``` 68 | 69 | In the class where you simplify the points, you need a **PointExtractor**. As mentioned above, 70 | the resulting x and y values are shifted in a space where delta-x and delta-y are no longer very 71 | small numbers below 1: 72 | 73 | ```java 74 | private static PointExtractor latLngPointExtractor = new PointExtractor() { 75 | @Override 76 | public double getX(LatLng point) { 77 | return point.getLat() * 1000000; 78 | } 79 | 80 | @Override 81 | public double getY(LatLng point) { 82 | return point.getLng() * 1000000; 83 | } 84 | }; 85 | ``` 86 | 87 | Simplification now works like this. Using a `PointExtractor` has the positive effect that you get 88 | an array of your original points, not copies: 89 | 90 | ```java 91 | LatLng[] coords = ... // the array of your "original" points 92 | 93 | Simplify simplify = new Simplify(new LatLng[0], latLngPointExtractor); 94 | 95 | LatLng[] simplified = simplify.simplify(coords, 20f, false); 96 | ``` 97 | 98 | For more examples see src/test/java/**/*Test. 99 | 100 | # Maven Coordinates 101 | 102 | ```xml 103 | 104 | com.goebl 105 | simplify 106 | 1.0.0 107 | 108 | 109 | 110 | com.goebl 111 | simplify 112 | 1.0.1-SNAPSHOT 113 | 114 | ``` 115 | 116 | Gradle 117 | 118 | 'com.goebl:simplify:1.0.0' 119 | 120 | Not using Maven/Gradle? - Then you can download the plain JAR from following links directly: 121 | 122 | * [SNAPSHOT Versions](https://oss.sonatype.org/content/groups/staging/com/goebl/simplify/) 123 | * [RELEASE Versions](http://repo.maven.apache.org/maven2/com/goebl/simplify/) 124 | 125 | # Licence # 126 | 127 | * [The MIT License](http://opensource.org/licenses/MIT) 128 | 129 | # TODO # 130 | 131 | * publish gh_pages (JavaDoc) 132 | 133 | # Alternatives / Infos # 134 | 135 | * 136 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | org.sonatype.oss 9 | oss-parent 10 | 7 11 | 12 | 13 | com.goebl 14 | simplify 15 | 1.0.1-SNAPSHOT 16 | jar 17 | 18 | simplify-java 19 | 2D/3D polyline simplification 20 | https://github.com/hgoebl/simplify-java 21 | 22 | 23 | UTF-8 24 | 25 | 26 | 27 | 28 | junit 29 | junit 30 | 4.11 31 | test 32 | 33 | 34 | 35 | 36 | 37 | The MIT License 38 | http://opensource.org/licenses/MIT 39 | repo 40 | 41 | 42 | 43 | 44 | 45 | hgoebl 46 | Heinrich Goebl 47 | hgoebl@goebl.com 48 | 49 | 50 | 51 | 52 | git@github.com:hgoebl/simplify-java.git 53 | scm:git:git@github.com:hgoebl/simplify-java.git 54 | scm:git:git@github.com:hgoebl/simplify-java.git 55 | 56 | 57 | 58 | 59 | sonatype-nexus-snapshots 60 | Sonatype Nexus snapshot repository 61 | https://oss.sonatype.org/content/repositories/snapshots 62 | 63 | 64 | sonatype-nexus-staging 65 | Sonatype Nexus release repository 66 | https://oss.sonatype.org/service/local/staging/deploy/maven2 67 | 68 | 69 | 70 | 71 | Github Issues 72 | https://github.com/hgoebl/simplify-java/issues 73 | 74 | 75 | 76 | 77 | 78 | org.apache.maven.plugins 79 | maven-compiler-plugin 80 | 2.3.2 81 | 82 | 1.5 83 | 1.5 84 | 85 | 86 | 87 | org.apache.maven.plugins 88 | maven-source-plugin 89 | 2.1.2 90 | 91 | 92 | attach-sources 93 | 94 | jar 95 | 96 | 97 | 98 | 99 | 100 | org.apache.maven.plugins 101 | maven-javadoc-plugin 102 | 2.9.1 103 | 104 | true 105 | true 106 | true 107 | true 108 | 109 | 110 | 111 | attach-javadocs 112 | 113 | jar 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | sign-artifacts 124 | 125 | 126 | gpg.passphrase 127 | 128 | 129 | 130 | 131 | 132 | org.apache.maven.plugins 133 | maven-gpg-plugin 134 | 1.4 135 | 136 | 137 | sign-artifacts 138 | verify 139 | 140 | sign 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /src/main/java/com/goebl/simplify/AbstractSimplify.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | import java.util.ArrayList; 4 | import java.util.BitSet; 5 | import java.util.List; 6 | 7 | /** 8 | * Abstract base class for simplification of a polyline. 9 | * 10 | * @author hgoebl 11 | * @since 06.07.13 12 | */ 13 | abstract class AbstractSimplify { 14 | 15 | private T[] sampleArray; 16 | 17 | protected AbstractSimplify(T[] sampleArray) { 18 | this.sampleArray = sampleArray; 19 | } 20 | 21 | /** 22 | * Simplifies a list of points to a shorter list of points. 23 | * @param points original list of points 24 | * @param tolerance tolerance in the same measurement as the point coordinates 25 | * @param highestQuality true for using Douglas-Peucker only, 26 | * false for using Radial-Distance algorithm before 27 | * applying Douglas-Peucker (should be a bit faster) 28 | * @return simplified list of points 29 | */ 30 | public T[] simplify(T[] points, 31 | double tolerance, 32 | boolean highestQuality) { 33 | 34 | if (points == null || points.length <= 2) { 35 | return points; 36 | } 37 | 38 | double sqTolerance = tolerance * tolerance; 39 | 40 | if (!highestQuality) { 41 | points = simplifyRadialDistance(points, sqTolerance); 42 | } 43 | 44 | points = simplifyDouglasPeucker(points, sqTolerance); 45 | 46 | return points; 47 | } 48 | 49 | T[] simplifyRadialDistance(T[] points, double sqTolerance) { 50 | T point = null; 51 | T prevPoint = points[0]; 52 | 53 | List newPoints = new ArrayList(); 54 | newPoints.add(prevPoint); 55 | 56 | for (int i = 1; i < points.length; ++i) { 57 | point = points[i]; 58 | 59 | if (getSquareDistance(point, prevPoint) > sqTolerance) { 60 | newPoints.add(point); 61 | prevPoint = point; 62 | } 63 | } 64 | 65 | if (prevPoint != point) { 66 | newPoints.add(point); 67 | } 68 | 69 | return newPoints.toArray(sampleArray); 70 | } 71 | 72 | private static class Range { 73 | private Range(int first, int last) { 74 | this.first = first; 75 | this.last = last; 76 | } 77 | 78 | int first; 79 | int last; 80 | } 81 | 82 | T[] simplifyDouglasPeucker(T[] points, double sqTolerance) { 83 | 84 | BitSet bitSet = new BitSet(points.length); 85 | bitSet.set(0); 86 | bitSet.set(points.length - 1); 87 | 88 | List stack = new ArrayList(); 89 | stack.add(new Range(0, points.length - 1)); 90 | 91 | while (!stack.isEmpty()) { 92 | Range range = stack.remove(stack.size() - 1); 93 | 94 | int index = -1; 95 | double maxSqDist = 0f; 96 | 97 | // find index of point with maximum square distance from first and last point 98 | for (int i = range.first + 1; i < range.last; ++i) { 99 | double sqDist = getSquareSegmentDistance(points[i], points[range.first], points[range.last]); 100 | 101 | if (sqDist > maxSqDist) { 102 | index = i; 103 | maxSqDist = sqDist; 104 | } 105 | } 106 | 107 | if (maxSqDist > sqTolerance) { 108 | bitSet.set(index); 109 | 110 | stack.add(new Range(range.first, index)); 111 | stack.add(new Range(index, range.last)); 112 | } 113 | } 114 | 115 | List newPoints = new ArrayList(bitSet.cardinality()); 116 | for (int index = bitSet.nextSetBit(0); index >= 0; index = bitSet.nextSetBit(index + 1)) { 117 | newPoints.add(points[index]); 118 | } 119 | 120 | return newPoints.toArray(sampleArray); 121 | } 122 | 123 | 124 | public abstract double getSquareDistance(T p1, T p2); 125 | 126 | public abstract double getSquareSegmentDistance(T p0, T p1, T p2); 127 | } 128 | -------------------------------------------------------------------------------- /src/main/java/com/goebl/simplify/Point.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | /** 4 | * Access to X and Y coordinates (2D-Point). 5 | * 6 | * @author hgoebl 7 | * @since 06.07.13 8 | */ 9 | public interface Point { 10 | double getX(); 11 | double getY(); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/goebl/simplify/Point3D.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | /** 4 | * Access to X, Y and Z coordinates (3D-Point). 5 | * 6 | * @author hgoebl 7 | * @since 06.07.13 8 | */ 9 | public interface Point3D extends Point { 10 | double getZ(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/goebl/simplify/Point3DExtractor.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | /** 4 | * Helper to get X, Y and Z coordinates from a foreign class T. 5 | * 6 | * @author hgoebl 7 | * @since 06.07.13 8 | */ 9 | public interface Point3DExtractor extends PointExtractor { 10 | double getZ(T point); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/goebl/simplify/PointExtractor.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | /** 4 | * Helper to get X and Y coordinates from a foreign class T. 5 | * 6 | * @author hgoebl 7 | * @since 06.07.13 8 | */ 9 | public interface PointExtractor { 10 | double getX(T point); 11 | double getY(T point); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/goebl/simplify/Simplify.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | /** 4 | * Simplification of a 2D-polyline. 5 | * 6 | * @author hgoebl 7 | * @since 06.07.13 8 | */ 9 | public class Simplify extends AbstractSimplify { 10 | 11 | private final PointExtractor pointExtractor; 12 | 13 | /** 14 | * Simple constructor for 2D-Simplifier. 15 | *
16 | * With this simple constructor your array elements must implement {@link Point}.
17 | * If you have coordinate classes which cannot be changed to implement Point, use 18 | * {@link #Simplify(Object[], PointExtractor)} constructor! 19 | * 20 | * @param sampleArray pass just an empty array (new MyPoint[0]) - necessary for type consistency. 21 | */ 22 | public Simplify(T[] sampleArray) { 23 | super(sampleArray); 24 | this.pointExtractor = new PointExtractor() { 25 | @Override 26 | public double getX(T point) { 27 | return ((Point) point).getX(); 28 | } 29 | 30 | @Override 31 | public double getY(T point) { 32 | return ((Point) point).getY(); 33 | } 34 | }; 35 | } 36 | 37 | /** 38 | * Alternative constructor for 2D-Simplifier. 39 | *
40 | * With this constructor your array elements do not have to implement a special interface like {@link Point}.
41 | * Implement a {@link PointExtractor} to give Simplify access to your coordinates. 42 | * 43 | * @param sampleArray pass just an empty array (new MyPoint[0]) - necessary for type consistency. 44 | * @param pointExtractor your implementation to extract X and Y coordinates from you array elements. 45 | */ 46 | public Simplify(T[] sampleArray, PointExtractor pointExtractor) { 47 | super(sampleArray); 48 | this.pointExtractor = pointExtractor; 49 | } 50 | 51 | @Override 52 | public double getSquareDistance(T p1, T p2) { 53 | 54 | double dx = pointExtractor.getX(p1) - pointExtractor.getX(p2); 55 | double dy = pointExtractor.getY(p1) - pointExtractor.getY(p2); 56 | 57 | return dx * dx + dy * dy; 58 | } 59 | 60 | @Override 61 | public double getSquareSegmentDistance(T p0, T p1, T p2) { 62 | double x0, y0, x1, y1, x2, y2, dx, dy, t; 63 | 64 | x1 = pointExtractor.getX(p1); 65 | y1 = pointExtractor.getY(p1); 66 | x2 = pointExtractor.getX(p2); 67 | y2 = pointExtractor.getY(p2); 68 | x0 = pointExtractor.getX(p0); 69 | y0 = pointExtractor.getY(p0); 70 | 71 | dx = x2 - x1; 72 | dy = y2 - y1; 73 | 74 | if (dx != 0.0d || dy != 0.0d) { 75 | t = ((x0 - x1) * dx + (y0 - y1) * dy) 76 | / (dx * dx + dy * dy); 77 | 78 | if (t > 1.0d) { 79 | x1 = x2; 80 | y1 = y2; 81 | } else if (t > 0.0d) { 82 | x1 += dx * t; 83 | y1 += dy * t; 84 | } 85 | } 86 | 87 | dx = x0 - x1; 88 | dy = y0 - y1; 89 | 90 | return dx * dx + dy * dy; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/main/java/com/goebl/simplify/Simplify3D.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | /** 4 | * Simplification of a 3D-polyline. 5 | * 6 | * @author hgoebl 7 | * @since 06.07.13 8 | */ 9 | public class Simplify3D extends AbstractSimplify { 10 | 11 | private final Point3DExtractor pointExtractor; 12 | 13 | /** 14 | * Simple constructor for 3D-Simplifier. 15 | *
16 | * With this simple constructor your array elements must implement {@link Point3D}.
17 | * If you have coordinate classes which cannot be changed to implement Point3D, use 18 | * {@link #Simplify3D(Object[], Point3DExtractor)} constructor! 19 | * 20 | * @param sampleArray pass just an empty array (new MyPoint[0]) - necessary for type consistency. 21 | */ 22 | public Simplify3D(T[] sampleArray) { 23 | super(sampleArray); 24 | this.pointExtractor = new Point3DExtractor() { 25 | @Override 26 | public double getX(T point) { 27 | return ((Point) point).getX(); 28 | } 29 | 30 | @Override 31 | public double getY(T point) { 32 | return ((Point) point).getY(); 33 | } 34 | 35 | @Override 36 | public double getZ(T point) { 37 | return ((Point3D) point).getZ(); 38 | } 39 | }; 40 | } 41 | 42 | /** 43 | * Alternative constructor for 3D-Simplifier. 44 | *
45 | * With this constructor your array elements do not have to implement a special interface like {@link Point3D}.
46 | * Implement a {@link Point3DExtractor} to give Simplify3D access to your coordinates. 47 | * 48 | * @param sampleArray pass just an empty array (new MyPoint[0]) - necessary for type consistency. 49 | * @param pointExtractor your implementation to extract X, Y and Z coordinates from you array elements. 50 | */ 51 | public Simplify3D(T[] sampleArray, Point3DExtractor pointExtractor) { 52 | super(sampleArray); 53 | this.pointExtractor = pointExtractor; 54 | } 55 | 56 | @Override 57 | public double getSquareDistance(T p1, T p2) { 58 | 59 | double dx = pointExtractor.getX(p1) - pointExtractor.getX(p2); 60 | double dy = pointExtractor.getY(p1) - pointExtractor.getY(p2); 61 | double dz = pointExtractor.getZ(p1) - pointExtractor.getZ(p2); 62 | 63 | return dx * dx + dy * dy + dz * dz; 64 | } 65 | 66 | @Override 67 | public double getSquareSegmentDistance(T p0, T p1, T p2) { 68 | double x0, y0, z0, x1, y1, z1, x2, y2, z2, dx, dy, dz, t; 69 | 70 | x1 = pointExtractor.getX(p1); 71 | y1 = pointExtractor.getY(p1); 72 | z1 = pointExtractor.getZ(p1); 73 | x2 = pointExtractor.getX(p2); 74 | y2 = pointExtractor.getY(p2); 75 | z2 = pointExtractor.getZ(p2); 76 | x0 = pointExtractor.getX(p0); 77 | y0 = pointExtractor.getY(p0); 78 | z0 = pointExtractor.getZ(p0); 79 | 80 | dx = x2 - x1; 81 | dy = y2 - y1; 82 | dz = z2 - z1; 83 | 84 | if (dx != 0.0d || dy != 0.0d || dz != 0.0d) { 85 | t = ((x0 - x1) * dx + (y0 - y1) * dy + (z0 - z1) * dz) 86 | / (dx * dx + dy * dy + dz * dz); 87 | 88 | if (t > 1.0d) { 89 | x1 = x2; 90 | y1 = y2; 91 | z1 = z2; 92 | } else if (t > 0.0d) { 93 | x1 += dx * t; 94 | y1 += dy * t; 95 | z1 += dz * t; 96 | } 97 | } 98 | 99 | dx = x0 - x1; 100 | dy = y0 - y1; 101 | dz = z0 - z1; 102 | 103 | return dx * dx + dy * dy + dz * dz; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/test/java/com/goebl/simplify/GpsLocationTest.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | import org.junit.Assert; 4 | import org.junit.BeforeClass; 5 | import org.junit.Test; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | /** 11 | * Test class for {@link Simplify} in context of typical Gps-Tracks. 12 | *
13 | * This is more of a demonstration than a test. 14 | * See http://stackoverflow.com/q/34010298/2176962 15 | * 16 | * @author goebl 17 | * @since 01.12.15 18 | */ 19 | public class GpsLocationTest { 20 | 21 | private static class LatLng { 22 | private final double lat; 23 | private final double lng; 24 | 25 | public LatLng(double lat, double lng) { 26 | this.lat = lat; 27 | this.lng = lng; 28 | } 29 | 30 | public double getLat() { 31 | return lat; 32 | } 33 | 34 | public double getLng() { 35 | return lng; 36 | } 37 | } 38 | 39 | private static LatLng[] coords; 40 | 41 | private static PointExtractor latLngPointExtractor = new PointExtractor() { 42 | @Override 43 | public double getX(LatLng point) { 44 | return point.getLat() * 1000000; 45 | } 46 | 47 | @Override 48 | public double getY(LatLng point) { 49 | return point.getLng() * 1000000; 50 | } 51 | }; 52 | 53 | @BeforeClass 54 | public static void readPoints() throws Exception { 55 | Point[] allPoints = SimplifyTest.readPoints("gps-track.txt"); 56 | List coordsList = new ArrayList(allPoints.length); 57 | 58 | for (Point point:allPoints) { 59 | coordsList.add(new LatLng(point.getX(), point.getY())); 60 | } 61 | coords = coordsList.toArray(new LatLng[coordsList.size()]); 62 | } 63 | 64 | @Test 65 | public void testSimplifyGpsTrack() throws Exception { 66 | Simplify simplify = new Simplify(new LatLng[0], latLngPointExtractor); 67 | 68 | LatLng[] simplified = simplify.simplify(coords, 20f, false); 69 | System.out.println("coords:" + coords.length + " simplified:" + simplified.length); 70 | Assert.assertTrue("should be simplified to less than 33%", simplified.length < (coords.length / 3)); 71 | 72 | simplified = simplify.simplify(coords, 50f, true); 73 | System.out.println("coords:" + coords.length + " simplified:" + simplified.length); 74 | Assert.assertTrue("should be simplified to less than 20%", simplified.length < (coords.length * 0.2)); 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /src/test/java/com/goebl/simplify/Simplify3DTest.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | /** 7 | * Test class for {@link com.goebl.simplify.Simplify}. 8 | * 9 | * @author goebl 10 | * @since 06.07.13 11 | */ 12 | public class Simplify3DTest { 13 | 14 | private static final float[][] POINTS_3D = new float[][]{ 15 | {3.14f, 5.2f, 4f}, {5.7f, 8.1f, 5f}, {4.6f, -1.3f, 6f} 16 | }; 17 | 18 | @Test 19 | public void testCustomPoint3DExtractor() { 20 | Point3DExtractor pointExtractor = new Point3DExtractor() { 21 | @Override 22 | public double getX(float[] point) { 23 | return point[0]; 24 | } 25 | 26 | @Override 27 | public double getY(float[] point) { 28 | return point[1]; 29 | } 30 | 31 | @Override 32 | public double getZ(float[] point) { 33 | return point[2]; 34 | } 35 | }; 36 | 37 | Simplify3D simplify = new Simplify3D(new float[0][0], pointExtractor); 38 | 39 | float[][] simplified = simplify.simplify(POINTS_3D, 5.0f, false); 40 | Assert.assertEquals("array should be simplified", 2, simplified.length); 41 | 42 | simplified = simplify.simplify(POINTS_3D, 5.0f, true); 43 | Assert.assertEquals("array should be simplified", 2, simplified.length); 44 | } 45 | 46 | @Test 47 | public void testDefaultPointExtractor() { 48 | Point3D[] points = new MyPoint[POINTS_3D.length]; 49 | for (int i = 0; i < POINTS_3D.length; ++i) { 50 | points[i] = new MyPoint(POINTS_3D[i][0], POINTS_3D[i][1], POINTS_3D[i][2]); 51 | } 52 | 53 | Simplify3D simplify3D = new Simplify3D(new MyPoint[0]); 54 | 55 | Point3D[] simplified = simplify3D.simplify(points, 5.0d, false); 56 | Assert.assertEquals("array should be simplified", 2, simplified.length); 57 | 58 | simplified = simplify3D.simplify(points, 5.0d, true); 59 | Assert.assertEquals("array should be simplified", 2, simplified.length); 60 | } 61 | 62 | private static class MyPoint implements Point3D { 63 | double x; 64 | double y; 65 | double z; 66 | 67 | private MyPoint(double x, double y, double z) { 68 | this.x = x; 69 | this.y = y; 70 | this.z = z; 71 | } 72 | 73 | @Override 74 | public double getX() { 75 | return x; 76 | } 77 | 78 | @Override 79 | public double getY() { 80 | return y; 81 | } 82 | 83 | @Override 84 | public double getZ() { 85 | return z; 86 | } 87 | 88 | @Override 89 | public String toString() { 90 | return "{" + "x=" + x + ", y=" + y + ", z=" + z + '}'; 91 | } 92 | 93 | @Override 94 | public boolean equals(Object o) { 95 | if (this == o) return true; 96 | if (o == null || getClass() != o.getClass()) return false; 97 | 98 | MyPoint myPoint = (MyPoint) o; 99 | 100 | if (Double.compare(myPoint.x, x) != 0) return false; 101 | if (Double.compare(myPoint.y, y) != 0) return false; 102 | if (Double.compare(myPoint.z, z) != 0) return false; 103 | 104 | return true; 105 | } 106 | 107 | } 108 | 109 | } 110 | -------------------------------------------------------------------------------- /src/test/java/com/goebl/simplify/SimplifyTest.java: -------------------------------------------------------------------------------- 1 | package com.goebl.simplify; 2 | 3 | import org.junit.Assert; 4 | import org.junit.BeforeClass; 5 | import org.junit.Test; 6 | 7 | import java.io.BufferedReader; 8 | import java.io.File; 9 | import java.io.FileInputStream; 10 | import java.io.InputStream; 11 | import java.io.InputStreamReader; 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | import java.util.Locale; 15 | 16 | /** 17 | * Test class for {@link Simplify}. 18 | * 19 | * @author goebl 20 | * @since 06.07.13 21 | */ 22 | public class SimplifyTest { 23 | 24 | private static Point[] allPoints; 25 | private static final float[] TOLERANCES = new float[]{ 26 | 1.0f, 1.5f, 2.0f, 4.0f, 5.0f 27 | }; 28 | 29 | private static final float[][] POINTS_2D = new float[][]{ 30 | {3.14f, 5.2f}, {5.7f, 8.1f}, {4.6f, -1.3f} 31 | }; 32 | 33 | @BeforeClass 34 | public static void readPoints() throws Exception { 35 | allPoints = readPoints("points-all.txt"); 36 | } 37 | 38 | @Test 39 | public void testSimpleQuality() throws Exception { 40 | for (float tolerance : TOLERANCES) { 41 | assertPointsEqual(tolerance, false); 42 | } 43 | } 44 | 45 | @Test 46 | public void testHighQuality() throws Exception { 47 | for (float tolerance : TOLERANCES) { 48 | assertPointsEqual(tolerance, true); 49 | } 50 | } 51 | 52 | @Test 53 | public void testCustomPointExtractor() { 54 | PointExtractor pointExtractor = new PointExtractor() { 55 | @Override 56 | public double getX(float[] point) { 57 | return point[0]; 58 | } 59 | 60 | @Override 61 | public double getY(float[] point) { 62 | return point[1]; 63 | } 64 | }; 65 | 66 | Simplify simplify = new Simplify(new float[0][0], pointExtractor); 67 | 68 | float[][] simplified = simplify.simplify(POINTS_2D, 5.0f, false); 69 | Assert.assertEquals("array should be simplified", 2, simplified.length); 70 | 71 | simplified = simplify.simplify(POINTS_2D, 5.0f, true); 72 | Assert.assertEquals("array should be simplified", 2, simplified.length); 73 | } 74 | 75 | @Test 76 | public void testInvalidPointsParam() { 77 | Simplify aut = new Simplify(new MyPoint[0]); 78 | Assert.assertNull("return null when point-array is null", aut.simplify(null, 1f, false)); 79 | 80 | Point[] only2 = new Point[2]; 81 | only2[0] = new MyPoint(1, 2); 82 | only2[1] = new MyPoint(2, 3); 83 | 84 | Assert.assertTrue("return identical array when less than 3 points", 85 | only2 == aut.simplify(only2, 1f, false)); 86 | } 87 | 88 | private void assertPointsEqual(float tolerance, boolean highQuality) throws Exception { 89 | Point[] pointsExpected = readPoints(tolerance, highQuality); 90 | long start = System.nanoTime(); 91 | 92 | Simplify aut = new Simplify(new MyPoint[0]); 93 | Point[] pointsActual = aut.simplify(allPoints, tolerance, highQuality); 94 | long end = System.nanoTime(); 95 | System.out.println("tolerance=" + tolerance + " hq=" + highQuality 96 | + " nanos=" + (end - start)); 97 | 98 | Assert.assertNotNull("wrong test setup", pointsExpected); 99 | Assert.assertNotNull("simplify must return Point[]", pointsActual); 100 | 101 | Assert.assertArrayEquals("tolerance=" + tolerance + " hq=" + highQuality, 102 | pointsExpected, pointsActual); 103 | } 104 | 105 | private static Point[] readPoints(float tolerance, boolean highQuality) throws Exception { 106 | return readPoints(String.format(Locale.US, "points-%01.1f-%s.txt", 107 | tolerance, highQuality ? "hq" : "sq")); 108 | } 109 | 110 | static Point[] readPoints(String fileName) throws Exception { 111 | List pointList = new ArrayList(); 112 | File file = new File("src/test/resources", fileName); 113 | InputStream is = null; 114 | try { 115 | is = new FileInputStream(file); 116 | BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 117 | String line; 118 | while ((line = reader.readLine()) != null) { 119 | if (line.trim().length() == 0) { 120 | continue; 121 | } 122 | String[] xy = line.split(","); 123 | double x = Double.parseDouble(xy[0]); 124 | double y = Double.parseDouble(xy[1]); 125 | pointList.add(new MyPoint(x, y)); 126 | } 127 | } finally { 128 | if (is != null) { 129 | is.close(); 130 | } 131 | } 132 | return pointList.toArray(new MyPoint[pointList.size()]); 133 | } 134 | 135 | private static class MyPoint implements Point { 136 | double x; 137 | double y; 138 | 139 | private MyPoint(double x, double y) { 140 | this.x = x; 141 | this.y = y; 142 | } 143 | 144 | @Override 145 | public double getX() { 146 | return x; 147 | } 148 | 149 | @Override 150 | public double getY() { 151 | return y; 152 | } 153 | 154 | @Override 155 | public String toString() { 156 | return "{" + "x=" + x + ", y=" + y + '}'; 157 | } 158 | 159 | @Override 160 | public boolean equals(Object o) { 161 | if (this == o) return true; 162 | if (o == null || getClass() != o.getClass()) return false; 163 | 164 | MyPoint myPoint = (MyPoint) o; 165 | 166 | if (Double.compare(myPoint.x, x) != 0) return false; 167 | if (Double.compare(myPoint.y, y) != 0) return false; 168 | 169 | return true; 170 | } 171 | 172 | } 173 | 174 | } 175 | -------------------------------------------------------------------------------- /src/test/reference-impl/README.md: -------------------------------------------------------------------------------- 1 | # Testdata Generator for simplify-java # 2 | 3 | This package creates testdata (as reference) for the Java library 'hgoebl/simplify-java'. 4 | 5 | * Input is read from lib/test-data.js 6 | * Output is generated to ../resources 7 | 8 | # Update of test-data # 9 | 10 | # fetch current simplify.js (npm version is out-dated and doesn't support node.js) 11 | wget --output-document=lib/simplify.js \ 12 | --no-check-certificate \ 13 | https://raw.github.com/mourner/simplify-js/master/simplify.js 14 | 15 | wget --output-document=lib/test-data.js http://mourner.github.io/simplify-js/website/test-data.js 16 | 17 | echo "module.exports = points;" >> lib/test-data.js 18 | 19 | # TODO # 20 | 21 | update dependencies when simplify-js is published on npm 22 | 23 | "dependencies": { 24 | "simplify-js": "~1.1.0" 25 | } 26 | 27 | -------------------------------------------------------------------------------- /src/test/reference-impl/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var simplify = require('./lib/simplify.js'), 4 | points = require('./lib/test-data.js'), 5 | path = require('path'), 6 | fs = require('fs'), 7 | tolerances = [ 1.0, 1.5, 2.0, 4.0, 5.0 ]; 8 | 9 | function outputPoints(fileName, points) { 10 | var lines = []; 11 | lines = points.map(function (point) { 12 | return point.x + ',' + point.y; 13 | }); 14 | fs.writeFileSync(path.join(__dirname, '..', 'resources', fileName), lines.join('\n'), 'utf-8'); 15 | } 16 | 17 | outputPoints('points-all.txt', points); 18 | 19 | tolerances.forEach(function (tolerance) { 20 | [ true, false ].forEach(function (highQuality) { 21 | var fileName = 'points-' + tolerance.toFixed(1) + '-' + (highQuality ? 'hq' : 'sq') + '.txt'; 22 | outputPoints(fileName, simplify(points, tolerance, highQuality)); 23 | }) 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/reference-impl/lib/simplify.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2013, Vladimir Agafonkin 3 | Simplify.js is a high-performance JS polyline simplification library 4 | mourner.github.io/simplify-js 5 | */ 6 | 7 | (function (global, undefined) { 8 | 9 | "use strict"; 10 | 11 | 12 | // to suit your point format, run search/replace for '.x' and '.y'; 13 | // to switch to 3D, uncomment the lines in the next 2 functions 14 | // (configurability would draw significant performance overhead) 15 | 16 | 17 | function getSquareDistance(p1, p2) { // square distance between 2 points 18 | 19 | var dx = p1.x - p2.x, 20 | // dz = p1.z - p2.z, 21 | dy = p1.y - p2.y; 22 | 23 | return dx * dx + 24 | // dz * dz + 25 | dy * dy; 26 | } 27 | 28 | function getSquareSegmentDistance(p, p1, p2) { // square distance from a point to a segment 29 | 30 | var x = p1.x, 31 | y = p1.y, 32 | // z = p1.z, 33 | 34 | dx = p2.x - x, 35 | dy = p2.y - y, 36 | // dz = p2.z - z, 37 | 38 | t; 39 | 40 | if (dx !== 0 || dy !== 0) { 41 | 42 | t = ((p.x - x) * dx + 43 | // (p.z - z) * dz + 44 | (p.y - y) * dy) / 45 | (dx * dx + 46 | // dz * dz + 47 | dy * dy); 48 | 49 | if (t > 1) { 50 | x = p2.x; 51 | y = p2.y; 52 | // z = p2.z; 53 | 54 | } else if (t > 0) { 55 | x += dx * t; 56 | y += dy * t; 57 | // z += dz * t; 58 | } 59 | } 60 | 61 | dx = p.x - x; 62 | dy = p.y - y; 63 | // dz = p.z - z; 64 | 65 | return dx * dx + 66 | // dz * dz + 67 | dy * dy; 68 | } 69 | 70 | // the rest of the code doesn't care for the point format 71 | 72 | 73 | // basic distance-based simplification 74 | 75 | function simplifyRadialDistance(points, sqTolerance) { 76 | 77 | var i, 78 | len = points.length, 79 | point, 80 | prevPoint = points[0], 81 | newPoints = [prevPoint]; 82 | 83 | for (i = 1; i < len; i++) { 84 | point = points[i]; 85 | 86 | if (getSquareDistance(point, prevPoint) > sqTolerance) { 87 | newPoints.push(point); 88 | prevPoint = point; 89 | } 90 | } 91 | 92 | if (prevPoint !== point) { 93 | newPoints.push(point); 94 | } 95 | 96 | return newPoints; 97 | } 98 | 99 | 100 | // simplification using optimized Douglas-Peucker algorithm with recursion elimination 101 | 102 | function simplifyDouglasPeucker(points, sqTolerance) { 103 | 104 | var len = points.length, 105 | 106 | MarkerArray = (typeof Uint8Array !== undefined + '') 107 | ? Uint8Array 108 | : Array, 109 | 110 | markers = new MarkerArray(len), 111 | 112 | first = 0, 113 | last = len - 1, 114 | 115 | i, 116 | maxSqDist, 117 | sqDist, 118 | index, 119 | 120 | firstStack = [], 121 | lastStack = [], 122 | 123 | newPoints = []; 124 | 125 | markers[first] = markers[last] = 1; 126 | 127 | while (last) { 128 | 129 | maxSqDist = 0; 130 | 131 | for (i = first + 1; i < last; i++) { 132 | sqDist = getSquareSegmentDistance(points[i], points[first], points[last]); 133 | 134 | if (sqDist > maxSqDist) { 135 | index = i; 136 | maxSqDist = sqDist; 137 | } 138 | } 139 | 140 | if (maxSqDist > sqTolerance) { 141 | markers[index] = 1; 142 | 143 | firstStack.push(first); 144 | lastStack.push(index); 145 | 146 | firstStack.push(index); 147 | lastStack.push(last); 148 | } 149 | 150 | first = firstStack.pop(); 151 | last = lastStack.pop(); 152 | } 153 | 154 | for (i = 0; i < len; i++) { 155 | if (markers[i]) { 156 | newPoints.push(points[i]); 157 | } 158 | } 159 | 160 | return newPoints; 161 | } 162 | 163 | 164 | // both algorithms combined for awesome performance 165 | 166 | function simplify(points, tolerance, highestQuality) { 167 | 168 | var sqTolerance = tolerance !== undefined ? tolerance * tolerance : 1; 169 | 170 | points = highestQuality ? points : simplifyRadialDistance(points, sqTolerance); 171 | points = simplifyDouglasPeucker(points, sqTolerance); 172 | 173 | return points; 174 | }; 175 | 176 | 177 | // export either as a Node.js module, AMD module or a global browser variable 178 | 179 | if (typeof exports === 'object') { 180 | module.exports = simplify; 181 | 182 | } else if (typeof define === 'function' && define.amd) { 183 | define(function () { 184 | return simplify; 185 | }); 186 | 187 | } else { 188 | global.simplify = simplify; 189 | } 190 | 191 | }(this)); 192 | -------------------------------------------------------------------------------- /src/test/reference-impl/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simplify-java-testdata", 3 | "version": "0.0.0", 4 | "description": "Generates reference data from simplify-js to be used by simplify-java for test purposes", 5 | "private": true, 6 | "main": "index.js", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "repository": "", 11 | "author": "Heinrich Göbl (http://goebl.com/)", 12 | "license": "MIT" 13 | } 14 | -------------------------------------------------------------------------------- /src/test/resources/gps-track.txt: -------------------------------------------------------------------------------- 1 | 47.821189519,12.0969644934 2 | 47.8212030977,12.0969403535 3 | 47.8213326819,12.0967857074 4 | 47.8214011621,12.0967483241 5 | 47.8213942889,12.096728459 6 | 47.8214008268,12.0966988709 7 | 47.8214346059,12.0966531895 8 | 47.8217035811,12.0963097829 9 | 47.821789328,12.0962013211 10 | 47.8219415434,12.096291678 11 | 47.8223387618,12.0966873877 12 | 47.8223520052,12.0967096835 13 | 47.822352089,12.0967277046 14 | 47.8223582916,12.0967225917 15 | 47.8223629855,12.0967283752 16 | 47.8223703615,12.0967350807 17 | 47.8225553501,12.0969751384 18 | 47.822712427,12.0969108492 19 | 47.8229692485,12.0967465639 20 | 47.8230826557,12.0969267748 21 | 47.823139485,12.0970626455 22 | 47.8234383836,12.097426923 23 | 47.823895365,12.0976762008 24 | 47.8242992889,12.0979005005 25 | 47.8245977685,12.0980479382 26 | 47.8251442686,12.0983406343 27 | 47.8251933865,12.0983557217 28 | 47.8252429236,12.0983656123 29 | 47.8252924606,12.0983725693 30 | 47.8253393993,12.098373659 31 | 47.8253839072,12.0983708929 32 | 47.8255234659,12.098386148 33 | 47.8255311772,12.0983998943 34 | 47.8255387209,12.0984238666 35 | 47.825542409,12.0984592382 36 | 47.8255440015,12.098503327 37 | 47.8256009985,12.0991673414 38 | 47.8256157506,12.0992421079 39 | 47.8256355319,12.0992639847 40 | 47.8256647009,12.0992792398 41 | 47.8256983124,12.0993002784 42 | 47.82573184,12.0993354823 43 | 47.8257668763,12.099376386 44 | 47.8258025832,12.0994119253 45 | 47.8258397151,12.0994465426 46 | 47.8262852971,12.0998456888 47 | 47.826836491,12.1004221961 48 | 47.8268719465,12.1004576515 49 | 47.8275223821,12.1010403614 50 | 47.8275623638,12.1010803431 51 | 47.8275946341,12.1011337359 52 | 47.827609051,12.1012001205 53 | 47.8276162595,12.1012724563 54 | 47.8276351187,12.1013335604 55 | 47.8276620246,12.1013806667 56 | 47.8276927862,12.1014254261 57 | 47.8279358614,12.1017624624 58 | 47.8286664281,12.1027200948 59 | 47.8287230898,12.1028218511 60 | 47.828730382,12.1028534509 61 | 47.8287365846,12.1028841287 62 | 47.828744296,12.1029112861 63 | 47.8287527617,12.1029366832 64 | 47.8287634905,12.1029628348 65 | 47.8287780751,12.1029903274 66 | 47.828791989,12.1030246932 67 | 47.8288060706,12.1030629147 68 | 47.829160206,12.1037051361 69 | 47.8291957453,12.1037535835 70 | 47.8292262554,12.1038047969 71 | 47.829532614,12.1043539792 72 | 47.8295497969,12.1044103056 73 | 47.829566393,12.1044633631 74 | 47.8295889404,12.1045117266 75 | 47.8296130802,12.10455833 76 | 47.8297500405,12.1048893314 77 | 47.8297244757,12.1049123816 78 | 47.8297062032,12.1049363539 79 | 47.8296846617,12.1049646009 80 | 47.8295100667,12.1052389406 81 | 47.8295113239,12.1052878909 82 | 47.8295262437,12.1053313091 83 | 47.8295463603,12.1053666808 84 | 47.8295670636,12.1053868812 85 | 47.8295858391,12.1053960174 86 | 47.8296003398,12.1054044832 87 | 47.8296142537,12.1054151282 88 | 47.8296279162,12.1054067463 89 | 47.8296254855,12.1053830255 90 | 47.8296038602,12.1053676028 91 | 47.8295777924,12.1053594723 92 | 47.8295544069,12.1053577121 93 | 47.8295337874,12.1053522639 94 | 47.8295150958,12.1053374279 95 | 47.8294523153,12.1053224243 96 | 47.8294388205,12.1053331532 97 | 47.8294270858,12.1053454746 98 | 47.8294168599,12.1053592209 99 | 47.8294069692,12.1053733863 100 | 47.8293952346,12.1053862106 101 | 47.8293208033,12.1054380108 102 | 47.8293072246,12.1054438781 103 | 47.8292952385,12.1054481529 104 | 47.8292817436,12.1054494102 105 | 47.829265818,12.1054469794 106 | 47.8292496409,12.1054358315 107 | 47.8292349726,12.1054197382 108 | 47.8292202204,12.105403645 109 | 47.8292075638,12.1053863782 110 | 47.8291976731,12.105372129 111 | 47.8291859385,12.1053588018 112 | 47.8291746229,12.1053416189 113 | 47.8291642293,12.1053161379 114 | 47.8291156143,12.1052522678 115 | 47.8290953301,12.1052485798 116 | 47.8290914744,12.1052638348 117 | 47.8291017842,12.1052895673 118 | 47.8291187994,12.1053130366 119 | 47.8291429393,12.105336925 120 | 47.829271853,12.1054534335 121 | 47.8292972501,12.1054490749 122 | 47.8293199651,12.1054361667 123 | 47.8293425124,12.1054232586 124 | 47.8293679934,12.1054135356 125 | 47.8294856753,12.1053546108 126 | 47.8299860749,12.105653258 127 | 47.8300423175,12.1058777254 128 | 47.8299606778,12.1064853296 129 | 47.8299094643,12.1069123037 130 | 47.8298828937,12.107035853 131 | 47.8298631124,12.1070928499 132 | 47.8298429959,12.1071472485 133 | 47.8298245557,12.1071962826 134 | 47.8298046906,12.1072397847 135 | 47.82978273,12.1072824486 136 | 47.8295865934,12.1075716242 137 | 47.8295145091,12.1076598018 138 | 47.8295103181,12.1076884679 139 | 47.8295161016,12.1077188943 140 | 47.8295254055,12.1077536792 141 | 47.8295347095,12.1077957563 142 | 47.829619702,12.1080753766 143 | 47.8296487872,12.1081410907 144 | 47.8296783753,12.1082102414 145 | 47.8297013417,12.1082860138 146 | 47.8297021799,12.1083634626 147 | 47.8296818957,12.1084419172 148 | 47.829658594,12.1085232217 149 | 47.829637723,12.108607376 150 | 47.8295681532,12.10886118 151 | 47.8295288421,12.108934857 152 | 47.8294837475,12.1089965478 153 | 47.8294399939,12.1090611722 154 | 47.8293994255,12.1091294009 155 | 47.8293597791,12.1091889124 156 | 47.8293187078,12.1092389524 157 | 47.8292820789,12.1092967875 158 | 47.8292563464,12.1093666088 159 | 47.8292425163,12.1094431356 160 | 47.8292395826,12.1095236018 161 | 47.8292446956,12.1096063312 162 | 47.8292539157,12.1096893121 163 | 47.8292710986,12.1097749751 164 | 47.8292923048,12.1098638233 165 | 47.829324659,12.110039508 166 | 47.8293293528,12.1101228241 167 | 47.829328347,12.1103798132 168 | 47.8293187078,12.1104688291 169 | 47.8291832563,12.1116288006 170 | 47.8290871158,12.1129225474 171 | 47.829074543,12.1130941249 172 | 47.8290388361,12.1145019494 173 | 47.8289767262,12.1155263856 174 | 47.8289766423,12.1162233409 175 | 47.8289683443,12.1172148362 176 | 47.8289315477,12.1181073412 177 | 47.8289312962,12.1194041893 178 | 47.8289362416,12.1203693654 179 | 47.8289341461,12.1212387364 180 | 47.8289327212,12.1218292415 181 | 47.8289419413,12.12196704 182 | 47.8289407678,12.1220358554 183 | 47.8289393429,12.1221064311 184 | 47.828938337,12.1221818682 185 | 47.8289343137,12.1222651843 186 | 47.8289167117,12.123311162 187 | 47.828915203,12.1236809716 188 | 47.828915203,12.1251273528 189 | 47.8289205674,12.1261880826 190 | 47.828920735,12.1269840281 191 | 47.8289459646,12.1274514031 192 | 47.8289459646,12.1275327075 193 | 47.8290352318,12.1283352748 194 | 47.8290600423,12.128399564 195 | 47.8293634672,12.1290724631 196 | 47.8294028621,12.1291845292 197 | 47.829416357,12.1292422805 198 | 47.8295946401,12.1303361189 199 | 47.8297324385,12.1313705295 200 | 47.8297533095,12.1314944141 201 | 47.8297717497,12.1315576974 202 | 47.8297973983,12.1316203102 203 | 47.8298283275,12.1316808276 204 | 47.8298630286,12.1317398362 205 | 47.8300035093,12.1319769602 206 | 47.8300294094,12.1320430096 207 | 47.8300461732,12.1321122441 208 | 47.8300575726,12.1321828198 209 | 47.8300648648,12.1322506294 210 | 47.8300695587,12.1323177684 211 | 47.8302264679,12.1333813481 212 | 47.8304099478,12.1343502123 213 | 47.8307488281,12.1354557015 214 | 47.831102293,12.1364919562 215 | 47.8313379921,12.1371840499 216 | 47.8313571867,12.1372468304 217 | 47.8318060376,12.1382570174 218 | 47.8321913537,12.1387142502 219 | 47.8322624322,12.1387864184 220 | 47.8327143006,12.1394123789 221 | 47.8330870438,12.139974637 222 | 47.8332385886,12.1401763055 223 | 47.833435731,12.1404075623 224 | 47.8336008545,12.1405403316 225 | 47.8336376511,12.1405697521 226 | 47.8337541595,12.1406484582 227 | 47.8337964043,12.1406580973 228 | 47.8341953829,12.1407273319 229 | 47.8342398908,12.1407445986 230 | 47.8345662821,12.1408776194 231 | 47.8347698785,12.1410517115 232 | 47.8349805996,12.1413542144 233 | 47.8350092657,12.1414118819 234 | 47.8351536859,12.1421166323 235 | 47.8351586312,12.1421852801 236 | 47.8351800051,12.1423840988 237 | 47.8351970203,12.1424495615 238 | 47.8354566079,12.1434675436 239 | 47.8354720306,12.1435231995 240 | 47.8354854416,12.1435754187 241 | 47.8354960028,12.1436299011 242 | 47.835506564,12.1436821204 243 | 47.835519053,12.1437347587 244 | 47.8355327994,12.1437868942 245 | 47.8357189614,12.1446185466 246 | 47.835826166,12.1450577583 247 | 47.8358330391,12.1450959798 248 | 47.8358427621,12.1451316867 249 | 47.835851647,12.1451685671 250 | 47.8358594421,12.1452093031 251 | 47.8358702548,12.1452486981 252 | 47.8358818218,12.1452918649 253 | 47.8358958196,12.1453334391 254 | 47.8359909542,12.1459741518 255 | 47.8360104002,12.1460883971 256 | 47.8360250685,12.1461463161 257 | 47.8360376414,12.1462000441 258 | 47.836048454,12.146251509 259 | 47.8360629547,12.1463036444 260 | 47.8362379689,12.1467890404 261 | 47.8363178484,12.1472882666 262 | 47.8363244701,12.1473635361 263 | 47.8363712411,12.1476588305 264 | 47.8364266455,12.1480367705 265 | 47.8364383802,12.1481031552 266 | 47.8364839777,12.1485337336 267 | 47.8365413938,12.1488188021 268 | 47.8365612589,12.1488731168 269 | 47.8367320821,12.1492040344 270 | 47.8367669508,12.1492189541 271 | 47.8372196574,12.1494194493 272 | 47.8374109324,12.1494633704 273 | 47.8378783911,12.1495739277 274 | 47.837923402,12.1495916136 275 | 47.8380207997,12.1496260632 276 | 47.8380664811,12.1496435814 277 | 47.8381090611,12.1496560704 278 | 47.838142924,12.1496669669 279 | 47.8381715901,12.1496838145 280 | 47.8381980769,12.1497160848 281 | 47.8382168524,12.1497507021 282 | 47.8383371327,12.1498659533 283 | 47.8384068701,12.1498818789 284 | 47.8390139714,12.1501063462 285 | 47.8393785004,12.1504204161 286 | 47.8396581206,12.1504101064 287 | 47.8396889661,12.1504614037 288 | 47.839707993,12.1505123656 289 | 47.8397298697,12.1505240165 290 | 47.83975292,12.1505335718 291 | 47.8397803288,12.1505463962 292 | 47.8398074023,12.1505606454 293 | 47.839834895,12.1505620703 294 | 47.8398583643,12.1505587175 295 | 47.8398774751,12.1505603101 296 | 47.8398981784,12.1505609807 297 | 47.8399218153,12.1505760681 298 | 47.8399411775,12.1505867131 299 | 47.8399495594,12.1505956817 300 | 47.8402503859,12.1510125976 301 | 47.8407260589,12.1512336284 302 | 47.8413387761,12.151298169 303 | 47.8417395148,12.1513166092 304 | 47.841786705,12.1513151005 305 | 47.8418338951,12.1513091493 306 | 47.8422886971,12.151278723 307 | 47.8427439183,12.151256511 308 | 47.8432247881,12.1511972509 309 | 47.8437875491,12.1511038765 310 | 47.843832057,12.1510947403 311 | 47.8438790794,12.1510817483 312 | 47.8444026969,12.1508716978 313 | 47.8445270844,12.1507865377 314 | 47.8445896972,12.1507520881 315 | 47.8447109833,12.1506976057 316 | 47.8447557427,12.1506857034 317 | 47.8448516317,12.150650667 318 | 47.84489966,12.1506203245 319 | 47.8449823055,12.1505704522 320 | 47.8451132309,12.1504977811 321 | 47.8451606724,12.1504937578 322 | 47.845193781,12.1505050734 323 | 47.8452186752,12.150530722 324 | 47.8453568928,12.1512160264 325 | 47.8456270415,12.1518590022 326 | 47.8456550371,12.1519057732 327 | 47.8456817754,12.1519530471 328 | 47.8461180534,12.1527286246 329 | 47.846261384,12.1529499907 330 | 47.846287284,12.1529944986 331 | 47.846761113,12.1536615305 332 | 47.8471719939,12.1541858185 333 | 47.8476371057,12.1546914987 334 | 47.8480082564,12.1550916508 335 | 47.8484094981,12.1551707759 336 | 47.8484287765,12.1551786549 337 | 47.8484466299,12.1552043036 338 | 47.8484692611,12.1552317962 339 | 47.8484960832,12.1552542597 340 | 47.8485249169,12.1552675031 341 | 47.8485566005,12.1552752983 342 | 47.8485876974,12.1552942414 343 | 47.8486072272,12.1553247515 344 | 47.8486187104,12.1553601231 345 | 47.8486928064,12.1555353887 346 | 47.8487109113,12.1555563435 347 | 47.8490181919,12.1558134165 348 | 47.8493605088,12.1560497861 349 | 47.8493745066,12.1560587548 350 | 47.849384984,12.1560732555 351 | 47.84939982,12.1560835652 352 | 47.8494142368,12.1560972277 353 | 47.8494301625,12.1561092976 354 | 47.8494483512,12.1561226249 355 | 47.849467881,12.1561390534 356 | 47.8494907636,12.1561538894 357 | 47.8495165799,12.156168893 358 | 47.8499038238,12.1564395446 359 | 47.8504090849,12.1567111183 360 | 47.8509582672,12.1569874696 361 | 47.8515353613,12.1572438721 362 | 47.8519110382,12.1574052237 363 | 47.8523137048,12.1575720236 364 | 47.8526832629,12.1575224027 365 | 47.8527341411,12.157479655 366 | 47.8527560178,12.1574174613 367 | 47.8527579457,12.1573877055 368 | 47.8527566884,12.1573566925 369 | 47.8527545929,12.1573145315 370 | 47.8527540062,12.157268934 371 | 47.8527534194,12.1570393536 372 | 47.8527689259,12.1570422035 373 | 47.8528069798,12.1570527647 374 | 47.852826342,12.1570574585 375 | 47.8531482909,12.1571189817 376 | 47.8537155781,12.15704103 377 | 47.8540127166,12.156972466 378 | 47.8547860309,12.1566122118 379 | 47.8552642185,12.1563414764 380 | 47.855314007,12.1563118882 381 | 47.8553617001,12.1562913526 382 | 47.8554107342,12.156292107 383 | 47.8554527275,12.1563173365 384 | 47.855486339,12.1563607547 385 | 47.8555124905,12.1564099565 386 | 47.8555284999,12.1564577334 387 | 47.8555338643,12.1565081924 388 | 47.8555357084,12.1565617528 389 | 47.8555347864,12.1566127148 390 | 47.855527075,12.1566625871 391 | 47.8554745205,12.1572376695 392 | 47.8554259054,12.1575281024 393 | 47.8554203734,12.1575939003 394 | 47.8554135002,12.1576607041 395 | 47.8553984128,12.1577221435 396 | 47.8553699143,12.1577777155 397 | 47.8553462774,12.1578420047 398 | 47.8553327825,12.1579093952 399 | 47.8553207964,12.1579761989 400 | 47.855307553,12.1580443438 401 | 47.85528115,12.1581797116 402 | 47.8552633803,12.1582409833 403 | 47.8552458622,12.1583029255 404 | 47.8551757894,12.1586024947 405 | 47.8551647253,12.1586737409 406 | 47.8550755419,12.1591307223 407 | 47.8550772183,12.1592121106 408 | 47.8550775535,12.1592857037 409 | 47.8551337961,12.1601049509 410 | 47.8552527353,12.1604598407 411 | 47.8555439226,12.1610384434 412 | 47.8556976467,12.1612899844 413 | 47.8557202779,12.1613459755 414 | 47.8558669612,12.1619852632 415 | 47.8558824677,12.1620470379 416 | 47.8560104594,12.1625580825 417 | 47.8560219426,12.1626280714 418 | 47.8560227808,12.1626535524 419 | 47.856024038,12.1626807097 420 | 47.8560243733,12.1627105493 421 | 47.8560265526,12.1627420653 422 | 47.856036108,12.1627761796 423 | 47.856044909,12.1628165804 424 | 47.8560532909,12.1628587414 425 | 47.8560625948,12.1629008185 426 | 47.856071312,12.1629461646 427 | 47.8560752515,12.162991846 428 | 47.8560822923,12.1630343422 429 | 47.8560939431,12.1630754974 430 | 47.8561009839,12.1631203406 431 | 47.856106516,12.1631666087 432 | 47.8561803605,12.1636895556 433 | 47.8562541213,12.1640752908 434 | 47.8565288801,12.1647902671 435 | 47.8566541057,12.1653656848 436 | 47.8566754796,12.1661022864 437 | 47.8566807602,12.1666005068 438 | 47.8566653375,12.1671851445 439 | 47.8566454723,12.1671989746 440 | 47.8566566203,12.1672155708 441 | 47.8566674329,12.1672289819 442 | 47.8566696122,12.1671869885 443 | 47.8566684388,12.1674275491 444 | 47.85675033,12.1683451161 445 | 47.8568231687,12.1688296739 446 | 47.8568296228,12.1688892692 447 | 47.8568375856,12.1689513791 448 | 47.8568478115,12.169009801 449 | 47.8568595462,12.1690678876 450 | 47.8568674251,12.169127902 451 | 47.8568747174,12.1691872459 452 | 47.8568824288,12.1692444105 453 | 47.8569623083,12.1699859574 454 | 47.8569742106,12.1700448822 455 | 47.8569848556,12.170106573 456 | 47.8570202272,12.1704264265 457 | 47.8570705187,12.1706797276 458 | 47.8570815828,12.170746699 459 | 47.857093066,12.170813838 460 | 47.8572398331,12.17183467 461 | 47.8573182039,12.1723996103 462 | 47.8573315311,12.1725268476 463 | 47.8573426791,12.1725874487 464 | 47.8573581856,12.1726441942 465 | 47.8573798109,12.1726985928 466 | 47.8574043699,12.1727529075 467 | 47.857606709,12.1731256507 468 | 47.8576028533,12.1731628664 469 | 47.8575874306,12.1731989086 470 | 47.8573581018,12.1738101169 471 | 47.8570917249,12.174522914 472 | 47.8570684232,12.1745796595 473 | 47.8570468817,12.1746357344 474 | 47.8568680119,12.1750619542 475 | 47.8566697799,12.1754924487 476 | 47.8566523455,12.1755360346 477 | 47.8566392697,12.1755520441 478 | 47.8566234279,12.175574759 479 | 47.8566036467,12.1756060235 480 | 47.8565865476,12.1756434068 481 | 47.8563732281,12.1760769188 482 | 47.8563485853,12.1761246119 483 | 47.8561495151,12.176538175 484 | 47.8556207009,12.1775765251 485 | 47.8551048785,12.1786183119 486 | 47.8550260887,12.1787777357 487 | 47.854824923,12.1791897062 488 | 47.8548021242,12.1792430989 489 | 47.8545551095,12.180051282 490 | 47.8545090929,12.1802109573 491 | 47.8543578833,12.1808387619 492 | 47.8542053327,12.1818452608 493 | 47.8540360183,12.1829405241 494 | 47.85395924,12.1834647283 495 | 47.8536849003,12.1841663774 496 | 47.8535315115,12.1846434753 497 | 47.8534669708,12.185100792 498 | 47.8534594271,12.1851599682 499 | 47.8534570802,12.1852210723 500 | 47.8534537274,12.1852839366 501 | 47.853448363,12.185345795 502 | 47.8534514643,12.1854709368 503 | 47.8534776159,12.1857676562 504 | 47.8535311762,12.1865452453 505 | 47.8535373788,12.1866174974 506 | 47.8535499517,12.1866896655 507 | 47.8537444957,12.1873049811 508 | 47.8537720721,12.1873683482 509 | 47.8538693022,12.1875704359 510 | 47.8542966116,12.1887564752 511 | 47.8546065744,12.1896343119 512 | 47.8546245117,12.1897017024 513 | 47.8548473865,12.190191457 514 | 47.8552299365,12.1909371112 515 | 47.8555351216,12.191706067 516 | 47.8557649534,12.1922930516 517 | 47.8560156561,12.1929261368 518 | 47.8562419675,12.193593001 519 | 47.8562609106,12.1936503332 520 | 47.8562797699,12.1936989482 521 | 47.8565982822,12.1944612823 522 | 47.856965661,12.1953245346 523 | 47.8570444509,12.195533663 524 | 47.8570732847,12.1956029814 525 | 47.8576575872,12.1965689957 526 | 47.8579266462,12.19688843 527 | 47.8579932824,12.1969890129 528 | 47.8580232058,12.1970423218 529 | 47.8580563143,12.1970921103 530 | 47.8580943681,12.1971400548 531 | 47.8581315,12.1971856523 532 | 47.8587510064,12.1980646625 533 | 47.8587795887,12.198132053 534 | 47.8590518329,12.1992655378 535 | 47.8590808343,12.1993429866 536 | 47.8591114283,12.199414568 537 | 47.8597237263,12.2006073128 538 | 47.8597508837,12.2006814089 539 | 47.8598923702,12.2012782842 540 | 47.8598978184,12.201357577 541 | 47.8601665422,12.2024784051 542 | 47.860547835,12.2040276323 543 | 47.8605531156,12.2041304782 544 | 47.8605428059,12.2042333242 545 | 47.8605145589,12.204327872 546 | 47.8604740743,12.2044141218 547 | 47.8604312427,12.2044943366 548 | 47.8603377845,12.2046380024 549 | 47.8603158239,12.2047227435 550 | 47.8603097051,12.2048115078 551 | 47.8603154048,12.2048981767 552 | 47.8603359405,12.2049759608 553 | 47.8603718989,12.2050415073 554 | 47.8604146466,12.205100432 555 | 47.8604608309,12.2051493824 556 | 47.8605073504,12.2051975783 557 | 47.8605532832,12.2052511387 558 | 47.8608915769,12.2057896759 559 | 47.8609840292,12.2059057653 560 | 47.8610226698,12.2059744969 561 | 47.8613441158,12.206565924 562 | 47.8613846004,12.2066388465 563 | 47.8620165959,12.2078009974 564 | 47.8626226913,12.2089164611 565 | 47.8631632403,12.2099008318 566 | 47.8635565192,12.2108555306 567 | 47.8635692596,12.210939182 568 | 47.8635770548,12.211025767 569 | 47.8635835089,12.2111981828 570 | 47.8635705169,12.2117150109 571 | 47.8635831736,12.2118079662 572 | 47.863591807,12.2119014245 573 | 47.8635911364,12.2119917814 574 | 47.8635847662,12.2120810486 575 | 47.8635773901,12.2121690586 576 | 47.8634752147,12.2134784795 577 | 47.8633698542,12.2147379443 578 | 47.8633452114,12.2149493359 579 | 47.8633360751,12.2151250206 580 | 47.8633564431,12.2151634097 581 | 47.8633841034,12.2151867114 582 | 47.8634155355,12.2152008768 583 | 47.863445878,12.215210516 584 | 47.8636477143,12.2152496595 585 | 47.8636622149,12.2152231727 586 | 47.863671938,12.2151635773 587 | 47.8636637237,12.2151644994 588 | 47.8636617959,12.215165589 589 | 47.8636608738,12.2151607275 590 | 47.8636609577,12.215150753 591 | 47.8636569344,12.2151406948 592 | 47.8636557609,12.2151448019 593 | 47.8636641428,12.2151466459 594 | 47.863676548,12.2151411138 595 | 47.863685349,12.2151492443 596 | 47.8636832535,12.215147065 597 | 47.8636834212,12.2151489928 598 | 47.8636721894,12.2151639964 599 | 47.8636687528,12.2151708696 600 | 47.8636643942,12.2151678521 601 | 47.8636657353,12.2151567042 602 | 47.8636771347,12.2151463944 603 | 47.8636815771,12.2151392698 604 | 47.8636852652,12.2151422035 605 | 47.8636839241,12.2151451372 606 | 47.86367747,12.2151411138 607 | 47.8636775538,12.2151318099 608 | 47.8636735305,12.2151228413 609 | 47.8636748716,12.2151116095 610 | 47.8636732791,12.2151094303 611 | 47.8636805713,12.2151068319 612 | 47.8636884503,12.2151038144 613 | 47.8636933956,12.2151052393 614 | 47.8636967484,12.2151147109 615 | 47.8637024481,12.2151172254 616 | 47.8637055494,12.2151297145 617 | 47.8637063876,12.2151343245 618 | 47.8637061361,12.2151365038 619 | 47.863704795,12.2151204944 620 | 47.8637032025,12.215110939 621 | 47.8636989277,12.2150976118 622 | 47.8636814095,12.2150941752 623 | 47.8636757098,12.215097025 624 | 47.863673782,12.2150973603 625 | 47.8636778053,12.2150982823 626 | 47.8636794817,12.2151042335 627 | 47.8636868577,12.2151220869 628 | 47.8636848461,12.2151305526 629 | 47.8636779729,12.2151367553 630 | 47.8636768833,12.2151395213 631 | 47.8636824992,12.2151309717 632 | 47.8636840917,12.2151275352 633 | 47.8636836726,12.2151195724 634 | 47.863684427,12.2151132021 635 | 47.8636851814,12.2151105199 636 | 47.8636817448,12.2151152976 637 | 47.8636839241,12.2151171416 638 | 47.8636848461,12.215122506 639 | 47.8636881988,12.2151116095 640 | 47.8636918031,12.2151143756 641 | 47.8636838403,12.2151297145 642 | 47.8636745363,12.2151548602 643 | 47.8636692557,12.215189226 644 | 47.8636518214,12.2152385954 645 | 47.8636446968,12.2152406909 646 | 47.8636340518,12.2152394336 647 | 47.8635356482,12.2152204067 648 | 47.863447722,12.2151686065 649 | 47.8634010348,12.2151568718 650 | 47.8633922338,12.2151590511 651 | 47.8633902222,12.2151519265 652 | 47.8633949161,12.215155866 653 | 47.8633562755,12.2151779942 654 | 47.8633558564,12.2152008768 655 | 47.8633665014,12.2151847836 656 | 47.8633760568,12.2151745576 657 | 47.8633960057,12.215147065 658 | 47.8633810021,12.2151296306 659 | 47.8633758891,12.2151157167 660 | 47.8633769788,12.2151214164 661 | 47.8633615561,12.2151162196 662 | 47.8633540124,12.2151298821 663 | 47.8634229954,12.2151770722 664 | 47.8634325508,12.215188304 665 | 47.8634031303,12.2151742224 666 | 47.8633848578,12.2151466459 667 | 47.8633821756,12.2151450533 668 | 47.8633709438,12.2151405271 669 | 47.8633582033,12.2151173931 670 | 47.8633412719,12.2151863761 671 | 47.8633676749,12.2151733004 672 | 47.8633587901,12.2151800059 673 | 47.8633577842,12.2151729651 674 | 47.8633411042,12.2151414491 675 | 47.8633911442,12.2147619165 676 | 47.8633950837,12.2146273032 677 | 47.8634077404,12.2144936956 678 | 47.8634163737,12.2144311666 679 | 47.8634219896,12.214370314 680 | 47.8634307906,12.2141681425 681 | 47.8634354006,12.2141009197 682 | 47.8634335566,12.2140373848 683 | 47.8634244204,12.2139752749 684 | 47.8634177148,12.2139144223 685 | 47.8634178825,12.2138523962 686 | 47.8634199779,12.2137925494 687 | 47.8634242527,12.2137341276 688 | 47.863474125,12.2129505873 689 | 47.8634879552,12.2127267066 690 | 47.8635530826,12.2117387317 691 | 47.8635581117,12.211673772 692 | 47.8635726962,12.2115416732 693 | 47.8635915555,12.2114054672 694 | 47.8636174556,12.2111622244 695 | 47.863505641,12.2105889861 696 | 47.8632456344,12.2100389656 697 | 47.862739535,12.2091201413 698 | 47.8621461801,12.208031835 699 | 47.8616212215,12.2070510685 700 | 47.8612791561,12.2064429615 701 | 47.8610266931,12.2059482615 702 | 47.8609896451,12.2058952041 703 | 47.8609482385,12.205845667 704 | 47.8609076701,12.2057987284 705 | 47.860874394,12.2057458386 706 | 47.8608417045,12.2056880035 707 | 47.8606875613,12.2054104786 708 | 47.8603160754,12.204926759 709 | 47.8603050113,12.2048776411 710 | 47.8603023291,12.2048328817 711 | 47.8603021614,12.2047912236 712 | 47.8602978867,12.2047492303 713 | 47.8602935281,12.2047101706 714 | 47.8602942824,12.2046773974 715 | 47.8602947854,12.2046579514 716 | 47.8602948692,12.2046364099 717 | 47.8602974676,12.204613192 718 | 47.8603035863,12.2045980208 719 | 47.8603406344,12.2045940813 720 | 47.8603553027,12.2045888007 721 | 47.8603715636,12.2045799997 722 | 47.8603933565,12.2045626491 723 | 47.8604198433,12.2045304626 724 | 47.860451946,12.2044880502 725 | 47.8606302291,12.2041789256 726 | 47.860519588,12.2036649473 727 | 47.8602503613,12.202641014 728 | 47.8601994831,12.2024670895 729 | 47.8601880837,12.2024076618 730 | 47.8599512111,12.2014497779 731 | 47.8599360399,12.2013929486 732 | 47.859846605,12.2010445129 733 | 47.8598334454,12.200986091 734 | 47.8598210402,12.2009256575 735 | 47.8595073055,12.2001444642 736 | 47.8593516536,12.1998529416 737 | 47.8590442054,12.199255228 738 | 47.8590237536,12.1991761867 739 | 47.8587953467,12.1981502417 740 | 47.8586686961,12.1978977788 741 | 47.8580532968,12.1970817167 742 | 47.8580197692,12.1970214508 743 | 47.8579483554,12.1968933754 744 | 47.8579041827,12.1968365461 745 | 47.8577458486,12.1966741048 746 | 47.8570863605,12.1956599783 747 | 47.8567263577,12.194780549 748 | 47.8562785126,12.1936841123 749 | 47.8558073658,12.1924944688 750 | 47.8554083034,12.191448072 751 | 47.8548083268,12.1901383158 752 | 47.8546286188,12.1897448692 753 | 47.8546034731,12.1896569431 754 | 47.8544345777,12.1891417913 755 | 47.8539303225,12.1877234895 756 | 47.8538221959,12.1874638181 757 | 47.8537580743,12.1873293724 758 | 47.8537356947,12.1872582939 759 | 47.8535766061,12.1867923439 760 | 47.8535386361,12.1866036672 761 | 47.8535329364,12.1865397133 762 | 47.8535310086,12.18648104 763 | 47.8534770291,12.1855587792 764 | 47.8535797074,12.1844563913 765 | 47.853700323,12.1841428243 766 | 47.8539900016,12.1833315399 767 | 47.8540003952,12.1832452063 768 | 47.8541241121,12.1823885757 769 | 47.8541369364,12.1823170781 770 | 47.8543496691,12.1809320524 771 | 47.8544618189,12.1804094408 772 | 47.8545313887,12.1801728196 773 | 47.8545234259,12.180149937 774 | 47.8545078356,12.1801340114 775 | 47.8544857912,12.1801320836 776 | 47.8544588014,12.1801389568 777 | 47.8543551173,12.1801685449 778 | 47.8543261159,12.180164773 779 | 47.8542925883,12.1801555529 780 | 47.8542567976,12.180145327 781 | 47.8542179894,12.1801348496 782 | 47.8541762475,12.1801230311 783 | 47.8536939528,12.1798492782 784 | 47.8533937968,12.1795544866 785 | 47.8527292795,12.1787764784 786 | 47.852693405,12.1787318867 787 | 47.8522235155,12.1781869791 788 | 47.851606356,12.1776319295 789 | 47.8509674035,12.1769511513 790 | 47.8503200691,12.175976336 791 | 47.8497596551,12.1748358104 792 | 47.8491477761,12.1736687142 793 | 47.8487329558,12.1730688214 794 | 47.8486933094,12.1730045322 795 | 47.8486541659,12.172941165 796 | 47.8483149502,12.1723489836 797 | 47.8482791595,12.1722805873 798 | 47.8481746372,12.1720839478 799 | 47.8481473122,12.1720121987 800 | 47.8481239267,12.1719363425 801 | 47.8479572106,12.1709999163 802 | 47.847924605,12.170544276 803 | 47.8478700388,12.169849081 804 | 47.8478418756,12.1691087913 805 | 47.8478415404,12.1689124033 806 | 47.8477970324,12.1679416951 807 | 47.84778798,12.1678643301 808 | 47.8477850463,12.1677873004 809 | 47.8477862198,12.1674500965 810 | 47.8477890696,12.1673557162 811 | 47.8477972839,12.1672590729 812 | 47.8478098568,12.167158993 813 | 47.8478275426,12.1670604218 814 | 47.8478451446,12.1669579111 815 | 47.8478640877,12.166850958 816 | 47.847883869,12.1666469425 817 | 47.8478640877,12.166554071 818 | 47.8477895726,12.1663929708 819 | 47.8476651013,12.1661990974 820 | 47.8476455715,12.1660755482 821 | 47.8476543725,12.1659476403 822 | 47.8477042448,12.1653450653 823 | 47.8477038257,12.1652298979 824 | 47.8477028199,12.1651171613 825 | 47.8477437235,12.164342422 826 | 47.8477707133,12.1642467845 827 | 47.8478102759,12.1641648095 828 | 47.8482165467,12.1631828696 829 | 47.8485845122,12.1621365566 830 | 47.8487066366,12.1610581409 831 | 47.8487401642,12.1605110541 832 | 47.8489865083,12.1592847817 833 | 47.8490475286,12.1591115277 834 | 47.8491626121,12.1588725597 835 | 47.8495875746,12.1583874151 836 | 47.8496518638,12.1583546419 837 | 47.8497184161,12.1583388839 838 | 47.850220073,12.1581708267 839 | 47.850278914,12.1581321862 840 | 47.8503345698,12.1580818947 841 | 47.8503838554,12.1580190305 842 | 47.8504267707,12.1579490416 843 | 47.8504681773,12.1578757837 844 | 47.850817116,12.1570932493 845 | 47.8511560801,12.1563071106 846 | 47.8511798009,12.1562242974 847 | 47.8512034379,12.1561464295 848 | 47.8514495306,12.1550736297 849 | 47.8515583277,12.1543490142 850 | 47.8515900113,12.154267123 851 | 47.8517070226,12.1540428232 852 | 47.8517524526,12.1539815515 853 | 47.8518030792,12.1539267339 854 | 47.8520793468,12.1536878496 855 | 47.8521277942,12.1536253206 856 | 47.8521686979,12.1535503864 857 | 47.8522013035,12.1534645557 858 | 47.8522250243,12.1533732768 859 | 47.8522397764,12.1532798186 860 | 47.8522453085,12.153180493 861 | 47.8522437997,12.1530812513 862 | 47.8522385191,12.1529842727 863 | 47.8520408738,12.1513766237 864 | 47.8520200029,12.1510915551 865 | 47.8520722222,12.1504662652 866 | 47.8520674445,12.1503881458 867 | 47.852053782,12.1503169835 868 | 47.8520348389,12.1502485871 869 | 47.8520129621,12.1501858905 870 | 47.8519873135,12.1501272172 871 | 47.8519594856,12.1500743274 872 | 47.8519335855,12.150027724 873 | 47.8517699707,12.1499070246 874 | 47.8517459147,12.149939714 875 | 47.8515082877,12.1503412072 876 | 47.8514863271,12.1503490023 877 | 47.8514670487,12.1503712144 878 | 47.8514499497,12.150398707 879 | 47.8514325153,12.150428379 880 | 47.8514118958,12.1504610684 881 | 47.851389097,12.1504914947 882 | 47.8513652924,12.1505205799 883 | 47.8509788029,12.1508405171 884 | 47.8509410843,12.1508692671 885 | 47.850789791,12.1510167886 886 | 47.850748552,12.151061045 887 | 47.8507066425,12.1511083189 888 | 47.8502731305,12.1517375484 889 | 47.8498749062,12.15264556 890 | 47.8498400375,12.152758548 891 | 47.849819921,12.1528117731 892 | 47.8497959487,12.1528620645 893 | 47.8497500159,12.1529610548 894 | 47.8497309051,12.1530182194 895 | 47.8497112077,12.1530762222 896 | 47.8496935219,12.153135566 897 | 47.8496764228,12.1531947423 898 | 47.8496577311,12.1532560978 899 | 47.8495135624,12.1536083892 900 | 47.8494455013,12.1537046973 901 | 47.8494040947,12.1537445951 902 | 47.8489710018,12.1542094555 903 | 47.848569341,12.1549131162 904 | 47.8482219111,12.1551965922 905 | 47.8479126189,12.1549688559 906 | 47.8478779178,12.1549347416 907 | 47.847486902,12.1545444801 908 | 47.8474022448,12.1544392873 909 | 47.8473573178,12.1543897502 910 | 47.8467896953,12.1536954772 911 | 47.8466663975,12.1535052918 912 | 47.8467005957,12.1535056271 913 | 47.8467186168,12.1535161883 914 | 47.8467417508,12.1535369754 915 | 47.846774105,12.1535638813 916 | 47.8468108177,12.1535938047 917 | 47.846849123,12.1536361333 918 | 47.8468904458,12.1536845807 919 | 47.8469397314,12.1537134144 920 | 47.8469991591,12.1537092235 921 | 47.8470549826,12.1536709182 922 | 47.8470927849,12.1536054555 923 | 47.8470968083,12.1535254084 924 | 47.8470729198,12.153450558 925 | 47.8470373806,12.1533753723 926 | 47.8469114844,12.1531381644 927 | 47.8468443453,12.1531154495 928 | 47.8467807267,12.1531282738 929 | 47.8467245679,12.1531669144 930 | 47.8466694988,12.1532140207 931 | 47.8466159385,12.15325417 932 | 47.8465658985,12.1532803215 933 | 47.8464467917,12.1532819141 934 | 47.846484594,12.1532732807 935 | 47.8464877792,12.1532345563 936 | 47.8465156909,12.1531835105 937 | 47.8465728555,12.1532985102 938 | 47.8465831652,12.1533534117 939 | 47.8466026112,12.1533913817 940 | 47.8466181178,12.1534136776 941 | 47.8466182016,12.1534212213 942 | 47.8466089815,12.1533980872 943 | 47.8466058802,12.1534299385 944 | 47.8466120828,12.1534378175 945 | 47.8466047905,12.1534413379 946 | 47.8466192912,12.1534161922 947 | 47.8466259968,12.1533875261 948 | 47.8466058802,12.1533214767 949 | 47.8465964086,12.1532787289 950 | 47.8465975821,12.1532577742 951 | 47.8465860989,12.153261127 952 | 47.8465701733,12.1532409266 953 | 47.8465807345,12.153177727 954 | 47.8465789743,12.1531553473 955 | 47.8465807345,12.1531458758 956 | 47.846573526,12.1531550959 957 | 47.8465747833,12.1531894617 958 | 47.8465869371,12.1531871986 959 | 47.8465982527,12.1532043815 960 | 47.8466026112,12.1531912219 961 | 47.8466034494,12.1531753801 962 | 47.8465884458,12.1531765535 963 | 47.8466118313,12.1532216482 964 | 47.8466169443,12.1532635577 965 | 47.8469214588,12.1531371586 966 | 47.846954735,12.153150402 967 | 47.8469843231,12.1531764697 968 | 47.847008463,12.1532169543 969 | 47.8470235504,12.1532581095 970 | 47.8470377997,12.1533037908 971 | 47.8470520489,12.1533448622 972 | 47.8470678907,12.1533797309 973 | 47.847084403,12.1534156892 974 | 47.8470997419,12.1534515638 975 | 47.8471147455,12.1534910426 976 | 47.8471312579,12.1535272524 977 | 47.8471401427,12.1535622887 978 | 47.8471429925,12.1535990015 979 | 47.8471360356,12.1536324453 980 | 47.8471217863,12.1536562499 981 | 47.847099239,12.1536746062 982 | 47.8470714949,12.1536916215 983 | 47.8470417392,12.1537061222 984 | 47.8470139112,12.1537125763 985 | 47.8469841555,12.1537049487 986 | 47.8469550703,12.1536870953 987 | 47.8466246556,12.1534689143 988 | 47.8465993423,12.1534378175 989 | 47.8464498091,12.1532327123 990 | 47.8464170359,12.1531868633 991 | 47.8458975255,12.1523469966 992 | 47.8453805298,12.1513758693 993 | 47.8453648556,12.151303282 994 | 47.8453559708,12.1512217261 995 | 47.8453449067,12.1510438621 996 | 47.8453254607,12.1508661658 997 | 47.8453106247,12.1507790778 998 | 47.8452218603,12.1503614914 999 | 47.8451630194,12.1503521875 1000 | 47.8451207746,12.1503688674 1001 | 47.8448014241,12.1505023912 1002 | 47.84463563,12.1506490745 1003 | 47.8445983306,12.1506879665 1004 | 47.8445648868,12.1507251821 1005 | 47.8445318621,12.1507603861 1006 | 47.8444951493,12.1507859509 1007 | 47.8444598615,12.1508090012 1008 | 47.8444241546,12.1508337278 1009 | 47.8443866037,12.1508540958 1010 | 47.8443490528,12.1508702729 1011 | 47.8443125077,12.1508881263 1012 | 47.8441014513,12.1509635635 1013 | 47.8439429495,12.1510028746 1014 | 47.8438539337,12.1510198899 1015 | 47.843809342,12.1510322951 1016 | 47.8433050029,12.1511345543 1017 | 47.8432565555,12.1511353925 1018 | 47.8432065994,12.151143942 1019 | 47.8431532905,12.1511551738 1020 | 47.8430993948,12.1511604544 1021 | 47.8423558362,12.1512203012 1022 | 47.8422983363,12.1512151882 1023 | 47.8422384057,12.1512237377 1024 | 47.8414781671,12.1512434352 1025 | 47.8404757753,12.1511710156 1026 | 47.8399039619,12.1506997012 1027 | 47.8396034706,12.1503925044 1028 | 47.8391779214,12.1500243712 1029 | 47.8388054296,12.1497751772 1030 | 47.8387170006,12.1497278195 1031 | 47.8386745043,12.1497020032 1032 | 47.8384947963,12.1496092994 1033 | 47.838448612,12.1495890152 1034 | 47.8384023439,12.1495653782 1035 | 47.8380047902,12.1493984945 1036 | 47.8379637189,12.1493905317 1037 | 47.8379260842,12.1493783779 1038 | 47.8378911316,12.1493673977 1039 | 47.837852994,12.1493588481 1040 | 47.8378055524,12.1493591834 1041 | 47.8377555124,12.1493651345 1042 | 47.8377065621,12.1493649669 1043 | 47.8376559354,12.1493622847 1044 | 47.8376035485,12.149355663 1045 | 47.8372235131,12.1492653899 1046 | 47.8370099422,12.1491928864 1047 | 47.8369134665,12.1491413377 1048 | 47.8368702158,12.1491227299 1049 | 47.8368277196,12.1490983386 1050 | 47.8367818706,12.1490581892 1051 | 47.8367335908,12.1490089037 1052 | 47.8366860654,12.1489517391 1053 | 47.8366484307,12.1488886233 1054 | 47.8366219439,12.1488221548 1055 | 47.8366073593,12.1487548482 1056 | 47.8366050124,12.148694247 1057 | 47.8366079461,12.1486340649 1058 | 47.8366101254,12.1485732961 1059 | 47.8366094548,12.1485150419 1060 | 47.836608449,12.1484570391 1061 | 47.8366026655,12.1483950131 1062 | 47.8364663757,12.1477578208 1063 | 47.8363887593,12.1472834889 1064 | 47.8363728337,12.1472238936 1065 | 47.8363585845,12.147166729 1066 | 47.8361955564,12.1465052292 1067 | 47.836099416,12.1462285426 1068 | 47.8360751085,12.1461485792 1069 | 47.8360190336,12.1459116228 1070 | 47.8358333744,12.1450047847 1071 | 47.8355744574,12.1438991278 1072 | 47.8352116048,12.1424475498 1073 | 47.835197188,12.1423743758 1074 | 47.8351864591,12.1423032135 1075 | 47.8351260256,12.1417127084 1076 | 47.8350836132,12.1415709704 1077 | 47.8350289632,12.1414332557 1078 | 47.8349624109,12.1413132269 1079 | 47.8345680423,12.1408663038 1080 | 47.834525127,12.1408404037 1081 | 47.834299989,12.1407484543 1082 | 47.8338529821,12.1406655572 1083 | 47.8338047862,12.1406615339 1084 | 47.8337580152,12.1406332031 1085 | 47.8337198775,12.1405882761 1086 | 47.8336857632,12.140536895 1087 | 47.833647877,12.1404912136 1088 | 47.8336048778,12.1404602844 1089 | 47.8335189633,12.1404113341 1090 | 47.8334790654,12.1403748728 1091 | 47.832966093,12.1397023089 1092 | 47.8324361052,12.1389719099 1093 | 47.8323960397,12.1389246359 1094 | 47.8318859171,12.1383101586 1095 | 47.831851216,12.1382633038 1096 | 47.8316925466,12.1380049735 1097 | 47.8316675685,12.1379465517 1098 | 47.831552485,12.1376753971 1099 | 47.8315320332,12.1376245189 1100 | 47.8314156085,12.1373072639 1101 | 47.8313939832,12.1372453216 1102 | 47.831370933,12.1371786855 1103 | 47.8309758939,12.1360135172 1104 | 47.8305231873,12.1346513741 1105 | 47.8301839717,12.1330131311 1106 | 47.8300397191,12.1320326999 1107 | 47.8300129808,12.1319451928 1108 | 47.8299799562,12.131864056 1109 | 47.8299394716,12.1317888703 1110 | 47.8298953827,12.1317157801 1111 | 47.8298557363,12.131638499 1112 | 47.8298218735,12.1315607987 1113 | 47.8297756054,12.1314126905 1114 | 47.8297643736,12.1313373372 1115 | 47.8296021,12.1301703248 1116 | 47.8293649759,12.1289339941 1117 | 47.829108322,12.1283136494 1118 | 47.829093067,12.1282489412 1119 | 47.8290137742,12.1275819931 1120 | 47.8289756365,12.1272937395 1121 | 47.8289625607,12.1265486721 1122 | 47.8289613873,12.1264812816 1123 | 47.8289618064,12.126270812 1124 | 47.828956442,12.1262030862 1125 | 47.8289535921,12.126136031 1126 | 47.8289552685,12.1260718256 1127 | 47.8289580345,12.1260072012 1128 | 47.8289481439,12.124953093 1129 | 47.8289653268,12.124754861 1130 | 47.828965662,12.1246901527 1131 | 47.82896013,12.1242889948 1132 | 47.8289969265,12.1233778819 1133 | 47.8290177975,12.1233529039 1134 | 47.8290403448,12.1233330388 1135 | 47.8290652391,12.1233203821 1136 | 47.829092145,12.123312084 1137 | 47.829114357,12.1232908778 1138 | 47.8291200567,12.1232600324 1139 | 47.8291227389,12.1232500579 1140 | 47.8291218169,12.1232612059 1141 | 47.8290807456,12.1230721939 1142 | 47.8289825935,12.1225921623 1143 | 47.8289926518,12.1213002596 1144 | 47.8289929871,12.1207949147 1145 | 47.8289985191,12.120733643 1146 | 47.8290025424,12.120544631 1147 | 47.8290135227,12.1205401886 1148 | 47.8290079907,12.1205419488 1149 | 47.8290142771,12.1205370035 1150 | 47.8290326335,12.1205328126 1151 | 47.8290005308,12.1205282863 1152 | 47.8290034644,12.1205247659 1153 | 47.8290073201,12.1205287892 1154 | 47.8290058952,12.1205286216 1155 | 47.8290001955,12.1205199044 1156 | 47.8290037159,12.1205146238 1157 | 47.8289975133,12.120483527 1158 | 47.8289949987,12.1204618178 1159 | 47.8289958369,12.1204294637 1160 | 47.8289948311,12.1203933377 1161 | 47.8289949987,12.1203555353 1162 | 47.8289974295,12.1203132067 1163 | 47.8289908916,12.1193839889 1164 | 47.8289867844,12.1183024719 1165 | 47.8289821744,12.1180117037 1166 | 47.8289793245,12.1179521084 1167 | 47.8289810009,12.1178962011 1168 | 47.8290052246,12.1171226352 1169 | 47.8290060628,12.1167682484 1170 | 47.8290038835,12.1167070605 1171 | 47.8290048894,12.116646627 1172 | 47.8289732058,12.1159246936 1173 | 47.8289741278,12.1157358494 1174 | 47.8289801627,12.1156760026 1175 | 47.8289853595,12.1156171616 1176 | 47.8290265985,12.1150187775 1177 | 47.8290788177,12.114164494 1178 | 47.8290969227,12.1135133039 1179 | 47.8291339707,12.1127667278 1180 | 47.8291985113,12.1117659286 1181 | 47.8293291014,12.1105525643 1182 | 47.829255173,12.1095883939 1183 | 47.8292481322,12.1095222607 1184 | 47.8292452823,12.1094592288 1185 | 47.8292489704,12.1094009746 1186 | 47.8292587772,12.1093475819 1187 | 47.829270931,12.1092997212 1188 | 47.8292842582,12.1092587337 1189 | 47.8292923048,12.1092207637 1190 | 47.8292905446,12.1091833804 1191 | 47.8292791452,12.1091498528 1192 | 47.8292611241,12.1091268025 1193 | 47.8292400856,12.1091077756 1194 | 47.8292178735,12.10908724 1195 | 47.8291944042,12.1090644412 1196 | 47.8289499041,12.1085880138 1197 | 47.8287435416,12.1081097424 1198 | 47.8286946751,12.107975129 1199 | 47.8283564653,12.1074143797 1200 | 47.828320004,12.1073635854 1201 | 47.8282810282,12.107312791 1202 | 47.8282402921,12.1072682831 1203 | 47.8279764298,12.1070785169 1204 | 47.8277045209,12.106972402 1205 | 47.8276837338,12.1069937758 1206 | 47.8273352981,12.1071243659 1207 | 47.82702039,12.106835274 1208 | 47.8268004488,12.1061978303 1209 | 47.8267783206,12.1061482932 1210 | 47.826758204,12.1060954873 1211 | 47.8267374169,12.1060399991 1212 | 47.8265919909,12.1056228317 1213 | 47.8265785798,12.1055689361 1214 | 47.8265646659,12.1055233385 1215 | 47.8264781646,12.105119247 1216 | 47.8261043318,12.1046399698 1217 | 47.825684147,12.1043407358 1218 | 47.825346943,12.1041903645 1219 | 47.825295981,12.1041482873 1220 | 47.8252920415,12.1041202918 1221 | 47.825293215,12.1040934697 1222 | 47.8252968192,12.1040690783 1223 | 47.8253014293,12.1040411666 1224 | 47.8253067937,12.1040119976 1225 | 47.825314505,12.1039791405 1226 | 47.825319618,12.1039443556 1227 | 47.825324228,12.1039075591 1228 | 47.825459512,12.1033830196 1229 | 47.8255054448,12.1032653376 1230 | 47.8255101386,12.1032473166 1231 | 47.8255047742,12.1032313909 1232 | 47.825495135,12.1032245178 1233 | 47.8254845738,12.1032130346 1234 | 47.82546781,12.1032036468 1235 | 47.8254459333,12.1031946782 1236 | 47.8250219766,12.1029065922 1237 | 47.8245421965,12.1025439072 1238 | 47.824133914,12.1022281609 1239 | 47.8238078579,12.1019762848 1240 | 47.8234815504,12.1017260849 1241 | 47.8231796343,12.1014706884 1242 | 47.8231894411,12.1013696026 1243 | 47.8232810553,12.1011745557 1244 | 47.8235478513,12.1004716493 1245 | 47.8236069437,12.1003038436 1246 | 47.8237004858,12.1000365447 1247 | 47.823721692,12.0999810565 1248 | 47.8237425629,12.0999214612 1249 | 47.8237620089,12.0998663083 1250 | 47.8237801977,12.0998121612 1251 | 47.8237996437,12.0997547451 1252 | 47.8238188382,12.0996983349 1253 | 47.8240867238,12.0989779942 1254 | 47.8241683636,12.0987536944 1255 | 47.8242681921,12.0985411294 1256 | 47.8244478162,12.097918354 1257 | 47.8244296275,12.0978894364 1258 | 47.8244069126,12.097880803 1259 | 47.8240562975,12.0976943057 1260 | 47.8239271324,12.0976461936 1261 | 47.8235512041,12.0974459499 1262 | 47.8233038541,12.0972799044 1263 | 47.8232899401,12.0972647332 1264 | 47.823243672,12.0972213149 1265 | 47.8232321888,12.0971946605 1266 | 47.8231550753,12.0970025472 1267 | 47.8230112419,12.096715048 1268 | 47.8229948971,12.0967021398 1269 | 47.8229747806,12.0967054088 1270 | 47.8229550831,12.0967199095 1271 | 47.8229316976,12.0967357513 1272 | 47.822906971,12.0967565384 1273 | 47.8228823282,12.0967784151 1274 | 47.8226406779,12.0969305467 1275 | 47.8226089943,12.0969079994 1276 | 47.8225812502,12.096876651 1277 | 47.8225548472,12.0968415309 1278 | 47.8225279413,12.0968120266 1279 | 47.8221018892,12.0964092761 1280 | 47.8218422178,12.0961739961 1281 | 47.8218086064,12.0961788576 1282 | 47.8215689678,12.0964845456 1283 | 47.8212808818,12.0968937501 1284 | 47.8212134074,12.0969460532 1285 | 47.8212038521,12.0969565306 1286 | 47.8211868368,12.0969735458 1287 | 47.8211817238,12.0969473105 1288 | 47.8211861663,12.0969463885 1289 | 47.8211822268,12.0969530102 1290 | 47.8211835679,12.0969532616 1291 | 47.8211865015,12.0969602186 1292 | 47.8211883456,12.0969707798 1293 | 47.8211875074,12.0969738811 1294 | 47.8211912792,12.0969497412 1295 | 47.8211857472,12.096930379 1296 | 47.8211844899,12.0969245955 1297 | 47.8211832326,12.0969250984 1298 | 47.8211818915,12.0969242603 1299 | 47.8211859986,12.0969253499 1300 | 47.8211893514,12.0969314687 1301 | 47.8211947158,12.0969394315 1302 | 47.8212035168,12.0969523396 1303 | 47.8212036844,12.0969477296 1304 | 47.8212098032,12.0969445445 1305 | 47.8211956378,12.0969505794 1306 | 47.8211588413,12.0970019605 1307 | -------------------------------------------------------------------------------- /src/test/resources/points-1.0-hq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 226.91,244.19 3 | 231.58,243.65 4 | 233.31,241.45 5 | 234.98,236.06 6 | 238.8,235.98 7 | 244.21,232.76 8 | 250.68,225.45 9 | 259.65,219.81 10 | 262.59,215.31 11 | 267.76,213.81 12 | 273.57,201.84 13 | 272.18,195.66 14 | 273.12,192.16 15 | 277.62,189.03 16 | 280.36,181.41 17 | 286.51,177.74 18 | 286.83,172.31 19 | 290.07,169.32 20 | 292.41,159.37 21 | 296.91,155.64 22 | 310.09,153.8 23 | 314.95,151.37 24 | 319.75,145.16 25 | 330.33,137.57 26 | 341.48,139.96 27 | 347.37,138.23 28 | 369.98,137.89 29 | 387.39,142.51 30 | 391.28,139.39 31 | 409.52,141.14 32 | 414.82,139.75 33 | 427.72,127.3 34 | 434.13,124.46 35 | 439.6,119.74 36 | 460,112.48 37 | 469.75,110.92 38 | 474.93,107.87 39 | 486.51,106.75 40 | 489.2,109.45 41 | 493.79,108.63 42 | 504.74,119.66 43 | 512.96,122.35 44 | 518.63,120.89 45 | 524.09,126.88 46 | 529.57,127.86 47 | 534.21,140.93 48 | 536.69,144.76 49 | 539.24,145.53 50 | 539.27,147.24 51 | 543.68,148.54 52 | 552,147.31 53 | 562.06,149.76 54 | 567.69,148.91 55 | 575.25,157.26 56 | 580.62,158.15 57 | 601.53,156.85 58 | 617.74,159.86 59 | 622,167.04 60 | 622.01,171.26 61 | 626.06,181.1 62 | 625.92,185.63 63 | 629.55,194.6 64 | 635.78,196.31 65 | 638.9,195.61 66 | 641.26,200.81 67 | 651.77,204.56 68 | 669.67,219.1 69 | 671.55,222.55 70 | 677.51,221.33 71 | 683.68,217.45 72 | 695.25,219.15 73 | 700.64,217.98 74 | 703.12,214.36 75 | 712.26,215.87 76 | 721.49,212.81 77 | 724.02,214.27 78 | 727.81,213.36 79 | 729.98,208.73 80 | 735.32,208.2 81 | 739.94,204.77 82 | 747.93,204.54 83 | 769.98,208.42 84 | 779.6,216.87 85 | 784.2,218.16 86 | 789.45,218.36 87 | 796.24,214.79 88 | 800.24,214.62 89 | 810.53,219.73 90 | 811.65,222.65 91 | 817.19,226.82 92 | 820.77,236.17 93 | 827.23,236.16 94 | 829.89,239.89 95 | 841.21,245.84 96 | 844.24,245.57 97 | 851,248.94 98 | 859.88,255.49 99 | 860.95,260.82 100 | 865.21,268.53 101 | 863.73,269.69 102 | 864.29,271.5 103 | 860.76,273.83 104 | 861.03,277.41 105 | 857.95,280.3 106 | 865.48,291.45 107 | 866.81,298.66 108 | 864.68,302.71 109 | 867.79,306.17 110 | 859.87,311.37 111 | 860.08,314.35 112 | 858.29,314.94 113 | 858.1,327.6 114 | 854.54,335.4 115 | 855.8,338.6 116 | 858.92,338.57 117 | 860.92,343 118 | 856.43,350.15 119 | 851.42,352.96 120 | 849.84,359.59 121 | 854.56,365.53 122 | 849.74,370.38 123 | 844.09,371.89 124 | 843.27,374.55 125 | 844.75,380.44 126 | 841.52,383.67 127 | 839.57,390.4 128 | 845.59,399.05 129 | 848.4,407.55 130 | 847.21,410.25 131 | 844.62,409.75 132 | 843.71,411.3 133 | 844.09,419.88 134 | 839.85,428.43 135 | 839.51,432.76 136 | 841.33,441.04 137 | 844.23,442.69 138 | 847.62,449.22 139 | 847.16,458.44 140 | 848.79,461.67 141 | 851.38,462.79 142 | 853.97,471.15 143 | 857.89,475.79 144 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-1.0-sq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 227.54,244.26 3 | 231.52,243.67 4 | 233.37,241.28 5 | 235.47,235.85 6 | 238.48,235.98 7 | 244.5,232.37 8 | 250.48,225.7 9 | 259.65,219.81 10 | 262.37,215.62 11 | 266.27,214.74 12 | 269.02,211.95 13 | 273.47,202.03 14 | 273.14,192.14 15 | 277.84,188.6 16 | 280.63,181.24 17 | 286.52,177.64 18 | 286.86,172.65 19 | 290.11,168.89 20 | 292.66,159.16 21 | 297.58,155.55 22 | 309.27,153.88 23 | 314.58,151.26 24 | 326.35,139.57 25 | 331.73,137.48 26 | 341.57,139.95 27 | 347.48,138.23 28 | 369.79,137.9 29 | 387.06,142.43 30 | 391.17,139.56 31 | 409.26,141.15 32 | 414.99,139.32 33 | 428.03,127.14 34 | 439.98,119.77 35 | 460.13,112.46 36 | 470.4,110.67 37 | 474.96,107.87 38 | 486.48,106.76 39 | 489.29,109.45 40 | 494.41,109.1 41 | 504.69,119.63 42 | 512.4,122.16 43 | 518.58,120.89 44 | 524.06,126.85 45 | 529.84,128.12 46 | 534.43,141.16 47 | 539.41,147.28 48 | 543.66,148.53 49 | 551.72,147.32 50 | 562.04,149.75 51 | 567.63,148.91 52 | 575.14,157.13 53 | 580.49,158.12 54 | 601.51,156.85 55 | 617.61,159.81 56 | 622.03,167.57 57 | 626.06,181.1 58 | 625.92,185.59 59 | 629.8,194.77 60 | 638.39,195.52 61 | 641.19,200.71 62 | 651.62,204.49 63 | 668.93,218.59 64 | 671.19,222.25 65 | 677.03,221.26 66 | 683.49,217.52 67 | 695.49,219.06 68 | 700.34,217.92 69 | 702.64,214.78 70 | 712.36,215.84 71 | 718.92,213.25 72 | 724.75,214.04 73 | 728.03,213.13 74 | 730.41,208.61 75 | 735.58,208.07 76 | 739.77,204.82 77 | 749.43,204.8 78 | 769.7,208.35 79 | 779.55,216.69 80 | 784.76,218.15 81 | 789.11,218.39 82 | 796.76,214.64 83 | 800.01,214.57 84 | 810.42,219.65 85 | 811.62,222.57 86 | 817.03,226.68 87 | 820.76,236.15 88 | 827.21,236.16 89 | 830.25,240.07 90 | 850.99,248.94 91 | 859.21,255.07 92 | 865.07,268.45 93 | 861.32,273.66 94 | 860.82,277.44 95 | 857.97,279.99 96 | 865.2,291.21 97 | 866.79,298.69 98 | 864.79,302 99 | 867.29,306.98 100 | 859.92,311.37 101 | 860.08,314.35 102 | 858.04,316.31 103 | 857.8,328.24 104 | 854.55,335.26 105 | 860.85,343.14 106 | 855.92,350.58 107 | 851.66,352.93 108 | 849.96,359.27 109 | 854.61,365.24 110 | 849.84,370.23 111 | 844.24,371.72 112 | 843.27,374.53 113 | 844.75,380.44 114 | 840.21,387.84 115 | 839.94,391.9 116 | 845.54,399.01 117 | 848.37,407.44 118 | 847.2,410.08 119 | 843.92,411.12 120 | 844.09,419.88 121 | 839.54,432.25 122 | 841.58,441.28 123 | 844.22,442.69 124 | 847.56,449.78 125 | 847.37,458.63 126 | 851.3,462.74 127 | 854.1,471.17 128 | 857.96,475.83 129 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-1.5-hq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 226.91,244.19 3 | 233.31,241.45 4 | 234.98,236.06 5 | 244.21,232.76 6 | 262.59,215.31 7 | 267.76,213.81 8 | 273.57,201.84 9 | 273.12,192.16 10 | 277.62,189.03 11 | 280.36,181.41 12 | 286.51,177.74 13 | 292.41,159.37 14 | 296.91,155.64 15 | 314.95,151.37 16 | 330.33,137.57 17 | 341.48,139.96 18 | 369.98,137.89 19 | 387.39,142.51 20 | 391.28,139.39 21 | 409.52,141.14 22 | 414.82,139.75 23 | 427.72,127.3 24 | 439.6,119.74 25 | 474.93,107.87 26 | 486.51,106.75 27 | 489.2,109.45 28 | 493.79,108.63 29 | 504.74,119.66 30 | 512.96,122.35 31 | 518.63,120.89 32 | 524.09,126.88 33 | 529.57,127.86 34 | 534.21,140.93 35 | 539.27,147.24 36 | 567.69,148.91 37 | 575.25,157.26 38 | 580.62,158.15 39 | 601.53,156.85 40 | 617.74,159.86 41 | 622,167.04 42 | 629.55,194.6 43 | 638.9,195.61 44 | 641.26,200.81 45 | 651.77,204.56 46 | 671.55,222.55 47 | 683.68,217.45 48 | 695.25,219.15 49 | 700.64,217.98 50 | 703.12,214.36 51 | 712.26,215.87 52 | 721.49,212.81 53 | 727.81,213.36 54 | 729.98,208.73 55 | 739.94,204.77 56 | 769.98,208.42 57 | 779.6,216.87 58 | 784.2,218.16 59 | 800.24,214.62 60 | 810.53,219.73 61 | 817.19,226.82 62 | 820.77,236.17 63 | 827.23,236.16 64 | 829.89,239.89 65 | 851,248.94 66 | 859.88,255.49 67 | 865.21,268.53 68 | 857.95,280.3 69 | 865.48,291.45 70 | 866.81,298.66 71 | 864.68,302.71 72 | 867.79,306.17 73 | 859.87,311.37 74 | 858.29,314.94 75 | 858.1,327.6 76 | 854.54,335.4 77 | 860.92,343 78 | 856.43,350.15 79 | 851.42,352.96 80 | 849.84,359.59 81 | 854.56,365.53 82 | 849.74,370.38 83 | 844.09,371.89 84 | 844.75,380.44 85 | 839.57,390.4 86 | 848.4,407.55 87 | 843.71,411.3 88 | 844.09,419.88 89 | 839.51,432.76 90 | 841.33,441.04 91 | 847.62,449.22 92 | 847.16,458.44 93 | 851.38,462.79 94 | 853.97,471.15 95 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-1.5-sq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 226.89,244.89 3 | 233.22,241.5 4 | 235.13,236.02 5 | 243.45,233.17 6 | 262.2,216.2 7 | 267.59,213.88 8 | 273.43,202.07 9 | 273.49,191.69 10 | 277.26,189.35 11 | 280.78,181.18 12 | 285.76,178.07 13 | 293.01,158.96 14 | 297.91,155.54 15 | 313.91,151.61 16 | 326.88,139.51 17 | 330.75,137.58 18 | 341.12,139.76 19 | 369.79,137.9 20 | 387.19,142.45 21 | 392.21,139.52 22 | 408.6,141.16 23 | 414.52,139.83 24 | 439.25,119.95 25 | 475.69,107.76 26 | 486.25,106.81 27 | 489.84,109.48 28 | 494.32,109.03 29 | 505.15,119.79 30 | 512.4,122.16 31 | 518.29,120.91 32 | 524.71,127.09 33 | 529.09,127.61 34 | 535.47,142.83 35 | 540.68,147.65 36 | 566.7,148.86 37 | 574.6,156.51 38 | 580.92,158.15 39 | 603.22,156.96 40 | 617.37,159.75 41 | 621.62,166.51 42 | 629.8,194.77 43 | 638.44,195.53 44 | 641.19,200.71 45 | 651.84,204.72 46 | 670.84,221.76 47 | 683.68,217.45 48 | 698.98,218.58 49 | 703.13,214.36 50 | 712.29,215.86 51 | 719.35,213.19 52 | 727.79,213.36 53 | 729.82,208.93 54 | 742.42,204.66 55 | 769.62,208.34 56 | 784.76,218.15 57 | 799.1,214.31 58 | 810.42,219.65 59 | 817.46,227.42 60 | 821.41,236.38 61 | 827.59,236.57 62 | 830.33,240.12 63 | 859.21,255.07 64 | 865.09,268.46 65 | 857.98,279.98 66 | 864.98,290.7 67 | 864.79,302 68 | 867.15,307.14 69 | 859.85,311.56 70 | 857.29,320.02 71 | 858.1,327.47 72 | 854.67,335.67 73 | 860.76,342.45 74 | 850.22,356.36 75 | 850,360.38 76 | 854.4,365.79 77 | 844.43,371.62 78 | 844.74,380.29 79 | 840.55,386.34 80 | 839.84,390.85 81 | 848.38,407 82 | 843.72,411.6 83 | 843.82,420.62 84 | 839.57,432.06 85 | 841.33,441.03 86 | 847.55,449.2 87 | 847.22,458.13 88 | 853.99,470.94 89 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-2.0-hq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 234.98,236.06 3 | 244.21,232.76 4 | 262.59,215.31 5 | 267.76,213.81 6 | 273.57,201.84 7 | 273.12,192.16 8 | 280.36,181.41 9 | 286.51,177.74 10 | 292.41,159.37 11 | 296.91,155.64 12 | 314.95,151.37 13 | 330.33,137.57 14 | 341.48,139.96 15 | 369.98,137.89 16 | 387.39,142.51 17 | 391.28,139.39 18 | 409.52,141.14 19 | 439.6,119.74 20 | 474.93,107.87 21 | 486.51,106.75 22 | 493.79,108.63 23 | 504.74,119.66 24 | 518.63,120.89 25 | 524.09,126.88 26 | 529.57,127.86 27 | 539.27,147.24 28 | 567.69,148.91 29 | 575.25,157.26 30 | 580.62,158.15 31 | 601.53,156.85 32 | 617.74,159.86 33 | 629.55,194.6 34 | 638.9,195.61 35 | 641.26,200.81 36 | 651.77,204.56 37 | 671.55,222.55 38 | 683.68,217.45 39 | 695.25,219.15 40 | 703.12,214.36 41 | 727.81,213.36 42 | 729.98,208.73 43 | 739.94,204.77 44 | 769.98,208.42 45 | 784.2,218.16 46 | 800.24,214.62 47 | 810.53,219.73 48 | 820.77,236.17 49 | 827.23,236.16 50 | 859.88,255.49 51 | 865.21,268.53 52 | 857.95,280.3 53 | 865.48,291.45 54 | 864.68,302.71 55 | 867.79,306.17 56 | 858.29,314.94 57 | 858.1,327.6 58 | 854.54,335.4 59 | 860.92,343 60 | 851.42,352.96 61 | 849.84,359.59 62 | 854.56,365.53 63 | 844.09,371.89 64 | 844.75,380.44 65 | 839.57,390.4 66 | 848.4,407.55 67 | 843.71,411.3 68 | 844.09,419.88 69 | 839.51,432.76 70 | 853.97,471.15 71 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-2.0-sq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 235.95,235.82 3 | 243.37,233.2 4 | 267.81,213.62 5 | 273.02,203.25 6 | 273.61,191.49 7 | 286.52,177.54 8 | 292.93,159 9 | 314.92,151.29 10 | 326.1,140.06 11 | 331.52,137.52 12 | 341.21,139.81 13 | 369.28,137.91 14 | 386.67,142.37 15 | 391.89,139.47 16 | 411.68,140.39 17 | 439,120.25 18 | 485.94,106.86 19 | 494.87,109.84 20 | 505.08,119.78 21 | 518.58,120.89 22 | 523.95,126.75 23 | 529.76,128.1 24 | 539.68,147.36 25 | 568.16,149.48 26 | 579.36,157.88 27 | 603.68,156.96 28 | 618.09,160.22 29 | 629.3,193.23 30 | 650.84,204.08 31 | 671.55,222.55 32 | 685.11,217.51 33 | 699.19,218.55 34 | 703.23,214.37 35 | 724.83,214.02 36 | 739.61,204.81 37 | 770.29,208.61 38 | 785.23,218.19 39 | 802.5,215.56 40 | 817.21,226.89 41 | 820.94,236.22 42 | 827.12,236.14 43 | 858.93,254.88 44 | 864.12,265.5 45 | 864.29,271.44 46 | 857.97,280.43 47 | 865.39,292.08 48 | 867.41,306.74 49 | 858.04,316.33 50 | 854.78,335.86 51 | 860.56,343.7 52 | 851.22,353.81 53 | 849.94,359.3 54 | 854.51,365.57 55 | 844.5,371.56 56 | 844.31,381.3 57 | 840.12,388.01 58 | 848.06,407.67 59 | 843.91,411.17 60 | 839.56,432.5 61 | 847.47,450.25 62 | 848.91,461.75 63 | 856.86,474.89 64 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-4.0-hq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 234.98,236.06 3 | 267.76,213.81 4 | 273.12,192.16 5 | 296.91,155.64 6 | 314.95,151.37 7 | 330.33,137.57 8 | 409.52,141.14 9 | 439.6,119.74 10 | 486.51,106.75 11 | 529.57,127.86 12 | 539.27,147.24 13 | 567.69,148.91 14 | 580.62,158.15 15 | 617.74,159.86 16 | 629.55,194.6 17 | 638.9,195.61 18 | 671.55,222.55 19 | 727.81,213.36 20 | 739.94,204.77 21 | 769.98,208.42 22 | 784.2,218.16 23 | 800.24,214.62 24 | 820.77,236.17 25 | 859.88,255.49 26 | 865.21,268.53 27 | 857.95,280.3 28 | 867.79,306.17 29 | 858.29,314.94 30 | 854.54,335.4 31 | 860.92,343 32 | 849.84,359.59 33 | 854.56,365.53 34 | 844.09,371.89 35 | 839.57,390.4 36 | 848.4,407.55 37 | 839.51,432.76 38 | 853.97,471.15 39 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-4.0-sq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 268.56,212.23 3 | 272.95,193.27 4 | 295.23,156.85 5 | 314.27,151.47 6 | 329.39,138.53 7 | 412.21,140.24 8 | 441.51,119.36 9 | 484.4,107.14 10 | 529.76,128.1 11 | 542.17,148.04 12 | 566.19,149.07 13 | 579.12,157.83 14 | 615.94,159.23 15 | 629.3,193.23 16 | 672.3,222.11 17 | 726.05,213.64 18 | 739.61,204.81 19 | 767.63,207.97 20 | 784.88,218.15 21 | 800.21,214.61 22 | 822.86,236.22 23 | 857.2,253.85 24 | 864.43,267.6 25 | 859.29,278.03 26 | 865.96,308.13 27 | 858,316.37 28 | 854.81,335.9 29 | 860.21,341.9 30 | 850.53,358.15 31 | 854.55,365.06 32 | 844.85,371.17 33 | 839.97,389.84 34 | 847.81,408.03 35 | 839.81,433.56 36 | 847.82,459.75 37 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-5.0-hq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 267.76,213.81 3 | 296.91,155.64 4 | 330.33,137.57 5 | 409.52,141.14 6 | 439.6,119.74 7 | 486.51,106.75 8 | 529.57,127.86 9 | 539.27,147.24 10 | 617.74,159.86 11 | 629.55,194.6 12 | 671.55,222.55 13 | 727.81,213.36 14 | 739.94,204.77 15 | 769.98,208.42 16 | 784.2,218.16 17 | 800.24,214.62 18 | 820.77,236.17 19 | 859.88,255.49 20 | 865.21,268.53 21 | 857.95,280.3 22 | 867.79,306.17 23 | 858.29,314.94 24 | 854.54,335.4 25 | 860.92,343 26 | 849.84,359.59 27 | 854.56,365.53 28 | 844.09,371.89 29 | 839.57,390.4 30 | 848.4,407.55 31 | 839.51,432.76 32 | 853.97,471.15 33 | 866.36,480.77 -------------------------------------------------------------------------------- /src/test/resources/points-5.0-sq.txt: -------------------------------------------------------------------------------- 1 | 224.55,250.15 2 | 268.97,212.12 3 | 292.38,159.47 4 | 330.46,137.56 5 | 409.52,141.14 6 | 442.81,118.91 7 | 485.77,106.89 8 | 529.41,127.83 9 | 543.14,148.43 10 | 615.78,159.16 11 | 629.33,193.39 12 | 670.25,220.91 13 | 723.48,214 14 | 741.45,204.79 15 | 783.78,217.93 16 | 803.05,215.94 17 | 819.82,233.9 18 | 859.26,255.1 19 | 865.07,268.99 20 | 860.13,277.62 21 | 867.25,305.44 22 | 858.02,316.75 23 | 859.57,344.74 24 | 850.18,356.4 25 | 854.65,365.14 26 | 840.09,388.34 27 | 848.37,406.42 28 | 839.93,434.19 29 | 853.98,471.08 30 | 866.36,480.77 --------------------------------------------------------------------------------