Skip to content

Commit 0a58cb6

Browse files
authored
Implement circle (#187)
* done * add test * rename library turf_circle
1 parent 9e50c04 commit 0a58cb6

File tree

5 files changed

+214
-0
lines changed

5 files changed

+214
-0
lines changed

lib/circle.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
library turf_circle;
2+
3+
export 'package:geotypes/geotypes.dart';
4+
export 'src/circle.dart';

lib/src/circle.dart

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'package:turf/helpers.dart';
2+
import 'package:turf/invariant.dart';
3+
import 'package:turf/src/booleans/boolean_helper.dart';
4+
import 'destination.dart';
5+
6+
/// Takes a [Point] or a [Feature<Point>] and calculates the circle polygon given a radius in degrees, radians, miles, or kilometers; and steps for precision.
7+
///
8+
/// example:
9+
/// ```dart
10+
/// var properties = { 'foo': 'bar' };
11+
/// var point = Feature(geometry: Point(coordinates: Position.of([-75.343, 39.984])));
12+
/// final polygonCircle = circle(
13+
/// feature.geometry!,
14+
/// radius,
15+
/// steps: 32,
16+
/// unit: Unit.meters,
17+
/// properties: feature.properties,
18+
/// );
19+
/// ```
20+
Feature<Polygon> circle(
21+
GeoJSONObject center,
22+
num radius, {
23+
num? steps,
24+
Unit? unit,
25+
Map<String, dynamic>? properties,
26+
}) {
27+
steps ??= 64;
28+
unit ??= Unit.kilometers;
29+
Point origin;
30+
final geometry = getGeom(center);
31+
if (geometry is Point) {
32+
origin = geometry;
33+
} else {
34+
throw GeometryNotSupported(geometry);
35+
}
36+
properties ??=
37+
center is Feature && center.properties != null ? center.properties : {};
38+
final List<Position> coordinates = [];
39+
for (var i = 0; i < steps; i++) {
40+
final c = destination(origin, radius, (i * -360) / steps, unit).coordinates;
41+
coordinates.add(c);
42+
}
43+
coordinates.add(coordinates[0]);
44+
return Feature<Polygon>(
45+
properties: properties,
46+
geometry: Polygon(coordinates: [coordinates]),
47+
);
48+
}

test/components/circle_test.dart

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import 'dart:convert';
2+
import 'dart:io';
3+
4+
import 'package:test/test.dart';
5+
import 'package:turf/circle.dart';
6+
import 'package:turf/src/truncate.dart';
7+
import 'package:turf_equality/turf_equality.dart';
8+
9+
import '../context/helper.dart';
10+
11+
void main() {
12+
group(
13+
'circle',
14+
() {
15+
test('circle -- add properties', () {
16+
final point = Point(coordinates: Position(0, 0));
17+
final out = circle(point, 10, properties: {'foo': 'bar'});
18+
19+
final isEqual = out.properties?['foo'] == 'bar';
20+
expect(isEqual, true);
21+
});
22+
23+
Directory inDir = Directory('./test/examples/circle/in');
24+
for (var file in inDir.listSync(recursive: true)) {
25+
if (file is File && file.path.endsWith('.geojson')) {
26+
test(
27+
file.path,
28+
() {
29+
final inSource = file.readAsStringSync();
30+
final feature = Feature.fromJson(jsonDecode(inSource));
31+
final properties = feature.properties ?? {};
32+
final radius = properties['radius'] ?? 5;
33+
final steps = properties['steps'] ?? 64;
34+
final unit = properties['units'];
35+
36+
final C = truncate(circle(feature, radius,
37+
properties: {"marker-symbol": "circle"},
38+
steps: steps,
39+
unit: unit)) as Feature<Polygon>;
40+
41+
final results = featureCollection([feature, C]);
42+
43+
Directory outDir = Directory('./test/examples/centroid/out');
44+
for (var file2 in outDir.listSync(recursive: true)) {
45+
if (file2 is File &&
46+
file2.uri.pathSegments.last == file.uri.pathSegments.last) {
47+
var outSource = file2.readAsStringSync();
48+
var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource));
49+
Equality eq = Equality();
50+
expect(eq.compare(results, outGeom), true);
51+
}
52+
}
53+
},
54+
);
55+
}
56+
}
57+
},
58+
);
59+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"type": "Feature",
3+
"properties": {
4+
"radius": 5
5+
},
6+
"geometry": {
7+
"type": "Point",
8+
"coordinates": [-75.343, 39.984]
9+
}
10+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
{
2+
"type": "FeatureCollection",
3+
"features": [
4+
{
5+
"type": "Feature",
6+
"properties": {
7+
"radius": 5
8+
},
9+
"geometry": {
10+
"type": "Point",
11+
"coordinates": [-75.343, 39.984]
12+
}
13+
},
14+
{
15+
"type": "Feature",
16+
"properties": {
17+
"radius": 5
18+
},
19+
"geometry": {
20+
"type": "Polygon",
21+
"coordinates": [
22+
[
23+
[-75.343, 40.028966],
24+
[-75.348756, 40.028749],
25+
[-75.354456, 40.028101],
26+
[-75.360046, 40.027029],
27+
[-75.365472, 40.025541],
28+
[-75.37068, 40.023653],
29+
[-75.375622, 40.021383],
30+
[-75.380248, 40.018753],
31+
[-75.384516, 40.015788],
32+
[-75.388383, 40.012517],
33+
[-75.391813, 40.008972],
34+
[-75.394772, 40.005185],
35+
[-75.397232, 40.001195],
36+
[-75.399169, 39.997039],
37+
[-75.400565, 39.992758],
38+
[-75.401406, 39.988393],
39+
[-75.401685, 39.983985],
40+
[-75.401399, 39.979578],
41+
[-75.40055, 39.975213],
42+
[-75.399148, 39.970934],
43+
[-75.397204, 39.96678],
44+
[-75.39474, 39.962792],
45+
[-75.391777, 39.959008],
46+
[-75.388345, 39.955465],
47+
[-75.384477, 39.952197],
48+
[-75.380211, 39.949235],
49+
[-75.375586, 39.946608],
50+
[-75.370648, 39.94434],
51+
[-75.365444, 39.942455],
52+
[-75.360025, 39.940969],
53+
[-75.354442, 39.939897],
54+
[-75.348748, 39.93925],
55+
[-75.343, 39.939034],
56+
[-75.337252, 39.93925],
57+
[-75.331558, 39.939897],
58+
[-75.325975, 39.940969],
59+
[-75.320556, 39.942455],
60+
[-75.315352, 39.94434],
61+
[-75.310414, 39.946608],
62+
[-75.305789, 39.949235],
63+
[-75.301523, 39.952197],
64+
[-75.297655, 39.955465],
65+
[-75.294223, 39.959008],
66+
[-75.29126, 39.962792],
67+
[-75.288796, 39.96678],
68+
[-75.286852, 39.970934],
69+
[-75.28545, 39.975213],
70+
[-75.284601, 39.979578],
71+
[-75.284315, 39.983985],
72+
[-75.284594, 39.988393],
73+
[-75.285435, 39.992758],
74+
[-75.286831, 39.997039],
75+
[-75.288768, 40.001195],
76+
[-75.291228, 40.005185],
77+
[-75.294187, 40.008972],
78+
[-75.297617, 40.012517],
79+
[-75.301484, 40.015788],
80+
[-75.305752, 40.018753],
81+
[-75.310378, 40.021383],
82+
[-75.31532, 40.023653],
83+
[-75.320528, 40.025541],
84+
[-75.325954, 40.027029],
85+
[-75.331544, 40.028101],
86+
[-75.337244, 40.028749],
87+
[-75.343, 40.028966]
88+
]
89+
]
90+
}
91+
}
92+
]
93+
}

0 commit comments

Comments
 (0)