diff --git a/README.md b/README.md index e4ab374..e63bbfe 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ This includes a fully [RFC 7946](https://tools.ietf.org/html/rfc7946)-compliant Most of the implementation is a direct translation from [turf.js](https://github.com/Turfjs/turf). ## Get started + - Get the [Dart tools](https://dart.dev/tools) - Install the library with `dart pub add turf` - Import the library in your code and use it. For example: @@ -58,12 +59,14 @@ main() { ![polymorphism](https://user-images.githubusercontent.com/10634693/159876354-f9da2f37-02b3-4546-b32a-c0f82c372272.png) ## Notable Design Decisions + - Nested `GeometryCollections` (as described in [RFC 7946 section 3.1.8](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.8)) are _not supported_ which takes a slightly firmer stance than the "should avoid" language in the specification ## Tests and Benchmarks + Tests are run with `dart test` and benchmarks can be run with `dart run benchmark` @@ -73,6 +76,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the ## Components ### Measurement + - [ ] along - [x] [area](https://github.com/dartclub/turf_dart/blob/main/lib/src/area.dart) - [x] [bbox](https://github.com/dartclub/turf_dart/blob/main/lib/src/bbox.dart) @@ -96,6 +100,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] greatCircle ### Coordinate Mutation + - [x] [cleanCoords](https://github.com/dartclub/turf_dart/blob/main/lib/src/clean_coords.dart) - [ ] flip - [ ] rewind @@ -103,6 +108,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [truncate](https://github.com/dartclub/turf_dart/blob/main/lib/src/truncate.dart) ### Transformation + - [ ] bboxClip - [ ] bezierSpline - [ ] buffer @@ -114,7 +120,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] dissolve - [ ] intersect - [ ] lineOffset -- [ ] polygonSmooth +- [x] [polygonSmooth](ttps://github.com/dartclub/turf_dart/blob/main/lib/src/polygon_smooth.dart) - [ ] simplify - [ ] tesselate - [ ] transformRotate @@ -122,9 +128,10 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] transformScale - [ ] union - [ ] voronoi -- [x] [polyLineDecode](https://github.com/Dennis-Mwea/turf_dart/blob/main/lib/src/polyline.dart) +- [x] [polyLineDecode](https://github.com/dartclub/turf_dart/blob/main/lib/src/polyline.dart) ### Feature Conversion + - [ ] combine - [x] [explode](https://github.com/dartclub/turf_dart/blob/main/lib/src/explode.dart) - [ ] flatten @@ -133,6 +140,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [polygonToLine](https://github.com/dartclub/turf_dart/blob/main/lib/src/polygon_to_line.dart) ### MISC + - [ ] ellipse - [ ] kinks - [ ] lineArc @@ -150,15 +158,18 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] unkinkPolygon ### Random + - [ ] randomPosition - [ ] randomPoint - [ ] randomLineString - [ ] randomPolygon ### Data + - [ ] sample ### Interpolation + - [ ] interpolate - [ ] isobands - [ ] isolines @@ -166,24 +177,29 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] tin ### Joins + - [ ] pointsWithinPolygon - [ ] tag ### Grids + - [ ] hexGrid - [ ] pointGrid - [ ] squareGrid - [ ] triangleGrid ### Classification + - [x] [nearestPoint](https://github.com/dartclub/turf_dart/blob/main/lib/src/nearest_point.dart) ### Aggregation + - [ ] collect - [ ] clustersDbscan - [ ] clustersKmeans ### META + - [x] [coordAll](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/coord.dart) - [x] [coordEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/coord.dart) - [x] [coordReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/coord.dart) @@ -204,6 +220,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [clusterReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/cluster.dart) ### Booleans + - [ ] booleanClockwise - [ ] booleanConcave - [ ] booleanContains @@ -218,6 +235,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] booleanWithin ### Unit Conversion + - [x] [bearingToAzimuth](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) - [x] [convertArea](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) - [x] [convertLength](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) diff --git a/benchmark/polygon_smooth_benchmark.dart b/benchmark/polygon_smooth_benchmark.dart new file mode 100644 index 0000000..a3b5dcb --- /dev/null +++ b/benchmark/polygon_smooth_benchmark.dart @@ -0,0 +1,21 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:benchmark/benchmark.dart'; +import 'package:turf/polygon_smooth.dart'; +import 'package:turf/turf.dart'; + +main() { + group("turf-polygon-smooth", () { + var inDir = Directory('./test/examples/polygonSmooth/in'); + for (var file in inDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + benchmark(file.path, () { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + polygonSmooth(inGeom, iterations: 3); + }); + } + } + }); +} diff --git a/lib/polygon_smooth.dart b/lib/polygon_smooth.dart new file mode 100644 index 0000000..7d38df1 --- /dev/null +++ b/lib/polygon_smooth.dart @@ -0,0 +1,3 @@ +library turf_polygon_smooth; + +export 'src/polygon_smooth.dart'; diff --git a/lib/src/line_to_polygon.dart b/lib/src/line_to_polygon.dart index c26028f..bf537da 100644 --- a/lib/src/line_to_polygon.dart +++ b/lib/src/line_to_polygon.dart @@ -143,26 +143,24 @@ Feature lineStringToPolygon( List> multiCoords = []; num largestArea = 0; - line.coordinates.forEach( - (coord) { - if (autoComplete) { - coord = _autoCompleteCoords(coord); - } + for (var coord in line.coordinates) { + if (autoComplete) { + coord = _autoCompleteCoords(coord); + } - // Largest LineString to be placed in the first position of the coordinates array - if (orderCoords) { - var area = _calculateArea(bbox(LineString(coordinates: coord))); - if (area > largestArea) { - multiCoords.insert(0, coord); - largestArea = area; - } else { - multiCoords.add(coord); - } + // Largest LineString to be placed in the first position of the coordinates array + if (orderCoords) { + var area = _calculateArea(bbox(LineString(coordinates: coord))); + if (area > largestArea) { + multiCoords.insert(0, coord); + largestArea = area; } else { multiCoords.add(coord); } - }, - ); + } else { + multiCoords.add(coord); + } + } return Feature( geometry: Polygon(coordinates: multiCoords), properties: properties); } else { diff --git a/lib/src/polygon_smooth.dart b/lib/src/polygon_smooth.dart new file mode 100644 index 0000000..d55930f --- /dev/null +++ b/lib/src/polygon_smooth.dart @@ -0,0 +1,152 @@ +import 'package:turf/meta.dart'; +import 'package:turf/turf.dart'; + +/// +/// Smooths a [Polygon], [MultiPolygon], also inside [Feature]s, [FeatureCollection]s, or [GeometryCollection]. Based on [Chaikin's algorithm](http://graphics.cs.ucdavis.edu/education/CAGDNotes/Chaikins-Algorithm/Chaikins-Algorithm.html). +/// Warning: may create degenerate polygons. +/// The optional parameter [iterations] is the number of times to smooth the polygon. A higher value means a smoother polygon. +/// The functions returns a [FeatureCollection] of [Polygon]s and [MultiPolygon]s. +/// +/// ```dart +/// var polygon = Polygon(coordinates: [ +/// [ +/// Position(11, 0), +/// Position(22, 4), +/// Position(31, 0), +/// Position(31, 11), +/// Position(21, 15), +/// Position(11, 11), +/// Position(11, 0), +/// ] +/// ]); +/// +/// var smoothed = polygonSmooth(polygon, iterations: 3); +/// ``` +FeatureCollection polygonSmooth(GeoJSONObject inputPolys, + {int iterations = 1}) { + var outPolys = []; + + geomEach(inputPolys, ( + GeometryType? geom, + int? geomIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, + ) { + var outCoords; + var poly; + var tempOutput; + + switch (geom?.type) { + case GeoJSONObjectType.polygon: + outCoords = >[[]]; + for (var i = 0; i < iterations; i++) { + tempOutput = >[[]]; + poly = geom; + if (i > 0) poly = Polygon(coordinates: outCoords); + _processPolygon(poly, tempOutput); + outCoords = List>.of(tempOutput); + } + outPolys.add(Feature( + geometry: Polygon(coordinates: outCoords), + properties: featureProperties)); + break; + case GeoJSONObjectType.multiPolygon: + outCoords = [ + [[]] + ]; + for (var y = 0; y < iterations; y++) { + tempOutput = >>[ + [[]] + ]; + poly = geom; + if (y > 0) poly = MultiPolygon(coordinates: outCoords); + _processMultiPolygon(poly, tempOutput); + outCoords = List>>.of(tempOutput); + } + outPolys.add(Feature( + geometry: MultiPolygon(coordinates: outCoords), + properties: featureProperties)); + break; + default: + throw Exception("geometry is invalid, must be Polygon or MultiPolygon"); + } + }); + return FeatureCollection(features: outPolys); +} + +_processPolygon(Polygon poly, List> tempOutput) { + var prevGeomIndex = 0; + var subtractCoordIndex = 0; + + coordEach(poly, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, + geometryIndex) { + if (geometryIndex! > prevGeomIndex) { + prevGeomIndex = geometryIndex; + subtractCoordIndex = coordIndex!; + tempOutput.add([]); + } + var realCoordIndex = coordIndex! - subtractCoordIndex; + var p1 = poly.coordinates[geometryIndex][realCoordIndex + 1]; + var p0x = currentCoord!.lng; + var p0y = currentCoord.lat; + var p1x = p1.lng; + var p1y = p1.lat; + tempOutput[geometryIndex].add(Position( + 0.75 * p0x + 0.25 * p1x, + 0.75 * p0y + 0.25 * p1y, + )); + tempOutput[geometryIndex].add(Position( + 0.25 * p0x + 0.75 * p1x, + 0.25 * p0y + 0.75 * p1y, + )); + }, true); + for (var ring in tempOutput) { + ring.add(ring[0]); + } +} + +_processMultiPolygon(poly, List>> tempOutput) { + var prevGeomIndex = 0; + var subtractCoordIndex = 0; + var prevMultiIndex = 0; + + coordEach(poly, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, + geometryIndex) { + if (multiFeatureIndex! > prevMultiIndex) { + prevMultiIndex = multiFeatureIndex; + subtractCoordIndex = coordIndex!; + tempOutput.add([[]]); + } + if (geometryIndex! > prevGeomIndex) { + prevGeomIndex = geometryIndex; + subtractCoordIndex = coordIndex!; + tempOutput[multiFeatureIndex].add([]); + } + var realCoordIndex = coordIndex! - subtractCoordIndex; + if (realCoordIndex + 1 == + poly.coordinates[multiFeatureIndex][geometryIndex].length) { + return; + } + var p1 = + poly.coordinates[multiFeatureIndex][geometryIndex][realCoordIndex + 1]; + var p0x = currentCoord!.lng; + var p0y = currentCoord.lat; + var p1x = p1.lng; + var p1y = p1.lat; + tempOutput[multiFeatureIndex][geometryIndex].add(Position( + 0.75 * p0x + 0.25 * p1x, + 0.75 * p0y + 0.25 * p1y, + )); + tempOutput[multiFeatureIndex][geometryIndex].add(Position( + 0.25 * p0x + 0.75 * p1x, + 0.25 * p0y + 0.75 * p1y, + )); + }, true); + + for (var poly in tempOutput) { + for (var ring in poly) { + ring.add(ring[0]); + } + } +} diff --git a/lib/src/polygon_to_line.dart b/lib/src/polygon_to_line.dart index aee6257..a1b6d65 100644 --- a/lib/src/polygon_to_line.dart +++ b/lib/src/polygon_to_line.dart @@ -48,7 +48,9 @@ FeatureCollection _multiPolygonToLine(MultiPolygon geom, properties = properties ?? {}; var lines = []; - coords.forEach((coord) => {lines.add(_coordsToLine(coord, properties))}); + for (var coord in coords) { + lines.add(_coordsToLine(coord, properties)); + } return FeatureCollection(features: lines); } diff --git a/test/components/polygon_smooth_test.dart b/test/components/polygon_smooth_test.dart new file mode 100644 index 0000000..73379b9 --- /dev/null +++ b/test/components/polygon_smooth_test.dart @@ -0,0 +1,49 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/polygon_smooth.dart'; +import 'package:turf/turf.dart'; +import 'package:turf_equality/turf_equality.dart'; + +main() { + group("turf-polygon-smooth", () { + var inDir = Directory('./test/examples/polygonSmooth/in'); + for (var file in inDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test(file.path, () { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + var results = polygonSmooth(inGeom, iterations: 3); + var outPath = './' + + file.uri.pathSegments + .sublist(0, file.uri.pathSegments.length - 2) + .join('/') + + '/out/${file.uri.pathSegments.last}'; + + var outSource = File(outPath).readAsStringSync(); + var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); + + Equality eq = Equality(); + expect(eq.compare(results, outGeom), true); + }); + } + } + test("turf-polygon-smooth -- options are optional", () { + var poly = Polygon(coordinates: [ + [ + Position(0, 0), + Position(1, 0), + Position(1, 1), + Position(0, 1), + Position(0, 0), + ], + ]); + Future _compare() async { + polygonSmooth(poly); + } + + expect(_compare(), completes); + }); + }); +} diff --git a/test/examples/polygonSmooth/in/close.geojson b/test/examples/polygonSmooth/in/close.geojson new file mode 100644 index 0000000..fef3e9d --- /dev/null +++ b/test/examples/polygonSmooth/in/close.geojson @@ -0,0 +1,59 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 18.28125, + 39.095962936305476 + ], + [ + 32.34375, + 31.653381399664 + ], + [ + 19.6875, + 17.97873309555617 + ], + [ + 35.15625, + 10.833305983642491 + ], + [ + 19.6875, + 0 + ], + [ + 32.6953125, + -2.811371193331128 + ], + [ + 40.78125, + 13.923403897723347 + ], + [ + 24.2578125, + 17.97873309555617 + ], + [ + 33.75, + 31.952162238024975 + ], + [ + 29.53125, + 40.713955826286046 + ], + [ + 22.8515625, + 40.713955826286046 + ], + [ + 18.28125, + 39.095962936305476 + ] + ] + ] + } +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/in/geometry.geojson b/test/examples/polygonSmooth/in/geometry.geojson new file mode 100644 index 0000000..55b48a9 --- /dev/null +++ b/test/examples/polygonSmooth/in/geometry.geojson @@ -0,0 +1,47 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 2.28515625, + 27.761329874505233 + ], + [ + -5.537109374999999, + 21.616579336740603 + ], + [ + -0.087890625, + 17.14079039331665 + ], + [ + 0.87890625, + 21.37124437061831 + ], + [ + 4.482421875, + 19.72534224805787 + ], + [ + 5.09765625, + 22.51255695405145 + ], + [ + 10.458984375, + 24.607069137709683 + ], + [ + 3.076171875, + 26.194876675795218 + ], + [ + 6.15234375, + 29.305561325527698 + ], + [ + 2.28515625, + 27.761329874505233 + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/in/multipolygon.geojson b/test/examples/polygonSmooth/in/multipolygon.geojson new file mode 100644 index 0000000..e16da19 --- /dev/null +++ b/test/examples/polygonSmooth/in/multipolygon.geojson @@ -0,0 +1,53 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 102.0, + 2.0 + ], + [ + 103.0, + 2.0 + ], + [ + 103.0, + 3.0 + ], + [ + 102.0, + 3.0 + ], + [ + 102.0, + 2.0 + ] + ] + ], + [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 0.0 + ], + [ + 101.0, + 1.0 + ], + [ + 100.0, + 1.0 + ], + [ + 100.0, + 0.0 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/in/multipolygonWithHole.geojson b/test/examples/polygonSmooth/in/multipolygonWithHole.geojson new file mode 100644 index 0000000..1f43734 --- /dev/null +++ b/test/examples/polygonSmooth/in/multipolygonWithHole.geojson @@ -0,0 +1,30 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [102.0, 2.0], + [103.0, 2.0], + [103.0, 3.0], + [102.0, 3.0], + [102.0, 2.0] + ] + ], + [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ], + [ + [100.2, 0.2], + [100.8, 0.2], + [100.8, 0.8], + [100.2, 0.8], + [100.2, 0.2] + ] + ] + ] + } \ No newline at end of file diff --git a/test/examples/polygonSmooth/in/polygon.geojson b/test/examples/polygonSmooth/in/polygon.geojson new file mode 100644 index 0000000..fd05344 --- /dev/null +++ b/test/examples/polygonSmooth/in/polygon.geojson @@ -0,0 +1,21 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [2.28515625, 27.761329874505233], + [-5.537109374999999, 21.616579336740603], + [-0.087890625, 17.14079039331665], + [0.87890625, 21.37124437061831], + [4.482421875, 19.72534224805787], + [5.09765625, 22.51255695405145], + [10.458984375, 24.607069137709683], + [3.076171875, 26.194876675795218], + [6.15234375, 29.305561325527698], + [2.28515625, 27.761329874505233] + ] + ] + } + } \ No newline at end of file diff --git a/test/examples/polygonSmooth/in/withHole.geojson b/test/examples/polygonSmooth/in/withHole.geojson new file mode 100644 index 0000000..03fab4b --- /dev/null +++ b/test/examples/polygonSmooth/in/withHole.geojson @@ -0,0 +1,49 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 0.0 + ], + [ + 101.0, + 1.0 + ], + [ + 100.0, + 1.0 + ], + [ + 100.0, + 0.0 + ] + ], + [ + [ + 100.2, + 0.2 + ], + [ + 100.8, + 0.2 + ], + [ + 100.8, + 0.8 + ], + [ + 100.2, + 0.8 + ], + [ + 100.2, + 0.2 + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/out/close.geojson b/test/examples/polygonSmooth/out/close.geojson new file mode 100644 index 0000000..40f153a --- /dev/null +++ b/test/examples/polygonSmooth/out/close.geojson @@ -0,0 +1,372 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 24.43359375, + 35.83983351402483 + ], + [ + 26.19140625, + 34.90951082194465 + ], + [ + 27.53173828125, + 33.8818120866228 + ], + [ + 28.45458984375, + 32.7567373080593 + ], + [ + 28.9599609375, + 31.534286486254125 + ], + [ + 29.0478515625, + 30.21445962120729 + ], + [ + 28.71826171875, + 28.797256712918795 + ], + [ + 27.97119140625, + 27.28267776138864 + ], + [ + 26.806640625, + 25.670722766616823 + ], + [ + 25.224609375, + 23.961391728603346 + ], + [ + 24.08203125, + 22.3540797717179 + ], + [ + 23.37890625, + 20.84878689596049 + ], + [ + 23.115234375, + 19.445513101331112 + ], + [ + 23.291015625, + 18.144258387829765 + ], + [ + 23.90625, + 16.945022755456456 + ], + [ + 24.9609375, + 15.847806204211178 + ], + [ + 26.455078125, + 14.852608734093936 + ], + [ + 28.388671875, + 13.959430345104726 + ], + [ + 29.8388671875, + 13.008628848744754 + ], + [ + 30.8056640625, + 12.000204245014018 + ], + [ + 31.2890625, + 10.934156533912521 + ], + [ + 31.2890625, + 9.81048571544026 + ], + [ + 30.8056640625, + 8.629191789597236 + ], + [ + 29.8388671875, + 7.39027475638345 + ], + [ + 28.388671875, + 6.093734615798901 + ], + [ + 26.455078125, + 4.73957136784359 + ], + [ + 24.9664306640625, + 3.5107508509868937 + ], + [ + 23.9227294921875, + 2.4072730652288126 + ], + [ + 23.323974609375, + 1.429138010569346 + ], + [ + 23.170166015625, + 0.5763456870084949 + ], + [ + 23.4613037109375, + -0.15110390545374128 + ], + [ + 24.1973876953125, + -0.7532107668173623 + ], + [ + 25.37841796875, + -1.2299748970823683 + ], + [ + 27.00439453125, + -1.581396296248759 + ], + [ + 28.553466796875, + -1.6274091597216251 + ], + [ + 30.025634765625, + -1.3680134875009662 + ], + [ + 31.4208984375, + -0.803209279586782 + ], + [ + 32.7392578125, + 0.06700346402092716 + ], + [ + 33.980712890625, + 1.2426247433221613 + ], + [ + 35.145263671875, + 2.7236545583169205 + ], + [ + 36.23291015625, + 4.510092909005205 + ], + [ + 37.24365234375, + 6.601939795387015 + ], + [ + 37.869873046875, + 8.495670339687235 + ], + [ + 38.111572265625, + 10.191284541905867 + ], + [ + 37.96875, + 11.68878240204291 + ], + [ + 37.44140625, + 12.98816392009837 + ], + [ + 36.529541015625, + 14.089429096072237 + ], + [ + 35.233154296875, + 14.992577929964515 + ], + [ + 33.55224609375, + 15.697610421775206 + ], + [ + 31.48681640625, + 16.20452657150431 + ], + [ + 29.827880859375, + 16.86641303286835 + ], + [ + 28.575439453125, + 17.683269805867326 + ], + [ + 27.7294921875, + 18.65509689050124 + ], + [ + 27.2900390625, + 19.781894286770097 + ], + [ + 27.257080078125, + 21.063661994673886 + ], + [ + 27.630615234375, + 22.50040001421261 + ], + [ + 28.41064453125, + 24.092108345386272 + ], + [ + 29.59716796875, + 25.838786988194872 + ], + [ + 30.5694580078125, + 27.504033825468973 + ], + [ + 31.3275146484375, + 29.087848857208584 + ], + [ + 31.871337890625, + 30.590232083413696 + ], + [ + 32.200927734375, + 32.011183504084315 + ], + [ + 32.3162841796875, + 33.35070311922044 + ], + [ + 32.2174072265625, + 34.60879092882206 + ], + [ + 31.904296875, + 35.785446932889194 + ], + [ + 31.376953125, + 36.88067113142183 + ], + [ + 30.8111572265625, + 37.83899230513788 + ], + [ + 30.2069091796875, + 38.66041045403736 + ], + [ + 29.564208984375, + 39.344925578120254 + ], + [ + 28.883056640625, + 39.89253767738657 + ], + [ + 28.1634521484375, + 40.30324675183631 + ], + [ + 27.4053955078125, + 40.57705280146946 + ], + [ + 26.60888671875, + 40.713955826286046 + ], + [ + 25.77392578125, + 40.713955826286046 + ], + [ + 24.971923828125, + 40.6886746873801 + ], + [ + 24.202880859375, + 40.6381124095682 + ], + [ + 23.466796875, + 40.56226899285036 + ], + [ + 22.763671875, + 40.46114443722658 + ], + [ + 22.093505859375, + 40.33473874269685 + ], + [ + 21.456298828125, + 40.183051909261174 + ], + [ + 20.85205078125, + 40.00608393691955 + ], + [ + 20.28076171875, + 39.80383482567197 + ], + [ + 20.0006103515625, + 39.51057651682032 + ], + [ + 20.0115966796875, + 39.12630901036461 + ], + [ + 20.313720703125, + 38.6510323063048 + ], + [ + 20.906982421875, + 38.084746404640924 + ], + [ + 21.7913818359375, + 37.42745130537297 + ], + [ + 22.9669189453125, + 36.679147008500934 + ], + [ + 24.43359375, + 35.83983351402483 + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/out/geometry.geojson b/test/examples/polygonSmooth/out/geometry.geojson new file mode 100644 index 0000000..04c6ae7 --- /dev/null +++ b/test/examples/polygonSmooth/out/geometry.geojson @@ -0,0 +1,308 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -1.1370849609374996, + 25.073001514233205 + ], + [ + -2.114868164062499, + 24.30490769701263 + ], + [ + -2.885284423828124, + 23.562891404703624 + ], + [ + -3.448333740234374, + 22.84695263730619 + ], + [ + -3.804016113281249, + 22.157091394820334 + ], + [ + -3.952331542968749, + 21.493307677246044 + ], + [ + -3.893280029296874, + 20.85560148458333 + ], + [ + -3.626861572265624, + 20.24397281683219 + ], + [ + -3.153076171874999, + 19.65842167399262 + ], + [ + -2.471923828124999, + 19.09894805606463 + ], + [ + -1.8608093261718746, + 18.675509483772974 + ], + [ + -1.3197326660156246, + 18.388105957117656 + ], + [ + -0.8486938476562498, + 18.236737476098675 + ], + [ + -0.4476928710937499, + 18.22140404071603 + ], + [ + -0.11672973632812494, + 18.342105650969724 + ], + [ + 0.144195556640625, + 18.59884230685976 + ], + [ + 0.3350830078125, + 18.991614008386126 + ], + [ + 0.4559326171875, + 19.520420755548834 + ], + [ + 0.61798095703125, + 19.957409438651194 + ], + [ + 0.82122802734375, + 20.302580057693213 + ], + [ + 1.065673828125, + 20.555932612674884 + ], + [ + 1.351318359375, + 20.71746710359621 + ], + [ + 1.67816162109375, + 20.78718353045719 + ], + [ + 2.04620361328125, + 20.765081893257825 + ], + [ + 2.4554443359375, + 20.651162191998118 + ], + [ + 2.9058837890625, + 20.445424426678063 + ], + [ + 3.30963134765625, + 20.308954111804166 + ], + [ + 3.66668701171875, + 20.241751247376424 + ], + [ + 3.97705078125, + 20.243815833394837 + ], + [ + 4.24072265625, + 20.31514786985941 + ], + [ + 4.45770263671875, + 20.455747356770136 + ], + [ + 4.62799072265625, + 20.66561429412702 + ], + [ + 4.7515869140625, + 20.94474868193006 + ], + [ + 4.8284912109375, + 21.29315052017926 + ], + [ + 4.97955322265625, + 21.63072888151697 + ], + [ + 5.20477294921875, + 21.957483765943184 + ], + [ + 5.504150390625, + 22.273415173457913 + ], + [ + 5.877685546875, + 22.578523104061155 + ], + [ + 6.32537841796875, + 22.872807557752903 + ], + [ + 6.84722900390625, + 23.156268534533158 + ], + [ + 7.4432373046875, + 23.428906034401926 + ], + [ + 8.1134033203125, + 23.690720057359208 + ], + [ + 8.584442138671875, + 23.944616820229413 + ], + [ + 8.856353759765625, + 24.190596323012542 + ], + [ + 8.92913818359375, + 24.428658565708602 + ], + [ + 8.80279541015625, + 24.658803548317586 + ], + [ + 8.477325439453125, + 24.8810312708395 + ], + [ + 7.952728271484375, + 25.09534173327434 + ], + [ + 7.22900390625, + 25.301734935622104 + ], + [ + 6.30615234375, + 25.500210877882797 + ], + [ + 5.546722412109375, + 25.722481775012973 + ], + [ + 4.950714111328125, + 25.968547627012633 + ], + [ + 4.51812744140625, + 26.238408433881773 + ], + [ + 4.24896240234375, + 26.532064195620396 + ], + [ + 4.143218994140625, + 26.849514912228507 + ], + [ + 4.200897216796875, + 27.1907605837061 + ], + [ + 4.4219970703125, + 27.555801210053176 + ], + [ + 4.8065185546875, + 27.944636791269737 + ], + [ + 5.082550048828125, + 28.260739308412003 + ], + [ + 5.250091552734375, + 28.50410876147997 + ], + [ + 5.30914306640625, + 28.674745150473644 + ], + [ + 5.25970458984375, + 28.77264847539302 + ], + [ + 5.101776123046875, + 28.7978187362381 + ], + [ + 4.835357666015625, + 28.750255933008884 + ], + [ + 4.46044921875, + 28.62996006570537 + ], + [ + 3.97705078125, + 28.436931134327562 + ], + [ + 3.431854248046875, + 28.172019092219408 + ], + [ + 2.824859619140625, + 27.835223939380903 + ], + [ + 2.15606689453125, + 27.426545675812058 + ], + [ + 1.4254760742187502, + 26.945984301512862 + ], + [ + 0.6330871582031253, + 26.393539816483322 + ], + [ + -0.2210998535156246, + 25.76921222072344 + ], + [ + -1.1370849609374996, + 25.073001514233205 + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/out/multipolygon.geojson b/test/examples/polygonSmooth/out/multipolygon.geojson new file mode 100644 index 0000000..222700c --- /dev/null +++ b/test/examples/polygonSmooth/out/multipolygon.geojson @@ -0,0 +1,286 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 102.4375, + 2 + ], + [ + 102.5625, + 2 + ], + [ + 102.671875, + 2.015625 + ], + [ + 102.765625, + 2.046875 + ], + [ + 102.84375, + 2.09375 + ], + [ + 102.90625, + 2.15625 + ], + [ + 102.953125, + 2.234375 + ], + [ + 102.984375, + 2.328125 + ], + [ + 103, + 2.4375 + ], + [ + 103, + 2.5625 + ], + [ + 102.984375, + 2.671875 + ], + [ + 102.953125, + 2.765625 + ], + [ + 102.90625, + 2.84375 + ], + [ + 102.84375, + 2.90625 + ], + [ + 102.765625, + 2.953125 + ], + [ + 102.671875, + 2.984375 + ], + [ + 102.5625, + 3 + ], + [ + 102.4375, + 3 + ], + [ + 102.328125, + 2.984375 + ], + [ + 102.234375, + 2.953125 + ], + [ + 102.15625, + 2.90625 + ], + [ + 102.09375, + 2.84375 + ], + [ + 102.046875, + 2.765625 + ], + [ + 102.015625, + 2.671875 + ], + [ + 102, + 2.5625 + ], + [ + 102, + 2.4375 + ], + [ + 102.015625, + 2.328125 + ], + [ + 102.046875, + 2.234375 + ], + [ + 102.09375, + 2.15625 + ], + [ + 102.15625, + 2.09375 + ], + [ + 102.234375, + 2.046875 + ], + [ + 102.328125, + 2.015625 + ], + [ + 102.4375, + 2 + ] + ] + ], + [ + [ + [ + 100.4375, + 0 + ], + [ + 100.5625, + 0 + ], + [ + 100.671875, + 0.015625 + ], + [ + 100.765625, + 0.046875 + ], + [ + 100.84375, + 0.09375 + ], + [ + 100.90625, + 0.15625 + ], + [ + 100.953125, + 0.234375 + ], + [ + 100.984375, + 0.328125 + ], + [ + 101, + 0.4375 + ], + [ + 101, + 0.5625 + ], + [ + 100.984375, + 0.671875 + ], + [ + 100.953125, + 0.765625 + ], + [ + 100.90625, + 0.84375 + ], + [ + 100.84375, + 0.90625 + ], + [ + 100.765625, + 0.953125 + ], + [ + 100.671875, + 0.984375 + ], + [ + 100.5625, + 1 + ], + [ + 100.4375, + 1 + ], + [ + 100.328125, + 0.984375 + ], + [ + 100.234375, + 0.953125 + ], + [ + 100.15625, + 0.90625 + ], + [ + 100.09375, + 0.84375 + ], + [ + 100.046875, + 0.765625 + ], + [ + 100.015625, + 0.671875 + ], + [ + 100, + 0.5625 + ], + [ + 100, + 0.4375 + ], + [ + 100.015625, + 0.328125 + ], + [ + 100.046875, + 0.234375 + ], + [ + 100.09375, + 0.15625 + ], + [ + 100.15625, + 0.09375 + ], + [ + 100.234375, + 0.046875 + ], + [ + 100.328125, + 0.015625 + ], + [ + 100.4375, + 0 + ] + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/out/multipolygonWithHole.geojson b/test/examples/polygonSmooth/out/multipolygonWithHole.geojson new file mode 100644 index 0000000..b93542c --- /dev/null +++ b/test/examples/polygonSmooth/out/multipolygonWithHole.geojson @@ -0,0 +1,420 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 102.4375, + 2 + ], + [ + 102.5625, + 2 + ], + [ + 102.671875, + 2.015625 + ], + [ + 102.765625, + 2.046875 + ], + [ + 102.84375, + 2.09375 + ], + [ + 102.90625, + 2.15625 + ], + [ + 102.953125, + 2.234375 + ], + [ + 102.984375, + 2.328125 + ], + [ + 103, + 2.4375 + ], + [ + 103, + 2.5625 + ], + [ + 102.984375, + 2.671875 + ], + [ + 102.953125, + 2.765625 + ], + [ + 102.90625, + 2.84375 + ], + [ + 102.84375, + 2.90625 + ], + [ + 102.765625, + 2.953125 + ], + [ + 102.671875, + 2.984375 + ], + [ + 102.5625, + 3 + ], + [ + 102.4375, + 3 + ], + [ + 102.328125, + 2.984375 + ], + [ + 102.234375, + 2.953125 + ], + [ + 102.15625, + 2.90625 + ], + [ + 102.09375, + 2.84375 + ], + [ + 102.046875, + 2.765625 + ], + [ + 102.015625, + 2.671875 + ], + [ + 102, + 2.5625 + ], + [ + 102, + 2.4375 + ], + [ + 102.015625, + 2.328125 + ], + [ + 102.046875, + 2.234375 + ], + [ + 102.09375, + 2.15625 + ], + [ + 102.15625, + 2.09375 + ], + [ + 102.234375, + 2.046875 + ], + [ + 102.328125, + 2.015625 + ], + [ + 102.4375, + 2 + ] + ] + ], + [ + [ + [ + 100.4375, + 0 + ], + [ + 100.5625, + 0 + ], + [ + 100.671875, + 0.015625 + ], + [ + 100.765625, + 0.046875 + ], + [ + 100.84375, + 0.09375 + ], + [ + 100.90625, + 0.15625 + ], + [ + 100.953125, + 0.234375 + ], + [ + 100.984375, + 0.328125 + ], + [ + 101, + 0.4375 + ], + [ + 101, + 0.5625 + ], + [ + 100.984375, + 0.671875 + ], + [ + 100.953125, + 0.765625 + ], + [ + 100.90625, + 0.84375 + ], + [ + 100.84375, + 0.90625 + ], + [ + 100.765625, + 0.953125 + ], + [ + 100.671875, + 0.984375 + ], + [ + 100.5625, + 1 + ], + [ + 100.4375, + 1 + ], + [ + 100.328125, + 0.984375 + ], + [ + 100.234375, + 0.953125 + ], + [ + 100.15625, + 0.90625 + ], + [ + 100.09375, + 0.84375 + ], + [ + 100.046875, + 0.765625 + ], + [ + 100.015625, + 0.671875 + ], + [ + 100, + 0.5625 + ], + [ + 100, + 0.4375 + ], + [ + 100.015625, + 0.328125 + ], + [ + 100.046875, + 0.234375 + ], + [ + 100.09375, + 0.15625 + ], + [ + 100.15625, + 0.09375 + ], + [ + 100.234375, + 0.046875 + ], + [ + 100.328125, + 0.015625 + ], + [ + 100.4375, + 0 + ] + ], + [ + [ + 100.46249999999999, + 0.2 + ], + [ + 100.53750000000001, + 0.2 + ], + [ + 100.603125, + 0.20937500000000003 + ], + [ + 100.659375, + 0.22812500000000002 + ], + [ + 100.70625, + 0.25625000000000003 + ], + [ + 100.74374999999999, + 0.29375 + ], + [ + 100.771875, + 0.340625 + ], + [ + 100.79062499999999, + 0.39687500000000003 + ], + [ + 100.8, + 0.4625 + ], + [ + 100.8, + 0.5375000000000001 + ], + [ + 100.79062499999999, + 0.603125 + ], + [ + 100.771875, + 0.6593750000000002 + ], + [ + 100.74374999999999, + 0.7062500000000002 + ], + [ + 100.70625, + 0.7437500000000001 + ], + [ + 100.659375, + 0.7718750000000001 + ], + [ + 100.603125, + 0.7906250000000001 + ], + [ + 100.53750000000001, + 0.8 + ], + [ + 100.46249999999999, + 0.8 + ], + [ + 100.396875, + 0.7906250000000001 + ], + [ + 100.340625, + 0.7718750000000001 + ], + [ + 100.29375, + 0.7437500000000001 + ], + [ + 100.25625000000001, + 0.7062500000000002 + ], + [ + 100.228125, + 0.6593750000000002 + ], + [ + 100.20937500000001, + 0.603125 + ], + [ + 100.2, + 0.5375000000000001 + ], + [ + 100.2, + 0.4625 + ], + [ + 100.20937500000001, + 0.39687500000000003 + ], + [ + 100.228125, + 0.340625 + ], + [ + 100.25625000000001, + 0.29375 + ], + [ + 100.29375, + 0.25625000000000003 + ], + [ + 100.340625, + 0.22812500000000002 + ], + [ + 100.396875, + 0.20937500000000003 + ], + [ + 100.46249999999999, + 0.2 + ] + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/out/polygon.geojson b/test/examples/polygonSmooth/out/polygon.geojson new file mode 100644 index 0000000..04c6ae7 --- /dev/null +++ b/test/examples/polygonSmooth/out/polygon.geojson @@ -0,0 +1,308 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -1.1370849609374996, + 25.073001514233205 + ], + [ + -2.114868164062499, + 24.30490769701263 + ], + [ + -2.885284423828124, + 23.562891404703624 + ], + [ + -3.448333740234374, + 22.84695263730619 + ], + [ + -3.804016113281249, + 22.157091394820334 + ], + [ + -3.952331542968749, + 21.493307677246044 + ], + [ + -3.893280029296874, + 20.85560148458333 + ], + [ + -3.626861572265624, + 20.24397281683219 + ], + [ + -3.153076171874999, + 19.65842167399262 + ], + [ + -2.471923828124999, + 19.09894805606463 + ], + [ + -1.8608093261718746, + 18.675509483772974 + ], + [ + -1.3197326660156246, + 18.388105957117656 + ], + [ + -0.8486938476562498, + 18.236737476098675 + ], + [ + -0.4476928710937499, + 18.22140404071603 + ], + [ + -0.11672973632812494, + 18.342105650969724 + ], + [ + 0.144195556640625, + 18.59884230685976 + ], + [ + 0.3350830078125, + 18.991614008386126 + ], + [ + 0.4559326171875, + 19.520420755548834 + ], + [ + 0.61798095703125, + 19.957409438651194 + ], + [ + 0.82122802734375, + 20.302580057693213 + ], + [ + 1.065673828125, + 20.555932612674884 + ], + [ + 1.351318359375, + 20.71746710359621 + ], + [ + 1.67816162109375, + 20.78718353045719 + ], + [ + 2.04620361328125, + 20.765081893257825 + ], + [ + 2.4554443359375, + 20.651162191998118 + ], + [ + 2.9058837890625, + 20.445424426678063 + ], + [ + 3.30963134765625, + 20.308954111804166 + ], + [ + 3.66668701171875, + 20.241751247376424 + ], + [ + 3.97705078125, + 20.243815833394837 + ], + [ + 4.24072265625, + 20.31514786985941 + ], + [ + 4.45770263671875, + 20.455747356770136 + ], + [ + 4.62799072265625, + 20.66561429412702 + ], + [ + 4.7515869140625, + 20.94474868193006 + ], + [ + 4.8284912109375, + 21.29315052017926 + ], + [ + 4.97955322265625, + 21.63072888151697 + ], + [ + 5.20477294921875, + 21.957483765943184 + ], + [ + 5.504150390625, + 22.273415173457913 + ], + [ + 5.877685546875, + 22.578523104061155 + ], + [ + 6.32537841796875, + 22.872807557752903 + ], + [ + 6.84722900390625, + 23.156268534533158 + ], + [ + 7.4432373046875, + 23.428906034401926 + ], + [ + 8.1134033203125, + 23.690720057359208 + ], + [ + 8.584442138671875, + 23.944616820229413 + ], + [ + 8.856353759765625, + 24.190596323012542 + ], + [ + 8.92913818359375, + 24.428658565708602 + ], + [ + 8.80279541015625, + 24.658803548317586 + ], + [ + 8.477325439453125, + 24.8810312708395 + ], + [ + 7.952728271484375, + 25.09534173327434 + ], + [ + 7.22900390625, + 25.301734935622104 + ], + [ + 6.30615234375, + 25.500210877882797 + ], + [ + 5.546722412109375, + 25.722481775012973 + ], + [ + 4.950714111328125, + 25.968547627012633 + ], + [ + 4.51812744140625, + 26.238408433881773 + ], + [ + 4.24896240234375, + 26.532064195620396 + ], + [ + 4.143218994140625, + 26.849514912228507 + ], + [ + 4.200897216796875, + 27.1907605837061 + ], + [ + 4.4219970703125, + 27.555801210053176 + ], + [ + 4.8065185546875, + 27.944636791269737 + ], + [ + 5.082550048828125, + 28.260739308412003 + ], + [ + 5.250091552734375, + 28.50410876147997 + ], + [ + 5.30914306640625, + 28.674745150473644 + ], + [ + 5.25970458984375, + 28.77264847539302 + ], + [ + 5.101776123046875, + 28.7978187362381 + ], + [ + 4.835357666015625, + 28.750255933008884 + ], + [ + 4.46044921875, + 28.62996006570537 + ], + [ + 3.97705078125, + 28.436931134327562 + ], + [ + 3.431854248046875, + 28.172019092219408 + ], + [ + 2.824859619140625, + 27.835223939380903 + ], + [ + 2.15606689453125, + 27.426545675812058 + ], + [ + 1.4254760742187502, + 26.945984301512862 + ], + [ + 0.6330871582031253, + 26.393539816483322 + ], + [ + -0.2210998535156246, + 25.76921222072344 + ], + [ + -1.1370849609374996, + 25.073001514233205 + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/polygonSmooth/out/withHole.geojson b/test/examples/polygonSmooth/out/withHole.geojson new file mode 100644 index 0000000..bf763d1 --- /dev/null +++ b/test/examples/polygonSmooth/out/withHole.geojson @@ -0,0 +1,282 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 100.4375, + 0 + ], + [ + 100.5625, + 0 + ], + [ + 100.671875, + 0.015625 + ], + [ + 100.765625, + 0.046875 + ], + [ + 100.84375, + 0.09375 + ], + [ + 100.90625, + 0.15625 + ], + [ + 100.953125, + 0.234375 + ], + [ + 100.984375, + 0.328125 + ], + [ + 101, + 0.4375 + ], + [ + 101, + 0.5625 + ], + [ + 100.984375, + 0.671875 + ], + [ + 100.953125, + 0.765625 + ], + [ + 100.90625, + 0.84375 + ], + [ + 100.84375, + 0.90625 + ], + [ + 100.765625, + 0.953125 + ], + [ + 100.671875, + 0.984375 + ], + [ + 100.5625, + 1 + ], + [ + 100.4375, + 1 + ], + [ + 100.328125, + 0.984375 + ], + [ + 100.234375, + 0.953125 + ], + [ + 100.15625, + 0.90625 + ], + [ + 100.09375, + 0.84375 + ], + [ + 100.046875, + 0.765625 + ], + [ + 100.015625, + 0.671875 + ], + [ + 100, + 0.5625 + ], + [ + 100, + 0.4375 + ], + [ + 100.015625, + 0.328125 + ], + [ + 100.046875, + 0.234375 + ], + [ + 100.09375, + 0.15625 + ], + [ + 100.15625, + 0.09375 + ], + [ + 100.234375, + 0.046875 + ], + [ + 100.328125, + 0.015625 + ], + [ + 100.4375, + 0 + ] + ], + [ + [ + 100.46249999999999, + 0.2 + ], + [ + 100.53750000000001, + 0.2 + ], + [ + 100.603125, + 0.20937500000000003 + ], + [ + 100.659375, + 0.22812500000000002 + ], + [ + 100.70625, + 0.25625000000000003 + ], + [ + 100.74374999999999, + 0.29375 + ], + [ + 100.771875, + 0.340625 + ], + [ + 100.79062499999999, + 0.39687500000000003 + ], + [ + 100.8, + 0.4625 + ], + [ + 100.8, + 0.5375000000000001 + ], + [ + 100.79062499999999, + 0.603125 + ], + [ + 100.771875, + 0.6593750000000002 + ], + [ + 100.74374999999999, + 0.7062500000000002 + ], + [ + 100.70625, + 0.7437500000000001 + ], + [ + 100.659375, + 0.7718750000000001 + ], + [ + 100.603125, + 0.7906250000000001 + ], + [ + 100.53750000000001, + 0.8 + ], + [ + 100.46249999999999, + 0.8 + ], + [ + 100.396875, + 0.7906250000000001 + ], + [ + 100.340625, + 0.7718750000000001 + ], + [ + 100.29375, + 0.7437500000000001 + ], + [ + 100.25625000000001, + 0.7062500000000002 + ], + [ + 100.228125, + 0.6593750000000002 + ], + [ + 100.20937500000001, + 0.603125 + ], + [ + 100.2, + 0.5375000000000001 + ], + [ + 100.2, + 0.4625 + ], + [ + 100.20937500000001, + 0.39687500000000003 + ], + [ + 100.228125, + 0.340625 + ], + [ + 100.25625000000001, + 0.29375 + ], + [ + 100.29375, + 0.25625000000000003 + ], + [ + 100.340625, + 0.22812500000000002 + ], + [ + 100.396875, + 0.20937500000000003 + ], + [ + 100.46249999999999, + 0.2 + ] + ] + ] + } + } + ] +} \ No newline at end of file