From ab8852758e8c020f5b0e82c1ac035f079a022f98 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Sun, 21 Nov 2021 14:12:53 +0100 Subject: [PATCH 01/72] initial null-safety implementation --- lib/src/bearing.dart | 4 +- lib/src/destination.dart | 2 +- lib/src/distance.dart | 2 +- lib/src/geojson.dart | 130 ++++++++++++++------------ lib/src/geojson.g.dart | 116 +++++++++++------------ lib/src/helpers.dart | 6 +- lib/src/meta.dart | 4 +- lib/src/midpoint.dart | 2 +- lib/src/nearest_point.dart | 16 ++-- pubspec.yaml | 2 +- test/components/destination_test.dart | 40 ++++---- test/components/meta_test.dart | 24 ++--- test/components/midpoint_test.dart | 8 +- 13 files changed, 181 insertions(+), 175 deletions(-) diff --git a/lib/src/bearing.dart b/lib/src/bearing.dart index 615a260e..c0d41526 100644 --- a/lib/src/bearing.dart +++ b/lib/src/bearing.dart @@ -20,7 +20,7 @@ num bearingRaw(Position start, Position end, {bool calcFinal = false}) { } num bearing(Point start, Point end, {bool calcFinal = false}) => - bearingRaw(start.coordinates, end.coordinates, calcFinal: calcFinal); + bearingRaw(start.coordinates!, end.coordinates!, calcFinal: calcFinal); num calculateFinalBearingRaw(Position start, Position end) { // Swap start & end @@ -29,4 +29,4 @@ num calculateFinalBearingRaw(Position start, Position end) { } num calculateFinalBearing(Point start, Point end) => - calculateFinalBearingRaw(start.coordinates, end.coordinates); + calculateFinalBearingRaw(start.coordinates!, end.coordinates!); diff --git a/lib/src/destination.dart b/lib/src/destination.dart index 78c805cc..445353d6 100644 --- a/lib/src/destination.dart +++ b/lib/src/destination.dart @@ -25,5 +25,5 @@ Position destinationRaw(Position origin, num distance, num bearing, Point destination(Point origin, num distance, num bearing, [Unit unit = Unit.kilometers]) => Point( - coordinates: destinationRaw(origin.coordinates, distance, bearing, unit), + coordinates: destinationRaw(origin.coordinates!, distance, bearing, unit), ); diff --git a/lib/src/distance.dart b/lib/src/distance.dart index bfe11820..3bb48902 100644 --- a/lib/src/distance.dart +++ b/lib/src/distance.dart @@ -15,4 +15,4 @@ num distanceRaw(Position from, Position to, [Unit unit = Unit.kilometers]) { } num distance(Point from, Point to, [Unit unit = Unit.kilometers]) => - distanceRaw(from.coordinates, to.coordinates, unit); + distanceRaw(from.coordinates!, to.coordinates!, unit); diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index 5158afc0..6052b2d6 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -5,6 +5,7 @@ part 'geojson.g.dart'; //TODO assemble multilinestring from linestring //TODO assemble polygon from 3 or more points +// TODO convert to enum with JsonEnum serialization class GeoJSONObjectTypes { static const String point = 'Point'; static const String multiPoint = 'MultiPoint'; @@ -20,7 +21,7 @@ class GeoJSONObjectTypes { abstract class GeoJSONObject { @JsonKey(ignore: true) final String type; - BBox bbox; + BBox? bbox; GeoJSONObject.withType(this.type); Map serialize(Map map) => { 'type': type, @@ -37,15 +38,15 @@ abstract class CoordinateType implements Iterable { CoordinateType(List list) : _items = List.of(list, growable: false); @override - num get first => _items?.first; + num get first => _items.first; @override - num get last => _items?.last; + num get last => _items.last; @override - int get length => _items?.length; + int get length => _items.length; - num operator [](int index) => _items[index]; + num? operator [](int index) => _items[index]; void operator []=(int index, num value) => _items[index] = value; @@ -56,7 +57,7 @@ abstract class CoordinateType implements Iterable { List cast() => _items.cast(); @override - bool contains(Object element) => _items.contains(element); + bool contains(Object? element) => _items.contains(element); @override num elementAt(int index) => _items.elementAt(index); @@ -69,7 +70,7 @@ abstract class CoordinateType implements Iterable { _items.expand(f); @override - num firstWhere(bool Function(num element) test, {num Function() orElse}) => + num firstWhere(bool Function(num element) test, {num Function()? orElse}) => _items.firstWhere(test); @override @@ -95,7 +96,7 @@ abstract class CoordinateType implements Iterable { String join([String separator = '']) => _items.join(separator); @override - num lastWhere(bool Function(num element) test, {num Function() orElse}) => + num lastWhere(bool Function(num element) test, {num Function()? orElse}) => _items.lastWhere(test, orElse: orElse); @override @@ -109,7 +110,7 @@ abstract class CoordinateType implements Iterable { num get single => _items.single; @override - num singleWhere(bool Function(num element) test, {num Function() orElse}) => + num singleWhere(bool Function(num element) test, {num Function()? orElse}) => _items.singleWhere(test, orElse: orElse); @override @@ -159,7 +160,8 @@ abstract class CoordinateType implements Iterable { /// 1. Longitude, 2. Latitude, 3. Altitude (optional) class Position extends CoordinateType { Position(num lng, num lat, [num alt = 0]) : super([lng, lat, alt]); - Position.named({num lat, num lng, num alt = 0}) : super([lng, lat, alt]); + Position.named({required num lat, required num lng, num alt = 0}) + : super([lng, lat, alt]); /// Position.of([, , ]) Position.of(List list) @@ -209,9 +211,14 @@ class BBox extends CoordinateType { num lat2 = 0, num alt2 = 0, ]) : super([lng1, lat1, alt1, lng2, lat2, alt2]); - BBox.named( - {num lat1, num lat2, num lng1, num lng2, num alt1 = 0, num alt2 = 0}) - : super([lng1, lat1, alt1, lng2, lat2, alt2]); + BBox.named({ + required num lat1, + required num lat2, + required num lng1, + required num lng2, + num alt1 = 0, + num alt2 = 0, + }) : super([lng1, lat1, alt1, lng2, lat2, alt2]); /// Position.of([, , ]) BBox.of(List list) : super(list); @@ -232,8 +239,8 @@ class BBox extends CoordinateType { @override BBox toSigned() => BBox.named( - alt1: alt1 ?? 0, - alt2: alt2 ?? 0, + alt1: alt1, + alt2: alt2, lat1: _untilSigned(lat1, 90), lat2: _untilSigned(lat2, 90), lng1: _untilSigned(lng1, 180), @@ -251,7 +258,7 @@ abstract class Geometry extends GeoJSONObject { } abstract class GeometryType extends Geometry { - T coordinates; + T? coordinates; GeometryType.withType(this.coordinates, String type) : super.withType(type); static GeometryType deserialize(Map json) { @@ -276,12 +283,12 @@ abstract class GeometryType extends Geometry { /// Point, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.2 @JsonSerializable(explicitToJson: true) -class Point extends GeometryType { - Point({this.bbox, Position coordinates}) +class Point extends GeometryType { + Point({this.bbox, Position? coordinates}) : super.withType(coordinates, GeoJSONObjectTypes.point); factory Point.fromJson(Map json) => _$PointFromJson(json); @override - BBox bbox; + BBox? bbox; @override bool operator ==(dynamic other) => @@ -297,102 +304,100 @@ class Point extends GeometryType { /// MultiPoint, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.3 @JsonSerializable(explicitToJson: true) -class MultiPoint extends GeometryType> { - MultiPoint({this.bbox, List coordinates = const []}) +class MultiPoint extends GeometryType?> { + MultiPoint({this.bbox, List? coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.multiPoint); factory MultiPoint.fromJson(Map json) => _$MultiPointFromJson(json); @override - BBox bbox; + BBox? bbox; @override Map toJson() => super.serialize(_$MultiPointToJson(this)); @override MultiPoint clone() => MultiPoint( - coordinates: coordinates?.map((e) => e?.clone())?.toList(), + coordinates: coordinates?.map((e) => e.clone()).toList(), bbox: bbox?.clone(), ); } /// LineString, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.4 @JsonSerializable(explicitToJson: true) -class LineString extends GeometryType> { - LineString({this.bbox, List coordinates = const []}) +class LineString extends GeometryType?> { + LineString({this.bbox, List? coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.lineString); factory LineString.fromJson(Map json) => _$LineStringFromJson(json); @override - BBox bbox; + BBox? bbox; @override Map toJson() => super.serialize(_$LineStringToJson(this)); @override LineString clone() => LineString( - coordinates: coordinates?.map((e) => e?.clone())?.toList(), + coordinates: coordinates?.map((e) => e.clone()).toList(), bbox: bbox?.clone()); } /// MultiLineString, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.5 @JsonSerializable(explicitToJson: true) -class MultiLineString extends GeometryType>> { - MultiLineString({this.bbox, List> coordinates = const []}) +class MultiLineString extends GeometryType>?> { + MultiLineString({this.bbox, List>? coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.multiLineString); factory MultiLineString.fromJson(Map json) => _$MultiLineStringFromJson(json); @override - BBox bbox; + BBox? bbox; @override Map toJson() => super.serialize(_$MultiLineStringToJson(this)); @override MultiLineString clone() => MultiLineString( - coordinates: coordinates - ?.map((e) => e?.map((e) => e?.clone())?.toList()) - ?.toList(), + coordinates: + coordinates?.map((e) => e.map((e) => e.clone()).toList()).toList(), bbox: bbox?.clone(), ); } /// Polygon, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.6 @JsonSerializable(explicitToJson: true) -class Polygon extends GeometryType>> { - Polygon({this.bbox, List> coordinates = const []}) +class Polygon extends GeometryType>?> { + Polygon({this.bbox, List>? coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.polygon); factory Polygon.fromJson(Map json) => _$PolygonFromJson(json); @override - BBox bbox; + BBox? bbox; @override Map toJson() => super.serialize(_$PolygonToJson(this)); @override Polygon clone() => Polygon( - coordinates: coordinates - ?.map((e) => e?.map((e) => e?.clone())?.toList()) - ?.toList(), + coordinates: + coordinates?.map((e) => e.map((e) => e.clone()).toList()).toList(), bbox: bbox?.clone(), ); } /// MultiPolygon, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.7 @JsonSerializable(explicitToJson: true) -class MultiPolygon extends GeometryType>>> { - MultiPolygon({this.bbox, List>> coordinates = const []}) +class MultiPolygon extends GeometryType>>?> { + MultiPolygon({this.bbox, List>>? coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.multiPolygon); factory MultiPolygon.fromJson(Map json) => _$MultiPolygonFromJson(json); @override - BBox bbox; + BBox? bbox; @override Map toJson() => super.serialize(_$MultiPolygonToJson(this)); @override GeoJSONObject clone() => MultiPolygon( coordinates: coordinates - ?.map((e) => - e?.map((e) => e?.map((e) => e?.clone())?.toList())?.toList()) - ?.toList(), + ?.map( + (e) => e.map((e) => e.map((e) => e.clone()).toList()).toList()) + .toList(), bbox: bbox?.clone(), ); } @@ -403,8 +408,8 @@ class GeometryCollection extends Geometry { GeometryCollection({this.bbox, this.geometries = const []}) : super.withType(GeoJSONObjectTypes.geometryCollection); @override - BBox bbox; - List geometries; + BBox? bbox; + List? geometries; factory GeometryCollection.fromJson(Map json) => GeometryCollection( geometries: json['geometries'] == null @@ -419,13 +424,14 @@ class GeometryCollection extends Geometry { @override GeoJSONObject clone() => GeometryCollection( - geometries: geometries?.map((e) => e?.clone())?.toList(), + geometries: geometries?.map((e) => e.clone()).toList() + as List>?, bbox: bbox?.clone(), ); } /// Feature, as specified here https://tools.ietf.org/html/rfc7946#section-3.2 -class Feature extends GeoJSONObject { +class Feature extends GeoJSONObject { Feature({ this.bbox, this.id, @@ -434,8 +440,8 @@ class Feature extends GeoJSONObject { this.fields = const {}, }) : super.withType(GeoJSONObjectTypes.feature); dynamic id; - Map properties; - T geometry; + Map? properties; + T? geometry; Map fields; dynamic operator [](String key) { @@ -451,15 +457,15 @@ class Feature extends GeoJSONObject { case 'bbox': return bbox; default: - return fields != null ? fields[key] : null; + return fields[key]; } } @override - BBox bbox; + BBox? bbox; factory Feature.fromJson(Map json) => Feature( id: json['id'], - geometry: Geometry.deserialize(json['geometry']), + geometry: Geometry.deserialize(json['geometry']) as Never?, properties: json['properties'], fields: Map.fromEntries( json.entries.where( @@ -473,18 +479,18 @@ class Feature extends GeoJSONObject { @override Map toJson() => super.serialize({ - if (fields != null) ...fields, 'id': id, - 'geometry': geometry.toJson(), + 'geometry': geometry!.toJson(), 'properties': properties, + ...fields, }); @override Feature clone() => Feature( - geometry: geometry?.clone(), + geometry: geometry?.clone() as T?, bbox: bbox?.clone(), fields: Map.of(fields), - properties: Map.of(properties), + properties: Map.of(properties!), id: id, ); } @@ -494,11 +500,11 @@ class Feature extends GeoJSONObject { class FeatureCollection extends GeoJSONObject { FeatureCollection({this.bbox, this.features = const []}) : super.withType(GeoJSONObjectTypes.featureCollection); - List> features; + List>? features; @override - BBox bbox; + BBox? bbox; factory FeatureCollection.fromJson(Map json) => - _$FeatureCollectionFromJson(json); + _$FeatureCollectionFromJson(json) as FeatureCollection; @override Map toJson() => @@ -506,7 +512,7 @@ class FeatureCollection extends GeoJSONObject { @override FeatureCollection clone() => FeatureCollection( - features: features?.map((e) => e?.clone())?.toList(), + features: features?.map((e) => e.clone()).toList(), bbox: bbox?.clone(), ); } diff --git a/lib/src/geojson.g.dart b/lib/src/geojson.g.dart index fa8c637a..202adbbb 100644 --- a/lib/src/geojson.g.dart +++ b/lib/src/geojson.g.dart @@ -10,11 +10,11 @@ Point _$PointFromJson(Map json) { return Point( bbox: json['bbox'] == null ? null - : BBox.fromJson((json['bbox'] as List)?.map((e) => e as num)?.toList()), + : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), coordinates: json['coordinates'] == null ? null : Position.fromJson( - (json['coordinates'] as List)?.map((e) => e as num)?.toList()), + (json['coordinates'] as List).map((e) => e as num).toList()), ); } @@ -27,18 +27,19 @@ MultiPoint _$MultiPointFromJson(Map json) { return MultiPoint( bbox: json['bbox'] == null ? null - : BBox.fromJson((json['bbox'] as List)?.map((e) => e as num)?.toList()), - coordinates: (json['coordinates'] as List) - ?.map((e) => e == null - ? null - : Position.fromJson((e as List)?.map((e) => e as num)?.toList())) - ?.toList(), + : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), + coordinates: json['coordinates'] == null + ? null + : (json['coordinates'] as List) + .map((e) => + Position.fromJson((e as List).map((e) => e as num).toList())) + .toList(), ); } Map _$MultiPointToJson(MultiPoint instance) => { - 'coordinates': instance.coordinates?.map((e) => e?.toJson())?.toList(), + 'coordinates': instance.coordinates?.map((e) => e.toJson()).toList(), 'bbox': instance.bbox?.toJson(), }; @@ -46,18 +47,19 @@ LineString _$LineStringFromJson(Map json) { return LineString( bbox: json['bbox'] == null ? null - : BBox.fromJson((json['bbox'] as List)?.map((e) => e as num)?.toList()), - coordinates: (json['coordinates'] as List) - ?.map((e) => e == null - ? null - : Position.fromJson((e as List)?.map((e) => e as num)?.toList())) - ?.toList(), + : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), + coordinates: json['coordinates'] == null + ? null + : (json['coordinates'] as List) + .map((e) => + Position.fromJson((e as List).map((e) => e as num).toList())) + .toList(), ); } Map _$LineStringToJson(LineString instance) => { - 'coordinates': instance.coordinates?.map((e) => e?.toJson())?.toList(), + 'coordinates': instance.coordinates?.map((e) => e.toJson()).toList(), 'bbox': instance.bbox?.toJson(), }; @@ -65,23 +67,23 @@ MultiLineString _$MultiLineStringFromJson(Map json) { return MultiLineString( bbox: json['bbox'] == null ? null - : BBox.fromJson((json['bbox'] as List)?.map((e) => e as num)?.toList()), - coordinates: (json['coordinates'] as List) - ?.map((e) => (e as List) - ?.map((e) => e == null - ? null - : Position.fromJson( - (e as List)?.map((e) => e as num)?.toList())) - ?.toList()) - ?.toList(), + : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), + coordinates: json['coordinates'] == null + ? null + : (json['coordinates'] as List) + .map((e) => (e as List) + .map((e) => Position.fromJson( + (e as List).map((e) => e as num).toList())) + .toList()) + .toList(), ); } Map _$MultiLineStringToJson(MultiLineString instance) => { 'coordinates': instance.coordinates - ?.map((e) => e?.map((e) => e?.toJson())?.toList()) - ?.toList(), + ?.map((e) => e.map((e) => e.toJson()).toList()) + .toList(), 'bbox': instance.bbox?.toJson(), }; @@ -89,22 +91,22 @@ Polygon _$PolygonFromJson(Map json) { return Polygon( bbox: json['bbox'] == null ? null - : BBox.fromJson((json['bbox'] as List)?.map((e) => e as num)?.toList()), - coordinates: (json['coordinates'] as List) - ?.map((e) => (e as List) - ?.map((e) => e == null - ? null - : Position.fromJson( - (e as List)?.map((e) => e as num)?.toList())) - ?.toList()) - ?.toList(), + : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), + coordinates: json['coordinates'] == null + ? null + : (json['coordinates'] as List) + .map((e) => (e as List) + .map((e) => Position.fromJson( + (e as List).map((e) => e as num).toList())) + .toList()) + .toList(), ); } Map _$PolygonToJson(Polygon instance) => { 'coordinates': instance.coordinates - ?.map((e) => e?.map((e) => e?.toJson())?.toList()) - ?.toList(), + ?.map((e) => e.map((e) => e.toJson()).toList()) + .toList(), 'bbox': instance.bbox?.toJson(), }; @@ -112,49 +114,47 @@ MultiPolygon _$MultiPolygonFromJson(Map json) { return MultiPolygon( bbox: json['bbox'] == null ? null - : BBox.fromJson((json['bbox'] as List)?.map((e) => e as num)?.toList()), - coordinates: (json['coordinates'] as List) - ?.map((e) => (e as List) - ?.map((e) => (e as List) - ?.map((e) => e == null - ? null - : Position.fromJson( - (e as List)?.map((e) => e as num)?.toList())) - ?.toList()) - ?.toList()) - ?.toList(), + : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), + coordinates: json['coordinates'] == null + ? null + : (json['coordinates'] as List) + .map((e) => (e as List) + .map((e) => (e as List) + .map((e) => Position.fromJson( + (e as List).map((e) => e as num).toList())) + .toList()) + .toList()) + .toList(), ); } Map _$MultiPolygonToJson(MultiPolygon instance) => { 'coordinates': instance.coordinates - ?.map((e) => - e?.map((e) => e?.map((e) => e?.toJson())?.toList())?.toList()) - ?.toList(), + ?.map((e) => e.map((e) => e.map((e) => e.toJson()).toList()).toList()) + .toList(), 'bbox': instance.bbox?.toJson(), }; Map _$GeometryCollectionToJson(GeometryCollection instance) => { 'bbox': instance.bbox?.toJson(), - 'geometries': instance.geometries?.map((e) => e?.toJson())?.toList(), + 'geometries': instance.geometries?.map((e) => e.toJson()).toList(), }; FeatureCollection _$FeatureCollectionFromJson(Map json) { return FeatureCollection( bbox: json['bbox'] == null ? null - : BBox.fromJson((json['bbox'] as List)?.map((e) => e as num)?.toList()), + : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), features: (json['features'] as List) - ?.map((e) => - e == null ? null : Feature.fromJson(e as Map)) - ?.toList(), + .map((e) => Feature.fromJson(e as Map)) + .toList(), ); } Map _$FeatureCollectionToJson(FeatureCollection instance) => { - 'features': instance.features?.map((e) => e?.toJson())?.toList(), + 'features': instance.features?.map((e) => e.toJson()).toList(), 'bbox': instance.bbox?.toJson(), }; diff --git a/lib/src/helpers.dart b/lib/src/helpers.dart index 8ae2ca7c..6c3e0847 100644 --- a/lib/src/helpers.dart +++ b/lib/src/helpers.dart @@ -90,7 +90,7 @@ num radiansToLength(num radians, [Unit unit = Unit.kilometers]) { } num lengthToRadians(num distance, [Unit unit = Unit.kilometers]) { - num factor = factors[unit]; + num? factor = factors[unit]; if (factor == null) { throw Exception("$unit units is invalid"); } @@ -136,12 +136,12 @@ num convertArea(num area, throw Exception("area must be a positive number"); } - num startFactor = areaFactors[originalUnit]; + num? startFactor = areaFactors[originalUnit]; if (startFactor == null) { throw Exception("invalid original units"); } - num finalFactor = areaFactors[finalUnit]; + num? finalFactor = areaFactors[finalUnit]; if (finalFactor == null) { throw Exception("invalid final units"); } diff --git a/lib/src/meta.dart b/lib/src/meta.dart index 96ccb580..05915488 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -1,8 +1,8 @@ import 'geojson.dart'; typedef GeomEachCallback = dynamic Function( - Geometry currentGeometry, - int featureIndex, + Geometry? currentGeometry, + num? featureIndex, Map featureProperties, BBox featureBBox, dynamic featureId, diff --git a/lib/src/midpoint.dart b/lib/src/midpoint.dart index ec6aef1f..405b1115 100644 --- a/lib/src/midpoint.dart +++ b/lib/src/midpoint.dart @@ -12,5 +12,5 @@ Position midpointRaw(Position point1, Position point2) { } Point midpoint(Point point1, Point point2) => Point( - coordinates: midpointRaw(point1.coordinates, point2.coordinates), + coordinates: midpointRaw(point1.coordinates!, point2.coordinates!), ); diff --git a/lib/src/nearest_point.dart b/lib/src/nearest_point.dart index bef40c75..2c470347 100644 --- a/lib/src/nearest_point.dart +++ b/lib/src/nearest_point.dart @@ -1,23 +1,23 @@ import 'distance.dart'; import 'geojson.dart'; -Feature nearestPoint( - Feature targetPoint, FeatureCollection points) { - Feature nearest; +Feature nearestPoint( + Feature targetPoint, FeatureCollection points) { + Feature nearest; num minDist = double.infinity; num bestFeatureIndex = 0; - for (int i = 0; i < points.features.length; i++) { + for (int i = 0; i < points.features!.length; i++) { num distanceToPoint = - distance(targetPoint.geometry, points.features[i].geometry); + distance(targetPoint.geometry!, points.features![i].geometry!); if (distanceToPoint < minDist) { bestFeatureIndex = i; minDist = distanceToPoint; } } - nearest = points.features[bestFeatureIndex].clone(); - nearest.properties['featureIndex'] = bestFeatureIndex; - nearest.properties['distanceToPoint'] = minDist; + nearest = points.features![bestFeatureIndex as int].clone(); + nearest.properties!['featureIndex'] = bestFeatureIndex; + nearest.properties!['distanceToPoint'] = minDist; return nearest; } diff --git a/pubspec.yaml b/pubspec.yaml index 11f5110e..4d416413 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. version: 0.0.2+3 environment: - sdk: '>=2.7.0 <3.0.0' + sdk: '>=2.12.0 <3.0.0' homepage: https://github.com/dartclub/turf_dart repository: https://github.com/dartclub/turf_dart diff --git a/test/components/destination_test.dart b/test/components/destination_test.dart index 257aef65..b2d6be28 100644 --- a/test/components/destination_test.dart +++ b/test/components/destination_test.dart @@ -44,11 +44,11 @@ main() { ), ); Point actualEnd = destination(testStart, testDistance, testBearing); - expect(actualEnd.coordinates.lat.toStringAsFixed(6), - equals(testEnd.coordinates.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lat.toStringAsFixed(6), + equals(testEnd.coordinates!.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates.lng.toStringAsFixed(6), - equals(testEnd.coordinates.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lng.toStringAsFixed(6), + equals(testEnd.coordinates!.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); @@ -68,11 +68,11 @@ main() { ), ); Point actualEnd = destination(testStart, testDistance, testBearing); - expect(actualEnd.coordinates.lat.toStringAsFixed(6), - equals(testEnd.coordinates.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lat.toStringAsFixed(6), + equals(testEnd.coordinates!.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates.lng.toStringAsFixed(6), - equals(testEnd.coordinates.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lng.toStringAsFixed(6), + equals(testEnd.coordinates!.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); @@ -92,11 +92,11 @@ main() { ), ); Point actualEnd = destination(testStart, testDistance, testBearing); - expect(actualEnd.coordinates.lat.toStringAsFixed(6), - equals(testEnd.coordinates.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lat.toStringAsFixed(6), + equals(testEnd.coordinates!.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates.lng.toStringAsFixed(6), - equals(testEnd.coordinates.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lng.toStringAsFixed(6), + equals(testEnd.coordinates!.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); @@ -117,11 +117,11 @@ main() { ); Point actualEnd = destination(testStart, testDistanceKm, testBearing, Unit.kilometers); - expect(actualEnd.coordinates.lat.toStringAsFixed(6), - equals(testEnd.coordinates.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lat.toStringAsFixed(6), + equals(testEnd.coordinates!.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates.lng.toStringAsFixed(6), - equals(testEnd.coordinates.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lng.toStringAsFixed(6), + equals(testEnd.coordinates!.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); @@ -142,11 +142,11 @@ main() { ); Point actualEnd = destination(testStart, testDistanceMiles, testBearing, Unit.miles); - expect(actualEnd.coordinates.lat.toStringAsFixed(6), - equals(testEnd.coordinates.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lat.toStringAsFixed(6), + equals(testEnd.coordinates!.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates.lng.toStringAsFixed(6), - equals(testEnd.coordinates.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates!.lng.toStringAsFixed(6), + equals(testEnd.coordinates!.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); } diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 600a8536..41f5c75c 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -35,9 +35,9 @@ Feature multiline = Feature( Feature geomCollection = Feature( geometry: GeometryCollection( geometries: [ - pt.geometry, - line.geometry, - multiline.geometry, + pt.geometry!, + line.geometry!, + multiline.geometry!, ], ), ); @@ -58,28 +58,28 @@ List featureAndCollection(Geometry geometry) { main() { test('geomEach -- GeometryCollection', () { - featureAndCollection(geomCollection.geometry) + featureAndCollection(geomCollection.geometry!) .forEach((GeoJSONObject input) { List output = []; geomEach(input, (geom, i, props, bbox, id) { - output.add(geom); + output.add(geom!); }); - expect(output, geomCollection.geometry.geometries); + expect(output, geomCollection.geometry!.geometries); }); }); test('geomEach -- bare-GeometryCollection', () { List output = []; geomEach(geomCollection, (geom, i, props, bbox, id) { - output.add(geom); + output.add(geom!); }); - expect(output, geomCollection.geometry.geometries); + expect(output, geomCollection.geometry!.geometries); }); test('geomEach -- bare-pointGeometry', () { List output = []; geomEach(pt.geometry, (geom, i, props, bbox, id) { - output.add(geom); + output.add(geom!); }); expect(output, [pt.geometry]); }); @@ -87,7 +87,7 @@ main() { test('geomEach -- bare-pointFeature', () { List output = []; geomEach(pt, (geom, i, props, bbox, id) { - output.add(geom); + output.add(geom!); }); expect(output, [pt.geometry]); }); @@ -114,8 +114,8 @@ main() { ); geomEach( pt, - (Geometry currentGeometry, - int featureIndex, + (Geometry? currentGeometry, + num? featureIndex, Map featureProperties, BBox featureBBox, dynamic featureId) { diff --git a/test/components/midpoint_test.dart b/test/components/midpoint_test.dart index 6f512498..36e2000e 100644 --- a/test/components/midpoint_test.dart +++ b/test/components/midpoint_test.dart @@ -7,10 +7,10 @@ void checkLatLngInRange(Point result) { _lngRange(num lng) => lng >= -180 && lng <= 180; _latRange(num lat) => lat >= -90 && lat <= 90; - expect(_lngRange(result.coordinates.lng), true, - reason: 'Longitude of ${result.coordinates.lng} out of range'); - expect(_latRange(result.coordinates.lat), true, - reason: 'Latitude of ${result.coordinates.lat} out of range'); + expect(_lngRange(result.coordinates!.lng), true, + reason: 'Longitude of ${result.coordinates!.lng} out of range'); + expect(_latRange(result.coordinates!.lat), true, + reason: 'Latitude of ${result.coordinates!.lat} out of range'); } main() { From 851338fe55e26e27827402fa9e87f135e2982932 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Mon, 22 Nov 2021 18:15:33 +0100 Subject: [PATCH 02/72] attributes non-nullable + tests, fix meta tests --- analysis_options.yaml | 2 +- lib/src/bearing.dart | 4 +- lib/src/destination.dart | 2 +- lib/src/distance.dart | 2 +- lib/src/geojson.dart | 90 ++++++++----- lib/src/geojson.g.dart | 187 +++++++++++--------------- lib/src/meta.dart | 8 +- lib/src/midpoint.dart | 2 +- lib/src/nearest_point.dart | 12 +- test/components/destination_test.dart | 40 +++--- test/components/geojson_test.dart | 83 ++++++++++-- test/components/meta_test.dart | 14 +- test/components/midpoint_test.dart | 8 +- 13 files changed, 251 insertions(+), 203 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 8a679392..d4211ab2 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1 +1 @@ -include: package:dartclub_lint/analysis_options.yaml +include: package:dartclub_lint/dart.yaml diff --git a/lib/src/bearing.dart b/lib/src/bearing.dart index c0d41526..615a260e 100644 --- a/lib/src/bearing.dart +++ b/lib/src/bearing.dart @@ -20,7 +20,7 @@ num bearingRaw(Position start, Position end, {bool calcFinal = false}) { } num bearing(Point start, Point end, {bool calcFinal = false}) => - bearingRaw(start.coordinates!, end.coordinates!, calcFinal: calcFinal); + bearingRaw(start.coordinates, end.coordinates, calcFinal: calcFinal); num calculateFinalBearingRaw(Position start, Position end) { // Swap start & end @@ -29,4 +29,4 @@ num calculateFinalBearingRaw(Position start, Position end) { } num calculateFinalBearing(Point start, Point end) => - calculateFinalBearingRaw(start.coordinates!, end.coordinates!); + calculateFinalBearingRaw(start.coordinates, end.coordinates); diff --git a/lib/src/destination.dart b/lib/src/destination.dart index 445353d6..78c805cc 100644 --- a/lib/src/destination.dart +++ b/lib/src/destination.dart @@ -25,5 +25,5 @@ Position destinationRaw(Position origin, num distance, num bearing, Point destination(Point origin, num distance, num bearing, [Unit unit = Unit.kilometers]) => Point( - coordinates: destinationRaw(origin.coordinates!, distance, bearing, unit), + coordinates: destinationRaw(origin.coordinates, distance, bearing, unit), ); diff --git a/lib/src/distance.dart b/lib/src/distance.dart index 3bb48902..bfe11820 100644 --- a/lib/src/distance.dart +++ b/lib/src/distance.dart @@ -15,4 +15,4 @@ num distanceRaw(Position from, Position to, [Unit unit = Unit.kilometers]) { } num distance(Point from, Point to, [Unit unit = Unit.kilometers]) => - distanceRaw(from.coordinates!, to.coordinates!, unit); + distanceRaw(from.coordinates, to.coordinates, unit); diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index 6052b2d6..81bb518b 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -258,7 +258,7 @@ abstract class Geometry extends GeoJSONObject { } abstract class GeometryType extends Geometry { - T? coordinates; + T coordinates; GeometryType.withType(this.coordinates, String type) : super.withType(type); static GeometryType deserialize(Map json) { @@ -283,8 +283,8 @@ abstract class GeometryType extends Geometry { /// Point, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.2 @JsonSerializable(explicitToJson: true) -class Point extends GeometryType { - Point({this.bbox, Position? coordinates}) +class Point extends GeometryType { + Point({this.bbox, required Position coordinates}) : super.withType(coordinates, GeoJSONObjectTypes.point); factory Point.fromJson(Map json) => _$PointFromJson(json); @override @@ -298,14 +298,13 @@ class Point extends GeometryType { Map toJson() => super.serialize(_$PointToJson(this)); @override - Point clone() => - Point(coordinates: coordinates?.clone(), bbox: bbox?.clone()); + Point clone() => Point(coordinates: coordinates.clone(), bbox: bbox?.clone()); } /// MultiPoint, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.3 @JsonSerializable(explicitToJson: true) -class MultiPoint extends GeometryType?> { - MultiPoint({this.bbox, List? coordinates = const []}) +class MultiPoint extends GeometryType> { + MultiPoint({this.bbox, List coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.multiPoint); factory MultiPoint.fromJson(Map json) => _$MultiPointFromJson(json); @@ -316,15 +315,15 @@ class MultiPoint extends GeometryType?> { @override MultiPoint clone() => MultiPoint( - coordinates: coordinates?.map((e) => e.clone()).toList(), + coordinates: coordinates.map((e) => e.clone()).toList(), bbox: bbox?.clone(), ); } /// LineString, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.4 @JsonSerializable(explicitToJson: true) -class LineString extends GeometryType?> { - LineString({this.bbox, List? coordinates = const []}) +class LineString extends GeometryType> { + LineString({this.bbox, List coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.lineString); factory LineString.fromJson(Map json) => _$LineStringFromJson(json); @@ -335,14 +334,14 @@ class LineString extends GeometryType?> { @override LineString clone() => LineString( - coordinates: coordinates?.map((e) => e.clone()).toList(), + coordinates: coordinates.map((e) => e.clone()).toList(), bbox: bbox?.clone()); } /// MultiLineString, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.5 @JsonSerializable(explicitToJson: true) -class MultiLineString extends GeometryType>?> { - MultiLineString({this.bbox, List>? coordinates = const []}) +class MultiLineString extends GeometryType>> { + MultiLineString({this.bbox, List> coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.multiLineString); factory MultiLineString.fromJson(Map json) => _$MultiLineStringFromJson(json); @@ -355,15 +354,15 @@ class MultiLineString extends GeometryType>?> { @override MultiLineString clone() => MultiLineString( coordinates: - coordinates?.map((e) => e.map((e) => e.clone()).toList()).toList(), + coordinates.map((e) => e.map((e) => e.clone()).toList()).toList(), bbox: bbox?.clone(), ); } /// Polygon, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.6 @JsonSerializable(explicitToJson: true) -class Polygon extends GeometryType>?> { - Polygon({this.bbox, List>? coordinates = const []}) +class Polygon extends GeometryType>> { + Polygon({this.bbox, List> coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.polygon); factory Polygon.fromJson(Map json) => _$PolygonFromJson(json); @@ -375,15 +374,15 @@ class Polygon extends GeometryType>?> { @override Polygon clone() => Polygon( coordinates: - coordinates?.map((e) => e.map((e) => e.clone()).toList()).toList(), + coordinates.map((e) => e.map((e) => e.clone()).toList()).toList(), bbox: bbox?.clone(), ); } /// MultiPolygon, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.7 @JsonSerializable(explicitToJson: true) -class MultiPolygon extends GeometryType>>?> { - MultiPolygon({this.bbox, List>>? coordinates = const []}) +class MultiPolygon extends GeometryType>>> { + MultiPolygon({this.bbox, List>> coordinates = const []}) : super.withType(coordinates, GeoJSONObjectTypes.multiPolygon); factory MultiPolygon.fromJson(Map json) => _$MultiPolygonFromJson(json); @@ -395,8 +394,7 @@ class MultiPolygon extends GeometryType>>?> { @override GeoJSONObject clone() => MultiPolygon( coordinates: coordinates - ?.map( - (e) => e.map((e) => e.map((e) => e.clone()).toList()).toList()) + .map((e) => e.map((e) => e.map((e) => e.clone()).toList()).toList()) .toList(), bbox: bbox?.clone(), ); @@ -409,14 +407,18 @@ class GeometryCollection extends Geometry { : super.withType(GeoJSONObjectTypes.geometryCollection); @override BBox? bbox; - List? geometries; + List geometries; factory GeometryCollection.fromJson(Map json) => GeometryCollection( - geometries: json['geometries'] == null + bbox: json['bbox'] == null ? null - : (json['geometries'] as List) - .map((e) => GeometryType.deserialize(e)) - .toList(), + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList(), + ), + geometries: (json['geometries'] as List?) + ?.map((e) => GeometryType.deserialize(e)) + .toList() ?? + const [], ); @override Map toJson() => @@ -424,14 +426,14 @@ class GeometryCollection extends Geometry { @override GeoJSONObject clone() => GeometryCollection( - geometries: geometries?.map((e) => e.clone()).toList() - as List>?, + geometries: + geometries.map((e) => e.clone()).toList() as List, bbox: bbox?.clone(), ); } /// Feature, as specified here https://tools.ietf.org/html/rfc7946#section-3.2 -class Feature extends GeoJSONObject { +class Feature extends GeoJSONObject { Feature({ this.bbox, this.id, @@ -465,8 +467,14 @@ class Feature extends GeoJSONObject { BBox? bbox; factory Feature.fromJson(Map json) => Feature( id: json['id'], - geometry: Geometry.deserialize(json['geometry']) as Never?, + geometry: json['geometry'] == null + ? null + : Geometry.deserialize(json['geometry']) as Never?, properties: json['properties'], + bbox: json['bbox'] == null + ? null + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList()), fields: Map.fromEntries( json.entries.where( (el) => @@ -496,23 +504,33 @@ class Feature extends GeoJSONObject { } /// FeatureCollection, as specified here https://tools.ietf.org/html/rfc7946#section-3.3 -@JsonSerializable(explicitToJson: true) class FeatureCollection extends GeoJSONObject { FeatureCollection({this.bbox, this.features = const []}) : super.withType(GeoJSONObjectTypes.featureCollection); - List>? features; + List> features; @override BBox? bbox; factory FeatureCollection.fromJson(Map json) => - _$FeatureCollectionFromJson(json) as FeatureCollection; + FeatureCollection( + bbox: json['bbox'] == null + ? null + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList()), + features: (json['features'] as List?) + ?.map((e) => Feature.fromJson(e as Map)) + .toList() ?? + const [], + ); @override - Map toJson() => - super.serialize(_$FeatureCollectionToJson(this)); + Map toJson() => super.serialize({ + 'features': features.map((e) => e.toJson()).toList(), + 'bbox': bbox?.toJson(), + }); @override FeatureCollection clone() => FeatureCollection( - features: features?.map((e) => e.clone()).toList(), + features: features.map((e) => e.clone()).toList(), bbox: bbox?.clone(), ); } diff --git a/lib/src/geojson.g.dart b/lib/src/geojson.g.dart index 202adbbb..c26f0122 100644 --- a/lib/src/geojson.g.dart +++ b/lib/src/geojson.g.dart @@ -6,132 +6,120 @@ part of 'geojson.dart'; // JsonSerializableGenerator // ************************************************************************** -Point _$PointFromJson(Map json) { - return Point( - bbox: json['bbox'] == null - ? null - : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), - coordinates: json['coordinates'] == null - ? null - : Position.fromJson( - (json['coordinates'] as List).map((e) => e as num).toList()), - ); -} +Point _$PointFromJson(Map json) => Point( + bbox: json['bbox'] == null + ? null + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList()), + coordinates: Position.fromJson( + (json['coordinates'] as List).map((e) => e as num).toList()), + ); Map _$PointToJson(Point instance) => { - 'coordinates': instance.coordinates?.toJson(), + 'coordinates': instance.coordinates.toJson(), 'bbox': instance.bbox?.toJson(), }; -MultiPoint _$MultiPointFromJson(Map json) { - return MultiPoint( - bbox: json['bbox'] == null - ? null - : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), - coordinates: json['coordinates'] == null - ? null - : (json['coordinates'] as List) - .map((e) => - Position.fromJson((e as List).map((e) => e as num).toList())) - .toList(), - ); -} +MultiPoint _$MultiPointFromJson(Map json) => MultiPoint( + bbox: json['bbox'] == null + ? null + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList()), + coordinates: (json['coordinates'] as List?) + ?.map((e) => Position.fromJson( + (e as List).map((e) => e as num).toList())) + .toList() ?? + const [], + ); Map _$MultiPointToJson(MultiPoint instance) => { - 'coordinates': instance.coordinates?.map((e) => e.toJson()).toList(), + 'coordinates': instance.coordinates.map((e) => e.toJson()).toList(), 'bbox': instance.bbox?.toJson(), }; -LineString _$LineStringFromJson(Map json) { - return LineString( - bbox: json['bbox'] == null - ? null - : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), - coordinates: json['coordinates'] == null - ? null - : (json['coordinates'] as List) - .map((e) => - Position.fromJson((e as List).map((e) => e as num).toList())) - .toList(), - ); -} +LineString _$LineStringFromJson(Map json) => LineString( + bbox: json['bbox'] == null + ? null + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList()), + coordinates: (json['coordinates'] as List?) + ?.map((e) => Position.fromJson( + (e as List).map((e) => e as num).toList())) + .toList() ?? + const [], + ); Map _$LineStringToJson(LineString instance) => { - 'coordinates': instance.coordinates?.map((e) => e.toJson()).toList(), + 'coordinates': instance.coordinates.map((e) => e.toJson()).toList(), 'bbox': instance.bbox?.toJson(), }; -MultiLineString _$MultiLineStringFromJson(Map json) { - return MultiLineString( - bbox: json['bbox'] == null - ? null - : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), - coordinates: json['coordinates'] == null - ? null - : (json['coordinates'] as List) - .map((e) => (e as List) - .map((e) => Position.fromJson( - (e as List).map((e) => e as num).toList())) - .toList()) - .toList(), - ); -} +MultiLineString _$MultiLineStringFromJson(Map json) => + MultiLineString( + bbox: json['bbox'] == null + ? null + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList()), + coordinates: (json['coordinates'] as List?) + ?.map((e) => (e as List) + .map((e) => Position.fromJson( + (e as List).map((e) => e as num).toList())) + .toList()) + .toList() ?? + const [], + ); Map _$MultiLineStringToJson(MultiLineString instance) => { 'coordinates': instance.coordinates - ?.map((e) => e.map((e) => e.toJson()).toList()) + .map((e) => e.map((e) => e.toJson()).toList()) .toList(), 'bbox': instance.bbox?.toJson(), }; -Polygon _$PolygonFromJson(Map json) { - return Polygon( - bbox: json['bbox'] == null - ? null - : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), - coordinates: json['coordinates'] == null - ? null - : (json['coordinates'] as List) - .map((e) => (e as List) - .map((e) => Position.fromJson( - (e as List).map((e) => e as num).toList())) - .toList()) - .toList(), - ); -} +Polygon _$PolygonFromJson(Map json) => Polygon( + bbox: json['bbox'] == null + ? null + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList()), + coordinates: (json['coordinates'] as List?) + ?.map((e) => (e as List) + .map((e) => Position.fromJson( + (e as List).map((e) => e as num).toList())) + .toList()) + .toList() ?? + const [], + ); Map _$PolygonToJson(Polygon instance) => { 'coordinates': instance.coordinates - ?.map((e) => e.map((e) => e.toJson()).toList()) + .map((e) => e.map((e) => e.toJson()).toList()) .toList(), 'bbox': instance.bbox?.toJson(), }; -MultiPolygon _$MultiPolygonFromJson(Map json) { - return MultiPolygon( - bbox: json['bbox'] == null - ? null - : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), - coordinates: json['coordinates'] == null - ? null - : (json['coordinates'] as List) - .map((e) => (e as List) - .map((e) => (e as List) - .map((e) => Position.fromJson( - (e as List).map((e) => e as num).toList())) - .toList()) - .toList()) - .toList(), - ); -} +MultiPolygon _$MultiPolygonFromJson(Map json) => MultiPolygon( + bbox: json['bbox'] == null + ? null + : BBox.fromJson( + (json['bbox'] as List).map((e) => e as num).toList()), + coordinates: (json['coordinates'] as List?) + ?.map((e) => (e as List) + .map((e) => (e as List) + .map((e) => Position.fromJson( + (e as List).map((e) => e as num).toList())) + .toList()) + .toList()) + .toList() ?? + const [], + ); Map _$MultiPolygonToJson(MultiPolygon instance) => { 'coordinates': instance.coordinates - ?.map((e) => e.map((e) => e.map((e) => e.toJson()).toList()).toList()) + .map((e) => e.map((e) => e.map((e) => e.toJson()).toList()).toList()) .toList(), 'bbox': instance.bbox?.toJson(), }; @@ -139,22 +127,5 @@ Map _$MultiPolygonToJson(MultiPolygon instance) => Map _$GeometryCollectionToJson(GeometryCollection instance) => { 'bbox': instance.bbox?.toJson(), - 'geometries': instance.geometries?.map((e) => e.toJson()).toList(), - }; - -FeatureCollection _$FeatureCollectionFromJson(Map json) { - return FeatureCollection( - bbox: json['bbox'] == null - ? null - : BBox.fromJson((json['bbox'] as List).map((e) => e as num).toList()), - features: (json['features'] as List) - .map((e) => Feature.fromJson(e as Map)) - .toList(), - ); -} - -Map _$FeatureCollectionToJson(FeatureCollection instance) => - { - 'features': instance.features?.map((e) => e.toJson()).toList(), - 'bbox': instance.bbox?.toJson(), + 'geometries': instance.geometries.map((e) => e.toJson()).toList(), }; diff --git a/lib/src/meta.dart b/lib/src/meta.dart index 05915488..82494c67 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -4,7 +4,7 @@ typedef GeomEachCallback = dynamic Function( Geometry? currentGeometry, num? featureIndex, Map featureProperties, - BBox featureBBox, + BBox? featureBBox, dynamic featureId, ); @@ -27,12 +27,12 @@ typedef GeomEachCallback = dynamic Function( /// ``` void geomEach(dynamic geoJSON, GeomEachCallback callback) { dynamic geometry; - var stopG; + int stopG; dynamic geometryMaybeCollection; bool isGeometryCollection; Map featureProperties; - BBox featureBBox; - var featureId; + BBox? featureBBox; + dynamic featureId; num featureIndex = 0; bool isFeatureCollection = geoJSON.type == GeoJSONObjectTypes.featureCollection; diff --git a/lib/src/midpoint.dart b/lib/src/midpoint.dart index 405b1115..ec6aef1f 100644 --- a/lib/src/midpoint.dart +++ b/lib/src/midpoint.dart @@ -12,5 +12,5 @@ Position midpointRaw(Position point1, Position point2) { } Point midpoint(Point point1, Point point2) => Point( - coordinates: midpointRaw(point1.coordinates!, point2.coordinates!), + coordinates: midpointRaw(point1.coordinates, point2.coordinates), ); diff --git a/lib/src/nearest_point.dart b/lib/src/nearest_point.dart index 2c470347..00e94288 100644 --- a/lib/src/nearest_point.dart +++ b/lib/src/nearest_point.dart @@ -1,22 +1,22 @@ import 'distance.dart'; import 'geojson.dart'; -Feature nearestPoint( - Feature targetPoint, FeatureCollection points) { - Feature nearest; +Feature nearestPoint( + Feature targetPoint, FeatureCollection points) { + Feature nearest; num minDist = double.infinity; num bestFeatureIndex = 0; - for (int i = 0; i < points.features!.length; i++) { + for (int i = 0; i < points.features.length; i++) { num distanceToPoint = - distance(targetPoint.geometry!, points.features![i].geometry!); + distance(targetPoint.geometry!, points.features[i].geometry!); if (distanceToPoint < minDist) { bestFeatureIndex = i; minDist = distanceToPoint; } } - nearest = points.features![bestFeatureIndex as int].clone(); + nearest = points.features[bestFeatureIndex as int].clone(); nearest.properties!['featureIndex'] = bestFeatureIndex; nearest.properties!['distanceToPoint'] = minDist; return nearest; diff --git a/test/components/destination_test.dart b/test/components/destination_test.dart index b2d6be28..257aef65 100644 --- a/test/components/destination_test.dart +++ b/test/components/destination_test.dart @@ -44,11 +44,11 @@ main() { ), ); Point actualEnd = destination(testStart, testDistance, testBearing); - expect(actualEnd.coordinates!.lat.toStringAsFixed(6), - equals(testEnd.coordinates!.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates.lat.toStringAsFixed(6), + equals(testEnd.coordinates.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates!.lng.toStringAsFixed(6), - equals(testEnd.coordinates!.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates.lng.toStringAsFixed(6), + equals(testEnd.coordinates.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); @@ -68,11 +68,11 @@ main() { ), ); Point actualEnd = destination(testStart, testDistance, testBearing); - expect(actualEnd.coordinates!.lat.toStringAsFixed(6), - equals(testEnd.coordinates!.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates.lat.toStringAsFixed(6), + equals(testEnd.coordinates.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates!.lng.toStringAsFixed(6), - equals(testEnd.coordinates!.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates.lng.toStringAsFixed(6), + equals(testEnd.coordinates.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); @@ -92,11 +92,11 @@ main() { ), ); Point actualEnd = destination(testStart, testDistance, testBearing); - expect(actualEnd.coordinates!.lat.toStringAsFixed(6), - equals(testEnd.coordinates!.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates.lat.toStringAsFixed(6), + equals(testEnd.coordinates.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates!.lng.toStringAsFixed(6), - equals(testEnd.coordinates!.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates.lng.toStringAsFixed(6), + equals(testEnd.coordinates.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); @@ -117,11 +117,11 @@ main() { ); Point actualEnd = destination(testStart, testDistanceKm, testBearing, Unit.kilometers); - expect(actualEnd.coordinates!.lat.toStringAsFixed(6), - equals(testEnd.coordinates!.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates.lat.toStringAsFixed(6), + equals(testEnd.coordinates.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates!.lng.toStringAsFixed(6), - equals(testEnd.coordinates!.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates.lng.toStringAsFixed(6), + equals(testEnd.coordinates.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); @@ -142,11 +142,11 @@ main() { ); Point actualEnd = destination(testStart, testDistanceMiles, testBearing, Unit.miles); - expect(actualEnd.coordinates!.lat.toStringAsFixed(6), - equals(testEnd.coordinates!.lat.toStringAsFixed(6)), + expect(actualEnd.coordinates.lat.toStringAsFixed(6), + equals(testEnd.coordinates.lat.toStringAsFixed(6)), reason: 'Destination latitude is incorrect'); - expect(actualEnd.coordinates!.lng.toStringAsFixed(6), - equals(testEnd.coordinates!.lng.toStringAsFixed(6)), + expect(actualEnd.coordinates.lng.toStringAsFixed(6), + equals(testEnd.coordinates.lng.toStringAsFixed(6)), reason: 'Destination longitude is incorrect'); }); } diff --git a/test/components/geojson_test.dart b/test/components/geojson_test.dart index 35b62bc3..179edd40 100644 --- a/test/components/geojson_test.dart +++ b/test/components/geojson_test.dart @@ -5,7 +5,7 @@ import 'package:turf/distance.dart'; import 'package:turf/helpers.dart'; main() { - group('GeoJSON Objects', () { + group('Coordinate Types:', () { test('Position', () { _expectArgs(Position pos) { expect(pos.lng, 1); @@ -53,7 +53,7 @@ main() { _expectArgs(bbox2); }); }); - group('Longitude normalization', () { + group('Longitude normalization:', () { var rand = Random(); _rand() => rand.nextDouble() * (360 * 2) - 360; test('Position.toSigned', () { @@ -108,15 +108,74 @@ main() { ); } }); - test('Point', () {}); - test('Point', () {}); - test('MultiPoint', () {}); - test('LineString', () {}); - test('MultiLineString', () {}); - test('Polygon', () {}); - test('MultiPolygon', () {}); - test('GeometryCollection', () {}); - test('Feature', () {}); - test('FeatureCollection', () {}); + }); + + group('Test Geometry Types:', () { + test('Point', () { + var geoJSON = { + 'coordinates': null, + 'type': GeoJSONObjectTypes.point, + }; + expect(() => Point.fromJson(geoJSON), throwsA(isA())); + }); + + var geometries = [ + GeoJSONObjectTypes.multiPoint, + GeoJSONObjectTypes.lineString, + GeoJSONObjectTypes.multiLineString, + GeoJSONObjectTypes.polygon, + GeoJSONObjectTypes.multiPolygon, + ]; + + var collection = GeometryCollection.fromJson({ + 'type': GeoJSONObjectTypes.geometryCollection, + 'geometries': geometries + .map((type) => { + 'coordinates': null, + 'type': type, + }) + .toList(), + }); + for (var i = 0; i < geometries.length; i++) { + test(geometries[i], () { + expect(geometries[i], collection.geometries[i].type); + expect(collection.geometries[i].coordinates, + isNotNull); // kind of unnecessary + expect(collection.geometries[i].coordinates, isA()); + expect(collection.geometries[i].coordinates, isEmpty); + }); + } + }); + test('GeometryCollection', () { + var geoJSON = { + 'type': GeoJSONObjectTypes.geometryCollection, + 'geometries': null, + }; + var collection = GeometryCollection.fromJson(geoJSON); + expect(collection.type, GeoJSONObjectTypes.geometryCollection); + expect(collection.geometries, isNotNull); // kind of unnecessary + expect(collection.geometries, isA()); + expect(collection.geometries, isEmpty); + }); + test('Feature', () { + var geoJSON = { + 'type': GeoJSONObjectTypes.feature, + 'geometry': null, + }; + var feature = Feature.fromJson(geoJSON); + expect(feature.type, GeoJSONObjectTypes.feature); + expect(feature.id, isNull); // kind of unnecessary + expect(feature.geometry, isNull); + }); + test('GeometryCollection', () { + var geoJSON = { + 'type': GeoJSONObjectTypes.featureCollection, + 'features': null, + }; + var collection = FeatureCollection.fromJson(geoJSON); + expect(collection.type, GeoJSONObjectTypes.featureCollection); + expect(collection.features, isNotNull); // kind of unnecessary + expect(collection.features, isA()); + expect(collection.features, isEmpty); }); } diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 41f5c75c..d785bb85 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -117,7 +117,7 @@ main() { (Geometry? currentGeometry, num? featureIndex, Map featureProperties, - BBox featureBBox, + BBox? featureBBox, dynamic featureId) { expect(featureIndex, 0, reason: 'featureIndex'); expect(featureProperties, properties, reason: 'featureProperties'); @@ -174,10 +174,10 @@ main() { // FeatureCollection var count = 0; func(lines, ( - Geometry currentGeometry, - int featureIndex, + Geometry? currentGeometry, + num? featureIndex, Map featureProperties, - BBox featureBBox, + BBox? featureBBox, dynamic featureId, ) { count += 1; @@ -187,10 +187,10 @@ main() { // Multi Geometry var multiCount = 0; func(multiLine, ( - Geometry currentGeometry, - int featureIndex, + Geometry? currentGeometry, + num? featureIndex, Map featureProperties, - BBox featureBBox, + BBox? featureBBox, dynamic featureId, ) { multiCount += 1; diff --git a/test/components/midpoint_test.dart b/test/components/midpoint_test.dart index 36e2000e..6f512498 100644 --- a/test/components/midpoint_test.dart +++ b/test/components/midpoint_test.dart @@ -7,10 +7,10 @@ void checkLatLngInRange(Point result) { _lngRange(num lng) => lng >= -180 && lng <= 180; _latRange(num lat) => lat >= -90 && lat <= 90; - expect(_lngRange(result.coordinates!.lng), true, - reason: 'Longitude of ${result.coordinates!.lng} out of range'); - expect(_latRange(result.coordinates!.lat), true, - reason: 'Latitude of ${result.coordinates!.lat} out of range'); + expect(_lngRange(result.coordinates.lng), true, + reason: 'Longitude of ${result.coordinates.lng} out of range'); + expect(_latRange(result.coordinates.lat), true, + reason: 'Latitude of ${result.coordinates.lat} out of range'); } main() { From 31f9e213fcc9f33a4170ef2e380a9a49dc04907f Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Mon, 22 Nov 2021 19:56:47 +0100 Subject: [PATCH 03/72] make altitude for Position and BBox nullable --- lib/src/geojson.dart | 70 +++++++++++++++++++++---------- test/components/geojson_test.dart | 32 +++++++++++++- 2 files changed, 77 insertions(+), 25 deletions(-) diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index 81bb518b..bc5cdb25 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -159,18 +159,23 @@ abstract class CoordinateType implements Iterable { /// Please make sure, you arrange your parameters like this: /// 1. Longitude, 2. Latitude, 3. Altitude (optional) class Position extends CoordinateType { - Position(num lng, num lat, [num alt = 0]) : super([lng, lat, alt]); - Position.named({required num lat, required num lng, num alt = 0}) - : super([lng, lat, alt]); + Position(num lng, num lat, [num? alt]) + : super([ + lng, + lat, + if (alt != null) alt, + ]); + Position.named({required num lat, required num lng, num? alt}) + : super([ + lng, + lat, + if (alt != null) alt, + ]); /// Position.of([, , ]) Position.of(List list) - : super(list.length < 3 - ? [ - ...list, - ...List.generate(3 - list.length, (val) => 0).toList(), - ] - : list); + : assert(list.length >= 2 && list.length <= 3), + super(list); factory Position.fromJson(List list) => Position.of(list); // TODO implement override operators +, -, * with vector operations @@ -182,7 +187,7 @@ class Position extends CoordinateType { num get lng => _items[0]; num get lat => _items[1]; - num get alt => _items[2]; + num? get alt => length == 3 ? _items[2] : null; @override bool get isSigned => lng <= 180 && lat <= 90; @@ -208,28 +213,47 @@ class BBox extends CoordinateType { num lat1, num alt1, num lng2, [ - num lat2 = 0, - num alt2 = 0, - ]) : super([lng1, lat1, alt1, lng2, lat2, alt2]); + num? lat2, + num? alt2, + ]) : super([ + lng1, + lat1, + alt1, + lng2, + if (lat2 != null) lat2, + if (alt2 != null) alt2, + ]); + BBox.named({ - required num lat1, - required num lat2, required num lng1, + required num lat1, + num? alt1, required num lng2, - num alt1 = 0, - num alt2 = 0, - }) : super([lng1, lat1, alt1, lng2, lat2, alt2]); + required num lat2, + num? alt2, + }) : super([ + lng1, + lat1, + if (alt1 != null) alt1, + lng2, + lat2, + if (alt2 != null) alt2, + ]); /// Position.of([, , ]) - BBox.of(List list) : super(list); + BBox.of(List list) + : assert(list.length == 4 || list.length == 6), + super(list); factory BBox.fromJson(List list) => BBox.of(list); + bool get _is3D => length == 6; + num get lng1 => _items[0]; num get lat1 => _items[1]; - num get alt1 => _items[2]; - num get lng2 => _items[3]; - num get lat2 => _items[4]; - num get alt2 => _items[5]; + num? get alt1 => _is3D ? _items[2] : null; + num get lng2 => _items[_is3D ? 3 : 2]; + num get lat2 => _items[_is3D ? 4 : 3]; + num? get alt2 => _is3D ? _items[5] : null; @override BBox clone() => BBox.of(_items); diff --git a/test/components/geojson_test.dart b/test/components/geojson_test.dart index 179edd40..248fa7f1 100644 --- a/test/components/geojson_test.dart +++ b/test/components/geojson_test.dart @@ -24,9 +24,13 @@ main() { _expectArgs(pos2); }); test('Position deserialization', () { - expect(Position.of([1]).toList(), [1, 0, 0]); - expect(Position.of([1, 2]).toList(), [1, 2, 0]); + expect(Position.of([1, 2]).toList(), [1, 2]); expect(Position.of([1, 2, 3]).toList(), [1, 2, 3]); + + // test assert length >= 2 && length <= 3 + expect(() => Position.of([1]).toList(), throwsA(isA())); + expect(() => Position.of([1, 2, 3, 4]).toList(), + throwsA(isA())); }); test('BBox', () { _expectArgs(BBox bbox) { @@ -51,6 +55,30 @@ main() { var bbox2 = BBox.of([1, 2, 3, 4, 5, 6]); _expectArgs(bbox1); _expectArgs(bbox2); + + // test assert length == 4 || length == 6 + expect(() => BBox.of([1, 2, 3]).toList(), throwsA(isA())); + expect(() => BBox.of([1, 2, 3, 4, 5]).toList(), + throwsA(isA())); + expect(() => BBox.of([1, 2, 3, 4, 5, 6, 7]).toList(), + throwsA(isA())); + + // test 4 dimensional + var bbox3 = BBox.named(lng1: 1, lat1: 2, lng2: 3, lat2: 4); + expect(bbox3.lng1, 1); + expect(bbox3.lat1, 2); + expect(bbox3.alt1, null); + expect(bbox3.lng2, 3); + expect(bbox3.lat2, 4); + expect(bbox3.alt2, null); + expect(bbox3[0], 1); + expect(bbox3[1], 2); + expect(bbox3[2], 3); + expect(bbox3[3], 4); + expect(() => bbox3[4], throwsRangeError); + expect(() => bbox3[5], throwsRangeError); + expect(bbox3.length, 4); + expect(bbox3.toJson(), [1, 2, 3, 4]); }); }); group('Longitude normalization:', () { From d7a630beb918603caf44763bc0220c19f725fe89 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Mon, 22 Nov 2021 23:58:39 +0100 Subject: [PATCH 04/72] update action deps, build runner --- .github/workflows/dart-pub-publish-on-pr.yml | 21 ++++++++----- .github/workflows/dart-pub-publish.yml | 18 ++++++++---- .github/workflows/dart-unit-tests.yml | 31 ++++++++++---------- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/.github/workflows/dart-pub-publish-on-pr.yml b/.github/workflows/dart-pub-publish-on-pr.yml index d111476b..d2c400bd 100644 --- a/.github/workflows/dart-pub-publish-on-pr.yml +++ b/.github/workflows/dart-pub-publish-on-pr.yml @@ -1,15 +1,18 @@ -name: dart pub publish --dry-run, Publishing Preview for PRs +name: Dart pub publish --dry-run, Publishing Preview for PRs on: pull_request: branches: - releases jobs: - build: + preview-publish: runs-on: ubuntu-latest - container: - image: google/dart:latest + steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 + + - uses: dart-lang/setup-dart@v1 + with: + sdk: stable - name: Print Dart SDK version run: dart --version @@ -20,11 +23,13 @@ jobs: - name: Verify formatting run: dart format --output=none --set-exit-if-changed . - # Consider passing '--fatal-infos' for slightly stricter analysis. - name: Analyze project source run: dart analyze - # Run always if: always() - - name: Publish package (dry-run) + - name: Run build_runner + run: dart run build_runner build + if: always() + + - name: Preview publish package (dry-run) run: dart pub publish --dry-run diff --git a/.github/workflows/dart-pub-publish.yml b/.github/workflows/dart-pub-publish.yml index 94a74208..0196bc13 100644 --- a/.github/workflows/dart-pub-publish.yml +++ b/.github/workflows/dart-pub-publish.yml @@ -4,12 +4,15 @@ on: branches: - releases jobs: - build: + publish: runs-on: ubuntu-latest - container: - image: google/dart:latest + steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 + + - uses: dart-lang/setup-dart@v1 + with: + sdk: stable - name: Print Dart SDK version run: dart --version @@ -20,10 +23,12 @@ jobs: - name: Verify formatting run: dart format --output=none --set-exit-if-changed . - # Consider passing '--fatal-infos' for slightly stricter analysis. - name: Analyze project source run: dart analyze - # Run always + if: always() + + - name: Run build_runner + run: dart run build_runner build if: always() - name: Setup credentials @@ -45,3 +50,4 @@ jobs: - name: Publish package run: dart pub publish --force + if: always() diff --git a/.github/workflows/dart-unit-tests.yml b/.github/workflows/dart-unit-tests.yml index dee04132..d9bc25c1 100644 --- a/.github/workflows/dart-unit-tests.yml +++ b/.github/workflows/dart-unit-tests.yml @@ -7,19 +7,20 @@ on: branches: ["**"] jobs: - build: - runs-on: ubuntu-latest - - # Note that this workflow uses the latest stable version of the Dart SDK. - # Docker images for other release channels - like dev and beta - are also - # available. See https://hub.docker.com/r/google/dart/ for the available - # images. - container: - image: google/dart:latest - + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + sdk: [stable, beta, dev] steps: - uses: actions/checkout@v2 + - uses: dart-lang/setup-dart@v1 + with: + sdk: ${{ matrix.sdk }} + - name: Print Dart SDK version run: dart --version @@ -29,16 +30,14 @@ jobs: - name: Verify formatting run: dart format --output=none --set-exit-if-changed . - # Consider passing '--fatal-infos' for slightly stricter analysis. - name: Analyze project source run: dart analyze - # Run always + if: always() + + - name: Run build_runner + run: dart run build_runner build if: always() - # Your project will need to have tests in test/ and a dependency on - # package:test for this step to succeed. Note that Flutter projects will - # want to change this to 'flutter test'. - name: Run tests run: dart test - # Run always if: always() From b23f3f10bc413c5116b9c0082e96c7344ad1187e Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 23 Nov 2021 10:42:44 +0100 Subject: [PATCH 05/72] delete conflicting outputs, dart test on PR action --- .github/workflows/dart-pub-publish-on-pr.yml | 2 +- .github/workflows/dart-pub-publish.yml | 2 +- .github/workflows/dart-unit-tests-on-pr.yml | 36 ++++++++++++++++++++ .github/workflows/dart-unit-tests.yml | 6 ++-- 4 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/dart-unit-tests-on-pr.yml diff --git a/.github/workflows/dart-pub-publish-on-pr.yml b/.github/workflows/dart-pub-publish-on-pr.yml index d2c400bd..8a112eed 100644 --- a/.github/workflows/dart-pub-publish-on-pr.yml +++ b/.github/workflows/dart-pub-publish-on-pr.yml @@ -28,7 +28,7 @@ jobs: if: always() - name: Run build_runner - run: dart run build_runner build + run: dart run build_runner build --delete-conflicting-outputs if: always() - name: Preview publish package (dry-run) diff --git a/.github/workflows/dart-pub-publish.yml b/.github/workflows/dart-pub-publish.yml index 0196bc13..6bd5db7f 100644 --- a/.github/workflows/dart-pub-publish.yml +++ b/.github/workflows/dart-pub-publish.yml @@ -28,7 +28,7 @@ jobs: if: always() - name: Run build_runner - run: dart run build_runner build + run: dart run build_runner build --delete-conflicting-outputs if: always() - name: Setup credentials diff --git a/.github/workflows/dart-unit-tests-on-pr.yml b/.github/workflows/dart-unit-tests-on-pr.yml new file mode 100644 index 00000000..5d0148f0 --- /dev/null +++ b/.github/workflows/dart-unit-tests-on-pr.yml @@ -0,0 +1,36 @@ +name: Dart Unit Tests for PRs + +on: + pull_request: + branches: ["**"] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: dart-lang/setup-dart@v1 + with: + sdk: stable + + - name: Print Dart SDK version + run: dart --version + + - name: Install dependencies + run: dart pub get + + - name: Verify formatting + run: dart format --output=none --set-exit-if-changed . + + - name: Analyze project source + run: dart analyze + if: always() + + - name: Run build_runner + run: dart run build_runner build --delete-conflicting-outputs + if: always() + + - name: Run tests + run: dart test + if: always() diff --git a/.github/workflows/dart-unit-tests.yml b/.github/workflows/dart-unit-tests.yml index d9bc25c1..29045f94 100644 --- a/.github/workflows/dart-unit-tests.yml +++ b/.github/workflows/dart-unit-tests.yml @@ -3,8 +3,6 @@ name: Dart Unit Tests on: push: branches: [main] - pull_request: - branches: ["**"] jobs: test: @@ -13,7 +11,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - sdk: [stable, beta, dev] + sdk: [stable] steps: - uses: actions/checkout@v2 @@ -35,7 +33,7 @@ jobs: if: always() - name: Run build_runner - run: dart run build_runner build + run: dart run build_runner build --delete-conflicting-outputs if: always() - name: Run tests From 95631be7c815fed1e86cfac250c309d3719099c9 Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Mon, 22 Nov 2021 08:42:29 +0100 Subject: [PATCH 06/72] Strongly type and refactor geomEach meta function This commit also renames Geometry to GeometryObject --- lib/src/geojson.dart | 16 +-- lib/src/meta.dart | 193 +++++++++++++++++---------------- test/components/meta_test.dart | 24 ++-- 3 files changed, 122 insertions(+), 111 deletions(-) diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index bc5cdb25..317e1808 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -272,16 +272,16 @@ class BBox extends CoordinateType { ); } -abstract class Geometry extends GeoJSONObject { - Geometry.withType(String type) : super.withType(type); - static Geometry deserialize(Map json) { +abstract class GeometryObject extends GeoJSONObject { + GeometryObject.withType(String type) : super.withType(type); + static GeometryObject deserialize(Map json) { return json['type'] == GeoJSONObjectTypes.geometryCollection ? GeometryCollection.fromJson(json) : GeometryType.deserialize(json); } } -abstract class GeometryType extends Geometry { +abstract class GeometryType extends GeometryObject { T coordinates; GeometryType.withType(this.coordinates, String type) : super.withType(type); @@ -426,7 +426,7 @@ class MultiPolygon extends GeometryType>>> { /// GeometryCollection, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.8 @JsonSerializable(explicitToJson: true, createFactory: false) -class GeometryCollection extends Geometry { +class GeometryCollection extends GeometryObject { GeometryCollection({this.bbox, this.geometries = const []}) : super.withType(GeoJSONObjectTypes.geometryCollection); @override @@ -457,7 +457,7 @@ class GeometryCollection extends Geometry { } /// Feature, as specified here https://tools.ietf.org/html/rfc7946#section-3.2 -class Feature extends GeoJSONObject { +class Feature extends GeoJSONObject { Feature({ this.bbox, this.id, @@ -493,7 +493,7 @@ class Feature extends GeoJSONObject { id: json['id'], geometry: json['geometry'] == null ? null - : Geometry.deserialize(json['geometry']) as Never?, + : GeometryObject.deserialize(json['geometry']) as Never?, properties: json['properties'], bbox: json['bbox'] == null ? null @@ -528,7 +528,7 @@ class Feature extends GeoJSONObject { } /// FeatureCollection, as specified here https://tools.ietf.org/html/rfc7946#section-3.3 -class FeatureCollection extends GeoJSONObject { +class FeatureCollection extends GeoJSONObject { FeatureCollection({this.bbox, this.features = const []}) : super.withType(GeoJSONObjectTypes.featureCollection); List> features; diff --git a/lib/src/meta.dart b/lib/src/meta.dart index 82494c67..fd403cde 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -1,13 +1,19 @@ import 'geojson.dart'; typedef GeomEachCallback = dynamic Function( - Geometry? currentGeometry, - num? featureIndex, + GeometryObject? currentGeometry, + int? featureIndex, Map featureProperties, BBox? featureBBox, dynamic featureId, ); +/// A simple class to manage short circuiting from *Each functions while still +/// allowing an Exception to be thrown and raised +class _ShortCircuit { + _ShortCircuit(); +} + /// Iterate over each geometry in [geoJSON], calling [callback] on each /// iteration. Similar to Array.forEach() /// @@ -25,104 +31,109 @@ typedef GeomEachCallback = dynamic Function( /// someOperationOnEachPoint(currentGeometry); /// }); /// ``` -void geomEach(dynamic geoJSON, GeomEachCallback callback) { - dynamic geometry; - int stopG; - dynamic geometryMaybeCollection; - bool isGeometryCollection; - Map featureProperties; - BBox? featureBBox; - dynamic featureId; - num featureIndex = 0; - bool isFeatureCollection = - geoJSON.type == GeoJSONObjectTypes.featureCollection; - bool isFeature = geoJSON.type == GeoJSONObjectTypes.feature; - var stop = isFeatureCollection ? geoJSON.features.length : 1; - // This logic may look a little weird. The reason why it is that way - // is because it's trying to be fast. GeoJSON supports multiple kinds - // of objects at its root: FeatureCollection, Features, Geometries. - // This function has the responsibility of handling all of them, and that - // means that some of the `for` loops you see below actually just don't apply - // to certain inputs. For instance, if you give this just a - // Point geometry, then both loops are short-circuited and all we do - // is gradually rename the input until it's called 'geometry'. - // - // This also aims to allocate as few resources as possible: just a - // few numbers and booleans, rather than any temporary arrays as would - // be required with the normalization approach. - for (var i = 0; i < stop; i++) { - geometryMaybeCollection = (isFeatureCollection - ? geoJSON.features[i].geometry - : (isFeature ? geoJSON.geometry : geoJSON)); - featureProperties = (isFeatureCollection - ? geoJSON.features[i].properties - : (isFeature ? geoJSON.properties : {})); - featureBBox = (isFeatureCollection - ? geoJSON.features[i].bbox - : (isFeature ? geoJSON.bbox : null)); - featureId = (isFeatureCollection - ? geoJSON.features[i].id - : (isFeature ? geoJSON.id : null)); - isGeometryCollection = (geometryMaybeCollection != null) - ? geometryMaybeCollection.type == GeoJSONObjectTypes.geometryCollection - : false; - stopG = - isGeometryCollection ? geometryMaybeCollection.geometries.length : 1; +void geomEach(GeoJSONObject geoJSON, GeomEachCallback callback) { + try { + if (geoJSON is FeatureCollection) { + _forEachGeomInFeatureCollection(geoJSON, callback); + } else if (geoJSON is Feature) { + _forEachGeomInFeature(geoJSON, callback, 0); + } else if (geoJSON is GeometryObject) { + _forEachGeomInGeometryObject(geoJSON, callback, {}, null, null, 0); + } else { + throw Exception('Unknown Geometry Type'); + } + } on _ShortCircuit { + return; + } +} + +void _forEachGeomInFeatureCollection( + FeatureCollection featureCollection, GeomEachCallback callback) { + int featuresLength = featureCollection.features.length; + for (int featureIndex = 0; featureIndex < featuresLength; featureIndex++) { + _forEachGeomInFeature( + featureCollection.features[featureIndex], callback, featureIndex); + } +} + +void _forEachGeomInFeature(Feature feature, + GeomEachCallback callback, int featureIndex) { + _forEachGeomInGeometryObject(feature.geometry!, callback, feature.properties!, + feature.bbox, feature.id, featureIndex); +} - for (var g = 0; g < stopG; g++) { - geometry = isGeometryCollection - ? geometryMaybeCollection.geometries[g] - : geometryMaybeCollection; - if (geometry == null) { +void _forEachGeomInGeometryObject( + GeometryObject geometryObject, + GeomEachCallback callback, + Map featureProperties, + BBox? featureBBox, + dynamic featureId, + int featureIndex) { + GeometryType currentGeometry; + num geometryCollectionLength = _getGeometryCollectionLength(geometryObject); + for (int geometryIndex = 0; + geometryIndex < geometryCollectionLength; + geometryIndex++) { + currentGeometry = _getGeometry(geometryObject, geometryIndex); + _runGeomEachCallbacks(currentGeometry, callback, featureIndex, + featureProperties, featureBBox, featureId); + } +} + +void _runGeomEachCallbacks( + GeometryType currentGeometry, + GeomEachCallback callback, + int featureIndex, + Map featureProperties, + BBox? featureBBox, + dynamic featureId) { + switch (currentGeometry.type) { + case GeoJSONObjectTypes.point: + case GeoJSONObjectTypes.lineString: + case GeoJSONObjectTypes.multiPoint: + case GeoJSONObjectTypes.polygon: + case GeoJSONObjectTypes.multiLineString: + case GeoJSONObjectTypes.multiPolygon: + if (callback( + currentGeometry, + featureIndex, + featureProperties, + featureBBox, + featureId, + ) == + false) { + throw _ShortCircuit(); + } + break; + case GeoJSONObjectTypes.geometryCollection: + for (int j = 0; + j < (currentGeometry as GeometryCollection).geometries.length; + j++) { if (callback( - null, + (currentGeometry as GeometryCollection).geometries[j], featureIndex, featureProperties, featureBBox, featureId, ) == false) { - return; + throw _ShortCircuit(); } - continue; - } - switch (geometry.type) { - case GeoJSONObjectTypes.point: - case GeoJSONObjectTypes.lineString: - case GeoJSONObjectTypes.multiPoint: - case GeoJSONObjectTypes.polygon: - case GeoJSONObjectTypes.multiLineString: - case GeoJSONObjectTypes.multiPolygon: - if (callback( - geometry, - featureIndex, - featureProperties, - featureBBox, - featureId, - ) == - false) { - return; - } - break; - case GeoJSONObjectTypes.geometryCollection: - for (var j = 0; j < geometry.geometries.length; j++) { - if (callback( - geometry.geometries[j], - featureIndex, - featureProperties, - featureBBox, - featureId, - ) == - false) { - return; - } - } - break; - default: - throw ('Unknown Geometry Type'); } - } - // Only increase `featureIndex` per each feature - featureIndex++; + break; + default: + throw Exception('Unknown Geometry Type'); } } + +int _getGeometryCollectionLength(GeometryObject geometryObject) { + return geometryObject is GeometryCollection + ? geometryObject.geometries.length + : 1; +} + +GeometryType _getGeometry(GeometryObject geometryObject, int index) { + return geometryObject is GeometryCollection + ? geometryObject.geometries[index] + : geometryObject as GeometryType; +} diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index d785bb85..a0e2dcfe 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -41,7 +41,7 @@ Feature geomCollection = Feature( ], ), ); -List featureAndCollection(Geometry geometry) { +List featureAndCollection(GeometryObject geometry) { Feature feature = Feature( geometry: geometry, properties: { @@ -60,7 +60,7 @@ main() { test('geomEach -- GeometryCollection', () { featureAndCollection(geomCollection.geometry!) .forEach((GeoJSONObject input) { - List output = []; + List output = []; geomEach(input, (geom, i, props, bbox, id) { output.add(geom!); }); @@ -69,7 +69,7 @@ main() { }); test('geomEach -- bare-GeometryCollection', () { - List output = []; + List output = []; geomEach(geomCollection, (geom, i, props, bbox, id) { output.add(geom!); }); @@ -77,15 +77,15 @@ main() { }); test('geomEach -- bare-pointGeometry', () { - List output = []; - geomEach(pt.geometry, (geom, i, props, bbox, id) { + List output = []; + geomEach(pt.geometry!, (geom, i, props, bbox, id) { output.add(geom!); }); expect(output, [pt.geometry]); }); test('geomEach -- bare-pointFeature', () { - List output = []; + List output = []; geomEach(pt, (geom, i, props, bbox, id) { output.add(geom!); }); @@ -114,8 +114,8 @@ main() { ); geomEach( pt, - (Geometry? currentGeometry, - num? featureIndex, + (GeometryObject? currentGeometry, + int? featureIndex, Map featureProperties, BBox? featureBBox, dynamic featureId) { @@ -174,8 +174,8 @@ main() { // FeatureCollection var count = 0; func(lines, ( - Geometry? currentGeometry, - num? featureIndex, + GeometryObject? currentGeometry, + int? featureIndex, Map featureProperties, BBox? featureBBox, dynamic featureId, @@ -187,8 +187,8 @@ main() { // Multi Geometry var multiCount = 0; func(multiLine, ( - Geometry? currentGeometry, - num? featureIndex, + GeometryObject? currentGeometry, + int? featureIndex, Map featureProperties, BBox? featureBBox, dynamic featureId, From 6494415188765c42f434dd01b7fb88c28222cdd0 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 23 Nov 2021 10:15:20 +0100 Subject: [PATCH 07/72] simplify geomEach --- lib/src/meta.dart | 92 ++++++++++++++--------------------------------- 1 file changed, 27 insertions(+), 65 deletions(-) diff --git a/lib/src/meta.dart b/lib/src/meta.dart index fd403cde..b846032d 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -69,71 +69,33 @@ void _forEachGeomInGeometryObject( BBox? featureBBox, dynamic featureId, int featureIndex) { - GeometryType currentGeometry; - num geometryCollectionLength = _getGeometryCollectionLength(geometryObject); - for (int geometryIndex = 0; - geometryIndex < geometryCollectionLength; - geometryIndex++) { - currentGeometry = _getGeometry(geometryObject, geometryIndex); - _runGeomEachCallbacks(currentGeometry, callback, featureIndex, - featureProperties, featureBBox, featureId); - } -} + if (geometryObject is GeometryType) { + if (callback( + geometryObject, + featureIndex, + featureProperties, + featureBBox, + featureId, + ) == + false) { + throw _ShortCircuit(); + } + } else if (geometryObject is GeometryCollection) { + num geometryCollectionLength = geometryObject.geometries.length; -void _runGeomEachCallbacks( - GeometryType currentGeometry, - GeomEachCallback callback, - int featureIndex, - Map featureProperties, - BBox? featureBBox, - dynamic featureId) { - switch (currentGeometry.type) { - case GeoJSONObjectTypes.point: - case GeoJSONObjectTypes.lineString: - case GeoJSONObjectTypes.multiPoint: - case GeoJSONObjectTypes.polygon: - case GeoJSONObjectTypes.multiLineString: - case GeoJSONObjectTypes.multiPolygon: - if (callback( - currentGeometry, - featureIndex, - featureProperties, - featureBBox, - featureId, - ) == - false) { - throw _ShortCircuit(); - } - break; - case GeoJSONObjectTypes.geometryCollection: - for (int j = 0; - j < (currentGeometry as GeometryCollection).geometries.length; - j++) { - if (callback( - (currentGeometry as GeometryCollection).geometries[j], - featureIndex, - featureProperties, - featureBBox, - featureId, - ) == - false) { - throw _ShortCircuit(); - } - } - break; - default: - throw Exception('Unknown Geometry Type'); + for (int geometryIndex = 0; + geometryIndex < geometryCollectionLength; + geometryIndex++) { + _forEachGeomInGeometryObject( + geometryObject.geometries[geometryIndex], + callback, + featureProperties, + featureBBox, + featureId, + featureIndex, + ); + } + } else { + throw Exception('Unknown Geometry Type'); } } - -int _getGeometryCollectionLength(GeometryObject geometryObject) { - return geometryObject is GeometryCollection - ? geometryObject.geometries.length - : 1; -} - -GeometryType _getGeometry(GeometryObject geometryObject, int index) { - return geometryObject is GeometryCollection - ? geometryObject.geometries[index] - : geometryObject as GeometryType; -} From 0360b089699f67e7c6d6826b33bab0e7cd6583b7 Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Tue, 23 Nov 2021 22:44:15 +0100 Subject: [PATCH 08/72] Add coverage reporting to pull requests tests --- .github/workflows/dart-unit-tests-on-pr.yml | 31 +++++++++++++++++++-- .github/workflows/dart-unit-tests.yml | 2 +- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dart-unit-tests-on-pr.yml b/.github/workflows/dart-unit-tests-on-pr.yml index 5d0148f0..d42fca73 100644 --- a/.github/workflows/dart-unit-tests-on-pr.yml +++ b/.github/workflows/dart-unit-tests-on-pr.yml @@ -26,11 +26,36 @@ jobs: - name: Analyze project source run: dart analyze if: always() - + - name: Run build_runner run: dart run build_runner build --delete-conflicting-outputs if: always() - - name: Run tests - run: dart test + - name: Run tests with coverage enabled + run: dart test --coverage=./coverage + if: always() + + - name: Convert to LCOV report if: always() + run: | + dart pub global activate coverage + dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --report-on=lib --lcov -o ./coverage/lcov.info -i ./coverage + + - name: Comment on PR with coverage + if: always() + uses: romeovs/lcov-reporter-action@v0.2.16 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate HTML coverage report + if: always() + run: | + sudo apt install lcov + genhtml -o ./coverage/report ./coverage/lcov.info + + - name: Archive coverage artifacts + if: always() + uses: actions/upload-artifact@v2 + with: + name: coverage-report + path: ./coverage/report diff --git a/.github/workflows/dart-unit-tests.yml b/.github/workflows/dart-unit-tests.yml index 29045f94..47784bbd 100644 --- a/.github/workflows/dart-unit-tests.yml +++ b/.github/workflows/dart-unit-tests.yml @@ -31,7 +31,7 @@ jobs: - name: Analyze project source run: dart analyze if: always() - + - name: Run build_runner run: dart run build_runner build --delete-conflicting-outputs if: always() From 3a21086f91707f3824b56f620f3a6748abc40948 Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Wed, 24 Nov 2021 22:01:56 +0100 Subject: [PATCH 09/72] Allow PR coverage comment to fail This allows PRs from forks to still run the tests successfully --- .github/workflows/dart-unit-tests-on-pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dart-unit-tests-on-pr.yml b/.github/workflows/dart-unit-tests-on-pr.yml index d42fca73..6f0da586 100644 --- a/.github/workflows/dart-unit-tests-on-pr.yml +++ b/.github/workflows/dart-unit-tests-on-pr.yml @@ -42,6 +42,7 @@ jobs: dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --report-on=lib --lcov -o ./coverage/lcov.info -i ./coverage - name: Comment on PR with coverage + continue-on-error: true if: always() uses: romeovs/lcov-reporter-action@v0.2.16 with: From 736342def2def11980f394e67397897bbd3ebdb7 Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Wed, 24 Nov 2021 22:20:22 +0100 Subject: [PATCH 10/72] Refactor coverage reporting into its own job The coverage job is allowed to continue on error, letting the entire workflow 'pass' if we hit issues running or reporting coverage --- .github/workflows/dart-unit-tests-on-pr.yml | 50 ++++++++++++++++----- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/.github/workflows/dart-unit-tests-on-pr.yml b/.github/workflows/dart-unit-tests-on-pr.yml index 6f0da586..37da6443 100644 --- a/.github/workflows/dart-unit-tests-on-pr.yml +++ b/.github/workflows/dart-unit-tests-on-pr.yml @@ -35,28 +35,58 @@ jobs: run: dart test --coverage=./coverage if: always() - - name: Convert to LCOV report + - name: Archive raw coverage artifacts if: always() + uses: actions/upload-artifact@v2 + with: + name: raw-coverage + path: ./coverage + + coverage-reporting: + continue-on-error: true + needs: [test] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: dart-lang/setup-dart@v1 + with: + sdk: stable + + - name: Print Dart SDK version + run: dart --version + + - name: Install dependencies + run: dart pub get + + - name: Get raw coverage artifact + uses: actions/download-artifact@v2 + with: + name: raw-coverage + path: ./coverage + + - name: Convert to LCOV report run: | dart pub global activate coverage dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --report-on=lib --lcov -o ./coverage/lcov.info -i ./coverage + - name: Generate HTML coverage report + run: | + sudo apt install lcov + genhtml -o ./coverage/report ./coverage/lcov.info + - name: Comment on PR with coverage continue-on-error: true - if: always() uses: romeovs/lcov-reporter-action@v0.2.16 with: github-token: ${{ secrets.GITHUB_TOKEN }} + lcov-file: ./coverage/lcov.info - - name: Generate HTML coverage report - if: always() - run: | - sudo apt install lcov - genhtml -o ./coverage/report ./coverage/lcov.info - - - name: Archive coverage artifacts + - name: Archive coverage report if: always() uses: actions/upload-artifact@v2 with: name: coverage-report - path: ./coverage/report + path: | + ./coverage/report + ./coverage/lcov.info From d35c4ce09756e9726aa5b5e90baf621d2adf104d Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Thu, 25 Nov 2021 09:24:43 +0100 Subject: [PATCH 11/72] Move coverage reporting into separate workflow --- .github/workflows/dart-unit-tests-on-pr.yml | 49 ---------------- .../workflows/pr-code-coverage-reporting.yml | 58 +++++++++++++++++++ 2 files changed, 58 insertions(+), 49 deletions(-) create mode 100644 .github/workflows/pr-code-coverage-reporting.yml diff --git a/.github/workflows/dart-unit-tests-on-pr.yml b/.github/workflows/dart-unit-tests-on-pr.yml index 37da6443..10e4a4f5 100644 --- a/.github/workflows/dart-unit-tests-on-pr.yml +++ b/.github/workflows/dart-unit-tests-on-pr.yml @@ -41,52 +41,3 @@ jobs: with: name: raw-coverage path: ./coverage - - coverage-reporting: - continue-on-error: true - needs: [test] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - uses: dart-lang/setup-dart@v1 - with: - sdk: stable - - - name: Print Dart SDK version - run: dart --version - - - name: Install dependencies - run: dart pub get - - - name: Get raw coverage artifact - uses: actions/download-artifact@v2 - with: - name: raw-coverage - path: ./coverage - - - name: Convert to LCOV report - run: | - dart pub global activate coverage - dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --report-on=lib --lcov -o ./coverage/lcov.info -i ./coverage - - - name: Generate HTML coverage report - run: | - sudo apt install lcov - genhtml -o ./coverage/report ./coverage/lcov.info - - - name: Comment on PR with coverage - continue-on-error: true - uses: romeovs/lcov-reporter-action@v0.2.16 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - lcov-file: ./coverage/lcov.info - - - name: Archive coverage report - if: always() - uses: actions/upload-artifact@v2 - with: - name: coverage-report - path: | - ./coverage/report - ./coverage/lcov.info diff --git a/.github/workflows/pr-code-coverage-reporting.yml b/.github/workflows/pr-code-coverage-reporting.yml new file mode 100644 index 00000000..9c97249a --- /dev/null +++ b/.github/workflows/pr-code-coverage-reporting.yml @@ -0,0 +1,58 @@ +name: Pull Request Code Coverage Reporting +on: + workflow_run: + workflows: ["Dart Unit Tests for PRs"] + types: [completed] + +jobs: + coverage-reporting: + if: > + ${{ github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: dart-lang/setup-dart@v1 + with: + sdk: stable + + - name: Print Dart SDK version + run: dart --version + + - name: Install dependencies + run: dart pub get + + - name: Download raw coverage from tests workflow + uses: dawidd6/action-download-artifact@v2.16.0 + with: + workflow: dart-unit-tests-on-pr.yml + run_id: ${{ github.event.workflow_run.id }} + name: raw-coverage + path: ./coverage + + - name: Convert to LCOV report + run: | + dart pub global activate coverage + dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --report-on=lib --lcov -o ./coverage/lcov.info -i ./coverage + + - name: Generate HTML coverage report + run: | + sudo apt install lcov + genhtml -o ./coverage/report ./coverage/lcov.info + + - name: Comment on PR with coverage + continue-on-error: true + uses: romeovs/lcov-reporter-action@v0.2.16 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + lcov-file: ./coverage/lcov.info + + - name: Archive coverage report + if: always() + uses: actions/upload-artifact@v2 + with: + name: coverage-report + path: | + ./coverage/report + ./coverage/lcov.info From b5935d43b7d8d0c6920970d8d0ba8848bc7f4180 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Wed, 24 Nov 2021 22:05:11 +0100 Subject: [PATCH 12/72] geomEach: nullable fields #36 --- lib/src/meta.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/meta.dart b/lib/src/meta.dart index b846032d..462dc70b 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -3,7 +3,7 @@ import 'geojson.dart'; typedef GeomEachCallback = dynamic Function( GeometryObject? currentGeometry, int? featureIndex, - Map featureProperties, + Map? featureProperties, BBox? featureBBox, dynamic featureId, ); @@ -58,14 +58,14 @@ void _forEachGeomInFeatureCollection( void _forEachGeomInFeature(Feature feature, GeomEachCallback callback, int featureIndex) { - _forEachGeomInGeometryObject(feature.geometry!, callback, feature.properties!, + _forEachGeomInGeometryObject(feature.geometry, callback, feature.properties, feature.bbox, feature.id, featureIndex); } void _forEachGeomInGeometryObject( - GeometryObject geometryObject, + GeometryObject? geometryObject, GeomEachCallback callback, - Map featureProperties, + Map? featureProperties, BBox? featureBBox, dynamic featureId, int featureIndex) { From dee647e1880867ebe1482a585ed65f8587438026 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Wed, 24 Nov 2021 22:11:04 +0100 Subject: [PATCH 13/72] fix types in tests --- test/components/meta_test.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index a0e2dcfe..5cf73f76 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -93,7 +93,7 @@ main() { }); test('geomEach -- multiGeometryFeature-properties', () { - Map lastProperties = {}; + Map? lastProperties = {}; geomEach(geomCollection, (geom, i, props, bbox, id) { lastProperties = props; }); @@ -116,7 +116,7 @@ main() { pt, (GeometryObject? currentGeometry, int? featureIndex, - Map featureProperties, + Map? featureProperties, BBox? featureBBox, dynamic featureId) { expect(featureIndex, 0, reason: 'featureIndex'); @@ -176,7 +176,7 @@ main() { func(lines, ( GeometryObject? currentGeometry, int? featureIndex, - Map featureProperties, + Map? featureProperties, BBox? featureBBox, dynamic featureId, ) { @@ -189,7 +189,7 @@ main() { func(multiLine, ( GeometryObject? currentGeometry, int? featureIndex, - Map featureProperties, + Map? featureProperties, BBox? featureBBox, dynamic featureId, ) { From 272a778d4533777444812819ae00f39157d997a7 Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Sun, 28 Nov 2021 08:15:12 +0100 Subject: [PATCH 14/72] Update to latest romeovs/lcov-reporter-action This should resolve an issue where the 'comment code coverage on PR' action fails after being merged into main. See https://github.com/romeovs/lcov-reporter-action/issues/16 --- .github/workflows/pr-code-coverage-reporting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-code-coverage-reporting.yml b/.github/workflows/pr-code-coverage-reporting.yml index 9c97249a..a632247b 100644 --- a/.github/workflows/pr-code-coverage-reporting.yml +++ b/.github/workflows/pr-code-coverage-reporting.yml @@ -43,7 +43,7 @@ jobs: - name: Comment on PR with coverage continue-on-error: true - uses: romeovs/lcov-reporter-action@v0.2.16 + uses: romeovs/lcov-reporter-action@v0.2.21 with: github-token: ${{ secrets.GITHUB_TOKEN }} lcov-file: ./coverage/lcov.info From 13ff21d1e24d46a67e6f79dff383576493aeba36 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Sun, 28 Nov 2021 16:26:18 +0100 Subject: [PATCH 15/72] raise version for release 0.0.3 --- CHANGELOG.md | 5 +++++ pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a47710a..2abddef5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.3 + +- Null-safety support + ## 0.0.2+3 Implements the `geomEach` meta function. [#13](https://github.com/dartclub/turf_dart/pull/13) @@ -5,6 +9,7 @@ Implements the `geomEach` meta function. [#13](https://github.com/dartclub/turf_ ## 0.0.2+1 - initialize lists and maps empty in constructors, if not provided + ## 0.0.2 - normalization for coordinates (Position) diff --git a/pubspec.yaml b/pubspec.yaml index 4d416413..3dc73c48 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.2+3 +version: 0.0.3 environment: sdk: '>=2.12.0 <3.0.0' homepage: https://github.com/dartclub/turf_dart From bb33084f010b1676f3e88eb5342d86f925f66b61 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Tue, 7 Dec 2021 15:13:22 +0100 Subject: [PATCH 16/72] [meta] add implementation and test for featureEach and propEach (#24) --- lib/src/meta.dart | 66 ++++++++++++++++++++++++++++++++ test/components/meta_test.dart | 70 ++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) diff --git a/lib/src/meta.dart b/lib/src/meta.dart index 462dc70b..e673cae7 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -99,3 +99,69 @@ void _forEachGeomInGeometryObject( throw Exception('Unknown Geometry Type'); } } + +/// Callback for propEach +typedef PropEachCallback = dynamic Function( + Map? currentProperties, num featureIndex); + +/// Iterate over properties in any [geoJSON] object, calling [callback] on each +/// iteration. Similar to Array.forEach() +/// +/// For example: +/// +/// ```dart +/// FeatureCollection featureCollection = FeatureCollection( +/// features: [ +/// point1, +/// point2, +/// point3, +/// ], +/// ); +/// propEach(featureCollection, (currentProperties, featureIndex) { +/// someOperationOnEachProperty(currentProperties); +/// }); +/// ``` +void propEach(GeoJSONObject geoJSON, PropEachCallback callback) { + if (geoJSON is FeatureCollection) { + for (var i = 0; i < geoJSON.features.length; i++) { + if (callback(geoJSON.features[i].properties, i) == false) break; + } + } else if (geoJSON is Feature) { + callback(geoJSON.properties, 0); + } else { + throw Exception('Unknown Feature/FeatureCollection Type'); + } +} + +/// Callback for featureEach +typedef FeatureEachCallback = dynamic Function( + Feature currentFeature, num featureIndex); + +/// Iterate over features in any [geoJSON] object, calling [callback] on each +/// iteration. Similar to Array.forEach. +/// +/// For example: +/// +/// ```dart +/// FeatureCollection featureCollection = FeatureCollection( +/// features: [ +/// point1, +/// point2, +/// point3, +/// ], +/// ); +/// featureEach(featureCollection, (currentFeature, featureIndex) { +/// someOperationOnEachFeature(currentFeature); +/// }); +/// ``` +void featureEach(GeoJSONObject geoJSON, FeatureEachCallback callback) { + if (geoJSON is Feature) { + callback(geoJSON, 0); + } else if (geoJSON is FeatureCollection) { + for (var i = 0; i < geoJSON.features.length; i++) { + if (callback(geoJSON.features[i], i) == false) break; + } + } else { + throw Exception('Unknown Feature/FeatureCollection Type'); + } +} diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 5cf73f76..e96a1adb 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -41,6 +41,16 @@ Feature geomCollection = Feature( ], ), ); + +List collection(Feature feature) { + FeatureCollection featureCollection = FeatureCollection( + features: [ + feature, + ], + ); + return [feature, featureCollection]; +} + List featureAndCollection(GeometryObject geometry) { Feature feature = Feature( geometry: geometry, @@ -57,6 +67,66 @@ List featureAndCollection(GeometryObject geometry) { } main() { + test('propEach --featureCollection', () { + collection(pt).forEach((input) { + propEach(input, (prop, i) { + expect(prop, {'a': 1}); + expect(i, 0); + }); + }); + }); + + test('propEach --feature', () { + propEach(pt, (prop, i) { + expect(prop, {'a': 1}); + expect(i, 0); + }); + }); + + test('propEach --breaking of iterations', () { + var count = 0; + propEach(multiline, (prop, i) { + count += 1; + return false; + }); + expect(count, 1); + }); + + test('featureEach --featureCollection', () { + collection(pt).forEach((input) { + featureEach(input, (feature, i) { + expect(feature.properties, {'a': 1}); + expect( + feature.geometry, + Point.fromJson({ + 'coordinates': [0, 0], + })); + expect(i, 0); + }); + }); + }); + + test('featureEach --feature', () { + featureEach(pt, (feature, i) { + expect(feature.properties, {'a': 1}); + expect( + feature.geometry, + Point.fromJson({ + 'coordinates': [0, 0], + })); + expect(i, 0); + }); + }); + + test('featureEach --breaking of iterations', () { + var count = 0; + featureEach(multiline, (feature, i) { + count += 1; + return false; + }); + expect(count, 1); + }); + test('geomEach -- GeometryCollection', () { featureAndCollection(geomCollection.geometry!) .forEach((GeoJSONObject input) { From bcc7cfbdb84cf14e597f82f4468d3d7cebf1c093 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 14 Dec 2021 22:02:13 +0100 Subject: [PATCH 17/72] Assemble different types, refactor GeoJSON serialization, general improvements (#43) * #19, #20, #21, refactor * convert GeoJSONObjectType to enum, rename * rm overridden bboxes * Implement vector operations #23 * statically type 'round' helper func, fix unit test * gen coverage * fix typo * geojson unit tests, type fixes * fix deserialization with GeoJSONObjectType, implement hashCode * initial unit tests for new constructors * integration tests * fix path * test bbox on other geojson types * update enum tests * required params for new constructors, unit tests * license notices --- .gitignore | 2 + lib/src/geojson.dart | 336 +- lib/src/geojson.g.dart | 25 +- lib/src/helpers.dart | 2 +- mac-gen-coverage.sh | 12 + pubspec.yaml | 4 +- test/components/bearing_test.dart | 9 +- test/components/geojson_test.dart | 322 +- test/components/helpers_test.dart | 4 +- test/examples/bbox/geometryCollection.geojson | 18 + test/examples/bbox/lineString.geojson | 19 + test/examples/bbox/multiLineString.geojson | 31 + test/examples/bbox/multiPoint.geojson | 19 + test/examples/bbox/multiPolygon.geojson | 35 + test/examples/bbox/point.geojson | 13 + test/examples/bbox/polygon.geojson | 33 + test/examples/lukas-h/germany-states.geojson | 87426 ++++++++++++++++ test/examples/rfc7946/README.md | 5 + .../rfc7946/antimeridianCutting1.geojson | 25 + .../rfc7946/antimeridianCutting2.geojson | 53 + .../rfc7946/featureCollection.geojson | 82 + .../featureCollectionWithBBox1.geojson | 10 + .../featureCollectionWithBBox2.geojson | 12 + test/examples/rfc7946/featureWithBBox.geojson | 32 + .../rfc7946/geometryCollection.geojson | 25 + test/examples/rfc7946/lineString.geojson | 13 + test/examples/rfc7946/multiLineString.geojson | 25 + test/examples/rfc7946/multiPoint.geojson | 13 + test/examples/rfc7946/multiPolygon.geojson | 75 + test/examples/rfc7946/point.geojson | 7 + test/examples/rfc7946/polygon1.geojson | 27 + test/examples/rfc7946/polygon2.geojson | 49 + test/examples/wikipedia/README.md | 5 + .../wikipedia/featureCollection.geojson | 82 + .../wikipedia/geometryCollection.geojson | 52 + test/examples/wikipedia/lineString.geojson | 17 + .../wikipedia/multiLineString.geojson | 37 + test/examples/wikipedia/multiPoint.geojson | 21 + test/examples/wikipedia/multiPolygon1.geojson | 49 + test/examples/wikipedia/multiPolygon2.geojson | 71 + test/examples/wikipedia/point.geojson | 7 + test/examples/wikipedia/polygon1.geojson | 27 + test/examples/wikipedia/polygon2.geojson | 45 + 43 files changed, 89030 insertions(+), 146 deletions(-) create mode 100755 mac-gen-coverage.sh create mode 100644 test/examples/bbox/geometryCollection.geojson create mode 100644 test/examples/bbox/lineString.geojson create mode 100644 test/examples/bbox/multiLineString.geojson create mode 100644 test/examples/bbox/multiPoint.geojson create mode 100644 test/examples/bbox/multiPolygon.geojson create mode 100644 test/examples/bbox/point.geojson create mode 100644 test/examples/bbox/polygon.geojson create mode 100644 test/examples/lukas-h/germany-states.geojson create mode 100644 test/examples/rfc7946/README.md create mode 100644 test/examples/rfc7946/antimeridianCutting1.geojson create mode 100644 test/examples/rfc7946/antimeridianCutting2.geojson create mode 100644 test/examples/rfc7946/featureCollection.geojson create mode 100644 test/examples/rfc7946/featureCollectionWithBBox1.geojson create mode 100644 test/examples/rfc7946/featureCollectionWithBBox2.geojson create mode 100644 test/examples/rfc7946/featureWithBBox.geojson create mode 100644 test/examples/rfc7946/geometryCollection.geojson create mode 100644 test/examples/rfc7946/lineString.geojson create mode 100644 test/examples/rfc7946/multiLineString.geojson create mode 100644 test/examples/rfc7946/multiPoint.geojson create mode 100644 test/examples/rfc7946/multiPolygon.geojson create mode 100644 test/examples/rfc7946/point.geojson create mode 100644 test/examples/rfc7946/polygon1.geojson create mode 100644 test/examples/rfc7946/polygon2.geojson create mode 100644 test/examples/wikipedia/README.md create mode 100644 test/examples/wikipedia/featureCollection.geojson create mode 100644 test/examples/wikipedia/geometryCollection.geojson create mode 100644 test/examples/wikipedia/lineString.geojson create mode 100644 test/examples/wikipedia/multiLineString.geojson create mode 100644 test/examples/wikipedia/multiPoint.geojson create mode 100644 test/examples/wikipedia/multiPolygon1.geojson create mode 100644 test/examples/wikipedia/multiPolygon2.geojson create mode 100644 test/examples/wikipedia/point.geojson create mode 100644 test/examples/wikipedia/polygon1.geojson create mode 100644 test/examples/wikipedia/polygon2.geojson diff --git a/.gitignore b/.gitignore index 50602ac6..81cc7efd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ build/ # Directory created by dartdoc doc/api/ + +coverage/ \ No newline at end of file diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index 317e1808..516effca 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -1,33 +1,67 @@ import 'package:json_annotation/json_annotation.dart'; part 'geojson.g.dart'; -//TODO assemble multipoint from points -//TODO assemble multilinestring from linestring -//TODO assemble polygon from 3 or more points - -// TODO convert to enum with JsonEnum serialization -class GeoJSONObjectTypes { - static const String point = 'Point'; - static const String multiPoint = 'MultiPoint'; - static const String lineString = 'LineString'; - static const String multiLineString = 'MultiLineString'; - static const String polygon = 'Polygon'; - static const String multiPolygon = 'MultiPolygon'; - static const String geometryCollection = 'GeometryCollection'; - static const String feature = 'Feature'; - static const String featureCollection = 'FeatureCollection'; +@JsonEnum(alwaysCreate: true) +enum GeoJSONObjectType { + @JsonValue('Point') + point, + @JsonValue('MultiPoint') + multiPoint, + @JsonValue('LineString') + lineString, + @JsonValue('MultiLineString') + multiLineString, + @JsonValue('Polygon') + polygon, + @JsonValue('MultiPolygon') + multiPolygon, + @JsonValue('GeometryCollection') + geometryCollection, + @JsonValue('Feature') + feature, + @JsonValue('FeatureCollection') + featureCollection, } abstract class GeoJSONObject { - @JsonKey(ignore: true) - final String type; + final GeoJSONObjectType type; BBox? bbox; - GeoJSONObject.withType(this.type); + + GeoJSONObject.withType(this.type, {this.bbox}); + Map serialize(Map map) => { - 'type': type, + 'type': _$GeoJSONObjectTypeEnumMap[type], ...map, }; + + static GeoJSONObject fromJson(Map json) { + GeoJSONObjectType decoded = json['type'] is GeoJSONObjectType + ? json['type'] + : $enumDecode(_$GeoJSONObjectTypeEnumMap, json['type']); + switch (decoded) { + case GeoJSONObjectType.point: + return Point.fromJson(json); + case GeoJSONObjectType.multiPoint: + return MultiPoint.fromJson(json); + case GeoJSONObjectType.lineString: + return LineString.fromJson(json); + case GeoJSONObjectType.multiLineString: + return MultiLineString.fromJson(json); + case GeoJSONObjectType.polygon: + return Polygon.fromJson(json); + case GeoJSONObjectType.multiPolygon: + return MultiPolygon.fromJson(json); + case GeoJSONObjectType.geometryCollection: + return GeometryCollection.fromJson(json); + case GeoJSONObjectType.feature: + return Feature.fromJson(json); + case GeoJSONObjectType.featureCollection: + return FeatureCollection.fromJson(json); + } + } + toJson(); + GeoJSONObject clone(); } @@ -165,6 +199,7 @@ class Position extends CoordinateType { lat, if (alt != null) alt, ]); + Position.named({required num lat, required num lng, num? alt}) : super([ lng, @@ -176,14 +211,38 @@ class Position extends CoordinateType { Position.of(List list) : assert(list.length >= 2 && list.length <= 3), super(list); + factory Position.fromJson(List list) => Position.of(list); - // TODO implement override operators +, -, * with vector operations + Position operator +(Position p) => Position.of([ + lng + p.lng, + lat + p.lat, + if (alt != null && p.alt != null) alt! + p.alt! + ]); + + Position operator -(Position p) => Position.of([ + lng - p.lng, + lat - p.lat, + if (alt != null && p.alt != null) alt! - p.alt!, + ]); + + num dotProduct(Position p) => + (lng * p.lng) + + (lat * p.lat) + + (alt != null && p.alt != null ? (alt! * p.alt!) : 0); + + Position crossProduct(Position p) { + if (alt != null && p.alt != null) { + return Position( + lat * p.alt! - alt! * p.lat, + alt! * p.lng - lng * p.alt!, + lng * p.lat - lat * p.lng, + ); + } + throw Exception('Cross product only implemented for 3 dimensions'); + } - @override - bool operator ==(dynamic other) => other is Position - ? lat == other.lat && lng == other.lng && alt == other.alt - : false; + Position operator *(Position p) => crossProduct(p); num get lng => _items[0]; num get lat => _items[1]; @@ -201,6 +260,14 @@ class Position extends CoordinateType { @override Position clone() => Position.of(_items); + + @override + int get hashCode => Object.hashAll(_items); + + @override + bool operator ==(dynamic other) => other is Position + ? lng == other.lng && lat == other.lat && alt == other.alt + : false; } // Bounding box, as specified here https://tools.ietf.org/html/rfc7946#section-5 @@ -244,6 +311,7 @@ class BBox extends CoordinateType { BBox.of(List list) : assert(list.length == 4 || list.length == 6), super(list); + factory BBox.fromJson(List list) => BBox.of(list); bool get _is3D => length == 6; @@ -270,12 +338,28 @@ class BBox extends CoordinateType { lng1: _untilSigned(lng1, 180), lng2: _untilSigned(lng2, 180), ); + + @override + int get hashCode => Object.hashAll(_items); + + @override + bool operator ==(Object other) => other is BBox + ? lng1 == other.lng1 && + lat1 == other.lat1 && + alt1 == other.alt1 && + lng2 == other.lng2 && + lat2 == other.lat2 && + alt2 == other.alt2 + : false; } abstract class GeometryObject extends GeoJSONObject { - GeometryObject.withType(String type) : super.withType(type); + GeometryObject.withType(GeoJSONObjectType type, {BBox? bbox}) + : super.withType(type, bbox: bbox); + static GeometryObject deserialize(Map json) { - return json['type'] == GeoJSONObjectTypes.geometryCollection + return json['type'] == 'GeometryCollection' || + json['type'] == GeoJSONObjectType.geometryCollection ? GeometryCollection.fromJson(json) : GeometryType.deserialize(json); } @@ -283,57 +367,77 @@ abstract class GeometryObject extends GeoJSONObject { abstract class GeometryType extends GeometryObject { T coordinates; - GeometryType.withType(this.coordinates, String type) : super.withType(type); + + GeometryType.withType(this.coordinates, GeoJSONObjectType type, {BBox? bbox}) + : super.withType(type, bbox: bbox); static GeometryType deserialize(Map json) { - switch (json['type']) { - case GeoJSONObjectTypes.point: + GeoJSONObjectType decoded = json['type'] is GeoJSONObjectType + ? json['type'] + : $enumDecode(_$GeoJSONObjectTypeEnumMap, json['type']); + switch (decoded) { + case GeoJSONObjectType.point: return Point.fromJson(json); - case GeoJSONObjectTypes.multiPoint: + case GeoJSONObjectType.multiPoint: return MultiPoint.fromJson(json); - case GeoJSONObjectTypes.lineString: + case GeoJSONObjectType.lineString: return LineString.fromJson(json); - case GeoJSONObjectTypes.multiLineString: + case GeoJSONObjectType.multiLineString: return MultiLineString.fromJson(json); - case GeoJSONObjectTypes.polygon: + case GeoJSONObjectType.polygon: return Polygon.fromJson(json); - case GeoJSONObjectTypes.multiPolygon: + case GeoJSONObjectType.multiPolygon: return MultiPolygon.fromJson(json); default: throw Exception('${json['type']} is not a valid GeoJSON type'); } } + + @override + GeometryType clone(); } /// Point, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.2 @JsonSerializable(explicitToJson: true) class Point extends GeometryType { - Point({this.bbox, required Position coordinates}) - : super.withType(coordinates, GeoJSONObjectTypes.point); + Point({BBox? bbox, required Position coordinates}) + : super.withType(coordinates, GeoJSONObjectType.point, bbox: bbox); + factory Point.fromJson(Map json) => _$PointFromJson(json); + @override - BBox? bbox; + Map toJson() => super.serialize(_$PointToJson(this)); @override - bool operator ==(dynamic other) => - other is Point ? coordinates == other.coordinates : false; + Point clone() => Point(coordinates: coordinates.clone(), bbox: bbox?.clone()); @override - Map toJson() => super.serialize(_$PointToJson(this)); + int get hashCode => Object.hashAll([ + type, + ...coordinates, + if (bbox != null) ...bbox!, + ]); @override - Point clone() => Point(coordinates: coordinates.clone(), bbox: bbox?.clone()); + bool operator ==(Object other) => + other is Point ? coordinates == other.coordinates : false; } /// MultiPoint, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.3 @JsonSerializable(explicitToJson: true) class MultiPoint extends GeometryType> { - MultiPoint({this.bbox, List coordinates = const []}) - : super.withType(coordinates, GeoJSONObjectTypes.multiPoint); + MultiPoint({BBox? bbox, List coordinates = const []}) + : super.withType(coordinates, GeoJSONObjectType.multiPoint, bbox: bbox); + factory MultiPoint.fromJson(Map json) => _$MultiPointFromJson(json); - @override - BBox? bbox; + + MultiPoint.fromPoints({BBox? bbox, required List points}) + : assert(points.length >= 2), + super.withType(points.map((e) => e.coordinates).toList(), + GeoJSONObjectType.multiPoint, + bbox: bbox); + @override Map toJson() => super.serialize(_$MultiPointToJson(this)); @@ -347,12 +451,18 @@ class MultiPoint extends GeometryType> { /// LineString, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.4 @JsonSerializable(explicitToJson: true) class LineString extends GeometryType> { - LineString({this.bbox, List coordinates = const []}) - : super.withType(coordinates, GeoJSONObjectTypes.lineString); + LineString({BBox? bbox, List coordinates = const []}) + : super.withType(coordinates, GeoJSONObjectType.lineString, bbox: bbox); + factory LineString.fromJson(Map json) => _$LineStringFromJson(json); - @override - BBox? bbox; + + LineString.fromPoints({BBox? bbox, required List points}) + : assert(points.length >= 2), + super.withType(points.map((e) => e.coordinates).toList(), + GeoJSONObjectType.lineString, + bbox: bbox); + @override Map toJson() => super.serialize(_$LineStringToJson(this)); @@ -365,12 +475,20 @@ class LineString extends GeometryType> { /// MultiLineString, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.5 @JsonSerializable(explicitToJson: true) class MultiLineString extends GeometryType>> { - MultiLineString({this.bbox, List> coordinates = const []}) - : super.withType(coordinates, GeoJSONObjectTypes.multiLineString); + MultiLineString({BBox? bbox, List> coordinates = const []}) + : super.withType(coordinates, GeoJSONObjectType.multiLineString, + bbox: bbox); + factory MultiLineString.fromJson(Map json) => _$MultiLineStringFromJson(json); - @override - BBox? bbox; + + MultiLineString.fromLineStrings( + {BBox? bbox, required List lineStrings}) + : assert(lineStrings.length >= 2), + super.withType(lineStrings.map((e) => e.coordinates).toList(), + GeoJSONObjectType.multiLineString, + bbox: bbox); + @override Map toJson() => super.serialize(_$MultiLineStringToJson(this)); @@ -386,12 +504,19 @@ class MultiLineString extends GeometryType>> { /// Polygon, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.6 @JsonSerializable(explicitToJson: true) class Polygon extends GeometryType>> { - Polygon({this.bbox, List> coordinates = const []}) - : super.withType(coordinates, GeoJSONObjectTypes.polygon); + Polygon({BBox? bbox, List> coordinates = const []}) + : super.withType(coordinates, GeoJSONObjectType.polygon, bbox: bbox); + factory Polygon.fromJson(Map json) => _$PolygonFromJson(json); - @override - BBox? bbox; + + Polygon.fromPoints({BBox? bbox, required List> points}) + : assert(points.expand((list) => list).length >= 3), + super.withType( + points.map((e) => e.map((e) => e.coordinates).toList()).toList(), + GeoJSONObjectType.polygon, + bbox: bbox); + @override Map toJson() => super.serialize(_$PolygonToJson(this)); @@ -406,17 +531,23 @@ class Polygon extends GeometryType>> { /// MultiPolygon, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.7 @JsonSerializable(explicitToJson: true) class MultiPolygon extends GeometryType>>> { - MultiPolygon({this.bbox, List>> coordinates = const []}) - : super.withType(coordinates, GeoJSONObjectTypes.multiPolygon); + MultiPolygon({BBox? bbox, List>> coordinates = const []}) + : super.withType(coordinates, GeoJSONObjectType.multiPolygon, bbox: bbox); + factory MultiPolygon.fromJson(Map json) => _$MultiPolygonFromJson(json); - @override - BBox? bbox; + + MultiPolygon.fromPolygons({BBox? bbox, required List polygons}) + : assert(polygons.length >= 2), + super.withType(polygons.map((e) => e.coordinates).toList(), + GeoJSONObjectType.multiPolygon, + bbox: bbox); + @override Map toJson() => super.serialize(_$MultiPolygonToJson(this)); @override - GeoJSONObject clone() => MultiPolygon( + MultiPolygon clone() => MultiPolygon( coordinates: coordinates .map((e) => e.map((e) => e.map((e) => e.clone()).toList()).toList()) .toList(), @@ -427,11 +558,11 @@ class MultiPolygon extends GeometryType>>> { /// GeometryCollection, as specified here https://tools.ietf.org/html/rfc7946#section-3.1.8 @JsonSerializable(explicitToJson: true, createFactory: false) class GeometryCollection extends GeometryObject { - GeometryCollection({this.bbox, this.geometries = const []}) - : super.withType(GeoJSONObjectTypes.geometryCollection); - @override - BBox? bbox; List geometries; + + GeometryCollection({BBox? bbox, this.geometries = const []}) + : super.withType(GeoJSONObjectType.geometryCollection, bbox: bbox); + factory GeometryCollection.fromJson(Map json) => GeometryCollection( bbox: json['bbox'] == null @@ -444,56 +575,38 @@ class GeometryCollection extends GeometryObject { .toList() ?? const [], ); + @override Map toJson() => super.serialize(_$GeometryCollectionToJson(this)); @override - GeoJSONObject clone() => GeometryCollection( - geometries: - geometries.map((e) => e.clone()).toList() as List, + GeometryCollection clone() => GeometryCollection( + geometries: geometries.map((e) => e.clone()).toList(), bbox: bbox?.clone(), ); } /// Feature, as specified here https://tools.ietf.org/html/rfc7946#section-3.2 class Feature extends GeoJSONObject { - Feature({ - this.bbox, - this.id, - this.properties = const {}, - this.geometry, - this.fields = const {}, - }) : super.withType(GeoJSONObjectTypes.feature); dynamic id; Map? properties; T? geometry; Map fields; - dynamic operator [](String key) { - switch (key) { - case 'id': - return id; - case 'properties': - return properties; - case 'geometry': - return geometry; - case 'type': - return type; - case 'bbox': - return bbox; - default: - return fields[key]; - } - } + Feature({ + BBox? bbox, + this.id, + this.properties = const {}, + this.geometry, + this.fields = const {}, + }) : super.withType(GeoJSONObjectType.feature, bbox: bbox); - @override - BBox? bbox; factory Feature.fromJson(Map json) => Feature( id: json['id'], geometry: json['geometry'] == null ? null - : GeometryObject.deserialize(json['geometry']) as Never?, + : GeometryObject.deserialize(json['geometry']) as T, properties: json['properties'], bbox: json['bbox'] == null ? null @@ -509,6 +622,29 @@ class Feature extends GeoJSONObject { ), ); + dynamic operator [](String key) { + switch (key) { + case 'id': + return id; + case 'properties': + return properties; + case 'geometry': + return geometry; + case 'type': + return type; + case 'bbox': + return bbox; + default: + return fields[key]; + } + } + + @override + int get hashCode => Object.hash(type, id); + + @override + bool operator ==(dynamic other) => other is Feature ? id == other.id : false; + @override Map toJson() => super.serialize({ 'id': id, @@ -522,18 +658,18 @@ class Feature extends GeoJSONObject { geometry: geometry?.clone() as T?, bbox: bbox?.clone(), fields: Map.of(fields), - properties: Map.of(properties!), + properties: Map.of(properties ?? {}), id: id, ); } /// FeatureCollection, as specified here https://tools.ietf.org/html/rfc7946#section-3.3 class FeatureCollection extends GeoJSONObject { - FeatureCollection({this.bbox, this.features = const []}) - : super.withType(GeoJSONObjectTypes.featureCollection); List> features; - @override - BBox? bbox; + + FeatureCollection({BBox? bbox, this.features = const []}) + : super.withType(GeoJSONObjectType.featureCollection, bbox: bbox); + factory FeatureCollection.fromJson(Map json) => FeatureCollection( bbox: json['bbox'] == null diff --git a/lib/src/geojson.g.dart b/lib/src/geojson.g.dart index c26f0122..d8ae8cdf 100644 --- a/lib/src/geojson.g.dart +++ b/lib/src/geojson.g.dart @@ -16,8 +16,8 @@ Point _$PointFromJson(Map json) => Point( ); Map _$PointToJson(Point instance) => { - 'coordinates': instance.coordinates.toJson(), 'bbox': instance.bbox?.toJson(), + 'coordinates': instance.coordinates.toJson(), }; MultiPoint _$MultiPointFromJson(Map json) => MultiPoint( @@ -34,8 +34,8 @@ MultiPoint _$MultiPointFromJson(Map json) => MultiPoint( Map _$MultiPointToJson(MultiPoint instance) => { - 'coordinates': instance.coordinates.map((e) => e.toJson()).toList(), 'bbox': instance.bbox?.toJson(), + 'coordinates': instance.coordinates.map((e) => e.toJson()).toList(), }; LineString _$LineStringFromJson(Map json) => LineString( @@ -52,8 +52,8 @@ LineString _$LineStringFromJson(Map json) => LineString( Map _$LineStringToJson(LineString instance) => { - 'coordinates': instance.coordinates.map((e) => e.toJson()).toList(), 'bbox': instance.bbox?.toJson(), + 'coordinates': instance.coordinates.map((e) => e.toJson()).toList(), }; MultiLineString _$MultiLineStringFromJson(Map json) => @@ -73,10 +73,10 @@ MultiLineString _$MultiLineStringFromJson(Map json) => Map _$MultiLineStringToJson(MultiLineString instance) => { + 'bbox': instance.bbox?.toJson(), 'coordinates': instance.coordinates .map((e) => e.map((e) => e.toJson()).toList()) .toList(), - 'bbox': instance.bbox?.toJson(), }; Polygon _$PolygonFromJson(Map json) => Polygon( @@ -94,10 +94,10 @@ Polygon _$PolygonFromJson(Map json) => Polygon( ); Map _$PolygonToJson(Polygon instance) => { + 'bbox': instance.bbox?.toJson(), 'coordinates': instance.coordinates .map((e) => e.map((e) => e.toJson()).toList()) .toList(), - 'bbox': instance.bbox?.toJson(), }; MultiPolygon _$MultiPolygonFromJson(Map json) => MultiPolygon( @@ -118,14 +118,27 @@ MultiPolygon _$MultiPolygonFromJson(Map json) => MultiPolygon( Map _$MultiPolygonToJson(MultiPolygon instance) => { + 'bbox': instance.bbox?.toJson(), 'coordinates': instance.coordinates .map((e) => e.map((e) => e.map((e) => e.toJson()).toList()).toList()) .toList(), - 'bbox': instance.bbox?.toJson(), }; Map _$GeometryCollectionToJson(GeometryCollection instance) => { + 'type': _$GeoJSONObjectTypeEnumMap[instance.type], 'bbox': instance.bbox?.toJson(), 'geometries': instance.geometries.map((e) => e.toJson()).toList(), }; + +const _$GeoJSONObjectTypeEnumMap = { + GeoJSONObjectType.point: 'Point', + GeoJSONObjectType.multiPoint: 'MultiPoint', + GeoJSONObjectType.lineString: 'LineString', + GeoJSONObjectType.multiLineString: 'MultiLineString', + GeoJSONObjectType.polygon: 'Polygon', + GeoJSONObjectType.multiPolygon: 'MultiPolygon', + GeoJSONObjectType.geometryCollection: 'GeometryCollection', + GeoJSONObjectType.feature: 'Feature', + GeoJSONObjectType.featureCollection: 'FeatureCollection', +}; diff --git a/lib/src/helpers.dart b/lib/src/helpers.dart index 6c3e0847..a2f6115d 100644 --- a/lib/src/helpers.dart +++ b/lib/src/helpers.dart @@ -72,7 +72,7 @@ const areaFactors = { Unit.yards: 1.195990046, }; -num round(value, [precision = 0]) { +num round(num value, [num precision = 0]) { if (!(precision >= 0)) { throw Exception("precision must be a positive number"); } diff --git a/mac-gen-coverage.sh b/mac-gen-coverage.sh new file mode 100755 index 00000000..cd4c9698 --- /dev/null +++ b/mac-gen-coverage.sh @@ -0,0 +1,12 @@ +dart --version +dart pub get +dart format --output=none --set-exit-if-changed . +dart analyze +dart run build_runner build --delete-conflicting-outputs +dart test --coverage=./coverage +dart pub global activate coverage +dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --report-on=lib --lcov -o ./coverage/lcov.info -i ./coverage +brew install lcov +genhtml -o ./coverage/report ./coverage/lcov.info +brew install http-server +http-server coverage/report 8080 \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 3dc73c48..e887e425 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,11 +7,11 @@ homepage: https://github.com/dartclub/turf_dart repository: https://github.com/dartclub/turf_dart dependencies: - json_annotation: ^4.3.0 + json_annotation: ^4.4.0 dev_dependencies: dartclub_lint: ^0.4.2 test: ^1.19.3 - json_serializable: ^6.0.1 + json_serializable: ^6.1.1 build_runner: ^2.1.5 analyzer: ^2.7.0 diff --git a/test/components/bearing_test.dart b/test/components/bearing_test.dart index 1fac2815..9f2ac72e 100644 --- a/test/components/bearing_test.dart +++ b/test/components/bearing_test.dart @@ -4,13 +4,14 @@ import 'package:turf/helpers.dart'; main() { test('bearing', () { - var start = Position.of([-75, 45]); - var end = Position.of([20, 60]); + var start = Point(coordinates: Position.of([-75, 45])); + var end = Point(coordinates: Position.of([20, 60])); - var initialBearing = bearingRaw(start, end); + var initialBearing = bearing(start, end); expect(initialBearing.toStringAsFixed(2), '37.75'); - var finalBearing = bearingRaw(start, end, calcFinal: true); + var finalBearing = bearing(start, end, calcFinal: true); expect(finalBearing.toStringAsFixed(2), '120.01'); + expect(finalBearing, calculateFinalBearing(start, end)); }); } diff --git a/test/components/geojson_test.dart b/test/components/geojson_test.dart index 248fa7f1..0485e4aa 100644 --- a/test/components/geojson_test.dart +++ b/test/components/geojson_test.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; +import 'dart:io'; import 'dart:math'; import 'package:test/test.dart'; @@ -22,6 +24,8 @@ main() { var pos2 = Position.of([1, 2, 3]); _expectArgs(pos1); _expectArgs(pos2); + + expect(pos1, pos1.clone()); }); test('Position deserialization', () { expect(Position.of([1, 2]).toList(), [1, 2]); @@ -32,6 +36,24 @@ main() { expect(() => Position.of([1, 2, 3, 4]).toList(), throwsA(isA())); }); + + test('Position vector addition', () { + expect(Position(1, 2, 3) + Position(1, 2, 3), Position(2, 4, 6)); + }); + test('Position vector subtraction', () { + expect(Position(1, 2, 3) - Position(1, 2, 3), Position(0, 0, 0)); + }); + test('Position vector dot product', () { + expect(Position(1, 2, 3).dotProduct(Position(1, 2, 3)), + (1) + (2 * 2) + (3 * 3)); + expect(Position(1, 2).dotProduct(Position(1, 2)), (1) + (2 * 2)); + }); + test('Position vector cross product', () { + expect(Position(1, 2, 3) * Position(1, 2, 3), Position(0, 0, 0)); + expect(Position(3, 2, 1) * Position(1, 2, 3), Position(4, -8, 4)); + expect(() => Position(1, 2, 3) * Position(1, 2), throwsA(isException)); + }); + test('BBox', () { _expectArgs(BBox bbox) { expect(bbox.lng1, 1); @@ -53,8 +75,10 @@ main() { var bbox1 = BBox.named(lng1: 1, lat1: 2, alt1: 3, lng2: 4, lat2: 5, alt2: 6); var bbox2 = BBox.of([1, 2, 3, 4, 5, 6]); + var bbox3 = BBox(1, 2, 3, 4, 5, 6); _expectArgs(bbox1); _expectArgs(bbox2); + _expectArgs(bbox3); // test assert length == 4 || length == 6 expect(() => BBox.of([1, 2, 3]).toList(), throwsA(isA())); @@ -63,22 +87,25 @@ main() { expect(() => BBox.of([1, 2, 3, 4, 5, 6, 7]).toList(), throwsA(isA())); - // test 4 dimensional - var bbox3 = BBox.named(lng1: 1, lat1: 2, lng2: 3, lat2: 4); - expect(bbox3.lng1, 1); - expect(bbox3.lat1, 2); - expect(bbox3.alt1, null); - expect(bbox3.lng2, 3); - expect(bbox3.lat2, 4); - expect(bbox3.alt2, null); - expect(bbox3[0], 1); - expect(bbox3[1], 2); - expect(bbox3[2], 3); - expect(bbox3[3], 4); - expect(() => bbox3[4], throwsRangeError); - expect(() => bbox3[5], throwsRangeError); - expect(bbox3.length, 4); - expect(bbox3.toJson(), [1, 2, 3, 4]); + // test 2 dimensional [length == 4] + var bbox4 = BBox.named(lng1: 1, lat1: 2, lng2: 3, lat2: 4); + expect(bbox4.lng1, 1); + expect(bbox4.lat1, 2); + expect(bbox4.alt1, null); + expect(bbox4.lng2, 3); + expect(bbox4.lat2, 4); + expect(bbox4.alt2, null); + expect(bbox4[0], 1); + expect(bbox4[1], 2); + expect(bbox4[2], 3); + expect(bbox4[3], 4); + expect(() => bbox4[4], throwsRangeError); + expect(() => bbox4[5], throwsRangeError); + expect(bbox4.length, 4); + expect(bbox4.toJson(), [1, 2, 3, 4]); + + expect(bbox1.toSigned().isSigned, true); + expect(bbox1, bbox1.clone()); }); }); group('Longitude normalization:', () { @@ -91,6 +118,8 @@ main() { var distToCoord = distanceRaw(zeroZero, coord); var distToNormalizedCoord = distanceRaw(zeroZero, coord.toSigned()); + expect(coord.toSigned().isSigned, true); + expect( distToCoord.toStringAsFixed(6), distToNormalizedCoord.toStringAsFixed(6), @@ -142,21 +171,25 @@ main() { test('Point', () { var geoJSON = { 'coordinates': null, - 'type': GeoJSONObjectTypes.point, + 'type': GeoJSONObjectType.point, }; expect(() => Point.fromJson(geoJSON), throwsA(isA())); + + var point = Point(coordinates: Position(11, 49)); + + expect(point, point.clone()); }); var geometries = [ - GeoJSONObjectTypes.multiPoint, - GeoJSONObjectTypes.lineString, - GeoJSONObjectTypes.multiLineString, - GeoJSONObjectTypes.polygon, - GeoJSONObjectTypes.multiPolygon, + GeoJSONObjectType.multiPoint, + GeoJSONObjectType.lineString, + GeoJSONObjectType.multiLineString, + GeoJSONObjectType.polygon, + GeoJSONObjectType.multiPolygon, ]; var collection = GeometryCollection.fromJson({ - 'type': GeoJSONObjectTypes.geometryCollection, + 'type': GeoJSONObjectType.geometryCollection, 'geometries': geometries .map((type) => { 'coordinates': null, @@ -171,39 +204,268 @@ main() { isNotNull); // kind of unnecessary expect(collection.geometries[i].coordinates, isA()); expect(collection.geometries[i].coordinates, isEmpty); + + var json = collection.geometries[i].toJson(); + for (var key in ['type', 'coordinates']) { + expect(json.keys, contains(key)); + } }); } }); test('GeometryCollection', () { var geoJSON = { - 'type': GeoJSONObjectTypes.geometryCollection, + 'type': GeoJSONObjectType.geometryCollection, 'geometries': null, }; var collection = GeometryCollection.fromJson(geoJSON); - expect(collection.type, GeoJSONObjectTypes.geometryCollection); + expect(collection.type, GeoJSONObjectType.geometryCollection); expect(collection.geometries, isNotNull); // kind of unnecessary expect(collection.geometries, isA()); expect(collection.geometries, isEmpty); + + var json = collection.toJson(); + for (var key in ['type', 'geometries']) { + expect(json.keys, contains(key)); + } }); test('Feature', () { var geoJSON = { - 'type': GeoJSONObjectTypes.feature, + 'type': GeoJSONObjectType.feature, 'geometry': null, }; var feature = Feature.fromJson(geoJSON); - expect(feature.type, GeoJSONObjectTypes.feature); + expect(feature.type, GeoJSONObjectType.feature); expect(feature.id, isNull); // kind of unnecessary expect(feature.geometry, isNull); + + feature.id = 1; + feature.geometry = Point(coordinates: Position(11, 49)); + + var json = feature.toJson(); + for (var key in ['id', 'type', 'geometry', 'properties']) { + expect(json.keys, contains(key)); + } + + expect(feature, feature.clone()); }); - test('GeometryCollection', () { + test('FeatureCollection', () { var geoJSON = { - 'type': GeoJSONObjectTypes.featureCollection, + 'type': GeoJSONObjectType.featureCollection, 'features': null, }; var collection = FeatureCollection.fromJson(geoJSON); - expect(collection.type, GeoJSONObjectTypes.featureCollection); + expect(collection.type, GeoJSONObjectType.featureCollection); expect(collection.features, isNotNull); // kind of unnecessary expect(collection.features, isA()); expect(collection.features, isEmpty); + + var json = collection.toJson(); + + for (var key in ['type', 'features']) { + expect(json.keys, contains(key)); + } + }); + + test('GeoJSONObject and GeometryObject.deserialize enum test', () { + final geoJSON = + GeometryCollection(geometries: [Point(coordinates: Position(1, 1, 1))]); + + final collection = GeometryObject.deserialize(geoJSON.toJson()); + expect(collection, isA()); + expect(collection.type, GeoJSONObjectType.geometryCollection); + expect((collection as GeometryCollection).geometries.first.type, + GeoJSONObjectType.point); + + final geoJSON2 = { + "type": GeoJSONObjectType.geometryCollection, + "geometries": [ + { + "type": GeoJSONObjectType.point, + "coordinates": [1, 1, 1] + } + ] + }; + + final collection2 = GeometryObject.deserialize(geoJSON2); + + expect(collection2, isA()); + expect(collection2.type, GeoJSONObjectType.geometryCollection); + expect((collection2 as GeometryCollection).geometries.first.type, + GeoJSONObjectType.point); + + var collection3 = GeoJSONObject.fromJson(geoJSON2); + + expect(collection3, isA()); + expect(collection3.type, GeoJSONObjectType.geometryCollection); + expect((collection3 as GeometryCollection).geometries.first.type, + GeoJSONObjectType.point); + + var geoJSON3 = { + "type": GeoJSONObjectType.geometryCollection, + "geometries": [ + {"type": GeoJSONObjectType.feature, "id": 1} + ] + }; + expect(() => GeometryType.deserialize(geoJSON3), throwsA(isA())); + }); + + test('.clone()', () { + final coll = FeatureCollection( + bbox: BBox(100, 0, 101, 1), + features: [ + Feature( + bbox: BBox(100, 0, 101, 1), + geometry: GeometryCollection( + bbox: BBox(100, 0, 101, 1), + geometries: [ + LineString( + bbox: BBox(100, 0, 101, 1), + coordinates: [Position(100, 0), Position(101, 1)], + ), + MultiLineString.fromLineStrings( + bbox: BBox(100, 0, 101, 1), + lineStrings: [ + LineString( + bbox: BBox(100, 0, 101, 1), + coordinates: [Position(100, 0), Position(101, 1)], + ), + LineString( + bbox: BBox(100, 0, 101, 1), + coordinates: [Position(100, 1), Position(101, 0)], + ), + ], + ), + MultiPoint.fromPoints( + bbox: BBox(100, 0, 101, 1), + points: [ + Point(coordinates: Position(100, 0)), + Point(coordinates: Position(100.5, 0.5)), + Point(coordinates: Position(101, 1)), + ], + ), + Polygon( + bbox: BBox(100, 0, 101, 1), + coordinates: [ + [ + Position(100, 0), + Position(100, 1), + Position(101, 0), + ] + ], + ), + MultiPolygon.fromPolygons( + bbox: BBox(100, 0, 101, 1), + polygons: [ + Polygon(coordinates: [ + [ + Position(100, 0), + Position(100, 1), + Position(101, 0), + ] + ]), + Polygon(coordinates: [ + [ + Position(100, 0), + Position(100, 1), + Position(101, 0), + ] + ]) + ], + ), + ], + ), + id: 1, + properties: {"key": "val"}), + ], + ); + final cloned = coll.clone(); + final feat = cloned.features.first; + final bbox = BBox(100, 0, 101, 1); + expect(cloned.bbox, bbox); + expect(feat.id, 1); + expect(feat.bbox, bbox); + expect(feat.properties!.keys.first, "key"); + expect(feat.properties!.values.first, "val"); + expect(feat.geometry!, isA()); + final geomColl = feat.geometry!; + expect(geomColl.geometries.length, + coll.features.first.geometry!.geometries.length); + for (var geom in geomColl.geometries) { + expect(geom.bbox, isNotNull); + expect(geom.coordinates, isNotEmpty); + + _expandRecursively(List inner) { + if (inner is List) { + return inner; + } else { + return inner.expand((el) => el is List ? _expandRecursively(el) : el); + } + } + + var expanded = _expandRecursively(geom.coordinates); + expect( + expanded.first, + Position(100, 0), + ); + } + // TODO refine tests + }); + + final points = [ + Point(coordinates: Position(1, 2, 3)), + Point(coordinates: Position(2, 1, 3)), + Point(coordinates: Position(3, 2, 1)), + ]; + test('MultiPoint.fromPoints', () { + var a = MultiPoint.fromPoints(points: points); + expect(a.coordinates.first, Position(1, 2, 3)); + expect(() => MultiPoint.fromPoints(points: []), + throwsA(isA())); + }); + test('LineString.fromPoints', () { + var a = LineString.fromPoints(points: points); + expect(a.coordinates.first, Position(1, 2, 3)); + expect(() => LineString.fromPoints(points: []), + throwsA(isA())); + }); + test('MultiLineString.fromLineStrings', () { + var a = MultiLineString.fromLineStrings(lineStrings: [ + LineString.fromPoints(points: points), + LineString.fromPoints(points: points) + ]); + expect(a.coordinates.first.first, Position(1, 2, 3)); + expect(() => MultiLineString.fromLineStrings(lineStrings: []), + throwsA(isA())); + }); + test('Polygon.fromPoints', () { + var a = Polygon.fromPoints(points: [points]); + expect(a.coordinates.first.first, Position(1, 2, 3)); + expect( + () => Polygon.fromPoints(points: []), throwsA(isA())); + }); + test('MultiPolygon.fromPolygons', () { + var a = MultiPolygon.fromPolygons(polygons: [ + Polygon.fromPoints(points: [points]), + Polygon.fromPoints(points: [points]) + ]); + expect(a.coordinates.first.first.first, Position(1, 2, 3)); + expect(() => MultiPolygon.fromPolygons(polygons: []), + throwsA(isA())); + }); + +// examples +// copied from RFC 7946 https://datatracker.ietf.org/doc/html/rfc7946 +// copied from Wikipedia https://en.wikipedia.org/wiki/GeoJSON#Geometries + group('Example file', () { + var dir = Directory('./test/examples'); + for (var file in dir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test(file.path, () { + var source = (file).readAsStringSync(); + var json = jsonDecode(source); + GeoJSONObject.fromJson(json); + }); + } + } }); } diff --git a/test/components/helpers_test.dart b/test/components/helpers_test.dart index 7a7fcf27..aa76ac32 100644 --- a/test/components/helpers_test.dart +++ b/test/components/helpers_test.dart @@ -52,9 +52,7 @@ main() { expect(round(123.123, 1), equals(123.1)); expect(round(123.5), equals(124)); - // TODO how to test these expected throw tests - // t.throws(() => round(34.5, 'precision'), 'invalid precision'); - // t.throws(() => round(34.5, -5), 'invalid precision'); + expect(() => round(34.5, -5), throwsA(isException)); }); test('convertLength', () { diff --git a/test/examples/bbox/geometryCollection.geojson b/test/examples/bbox/geometryCollection.geojson new file mode 100644 index 00000000..2517b55b --- /dev/null +++ b/test/examples/bbox/geometryCollection.geojson @@ -0,0 +1,18 @@ +{ + "type": "GeometryCollection", + "bbox": [ + 100.0, + 0.0, + 100.0, + 0.0 + ], + "geometries": [ + { + "type": "Point", + "coordinates": [ + 100.0, + 0.0 + ] + } + ] +} \ No newline at end of file diff --git a/test/examples/bbox/lineString.geojson b/test/examples/bbox/lineString.geojson new file mode 100644 index 00000000..da3a2a44 --- /dev/null +++ b/test/examples/bbox/lineString.geojson @@ -0,0 +1,19 @@ +{ + "type": "LineString", + "coordinates": [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 1.0 + ] + ], + "bbox": [ + 100.0, + 0.0, + 101.0, + 1.0 + ] +} \ No newline at end of file diff --git a/test/examples/bbox/multiLineString.geojson b/test/examples/bbox/multiLineString.geojson new file mode 100644 index 00000000..8b5d0353 --- /dev/null +++ b/test/examples/bbox/multiLineString.geojson @@ -0,0 +1,31 @@ +{ + "type": "MultiLineString", + "coordinates": [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 1.0 + ] + ], + [ + [ + 102.0, + 2.0 + ], + [ + 103.0, + 3.0 + ] + ] + ], + "bbox": [ + 100.0, + 0.0, + 103.0, + 3.0 + ] +} \ No newline at end of file diff --git a/test/examples/bbox/multiPoint.geojson b/test/examples/bbox/multiPoint.geojson new file mode 100644 index 00000000..c366a13c --- /dev/null +++ b/test/examples/bbox/multiPoint.geojson @@ -0,0 +1,19 @@ +{ + "type": "MultiPoint", + "coordinates": [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 1.0 + ] + ], + "bbox": [ + 100.0, + 0.0, + 101.0, + 1.0 + ] +} \ No newline at end of file diff --git a/test/examples/bbox/multiPolygon.geojson b/test/examples/bbox/multiPolygon.geojson new file mode 100644 index 00000000..d7cd0403 --- /dev/null +++ b/test/examples/bbox/multiPolygon.geojson @@ -0,0 +1,35 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 0.0 + ], + [ + 101.0, + 1.0 + ], + [ + 100.0, + 1.0 + ], + [ + 100.0, + 0.0 + ] + ] + ] + ], + "bbox": [ + 100.0, + 0.0, + 101.0, + 1.0 + ] +} \ No newline at end of file diff --git a/test/examples/bbox/point.geojson b/test/examples/bbox/point.geojson new file mode 100644 index 00000000..aac78467 --- /dev/null +++ b/test/examples/bbox/point.geojson @@ -0,0 +1,13 @@ +{ + "type": "Point", + "coordinates": [ + 100.0, + 0.0 + ], + "bbox": [ + 100.0, + 0.0, + 100.0, + 0.0 + ] +} \ No newline at end of file diff --git a/test/examples/bbox/polygon.geojson b/test/examples/bbox/polygon.geojson new file mode 100644 index 00000000..71576bc4 --- /dev/null +++ b/test/examples/bbox/polygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 0.0 + ], + [ + 101.0, + 1.0 + ], + [ + 100.0, + 1.0 + ], + [ + 100.0, + 0.0 + ] + ] + ], + "bbox": [ + 100.0, + 0.0, + 101.0, + 1.0 + ] +} \ No newline at end of file diff --git a/test/examples/lukas-h/germany-states.geojson b/test/examples/lukas-h/germany-states.geojson new file mode 100644 index 00000000..33209016 --- /dev/null +++ b/test/examples/lukas-h/germany-states.geojson @@ -0,0 +1,87426 @@ +{ + "type": "FeatureCollection", + "crs": { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }, + "source": "© GeoBasis-DE / BKG 2013 (Daten verändert)", + "features": [ + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "10", + "AGS": "10", + "SDV_RS": "100410100100", + "GEN": "Saarland", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "nein", + "SN_L": "10", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEC", + "RS_0": "100000000000", + "AGS_0": "10000000", + "WSK": "2009/01/01", + "DEBKG_ID": "DEBKGDL20000E5E3", + "destatis": { + "population": 989035, + "population_m": 482599, + "population_w": 506436 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.05907992086318, + 49.63047962017699 + ], + [ + 7.079629761683099, + 49.61208414983105 + ], + [ + 7.087674799035671, + 49.599583830039585 + ], + [ + 7.092991730283482, + 49.6035891003749 + ], + [ + 7.100635229561268, + 49.602432886120624 + ], + [ + 7.100158923560518, + 49.60568291912356 + ], + [ + 7.104798796543287, + 49.599027722023045 + ], + [ + 7.11840359441012, + 49.59598284374442 + ], + [ + 7.138657458292731, + 49.59731983104412 + ], + [ + 7.149309143763702, + 49.60367878264904 + ], + [ + 7.165443875921116, + 49.59705048505801 + ], + [ + 7.173713123775603, + 49.59906817100776 + ], + [ + 7.173454037387954, + 49.585084161203554 + ], + [ + 7.182141109660593, + 49.58265593022628 + ], + [ + 7.188373828512232, + 49.57566152687335 + ], + [ + 7.209999246566887, + 49.577148722940734 + ], + [ + 7.21400663874978, + 49.57445572358418 + ], + [ + 7.209758738106516, + 49.56817259107611 + ], + [ + 7.213352544836279, + 49.56584581258895 + ], + [ + 7.224401128431836, + 49.56483394644926 + ], + [ + 7.240829448927149, + 49.56897409946413 + ], + [ + 7.240775067388396, + 49.57322287952385 + ], + [ + 7.25257632307865, + 49.57398589229722 + ], + [ + 7.261341656542731, + 49.58317931296571 + ], + [ + 7.268704011958365, + 49.58408342405493 + ], + [ + 7.26210092822442, + 49.57361086992834 + ], + [ + 7.267481188695947, + 49.56387761537453 + ], + [ + 7.274861975850555, + 49.56056769752468 + ], + [ + 7.276437983280056, + 49.53801983321631 + ], + [ + 7.302014890756137, + 49.534812135127446 + ], + [ + 7.299706059580689, + 49.5295580060396 + ], + [ + 7.309871873370337, + 49.523220517830126 + ], + [ + 7.301048505902334, + 49.51796833496552 + ], + [ + 7.301645340061919, + 49.52163039139466 + ], + [ + 7.29711442434912, + 49.522893214970196 + ], + [ + 7.285688643866942, + 49.516906606113864 + ], + [ + 7.289313940606124, + 49.51252672933901 + ], + [ + 7.282771731305494, + 49.5105112823312 + ], + [ + 7.282009466637337, + 49.505807170437016 + ], + [ + 7.287066779382975, + 49.49906281903446 + ], + [ + 7.278135696870785, + 49.48427479434177 + ], + [ + 7.296841236680834, + 49.483549654130364 + ], + [ + 7.304825738910357, + 49.472445942119435 + ], + [ + 7.301092942893403, + 49.46668537482914 + ], + [ + 7.286269749971936, + 49.460077801407635 + ], + [ + 7.286927387036537, + 49.45768940858334 + ], + [ + 7.246437659795413, + 49.44551838260801 + ], + [ + 7.255328278160143, + 49.44059740329297 + ], + [ + 7.250246332356223, + 49.43517793327229 + ], + [ + 7.260958404781076, + 49.423622182465664 + ], + [ + 7.272788930019588, + 49.42421313880991 + ], + [ + 7.290070228949014, + 49.41470528896861 + ], + [ + 7.297219221321524, + 49.40458100554107 + ], + [ + 7.294242900391509, + 49.4010116936649 + ], + [ + 7.298941266079032, + 49.39851936391589 + ], + [ + 7.289656049223006, + 49.393293756373666 + ], + [ + 7.289341252004654, + 49.38881434838944 + ], + [ + 7.301944976607358, + 49.3894023723917 + ], + [ + 7.317753007506242, + 49.38139681519596 + ], + [ + 7.331358268664442, + 49.37885010492474 + ], + [ + 7.355817014270639, + 49.37977014508577 + ], + [ + 7.354843745799917, + 49.37442171973794 + ], + [ + 7.36910657123725, + 49.373982567250216 + ], + [ + 7.366870347757815, + 49.36318744998668 + ], + [ + 7.39589869312965, + 49.37204605638621 + ], + [ + 7.401321109057705, + 49.3705186871392 + ], + [ + 7.402075304765583, + 49.367718653262386 + ], + [ + 7.393351927168817, + 49.363479166214034 + ], + [ + 7.402625116195726, + 49.35620933662573 + ], + [ + 7.39088729897441, + 49.353439300193834 + ], + [ + 7.389888861131539, + 49.34983460057966 + ], + [ + 7.398667936005706, + 49.350493834053175 + ], + [ + 7.403773227675726, + 49.34611536815623 + ], + [ + 7.400526107358908, + 49.33769788189083 + ], + [ + 7.392801075442701, + 49.32826178237803 + ], + [ + 7.377726254304475, + 49.32039364701972 + ], + [ + 7.380800480593716, + 49.316630155535215 + ], + [ + 7.38553814077394, + 49.32045292402946 + ], + [ + 7.392396318938436, + 49.32067873304191 + ], + [ + 7.394494087056305, + 49.31635206094076 + ], + [ + 7.391883630277908, + 49.30959716831873 + ], + [ + 7.384016031913444, + 49.30995239975594 + ], + [ + 7.380675010121815, + 49.306736416081144 + ], + [ + 7.379984279246811, + 49.297601308482136 + ], + [ + 7.385427185441023, + 49.29412396478912 + ], + [ + 7.371695484969128, + 49.28091264986107 + ], + [ + 7.367012342630685, + 49.28308699049416 + ], + [ + 7.365326613804555, + 49.27812410908538 + ], + [ + 7.355823222308884, + 49.2837197161389 + ], + [ + 7.334463167126713, + 49.278284891034126 + ], + [ + 7.343505859961747, + 49.27428073443731 + ], + [ + 7.344019294010748, + 49.2704416768704 + ], + [ + 7.339081373821192, + 49.26392833118485 + ], + [ + 7.324858097269497, + 49.25746299147824 + ], + [ + 7.32778535364219, + 49.25456123616786 + ], + [ + 7.324554151910612, + 49.24814168322125 + ], + [ + 7.315898347496628, + 49.25148763092178 + ], + [ + 7.31218899502186, + 49.25702759615758 + ], + [ + 7.306515068977814, + 49.256140381032694 + ], + [ + 7.30346386862242, + 49.24549798080273 + ], + [ + 7.289132351046915, + 49.23782113535616 + ], + [ + 7.294503601356786, + 49.23470803860162 + ], + [ + 7.288958157907315, + 49.23059512117974 + ], + [ + 7.30400430917686, + 49.22211313175242 + ], + [ + 7.298277379272484, + 49.21402320207364 + ], + [ + 7.301284782108647, + 49.2094780565057 + ], + [ + 7.295756776160004, + 49.20534678830758 + ], + [ + 7.303538079256505, + 49.20576894362746 + ], + [ + 7.321208562734714, + 49.18851722539237 + ], + [ + 7.338485201986057, + 49.18443212361741 + ], + [ + 7.335878083265443, + 49.17586662395059 + ], + [ + 7.34312213673194, + 49.17300969223593 + ], + [ + 7.350148373053672, + 49.1628381862081 + ], + [ + 7.361174199105841, + 49.16129978461631 + ], + [ + 7.362667862913293, + 49.15838864591025 + ], + [ + 7.366543352138307, + 49.1619092094645 + ], + [ + 7.368755429880469, + 49.16145787945659 + ], + [ + 7.361379421746009, + 49.15341903687698 + ], + [ + 7.362726494603955, + 49.14314834086812 + ], + [ + 7.329849690270194, + 49.144770522382544 + ], + [ + 7.321358334097237, + 49.14138779246926 + ], + [ + 7.293176904617226, + 49.11490732859595 + ], + [ + 7.282359063300311, + 49.11691072910141 + ], + [ + 7.281587015524895, + 49.12437022235577 + ], + [ + 7.26567956651014, + 49.12265135873758 + ], + [ + 7.245054159531405, + 49.130110742674 + ], + [ + 7.205482222087646, + 49.12361261607363 + ], + [ + 7.198041277327041, + 49.11516663982295 + ], + [ + 7.19630775494592, + 49.12165216815619 + ], + [ + 7.185470340951347, + 49.13123599082445 + ], + [ + 7.17670411233677, + 49.128229988212155 + ], + [ + 7.165057994830442, + 49.1285950205438 + ], + [ + 7.156716978914345, + 49.121018713384814 + ], + [ + 7.135600021638882, + 49.12840498573067 + ], + [ + 7.125784822549989, + 49.14189549965326 + ], + [ + 7.104057406333192, + 49.138389929699606 + ], + [ + 7.103603519111173, + 49.14545513687438 + ], + [ + 7.113235131703721, + 49.15196245608043 + ], + [ + 7.101068796233307, + 49.15599779822758 + ], + [ + 7.094819353252567, + 49.15270618695481 + ], + [ + 7.082181497298056, + 49.15206399981787 + ], + [ + 7.082077409554523, + 49.141854495629914 + ], + [ + 7.089395859475994, + 49.13018462974387 + ], + [ + 7.071819570377523, + 49.124330289446526 + ], + [ + 7.066605204144926, + 49.11424659352274 + ], + [ + 7.052445915528028, + 49.11275784350061 + ], + [ + 7.04433385565126, + 49.119918413031556 + ], + [ + 7.046668377730558, + 49.13693705634956 + ], + [ + 7.032273307478246, + 49.15652667329003 + ], + [ + 7.03303393442346, + 49.16362629207446 + ], + [ + 7.027733019165868, + 49.1701332267127 + ], + [ + 7.035012738037155, + 49.19141608823808 + ], + [ + 7.023326272720788, + 49.18918992443749 + ], + [ + 7.021464592648905, + 49.193140480430586 + ], + [ + 7.010752729174675, + 49.18795310189458 + ], + [ + 7.008901224229477, + 49.19397384930585 + ], + [ + 6.999481067054353, + 49.194463549557994 + ], + [ + 6.975231047043255, + 49.20945394501631 + ], + [ + 6.959603755097986, + 49.20309016325758 + ], + [ + 6.939880057820464, + 49.21668534442716 + ], + [ + 6.938108244156182, + 49.222433997942716 + ], + [ + 6.918713710110121, + 49.22272069632233 + ], + [ + 6.911530296550559, + 49.215061408300485 + ], + [ + 6.90052713245729, + 49.21366413667707 + ], + [ + 6.893345431907566, + 49.20914674946051 + ], + [ + 6.873165701179729, + 49.214826948504005 + ], + [ + 6.870432112916215, + 49.218809202034365 + ], + [ + 6.858873331963365, + 49.22275744649583 + ], + [ + 6.837990973830569, + 49.21349475880927 + ], + [ + 6.83629146973076, + 49.21125976392658 + ], + [ + 6.852169337059966, + 49.20000651232278 + ], + [ + 6.850496826331342, + 49.193413085913804 + ], + [ + 6.861767510471936, + 49.17883932080245 + ], + [ + 6.858995929447094, + 49.17461561466918 + ], + [ + 6.844397281556631, + 49.173057141533484 + ], + [ + 6.847517680949569, + 49.157157887235726 + ], + [ + 6.834056611041427, + 49.15108044424923 + ], + [ + 6.782724080685033, + 49.16815887055128 + ], + [ + 6.761093120158069, + 49.164744831175625 + ], + [ + 6.749814809498985, + 49.16671855256441 + ], + [ + 6.738600535816476, + 49.16367513061993 + ], + [ + 6.720324125187342, + 49.17531962987969 + ], + [ + 6.711208355731132, + 49.18834183554444 + ], + [ + 6.731444702856653, + 49.205956730691625 + ], + [ + 6.723465468897387, + 49.21882923371738 + ], + [ + 6.719738944587734, + 49.221108526184615 + ], + [ + 6.695824978938567, + 49.21527431064881 + ], + [ + 6.688635171695081, + 49.22214547772464 + ], + [ + 6.690619138838695, + 49.23108896276938 + ], + [ + 6.685316731866774, + 49.24096090873937 + ], + [ + 6.689998942937052, + 49.24955550103404 + ], + [ + 6.675631286172177, + 49.25758781569905 + ], + [ + 6.664305242253785, + 49.25445393034203 + ], + [ + 6.661415407772507, + 49.25807518063167 + ], + [ + 6.66776430638508, + 49.27096552640199 + ], + [ + 6.665925918644571, + 49.27692872880287 + ], + [ + 6.67016601516973, + 49.280253664471125 + ], + [ + 6.660114893994734, + 49.283665914920356 + ], + [ + 6.653369677155604, + 49.28123722379757 + ], + [ + 6.65038979779277, + 49.288530318494054 + ], + [ + 6.644143893945843, + 49.289829329973784 + ], + [ + 6.638798766154197, + 49.295680830169275 + ], + [ + 6.632014546838795, + 49.29578069574029 + ], + [ + 6.622358763879233, + 49.3031314211582 + ], + [ + 6.61510568402309, + 49.301349492823704 + ], + [ + 6.589121277715549, + 49.322058175714126 + ], + [ + 6.595595500555327, + 49.33005725539515 + ], + [ + 6.591163576940379, + 49.336244931963776 + ], + [ + 6.578393298218639, + 49.33496239033743 + ], + [ + 6.575694631216737, + 49.34166942962195 + ], + [ + 6.565663992061495, + 49.34765170205639 + ], + [ + 6.563621364644949, + 49.355912945042704 + ], + [ + 6.574056386497206, + 49.35866492393779 + ], + [ + 6.588416577972048, + 49.34988332701823 + ], + [ + 6.602158867869925, + 49.367108761951734 + ], + [ + 6.594520046183388, + 49.37157452227303 + ], + [ + 6.583148258344839, + 49.368422611074514 + ], + [ + 6.586653315464704, + 49.385146893484176 + ], + [ + 6.580281949408064, + 49.3854981037816 + ], + [ + 6.576793270458128, + 49.38979420242679 + ], + [ + 6.563587425318949, + 49.38810123808486 + ], + [ + 6.560106396295812, + 49.392508338896384 + ], + [ + 6.552250961416568, + 49.39421494227714 + ], + [ + 6.552100050951196, + 49.3999030765499 + ], + [ + 6.54081918294924, + 49.40125072628611 + ], + [ + 6.538675782905703, + 49.41220460496457 + ], + [ + 6.557387785963111, + 49.41952896434712 + ], + [ + 6.550815843114264, + 49.4253795233496 + ], + [ + 6.539413464721544, + 49.43372387454664 + ], + [ + 6.524845865638805, + 49.435397660107874 + ], + [ + 6.499367436077157, + 49.45038352657215 + ], + [ + 6.48628804511413, + 49.45162108908717 + ], + [ + 6.464606733075098, + 49.466369785063435 + ], + [ + 6.455656708316543, + 49.46267944388159 + ], + [ + 6.443146293749013, + 49.468171644049704 + ], + [ + 6.440549722727125, + 49.466709747351906 + ], + [ + 6.429131061462989, + 49.47624050646525 + ], + [ + 6.420440524495235, + 49.47642026920409 + ], + [ + 6.408417944308016, + 49.46776760385338 + ], + [ + 6.393405393919588, + 49.46405012185513 + ], + [ + 6.379906877965316, + 49.46621537037254 + ], + [ + 6.375013346146041, + 49.464126247838365 + ], + [ + 6.367083525756905, + 49.46951204803504 + ], + [ + 6.367520106854722, + 49.50273031604305 + ], + [ + 6.356994234816737, + 49.531294163874115 + ], + [ + 6.380052619918113, + 49.5511047703289 + ], + [ + 6.393914488991348, + 49.5474474937609 + ], + [ + 6.41090556809256, + 49.547081731639295 + ], + [ + 6.414320321026461, + 49.543259004304396 + ], + [ + 6.430297760734658, + 49.54896277179499 + ], + [ + 6.444061519580507, + 49.54293501986909 + ], + [ + 6.449320519213901, + 49.54394374076499 + ], + [ + 6.452683238192655, + 49.5384062688611 + ], + [ + 6.467921554406391, + 49.54436640673323 + ], + [ + 6.494120576207376, + 49.5306228032428 + ], + [ + 6.514926785861261, + 49.535080219998044 + ], + [ + 6.517436953821706, + 49.527547010549895 + ], + [ + 6.525210028271866, + 49.529442708234285 + ], + [ + 6.538553917664188, + 49.539452526121984 + ], + [ + 6.554750563694194, + 49.53596355848536 + ], + [ + 6.563963086135309, + 49.540557588250046 + ], + [ + 6.57828873886074, + 49.530128459063825 + ], + [ + 6.579728725171209, + 49.52218767735905 + ], + [ + 6.588431339114862, + 49.517471818063505 + ], + [ + 6.604679365624632, + 49.51725917878175 + ], + [ + 6.610318092296231, + 49.52108416452824 + ], + [ + 6.60632395903154, + 49.52799115951089 + ], + [ + 6.620140302571658, + 49.52896245880778 + ], + [ + 6.617884691117428, + 49.535916246951096 + ], + [ + 6.632775018230518, + 49.54190342328535 + ], + [ + 6.641104266576084, + 49.540238869740264 + ], + [ + 6.641348977299989, + 49.537752926721524 + ], + [ + 6.645950747264273, + 49.53914295068733 + ], + [ + 6.652469592655919, + 49.551157821282665 + ], + [ + 6.658208590938328, + 49.54394727600996 + ], + [ + 6.664114863251428, + 49.54273708000114 + ], + [ + 6.68348035537788, + 49.54843580348675 + ], + [ + 6.690446748718792, + 49.5352039011918 + ], + [ + 6.699963458834477, + 49.541199762251054 + ], + [ + 6.708582332271993, + 49.5533080939552 + ], + [ + 6.734255747838774, + 49.560301551800954 + ], + [ + 6.74205117407917, + 49.55740504656656 + ], + [ + 6.754185942678117, + 49.56026171664291 + ], + [ + 6.767500049782122, + 49.56904365745397 + ], + [ + 6.778155802611604, + 49.57022395039614 + ], + [ + 6.798208284212829, + 49.58634882504196 + ], + [ + 6.813441977512877, + 49.59199911721882 + ], + [ + 6.835420960914697, + 49.582931923033605 + ], + [ + 6.840025349499227, + 49.58738665548862 + ], + [ + 6.839124255278359, + 49.59263577231034 + ], + [ + 6.846006329811665, + 49.58961585298224 + ], + [ + 6.857205794013715, + 49.60518165160796 + ], + [ + 6.866435190991229, + 49.608659749692364 + ], + [ + 6.879560671639474, + 49.601171027353935 + ], + [ + 6.882599488247342, + 49.60843798130881 + ], + [ + 6.889807970526877, + 49.60628296302325 + ], + [ + 6.885480988668908, + 49.61094790494833 + ], + [ + 6.891445252065861, + 49.61628661672013 + ], + [ + 6.906315168424979, + 49.614139129797344 + ], + [ + 6.92142947393043, + 49.61666304950483 + ], + [ + 6.929578000774868, + 49.61243520760287 + ], + [ + 6.927691850394199, + 49.61829409294067 + ], + [ + 6.935012569038161, + 49.61597392143468 + ], + [ + 6.937776297924613, + 49.61773760649415 + ], + [ + 6.932763025853745, + 49.63102683364483 + ], + [ + 6.940917230464752, + 49.63492246257687 + ], + [ + 6.948612308470078, + 49.63512827549991 + ], + [ + 6.951395186680251, + 49.62511900769588 + ], + [ + 6.958836207543808, + 49.630783286152486 + ], + [ + 6.966810451376769, + 49.630393171345055 + ], + [ + 6.97507871224605, + 49.63540664226943 + ], + [ + 6.978399091413298, + 49.635888332606584 + ], + [ + 6.977676573669914, + 49.63271351662401 + ], + [ + 6.988892164690392, + 49.63293609784843 + ], + [ + 6.991534823681166, + 49.63546787362574 + ], + [ + 6.985963675698825, + 49.620731332539876 + ], + [ + 7.001023630476491, + 49.63088023547834 + ], + [ + 7.012397686298198, + 49.62835844141778 + ], + [ + 7.027980123329032, + 49.6394382862208 + ], + [ + 7.05907992086318, + 49.63047962017699 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "08", + "AGS": "08", + "SDV_RS": "081110000000", + "GEN": "Baden-Württemberg", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "08", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE1", + "RS_0": "080000000000", + "AGS_0": "08000000", + "WSK": "1997/01/01", + "DEBKG_ID": "DEBKGDL20000E603", + "destatis": { + "population": 10716644, + "population_m": 5284223, + "population_w": 5432421 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 9.651418612909339, + 49.78055704496921 + ], + [ + 9.644322198694672, + 49.77860965303989 + ], + [ + 9.651865836817151, + 49.766371739282285 + ], + [ + 9.637951868615318, + 49.7538507510153 + ], + [ + 9.645552783917086, + 49.746910388480295 + ], + [ + 9.638998493496299, + 49.74050685476654 + ], + [ + 9.646936205199102, + 49.739145263549304 + ], + [ + 9.645859593168419, + 49.736474001917884 + ], + [ + 9.638704962142723, + 49.73754455477605 + ], + [ + 9.636562795691587, + 49.73165311779079 + ], + [ + 9.627715246395352, + 49.73196330776036 + ], + [ + 9.641101794462536, + 49.72317627468847 + ], + [ + 9.633052601734569, + 49.71706895115755 + ], + [ + 9.62544912535249, + 49.70373673872044 + ], + [ + 9.63046300406233, + 49.70156507961062 + ], + [ + 9.632460374111815, + 49.6931860991694 + ], + [ + 9.648879733841465, + 49.69173610127887 + ], + [ + 9.65349645916717, + 49.687137201394094 + ], + [ + 9.67614790781558, + 49.69334726411841 + ], + [ + 9.67719387300892, + 49.71620121304938 + ], + [ + 9.695889204135428, + 49.7192233772688 + ], + [ + 9.70038158421551, + 49.716960895785206 + ], + [ + 9.700724817317578, + 49.7221456148922 + ], + [ + 9.709719303162661, + 49.72705805618026 + ], + [ + 9.719290824447736, + 49.701941708552745 + ], + [ + 9.728354246235295, + 49.698189050700044 + ], + [ + 9.728959636687225, + 49.68819756251651 + ], + [ + 9.739419988276882, + 49.68819070181467 + ], + [ + 9.745438072743069, + 49.691858719202926 + ], + [ + 9.7507882965222, + 49.69784471465719 + ], + [ + 9.752953959054741, + 49.7101218406804 + ], + [ + 9.771602621704837, + 49.720109572019396 + ], + [ + 9.786755849162768, + 49.72184658490265 + ], + [ + 9.793729772096325, + 49.73136145672367 + ], + [ + 9.79999375793532, + 49.73094323894178 + ], + [ + 9.796073403973287, + 49.72708703753931 + ], + [ + 9.797793205077108, + 49.71963024151037 + ], + [ + 9.821427220046921, + 49.70973359244938 + ], + [ + 9.823358965554926, + 49.704669849516456 + ], + [ + 9.82816056915509, + 49.70645384714673 + ], + [ + 9.831804629418135, + 49.70380331719699 + ], + [ + 9.836147407777442, + 49.691740750680914 + ], + [ + 9.830327936355959, + 49.68745635888655 + ], + [ + 9.840933845540423, + 49.681616637064174 + ], + [ + 9.829946964140863, + 49.68101239592722 + ], + [ + 9.822358443793497, + 49.6647100825669 + ], + [ + 9.832495186149197, + 49.66041584302011 + ], + [ + 9.829400800820006, + 49.659695819133404 + ], + [ + 9.833814044013089, + 49.65628511004163 + ], + [ + 9.829559007429177, + 49.65435269506291 + ], + [ + 9.834673916362785, + 49.64629481456101 + ], + [ + 9.85541090607662, + 49.64148458138062 + ], + [ + 9.864120230639756, + 49.62146091504991 + ], + [ + 9.867509196313422, + 49.62131939575758 + ], + [ + 9.868045003446786, + 49.61117423895486 + ], + [ + 9.872808264217106, + 49.61007617040476 + ], + [ + 9.85993258465434, + 49.60801582484307 + ], + [ + 9.85946011695623, + 49.60298407010977 + ], + [ + 9.841046741746936, + 49.59514126929463 + ], + [ + 9.84786775691031, + 49.577052797918924 + ], + [ + 9.840557790699934, + 49.574479685416016 + ], + [ + 9.836995639148029, + 49.56890171649642 + ], + [ + 9.810230151150318, + 49.55731602125376 + ], + [ + 9.817997679116548, + 49.558613668093294 + ], + [ + 9.81799237056124, + 49.55588778011925 + ], + [ + 9.82804003825022, + 49.55159090529486 + ], + [ + 9.840564908526567, + 49.55069351449189 + ], + [ + 9.849911875471733, + 49.54576589872484 + ], + [ + 9.859309914127925, + 49.54604448445355 + ], + [ + 9.860457299386107, + 49.55351509092038 + ], + [ + 9.866639552616773, + 49.55746313201531 + ], + [ + 9.864550355559732, + 49.567881415747 + ], + [ + 9.874058697526612, + 49.57169497850081 + ], + [ + 9.875725005751429, + 49.57863147098388 + ], + [ + 9.893524694180108, + 49.583523453962336 + ], + [ + 9.898791276106873, + 49.58834669526389 + ], + [ + 9.901830927663568, + 49.58541196926742 + ], + [ + 9.912438199701592, + 49.58590840181786 + ], + [ + 9.915721194570782, + 49.58222786881854 + ], + [ + 9.906140853896074, + 49.577094971068526 + ], + [ + 9.898204855620286, + 49.5623798376243 + ], + [ + 9.920848873545804, + 49.56328080615484 + ], + [ + 9.924484221420308, + 49.56116723018863 + ], + [ + 9.92073339470839, + 49.553402194895625 + ], + [ + 9.925785400163255, + 49.55372306496283 + ], + [ + 9.926961113404747, + 49.549520530773776 + ], + [ + 9.920725245812589, + 49.551012274356815 + ], + [ + 9.920181961487387, + 49.54512541636221 + ], + [ + 9.927050474151264, + 49.536077300067234 + ], + [ + 9.923814994020082, + 49.52412139353586 + ], + [ + 9.918395299399036, + 49.522379822299925 + ], + [ + 9.916959262740981, + 49.51780230499668 + ], + [ + 9.9251292888582, + 49.50865009264166 + ], + [ + 9.913740586223174, + 49.493252989138355 + ], + [ + 9.926561179604287, + 49.48483546107638 + ], + [ + 9.951881740495237, + 49.48036425404729 + ], + [ + 9.97402362316156, + 49.4858223095545 + ], + [ + 9.975210373495921, + 49.48085298739023 + ], + [ + 9.99200636724019, + 49.48640294033842 + ], + [ + 10.01011843401845, + 49.483213958351676 + ], + [ + 10.020790169583181, + 49.48614751609398 + ], + [ + 10.027794006842104, + 49.504070274714365 + ], + [ + 10.046235533147826, + 49.50697967303831 + ], + [ + 10.052403774124352, + 49.5106747098984 + ], + [ + 10.051520203180944, + 49.51441601463474 + ], + [ + 10.056145910801199, + 49.51494530650538 + ], + [ + 10.05718463948679, + 49.519318579353225 + ], + [ + 10.040019271114813, + 49.529010433980716 + ], + [ + 10.061367726568148, + 49.53746825170943 + ], + [ + 10.057105076028032, + 49.54068132807665 + ], + [ + 10.061730829983867, + 49.54164927917807 + ], + [ + 10.061427506118283, + 49.54513845487393 + ], + [ + 10.0855198719157, + 49.54221400297515 + ], + [ + 10.089598028509144, + 49.530521244585174 + ], + [ + 10.079052669745387, + 49.527461738397015 + ], + [ + 10.08064160718088, + 49.52119589269297 + ], + [ + 10.076885757835816, + 49.51988287444617 + ], + [ + 10.084146564660216, + 49.5117588641704 + ], + [ + 10.10571754027477, + 49.515105816682414 + ], + [ + 10.108475105153817, + 49.51147678587876 + ], + [ + 10.121323095077363, + 49.51104620481235 + ], + [ + 10.120859798581126, + 49.50727289981458 + ], + [ + 10.115364093765383, + 49.50695744222821 + ], + [ + 10.117116621977301, + 49.503742807509276 + ], + [ + 10.109812080994285, + 49.50169368622634 + ], + [ + 10.099991354559776, + 49.49172767905284 + ], + [ + 10.101243509227944, + 49.485641800399314 + ], + [ + 10.108102174232995, + 49.482853609514784 + ], + [ + 10.11071222209559, + 49.477623439161235 + ], + [ + 10.116088966850675, + 49.47857744192661 + ], + [ + 10.115118200213526, + 49.473959198106314 + ], + [ + 10.122251831673841, + 49.46390783931587 + ], + [ + 10.115844314040615, + 49.461300592700624 + ], + [ + 10.105487697613361, + 49.46323873536286 + ], + [ + 10.108231467257488, + 49.46020766998641 + ], + [ + 10.097826625704792, + 49.45701059556448 + ], + [ + 10.094741443537172, + 49.44789856821685 + ], + [ + 10.105708278065501, + 49.444815869476486 + ], + [ + 10.111758983646423, + 49.43874665619504 + ], + [ + 10.110624884955671, + 49.44250301986162 + ], + [ + 10.118781030305366, + 49.443898261297484 + ], + [ + 10.133705133115091, + 49.43714685845224 + ], + [ + 10.13810835067667, + 49.43312194631935 + ], + [ + 10.133620232923182, + 49.43200995897307 + ], + [ + 10.137427055733939, + 49.424717663271124 + ], + [ + 10.151680498063907, + 49.41229446213163 + ], + [ + 10.147652145008252, + 49.41075266043347 + ], + [ + 10.152217242862575, + 49.40101546398997 + ], + [ + 10.142063923058783, + 49.4039702477516 + ], + [ + 10.138638066788905, + 49.40309572194488 + ], + [ + 10.161698240225757, + 49.395493980584256 + ], + [ + 10.16121077783902, + 49.39035597739768 + ], + [ + 10.14640397836919, + 49.38743185175383 + ], + [ + 10.144924268661855, + 49.3844136455831 + ], + [ + 10.122258914500687, + 49.387713293406236 + ], + [ + 10.111966360277538, + 49.38491033159403 + ], + [ + 10.10731828526815, + 49.37878490767072 + ], + [ + 10.117413522555044, + 49.36902314587085 + ], + [ + 10.113373867925151, + 49.35994054619316 + ], + [ + 10.124555669364497, + 49.35613756199266 + ], + [ + 10.123719470956427, + 49.35081809471909 + ], + [ + 10.107615522897111, + 49.35169864481914 + ], + [ + 10.109087752656663, + 49.348456363820446 + ], + [ + 10.10295785180215, + 49.34378419629657 + ], + [ + 10.104846911230396, + 49.338411505840355 + ], + [ + 10.113086502315381, + 49.33577746208242 + ], + [ + 10.10795288923992, + 49.33229641484786 + ], + [ + 10.110636380158379, + 49.328968398897736 + ], + [ + 10.117468971792661, + 49.32912363100172 + ], + [ + 10.121334637891735, + 49.324956945044775 + ], + [ + 10.132711242825904, + 49.327743686543144 + ], + [ + 10.140101716876575, + 49.32557627177666 + ], + [ + 10.145247059640097, + 49.31649820818129 + ], + [ + 10.131680316159114, + 49.30512301514575 + ], + [ + 10.132298987536506, + 49.30031883734926 + ], + [ + 10.138413628321011, + 49.29202694150626 + ], + [ + 10.144107654838422, + 49.2901201063759 + ], + [ + 10.142379483554858, + 49.287649896730485 + ], + [ + 10.150171929163076, + 49.28829509661188 + ], + [ + 10.149895719282378, + 49.28467811240602 + ], + [ + 10.156620293956514, + 49.28075890825894 + ], + [ + 10.150681257075716, + 49.2806506530941 + ], + [ + 10.145388721967244, + 49.27491306440348 + ], + [ + 10.147428862494012, + 49.26854182797047 + ], + [ + 10.134156874380032, + 49.26222969747966 + ], + [ + 10.12663993151348, + 49.26238025002518 + ], + [ + 10.123560393368685, + 49.27096508917643 + ], + [ + 10.131392016838307, + 49.27508391287389 + ], + [ + 10.123625095207709, + 49.27499520116887 + ], + [ + 10.119550373491977, + 49.2669756656093 + ], + [ + 10.11397417962735, + 49.266407933740844 + ], + [ + 10.118701571998757, + 49.257869577964 + ], + [ + 10.109875036634046, + 49.258298030285566 + ], + [ + 10.133209340678837, + 49.25310543360947 + ], + [ + 10.11982908162641, + 49.24735797417799 + ], + [ + 10.1239890860103, + 49.24601370202885 + ], + [ + 10.127462295291304, + 49.22331249535168 + ], + [ + 10.13258984338711, + 49.21724870349171 + ], + [ + 10.138989004360239, + 49.21592538269336 + ], + [ + 10.140135950139605, + 49.208889741963745 + ], + [ + 10.125622454463091, + 49.21089314063028 + ], + [ + 10.130455046437584, + 49.20376708118073 + ], + [ + 10.124899273051641, + 49.19973685943683 + ], + [ + 10.130081142278904, + 49.19882757480987 + ], + [ + 10.129171664378294, + 49.1957212905339 + ], + [ + 10.13532454325376, + 49.20064374431422 + ], + [ + 10.142404979140583, + 49.195440428270814 + ], + [ + 10.156808452166771, + 49.19271495340792 + ], + [ + 10.153573664817108, + 49.188411658511114 + ], + [ + 10.166467833421976, + 49.179215671806304 + ], + [ + 10.171029492317365, + 49.178275682089556 + ], + [ + 10.181182663231416, + 49.18240668974667 + ], + [ + 10.177317878688163, + 49.17350865733903 + ], + [ + 10.186296970927378, + 49.17051571868305 + ], + [ + 10.188631111654175, + 49.174401466717825 + ], + [ + 10.187715569919948, + 49.17004369763938 + ], + [ + 10.1952440241054, + 49.16988889053508 + ], + [ + 10.192707093360697, + 49.16759726863199 + ], + [ + 10.200049891260438, + 49.160331318731544 + ], + [ + 10.196814396492854, + 49.15576223558174 + ], + [ + 10.205166969864212, + 49.15563160172595 + ], + [ + 10.20664772158294, + 49.15909029082929 + ], + [ + 10.21837911032891, + 49.16348984812764 + ], + [ + 10.21869104457522, + 49.15995688367546 + ], + [ + 10.228141118876069, + 49.15989024839039 + ], + [ + 10.230977046177225, + 49.15346815283298 + ], + [ + 10.238356838125762, + 49.1494874297077 + ], + [ + 10.248022910291846, + 49.14928110721375 + ], + [ + 10.255479653628933, + 49.138302641436894 + ], + [ + 10.251562751717431, + 49.13398570378018 + ], + [ + 10.25694731996055, + 49.129050426196144 + ], + [ + 10.252748772539121, + 49.129913725365334 + ], + [ + 10.25111113211268, + 49.12587148372616 + ], + [ + 10.225287850255533, + 49.1190561373429 + ], + [ + 10.229568828592807, + 49.117309929748586 + ], + [ + 10.22658035227439, + 49.11102707705675 + ], + [ + 10.215249857100297, + 49.11328348387377 + ], + [ + 10.215625560070615, + 49.106109204950435 + ], + [ + 10.206841425218187, + 49.101262958243474 + ], + [ + 10.208833170372731, + 49.09808406747216 + ], + [ + 10.204997648711412, + 49.09811900125143 + ], + [ + 10.21273107686484, + 49.09446931907781 + ], + [ + 10.222778543096537, + 49.09785861824168 + ], + [ + 10.22907001913913, + 49.089760921201325 + ], + [ + 10.250596709597069, + 49.092815123449654 + ], + [ + 10.24714540475334, + 49.079720347970365 + ], + [ + 10.241643574590043, + 49.07925805921483 + ], + [ + 10.24098427891099, + 49.082197738793184 + ], + [ + 10.23416989496196, + 49.07636232040267 + ], + [ + 10.235635729825237, + 49.07370342483265 + ], + [ + 10.245544908891368, + 49.07433931307447 + ], + [ + 10.257791425036025, + 49.07011080837805 + ], + [ + 10.263992966289706, + 49.061669289315404 + ], + [ + 10.256055946283578, + 49.061364445300995 + ], + [ + 10.25732847027712, + 49.05326325567823 + ], + [ + 10.251709391204265, + 49.04955423549085 + ], + [ + 10.255756684520229, + 49.044751162296954 + ], + [ + 10.250016794250664, + 49.04080795257531 + ], + [ + 10.252994971560135, + 49.03897972568797 + ], + [ + 10.26499009568884, + 49.04520267192498 + ], + [ + 10.277220932095542, + 49.0425204044392 + ], + [ + 10.277240661813817, + 49.0382391452633 + ], + [ + 10.284838754215617, + 49.03657532930641 + ], + [ + 10.288068407468502, + 49.03988815866738 + ], + [ + 10.284939365080147, + 49.04208579510155 + ], + [ + 10.292825651983144, + 49.04076052660915 + ], + [ + 10.294007324341354, + 49.04277743787391 + ], + [ + 10.300568132349978, + 49.04034069015014 + ], + [ + 10.302714057084172, + 49.03146930788488 + ], + [ + 10.30945568023092, + 49.031957695295134 + ], + [ + 10.320476555800207, + 49.02571592508206 + ], + [ + 10.328960582506017, + 49.02449701377205 + ], + [ + 10.32749023742205, + 49.030278059841784 + ], + [ + 10.333616422400244, + 49.026788577227336 + ], + [ + 10.332901137869701, + 49.03192323317631 + ], + [ + 10.336952049550193, + 49.02727018625706 + ], + [ + 10.350256584364432, + 49.0284220708075 + ], + [ + 10.350274854859256, + 49.022521874267 + ], + [ + 10.345197407283171, + 49.019384970275546 + ], + [ + 10.34543868014299, + 49.016633076135605 + ], + [ + 10.356091845159394, + 49.013509723373225 + ], + [ + 10.352157950840825, + 49.00600205054018 + ], + [ + 10.372808985719152, + 49.00323927419356 + ], + [ + 10.375442808523506, + 48.999716540998826 + ], + [ + 10.381896484484347, + 48.99904898868993 + ], + [ + 10.380483235423139, + 48.98921171020055 + ], + [ + 10.39468305772591, + 48.9901576130122 + ], + [ + 10.404022693947095, + 48.98066830151933 + ], + [ + 10.411773416305458, + 48.97895683170199 + ], + [ + 10.409430792422516, + 48.97575710731015 + ], + [ + 10.40147999704759, + 48.97452316960691 + ], + [ + 10.403681379556081, + 48.96679025526484 + ], + [ + 10.418751746689951, + 48.9685792042748 + ], + [ + 10.424932592292395, + 48.960681674850264 + ], + [ + 10.419458015260261, + 48.959175871634216 + ], + [ + 10.431022214191142, + 48.95344182106967 + ], + [ + 10.430902321186792, + 48.94630282557073 + ], + [ + 10.44333440627785, + 48.9458165986831 + ], + [ + 10.44482543310909, + 48.940371013108454 + ], + [ + 10.451372668918884, + 48.93866072530817 + ], + [ + 10.448220713010958, + 48.93487345099323 + ], + [ + 10.437942062032088, + 48.933399855892254 + ], + [ + 10.45199140338018, + 48.926667709669275 + ], + [ + 10.456656414946593, + 48.9204959635369 + ], + [ + 10.457000572319146, + 48.9171414250224 + ], + [ + 10.443609809543833, + 48.90864537714201 + ], + [ + 10.421320367883704, + 48.905762889102135 + ], + [ + 10.450215786872683, + 48.89308945932111 + ], + [ + 10.452992995051284, + 48.88443880029681 + ], + [ + 10.44477458259801, + 48.880270998712504 + ], + [ + 10.452580966325176, + 48.87347545543452 + ], + [ + 10.448353934043583, + 48.86113446268536 + ], + [ + 10.454106805950223, + 48.860300585484424 + ], + [ + 10.452844396279895, + 48.85171169491664 + ], + [ + 10.42741549817268, + 48.8429889974183 + ], + [ + 10.426268382341837, + 48.83692068955834 + ], + [ + 10.44244271568302, + 48.834421069653786 + ], + [ + 10.449102462724571, + 48.830323023142796 + ], + [ + 10.448624089161527, + 48.81196777996309 + ], + [ + 10.440770268213885, + 48.809481739319246 + ], + [ + 10.433905473266252, + 48.801177120960396 + ], + [ + 10.421083752752832, + 48.79941156745186 + ], + [ + 10.420913694387341, + 48.79545796539185 + ], + [ + 10.430771578908406, + 48.79354898618093 + ], + [ + 10.427711828972114, + 48.79163149497191 + ], + [ + 10.43432947154393, + 48.78964810790419 + ], + [ + 10.427460900259817, + 48.786487246556966 + ], + [ + 10.426773954436472, + 48.7817474160485 + ], + [ + 10.434265962723092, + 48.77623032727426 + ], + [ + 10.429625151221256, + 48.776865998144274 + ], + [ + 10.432001393968827, + 48.7706892291229 + ], + [ + 10.428519823364521, + 48.7697697538508 + ], + [ + 10.427562521484363, + 48.773096570580144 + ], + [ + 10.417848569210935, + 48.77273009800487 + ], + [ + 10.42011496032817, + 48.77623905218932 + ], + [ + 10.41310131348076, + 48.772087982477295 + ], + [ + 10.417717795164432, + 48.76960940597011 + ], + [ + 10.418218812616017, + 48.76292794206966 + ], + [ + 10.428186611785504, + 48.755884303789095 + ], + [ + 10.41816702689933, + 48.75328740124248 + ], + [ + 10.41720613878182, + 48.75050786041873 + ], + [ + 10.423085180114594, + 48.747949088317434 + ], + [ + 10.416176715769993, + 48.748105967966865 + ], + [ + 10.434857232540988, + 48.74116694067642 + ], + [ + 10.431803340867754, + 48.737307150259554 + ], + [ + 10.439877456255347, + 48.73876866086363 + ], + [ + 10.443424627701964, + 48.72941335778862 + ], + [ + 10.44788353526748, + 48.72804419555374 + ], + [ + 10.450064918841665, + 48.73498769367242 + ], + [ + 10.4650061761956, + 48.73476857926647 + ], + [ + 10.455739515052485, + 48.72904580867984 + ], + [ + 10.464956862526027, + 48.727736140215626 + ], + [ + 10.462052166433258, + 48.722303512243705 + ], + [ + 10.467598126054305, + 48.72144195672019 + ], + [ + 10.465492621770093, + 48.719804630390854 + ], + [ + 10.473732241582185, + 48.711979229394494 + ], + [ + 10.48164137376167, + 48.71258725889261 + ], + [ + 10.483382299783264, + 48.70806417292474 + ], + [ + 10.483528290720233, + 48.70524282887304 + ], + [ + 10.474483674592928, + 48.70560746585511 + ], + [ + 10.471509766203582, + 48.70281000303809 + ], + [ + 10.480260345978806, + 48.700159050543384 + ], + [ + 10.47954257007912, + 48.69479927229644 + ], + [ + 10.48725776665536, + 48.696661912096516 + ], + [ + 10.48559562241638, + 48.691603328352166 + ], + [ + 10.495083372665363, + 48.6872472084087 + ], + [ + 10.481746282580096, + 48.6864994275667 + ], + [ + 10.480987695204785, + 48.68141846443379 + ], + [ + 10.464998022718046, + 48.67053354189023 + ], + [ + 10.45419051154007, + 48.67061054143036 + ], + [ + 10.449172634824292, + 48.665158872578274 + ], + [ + 10.441853368043507, + 48.666809907281745 + ], + [ + 10.432815405925583, + 48.66408905863122 + ], + [ + 10.432751179282114, + 48.66144521751107 + ], + [ + 10.419335308958553, + 48.66392720815949 + ], + [ + 10.410638817881154, + 48.66103394693287 + ], + [ + 10.40869847584739, + 48.66783971784348 + ], + [ + 10.419306776063868, + 48.67295571309463 + ], + [ + 10.422215739586198, + 48.67088949750704 + ], + [ + 10.42610929294289, + 48.67295145634826 + ], + [ + 10.424468920110996, + 48.679321886090214 + ], + [ + 10.418720957163224, + 48.68227162204103 + ], + [ + 10.422574801394848, + 48.684162828497136 + ], + [ + 10.422781642701636, + 48.69075458667428 + ], + [ + 10.426519975084187, + 48.691571939838795 + ], + [ + 10.429635276848927, + 48.68602537646477 + ], + [ + 10.43739374706901, + 48.693101879984646 + ], + [ + 10.431747641811786, + 48.69949236081635 + ], + [ + 10.426198254512203, + 48.69488454935447 + ], + [ + 10.40887136005722, + 48.698792502863455 + ], + [ + 10.407887768852571, + 48.694502173145466 + ], + [ + 10.392510309576132, + 48.688580166536674 + ], + [ + 10.392478463641693, + 48.678400470918106 + ], + [ + 10.386757991383421, + 48.674087328279306 + ], + [ + 10.389421373725366, + 48.667201703122004 + ], + [ + 10.37999826986611, + 48.66767751466259 + ], + [ + 10.373591781032616, + 48.66305837496715 + ], + [ + 10.368441433805645, + 48.663878556303686 + ], + [ + 10.361128679628967, + 48.652826841132445 + ], + [ + 10.351078887159579, + 48.65489107618259 + ], + [ + 10.347422983160333, + 48.67910738154069 + ], + [ + 10.337429497202338, + 48.689021806666354 + ], + [ + 10.326574274034442, + 48.69078091584333 + ], + [ + 10.32100470925422, + 48.687246947807935 + ], + [ + 10.31740006782168, + 48.688697893139505 + ], + [ + 10.317503169526526, + 48.682933763261964 + ], + [ + 10.292015966369295, + 48.691593867203764 + ], + [ + 10.282522165748977, + 48.700976783986775 + ], + [ + 10.268706812656797, + 48.70354711793377 + ], + [ + 10.273039774614078, + 48.68589131098094 + ], + [ + 10.264688064905338, + 48.6828883589803 + ], + [ + 10.268762917156923, + 48.67989337048934 + ], + [ + 10.25634705025003, + 48.680667166673274 + ], + [ + 10.25537166365959, + 48.67749061509661 + ], + [ + 10.26484861015608, + 48.6721424911989 + ], + [ + 10.25460021770829, + 48.66620317764276 + ], + [ + 10.256410901060041, + 48.66247524573403 + ], + [ + 10.266623162676158, + 48.65883721710139 + ], + [ + 10.259529864757612, + 48.65489233620336 + ], + [ + 10.270384297273297, + 48.6519210322484 + ], + [ + 10.26831023678869, + 48.64660194076707 + ], + [ + 10.272355911042206, + 48.64915518813448 + ], + [ + 10.274449325164763, + 48.6454815372608 + ], + [ + 10.280522996632707, + 48.646770648464155 + ], + [ + 10.283566456306884, + 48.63678601341814 + ], + [ + 10.296510056419132, + 48.633564249045286 + ], + [ + 10.297810681822455, + 48.6241875763611 + ], + [ + 10.323094951504181, + 48.6091327037685 + ], + [ + 10.318774912038153, + 48.607615026843675 + ], + [ + 10.320212232826783, + 48.60393953669318 + ], + [ + 10.30686630180681, + 48.60499616091657 + ], + [ + 10.307219067076266, + 48.60150778564945 + ], + [ + 10.301563862561107, + 48.6052116037474 + ], + [ + 10.297108769188782, + 48.60380974179912 + ], + [ + 10.29311431291937, + 48.58976551933045 + ], + [ + 10.304752750971339, + 48.584265449349616 + ], + [ + 10.31300460554813, + 48.56712277011966 + ], + [ + 10.31418392558785, + 48.55628937611747 + ], + [ + 10.30489911032223, + 48.55105806566365 + ], + [ + 10.304651297164327, + 48.545293792325204 + ], + [ + 10.300846789625465, + 48.545071209364764 + ], + [ + 10.303183364627124, + 48.52982514737729 + ], + [ + 10.31237478321773, + 48.53007489459068 + ], + [ + 10.314838712269527, + 48.52650928555373 + ], + [ + 10.309262093805478, + 48.52632897260187 + ], + [ + 10.312023162436935, + 48.52294378204318 + ], + [ + 10.286794508167684, + 48.516091275580074 + ], + [ + 10.25746240677595, + 48.51946574860613 + ], + [ + 10.252682296968564, + 48.51454565206096 + ], + [ + 10.249831598204763, + 48.51622070864187 + ], + [ + 10.248273717779977, + 48.511244724015945 + ], + [ + 10.230779588424218, + 48.51051118153766 + ], + [ + 10.23796639724846, + 48.50782191387101 + ], + [ + 10.231602956567487, + 48.508436085042256 + ], + [ + 10.226631163062777, + 48.50699422585316 + ], + [ + 10.228049715041111, + 48.50497457927604 + ], + [ + 10.241051145133362, + 48.5053744305576 + ], + [ + 10.242472678426692, + 48.50009960988427 + ], + [ + 10.237506682641522, + 48.50019583996504 + ], + [ + 10.241406301494708, + 48.491959651653715 + ], + [ + 10.235443310104946, + 48.488960323176855 + ], + [ + 10.217915369411392, + 48.48846743070459 + ], + [ + 10.180125246452377, + 48.475524554954355 + ], + [ + 10.182582932878907, + 48.4739850832475 + ], + [ + 10.177378803077957, + 48.47161422855491 + ], + [ + 10.184701021576851, + 48.47266038888199 + ], + [ + 10.181529013584795, + 48.46970206406912 + ], + [ + 10.184600949983157, + 48.467211217486536 + ], + [ + 10.17504082739488, + 48.469377473343606 + ], + [ + 10.177862981164552, + 48.4638019814095 + ], + [ + 10.172772750083405, + 48.462788973104026 + ], + [ + 10.17184642135382, + 48.457786946141326 + ], + [ + 10.160457289802327, + 48.458759600189374 + ], + [ + 10.133895409080948, + 48.45487141530527 + ], + [ + 10.11725175968831, + 48.46813587099881 + ], + [ + 10.117366731603099, + 48.475387567540416 + ], + [ + 10.104855352385817, + 48.47748470931856 + ], + [ + 10.103565697214345, + 48.47277692650354 + ], + [ + 10.094376749345459, + 48.46712384223617 + ], + [ + 10.064009813362064, + 48.45638920099003 + ], + [ + 10.039044314450841, + 48.45787408325378 + ], + [ + 10.038927605916252, + 48.459929022454276 + ], + [ + 10.03088752149245, + 48.453586070026695 + ], + [ + 10.03588767130213, + 48.45129476791081 + ], + [ + 10.03822677392702, + 48.44445300522946 + ], + [ + 10.028636617355053, + 48.44201041117411 + ], + [ + 10.028050577018968, + 48.43691872661841 + ], + [ + 10.034854837930114, + 48.43329704555247 + ], + [ + 10.037450407438772, + 48.435799706687675 + ], + [ + 10.040789678749718, + 48.43439185262572 + ], + [ + 10.042414152617061, + 48.42973203637246 + ], + [ + 10.018815882202453, + 48.418248658397935 + ], + [ + 10.015279482465408, + 48.40435057117032 + ], + [ + 9.989868427575587, + 48.393707310272106 + ], + [ + 9.984912613004894, + 48.38610468689725 + ], + [ + 9.969934361786917, + 48.379380285909626 + ], + [ + 9.967275614675764, + 48.3744043557181 + ], + [ + 9.977615125793555, + 48.36282826301525 + ], + [ + 9.98412768585787, + 48.363227538125955 + ], + [ + 9.982988562855688, + 48.36760986107141 + ], + [ + 9.987733752230046, + 48.370626032204974 + ], + [ + 9.992995102521004, + 48.36815979217246 + ], + [ + 9.993339461309887, + 48.36356692714289 + ], + [ + 9.99992493746783, + 48.3634531127554 + ], + [ + 9.99482228553174, + 48.3552809030714 + ], + [ + 9.99813180924917, + 48.34751287757681 + ], + [ + 10.010403135112673, + 48.34238923952366 + ], + [ + 10.012286806076204, + 48.33063748953779 + ], + [ + 10.022922309161432, + 48.32400382657288 + ], + [ + 10.043081011589123, + 48.300443596412855 + ], + [ + 10.042549427433878, + 48.29422970898688 + ], + [ + 10.065816519721793, + 48.28181712210158 + ], + [ + 10.066752984615679, + 48.2749161020188 + ], + [ + 10.062202412239493, + 48.271715480612755 + ], + [ + 10.065548390593253, + 48.26189319540954 + ], + [ + 10.06196003497708, + 48.258129985586116 + ], + [ + 10.069026271021633, + 48.253761581503284 + ], + [ + 10.060721236111553, + 48.24009045403836 + ], + [ + 10.070144239489304, + 48.23062497805636 + ], + [ + 10.069454398224744, + 48.2233582138038 + ], + [ + 10.076318737629089, + 48.22302525207945 + ], + [ + 10.078320370428944, + 48.220237006581314 + ], + [ + 10.077004112042959, + 48.210612542418204 + ], + [ + 10.08371062848253, + 48.209640227938976 + ], + [ + 10.085717414862836, + 48.18219242060539 + ], + [ + 10.107074310791878, + 48.132144184014976 + ], + [ + 10.123590498706946, + 48.11651536791496 + ], + [ + 10.136247105300413, + 48.11144304886106 + ], + [ + 10.136661343304016, + 48.10078303888052 + ], + [ + 10.140392398126298, + 48.098916557750165 + ], + [ + 10.134081879986173, + 48.07947892238258 + ], + [ + 10.14373670731883, + 48.07441383921764 + ], + [ + 10.140640573553393, + 48.06490224612962 + ], + [ + 10.143901696556343, + 48.05900706679429 + ], + [ + 10.139156160063246, + 48.05151269205708 + ], + [ + 10.141255833244534, + 48.04670148845853 + ], + [ + 10.127111483967031, + 48.03271248297758 + ], + [ + 10.135727944606302, + 48.02376160140277 + ], + [ + 10.134326495000675, + 48.01759961392574 + ], + [ + 10.119550393186508, + 48.00349993131166 + ], + [ + 10.121624322034883, + 47.99853638246783 + ], + [ + 10.114791141430587, + 47.98862509091525 + ], + [ + 10.114954568812266, + 47.97625743516829 + ], + [ + 10.093207080655855, + 47.97233172986026 + ], + [ + 10.084893699950998, + 47.96130765335526 + ], + [ + 10.089487632616228, + 47.94797725669152 + ], + [ + 10.111010296151239, + 47.93487908394004 + ], + [ + 10.10501280185758, + 47.92383809443883 + ], + [ + 10.111105704476808, + 47.91595937987552 + ], + [ + 10.108314410470937, + 47.91557192044812 + ], + [ + 10.110211777678147, + 47.91063526691626 + ], + [ + 10.101696086464052, + 47.905634205367384 + ], + [ + 10.103447322365033, + 47.890621695909765 + ], + [ + 10.095332148287293, + 47.885158809582045 + ], + [ + 10.105458971397546, + 47.8830252331653 + ], + [ + 10.105704628582853, + 47.879026534318 + ], + [ + 10.097922307206506, + 47.87656248490105 + ], + [ + 10.0915987501387, + 47.86739846965412 + ], + [ + 10.082656577344515, + 47.86972846354249 + ], + [ + 10.07675553379619, + 47.86780934957141 + ], + [ + 10.08296168829282, + 47.85571777939854 + ], + [ + 10.104617332881036, + 47.86462420422203 + ], + [ + 10.105104472943284, + 47.85713922205841 + ], + [ + 10.10191156264762, + 47.853972968951055 + ], + [ + 10.098266187321334, + 47.855604364044936 + ], + [ + 10.099353490294613, + 47.851608857609314 + ], + [ + 10.095376094585788, + 47.851396470060244 + ], + [ + 10.091604866363976, + 47.845621380218304 + ], + [ + 10.094422815360783, + 47.84388828984812 + ], + [ + 10.097384612986547, + 47.848318892950914 + ], + [ + 10.099247333022964, + 47.844930681220944 + ], + [ + 10.107154657825985, + 47.85289545770091 + ], + [ + 10.11007223440925, + 47.84697409105557 + ], + [ + 10.102770972447162, + 47.8423743243356 + ], + [ + 10.109871903891703, + 47.8402057435608 + ], + [ + 10.125608607882, + 47.82289704590062 + ], + [ + 10.131470000253085, + 47.82250356791559 + ], + [ + 10.132328794896594, + 47.81467847027029 + ], + [ + 10.138022984091181, + 47.80963764355654 + ], + [ + 10.131846049810354, + 47.80961698437877 + ], + [ + 10.128015961198116, + 47.81331575918974 + ], + [ + 10.115746515856804, + 47.810873642998814 + ], + [ + 10.108782375558429, + 47.80577107929914 + ], + [ + 10.119430489346287, + 47.80371469355182 + ], + [ + 10.116879805827267, + 47.80062314207839 + ], + [ + 10.101994588789081, + 47.800479998465526 + ], + [ + 10.096261048030447, + 47.80465642599252 + ], + [ + 10.093683742145432, + 47.80205135149858 + ], + [ + 10.090134546380591, + 47.803905186456554 + ], + [ + 10.09190245882469, + 47.80143132431699 + ], + [ + 10.085536018029076, + 47.795484737239896 + ], + [ + 10.064681025461597, + 47.785887717885686 + ], + [ + 10.067390652861931, + 47.78243680999842 + ], + [ + 10.079614724213148, + 47.78126235010893 + ], + [ + 10.084840348970685, + 47.776636030431476 + ], + [ + 10.082513094304112, + 47.77118098643326 + ], + [ + 10.119049494526047, + 47.759586709767625 + ], + [ + 10.11402522388417, + 47.754401563740636 + ], + [ + 10.118252462371503, + 47.75058803407323 + ], + [ + 10.113633618797232, + 47.74137823046397 + ], + [ + 10.118638682192616, + 47.73328979075081 + ], + [ + 10.116428888952811, + 47.71931672603968 + ], + [ + 10.122519791892568, + 47.71166344051406 + ], + [ + 10.139437677548777, + 47.70327340754865 + ], + [ + 10.13925055320935, + 47.697880901949084 + ], + [ + 10.12832227545009, + 47.69071791409876 + ], + [ + 10.132769416550868, + 47.68508056587024 + ], + [ + 10.129336188938083, + 47.6761365211503 + ], + [ + 10.111133755915336, + 47.66599043428786 + ], + [ + 10.088402275892548, + 47.67363504685089 + ], + [ + 10.093527261104114, + 47.67006877471308 + ], + [ + 10.093423672458826, + 47.66322086856478 + ], + [ + 10.08838506563919, + 47.662869440371395 + ], + [ + 10.09021566300277, + 47.66026136107368 + ], + [ + 10.08136231277178, + 47.65488987378629 + ], + [ + 10.082945111974635, + 47.650124308760844 + ], + [ + 10.0772923993975, + 47.63927426207253 + ], + [ + 10.072017980882864, + 47.64344114700552 + ], + [ + 10.07516168231095, + 47.65833450994544 + ], + [ + 10.068159476381526, + 47.663608820483695 + ], + [ + 10.059312463455347, + 47.680628777048675 + ], + [ + 10.048337620305317, + 47.681321290261515 + ], + [ + 10.04703997329387, + 47.67623859925514 + ], + [ + 10.04198056095984, + 47.67514805582369 + ], + [ + 10.04336609139908, + 47.67784978336355 + ], + [ + 10.03873632274922, + 47.67776736230575 + ], + [ + 10.03049126274231, + 47.67445209527095 + ], + [ + 10.028966243439378, + 47.68654120112772 + ], + [ + 10.001902409660058, + 47.68199943427236 + ], + [ + 9.976022662405448, + 47.66532503689979 + ], + [ + 9.977723418884738, + 47.66172071382315 + ], + [ + 9.970746357474779, + 47.65362632422229 + ], + [ + 9.959522463349368, + 47.65230409774051 + ], + [ + 9.940860856784926, + 47.657995570238135 + ], + [ + 9.930496512592477, + 47.654043179412746 + ], + [ + 9.91630331433732, + 47.661022238314935 + ], + [ + 9.893277498506903, + 47.66323277310765 + ], + [ + 9.874861671471079, + 47.67527824306187 + ], + [ + 9.84219083987396, + 47.67769183455643 + ], + [ + 9.837816238597233, + 47.66946960322983 + ], + [ + 9.834213481751586, + 47.67323993579779 + ], + [ + 9.83060629565077, + 47.671375577502026 + ], + [ + 9.828553281770313, + 47.657901205301485 + ], + [ + 9.816176936983158, + 47.649664494613255 + ], + [ + 9.801668776025567, + 47.650863035426966 + ], + [ + 9.795646056375771, + 47.64760146122085 + ], + [ + 9.800141869696223, + 47.64470091890612 + ], + [ + 9.79525606567016, + 47.63571901069615 + ], + [ + 9.777821572362948, + 47.630536402629176 + ], + [ + 9.774775830628283, + 47.62516932275644 + ], + [ + 9.754884840918132, + 47.614008797496574 + ], + [ + 9.75606611451225, + 47.60966759291999 + ], + [ + 9.747811632002735, + 47.603679967727025 + ], + [ + 9.740357989771192, + 47.60453573770737 + ], + [ + 9.746899428131957, + 47.61302820967648 + ], + [ + 9.745651920031696, + 47.617296984447 + ], + [ + 9.737457798652635, + 47.61170434332249 + ], + [ + 9.734340392137804, + 47.6165259910318 + ], + [ + 9.726917415818006, + 47.6067234703338 + ], + [ + 9.712022724144788, + 47.60667944220796 + ], + [ + 9.70629373447182, + 47.60181220922718 + ], + [ + 9.694582152866271, + 47.60466454370186 + ], + [ + 9.69215155718136, + 47.61042347113462 + ], + [ + 9.68378165278148, + 47.60454804831916 + ], + [ + 9.678102239383067, + 47.60490065264272 + ], + [ + 9.671443790854749, + 47.611374109425 + ], + [ + 9.657709588410063, + 47.61172524823889 + ], + [ + 9.653814997214889, + 47.60557700690715 + ], + [ + 9.634638558577583, + 47.60267626994013 + ], + [ + 9.6402089459103, + 47.60095018309134 + ], + [ + 9.644205568504308, + 47.590288185137055 + ], + [ + 9.633101282281505, + 47.5940642282124 + ], + [ + 9.626340585914688, + 47.59249143486241 + ], + [ + 9.619756271970727, + 47.583227520391794 + ], + [ + 9.614055646106433, + 47.5811503369226 + ], + [ + 9.595548617881628, + 47.588087945917444 + ], + [ + 9.57292573063913, + 47.583925425478846 + ], + [ + 9.559308492958737, + 47.58480587311427 + ], + [ + 9.560612109935168, + 47.58962477796184 + ], + [ + 9.557381375795078, + 47.585570975066126 + ], + [ + 9.55441193756507, + 47.59085604573678 + ], + [ + 9.550972137482384, + 47.587339399118726 + ], + [ + 9.529998599710595, + 47.603006116095735 + ], + [ + 9.527458732274027, + 47.6153397887412 + ], + [ + 9.518154846310367, + 47.62142992636992 + ], + [ + 9.515219134839112, + 47.63475749199255 + ], + [ + 9.49528408853278, + 47.65013127090595 + ], + [ + 9.488090000304219, + 47.65138567015574 + ], + [ + 9.482117036737197, + 47.64884959194515 + ], + [ + 9.470672344749827, + 47.65112344351333 + ], + [ + 9.462988213962088, + 47.64841732917231 + ], + [ + 9.452000178747504, + 47.654854515793545 + ], + [ + 9.434193140777083, + 47.65718892984029 + ], + [ + 9.421020779712586, + 47.66592932893539 + ], + [ + 9.40628183237413, + 47.6682536738464 + ], + [ + 9.349721644514068, + 47.660840379078024 + ], + [ + 9.324031879030082, + 47.672150391386744 + ], + [ + 9.310423361542975, + 47.67422239654158 + ], + [ + 9.263417251473694, + 47.69480125449025 + ], + [ + 9.239266618426866, + 47.710082054128925 + ], + [ + 9.226307792685036, + 47.72312544955567 + ], + [ + 9.228652060122323, + 47.72676596257153 + ], + [ + 9.223718850560273, + 47.74091828132413 + ], + [ + 9.192410149535338, + 47.75084757597448 + ], + [ + 9.158564257086656, + 47.76588724555172 + ], + [ + 9.13930721645688, + 47.76901931147609 + ], + [ + 9.125366126868705, + 47.781823871284644 + ], + [ + 9.105757372100461, + 47.79241529190684 + ], + [ + 9.088413930832335, + 47.797190013229354 + ], + [ + 9.061646036595302, + 47.81489009841503 + ], + [ + 9.039006081739045, + 47.81736700712891 + ], + [ + 9.030987172858394, + 47.804701765207604 + ], + [ + 9.080722660264296, + 47.77183206811846 + ], + [ + 9.116753498663474, + 47.75927973475106 + ], + [ + 9.136283467131797, + 47.74711289024271 + ], + [ + 9.149073588009802, + 47.74871026578273 + ], + [ + 9.158861678028192, + 47.740112574887696 + ], + [ + 9.172740020844834, + 47.73486262767887 + ], + [ + 9.178027550899351, + 47.725595533951804 + ], + [ + 9.179606442785452, + 47.705150928758066 + ], + [ + 9.207599305160374, + 47.687097790415145 + ], + [ + 9.217724766992365, + 47.66611473223336 + ], + [ + 9.207264300887886, + 47.663159934159786 + ], + [ + 9.17842558636803, + 47.666992769571316 + ], + [ + 9.181678162850073, + 47.65573491172342 + ], + [ + 9.175793332478898, + 47.653937862469704 + ], + [ + 9.170534654437175, + 47.65485338504867 + ], + [ + 9.157709388539141, + 47.66601125872222 + ], + [ + 9.148339065526146, + 47.667611928648846 + ], + [ + 9.13932582146989, + 47.66399982952043 + ], + [ + 9.127830524028273, + 47.66659864904605 + ], + [ + 9.125641404562586, + 47.6742931620718 + ], + [ + 9.112298072362874, + 47.685583334693646 + ], + [ + 9.094002195287546, + 47.68678667172074 + ], + [ + 9.081137109396709, + 47.68330323811969 + ], + [ + 9.053825721399544, + 47.689684879141296 + ], + [ + 9.042609312612269, + 47.69403835110581 + ], + [ + 9.04085513168483, + 47.701178388006994 + ], + [ + 9.044606069260013, + 47.704032878680074 + ], + [ + 9.040724439339495, + 47.708340208797914 + ], + [ + 9.048203130977862, + 47.70715483554755 + ], + [ + 9.053199749973878, + 47.702484569096704 + ], + [ + 9.060403062753052, + 47.70340692588878 + ], + [ + 9.087173274241302, + 47.68820824588843 + ], + [ + 9.108872914553114, + 47.69001558954431 + ], + [ + 9.101582435431704, + 47.70167845202527 + ], + [ + 9.09312575031762, + 47.70644105818681 + ], + [ + 9.02305625349419, + 47.72837072499896 + ], + [ + 8.989864116142456, + 47.74346593415507 + ], + [ + 8.983323578711005, + 47.74119987991449 + ], + [ + 8.986342766151553, + 47.73658577535373 + ], + [ + 9.000013596284093, + 47.73350297605043 + ], + [ + 9.01531594875002, + 47.72214444494192 + ], + [ + 9.014928056957078, + 47.71997296440544 + ], + [ + 9.009595982585482, + 47.72099673337759 + ], + [ + 9.010846545975657, + 47.72371034661748 + ], + [ + 9.005668522438857, + 47.72623710371274 + ], + [ + 8.998634117011044, + 47.725376387854055 + ], + [ + 8.975345149735082, + 47.735012281500246 + ], + [ + 8.968822493787581, + 47.73395006638084 + ], + [ + 8.960688284886967, + 47.737170245063396 + ], + [ + 8.942496662788207, + 47.73388260848973 + ], + [ + 8.93982835982138, + 47.7280647559866 + ], + [ + 8.943741496215004, + 47.723509576610006 + ], + [ + 8.999153637421353, + 47.70336209791899 + ], + [ + 9.006162673772387, + 47.696115084328454 + ], + [ + 8.998628892047902, + 47.68725699587344 + ], + [ + 8.974309887734297, + 47.67684320885746 + ], + [ + 8.970918277927066, + 47.67202293357549 + ], + [ + 8.950321211754668, + 47.6676779904286 + ], + [ + 8.937897101857244, + 47.659096496968445 + ], + [ + 8.924811881284526, + 47.65975275380763 + ], + [ + 8.893659067743952, + 47.65217872071652 + ], + [ + 8.875350701846981, + 47.65620591161389 + ], + [ + 8.873471648707444, + 47.67022131567312 + ], + [ + 8.860806313928373, + 47.680252764510456 + ], + [ + 8.850583167020503, + 47.68116302575419 + ], + [ + 8.857580073753624, + 47.692297677924685 + ], + [ + 8.850773477128545, + 47.694668157502306 + ], + [ + 8.85154173769083, + 47.69752178322538 + ], + [ + 8.858069544686103, + 47.698797629742245 + ], + [ + 8.86069034015228, + 47.6962448387854 + ], + [ + 8.863258152720116, + 47.69849521898777 + ], + [ + 8.866229584380221, + 47.69651834339286 + ], + [ + 8.863208444126167, + 47.69252512183266 + ], + [ + 8.874419800571802, + 47.69436971363068 + ], + [ + 8.876026582438586, + 47.6969383825004 + ], + [ + 8.869676447953275, + 47.701998412266505 + ], + [ + 8.872719752498874, + 47.70416469399526 + ], + [ + 8.848327246469728, + 47.70345266136847 + ], + [ + 8.843263262172272, + 47.71213965690189 + ], + [ + 8.833631894895527, + 47.714573182283985 + ], + [ + 8.82541860030753, + 47.71098682198598 + ], + [ + 8.818828358198314, + 47.71286262426501 + ], + [ + 8.826169827032926, + 47.717910538662835 + ], + [ + 8.818572898913246, + 47.71764972787214 + ], + [ + 8.812775561291055, + 47.723659089572024 + ], + [ + 8.804851516456315, + 47.72449931289513 + ], + [ + 8.811948569388067, + 47.73035316441219 + ], + [ + 8.808458414160466, + 47.731066425939886 + ], + [ + 8.806440662670802, + 47.738262249885366 + ], + [ + 8.796557225653274, + 47.73457304819964 + ], + [ + 8.799121572835311, + 47.72713320658349 + ], + [ + 8.785023875817942, + 47.72715844437452 + ], + [ + 8.780739064051913, + 47.72169994976464 + ], + [ + 8.776315768849173, + 47.722712203802146 + ], + [ + 8.774800873460464, + 47.71914449467445 + ], + [ + 8.76990857499527, + 47.71844854129308 + ], + [ + 8.772800225889696, + 47.71319421921063 + ], + [ + 8.76935011132517, + 47.7068759544735 + ], + [ + 8.792066035060268, + 47.70490944568954 + ], + [ + 8.797650155976287, + 47.70286829920506 + ], + [ + 8.797723906390583, + 47.69714733842678 + ], + [ + 8.80632419851728, + 47.69649660943663 + ], + [ + 8.810078414143481, + 47.69332049545869 + ], + [ + 8.798032256148442, + 47.689726154279406 + ], + [ + 8.793324006277453, + 47.679917726720014 + ], + [ + 8.795947416535574, + 47.67530206979913 + ], + [ + 8.791550072631944, + 47.67489887770635 + ], + [ + 8.757305992968897, + 47.68942349198294 + ], + [ + 8.727981484893375, + 47.69268057241281 + ], + [ + 8.726361024369146, + 47.69667224409986 + ], + [ + 8.73629401227833, + 47.716150937238645 + ], + [ + 8.717919265957066, + 47.72162240042961 + ], + [ + 8.711256620809387, + 47.73007147076835 + ], + [ + 8.714343626280083, + 47.7386978723161 + ], + [ + 8.723407379632818, + 47.74553179612692 + ], + [ + 8.741420435648903, + 47.748202333325146 + ], + [ + 8.740109216318972, + 47.75278969628299 + ], + [ + 8.729100749012458, + 47.75792098332079 + ], + [ + 8.727146060471247, + 47.762277470136624 + ], + [ + 8.71415973369887, + 47.76535855061456 + ], + [ + 8.695090663836362, + 47.7557090153366 + ], + [ + 8.689439156761475, + 47.757862965470146 + ], + [ + 8.683482987286933, + 47.770634947779264 + ], + [ + 8.688253338870604, + 47.773649991205545 + ], + [ + 8.682776894935849, + 47.77716373267218 + ], + [ + 8.680894192359933, + 47.78667045095166 + ], + [ + 8.676127778211479, + 47.78570087159817 + ], + [ + 8.657496098059767, + 47.79179130298011 + ], + [ + 8.6602597578447, + 47.79626218017864 + ], + [ + 8.656975077076593, + 47.80034710359205 + ], + [ + 8.649398829073567, + 47.79849279514312 + ], + [ + 8.645520055604507, + 47.790192159514746 + ], + [ + 8.64993476903563, + 47.78128625479687 + ], + [ + 8.648095511400696, + 47.77408845114506 + ], + [ + 8.652971559500992, + 47.773433795638496 + ], + [ + 8.64529568276056, + 47.768534902087026 + ], + [ + 8.64453692417598, + 47.76430009161662 + ], + [ + 8.631608949569193, + 47.758180553280084 + ], + [ + 8.627679191699086, + 47.75925902354577 + ], + [ + 8.619414418085551, + 47.76767536553525 + ], + [ + 8.623331806555788, + 47.777296619032406 + ], + [ + 8.614881527054981, + 47.78376958362303 + ], + [ + 8.622044999324935, + 47.79466313393459 + ], + [ + 8.61858350307798, + 47.798334356956985 + ], + [ + 8.600819881774722, + 47.80293450919953 + ], + [ + 8.592737555322636, + 47.79873793994442 + ], + [ + 8.587642913278602, + 47.802680574779245 + ], + [ + 8.575192668042671, + 47.79971714740785 + ], + [ + 8.573013867431312, + 47.805989824121596 + ], + [ + 8.567852076675374, + 47.80848124786566 + ], + [ + 8.563511871879005, + 47.80531815575931 + ], + [ + 8.56191574880705, + 47.792746826217495 + ], + [ + 8.574998877881873, + 47.78962458327865 + ], + [ + 8.577304000757467, + 47.781706259164295 + ], + [ + 8.562531233253683, + 47.7778537516852 + ], + [ + 8.56321358631981, + 47.78058875704353 + ], + [ + 8.55264879396952, + 47.7846271090928 + ], + [ + 8.52648233673705, + 47.7781333633259 + ], + [ + 8.520132130713819, + 47.77049348418162 + ], + [ + 8.510217719751378, + 47.77616274242376 + ], + [ + 8.495972964847395, + 47.77069945179858 + ], + [ + 8.489027460226371, + 47.77326866454361 + ], + [ + 8.473712822432159, + 47.764514913921275 + ], + [ + 8.449826239407528, + 47.738632029989695 + ], + [ + 8.452841293805454, + 47.73043112793039 + ], + [ + 8.456937837010553, + 47.72996861538121 + ], + [ + 8.454988425743862, + 47.72225870873969 + ], + [ + 8.44523563979182, + 47.72296105024738 + ], + [ + 8.441551592246807, + 47.71766828865049 + ], + [ + 8.436732246750838, + 47.718233383877596 + ], + [ + 8.425853258184498, + 47.711157611038885 + ], + [ + 8.416828300199212, + 47.710006224407636 + ], + [ + 8.40442578473048, + 47.69806325782933 + ], + [ + 8.420641547380855, + 47.68385545132895 + ], + [ + 8.405559328184735, + 47.67451554508761 + ], + [ + 8.412354838782694, + 47.66627462310232 + ], + [ + 8.423684058993702, + 47.66681500276676 + ], + [ + 8.445064030175795, + 47.65378141551543 + ], + [ + 8.457372110425197, + 47.65270143878683 + ], + [ + 8.465430085946426, + 47.6571305170537 + ], + [ + 8.466137392746633, + 47.642760858158205 + ], + [ + 8.473494937768441, + 47.63830648481418 + ], + [ + 8.4778277537035, + 47.63970091920382 + ], + [ + 8.471116001154188, + 47.64234144206432 + ], + [ + 8.477665666825674, + 47.64466640104019 + ], + [ + 8.47373710775147, + 47.64982450343462 + ], + [ + 8.480479467069555, + 47.64923072591312 + ], + [ + 8.482705777899218, + 47.644202045826006 + ], + [ + 8.48732554785914, + 47.64508767041694 + ], + [ + 8.492376272334782, + 47.64208611279405 + ], + [ + 8.493357568654424, + 47.646979980284286 + ], + [ + 8.531526839254047, + 47.64578863923956 + ], + [ + 8.533943379136565, + 47.65002895186155 + ], + [ + 8.527009313935148, + 47.660395214890684 + ], + [ + 8.533353656082616, + 47.66319424243804 + ], + [ + 8.53374784588981, + 47.659914908211775 + ], + [ + 8.541358284997438, + 47.65711138381845 + ], + [ + 8.539952146655178, + 47.66508942189338 + ], + [ + 8.554315554329364, + 47.66938890566213 + ], + [ + 8.563691018083727, + 47.67005558102701 + ], + [ + 8.564810135326924, + 47.66528299966554 + ], + [ + 8.577761542408728, + 47.661565995665235 + ], + [ + 8.593848901262522, + 47.66725151743054 + ], + [ + 8.598039468775912, + 47.67280643738689 + ], + [ + 8.606623298151952, + 47.672120109857595 + ], + [ + 8.608578457952868, + 47.6637672812912 + ], + [ + 8.624125537761898, + 47.65623395523852 + ], + [ + 8.628803806884216, + 47.64965372560023 + ], + [ + 8.62369088827083, + 47.641279234674236 + ], + [ + 8.615594003218478, + 47.637704056543924 + ], + [ + 8.602981636100639, + 47.639246793822565 + ], + [ + 8.613887192522943, + 47.64406017980768 + ], + [ + 8.607704901061176, + 47.652446083959056 + ], + [ + 8.595741547593535, + 47.643132863195476 + ], + [ + 8.604797155810592, + 47.61326084298859 + ], + [ + 8.582542233164917, + 47.596104111337596 + ], + [ + 8.575542739899882, + 47.59488139834477 + ], + [ + 8.562786833183361, + 47.59960654885797 + ], + [ + 8.566392536169058, + 47.60987401219265 + ], + [ + 8.574447501026437, + 47.61188120340526 + ], + [ + 8.569298052269742, + 47.61723615995092 + ], + [ + 8.562800649829311, + 47.6167677870964 + ], + [ + 8.558003981218937, + 47.6243141596679 + ], + [ + 8.538523262606468, + 47.62631905445516 + ], + [ + 8.538886703998719, + 47.63092771060833 + ], + [ + 8.51774640425924, + 47.63431415094815 + ], + [ + 8.51276780028126, + 47.62550655982773 + ], + [ + 8.515119799192505, + 47.62343277846416 + ], + [ + 8.507280105186783, + 47.62382712316114 + ], + [ + 8.508251648575412, + 47.61750737446367 + ], + [ + 8.493683366841976, + 47.6144711506358 + ], + [ + 8.479112076836547, + 47.615154107268665 + ], + [ + 8.468544937473276, + 47.60386530604855 + ], + [ + 8.456599807218003, + 47.60234628368215 + ], + [ + 8.460420286091594, + 47.588482364174595 + ], + [ + 8.466937683986007, + 47.584202644374585 + ], + [ + 8.488717274714077, + 47.58780214395777 + ], + [ + 8.494547108824953, + 47.58120113508771 + ], + [ + 8.433687448086356, + 47.56664774242519 + ], + [ + 8.39735604669841, + 47.57719533476131 + ], + [ + 8.383003439570304, + 47.56558604626269 + ], + [ + 8.32377140607885, + 47.57294910113685 + ], + [ + 8.297921047517198, + 47.589067882901546 + ], + [ + 8.297481039367801, + 47.60567043188206 + ], + [ + 8.287721869982386, + 47.6106384111155 + ], + [ + 8.265023204872715, + 47.60948905177433 + ], + [ + 8.25624129326954, + 47.61515942263752 + ], + [ + 8.23854029502104, + 47.61268043991192 + ], + [ + 8.226647285046031, + 47.60506823307079 + ], + [ + 8.219267525717433, + 47.61781520261909 + ], + [ + 8.204054413830463, + 47.6208916785473 + ], + [ + 8.194330662258173, + 47.6166326781293 + ], + [ + 8.184496735640492, + 47.60480636960328 + ], + [ + 8.174134210711571, + 47.601673653401825 + ], + [ + 8.164908044954682, + 47.594140094024695 + ], + [ + 8.148602054752597, + 47.59541545932822 + ], + [ + 8.138293693928496, + 47.59033945435352 + ], + [ + 8.135240355351876, + 47.58356526645982 + ], + [ + 8.109483932312974, + 47.582259427244246 + ], + [ + 8.103135727969883, + 47.576362742408016 + ], + [ + 8.100208142031217, + 47.56378687360385 + ], + [ + 8.089661994396529, + 47.55775895157291 + ], + [ + 8.081336335313136, + 47.558144694328206 + ], + [ + 8.068331636414856, + 47.5645761024376 + ], + [ + 8.059276300791176, + 47.5634199955256 + ], + [ + 8.043722106972867, + 47.554546510161785 + ], + [ + 8.021771233087005, + 47.55051450862159 + ], + [ + 8.00147621787438, + 47.55633644476744 + ], + [ + 7.975930671937835, + 47.55534597205016 + ], + [ + 7.959083401886692, + 47.55826426321569 + ], + [ + 7.952489033896033, + 47.5544559454378 + ], + [ + 7.948289343279388, + 47.545080127408156 + ], + [ + 7.943210745525776, + 47.543818822029635 + ], + [ + 7.917130603519438, + 47.54776724435605 + ], + [ + 7.911458507964825, + 47.551300361223895 + ], + [ + 7.907312172708825, + 47.55930014354925 + ], + [ + 7.910857697642865, + 47.57096123641594 + ], + [ + 7.903832257810967, + 47.580131058549995 + ], + [ + 7.891352032455155, + 47.587638147042405 + ], + [ + 7.86960323567802, + 47.588769480535404 + ], + [ + 7.841669814741247, + 47.5821596485362 + ], + [ + 7.823085303239672, + 47.58801232700883 + ], + [ + 7.816218776707, + 47.58310395543404 + ], + [ + 7.810575573214503, + 47.56886177777798 + ], + [ + 7.788856366507349, + 47.55484719547868 + ], + [ + 7.758451416631456, + 47.54852901271974 + ], + [ + 7.75105230503288, + 47.544504283204105 + ], + [ + 7.719118688009226, + 47.541778112343664 + ], + [ + 7.696353182261811, + 47.53277064542292 + ], + [ + 7.668920256117111, + 47.53556992629454 + ], + [ + 7.661444703595997, + 47.54468164530716 + ], + [ + 7.649228549543762, + 47.54815855457251 + ], + [ + 7.634097006423977, + 47.561113720738035 + ], + [ + 7.636398799323463, + 47.56411852790055 + ], + [ + 7.648129296398871, + 47.559891609155734 + ], + [ + 7.664238190513924, + 47.5653812876413 + ], + [ + 7.676258375626207, + 47.563553323044495 + ], + [ + 7.683414608540541, + 47.571257205076876 + ], + [ + 7.685943342873799, + 47.565634963692204 + ], + [ + 7.689521707793675, + 47.57148480397153 + ], + [ + 7.683730671868835, + 47.57397607537949 + ], + [ + 7.680698625737725, + 47.58269160940682 + ], + [ + 7.671741322795283, + 47.587359457908676 + ], + [ + 7.693596585834021, + 47.60053085655686 + ], + [ + 7.682944028587102, + 47.598565983124836 + ], + [ + 7.675024597542464, + 47.592040565116505 + ], + [ + 7.645777276068105, + 47.59694957173364 + ], + [ + 7.643163598216796, + 47.591305635963835 + ], + [ + 7.61926600669725, + 47.5768783883168 + ], + [ + 7.604484106785111, + 47.57779110318495 + ], + [ + 7.604925079427863, + 47.58482593126644 + ], + [ + 7.589193489787385, + 47.589729086016526 + ], + [ + 7.591445950261996, + 47.60416858341337 + ], + [ + 7.574298270090261, + 47.615830515686525 + ], + [ + 7.567361073267708, + 47.631740893824556 + ], + [ + 7.537903380420843, + 47.649180505840306 + ], + [ + 7.521079276205891, + 47.66384788915161 + ], + [ + 7.518879839861664, + 47.68469662774136 + ], + [ + 7.511589777772393, + 47.696756161899636 + ], + [ + 7.513769053380981, + 47.7028238124325 + ], + [ + 7.540384676478562, + 47.71853417393023 + ], + [ + 7.547602745237037, + 47.72981945163551 + ], + [ + 7.548107699615461, + 47.73947456953192 + ], + [ + 7.530711395360505, + 47.77177237237391 + ], + [ + 7.529846167089275, + 47.7812582459796 + ], + [ + 7.562921404295571, + 47.842692370056966 + ], + [ + 7.55630975858619, + 47.87752690114129 + ], + [ + 7.562450498428649, + 47.88491758377442 + ], + [ + 7.57977803374548, + 47.89489215778736 + ], + [ + 7.582469792770679, + 47.92986340141517 + ], + [ + 7.609557864815357, + 47.95422999483041 + ], + [ + 7.62195226979366, + 47.972806426883814 + ], + [ + 7.610186774603825, + 47.99868628226594 + ], + [ + 7.568529046869494, + 48.0351842277043 + ], + [ + 7.573904759219654, + 48.054856085685266 + ], + [ + 7.569174474318975, + 48.080046918978184 + ], + [ + 7.579355739414431, + 48.10206971365792 + ], + [ + 7.576981639838855, + 48.119056387336606 + ], + [ + 7.580559603038702, + 48.12478588948755 + ], + [ + 7.598775829899153, + 48.13557685202162 + ], + [ + 7.60175439734924, + 48.159177300758216 + ], + [ + 7.629518982878073, + 48.183705691497316 + ], + [ + 7.644118372595772, + 48.20727033423517 + ], + [ + 7.665698788567532, + 48.22047802541055 + ], + [ + 7.689239766355024, + 48.28079362617989 + ], + [ + 7.693568867757027, + 48.30172306176189 + ], + [ + 7.706216052982311, + 48.31021421008151 + ], + [ + 7.737080374427446, + 48.31961009784353 + ], + [ + 7.744638259488295, + 48.32781093403668 + ], + [ + 7.731872087056882, + 48.37637844826565 + ], + [ + 7.733153239575633, + 48.397203506572744 + ], + [ + 7.765037545959081, + 48.45661045963426 + ], + [ + 7.768200957749269, + 48.48966253081538 + ], + [ + 7.79509048925047, + 48.50182983655523 + ], + [ + 7.803943709061376, + 48.5112162943921 + ], + [ + 7.805358049971609, + 48.56107233195841 + ], + [ + 7.800291523328811, + 48.58403806274603 + ], + [ + 7.830323052412524, + 48.61986760491836 + ], + [ + 7.839740455070169, + 48.64127586157051 + ], + [ + 7.889976098609651, + 48.66259830461674 + ], + [ + 7.963298357349062, + 48.72152631610152 + ], + [ + 7.972005719265209, + 48.758122433759496 + ], + [ + 7.98256748602994, + 48.7611047925811 + ], + [ + 8.001481323727893, + 48.75884594687758 + ], + [ + 8.014333371243506, + 48.76101961707245 + ], + [ + 8.023551579628451, + 48.76970269148388 + ], + [ + 8.030278977279908, + 48.78737295743466 + ], + [ + 8.041557622220704, + 48.790752976868006 + ], + [ + 8.064705747817843, + 48.789731856947306 + ], + [ + 8.08704046037206, + 48.80203358141103 + ], + [ + 8.10382813638359, + 48.820122497569976 + ], + [ + 8.114551990554915, + 48.85034352353092 + ], + [ + 8.13519499973133, + 48.88754525115595 + ], + [ + 8.193613841702538, + 48.953957319074966 + ], + [ + 8.20289313311228, + 48.95979392676136 + ], + [ + 8.239231978107078, + 48.969264871823206 + ], + [ + 8.285814949653117, + 48.99656372747613 + ], + [ + 8.297374095025905, + 49.01350524902331 + ], + [ + 8.311686689927884, + 49.05430717307226 + ], + [ + 8.358091293747428, + 49.09778419391171 + ], + [ + 8.372708393307626, + 49.151981290540924 + ], + [ + 8.368431127803596, + 49.16805240395603 + ], + [ + 8.381210558739857, + 49.185686336038714 + ], + [ + 8.385015523671914, + 49.19830067203603 + ], + [ + 8.39849791752162, + 49.20771875472716 + ], + [ + 8.40502125497829, + 49.22035783581349 + ], + [ + 8.403539912124113, + 49.224721517472425 + ], + [ + 8.398535109197148, + 49.22575275403815 + ], + [ + 8.38480377761808, + 49.219627642872325 + ], + [ + 8.389294302568997, + 49.23398058184897 + ], + [ + 8.400686475554323, + 49.2441593900782 + ], + [ + 8.439803283446256, + 49.26234679688815 + ], + [ + 8.458194880094936, + 49.27910869189748 + ], + [ + 8.4822553809146, + 49.286544260432066 + ], + [ + 8.488324743860709, + 49.29173728700621 + ], + [ + 8.485075787073747, + 49.30393524779395 + ], + [ + 8.455803727584694, + 49.314209758546866 + ], + [ + 8.450484520937477, + 49.323141481069655 + ], + [ + 8.455523798798923, + 49.33209034565902 + ], + [ + 8.483291437272499, + 49.34859153073756 + ], + [ + 8.496811191572194, + 49.36418049515139 + ], + [ + 8.500397518602853, + 49.38901364784299 + ], + [ + 8.47323119175996, + 49.3733642711237 + ], + [ + 8.46451707655192, + 49.37639268781574 + ], + [ + 8.463528358301478, + 49.38442891570918 + ], + [ + 8.49618884507081, + 49.40213635868571 + ], + [ + 8.508242487139253, + 49.434493419369545 + ], + [ + 8.498879478210446, + 49.44265448497322 + ], + [ + 8.455527662012933, + 49.44376037012167 + ], + [ + 8.442690860346634, + 49.450239189830704 + ], + [ + 8.444322354398025, + 49.459187259002995 + ], + [ + 8.460875914051773, + 49.46502234042284 + ], + [ + 8.463795388269663, + 49.47040265853366 + ], + [ + 8.44296390715355, + 49.49269559036186 + ], + [ + 8.42391017022921, + 49.540600893481326 + ], + [ + 8.414725337054927, + 49.553896791086984 + ], + [ + 8.41566308345237, + 49.56482919509589 + ], + [ + 8.423488769090715, + 49.57611490098297 + ], + [ + 8.42243926254325, + 49.58338541322957 + ], + [ + 8.43826610475561, + 49.58390012370693 + ], + [ + 8.440464790317138, + 49.589412016406854 + ], + [ + 8.446002313171693, + 49.59037671055183 + ], + [ + 8.464284652804986, + 49.58952836697012 + ], + [ + 8.475795984508384, + 49.5844522617543 + ], + [ + 8.474351715280255, + 49.580970557660976 + ], + [ + 8.479947343269505, + 49.57858679997134 + ], + [ + 8.47990012780106, + 49.57446416575753 + ], + [ + 8.495032435020207, + 49.57299667087067 + ], + [ + 8.526260278538219, + 49.54799710038107 + ], + [ + 8.532395957293913, + 49.536360071577036 + ], + [ + 8.552579372814638, + 49.52052034830548 + ], + [ + 8.560001946957202, + 49.51746242896481 + ], + [ + 8.573055375622273, + 49.52149343511518 + ], + [ + 8.58137487423408, + 49.51978041707861 + ], + [ + 8.584331526297802, + 49.52223336029824 + ], + [ + 8.591295095807684, + 49.52128039393201 + ], + [ + 8.597912601862411, + 49.531461953219306 + ], + [ + 8.607252976508802, + 49.52846921740933 + ], + [ + 8.61089917464312, + 49.538717127821315 + ], + [ + 8.621299695655438, + 49.54500989002873 + ], + [ + 8.608074076951127, + 49.5702925562777 + ], + [ + 8.603231734816736, + 49.59329423652688 + ], + [ + 8.594074036232861, + 49.59277130167126 + ], + [ + 8.590976799450155, + 49.59594293082642 + ], + [ + 8.589315309888745, + 49.60451524790381 + ], + [ + 8.595297405560006, + 49.60547431762935 + ], + [ + 8.593888978822092, + 49.61094664634904 + ], + [ + 8.65042350247613, + 49.62088414782333 + ], + [ + 8.653979511190416, + 49.61839033040702 + ], + [ + 8.677933667715678, + 49.62594697472169 + ], + [ + 8.686617351047483, + 49.62272082330122 + ], + [ + 8.692313575495598, + 49.623738857680536 + ], + [ + 8.69383695018465, + 49.61935368029901 + ], + [ + 8.688392836419554, + 49.61462317146209 + ], + [ + 8.683176143044129, + 49.616321323657495 + ], + [ + 8.678879168370356, + 49.613867505389386 + ], + [ + 8.684375838038594, + 49.61005245995222 + ], + [ + 8.686894232778023, + 49.613207177071544 + ], + [ + 8.686368561107269, + 49.6084804339261 + ], + [ + 8.67779071160163, + 49.60899951640945 + ], + [ + 8.677340981249085, + 49.61352777038456 + ], + [ + 8.672139781412257, + 49.611194103242724 + ], + [ + 8.682127798151921, + 49.603471928719124 + ], + [ + 8.691027875155825, + 49.607214190955354 + ], + [ + 8.697997510893005, + 49.59975733395298 + ], + [ + 8.696334373224976, + 49.592099751668094 + ], + [ + 8.683476957951031, + 49.589752092071265 + ], + [ + 8.680989340580192, + 49.57554792726386 + ], + [ + 8.68466982663634, + 49.575562093136476 + ], + [ + 8.684306835073835, + 49.570222471035414 + ], + [ + 8.693103991542326, + 49.56072811907392 + ], + [ + 8.690770781846195, + 49.55564319374292 + ], + [ + 8.698615480328485, + 49.54900407850172 + ], + [ + 8.705794410693196, + 49.54796552899523 + ], + [ + 8.702650221598939, + 49.53532789846665 + ], + [ + 8.707008771493603, + 49.53635102973935 + ], + [ + 8.712339598121421, + 49.53171120943032 + ], + [ + 8.718692563628876, + 49.53300840228839 + ], + [ + 8.724609342609254, + 49.525894434851104 + ], + [ + 8.735949885110045, + 49.524845988505696 + ], + [ + 8.7355131493785, + 49.52131546274544 + ], + [ + 8.724894759646293, + 49.522637102416674 + ], + [ + 8.727711249966774, + 49.51833854898071 + ], + [ + 8.737227042079278, + 49.519288374046994 + ], + [ + 8.740428517306505, + 49.52318969220289 + ], + [ + 8.74870874845698, + 49.522427547753196 + ], + [ + 8.76420362423733, + 49.51519803236217 + ], + [ + 8.776780529010205, + 49.5178719589077 + ], + [ + 8.798590607818518, + 49.5116887501799 + ], + [ + 8.798128711377453, + 49.51850999898175 + ], + [ + 8.80920613456356, + 49.52568010390132 + ], + [ + 8.821874005250354, + 49.52463646991499 + ], + [ + 8.816962864962058, + 49.505793060971364 + ], + [ + 8.831166191014152, + 49.492261999774065 + ], + [ + 8.836734185260507, + 49.49290330122769 + ], + [ + 8.839448611311312, + 49.498783704906465 + ], + [ + 8.844550101608155, + 49.49840152990439 + ], + [ + 8.848501613228935, + 49.50217327571615 + ], + [ + 8.856782345384271, + 49.50123233488314 + ], + [ + 8.882661470488392, + 49.506096148588675 + ], + [ + 8.899572708060383, + 49.50365573019601 + ], + [ + 8.899354817584529, + 49.484549799914646 + ], + [ + 8.876495012626476, + 49.466686032749 + ], + [ + 8.862923785250944, + 49.466678850224156 + ], + [ + 8.866340213295494, + 49.47459268439969 + ], + [ + 8.851932271779093, + 49.483588213516825 + ], + [ + 8.825400545593283, + 49.467009852231676 + ], + [ + 8.823524968197841, + 49.46267839710908 + ], + [ + 8.828733135028957, + 49.46092254421862 + ], + [ + 8.834607504653329, + 49.45038268032718 + ], + [ + 8.83261774289946, + 49.436716500636074 + ], + [ + 8.836452906475257, + 49.430218301798284 + ], + [ + 8.830501935567668, + 49.42322883400947 + ], + [ + 8.81664097045417, + 49.42317561655159 + ], + [ + 8.806587634473399, + 49.41920082452017 + ], + [ + 8.808323114257457, + 49.411839493459794 + ], + [ + 8.801386330262119, + 49.41067336062458 + ], + [ + 8.808293518617257, + 49.406422236826515 + ], + [ + 8.803540602831967, + 49.403570376708046 + ], + [ + 8.821770545862892, + 49.39484546757295 + ], + [ + 8.831880382990356, + 49.40818662322229 + ], + [ + 8.850466538913842, + 49.39541333912679 + ], + [ + 8.873339597373441, + 49.412823870010634 + ], + [ + 8.892389343535864, + 49.420907378524106 + ], + [ + 8.900948949062627, + 49.44336867034699 + ], + [ + 8.912567029639735, + 49.437614403171025 + ], + [ + 8.92473949227129, + 49.44130328931638 + ], + [ + 8.927774526273804, + 49.44931771985754 + ], + [ + 8.940888385727046, + 49.45049855598192 + ], + [ + 8.950348719801449, + 49.45499288266684 + ], + [ + 8.931879784490947, + 49.470636807487026 + ], + [ + 8.942795189413959, + 49.4856884940204 + ], + [ + 8.954639722267906, + 49.48200922875902 + ], + [ + 8.950599560520917, + 49.48779344870401 + ], + [ + 8.95772743500557, + 49.49548529696167 + ], + [ + 8.951832484391737, + 49.505626233673865 + ], + [ + 8.96800290824844, + 49.50159982353594 + ], + [ + 8.977471625942606, + 49.50341517994311 + ], + [ + 8.979174779888309, + 49.509180363884894 + ], + [ + 8.985833819284325, + 49.51033032663123 + ], + [ + 8.992255705345986, + 49.50338505750013 + ], + [ + 9.012180163170122, + 49.50266760031556 + ], + [ + 9.013978091818561, + 49.49815640820787 + ], + [ + 9.042823599370386, + 49.49904533646159 + ], + [ + 9.042078670812108, + 49.50626987104661 + ], + [ + 9.05006324384009, + 49.51316596631787 + ], + [ + 9.050509463045556, + 49.51896622860452 + ], + [ + 9.06495077885142, + 49.52960601001299 + ], + [ + 9.07885755901251, + 49.524941082884 + ], + [ + 9.099554223765313, + 49.526189352086455 + ], + [ + 9.106127381387862, + 49.50979606493179 + ], + [ + 9.119530000285394, + 49.51221011561123 + ], + [ + 9.12641383154586, + 49.51694579566356 + ], + [ + 9.123637692319644, + 49.519773216064934 + ], + [ + 9.126459732088064, + 49.52160708659702 + ], + [ + 9.113767890363299, + 49.5346335067428 + ], + [ + 9.085387937003231, + 49.543432343769055 + ], + [ + 9.088063103617339, + 49.55024109094568 + ], + [ + 9.072205635986668, + 49.56524922826339 + ], + [ + 9.073074261716352, + 49.57494102115746 + ], + [ + 9.078042594668831, + 49.57480364099718 + ], + [ + 9.082631683242427, + 49.56178920364897 + ], + [ + 9.098930718587189, + 49.56055390602041 + ], + [ + 9.1003767698696, + 49.57226777042367 + ], + [ + 9.108265918947957, + 49.57930243583091 + ], + [ + 9.117713691137151, + 49.57367777581959 + ], + [ + 9.158889937145641, + 49.57959030216266 + ], + [ + 9.164997222546189, + 49.57545168313551 + ], + [ + 9.173276474333068, + 49.57776255271976 + ], + [ + 9.180803939801969, + 49.5737477277168 + ], + [ + 9.187303514840826, + 49.576891554588016 + ], + [ + 9.194410460237151, + 49.57404063897721 + ], + [ + 9.248940156297035, + 49.58451840479485 + ], + [ + 9.246443172503637, + 49.590024204984125 + ], + [ + 9.24945845923933, + 49.59380054220646 + ], + [ + 9.259036536374268, + 49.59327621331704 + ], + [ + 9.26457762232631, + 49.60681972515635 + ], + [ + 9.285023050526675, + 49.61480132910543 + ], + [ + 9.27009917642614, + 49.62648984147282 + ], + [ + 9.27481872796133, + 49.63094982170535 + ], + [ + 9.27072260140703, + 49.63401856525693 + ], + [ + 9.278420316057709, + 49.637988837326326 + ], + [ + 9.285576822547556, + 49.636050385493675 + ], + [ + 9.290493301428516, + 49.64376892061828 + ], + [ + 9.306487190426042, + 49.65080375595246 + ], + [ + 9.304083058091193, + 49.65494425258378 + ], + [ + 9.343880585475636, + 49.64429965197113 + ], + [ + 9.367577758801508, + 49.65874605767053 + ], + [ + 9.382237956353714, + 49.64318018564812 + ], + [ + 9.393784063169903, + 49.6463097642174 + ], + [ + 9.40600042189255, + 49.64531278609782 + ], + [ + 9.41949546307367, + 49.658853552256886 + ], + [ + 9.397891490045053, + 49.6706607264314 + ], + [ + 9.401482639591707, + 49.674852407157786 + ], + [ + 9.412472092265732, + 49.675469289166465 + ], + [ + 9.406391045204082, + 49.67958151166111 + ], + [ + 9.420088259427802, + 49.69019189041947 + ], + [ + 9.418680826535576, + 49.71189830059227 + ], + [ + 9.407930499165658, + 49.721458583237954 + ], + [ + 9.401067576039267, + 49.72056451511309 + ], + [ + 9.399960653370538, + 49.72884051299427 + ], + [ + 9.385645191653582, + 49.73091454484835 + ], + [ + 9.386761384291619, + 49.72841157841804 + ], + [ + 9.380160749175271, + 49.726118346286626 + ], + [ + 9.382528565795383, + 49.70746287837742 + ], + [ + 9.372068999180856, + 49.70399847429332 + ], + [ + 9.357409236454538, + 49.70428829291196 + ], + [ + 9.352232357020267, + 49.71648171747813 + ], + [ + 9.344030942261565, + 49.71861396812636 + ], + [ + 9.374211198361545, + 49.728002029965324 + ], + [ + 9.341713435908169, + 49.73419909354363 + ], + [ + 9.32286705265911, + 49.731170810798496 + ], + [ + 9.31589483833743, + 49.735237188703 + ], + [ + 9.296371721009947, + 49.73871180167143 + ], + [ + 9.299786821572107, + 49.740925442425166 + ], + [ + 9.317667451652845, + 49.740447364090016 + ], + [ + 9.323124375776603, + 49.74379726942433 + ], + [ + 9.313250661047402, + 49.76169895010865 + ], + [ + 9.315683247395151, + 49.768328736516025 + ], + [ + 9.351035813617637, + 49.769006988632185 + ], + [ + 9.372610337537285, + 49.778976811849255 + ], + [ + 9.391546882925343, + 49.77012060586345 + ], + [ + 9.42510676148321, + 49.789553721185264 + ], + [ + 9.434851987211722, + 49.78737869285938 + ], + [ + 9.445002526846057, + 49.773959075347506 + ], + [ + 9.458256574607077, + 49.76951971398795 + ], + [ + 9.469391890095602, + 49.77429106752398 + ], + [ + 9.479097061983726, + 49.78689431037743 + ], + [ + 9.501585649410705, + 49.788722801393895 + ], + [ + 9.512861169288252, + 49.78179433973407 + ], + [ + 9.510047534550795, + 49.77009113868452 + ], + [ + 9.514512299370619, + 49.76378679387834 + ], + [ + 9.522996548829097, + 49.76120590228084 + ], + [ + 9.53763258952304, + 49.76755713848204 + ], + [ + 9.54646223687128, + 49.76642600159493 + ], + [ + 9.552429578478733, + 49.76042974186791 + ], + [ + 9.55506067779949, + 49.74752250024397 + ], + [ + 9.563380496657517, + 49.744568384532485 + ], + [ + 9.568927695795152, + 49.75058824984287 + ], + [ + 9.559106348913096, + 49.762734625289305 + ], + [ + 9.557507548202647, + 49.774741846701275 + ], + [ + 9.563406696750702, + 49.78137674816759 + ], + [ + 9.580057328168454, + 49.78403212989314 + ], + [ + 9.57634645094466, + 49.77905345344756 + ], + [ + 9.581076413323913, + 49.77803014417021 + ], + [ + 9.589686356546112, + 49.78116759487835 + ], + [ + 9.620304742504707, + 49.78375722785252 + ], + [ + 9.64873620261789, + 49.79147764978886 + ], + [ + 9.651418612909339, + 49.78055704496921 + ] + ], + [ + [ + 8.675960362223108, + 49.61595325341233 + ], + [ + 8.685979754279812, + 49.61835508593153 + ], + [ + 8.685867890847106, + 49.62166492570476 + ], + [ + 8.675112578784045, + 49.62110502711249 + ], + [ + 8.671863583570886, + 49.61587813429886 + ], + [ + 8.675960362223108, + 49.61595325341233 + ] + ] + ], + [ + [ + [ + 8.70128228764941, + 47.71522423246324 + ], + [ + 8.711949780114606, + 47.70116393539017 + ], + [ + 8.711427705609516, + 47.696683238268356 + ], + [ + 8.7174394629754, + 47.695556971260075 + ], + [ + 8.717719625745968, + 47.690742263408055 + ], + [ + 8.707655556207229, + 47.68961523943184 + ], + [ + 8.690226399144253, + 47.69538285910013 + ], + [ + 8.672126391088758, + 47.68523410874218 + ], + [ + 8.663354237888624, + 47.68589256057521 + ], + [ + 8.658439713206578, + 47.69133783457652 + ], + [ + 8.668274119984915, + 47.69217790685578 + ], + [ + 8.676489970759489, + 47.69794298246394 + ], + [ + 8.664634630511516, + 47.713427744866564 + ], + [ + 8.671419203742383, + 47.711020738296014 + ], + [ + 8.678110782555095, + 47.71304748340118 + ], + [ + 8.68636177517454, + 47.70858298683779 + ], + [ + 8.70128228764941, + 47.71522423246324 + ] + ] + ], + [ + [ + [ + 9.200570643109554, + 47.705942317933044 + ], + [ + 9.198585499724258, + 47.70243134956108 + ], + [ + 9.187797273513635, + 47.70558246414157 + ], + [ + 9.195329474430315, + 47.70827941689169 + ], + [ + 9.200570643109554, + 47.705942317933044 + ] + ] + ], + [ + [ + [ + 9.12593238061265, + 47.66864119630927 + ], + [ + 9.12129224075641, + 47.67143612435889 + ], + [ + 9.12153587846455, + 47.67483500838321 + ], + [ + 9.123335109807655, + 47.673944621003244 + ], + [ + 9.12593238061265, + 47.66864119630927 + ] + ] + ], + [ + [ + [ + 8.682067707126087, + 49.61890991134107 + ], + [ + 8.68006748578963, + 49.618665101451946 + ], + [ + 8.680116543597796, + 49.62028571397243 + ], + [ + 8.684052726817974, + 49.6202229658076 + ], + [ + 8.682067707126087, + 49.61890991134107 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "05", + "AGS": "05", + "SDV_RS": "051110000000", + "GEN": "Nordrhein-Westfalen", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "05", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEA", + "RS_0": "050000000000", + "AGS_0": "05000000", + "WSK": "2009/11/01", + "DEBKG_ID": "DEBKGDL20000E6GR", + "destatis": { + "population": 17638098, + "population_m": 8606003, + "population_w": 9032095 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 8.669988518782317, + 52.51857063289291 + ], + [ + 8.69031361840823, + 52.51877456562046 + ], + [ + 8.68412213747445, + 52.51439466155152 + ], + [ + 8.69865282111199, + 52.50880737137397 + ], + [ + 8.70206180647102, + 52.50347337760163 + ], + [ + 8.698753397717505, + 52.50164016920661 + ], + [ + 8.703008886517935, + 52.50043805272801 + ], + [ + 8.698548986054817, + 52.4866982769972 + ], + [ + 8.709323024838762, + 52.47703584924315 + ], + [ + 8.7107091529936, + 52.463698015655126 + ], + [ + 8.703326107285472, + 52.44319479941195 + ], + [ + 8.71808068533185, + 52.429362910512005 + ], + [ + 8.717068847734275, + 52.42519186356069 + ], + [ + 8.709439689910981, + 52.42425089440475 + ], + [ + 8.704469274294068, + 52.419013165897425 + ], + [ + 8.704812068405923, + 52.41300904105851 + ], + [ + 8.710902090460364, + 52.40821506138475 + ], + [ + 8.707486372863782, + 52.39535126503696 + ], + [ + 8.715236303629514, + 52.39256879415206 + ], + [ + 8.72491388114986, + 52.400929226598265 + ], + [ + 8.746086795443585, + 52.387872222972774 + ], + [ + 8.786783987052615, + 52.39870647215561 + ], + [ + 8.855101141442411, + 52.38923412328942 + ], + [ + 8.85837679661331, + 52.39374971016013 + ], + [ + 8.86694957969211, + 52.396252369728415 + ], + [ + 8.868558100713125, + 52.39266394664687 + ], + [ + 8.889183037763658, + 52.39598121622016 + ], + [ + 8.892460430066206, + 52.40570942291009 + ], + [ + 8.896027035094857, + 52.40609027110702 + ], + [ + 8.89771543655553, + 52.40158479073623 + ], + [ + 8.903665581311694, + 52.401912590901105 + ], + [ + 8.903104714159046, + 52.404580151492375 + ], + [ + 8.937577150676074, + 52.40210070684577 + ], + [ + 8.935209162267737, + 52.404642555763104 + ], + [ + 8.944139225082996, + 52.40839255530534 + ], + [ + 8.946065121402476, + 52.41352675376105 + ], + [ + 8.941128429689574, + 52.416323326225005 + ], + [ + 8.957962300856119, + 52.41616131126163 + ], + [ + 8.96219250528398, + 52.42499603379443 + ], + [ + 8.977986504158283, + 52.42699597235529 + ], + [ + 8.987056167021224, + 52.4325164217834 + ], + [ + 8.979175718195048, + 52.436260543874 + ], + [ + 8.986727120386318, + 52.44551442261614 + ], + [ + 8.978418281809521, + 52.45072161523495 + ], + [ + 8.992117983428365, + 52.45060847796376 + ], + [ + 8.99891974553588, + 52.4575630043375 + ], + [ + 9.012089081021077, + 52.457311341722 + ], + [ + 9.017158336331722, + 52.45994785684721 + ], + [ + 9.022950188948021, + 52.47726199857193 + ], + [ + 9.028100008069005, + 52.48059013111743 + ], + [ + 9.038287404572767, + 52.47990470822609 + ], + [ + 9.044076447979107, + 52.48264624751757 + ], + [ + 9.04147811693798, + 52.487345972478586 + ], + [ + 9.052656209719208, + 52.50029804976506 + ], + [ + 9.06584534443683, + 52.49620139131845 + ], + [ + 9.071941690430991, + 52.49866634996737 + ], + [ + 9.08802354484065, + 52.495761830735205 + ], + [ + 9.099420427691824, + 52.49747790020782 + ], + [ + 9.112375502633311, + 52.485781930269134 + ], + [ + 9.133025821589687, + 52.482816343336204 + ], + [ + 9.136708747385837, + 52.4755456289822 + ], + [ + 9.123288968262077, + 52.47461041304461 + ], + [ + 9.125618081430208, + 52.46829591004699 + ], + [ + 9.102923073659037, + 52.45692635527466 + ], + [ + 9.094530000867744, + 52.44282393609016 + ], + [ + 9.110523179196164, + 52.4354271843622 + ], + [ + 9.112414945251844, + 52.427542664486666 + ], + [ + 9.105983481759708, + 52.42568732971734 + ], + [ + 9.11167573021449, + 52.420690312966016 + ], + [ + 9.123766660934105, + 52.42154768722118 + ], + [ + 9.125415730452229, + 52.41282324138028 + ], + [ + 9.117431992761773, + 52.397147494942764 + ], + [ + 9.112374037105873, + 52.39766038081627 + ], + [ + 9.095461469197195, + 52.38666204330845 + ], + [ + 9.10072110199626, + 52.380624812513766 + ], + [ + 9.098799447688334, + 52.37294765664839 + ], + [ + 9.088926605890585, + 52.366283670655896 + ], + [ + 9.085110546322298, + 52.355858402136285 + ], + [ + 9.077542753452562, + 52.35405990607756 + ], + [ + 9.072541175439044, + 52.34825261458253 + ], + [ + 9.059175059529524, + 52.34686059449991 + ], + [ + 9.0579248262507, + 52.33957740164747 + ], + [ + 9.027357219882479, + 52.345610946129526 + ], + [ + 9.018907987028369, + 52.33098843564273 + ], + [ + 9.009576702543407, + 52.33121473351154 + ], + [ + 9.007703029432415, + 52.32572220539568 + ], + [ + 8.998320816218438, + 52.32621485226264 + ], + [ + 8.985279911864295, + 52.2957287533707 + ], + [ + 8.988077144929187, + 52.287568987179355 + ], + [ + 8.963536742965317, + 52.27902697502795 + ], + [ + 8.972107487667797, + 52.27345275296536 + ], + [ + 8.978577318999589, + 52.27479177439846 + ], + [ + 8.972366634417288, + 52.26461945746418 + ], + [ + 8.974870267517238, + 52.262555318151236 + ], + [ + 9.004221296482639, + 52.25749279556106 + ], + [ + 9.006508408565091, + 52.25284434431304 + ], + [ + 9.03297001658824, + 52.24952628296926 + ], + [ + 9.056558338693844, + 52.23788451165274 + ], + [ + 9.076615815364528, + 52.23343716742968 + ], + [ + 9.069887598100525, + 52.22678783088412 + ], + [ + 9.051747819393405, + 52.220212635408735 + ], + [ + 9.04242893087674, + 52.22621671084392 + ], + [ + 9.035759915109479, + 52.224525071348666 + ], + [ + 9.034064500687416, + 52.217640460438794 + ], + [ + 9.045855734174337, + 52.21078548554869 + ], + [ + 9.043404742866251, + 52.20414367542282 + ], + [ + 9.048523790819269, + 52.195659731047364 + ], + [ + 9.043085685313002, + 52.190429933987005 + ], + [ + 9.045349209994752, + 52.183773446704194 + ], + [ + 9.021111202902047, + 52.18383604850948 + ], + [ + 9.01963793569253, + 52.192175168757444 + ], + [ + 9.01358963747118, + 52.19537473441808 + ], + [ + 9.006990673310465, + 52.189517081431674 + ], + [ + 8.999731540244206, + 52.190811658591834 + ], + [ + 8.994035622797778, + 52.19613775129346 + ], + [ + 8.985833623265101, + 52.1945985936325 + ], + [ + 8.993759960317268, + 52.19167221268501 + ], + [ + 8.99627319951044, + 52.185649441172295 + ], + [ + 9.00104649324995, + 52.18779645484243 + ], + [ + 9.00133206075187, + 52.183158033701595 + ], + [ + 9.01242270174118, + 52.177907815143755 + ], + [ + 9.01146353925308, + 52.17326286815035 + ], + [ + 9.021587719353063, + 52.17182335248089 + ], + [ + 9.012669278136858, + 52.162410498486686 + ], + [ + 9.017538681124051, + 52.14774418304544 + ], + [ + 9.011015900219414, + 52.13577000465161 + ], + [ + 9.017792061613324, + 52.13242667185156 + ], + [ + 9.036256461189936, + 52.140076230966464 + ], + [ + 9.0443864898014, + 52.139599791082155 + ], + [ + 9.053365580899438, + 52.14822821277588 + ], + [ + 9.071614898740272, + 52.14825880323065 + ], + [ + 9.067803093393675, + 52.14025160420042 + ], + [ + 9.08178334745329, + 52.14110205865908 + ], + [ + 9.084912360533437, + 52.13736078681275 + ], + [ + 9.094024144750033, + 52.134895468933294 + ], + [ + 9.09714192723343, + 52.137127166614825 + ], + [ + 9.099140410991408, + 52.133021405062465 + ], + [ + 9.107039403126754, + 52.13238508111911 + ], + [ + 9.116078186283165, + 52.138445518901285 + ], + [ + 9.129796432244232, + 52.1397461147234 + ], + [ + 9.12908227071392, + 52.135329873286096 + ], + [ + 9.143606819183558, + 52.13507283789312 + ], + [ + 9.153344072937578, + 52.129146678601906 + ], + [ + 9.159335103714595, + 52.11984022621441 + ], + [ + 9.155844925027628, + 52.11434039917865 + ], + [ + 9.14620440774805, + 52.11324193099201 + ], + [ + 9.146924269336626, + 52.10920185006745 + ], + [ + 9.13586306471855, + 52.105837389434186 + ], + [ + 9.132977916362119, + 52.09662945210804 + ], + [ + 9.134648347273515, + 52.094281430165275 + ], + [ + 9.146515018929772, + 52.099922216280575 + ], + [ + 9.15560469839149, + 52.0978298710163 + ], + [ + 9.154688559698538, + 52.09179213821502 + ], + [ + 9.17608700679414, + 52.086116975928114 + ], + [ + 9.193280774871425, + 52.07031133927141 + ], + [ + 9.181347594718465, + 52.067866441304176 + ], + [ + 9.179432730759295, + 52.06212926689109 + ], + [ + 9.17443249549783, + 52.060427494457485 + ], + [ + 9.172169130315694, + 52.0473705514216 + ], + [ + 9.17565496748515, + 52.03457677421371 + ], + [ + 9.18903934370744, + 52.02627757599404 + ], + [ + 9.197379615501898, + 52.01157315997334 + ], + [ + 9.179261561642598, + 52.00269032924773 + ], + [ + 9.19679375701672, + 51.996917100160005 + ], + [ + 9.183704313629658, + 51.99094345201268 + ], + [ + 9.183053126235432, + 51.9857632720515 + ], + [ + 9.174689700238913, + 51.98325941368496 + ], + [ + 9.176231466447549, + 51.980352693001784 + ], + [ + 9.187813208466995, + 51.97281586301539 + ], + [ + 9.185820219656689, + 51.966181412026955 + ], + [ + 9.198615844558148, + 51.96234553203131 + ], + [ + 9.202721501163174, + 51.96493637523705 + ], + [ + 9.208896029258678, + 51.9598552911289 + ], + [ + 9.209427056320552, + 51.96720200310858 + ], + [ + 9.21330001170672, + 51.97087155179969 + ], + [ + 9.217123377458584, + 51.96977026309701 + ], + [ + 9.216921993280389, + 51.9736242154584 + ], + [ + 9.257758111904097, + 51.97720983279267 + ], + [ + 9.269997087255845, + 51.97390929746652 + ], + [ + 9.268408810753208, + 51.970168380326015 + ], + [ + 9.27437535910782, + 51.973603596223874 + ], + [ + 9.277575694503588, + 51.961860260480194 + ], + [ + 9.286323835664032, + 51.95710974213933 + ], + [ + 9.27139377088994, + 51.95513026289741 + ], + [ + 9.271728917942477, + 51.94973586305552 + ], + [ + 9.268371249457898, + 51.94684927765628 + ], + [ + 9.263912830026527, + 51.94805354908316 + ], + [ + 9.277070261922086, + 51.94385323087351 + ], + [ + 9.278640691720353, + 51.94012683802912 + ], + [ + 9.273372678531079, + 51.94008162956461 + ], + [ + 9.272069028340102, + 51.9323042080722 + ], + [ + 9.287373730691295, + 51.92105368027288 + ], + [ + 9.289992522380278, + 51.92269972945507 + ], + [ + 9.29426941741104, + 51.9194414579583 + ], + [ + 9.314943365319257, + 51.92280706258741 + ], + [ + 9.318447703502132, + 51.9184156797912 + ], + [ + 9.331904481969081, + 51.917316131916756 + ], + [ + 9.340841883310434, + 51.90800232349204 + ], + [ + 9.344326577754636, + 51.880201093312955 + ], + [ + 9.340165313235872, + 51.87864012155629 + ], + [ + 9.33575738631024, + 51.856051510976705 + ], + [ + 9.323343735912266, + 51.85506096217584 + ], + [ + 9.334699754871146, + 51.8536107402885 + ], + [ + 9.362865542207714, + 51.864878964263355 + ], + [ + 9.392852288645225, + 51.86035816976773 + ], + [ + 9.404902437940068, + 51.85559295544217 + ], + [ + 9.437366927412928, + 51.85622165640826 + ], + [ + 9.459648734904937, + 51.862797427689245 + ], + [ + 9.461435980354583, + 51.85770311705322 + ], + [ + 9.455737620473451, + 51.851499582796954 + ], + [ + 9.433149499096613, + 51.840278045193024 + ], + [ + 9.442178494680725, + 51.82922116791767 + ], + [ + 9.437933145103234, + 51.830703662680726 + ], + [ + 9.440521309240905, + 51.824933024139895 + ], + [ + 9.427329971378446, + 51.81049191448682 + ], + [ + 9.43054739105141, + 51.810691902733126 + ], + [ + 9.430901363143347, + 51.80488327320005 + ], + [ + 9.44081744549671, + 51.80345181661288 + ], + [ + 9.436367412099424, + 51.797015378177704 + ], + [ + 9.448156881625001, + 51.79479940974031 + ], + [ + 9.409550769057125, + 51.77104112517435 + ], + [ + 9.402696727087433, + 51.759371972495046 + ], + [ + 9.384336129984819, + 51.75785097126557 + ], + [ + 9.383725124016586, + 51.75023385367308 + ], + [ + 9.375365201060985, + 51.74361401702886 + ], + [ + 9.378877584218927, + 51.73809621039587 + ], + [ + 9.394415502869643, + 51.731971436548655 + ], + [ + 9.387318166956309, + 51.719390180465766 + ], + [ + 9.401664934979168, + 51.701656162930696 + ], + [ + 9.386923489576398, + 51.68982224394587 + ], + [ + 9.395687618729884, + 51.673988556165106 + ], + [ + 9.379388530882116, + 51.66592673771928 + ], + [ + 9.374706085604641, + 51.64984028649132 + ], + [ + 9.386311841488538, + 51.64601844290624 + ], + [ + 9.417317501499499, + 51.64726925220617 + ], + [ + 9.434653445631787, + 51.65117858380277 + ], + [ + 9.440456997710914, + 51.65039402248708 + ], + [ + 9.437944705190214, + 51.64771733181217 + ], + [ + 9.445084681702896, + 51.644146453853295 + ], + [ + 9.426669031862971, + 51.63081380898922 + ], + [ + 9.398499433395605, + 51.624557373649914 + ], + [ + 9.378266679213729, + 51.62673325343856 + ], + [ + 9.37193485109371, + 51.62556629325969 + ], + [ + 9.371266831484187, + 51.61924381547859 + ], + [ + 9.358030937257961, + 51.6202592434398 + ], + [ + 9.337098311723196, + 51.614701568254404 + ], + [ + 9.356268196400162, + 51.5976768251476 + ], + [ + 9.373522627935134, + 51.59101373235738 + ], + [ + 9.352244666162687, + 51.58010181470525 + ], + [ + 9.331118931419347, + 51.55682483970977 + ], + [ + 9.31703096952167, + 51.552365548523525 + ], + [ + 9.320018194767464, + 51.54677198797943 + ], + [ + 9.309968656291103, + 51.530910611386545 + ], + [ + 9.31616372705741, + 51.52335753141024 + ], + [ + 9.308324697000028, + 51.51264327359829 + ], + [ + 9.286880289591808, + 51.5154772002567 + ], + [ + 9.269430452850383, + 51.50712581975931 + ], + [ + 9.264333034402412, + 51.497910643871336 + ], + [ + 9.240696811538138, + 51.497183435435645 + ], + [ + 9.236704692207347, + 51.492434795144554 + ], + [ + 9.23980378050386, + 51.490857374345744 + ], + [ + 9.225184632608592, + 51.489837271417876 + ], + [ + 9.216640648253486, + 51.48116523360298 + ], + [ + 9.216465953777892, + 51.459593997128216 + ], + [ + 9.185100362355085, + 51.466333561349686 + ], + [ + 9.174350380355168, + 51.46294667891397 + ], + [ + 9.16164501327887, + 51.44416774291716 + ], + [ + 9.149298761257187, + 51.442015008060274 + ], + [ + 9.135749292546791, + 51.45018705747933 + ], + [ + 9.131804237135217, + 51.44629001315439 + ], + [ + 9.102594184240655, + 51.44320222770015 + ], + [ + 9.086415850453935, + 51.44908282263 + ], + [ + 9.08693706973157, + 51.461164813131745 + ], + [ + 9.07718543263466, + 51.46487161124135 + ], + [ + 9.092084097380981, + 51.48733042672817 + ], + [ + 9.092328869272762, + 51.49438795168085 + ], + [ + 9.076521836676083, + 51.50347514554159 + ], + [ + 9.060662592064597, + 51.49870347110548 + ], + [ + 9.057476861681499, + 51.50251461511676 + ], + [ + 9.039285947568548, + 51.50192152220145 + ], + [ + 9.023958187180202, + 51.51133420779726 + ], + [ + 9.02097643053921, + 51.51861066960447 + ], + [ + 9.00493273778259, + 51.51240556744487 + ], + [ + 8.945737401711908, + 51.50121925828669 + ], + [ + 8.890376607820428, + 51.48192827674489 + ], + [ + 8.89409102174797, + 51.471236275828964 + ], + [ + 8.910699678800418, + 51.46191896841505 + ], + [ + 8.913996495295812, + 51.4526171804034 + ], + [ + 8.921783451697667, + 51.446053819492285 + ], + [ + 8.918786788166999, + 51.43028542794802 + ], + [ + 8.93415561910733, + 51.431291039836765 + ], + [ + 8.948108682227941, + 51.428218886745064 + ], + [ + 8.94590413409648, + 51.41907562190674 + ], + [ + 8.951529911132232, + 51.413492782753174 + ], + [ + 8.940763338195486, + 51.41032194281195 + ], + [ + 8.94307831088136, + 51.39687148421667 + ], + [ + 8.939502002802268, + 51.38949902170004 + ], + [ + 8.915928443327376, + 51.392837135514704 + ], + [ + 8.88958079551572, + 51.392721985940305 + ], + [ + 8.854019775269204, + 51.37713784864625 + ], + [ + 8.837994438171219, + 51.38329257893739 + ], + [ + 8.836583684105333, + 51.38850109065257 + ], + [ + 8.827252393415915, + 51.38524592324732 + ], + [ + 8.823374914940143, + 51.38982520858854 + ], + [ + 8.803993170125432, + 51.390797941574625 + ], + [ + 8.772903671531965, + 51.3853937782683 + ], + [ + 8.760322472054437, + 51.37827139869458 + ], + [ + 8.73285099630853, + 51.372416701413044 + ], + [ + 8.693811209359898, + 51.376784751866026 + ], + [ + 8.677446063986634, + 51.37179503258846 + ], + [ + 8.683476499647153, + 51.36217790429217 + ], + [ + 8.666599017144542, + 51.35569685051956 + ], + [ + 8.659662020907755, + 51.34838900744424 + ], + [ + 8.655559599319602, + 51.34961114745694 + ], + [ + 8.653654041856214, + 51.33978949978757 + ], + [ + 8.637787568320165, + 51.343613496892814 + ], + [ + 8.621098213243496, + 51.33652789514928 + ], + [ + 8.619942767948249, + 51.32973512756758 + ], + [ + 8.605048337078228, + 51.323694869217796 + ], + [ + 8.60324080089121, + 51.31485685257853 + ], + [ + 8.59187052064313, + 51.30332347414491 + ], + [ + 8.566377620303296, + 51.2877734569823 + ], + [ + 8.556347796036086, + 51.27749475046371 + ], + [ + 8.5782180949312, + 51.26747828068479 + ], + [ + 8.593562756046166, + 51.24749677620253 + ], + [ + 8.609212359876091, + 51.24668843938487 + ], + [ + 8.625391094150594, + 51.25331147464841 + ], + [ + 8.628340519769566, + 51.260504602002385 + ], + [ + 8.679952602984308, + 51.268076538245765 + ], + [ + 8.692215487870333, + 51.27657310986116 + ], + [ + 8.695833960056497, + 51.2743069363662 + ], + [ + 8.721997745453022, + 51.27374380460853 + ], + [ + 8.721827237795559, + 51.26774745052558 + ], + [ + 8.736585315041035, + 51.262219701964916 + ], + [ + 8.727597513512027, + 51.25010269862022 + ], + [ + 8.741697463487554, + 51.21842326043187 + ], + [ + 8.768194376201677, + 51.208873682855845 + ], + [ + 8.765013147420051, + 51.20393076669322 + ], + [ + 8.749501813399922, + 51.197731698936394 + ], + [ + 8.750004462797593, + 51.18146387979495 + ], + [ + 8.758214362271957, + 51.177181727675034 + ], + [ + 8.736942759887034, + 51.16393033163894 + ], + [ + 8.736326548003486, + 51.16057311866555 + ], + [ + 8.718328214635484, + 51.15148037189484 + ], + [ + 8.71376124679551, + 51.15190566383345 + ], + [ + 8.69216180353735, + 51.132834140378435 + ], + [ + 8.701741130828179, + 51.11657664969242 + ], + [ + 8.718848165114942, + 51.11569578853908 + ], + [ + 8.719655316139768, + 51.110326153217514 + ], + [ + 8.706886114330548, + 51.10779080656069 + ], + [ + 8.6905346924498, + 51.10915858560236 + ], + [ + 8.656632492071319, + 51.0949031986577 + ], + [ + 8.601460656891325, + 51.102034562505466 + ], + [ + 8.551019821375563, + 51.10276424295062 + ], + [ + 8.5453489361491, + 51.097242168333096 + ], + [ + 8.52812272409859, + 51.09695248380078 + ], + [ + 8.52261102738209, + 51.090459872301466 + ], + [ + 8.517594008664853, + 51.09113982408024 + ], + [ + 8.50802276015056, + 51.08538751319367 + ], + [ + 8.501733297704398, + 51.079465596628204 + ], + [ + 8.503230088180391, + 51.0745768731554 + ], + [ + 8.522226649872959, + 51.06901401988967 + ], + [ + 8.527572852513797, + 51.06289413384692 + ], + [ + 8.520434697672078, + 51.05010938626774 + ], + [ + 8.515933806599039, + 51.05117598197635 + ], + [ + 8.505143530371098, + 51.0414332204929 + ], + [ + 8.509803550312789, + 51.03764257018825 + ], + [ + 8.520681140374792, + 51.04300308884791 + ], + [ + 8.525110558408384, + 51.03890191139535 + ], + [ + 8.524318513783223, + 51.032030029751276 + ], + [ + 8.531342079976929, + 51.02932265968021 + ], + [ + 8.534551052453132, + 51.02062823701152 + ], + [ + 8.538782177927967, + 51.01944843005333 + ], + [ + 8.530628246785497, + 51.01823986364743 + ], + [ + 8.530760672668213, + 51.01377779931585 + ], + [ + 8.524560595235005, + 51.00993760082036 + ], + [ + 8.514075671555585, + 51.00923733996687 + ], + [ + 8.516562233276437, + 51.00580543577808 + ], + [ + 8.501414714894237, + 50.99845402475863 + ], + [ + 8.495757365752587, + 50.98809597726801 + ], + [ + 8.473368208814469, + 50.97503536648197 + ], + [ + 8.477891851119297, + 50.96904745630237 + ], + [ + 8.459665449499013, + 50.966650247377835 + ], + [ + 8.462277137133478, + 50.94969330139456 + ], + [ + 8.449323892365017, + 50.941083225263036 + ], + [ + 8.458675717316765, + 50.92108824247839 + ], + [ + 8.456441091881144, + 50.91653052185888 + ], + [ + 8.433426238069966, + 50.91823903738751 + ], + [ + 8.389163418779207, + 50.89204265941505 + ], + [ + 8.385575975995188, + 50.87579325480489 + ], + [ + 8.37191701184083, + 50.87426569055046 + ], + [ + 8.36658816693237, + 50.868551149413335 + ], + [ + 8.36920145841831, + 50.864602540929894 + ], + [ + 8.358600175944622, + 50.86069003236696 + ], + [ + 8.352677727380756, + 50.86544141732914 + ], + [ + 8.336748641181739, + 50.865712940488166 + ], + [ + 8.305473258111922, + 50.86112058851628 + ], + [ + 8.291897450048674, + 50.87715612049291 + ], + [ + 8.29217936123757, + 50.881707265815386 + ], + [ + 8.269835463127334, + 50.88119954545805 + ], + [ + 8.233149515420545, + 50.85528460616456 + ], + [ + 8.231313895026089, + 50.850639835614366 + ], + [ + 8.182840844945888, + 50.82487311852131 + ], + [ + 8.16580696544153, + 50.80347589036553 + ], + [ + 8.142472776936017, + 50.79464996301238 + ], + [ + 8.138362191646909, + 50.7902812834685 + ], + [ + 8.125511941065154, + 50.78835590667071 + ], + [ + 8.12939000950389, + 50.787463461345496 + ], + [ + 8.131708872791766, + 50.777002342018086 + ], + [ + 8.141662304177041, + 50.77165990124125 + ], + [ + 8.135641284680425, + 50.767216180828875 + ], + [ + 8.151833815993383, + 50.759853883544 + ], + [ + 8.14863441210707, + 50.75586770222767 + ], + [ + 8.154852632346914, + 50.748271138077726 + ], + [ + 8.164314887805547, + 50.74450251505116 + ], + [ + 8.159952572751541, + 50.7427106494012 + ], + [ + 8.164890256441671, + 50.74213512647806 + ], + [ + 8.16682898997636, + 50.7357106777664 + ], + [ + 8.142606559890655, + 50.69544845918114 + ], + [ + 8.137413944203473, + 50.6939581806945 + ], + [ + 8.131278842690447, + 50.69691964404979 + ], + [ + 8.125776742844804, + 50.68581404948876 + ], + [ + 8.121063881397884, + 50.68542016860119 + ], + [ + 8.109820137056252, + 50.69800777406989 + ], + [ + 8.099173320559608, + 50.70355792490064 + ], + [ + 8.08247945190819, + 50.70290436466424 + ], + [ + 8.079578597091258, + 50.706084624231494 + ], + [ + 8.059656032658374, + 50.695043311150606 + ], + [ + 8.039689942322912, + 50.697375345810855 + ], + [ + 8.043045796429137, + 50.71171577783464 + ], + [ + 8.040325986839502, + 50.72565709111106 + ], + [ + 8.000229496272032, + 50.75508077559619 + ], + [ + 7.98402780123609, + 50.76099008450697 + ], + [ + 7.968861797548623, + 50.77392108722933 + ], + [ + 7.964248180921246, + 50.78382248812627 + ], + [ + 7.968979052971702, + 50.785618405059246 + ], + [ + 7.967312566880147, + 50.798249086365104 + ], + [ + 7.973937841822852, + 50.8041734170975 + ], + [ + 7.971959957055569, + 50.81469969020495 + ], + [ + 7.978313123341388, + 50.83331176276865 + ], + [ + 7.968071052673247, + 50.83604172419107 + ], + [ + 7.966981799913537, + 50.84403951540331 + ], + [ + 7.957688480650591, + 50.848868992206405 + ], + [ + 7.952896069320929, + 50.84600905755082 + ], + [ + 7.938303447455071, + 50.84837987129838 + ], + [ + 7.922851854970482, + 50.84466176324271 + ], + [ + 7.905851426965089, + 50.84810944335776 + ], + [ + 7.892998209765262, + 50.85948064821847 + ], + [ + 7.893955751179649, + 50.86473298173619 + ], + [ + 7.887103903220597, + 50.86539832185387 + ], + [ + 7.882458169775111, + 50.874891135880425 + ], + [ + 7.872827786232592, + 50.87559206526959 + ], + [ + 7.869002340066146, + 50.87907078070731 + ], + [ + 7.850833319147456, + 50.877707354297115 + ], + [ + 7.82926358435423, + 50.88238662032318 + ], + [ + 7.826699861653405, + 50.890835915675936 + ], + [ + 7.834964820447053, + 50.901856855509656 + ], + [ + 7.833709738023687, + 50.90834653428892 + ], + [ + 7.851495862006642, + 50.92583240908314 + ], + [ + 7.846528597218638, + 50.93074303073695 + ], + [ + 7.838306960417486, + 50.9262875677696 + ], + [ + 7.837626802371349, + 50.929005695019676 + ], + [ + 7.828498720652848, + 50.9288897314374 + ], + [ + 7.818898600103587, + 50.933296579951396 + ], + [ + 7.813265981384604, + 50.940027244636674 + ], + [ + 7.792810758565112, + 50.94233509200108 + ], + [ + 7.785898055946699, + 50.939914116315606 + ], + [ + 7.776218913422718, + 50.92903657418395 + ], + [ + 7.757281421632989, + 50.920164000038504 + ], + [ + 7.735459231714069, + 50.91776539126454 + ], + [ + 7.746872127509461, + 50.91239199917908 + ], + [ + 7.745064030130164, + 50.905198977016894 + ], + [ + 7.750604338818219, + 50.90566329755655 + ], + [ + 7.760427259896, + 50.900393946292986 + ], + [ + 7.753021566030458, + 50.88837918273855 + ], + [ + 7.758767439044576, + 50.87977223459712 + ], + [ + 7.748309881166158, + 50.867216792961244 + ], + [ + 7.765973968659978, + 50.85681947827799 + ], + [ + 7.753187095359069, + 50.851368511654286 + ], + [ + 7.762187497503389, + 50.845134406837296 + ], + [ + 7.75804337937234, + 50.84348242444966 + ], + [ + 7.729342105278951, + 50.85052278912818 + ], + [ + 7.714285524724176, + 50.8404471850332 + ], + [ + 7.713613872861948, + 50.83361503976557 + ], + [ + 7.706390791797354, + 50.8338555788233 + ], + [ + 7.700016708247848, + 50.82541823289692 + ], + [ + 7.67462827739734, + 50.81919510291081 + ], + [ + 7.661003633112155, + 50.8203643031954 + ], + [ + 7.664109173067756, + 50.81535286028657 + ], + [ + 7.679510539182871, + 50.81004670587801 + ], + [ + 7.675047644466114, + 50.80266927124949 + ], + [ + 7.682222418599937, + 50.795368529370954 + ], + [ + 7.675944870216716, + 50.77932768469345 + ], + [ + 7.668455510173667, + 50.78618629252221 + ], + [ + 7.658936373790994, + 50.7848278735532 + ], + [ + 7.662161360059336, + 50.77315629604618 + ], + [ + 7.655450742486003, + 50.76786954395592 + ], + [ + 7.645393592113547, + 50.77088137756525 + ], + [ + 7.618168809410952, + 50.77017082780352 + ], + [ + 7.601042633693851, + 50.76631295385786 + ], + [ + 7.591505261381609, + 50.755781698964036 + ], + [ + 7.595297177492973, + 50.750969326551875 + ], + [ + 7.591521558557222, + 50.740276160238366 + ], + [ + 7.580246126517786, + 50.738137490239176 + ], + [ + 7.551900377325675, + 50.74634314496176 + ], + [ + 7.521534042666314, + 50.733655422016575 + ], + [ + 7.51938788300207, + 50.73740659061157 + ], + [ + 7.520123910656926, + 50.72899687944899 + ], + [ + 7.501940671590177, + 50.730013317243 + ], + [ + 7.479816338232133, + 50.718253910224504 + ], + [ + 7.448619767425206, + 50.717444761592226 + ], + [ + 7.443087183334344, + 50.711823524077346 + ], + [ + 7.432818252008535, + 50.70988584274338 + ], + [ + 7.423396633125697, + 50.70995095897779 + ], + [ + 7.407050971009926, + 50.718187622324784 + ], + [ + 7.397282413114079, + 50.714269920096434 + ], + [ + 7.374010755091872, + 50.718218641349644 + ], + [ + 7.357136449297792, + 50.697903894716 + ], + [ + 7.36830787202213, + 50.69709009589077 + ], + [ + 7.365116163103972, + 50.68761064149289 + ], + [ + 7.372062798617264, + 50.68210706420175 + ], + [ + 7.366175165584966, + 50.68070489552597 + ], + [ + 7.369315910682903, + 50.67254968931046 + ], + [ + 7.364317150400372, + 50.6727024351032 + ], + [ + 7.355820998357365, + 50.66523105776928 + ], + [ + 7.358976516209164, + 50.64949362023121 + ], + [ + 7.333480804094751, + 50.63839606845412 + ], + [ + 7.322175247748111, + 50.64171541341142 + ], + [ + 7.313097427009887, + 50.63700713937899 + ], + [ + 7.305099529211726, + 50.637578811246286 + ], + [ + 7.297323120168676, + 50.63181575459909 + ], + [ + 7.270054732652263, + 50.62642740760304 + ], + [ + 7.256579924083707, + 50.62468025665609 + ], + [ + 7.251955077264071, + 50.627838769399155 + ], + [ + 7.217027615985182, + 50.628066850697486 + ], + [ + 7.212399645217203, + 50.623404919825276 + ], + [ + 7.211464004606567, + 50.648160172742024 + ], + [ + 7.203786634903006, + 50.649660409136104 + ], + [ + 7.198485710421648, + 50.64820873532703 + ], + [ + 7.190635542661379, + 50.63604130870753 + ], + [ + 7.189838907797947, + 50.62389544364724 + ], + [ + 7.173981968717001, + 50.618909518667 + ], + [ + 7.173019848639377, + 50.61255228387663 + ], + [ + 7.154717366986707, + 50.61470533746364 + ], + [ + 7.149216780537222, + 50.609483967570895 + ], + [ + 7.147851587133212, + 50.600293280365086 + ], + [ + 7.135429964682132, + 50.602169056696994 + ], + [ + 7.119386718944817, + 50.6123074126252 + ], + [ + 7.115121105360966, + 50.61178614459459 + ], + [ + 7.103796715873784, + 50.591322552494255 + ], + [ + 7.09527131571715, + 50.58636960868053 + ], + [ + 7.087431034253972, + 50.586011948981984 + ], + [ + 7.069025677549422, + 50.59274423432447 + ], + [ + 7.066347430470023, + 50.600699207917046 + ], + [ + 7.059252758802113, + 50.60037088156727 + ], + [ + 7.056131464348486, + 50.60624075925606 + ], + [ + 7.04919447289185, + 50.60434022661949 + ], + [ + 6.998096294634187, + 50.56504990464773 + ], + [ + 6.983576971721074, + 50.56573420622005 + ], + [ + 6.977294072051088, + 50.56344629586995 + ], + [ + 6.972098290991903, + 50.555907358881306 + ], + [ + 6.956515510189849, + 50.55703307320719 + ], + [ + 6.951382132897732, + 50.56337907577823 + ], + [ + 6.930971323318114, + 50.56045225414029 + ], + [ + 6.922046183465262, + 50.55428087203026 + ], + [ + 6.92934970691736, + 50.533143229798505 + ], + [ + 6.909003669480685, + 50.525502726767385 + ], + [ + 6.89873227799657, + 50.527128051795266 + ], + [ + 6.900754710696472, + 50.53078556684465 + ], + [ + 6.882098443328173, + 50.52694944029986 + ], + [ + 6.884490582014824, + 50.51994384639418 + ], + [ + 6.897818523257415, + 50.5176947380777 + ], + [ + 6.888554081665374, + 50.507009018701 + ], + [ + 6.907069078238845, + 50.50264234440768 + ], + [ + 6.89786654431954, + 50.49226556791873 + ], + [ + 6.901749057877157, + 50.49190948881133 + ], + [ + 6.905593791298601, + 50.485048084969065 + ], + [ + 6.899213774567536, + 50.478038437037895 + ], + [ + 6.903208768908033, + 50.47528063605076 + ], + [ + 6.901481602736267, + 50.469091977139364 + ], + [ + 6.876703865494547, + 50.46479242501066 + ], + [ + 6.858573833167754, + 50.45326582162503 + ], + [ + 6.840540212974207, + 50.46394563269712 + ], + [ + 6.812069505741337, + 50.47224399622727 + ], + [ + 6.806193596482459, + 50.48823565230884 + ], + [ + 6.800937205085638, + 50.49131916583926 + ], + [ + 6.779861857436353, + 50.48657719181196 + ], + [ + 6.775385075629488, + 50.48249548806554 + ], + [ + 6.768281663875936, + 50.48428354106652 + ], + [ + 6.759128634928792, + 50.47458991652887 + ], + [ + 6.744603261529224, + 50.47263045892923 + ], + [ + 6.743243953086897, + 50.467748100837106 + ], + [ + 6.747733109762257, + 50.46615573593311 + ], + [ + 6.753848390073472, + 50.471421266748656 + ], + [ + 6.758145396314585, + 50.47093172823957 + ], + [ + 6.757072979815688, + 50.463030659617495 + ], + [ + 6.766624285258056, + 50.45864375545628 + ], + [ + 6.762935908687106, + 50.455695156017114 + ], + [ + 6.764625178972132, + 50.450785943491454 + ], + [ + 6.743698938627615, + 50.44092420852668 + ], + [ + 6.745523502784947, + 50.43592955690019 + ], + [ + 6.760315480360885, + 50.43139328926338 + ], + [ + 6.771200603419635, + 50.43605305983223 + ], + [ + 6.770693110626112, + 50.42504546588647 + ], + [ + 6.785122974863888, + 50.42063330188389 + ], + [ + 6.779232952984364, + 50.41360654606353 + ], + [ + 6.779307456538522, + 50.404972999899535 + ], + [ + 6.769311744201992, + 50.39274797838944 + ], + [ + 6.784687367783974, + 50.37475056233822 + ], + [ + 6.802745410477137, + 50.36930462092996 + ], + [ + 6.800711449107814, + 50.3617813358246 + ], + [ + 6.79559245517314, + 50.3595442825658 + ], + [ + 6.79520383245717, + 50.361973168841814 + ], + [ + 6.777686249487061, + 50.36443378534201 + ], + [ + 6.776766458461029, + 50.35808862553683 + ], + [ + 6.770885567117261, + 50.36121315178975 + ], + [ + 6.753523026105354, + 50.35411639418229 + ], + [ + 6.732403726931516, + 50.3524974241744 + ], + [ + 6.706034430576143, + 50.3427905656316 + ], + [ + 6.699244644144724, + 50.33609740069148 + ], + [ + 6.686767538461449, + 50.35837876839993 + ], + [ + 6.667350810959977, + 50.371967758116014 + ], + [ + 6.65601474474183, + 50.367435427737185 + ], + [ + 6.657531020022476, + 50.35698974021669 + ], + [ + 6.649958651932542, + 50.34816773404108 + ], + [ + 6.636206238156994, + 50.34537215040639 + ], + [ + 6.629840148440824, + 50.3512319856785 + ], + [ + 6.623559011435146, + 50.35162697912129 + ], + [ + 6.621806715884055, + 50.35999642180222 + ], + [ + 6.627430003950937, + 50.371917216437296 + ], + [ + 6.616273171387075, + 50.37701865537534 + ], + [ + 6.604088070632451, + 50.37511937540992 + ], + [ + 6.601196695041309, + 50.378382073010414 + ], + [ + 6.606759411637953, + 50.38096742689408 + ], + [ + 6.603085713300447, + 50.38822220430802 + ], + [ + 6.585170619972991, + 50.38250437681722 + ], + [ + 6.581850140681261, + 50.377543636451584 + ], + [ + 6.569188709018549, + 50.37663353032441 + ], + [ + 6.55901579218463, + 50.36940999538304 + ], + [ + 6.543177865463575, + 50.36624406776606 + ], + [ + 6.54218270536481, + 50.3710567721177 + ], + [ + 6.530450523945337, + 50.369345352971486 + ], + [ + 6.516616695071824, + 50.36218943874366 + ], + [ + 6.516404467906884, + 50.35538798993216 + ], + [ + 6.507121785940705, + 50.35987731028305 + ], + [ + 6.50478940252159, + 50.35235326192724 + ], + [ + 6.491782289077296, + 50.34699797236448 + ], + [ + 6.484743817213976, + 50.33856106917782 + ], + [ + 6.475221217344335, + 50.338452810811766 + ], + [ + 6.465982055560946, + 50.34258891733081 + ], + [ + 6.451615287002675, + 50.336424101296814 + ], + [ + 6.449590632607753, + 50.3383531415604 + ], + [ + 6.458667809503482, + 50.34397164775019 + ], + [ + 6.46116214082092, + 50.35902685947315 + ], + [ + 6.449474166439192, + 50.36378465153005 + ], + [ + 6.448561199127526, + 50.37133835961053 + ], + [ + 6.435386960738555, + 50.370318842506535 + ], + [ + 6.430023535282189, + 50.36318993885433 + ], + [ + 6.420877816135519, + 50.36890304105494 + ], + [ + 6.42084284846766, + 50.37320022556465 + ], + [ + 6.414704856668523, + 50.37459511076757 + ], + [ + 6.422030762027406, + 50.38194789658522 + ], + [ + 6.413042933613007, + 50.389485960586015 + ], + [ + 6.385005839317656, + 50.384186657720804 + ], + [ + 6.391868917960935, + 50.37984539128061 + ], + [ + 6.389003440978201, + 50.371686508790056 + ], + [ + 6.397299928038712, + 50.367684673243204 + ], + [ + 6.39545220104351, + 50.361418704867596 + ], + [ + 6.405977283141802, + 50.363822030712406 + ], + [ + 6.397181221181682, + 50.35791193138345 + ], + [ + 6.405063078073102, + 50.350064958180866 + ], + [ + 6.40790881433235, + 50.3393797310862 + ], + [ + 6.41499499100711, + 50.33266053878083 + ], + [ + 6.424061862476046, + 50.333826803469854 + ], + [ + 6.425294811296136, + 50.32301195254229 + ], + [ + 6.405028254889149, + 50.32330869208937 + ], + [ + 6.407870067580581, + 50.335133960979014 + ], + [ + 6.400528908620751, + 50.33810708293795 + ], + [ + 6.398321002223065, + 50.345660945254785 + ], + [ + 6.373380999775924, + 50.35816742336298 + ], + [ + 6.368075244949639, + 50.358111781482116 + ], + [ + 6.369430297826944, + 50.36112539443837 + ], + [ + 6.360603493683045, + 50.371450443339604 + ], + [ + 6.342218728164555, + 50.38000552545733 + ], + [ + 6.356851874755129, + 50.39114117225179 + ], + [ + 6.369877124512275, + 50.40893069357977 + ], + [ + 6.366705781199991, + 50.4191622094956 + ], + [ + 6.377623397286144, + 50.43938897273732 + ], + [ + 6.371823937024316, + 50.45558235371176 + ], + [ + 6.362852777275234, + 50.453908340016916 + ], + [ + 6.340231706486779, + 50.46259127865579 + ], + [ + 6.343836481666192, + 50.46875053400364 + ], + [ + 6.337486434289451, + 50.47474832548162 + ], + [ + 6.341621681296872, + 50.483531274896826 + ], + [ + 6.35125902067927, + 50.48826779096995 + ], + [ + 6.334818830079137, + 50.4890350130393 + ], + [ + 6.309075385430697, + 50.501411831403416 + ], + [ + 6.297503912916506, + 50.497612334078795 + ], + [ + 6.269941266281043, + 50.50451176992403 + ], + [ + 6.261816599225034, + 50.498847774982096 + ], + [ + 6.254605632134356, + 50.499416755730344 + ], + [ + 6.251731913469478, + 50.50348381031758 + ], + [ + 6.226631719855812, + 50.494368661900424 + ], + [ + 6.209111695823089, + 50.51470170522769 + ], + [ + 6.212582606936507, + 50.51556665394489 + ], + [ + 6.207151535181316, + 50.51891755071301 + ], + [ + 6.207160032564354, + 50.524272830817736 + ], + [ + 6.196995434382321, + 50.53103194986401 + ], + [ + 6.211950553579952, + 50.55376798379617 + ], + [ + 6.225794545619526, + 50.55446167419784 + ], + [ + 6.228550818709967, + 50.56155415409795 + ], + [ + 6.236760623755972, + 50.566252805979 + ], + [ + 6.241159201051071, + 50.58710037827957 + ], + [ + 6.249604569453981, + 50.59822700559718 + ], + [ + 6.247746048889796, + 50.60370896151398 + ], + [ + 6.259966160416683, + 50.609819828439804 + ], + [ + 6.273982672777575, + 50.62820559265664 + ], + [ + 6.266895404204285, + 50.64152787185316 + ], + [ + 6.262099932357421, + 50.64389940696159 + ], + [ + 6.246411464667398, + 50.64151180360079 + ], + [ + 6.231505208118615, + 50.64998255130164 + ], + [ + 6.21973316434017, + 50.641209625235035 + ], + [ + 6.187662378123725, + 50.64111010940817 + ], + [ + 6.183974263597418, + 50.647111569461856 + ], + [ + 6.197130958574816, + 50.656737281261016 + ], + [ + 6.195538593559229, + 50.662931103363185 + ], + [ + 6.188022600854659, + 50.665145314269836 + ], + [ + 6.165281061465716, + 50.662789814773404 + ], + [ + 6.162432263425552, + 50.67137654686002 + ], + [ + 6.143642577066952, + 50.681662243732575 + ], + [ + 6.143717005943482, + 50.688873704927964 + ], + [ + 6.123242555188668, + 50.70709929363248 + ], + [ + 6.124765554539831, + 50.711061461019995 + ], + [ + 6.115293948316198, + 50.722114021240216 + ], + [ + 6.073189035224059, + 50.72095226524144 + ], + [ + 6.044563166383948, + 50.72836022109307 + ], + [ + 6.039029648898583, + 50.71837811071467 + ], + [ + 6.033151439505842, + 50.73098497001052 + ], + [ + 6.039791287062492, + 50.73756096213974 + ], + [ + 6.040480906356501, + 50.74551257503689 + ], + [ + 6.021394331143838, + 50.75311384462293 + ], + [ + 6.018323663884328, + 50.76317216238663 + ], + [ + 6.027798681781648, + 50.77373359944596 + ], + [ + 5.974861423025903, + 50.79797295141987 + ], + [ + 5.984026968691863, + 50.81008548600735 + ], + [ + 6.003484268064798, + 50.80131373157801 + ], + [ + 6.025050640945532, + 50.814164497382805 + ], + [ + 6.022146868116997, + 50.81683776646271 + ], + [ + 6.026273390230251, + 50.81994473882058 + ], + [ + 6.02499081409568, + 50.82765648756708 + ], + [ + 6.018802065824271, + 50.82925638594021 + ], + [ + 6.016527832120453, + 50.83380181660787 + ], + [ + 6.018875020296453, + 50.84627442620478 + ], + [ + 6.042066628281268, + 50.85126190249735 + ], + [ + 6.054839995288891, + 50.85735349946859 + ], + [ + 6.056764057358413, + 50.85106650502248 + ], + [ + 6.073980155847277, + 50.846780258228875 + ], + [ + 6.077294365520185, + 50.86073386287399 + ], + [ + 6.088189822450643, + 50.87243381327489 + ], + [ + 6.07531303943652, + 50.89340044828795 + ], + [ + 6.080980443198207, + 50.90866741893501 + ], + [ + 6.093924751927731, + 50.92132546382671 + ], + [ + 6.088998090338803, + 50.91869582566273 + ], + [ + 6.071736840023321, + 50.92314850688051 + ], + [ + 6.06812658732163, + 50.920658937028314 + ], + [ + 6.056661757589452, + 50.92177228302742 + ], + [ + 6.056004642858491, + 50.927144850221815 + ], + [ + 6.050868140148652, + 50.92999515004072 + ], + [ + 6.04564325589873, + 50.92803102149969 + ], + [ + 6.018160183974472, + 50.934436769963234 + ], + [ + 6.016799121557247, + 50.95251183453728 + ], + [ + 6.00526399188978, + 50.95683637615488 + ], + [ + 6.015569403997942, + 50.96272256748202 + ], + [ + 6.026435005106701, + 50.98327404384387 + ], + [ + 5.980845819234035, + 50.983110071095766 + ], + [ + 5.968203751071369, + 50.9794699701568 + ], + [ + 5.955159321963976, + 50.98840600604765 + ], + [ + 5.933641096793897, + 50.9852624102364 + ], + [ + 5.918597684873934, + 50.97774152445926 + ], + [ + 5.897198106578009, + 50.974845394607144 + ], + [ + 5.892668411639693, + 50.98034745324228 + ], + [ + 5.903812807770897, + 50.987495487260986 + ], + [ + 5.905518057260081, + 51.00215967643894 + ], + [ + 5.895738802092378, + 51.00435896752893 + ], + [ + 5.89584968942228, + 51.011007451488055 + ], + [ + 5.884325214270994, + 51.01335947816431 + ], + [ + 5.879150797276256, + 51.01755338072241 + ], + [ + 5.874594376372924, + 51.02932022240798 + ], + [ + 5.878025523533185, + 51.037544938369535 + ], + [ + 5.867096630980297, + 51.046679077294854 + ], + [ + 5.866755374786974, + 51.05143137873851 + ], + [ + 5.892345098698241, + 51.05322815171006 + ], + [ + 5.913170487537268, + 51.0667311357011 + ], + [ + 5.918959007462488, + 51.063781754518686 + ], + [ + 5.926394687414288, + 51.04799131052037 + ], + [ + 5.938114703491953, + 51.03514072173847 + ], + [ + 5.946407339178044, + 51.036979793861825 + ], + [ + 5.957887700978988, + 51.03470998272469 + ], + [ + 5.957896922891044, + 51.04098204380014 + ], + [ + 5.968971371101642, + 51.046653172931755 + ], + [ + 5.969847317585598, + 51.0606059240051 + ], + [ + 5.997787242466887, + 51.08425931296306 + ], + [ + 6.017655156448313, + 51.094540813799746 + ], + [ + 6.020617772000229, + 51.092889770569855 + ], + [ + 6.037468680314475, + 51.09703485926981 + ], + [ + 6.053128504906522, + 51.106772746660376 + ], + [ + 6.060305529805619, + 51.11593185941076 + ], + [ + 6.075754505520998, + 51.11916020161699 + ], + [ + 6.08084353355003, + 51.12614141435551 + ], + [ + 6.08706126582058, + 51.12462807010022 + ], + [ + 6.084409602271505, + 51.12599697164635 + ], + [ + 6.091868347690888, + 51.13497396632299 + ], + [ + 6.115928254611572, + 51.139070408599174 + ], + [ + 6.125950833216339, + 51.14512252674215 + ], + [ + 6.163406555600524, + 51.148841368729364 + ], + [ + 6.162734777461624, + 51.152791101499915 + ], + [ + 6.175415266700274, + 51.15847977239807 + ], + [ + 6.13881126338539, + 51.17333312336751 + ], + [ + 6.180698933906622, + 51.18642547108013 + ], + [ + 6.16501832467324, + 51.1943606420129 + ], + [ + 6.122189191539964, + 51.181181682815264 + ], + [ + 6.100093174258009, + 51.16997058228841 + ], + [ + 6.082306251962107, + 51.17163842344663 + ], + [ + 6.073337851774611, + 51.18296672509453 + ], + [ + 6.067974199723699, + 51.220514091619854 + ], + [ + 6.085775801551049, + 51.22260544913321 + ], + [ + 6.072656925074925, + 51.24258730242386 + ], + [ + 6.085043585184261, + 51.24740440231036 + ], + [ + 6.124480767502479, + 51.27458488980888 + ], + [ + 6.129827275080579, + 51.28657025079519 + ], + [ + 6.154080231596547, + 51.307372754030574 + ], + [ + 6.168622606858222, + 51.33294924655746 + ], + [ + 6.193070744638387, + 51.33473186526659 + ], + [ + 6.189840025983723, + 51.33934992425325 + ], + [ + 6.226129917993019, + 51.360517645362144 + ], + [ + 6.214416331978377, + 51.389629403364516 + ], + [ + 6.22637886611643, + 51.39965693453144 + ], + [ + 6.205219800453786, + 51.39951830606875 + ], + [ + 6.214870834486892, + 51.434375417929246 + ], + [ + 6.213933359905891, + 51.446335798281325 + ], + [ + 6.220521129522002, + 51.4468905836711 + ], + [ + 6.223171521252659, + 51.46893203796667 + ], + [ + 6.213019465826241, + 51.49110114483483 + ], + [ + 6.212084663983648, + 51.51337840541419 + ], + [ + 6.199281563372215, + 51.527981247761915 + ], + [ + 6.177020476001845, + 51.53866539873862 + ], + [ + 6.157022337633935, + 51.56667833231235 + ], + [ + 6.13059729058998, + 51.58107254831895 + ], + [ + 6.121280184910399, + 51.59278015531742 + ], + [ + 6.09123534620554, + 51.605909309318555 + ], + [ + 6.093983593614561, + 51.62213249502018 + ], + [ + 6.097244061000601, + 51.6208950245573 + ], + [ + 6.100036272064975, + 51.62412291475434 + ], + [ + 6.109480075359587, + 51.64682970512767 + ], + [ + 6.117105922509386, + 51.65084410878429 + ], + [ + 6.118240238453178, + 51.65608621759215 + ], + [ + 6.103180151108397, + 51.66031309596046 + ], + [ + 6.09964617064142, + 51.65811338770797 + ], + [ + 6.0880390689451, + 51.65980898218939 + ], + [ + 6.085077428834304, + 51.66288163115483 + ], + [ + 6.07982350478712, + 51.66150474867983 + ], + [ + 6.075614635089965, + 51.664887998714754 + ], + [ + 6.036867532885291, + 51.672830222968976 + ], + [ + 6.030722587823947, + 51.67711324247946 + ], + [ + 6.032482197161071, + 51.68402043969699 + ], + [ + 6.028160929581388, + 51.689630882719136 + ], + [ + 6.031771066688003, + 51.69272913908676 + ], + [ + 6.026395646993775, + 51.709278070351495 + ], + [ + 6.031367991929767, + 51.712948362956524 + ], + [ + 6.04204306960954, + 51.71330369789872 + ], + [ + 6.044985345577296, + 51.71697952964935 + ], + [ + 6.037938711594674, + 51.719944895691825 + ], + [ + 6.035431018013669, + 51.71771603644082 + ], + [ + 6.029083902711233, + 51.72567917690673 + ], + [ + 5.992463105290117, + 51.73858490870576 + ], + [ + 5.95512339818019, + 51.73806526095927 + ], + [ + 5.951422185705152, + 51.748742235543055 + ], + [ + 5.990529297395418, + 51.76624483121775 + ], + [ + 5.991619967825813, + 51.77003651720346 + ], + [ + 5.982323473223736, + 51.77366894597966 + ], + [ + 5.990531851515851, + 51.78318768063555 + ], + [ + 5.974578557132887, + 51.78504588949734 + ], + [ + 5.974375163942709, + 51.795628979773156 + ], + [ + 5.978174333811467, + 51.79723178905095 + ], + [ + 5.961915525177537, + 51.80753130784498 + ], + [ + 5.948134177544177, + 51.811292728798854 + ], + [ + 5.945837811129233, + 51.81520622299775 + ], + [ + 5.957807209526561, + 51.81715602203575 + ], + [ + 5.945029569652767, + 51.823656342756976 + ], + [ + 5.96289041622726, + 51.83679170133315 + ], + [ + 5.970811727386515, + 51.83331739706453 + ], + [ + 5.993681745286217, + 51.83083007662875 + ], + [ + 6.01095776174292, + 51.83544544701364 + ], + [ + 6.017353245802251, + 51.84124338029206 + ], + [ + 6.02902371537176, + 51.84509387721307 + ], + [ + 6.03500964515942, + 51.84286523069763 + ], + [ + 6.055267492405313, + 51.85230391674297 + ], + [ + 6.051808154158274, + 51.85663177524247 + ], + [ + 6.059523624468451, + 51.857583462974745 + ], + [ + 6.063382485124055, + 51.86544393334552 + ], + [ + 6.099342201602621, + 51.849485731393926 + ], + [ + 6.136292048176213, + 51.84720825635709 + ], + [ + 6.166407643055567, + 51.84083471750386 + ], + [ + 6.163662848795992, + 51.85350582501806 + ], + [ + 6.166815206379534, + 51.86096974139569 + ], + [ + 6.144510057338275, + 51.86985916352638 + ], + [ + 6.137219099020223, + 51.885630666866184 + ], + [ + 6.118463795820526, + 51.89181542841875 + ], + [ + 6.103341256718575, + 51.89261697231257 + ], + [ + 6.118046670949982, + 51.90166963596806 + ], + [ + 6.125523171273962, + 51.89830938931159 + ], + [ + 6.157174460691928, + 51.90522204756014 + ], + [ + 6.165483074166499, + 51.89877813866528 + ], + [ + 6.169563978925757, + 51.901340977097796 + ], + [ + 6.19112148058173, + 51.891644840351304 + ], + [ + 6.191374498002282, + 51.88735066975742 + ], + [ + 6.181897889021546, + 51.88590394837596 + ], + [ + 6.185242670807608, + 51.88150210511983 + ], + [ + 6.215439031356334, + 51.86779596821484 + ], + [ + 6.234078052462919, + 51.87009832499809 + ], + [ + 6.261766006812572, + 51.86812815496678 + ], + [ + 6.269822419652042, + 51.8740762879978 + ], + [ + 6.279517512170721, + 51.87408435183932 + ], + [ + 6.298936168312321, + 51.86789541424994 + ], + [ + 6.306560847622921, + 51.84921543820747 + ], + [ + 6.346811817003113, + 51.85064718483679 + ], + [ + 6.360171322021936, + 51.8457960142065 + ], + [ + 6.362940247476867, + 51.836230078409436 + ], + [ + 6.370023658413568, + 51.83357896560525 + ], + [ + 6.389543072896207, + 51.83327224582553 + ], + [ + 6.401752482292525, + 51.82729228502847 + ], + [ + 6.40777966742934, + 51.82809193874705 + ], + [ + 6.402780983936343, + 51.836738917753934 + ], + [ + 6.408142986256347, + 51.836590353727274 + ], + [ + 6.402422191910518, + 51.84456916391924 + ], + [ + 6.409190007191084, + 51.85233189439837 + ], + [ + 6.388056793513257, + 51.8619524118717 + ], + [ + 6.39081582867151, + 51.87393384391671 + ], + [ + 6.402246760674868, + 51.86916359038818 + ], + [ + 6.411947978180806, + 51.87090462817968 + ], + [ + 6.427853026863627, + 51.86573060313452 + ], + [ + 6.432406618590623, + 51.85939423566764 + ], + [ + 6.451067654418999, + 51.865314232363424 + ], + [ + 6.462384858926118, + 51.8559745753939 + ], + [ + 6.472575541656206, + 51.85380845358674 + ], + [ + 6.499578529068205, + 51.861756178261444 + ], + [ + 6.501123683594067, + 51.86812939637698 + ], + [ + 6.515440584629749, + 51.87347346736481 + ], + [ + 6.524584740854078, + 51.873708629576306 + ], + [ + 6.544463492770338, + 51.88466956191313 + ], + [ + 6.549564348034442, + 51.88314715168471 + ], + [ + 6.552419130982491, + 51.88619763670207 + ], + [ + 6.556111781446341, + 51.88181561523889 + ], + [ + 6.560400525301453, + 51.88210104458351 + ], + [ + 6.58562354631337, + 51.893911787495135 + ], + [ + 6.625378182736592, + 51.90185454129268 + ], + [ + 6.634252410252504, + 51.90104195912254 + ], + [ + 6.637642143917874, + 51.904373582279035 + ], + [ + 6.684230647501471, + 51.9176175613185 + ], + [ + 6.69546409461099, + 51.91575658623518 + ], + [ + 6.697520273969792, + 51.90986928470177 + ], + [ + 6.703671560188798, + 51.90939116991799 + ], + [ + 6.703281254855392, + 51.90640727701777 + ], + [ + 6.721664070799754, + 51.89617477214902 + ], + [ + 6.732607205158562, + 51.89870714180886 + ], + [ + 6.737085552620762, + 51.904572740147465 + ], + [ + 6.751179257221612, + 51.907184889936886 + ], + [ + 6.754662389134203, + 51.9130738136908 + ], + [ + 6.769997766936099, + 51.9162390644836 + ], + [ + 6.788894812995101, + 51.9296504447449 + ], + [ + 6.785951955536535, + 51.93122663549912 + ], + [ + 6.793965041355742, + 51.935065602619744 + ], + [ + 6.797190431850465, + 51.942506547134336 + ], + [ + 6.798644223846345, + 51.95881772932488 + ], + [ + 6.813617531853385, + 51.96352529880535 + ], + [ + 6.828513097084478, + 51.96406670730073 + ], + [ + 6.832877161905103, + 51.9718418248536 + ], + [ + 6.826573890263808, + 51.99353201431265 + ], + [ + 6.80775080462436, + 51.99499893401455 + ], + [ + 6.811478645725111, + 51.998145618258725 + ], + [ + 6.76619677236878, + 52.01884143308097 + ], + [ + 6.752642020871034, + 52.02864713017169 + ], + [ + 6.714658766964265, + 52.03989335383929 + ], + [ + 6.687725946751153, + 52.03989916597715 + ], + [ + 6.686921558532256, + 52.055727560564605 + ], + [ + 6.695983871398977, + 52.0643555484638 + ], + [ + 6.694652945155061, + 52.06980283182854 + ], + [ + 6.7355907684078, + 52.07467814776924 + ], + [ + 6.751215832260621, + 52.08549339550667 + ], + [ + 6.744523271681421, + 52.09308405139729 + ], + [ + 6.755072114711962, + 52.094899562163434 + ], + [ + 6.760630183359395, + 52.11872301537137 + ], + [ + 6.855393156851837, + 52.120434286586324 + ], + [ + 6.873352202662706, + 52.13020103240132 + ], + [ + 6.880445943786468, + 52.155995197738996 + ], + [ + 6.905840094414569, + 52.169976923262865 + ], + [ + 6.906802155595916, + 52.17517608547888 + ], + [ + 6.951315877841383, + 52.18100676493111 + ], + [ + 6.989196603725609, + 52.226859491005605 + ], + [ + 7.003461452986739, + 52.22851604819358 + ], + [ + 7.019236778835766, + 52.22503970331111 + ], + [ + 7.038970201884919, + 52.22764717482963 + ], + [ + 7.060995489760619, + 52.23478240419772 + ], + [ + 7.065868435968087, + 52.24125897987158 + ], + [ + 7.105718667580479, + 52.24438755865477 + ], + [ + 7.109853543951367, + 52.25279700340174 + ], + [ + 7.121398968273652, + 52.26121746567406 + ], + [ + 7.14959369167519, + 52.26584502207136 + ], + [ + 7.297889792664836, + 52.263975123646695 + ], + [ + 7.317481058570898, + 52.280272243732426 + ], + [ + 7.34559491905113, + 52.28269012932965 + ], + [ + 7.36155453620013, + 52.288312394878744 + ], + [ + 7.370752596559083, + 52.30023743594604 + ], + [ + 7.386480325987149, + 52.30930415766743 + ], + [ + 7.396963799880388, + 52.30618486327852 + ], + [ + 7.403871786655209, + 52.312934696385184 + ], + [ + 7.427224313267955, + 52.314012515181574 + ], + [ + 7.43777648374884, + 52.33335651831077 + ], + [ + 7.479405082157625, + 52.34763948853561 + ], + [ + 7.504727355682732, + 52.360843698557304 + ], + [ + 7.529922924360616, + 52.369876429632804 + ], + [ + 7.539362630444412, + 52.37045250297543 + ], + [ + 7.543056880669209, + 52.36797749555973 + ], + [ + 7.563964485922527, + 52.370651955661984 + ], + [ + 7.565236310901901, + 52.37262627766461 + ], + [ + 7.560242413227735, + 52.37208078077819 + ], + [ + 7.57044831918533, + 52.37862159801996 + ], + [ + 7.577143585818477, + 52.37540055780911 + ], + [ + 7.582566161848537, + 52.37636947037941 + ], + [ + 7.571322354863529, + 52.38123506297675 + ], + [ + 7.583583468769305, + 52.39553896698813 + ], + [ + 7.582761603103493, + 52.403665872211896 + ], + [ + 7.601117635426473, + 52.41414293657977 + ], + [ + 7.602719467890825, + 52.42103069168474 + ], + [ + 7.564310993268271, + 52.43231221270695 + ], + [ + 7.57096547778186, + 52.432330502698164 + ], + [ + 7.583034404155018, + 52.45486324174427 + ], + [ + 7.603452520619055, + 52.47496744895712 + ], + [ + 7.655827185181307, + 52.462473632340256 + ], + [ + 7.656546757537409, + 52.45997611939137 + ], + [ + 7.66770613407625, + 52.45847943039301 + ], + [ + 7.667430904008794, + 52.456070040544105 + ], + [ + 7.683545982754405, + 52.456565384785 + ], + [ + 7.688382442877129, + 52.45367265432209 + ], + [ + 7.702342178971661, + 52.43437005755833 + ], + [ + 7.713777690073259, + 52.40098590539843 + ], + [ + 7.72343628875695, + 52.400165522512026 + ], + [ + 7.807088758695683, + 52.371427029476735 + ], + [ + 7.843035816166648, + 52.36902764689798 + ], + [ + 7.870512190192898, + 52.37749872344339 + ], + [ + 7.891770368088737, + 52.38051298120784 + ], + [ + 7.9216822026609, + 52.36561766169283 + ], + [ + 7.936669993853385, + 52.36497725671875 + ], + [ + 7.94392425047075, + 52.35558901044705 + ], + [ + 7.942009971846302, + 52.347568668078324 + ], + [ + 7.947781963082546, + 52.35009962675152 + ], + [ + 7.95349705587406, + 52.34722099732106 + ], + [ + 7.948563556086357, + 52.33512760904739 + ], + [ + 7.978010145031644, + 52.31270391515704 + ], + [ + 7.990608047644779, + 52.30953959087523 + ], + [ + 7.987240444473508, + 52.30358374629764 + ], + [ + 7.949574183867191, + 52.30587514364561 + ], + [ + 7.930025940823083, + 52.30215503123372 + ], + [ + 7.930761564993739, + 52.286422084409146 + ], + [ + 7.956465027180013, + 52.27249057894037 + ], + [ + 7.945734980646924, + 52.26531057781784 + ], + [ + 7.930214495607264, + 52.26538787198975 + ], + [ + 7.925623713831175, + 52.26281446184306 + ], + [ + 7.926549141484197, + 52.22654833554501 + ], + [ + 7.919821308730425, + 52.2216966839825 + ], + [ + 7.914577730726942, + 52.222933466407866 + ], + [ + 7.91278648345912, + 52.21736895615975 + ], + [ + 7.905751625167091, + 52.214084745072384 + ], + [ + 7.906361506211221, + 52.2080591397167 + ], + [ + 7.899840166832526, + 52.206828610268154 + ], + [ + 7.906342520567375, + 52.202523871311215 + ], + [ + 7.902993338012227, + 52.1988692861284 + ], + [ + 7.908852593361701, + 52.195027449260365 + ], + [ + 7.908109126762258, + 52.189863445693135 + ], + [ + 7.914245975587368, + 52.18787508412052 + ], + [ + 7.912948642893859, + 52.18513533582804 + ], + [ + 7.928353006380378, + 52.18125572814602 + ], + [ + 7.933986824658277, + 52.17692188689667 + ], + [ + 7.957451981263717, + 52.177943418516776 + ], + [ + 7.974333253442812, + 52.17113031579249 + ], + [ + 8.007512014453734, + 52.175957468104606 + ], + [ + 8.016978013416098, + 52.172050699505114 + ], + [ + 8.015161878792162, + 52.168611168360776 + ], + [ + 8.025188639466212, + 52.163509513271435 + ], + [ + 8.020628819517173, + 52.159131261335546 + ], + [ + 8.011819311181304, + 52.161801017510825 + ], + [ + 8.01250507481297, + 52.15917843591391 + ], + [ + 8.002046653380093, + 52.15995752703275 + ], + [ + 8.003146684179077, + 52.154555495292485 + ], + [ + 7.997386119836825, + 52.154479988358545 + ], + [ + 8.000626025704028, + 52.153305854962454 + ], + [ + 7.997776236495387, + 52.150339340059304 + ], + [ + 8.003504901191377, + 52.14965820720372 + ], + [ + 8.007796128995158, + 52.11533314491299 + ], + [ + 7.971769165876316, + 52.11598301454239 + ], + [ + 7.950916211465212, + 52.10258525941391 + ], + [ + 7.916065692737347, + 52.09607573997902 + ], + [ + 7.885188660088946, + 52.084935771185904 + ], + [ + 7.920704918432738, + 52.05799708677675 + ], + [ + 7.916921270765426, + 52.05163721283782 + ], + [ + 7.981101713356266, + 52.03551001568241 + ], + [ + 7.993717081084593, + 52.04963608640175 + ], + [ + 8.019098103414501, + 52.058606418996305 + ], + [ + 8.019258008807574, + 52.06229908431077 + ], + [ + 8.032748466987847, + 52.06844093438954 + ], + [ + 8.035195978409718, + 52.06452262890538 + ], + [ + 8.042459911261876, + 52.06305257973266 + ], + [ + 8.066703075985858, + 52.06812138804685 + ], + [ + 8.069898622930864, + 52.06518081670162 + ], + [ + 8.086882499295381, + 52.064598723449016 + ], + [ + 8.092398669030905, + 52.06342670463068 + ], + [ + 8.096448168032627, + 52.057145181957 + ], + [ + 8.129082926566634, + 52.068747936644286 + ], + [ + 8.13140135929656, + 52.07200820814122 + ], + [ + 8.151526689025575, + 52.0763644207178 + ], + [ + 8.172321675054498, + 52.07186741749234 + ], + [ + 8.192494536807171, + 52.07261933665121 + ], + [ + 8.20144592837285, + 52.08817160087602 + ], + [ + 8.22135851564947, + 52.106146444663494 + ], + [ + 8.236128364770693, + 52.11238469103891 + ], + [ + 8.245896154337265, + 52.12139729881037 + ], + [ + 8.262539078413473, + 52.120378485066276 + ], + [ + 8.266731884054417, + 52.13228120240287 + ], + [ + 8.273432501000707, + 52.13072355584386 + ], + [ + 8.287149520677945, + 52.13517179664269 + ], + [ + 8.285224937946518, + 52.12549866223907 + ], + [ + 8.29692484225961, + 52.12361839969506 + ], + [ + 8.298295271086454, + 52.12069214734867 + ], + [ + 8.311215340994362, + 52.11832908798072 + ], + [ + 8.323918346464584, + 52.12592199876621 + ], + [ + 8.342689803938443, + 52.1237879923188 + ], + [ + 8.34920588830843, + 52.119568306773814 + ], + [ + 8.36370564099861, + 52.118352857598495 + ], + [ + 8.373228238828544, + 52.109812468479305 + ], + [ + 8.395124113183117, + 52.1087967799247 + ], + [ + 8.410586370904783, + 52.11511517526408 + ], + [ + 8.40439020246668, + 52.12898075504966 + ], + [ + 8.413520856402936, + 52.13801272618885 + ], + [ + 8.45353379616296, + 52.15538695576305 + ], + [ + 8.46209214171106, + 52.15310377841418 + ], + [ + 8.480919405366308, + 52.15963180619459 + ], + [ + 8.485395749286194, + 52.165879779690115 + ], + [ + 8.49309517948417, + 52.16680108284654 + ], + [ + 8.505603294823072, + 52.179382181793464 + ], + [ + 8.517437324295553, + 52.1849504492298 + ], + [ + 8.460188309451018, + 52.195954636390724 + ], + [ + 8.44239179371433, + 52.21330681568581 + ], + [ + 8.461050875845759, + 52.229071498558824 + ], + [ + 8.459847691690992, + 52.24280137712855 + ], + [ + 8.468063211130977, + 52.24711366677051 + ], + [ + 8.463573784197193, + 52.25661965926696 + ], + [ + 8.458796591751623, + 52.25818487567607 + ], + [ + 8.466186370199647, + 52.26761383142456 + ], + [ + 8.463140818338323, + 52.28211974779086 + ], + [ + 8.459406936891472, + 52.28164236036633 + ], + [ + 8.457971599912801, + 52.30199669088372 + ], + [ + 8.459815835928325, + 52.30470024938609 + ], + [ + 8.464937357290061, + 52.30374360081827 + ], + [ + 8.472149144049359, + 52.31536409497061 + ], + [ + 8.460648530825187, + 52.3187319749583 + ], + [ + 8.442614889522172, + 52.35900988978495 + ], + [ + 8.432412468335801, + 52.3664550986936 + ], + [ + 8.40095104535807, + 52.377446679645 + ], + [ + 8.393053296605974, + 52.38463785821872 + ], + [ + 8.362981856739191, + 52.389945829852145 + ], + [ + 8.343918670633085, + 52.39771169749246 + ], + [ + 8.323537663013166, + 52.400349359404686 + ], + [ + 8.314038742526549, + 52.40572824349928 + ], + [ + 8.322902665291723, + 52.41072960877644 + ], + [ + 8.315882071017237, + 52.41252344310186 + ], + [ + 8.322037248500182, + 52.42616199841492 + ], + [ + 8.311724040549748, + 52.4363574120488 + ], + [ + 8.303992534360837, + 52.434309108005 + ], + [ + 8.308312698151989, + 52.44472554917185 + ], + [ + 8.297213681304198, + 52.45649790680952 + ], + [ + 8.303432823087771, + 52.45900479765338 + ], + [ + 8.30692030299067, + 52.45605441582242 + ], + [ + 8.311374097326611, + 52.45895155945493 + ], + [ + 8.32613101135611, + 52.45167062486265 + ], + [ + 8.33430400405074, + 52.45411222834995 + ], + [ + 8.345690702879555, + 52.45282315801197 + ], + [ + 8.359687310601636, + 52.44403112368321 + ], + [ + 8.385907189955644, + 52.44501657888015 + ], + [ + 8.386366204796081, + 52.447777652473825 + ], + [ + 8.401039510532751, + 52.45107542735406 + ], + [ + 8.418144994594284, + 52.44420229713239 + ], + [ + 8.417777570230397, + 52.449270046759146 + ], + [ + 8.425320748678612, + 52.451730477845466 + ], + [ + 8.429822491681762, + 52.44766958604482 + ], + [ + 8.45429005960774, + 52.461007062137014 + ], + [ + 8.45931298950112, + 52.473633321613185 + ], + [ + 8.458861052889935, + 52.49167228495779 + ], + [ + 8.472523497212963, + 52.498848145571074 + ], + [ + 8.48162895008405, + 52.496976930190954 + ], + [ + 8.508848531210432, + 52.514693375556824 + ], + [ + 8.516577169085583, + 52.5093153020686 + ], + [ + 8.556857517020939, + 52.499095652679266 + ], + [ + 8.652550123656718, + 52.53144342793753 + ], + [ + 8.669988518782317, + 52.51857063289291 + ] + ] + ], + [ + [ + [ + 6.237931246404746, + 50.577854087006074 + ], + [ + 6.23418414066645, + 50.566503574411776 + ], + [ + 6.225901501773047, + 50.56200966245474 + ], + [ + 6.224700419544223, + 50.55666606150288 + ], + [ + 6.209621224902612, + 50.55508817601921 + ], + [ + 6.196654860228183, + 50.53616597735539 + ], + [ + 6.178032318915548, + 50.54160669935867 + ], + [ + 6.178442395410736, + 50.55401515866856 + ], + [ + 6.174412223781472, + 50.55751434968822 + ], + [ + 6.189312571192393, + 50.56609405826421 + ], + [ + 6.203098906592637, + 50.56929446048266 + ], + [ + 6.206251911085553, + 50.576261233961425 + ], + [ + 6.219074136752925, + 50.581379983186444 + ], + [ + 6.22518052137013, + 50.59045702732997 + ], + [ + 6.239548235518471, + 50.5874543908046 + ], + [ + 6.237931246404746, + 50.577854087006074 + ] + ] + ], + [ + [ + [ + 6.182361089092031, + 50.645559244132684 + ], + [ + 6.188229185631251, + 50.63925783767018 + ], + [ + 6.214650622491924, + 50.6392101713331 + ], + [ + 6.224864335176016, + 50.64092129216648 + ], + [ + 6.231521954371509, + 50.64803552728667 + ], + [ + 6.245495490904672, + 50.63976962836912 + ], + [ + 6.263975395254808, + 50.640995558382365 + ], + [ + 6.271156752132468, + 50.629334036461195 + ], + [ + 6.267473933128656, + 50.62652823762379 + ], + [ + 6.260837456262137, + 50.62856049624142 + ], + [ + 6.235461083499025, + 50.62592613648768 + ], + [ + 6.21692216965536, + 50.6322175527306 + ], + [ + 6.199583734812952, + 50.63144934884546 + ], + [ + 6.194321000737844, + 50.63390602998088 + ], + [ + 6.181838383899476, + 50.62375983697842 + ], + [ + 6.175562215871119, + 50.627274411874936 + ], + [ + 6.183289224912739, + 50.63228642579378 + ], + [ + 6.166590343229979, + 50.64368728344503 + ], + [ + 6.182361089092031, + 50.645559244132684 + ] + ] + ], + [ + [ + [ + 6.192613882750701, + 50.662582925930245 + ], + [ + 6.194424404595941, + 50.657524876117364 + ], + [ + 6.183854755383824, + 50.648864661946064 + ], + [ + 6.183353889370602, + 50.65198251267472 + ], + [ + 6.166980126072628, + 50.661020549506844 + ], + [ + 6.192613882750701, + 50.662582925930245 + ] + ] + ], + [ + [ + [ + 6.205108756013715, + 50.521969386781834 + ], + [ + 6.192200700911429, + 50.52105561610352 + ], + [ + 6.187262265773875, + 50.5270898731728 + ], + [ + 6.195291313223077, + 50.530981472110334 + ], + [ + 6.205108756013715, + 50.521969386781834 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 1, + "BSG": 1, + "RS": "01", + "AGS": "01", + "SDV_RS": "010020000000", + "GEN": "Schleswig-Holstein", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "01", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEF", + "RS_0": "010000000000", + "AGS_0": "01000000", + "WSK": "2012/02/01", + "DEBKG_ID": "DEBKGDL20000QFG6", + "destatis": { + "population": 2830864, + "population_m": 1381451, + "population_w": 1449413 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 8.300669237289293, + 55.06325175383481 + ], + [ + 8.320864214471458, + 55.06039586329323 + ], + [ + 8.395438924322683, + 55.06926381922251 + ], + [ + 8.472647901490802, + 55.054125933886866 + ], + [ + 8.478954980511519, + 55.04738022522863 + ], + [ + 8.47201491528574, + 55.025323727306514 + ], + [ + 8.50153461450905, + 54.999825418377846 + ], + [ + 8.518058354227765, + 54.99260394453531 + ], + [ + 8.557413033497102, + 54.99274161355175 + ], + [ + 8.554694440456696, + 54.92094639763703 + ], + [ + 8.636246866685504, + 54.90985985470219 + ], + [ + 8.635383255194595, + 54.90291963866891 + ], + [ + 8.624778182446802, + 54.897830552854366 + ], + [ + 8.624251380601653, + 54.89439953456364 + ], + [ + 8.56972950382791, + 54.88651831402201 + ], + [ + 8.511309418158723, + 54.88419042343058 + ], + [ + 8.487370156675507, + 54.879289586851804 + ], + [ + 8.486490274837266, + 54.87674306627798 + ], + [ + 8.427409497881344, + 54.877399148234495 + ], + [ + 8.376582126282596, + 54.89416446678541 + ], + [ + 8.362088464348556, + 54.91020932233642 + ], + [ + 8.361038419908402, + 54.918880113493806 + ], + [ + 8.366786280144018, + 54.92410593970305 + ], + [ + 8.361940994801557, + 54.92415310487317 + ], + [ + 8.359855222445587, + 54.933479631770254 + ], + [ + 8.361671815223827, + 54.95781823192805 + ], + [ + 8.353074202250287, + 54.96837420347314 + ], + [ + 8.37990226162572, + 54.99677609866008 + ], + [ + 8.440718800920523, + 55.01774051764584 + ], + [ + 8.44040067188545, + 55.02312061156681 + ], + [ + 8.430333561704028, + 55.029305002704994 + ], + [ + 8.431298341328745, + 55.025358842840404 + ], + [ + 8.427298179117166, + 55.030890659469456 + ], + [ + 8.436685968710204, + 55.037485270075884 + ], + [ + 8.436703587215174, + 55.03940879954453 + ], + [ + 8.42716514473665, + 55.03701089767452 + ], + [ + 8.426277442016561, + 55.032806891617575 + ], + [ + 8.41882778313476, + 55.03517672088734 + ], + [ + 8.404421014123702, + 55.034204390282646 + ], + [ + 8.399175960540502, + 55.03530442804145 + ], + [ + 8.39549760335804, + 55.045277064093476 + ], + [ + 8.43244206625022, + 55.04892415147402 + ], + [ + 8.448226120064588, + 55.042350643224616 + ], + [ + 8.464195699549256, + 55.04571479344304 + ], + [ + 8.416845554914172, + 55.058383600807225 + ], + [ + 8.397556233557054, + 55.0532603036955 + ], + [ + 8.318182807673859, + 54.9447646501785 + ], + [ + 8.292444440615274, + 54.896871860186415 + ], + [ + 8.27855558372647, + 54.752208179558096 + ], + [ + 8.290957175717221, + 54.74187382487056 + ], + [ + 8.298826956083058, + 54.7408238721862 + ], + [ + 8.297069625423648, + 54.75762927800191 + ], + [ + 8.29374566877362, + 54.75757162389667 + ], + [ + 8.300966751063411, + 54.763757573444984 + ], + [ + 8.301762261617007, + 54.773038825353524 + ], + [ + 8.292048072264903, + 54.78598596249813 + ], + [ + 8.299920246295535, + 54.80420357193874 + ], + [ + 8.296903881699242, + 54.81111390492832 + ], + [ + 8.30054580293334, + 54.81797478743419 + ], + [ + 8.293482104189145, + 54.825676477393195 + ], + [ + 8.296057254762905, + 54.84239475812228 + ], + [ + 8.306950139224522, + 54.8584544176744 + ], + [ + 8.332827443643035, + 54.863257746086646 + ], + [ + 8.333228204080232, + 54.872819285692785 + ], + [ + 8.340561373759169, + 54.88057457051423 + ], + [ + 8.346791452479977, + 54.8761591684275 + ], + [ + 8.364263388688759, + 54.87590802606742 + ], + [ + 8.377918476615283, + 54.858597990555424 + ], + [ + 8.40202582698227, + 54.8487692220115 + ], + [ + 8.414381017129566, + 54.84724070832466 + ], + [ + 8.427642847096166, + 54.85329249572519 + ], + [ + 8.454619767500217, + 54.85738347596185 + ], + [ + 8.454229281638456, + 54.85971771357639 + ], + [ + 8.481743940059788, + 54.87210580544013 + ], + [ + 8.512563719617267, + 54.88185654315887 + ], + [ + 8.539937811965888, + 54.8830590021424 + ], + [ + 8.540108103257328, + 54.88113710362073 + ], + [ + 8.571949630578287, + 54.88421870988141 + ], + [ + 8.572193532708507, + 54.88233156912454 + ], + [ + 8.594786067270189, + 54.881965849534865 + ], + [ + 8.605838018647734, + 54.87107009082676 + ], + [ + 8.601918828606136, + 54.8461308819686 + ], + [ + 8.605693721407002, + 54.840707059182634 + ], + [ + 8.632445449001041, + 54.8229576197669 + ], + [ + 8.631969413976982, + 54.81893835820277 + ], + [ + 8.638366574370284, + 54.818744833102926 + ], + [ + 8.643267600926375, + 54.81010963394108 + ], + [ + 8.649005434488098, + 54.80932252615391 + ], + [ + 8.651671719495377, + 54.79662409632685 + ], + [ + 8.658100471372196, + 54.796885197147084 + ], + [ + 8.66183315978117, + 54.79041988667402 + ], + [ + 8.67539217338688, + 54.7905082038021 + ], + [ + 8.688492026203901, + 54.77534115991316 + ], + [ + 8.706584727717274, + 54.73943753189438 + ], + [ + 8.694198650523887, + 54.73096104044134 + ], + [ + 8.68906768789674, + 54.73255409562844 + ], + [ + 8.686209753022384, + 54.73034082161545 + ], + [ + 8.691784165758458, + 54.729212567298894 + ], + [ + 8.693181129525378, + 54.72488586607413 + ], + [ + 8.710050005216031, + 54.72348639250352 + ], + [ + 8.708168110648941, + 54.68512616569087 + ], + [ + 8.694385305812665, + 54.67771132773104 + ], + [ + 8.670093230343095, + 54.67247360978075 + ], + [ + 8.65647244477417, + 54.6563392867494 + ], + [ + 8.651870162108477, + 54.65763771427038 + ], + [ + 8.636997984186879, + 54.649228538343145 + ], + [ + 8.565158821070627, + 54.63685377121588 + ], + [ + 8.540466065470804, + 54.63641023340211 + ], + [ + 8.531121965529849, + 54.630989713039384 + ], + [ + 8.52952924191511, + 54.62575767576905 + ], + [ + 8.54753471553853, + 54.6177607993254 + ], + [ + 8.561972443588905, + 54.62711785328973 + ], + [ + 8.569275593212081, + 54.62685209726544 + ], + [ + 8.584645354517479, + 54.634121092920495 + ], + [ + 8.596648032250863, + 54.63597119388779 + ], + [ + 8.607286849544538, + 54.633081757010196 + ], + [ + 8.65475188451698, + 54.642219394208595 + ], + [ + 8.67183174555534, + 54.67096490473877 + ], + [ + 8.682297886846303, + 54.673490645634764 + ], + [ + 8.689226841180322, + 54.67106641636997 + ], + [ + 8.709159878717411, + 54.671839866470144 + ], + [ + 8.720767455805344, + 54.685369203414226 + ], + [ + 8.71231786400948, + 54.6954794381717 + ], + [ + 8.713713996515164, + 54.717624043672096 + ], + [ + 8.717227238180145, + 54.71837883561518 + ], + [ + 8.745218632660224, + 54.70700101396877 + ], + [ + 8.751576813600566, + 54.699001258272666 + ], + [ + 8.752831638647256, + 54.681254035372504 + ], + [ + 8.766137453693469, + 54.67210991077698 + ], + [ + 8.778644425349194, + 54.66519366006171 + ], + [ + 8.801787435297648, + 54.660535424191174 + ], + [ + 8.799786400003425, + 54.658007449256274 + ], + [ + 8.814600151548376, + 54.654235310088964 + ], + [ + 8.818503048690228, + 54.64721554080208 + ], + [ + 8.823121132607877, + 54.647101306638106 + ], + [ + 8.822756765920525, + 54.639496702090746 + ], + [ + 8.827333110105268, + 54.6369918373038 + ], + [ + 8.82408846040878, + 54.63515322868477 + ], + [ + 8.83166719553571, + 54.62370907843395 + ], + [ + 8.841652966165848, + 54.61846291852605 + ], + [ + 8.841131397452962, + 54.61482241257747 + ], + [ + 8.835513494319354, + 54.61436390448133 + ], + [ + 8.834581990460666, + 54.60891369297648 + ], + [ + 8.814715014647527, + 54.60187262686017 + ], + [ + 8.808498615395084, + 54.60450765726099 + ], + [ + 8.813572711715889, + 54.596773894421084 + ], + [ + 8.81885127612695, + 54.59480564338995 + ], + [ + 8.840133405509025, + 54.600320934870865 + ], + [ + 8.847222947769476, + 54.60040665872058 + ], + [ + 8.850568330749878, + 54.59746960746734 + ], + [ + 8.864038496873802, + 54.598618791648256 + ], + [ + 8.8744066284199, + 54.6074847112218 + ], + [ + 8.87866802990968, + 54.606004257212724 + ], + [ + 8.86865663737257, + 54.59913135455248 + ], + [ + 8.88098706887688, + 54.59532147694257 + ], + [ + 8.882405814630198, + 54.588149692942544 + ], + [ + 8.868609356398103, + 54.56180937584803 + ], + [ + 8.831671129463405, + 54.55272742802846 + ], + [ + 8.829879818089134, + 54.55526939427976 + ], + [ + 8.804572924159576, + 54.55573224741819 + ], + [ + 8.789491649313296, + 54.552177165018634 + ], + [ + 8.823557450802323, + 54.54309483418785 + ], + [ + 8.835770829961154, + 54.54709643486191 + ], + [ + 8.834090382172507, + 54.54916745752696 + ], + [ + 8.870467456724455, + 54.55780160722562 + ], + [ + 8.877478945970488, + 54.54769096129092 + ], + [ + 8.87706073564139, + 54.53851840081483 + ], + [ + 8.86897042132894, + 54.52651008339715 + ], + [ + 8.835693842868057, + 54.50774837214239 + ], + [ + 8.813671868195726, + 54.50399764069202 + ], + [ + 8.80643702959003, + 54.498341542351724 + ], + [ + 8.80925992663856, + 54.49017420124272 + ], + [ + 8.819246764704886, + 54.48651580329107 + ], + [ + 8.807015454525482, + 54.470158959131965 + ], + [ + 8.828218014499786, + 54.46243031346422 + ], + [ + 8.895220518621766, + 54.45774305346717 + ], + [ + 8.924048464496884, + 54.46703967383556 + ], + [ + 8.915686586205734, + 54.47105833635606 + ], + [ + 8.928364838940439, + 54.468958317890944 + ], + [ + 8.933588124775964, + 54.4800406438643 + ], + [ + 8.940306552694341, + 54.48087861933567 + ], + [ + 8.93966654144395, + 54.491164687757156 + ], + [ + 8.955200917561468, + 54.49501825299452 + ], + [ + 8.961951926421591, + 54.50194321657647 + ], + [ + 8.9638957793423, + 54.51372534484488 + ], + [ + 8.971400148760814, + 54.51452902353089 + ], + [ + 8.969873631847657, + 54.51839461100212 + ], + [ + 8.983558531593948, + 54.52169529705545 + ], + [ + 8.992408557134286, + 54.50683150650979 + ], + [ + 9.005805584048579, + 54.499748734688644 + ], + [ + 9.0104258812033, + 54.48661864953281 + ], + [ + 9.005674572614543, + 54.48596860306458 + ], + [ + 9.00337997967837, + 54.479242098850754 + ], + [ + 9.017829475265536, + 54.47373616612498 + ], + [ + 9.006699298997443, + 54.476966919164475 + ], + [ + 8.993594967676387, + 54.466797717804205 + ], + [ + 8.997173202847225, + 54.462457200133244 + ], + [ + 8.977083675159168, + 54.45746337805057 + ], + [ + 8.976153859707065, + 54.45926777365966 + ], + [ + 8.961099374855973, + 54.45743756421902 + ], + [ + 8.946478009411654, + 54.4500630598303 + ], + [ + 8.949546340561445, + 54.448184280748954 + ], + [ + 8.945914787529398, + 54.44491175317893 + ], + [ + 8.936053890885134, + 54.44162926412053 + ], + [ + 8.916448756799712, + 54.425783035382345 + ], + [ + 8.889372355896722, + 54.41125028734284 + ], + [ + 8.852497486893892, + 54.40623418620028 + ], + [ + 8.85199733946469, + 54.40874958712453 + ], + [ + 8.842797004623845, + 54.40815818266622 + ], + [ + 8.835066590205805, + 54.411284385905184 + ], + [ + 8.827272774870494, + 54.40898679199409 + ], + [ + 8.830136963978262, + 54.41278706263219 + ], + [ + 8.826818810604184, + 54.41422942670073 + ], + [ + 8.749297765789969, + 54.407914639640225 + ], + [ + 8.746885921553094, + 54.404581263667744 + ], + [ + 8.745817398431694, + 54.40703385008503 + ], + [ + 8.724125991010846, + 54.40572601362659 + ], + [ + 8.724830699528995, + 54.40311308197669 + ], + [ + 8.6884046745329, + 54.39929472524549 + ], + [ + 8.673269807085722, + 54.40053294130852 + ], + [ + 8.654849863403067, + 54.392249659822255 + ], + [ + 8.646443746820262, + 54.39253735981373 + ], + [ + 8.629268229268112, + 54.376617137297536 + ], + [ + 8.629977079869771, + 54.37249302480019 + ], + [ + 8.635079835454114, + 54.36994442549564 + ], + [ + 8.634740432419646, + 54.37339535989391 + ], + [ + 8.638951512038359, + 54.36732698564017 + ], + [ + 8.65328757964716, + 54.36611234944127 + ], + [ + 8.653591355429977, + 54.372294991597364 + ], + [ + 8.656499955881104, + 54.36901090335297 + ], + [ + 8.668805504102947, + 54.366742979828615 + ], + [ + 8.689347261227864, + 54.37176871829272 + ], + [ + 8.675850963730174, + 54.36565715217848 + ], + [ + 8.680869482530708, + 54.35670011011983 + ], + [ + 8.67357559596174, + 54.354099420200164 + ], + [ + 8.688657290319005, + 54.35764399312607 + ], + [ + 8.688435571861442, + 54.360712301493784 + ], + [ + 8.689629233524116, + 54.35756816631426 + ], + [ + 8.674484058916482, + 54.35119565600878 + ], + [ + 8.666330781503982, + 54.35474314231589 + ], + [ + 8.653026533424834, + 54.35347199073727 + ], + [ + 8.649708208751331, + 54.348405425060875 + ], + [ + 8.637783624160056, + 54.3473312839726 + ], + [ + 8.632881640902921, + 54.3413558868581 + ], + [ + 8.615210075384985, + 54.34618249324196 + ], + [ + 8.619719465251608, + 54.356870146805576 + ], + [ + 8.605576080583203, + 54.3534982231699 + ], + [ + 8.590734738589447, + 54.342134915161054 + ], + [ + 8.578907810569927, + 54.30710799673416 + ], + [ + 8.590544935474748, + 54.292142433835174 + ], + [ + 8.609142579520482, + 54.28493772108784 + ], + [ + 8.589974417438127, + 54.3033412195854 + ], + [ + 8.61035574636701, + 54.29227078734543 + ], + [ + 8.59898822382071, + 54.30700252222372 + ], + [ + 8.601460844356072, + 54.31188424859615 + ], + [ + 8.64601100844485, + 54.27427968904856 + ], + [ + 8.675871493741036, + 54.26646098359066 + ], + [ + 8.69123660115201, + 54.26775262915577 + ], + [ + 8.69280330845354, + 54.27047009820775 + ], + [ + 8.674104046062082, + 54.271543636912085 + ], + [ + 8.6874862926922, + 54.27298778383894 + ], + [ + 8.697374051811057, + 54.27903316525319 + ], + [ + 8.699507497530417, + 54.284673827426964 + ], + [ + 8.713834674158054, + 54.288243308104406 + ], + [ + 8.71999034438658, + 54.284343316141744 + ], + [ + 8.727211662217329, + 54.28808086558768 + ], + [ + 8.746088469729527, + 54.29037366548004 + ], + [ + 8.768692846059174, + 54.28856750203492 + ], + [ + 8.770318241415012, + 54.282400560397306 + ], + [ + 8.781259929609977, + 54.280820769490965 + ], + [ + 8.822037764153984, + 54.29131020935964 + ], + [ + 8.837984278651108, + 54.28334761879469 + ], + [ + 8.843544062830167, + 54.27396325468552 + ], + [ + 8.840475752585261, + 54.267178648115525 + ], + [ + 8.844804723003998, + 54.26632864221642 + ], + [ + 8.843889624676693, + 54.25661650036138 + ], + [ + 8.83659293168873, + 54.252485545515036 + ], + [ + 8.832131609562284, + 54.23942256244199 + ], + [ + 8.839978681009804, + 54.23288205426755 + ], + [ + 8.83373033690046, + 54.21446229939511 + ], + [ + 8.819725246010231, + 54.206568947384824 + ], + [ + 8.809688951407683, + 54.1910119739406 + ], + [ + 8.808867636455076, + 54.17103733584576 + ], + [ + 8.816773310436954, + 54.16774994486516 + ], + [ + 8.826364864643185, + 54.14477723897013 + ], + [ + 8.835847331818925, + 54.134109152236626 + ], + [ + 8.85473256663469, + 54.128269114368706 + ], + [ + 8.857865500919287, + 54.119192577164995 + ], + [ + 8.89297376500851, + 54.13323559036091 + ], + [ + 8.90939840451499, + 54.13510493414753 + ], + [ + 8.926768418372873, + 54.13156930189734 + ], + [ + 8.950095759893943, + 54.09307312661277 + ], + [ + 8.94781615591702, + 54.09114569596639 + ], + [ + 8.976614874428257, + 54.07122838468967 + ], + [ + 8.976357937992477, + 54.06888649813198 + ], + [ + 8.958706162782413, + 54.066188700224714 + ], + [ + 8.958660342001622, + 54.06339300786135 + ], + [ + 8.982171242649422, + 54.06214058738124 + ], + [ + 8.985603509362718, + 54.05827476162337 + ], + [ + 8.977428590387541, + 54.041233345774806 + ], + [ + 8.958582680266257, + 54.03400004730264 + ], + [ + 8.95759884984859, + 54.03586512055479 + ], + [ + 8.939408769039398, + 54.03368237884519 + ], + [ + 8.92704554711132, + 54.04164557736462 + ], + [ + 8.881443236711913, + 54.04605222389225 + ], + [ + 8.847711338129116, + 54.03982375519127 + ], + [ + 8.836404790082693, + 54.028340283884795 + ], + [ + 8.804773173906817, + 54.02343879973842 + ], + [ + 8.832591823634784, + 54.023929408739676 + ], + [ + 8.842073485198414, + 54.00994445749724 + ], + [ + 8.847455717258233, + 54.00958281217179 + ], + [ + 8.858133018552213, + 53.99416252618836 + ], + [ + 8.87343360443869, + 53.9825847176802 + ], + [ + 8.915001990463413, + 53.92497485374283 + ], + [ + 8.936537291453508, + 53.915452029048026 + ], + [ + 8.93656167381834, + 53.911896902345504 + ], + [ + 8.961710318645904, + 53.89610703924939 + ], + [ + 8.977514415416744, + 53.891245047988875 + ], + [ + 9.018309495333703, + 53.89630949058174 + ], + [ + 9.022420176957269, + 53.8795175369778 + ], + [ + 8.994673672619555, + 53.872606313122596 + ], + [ + 8.809800105799926, + 53.90646841076545 + ], + [ + 8.767292191251734, + 53.96467784879628 + ], + [ + 8.499016062194402, + 54.028399887628886 + ], + [ + 7.865971663650991, + 54.02235348200651 + ], + [ + 7.727935090292497, + 53.993325130534004 + ], + [ + 7.675738787630113, + 54.013991918575584 + ], + [ + 7.630903617821372, + 54.03999228177064 + ], + [ + 7.573317512281889, + 54.087493189163105 + ], + [ + 7.538898773420466, + 54.13007751021682 + ], + [ + 7.524175120295641, + 54.16680073515794 + ], + [ + 7.521035328563531, + 54.19507936887712 + ], + [ + 7.527478826733001, + 54.232636168524856 + ], + [ + 7.54589487687906, + 54.2688041590233 + ], + [ + 7.575644613561343, + 54.30227773403039 + ], + [ + 7.604783545651142, + 54.324889851467134 + ], + [ + 7.639144902840072, + 54.34489082835827 + ], + [ + 7.691867765941081, + 54.36669760294949 + ], + [ + 7.750729852498399, + 54.382309799290134 + ], + [ + 7.813592238356363, + 54.391144042734815 + ], + [ + 7.861982251471738, + 54.39314459196886 + ], + [ + 7.967623835442395, + 54.38945108994294 + ], + [ + 8.028875586818447, + 54.3808958754476 + ], + [ + 8.072460302443027, + 54.37022930764224 + ], + [ + 8.113072822441474, + 54.35611815613008 + ], + [ + 8.161296916833678, + 54.332506778603936 + ], + [ + 7.974201521028101, + 54.585957386713 + ], + [ + 7.954033300181629, + 54.621513870594455 + ], + [ + 7.945782243777698, + 54.65007025304808 + ], + [ + 7.930778797869592, + 54.75274004459948 + ], + [ + 7.945191048878143, + 54.91071746951632 + ], + [ + 7.963328756109623, + 54.96444159955995 + ], + [ + 7.988355773653971, + 55.00983220080666 + ], + [ + 8.041549228180259, + 55.08561295618967 + ], + [ + 8.044382216615848, + 55.09916897708004 + ], + [ + 8.300669237289293, + 55.06325175383481 + ] + ], + [ + [ + 8.39480290075593, + 54.713012383677835 + ], + [ + 8.396507270425465, + 54.7041865915939 + ], + [ + 8.402451790198834, + 54.700168961659436 + ], + [ + 8.431796643107834, + 54.693880444414006 + ], + [ + 8.450907776229373, + 54.69301460844516 + ], + [ + 8.470720412513026, + 54.68257215437777 + ], + [ + 8.555011794886553, + 54.67897525118165 + ], + [ + 8.567908895533058, + 54.68099242763965 + ], + [ + 8.572345009808986, + 54.69000026830561 + ], + [ + 8.578684643471302, + 54.69262616177814 + ], + [ + 8.575555268822484, + 54.70198507870057 + ], + [ + 8.58176796809234, + 54.71020265740585 + ], + [ + 8.596999617152473, + 54.71909062018063 + ], + [ + 8.587259675447333, + 54.72492901873583 + ], + [ + 8.584304577681504, + 54.73040690542601 + ], + [ + 8.588692969381814, + 54.74098330810501 + ], + [ + 8.582119801149148, + 54.74631230619285 + ], + [ + 8.557755334968137, + 54.75366088374354 + ], + [ + 8.523957616248339, + 54.755883270370056 + ], + [ + 8.516577039073825, + 54.751671067137664 + ], + [ + 8.514231500113377, + 54.754413446133995 + ], + [ + 8.485569812438461, + 54.74958007536118 + ], + [ + 8.470349661111385, + 54.75229510831455 + ], + [ + 8.427282047580043, + 54.746184306409106 + ], + [ + 8.409327320123783, + 54.735557391752536 + ], + [ + 8.39480290075593, + 54.713012383677835 + ] + ], + [ + [ + 8.700448329883391, + 54.55789971659953 + ], + [ + 8.699995287122002, + 54.55604026033287 + ], + [ + 8.686379041391085, + 54.557128610716845 + ], + [ + 8.668393897882464, + 54.549504815151 + ], + [ + 8.641712459115581, + 54.545623237854414 + ], + [ + 8.626050111586144, + 54.535627717503324 + ], + [ + 8.597876957248754, + 54.53432790388142 + ], + [ + 8.588513519444332, + 54.52993395432551 + ], + [ + 8.592239742160261, + 54.508678872807835 + ], + [ + 8.620702881706748, + 54.489979622846484 + ], + [ + 8.63811351715788, + 54.48940597163433 + ], + [ + 8.669849211333833, + 54.49452660966238 + ], + [ + 8.687278667541037, + 54.50902146773964 + ], + [ + 8.702920766662336, + 54.50106471442903 + ], + [ + 8.688708053572684, + 54.51078808993995 + ], + [ + 8.693360238983992, + 54.51495483067381 + ], + [ + 8.696682361117807, + 54.5113261977993 + ], + [ + 8.696813863761085, + 54.5174969245636 + ], + [ + 8.686982249088835, + 54.52106731213448 + ], + [ + 8.6966942354473, + 54.52384994817162 + ], + [ + 8.706042353901168, + 54.53759588724219 + ], + [ + 8.710873833998825, + 54.55296372129352 + ], + [ + 8.700448329883391, + 54.55789971659953 + ] + ], + [ + [ + 8.349033999794113, + 54.67623274942448 + ], + [ + 8.3396070636291, + 54.69504261094206 + ], + [ + 8.35927688411825, + 54.71144694755958 + ], + [ + 8.341680548667023, + 54.704113743200814 + ], + [ + 8.322433295625665, + 54.68853475671916 + ], + [ + 8.309176695849159, + 54.68425928804834 + ], + [ + 8.29640847182729, + 54.673769973020526 + ], + [ + 8.294096232347025, + 54.66617513525719 + ], + [ + 8.305585127400683, + 54.65318935745961 + ], + [ + 8.364501390305666, + 54.60947250186721 + ], + [ + 8.395453393805791, + 54.61315455145992 + ], + [ + 8.400850849886432, + 54.617927766764595 + ], + [ + 8.400238682674331, + 54.6209954283916 + ], + [ + 8.394618759464285, + 54.61805373668228 + ], + [ + 8.386564492375157, + 54.623042935927444 + ], + [ + 8.40188843685014, + 54.626186174874974 + ], + [ + 8.400267063033326, + 54.62882845668535 + ], + [ + 8.388376193904522, + 54.627646447162256 + ], + [ + 8.380629996054736, + 54.63142665652636 + ], + [ + 8.383314787651917, + 54.639617892847696 + ], + [ + 8.361874776306431, + 54.64979928360948 + ], + [ + 8.349033999794113, + 54.67623274942448 + ] + ], + [ + [ + 8.549021310485143, + 54.55689762869965 + ], + [ + 8.564258286186961, + 54.5570865901315 + ], + [ + 8.575569922352223, + 54.560455794024335 + ], + [ + 8.575502817622313, + 54.56537534559993 + ], + [ + 8.561487236970732, + 54.57253322055888 + ], + [ + 8.558262911197975, + 54.57818548705708 + ], + [ + 8.549936511258872, + 54.57943124879847 + ], + [ + 8.532726830207967, + 54.57518713615357 + ], + [ + 8.516205555969126, + 54.579080577851514 + ], + [ + 8.508679764859902, + 54.5773373658586 + ], + [ + 8.51432141864877, + 54.571137349902095 + ], + [ + 8.536322600540197, + 54.56531092624074 + ], + [ + 8.549021310485143, + 54.55689762869965 + ] + ], + [ + [ + 7.883910745182575, + 54.18891906457099 + ], + [ + 7.869099861201054, + 54.18782725537656 + ], + [ + 7.88754147277482, + 54.176540566179035 + ], + [ + 7.890842286648588, + 54.16983404186268 + ], + [ + 7.899523638848427, + 54.17190169709835 + ], + [ + 7.907684732248865, + 54.168880777119185 + ], + [ + 7.906634243947134, + 54.18227472641742 + ], + [ + 7.918168073056388, + 54.181311979408704 + ], + [ + 7.919433481304869, + 54.18937623848684 + ], + [ + 7.90281939570355, + 54.1871905011233 + ], + [ + 7.891415913170317, + 54.19301121686295 + ], + [ + 7.883910745182575, + 54.18891906457099 + ] + ], + [ + [ + 8.737631890054919, + 54.63463867836154 + ], + [ + 8.740339064312417, + 54.64361023907627 + ], + [ + 8.735579630161963, + 54.64449017465107 + ], + [ + 8.713805060031977, + 54.63915358063721 + ], + [ + 8.710003353835237, + 54.63194887282401 + ], + [ + 8.72108972048155, + 54.627336799514936 + ], + [ + 8.737631890054919, + 54.63463867836154 + ] + ], + [ + [ + 8.684386924414934, + 54.0464650726834 + ], + [ + 8.701101814136658, + 54.04809305222946 + ], + [ + 8.68946610259079, + 54.04850226651527 + ], + [ + 8.68437087556411, + 54.05246000418055 + ], + [ + 8.700484247692938, + 54.057789234177065 + ], + [ + 8.690707041699488, + 54.06149259879391 + ], + [ + 8.700047928667448, + 54.06776113956926 + ], + [ + 8.697781026071565, + 54.07126310248059 + ], + [ + 8.680711710719274, + 54.06394115999601 + ], + [ + 8.67818249028438, + 54.05396400668897 + ], + [ + 8.684386924414934, + 54.0464650726834 + ] + ], + [ + [ + 8.551567708376693, + 54.459658201866496 + ], + [ + 8.561972408637608, + 54.46478955939064 + ], + [ + 8.547709365985476, + 54.46862982397475 + ], + [ + 8.544983988801661, + 54.465438490120974 + ], + [ + 8.551567708376693, + 54.459658201866496 + ] + ], + [ + [ + 8.725453455063537, + 54.46235788691128 + ], + [ + 8.729334835767885, + 54.462751007158126 + ], + [ + 8.736340653390531, + 54.46780857072045 + ], + [ + 8.718506492557575, + 54.46662196893183 + ], + [ + 8.725453455063537, + 54.46235788691128 + ] + ], + [ + [ + 8.762097828539206, + 54.635244745134294 + ], + [ + 8.768537953164332, + 54.636816389821206 + ], + [ + 8.771890322736127, + 54.63667899750444 + ], + [ + 8.766412089835006, + 54.63784958248582 + ], + [ + 8.762097828539206, + 54.635244745134294 + ] + ], + [ + [ + 8.516163790911053, + 54.5291422823404 + ], + [ + 8.512835978344532, + 54.52947593227456 + ], + [ + 8.507215489240027, + 54.52760112097598 + ], + [ + 8.5139781548721, + 54.52770756729855 + ], + [ + 8.516163790911053, + 54.5291422823404 + ] + ], + [ + [ + 8.36710861475324, + 54.86854618350379 + ], + [ + 8.361992353929905, + 54.87000439326134 + ], + [ + 8.360129495818965, + 54.8692909304859 + ], + [ + 8.362064061564363, + 54.86729483100087 + ], + [ + 8.36710861475324, + 54.86854618350379 + ] + ], + [ + [ + 8.346078278220999, + 54.87566237798598 + ], + [ + 8.344835226380658, + 54.87572043307881 + ], + [ + 8.345437849170121, + 54.873798386702795 + ], + [ + 8.346814535310969, + 54.874708358123726 + ], + [ + 8.346078278220999, + 54.87566237798598 + ] + ] + ], + [ + [ + [ + 9.94024453374471, + 54.8195028951596 + ], + [ + 10.051662545871517, + 54.76599210693331 + ], + [ + 10.086321578802286, + 54.763967788164436 + ], + [ + 10.169335418748163, + 54.73740043680851 + ], + [ + 10.3087869907776, + 54.61184218252061 + ], + [ + 10.338788304887986, + 54.592397401536914 + ], + [ + 10.50546049999531, + 54.54684197258558 + ], + [ + 10.592130129600317, + 54.519897487800044 + ], + [ + 10.652131932316882, + 54.510175521680246 + ], + [ + 10.75463445338071, + 54.51350993181703 + ], + [ + 10.819912977869766, + 54.546567162766095 + ], + [ + 10.979639048668274, + 54.55518005466646 + ], + [ + 11.000750323445503, + 54.568791800688764 + ], + [ + 11.141309279546583, + 54.5762933606859 + ], + [ + 11.31103717978497, + 54.52879342206674 + ], + [ + 11.321871252577537, + 54.512126322559325 + ], + [ + 11.349649957446427, + 54.50434855393492 + ], + [ + 11.40242994833158, + 54.47323693574529 + ], + [ + 11.538268590276527, + 54.40684718186286 + ], + [ + 11.644384497782235, + 54.330734618291885 + ], + [ + 11.666752568729713, + 54.33092195022823 + ], + [ + 11.672452196632076, + 54.31517542249039 + ], + [ + 11.123837875139774, + 54.10293831309438 + ], + [ + 10.903661739173112, + 53.95682190259485 + ], + [ + 10.882767843676016, + 53.95879206062921 + ], + [ + 10.886586854769345, + 53.9617624138451 + ], + [ + 10.882104524484886, + 53.967585866506084 + ], + [ + 10.88422272726002, + 53.97941813455033 + ], + [ + 10.868270886835298, + 53.99175402306368 + ], + [ + 10.855785407038773, + 53.99406245186122 + ], + [ + 10.839312052600112, + 53.99175560469349 + ], + [ + 10.809126731678898, + 53.995750137909944 + ], + [ + 10.811990100108488, + 53.99263100325346 + ], + [ + 10.801641795530594, + 53.9921110435093 + ], + [ + 10.781125172908249, + 54.00191200673408 + ], + [ + 10.751846595281718, + 54.03707925461062 + ], + [ + 10.755195192546825, + 54.05376265076009 + ], + [ + 10.791935614180481, + 54.07595295804565 + ], + [ + 10.802292767537596, + 54.09066660824672 + ], + [ + 10.807590425891238, + 54.09230620474087 + ], + [ + 10.801173129838531, + 54.09518398820909 + ], + [ + 10.800689672664566, + 54.0988274401931 + ], + [ + 10.805724816783476, + 54.09604617595927 + ], + [ + 10.812387953945883, + 54.0972932793053 + ], + [ + 10.823867673480661, + 54.089049898467266 + ], + [ + 10.853994429527487, + 54.08913889972067 + ], + [ + 10.865863013509264, + 54.08481304973755 + ], + [ + 10.877515196380605, + 54.088017815503505 + ], + [ + 10.926231897815484, + 54.118441190888674 + ], + [ + 10.955098331238414, + 54.14108373836974 + ], + [ + 11.04691667828122, + 54.17653162810978 + ], + [ + 11.070495008833953, + 54.192856777215404 + ], + [ + 11.091935758343553, + 54.19731978177715 + ], + [ + 11.091205923456338, + 54.21856458953157 + ], + [ + 11.08190579986571, + 54.25183417030526 + ], + [ + 11.083767658167396, + 54.279279417134454 + ], + [ + 11.0719180947595, + 54.34224630487959 + ], + [ + 11.078935068955584, + 54.34208019410043 + ], + [ + 11.089734627157565, + 54.35811955690448 + ], + [ + 11.12560949763731, + 54.373613503497445 + ], + [ + 11.128829806275096, + 54.38990562194313 + ], + [ + 11.1185582299477, + 54.394420938204156 + ], + [ + 11.118493157083378, + 54.39233378103334 + ], + [ + 11.109706837491032, + 54.389159070819005 + ], + [ + 11.108545766922942, + 54.39272129188592 + ], + [ + 11.113452989234244, + 54.39114918026181 + ], + [ + 11.107674317428337, + 54.397506862258716 + ], + [ + 11.09011317161558, + 54.3913406577241 + ], + [ + 11.079122260151774, + 54.37757108922442 + ], + [ + 11.023741258139541, + 54.36771167335037 + ], + [ + 11.018815448006675, + 54.37641788812611 + ], + [ + 11.023382819256597, + 54.376766425956944 + ], + [ + 11.021226870751507, + 54.380633419816796 + ], + [ + 10.985244549916052, + 54.3807771729705 + ], + [ + 10.980451610439726, + 54.38500845317603 + ], + [ + 10.97637922618894, + 54.3850437281471 + ], + [ + 10.975546929579764, + 54.3813653045805 + ], + [ + 10.949450671477047, + 54.38478377958926 + ], + [ + 10.931205242128451, + 54.38193996789257 + ], + [ + 10.906994165257275, + 54.36768201774714 + ], + [ + 10.871762905694622, + 54.35826985859868 + ], + [ + 10.829229581060291, + 54.330023971964316 + ], + [ + 10.789502880037096, + 54.312133408044836 + ], + [ + 10.758652299045119, + 54.30598592759454 + ], + [ + 10.739806647923082, + 54.309586770787796 + ], + [ + 10.706974465125718, + 54.30503645901932 + ], + [ + 10.684633959463348, + 54.31031893372858 + ], + [ + 10.678208070675575, + 54.32144853188996 + ], + [ + 10.649243860749392, + 54.333351373993665 + ], + [ + 10.638803079853929, + 54.34784473966637 + ], + [ + 10.599607975696035, + 54.36373130321508 + ], + [ + 10.539874620881001, + 54.379813062390596 + ], + [ + 10.47369919323124, + 54.39247291629914 + ], + [ + 10.387982309065395, + 54.426445872463816 + ], + [ + 10.330554114864421, + 54.43573100116244 + ], + [ + 10.30210849796767, + 54.43315275833613 + ], + [ + 10.276060516510826, + 54.421479609063084 + ], + [ + 10.28002604196235, + 54.420260912557424 + ], + [ + 10.293978608948338, + 54.425814262429775 + ], + [ + 10.292872856420466, + 54.42196441234863 + ], + [ + 10.27987775961332, + 54.418174867545034 + ], + [ + 10.226061065814827, + 54.41390558710736 + ], + [ + 10.20885387487159, + 54.39995596981851 + ], + [ + 10.211904953456909, + 54.39688521531878 + ], + [ + 10.208061244501858, + 54.38741265081738 + ], + [ + 10.193662463997342, + 54.37925439652846 + ], + [ + 10.195952269656269, + 54.366019734649065 + ], + [ + 10.178220817600906, + 54.36114311762258 + ], + [ + 10.174162084863477, + 54.34574538418509 + ], + [ + 10.152083022471288, + 54.36332651841844 + ], + [ + 10.154140028437803, + 54.36887915367618 + ], + [ + 10.19268816355295, + 54.39034391922871 + ], + [ + 10.188773122419871, + 54.41108284905239 + ], + [ + 10.168851706332399, + 54.43413127787174 + ], + [ + 10.184605974887056, + 54.447140782717845 + ], + [ + 10.19563225611485, + 54.44982817077898 + ], + [ + 10.19938274492806, + 54.455561542568454 + ], + [ + 10.190362668685529, + 54.45705989493617 + ], + [ + 10.162145888628443, + 54.47330534897732 + ], + [ + 10.134027446674622, + 54.4843379017237 + ], + [ + 10.117778334836494, + 54.48525800930221 + ], + [ + 10.020984832620288, + 54.47541737320421 + ], + [ + 9.997511005209715, + 54.468627947836055 + ], + [ + 9.924255119254125, + 54.46229375693841 + ], + [ + 9.913749066512231, + 54.45237600636196 + ], + [ + 9.86421809447874, + 54.44852494581101 + ], + [ + 9.867316283145453, + 54.452579951877155 + ], + [ + 9.8553700688393, + 54.456283167788975 + ], + [ + 9.862454379072052, + 54.469649151988655 + ], + [ + 9.964664115100804, + 54.50247764976453 + ], + [ + 9.995852755579245, + 54.51973539235314 + ], + [ + 10.014819433264702, + 54.54508980536576 + ], + [ + 10.026625464393156, + 54.55026458327001 + ], + [ + 10.02609504033649, + 54.5977291944142 + ], + [ + 10.033553725311993, + 54.6207395012811 + ], + [ + 10.031249193690346, + 54.6472333382451 + ], + [ + 10.034485215949049, + 54.65764503444481 + ], + [ + 10.043211288357107, + 54.659561549764554 + ], + [ + 10.033501435452921, + 54.66346503565534 + ], + [ + 10.036540547414816, + 54.687119118513536 + ], + [ + 9.988994157314576, + 54.718315221457935 + ], + [ + 9.976905807205203, + 54.75683564764199 + ], + [ + 9.957233879616108, + 54.77985580985485 + ], + [ + 9.913090891370116, + 54.795483371118664 + ], + [ + 9.909238649735656, + 54.7999882813309 + ], + [ + 9.901623755458122, + 54.78796404298223 + ], + [ + 9.9042577761398, + 54.781779396019566 + ], + [ + 9.89969756349532, + 54.77279001179729 + ], + [ + 9.903550318889028, + 54.77335424301855 + ], + [ + 9.906688144237942, + 54.769237509222 + ], + [ + 9.905374299046553, + 54.76334288667918 + ], + [ + 9.902161666327295, + 54.76696064525053 + ], + [ + 9.893059017555474, + 54.767715321146966 + ], + [ + 9.894488602307009, + 54.77114124749105 + ], + [ + 9.877859769517844, + 54.75774203499569 + ], + [ + 9.871455607777799, + 54.75838323653506 + ], + [ + 9.87737166450692, + 54.75580243340669 + ], + [ + 9.875666148488788, + 54.75272912887196 + ], + [ + 9.85186632332949, + 54.754473129311535 + ], + [ + 9.831433355147148, + 54.76156185362798 + ], + [ + 9.801715870422663, + 54.78432529064829 + ], + [ + 9.792237544352338, + 54.79763254151364 + ], + [ + 9.746717701868361, + 54.824125449480725 + ], + [ + 9.89408542639389, + 54.84177816000753 + ], + [ + 9.94024453374471, + 54.8195028951596 + ] + ], + [ + [ + 11.021662860368448, + 54.49968332769262 + ], + [ + 11.010317918417709, + 54.48255704819518 + ], + [ + 11.00665116658017, + 54.44364353756485 + ], + [ + 11.038218166757828, + 54.42985929664002 + ], + [ + 11.047145004568645, + 54.428281641299264 + ], + [ + 11.03745632882352, + 54.43148729749421 + ], + [ + 11.032930848996289, + 54.43715034855892 + ], + [ + 11.022078991519122, + 54.43745226771936 + ], + [ + 11.022860902558692, + 54.443930697287065 + ], + [ + 11.030950293108269, + 54.44305904405156 + ], + [ + 11.047884116641654, + 54.44786081213076 + ], + [ + 11.053301734311946, + 54.44561095086633 + ], + [ + 11.053355148213047, + 54.44974734225349 + ], + [ + 11.063190355152363, + 54.452814301830976 + ], + [ + 11.073877900542675, + 54.44955946864255 + ], + [ + 11.074811552152536, + 54.44532238127575 + ], + [ + 11.076411592193871, + 54.449740320571756 + ], + [ + 11.095116470303145, + 54.445452705055004 + ], + [ + 11.096532008036537, + 54.43646718432673 + ], + [ + 11.101781618358427, + 54.43423922122807 + ], + [ + 11.094908669257142, + 54.422557468361894 + ], + [ + 11.095704840181227, + 54.40922004837268 + ], + [ + 11.12096563849251, + 54.40207527002224 + ], + [ + 11.166672231558051, + 54.401327765580646 + ], + [ + 11.177587833080556, + 54.40213803393052 + ], + [ + 11.186867916856396, + 54.40882439813533 + ], + [ + 11.1974673620501, + 54.40670066392429 + ], + [ + 11.21348972172043, + 54.41151753155427 + ], + [ + 11.241868543971776, + 54.412059226867356 + ], + [ + 11.31266282729023, + 54.40225842317283 + ], + [ + 11.29807690419996, + 54.43076479835923 + ], + [ + 11.279430870255618, + 54.445921360505125 + ], + [ + 11.268619329246444, + 54.46313207494118 + ], + [ + 11.252615714636391, + 54.47175512763975 + ], + [ + 11.23267819459422, + 54.506862681327625 + ], + [ + 11.216730750085965, + 54.50437784275936 + ], + [ + 11.196784227171184, + 54.509058721092615 + ], + [ + 11.188515645834986, + 54.515126877873115 + ], + [ + 11.165482891260254, + 54.52248259206414 + ], + [ + 11.079079732282661, + 54.53128375545474 + ], + [ + 11.06823983959724, + 54.53610685121974 + ], + [ + 11.039047458175645, + 54.519134022395136 + ], + [ + 11.021662860368448, + 54.49968332769262 + ] + ], + [ + [ + 11.08953860940877, + 54.435954918273815 + ], + [ + 11.091347800569546, + 54.43812044931475 + ], + [ + 11.081490066572702, + 54.438750072731835 + ], + [ + 11.086848122692272, + 54.43632020635557 + ], + [ + 11.08953860940877, + 54.435954918273815 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "04", + "AGS": "04", + "SDV_RS": "040110000000", + "GEN": "Bremen", + "BEZ": "Freie Hansestadt", + "IBZ": 23, + "BEM": "--", + "NBD": "ja", + "SN_L": "04", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE5", + "RS_0": "040000000000", + "AGS_0": "04000000", + "WSK": "2010/01/01", + "DEBKG_ID": "DEBKGDL20000E0SF", + "destatis": { + "population": 661888, + "population_m": 324423, + "population_w": 337465 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 8.504608166710035, + 53.22891929660262 + ], + [ + 8.517333845503478, + 53.228496506049815 + ], + [ + 8.530234736296732, + 53.21608950112712 + ], + [ + 8.540782167051168, + 53.21537751713142 + ], + [ + 8.553698911154836, + 53.207805800259514 + ], + [ + 8.566405422025067, + 53.213559774120355 + ], + [ + 8.572281808118797, + 53.21076907192033 + ], + [ + 8.578477887820995, + 53.21726952277953 + ], + [ + 8.599039075620652, + 53.212546229128144 + ], + [ + 8.595812800645838, + 53.20643589308046 + ], + [ + 8.581097701704895, + 53.198707246275006 + ], + [ + 8.585068588332875, + 53.1962248202564 + ], + [ + 8.580352119095535, + 53.19002768400021 + ], + [ + 8.588962219398885, + 53.1899825893063 + ], + [ + 8.592154263348245, + 53.18470937022162 + ], + [ + 8.606891682686202, + 53.187662666516935 + ], + [ + 8.609010790655317, + 53.19201135145315 + ], + [ + 8.627994029664665, + 53.19837235203289 + ], + [ + 8.643666420801473, + 53.18922400746934 + ], + [ + 8.652338930423085, + 53.188393154986436 + ], + [ + 8.659029625992176, + 53.17728169285197 + ], + [ + 8.66382835685825, + 53.17624384320961 + ], + [ + 8.674706128066312, + 53.17891920230609 + ], + [ + 8.677017357251176, + 53.175500962095796 + ], + [ + 8.699357718374403, + 53.185479430253025 + ], + [ + 8.706292567704319, + 53.17542111880866 + ], + [ + 8.714396466754591, + 53.18300239858995 + ], + [ + 8.728652284333279, + 53.18022448975544 + ], + [ + 8.733555139093898, + 53.172895581553846 + ], + [ + 8.743081930463509, + 53.17227749027655 + ], + [ + 8.741246363859554, + 53.16463551985254 + ], + [ + 8.761738569386145, + 53.165135224352895 + ], + [ + 8.775395748740646, + 53.15868402244027 + ], + [ + 8.782459373417051, + 53.16361168668038 + ], + [ + 8.789137013803707, + 53.160774142600594 + ], + [ + 8.797141843894, + 53.16384393018478 + ], + [ + 8.807362698039114, + 53.16065007917608 + ], + [ + 8.815091053916385, + 53.16393962658792 + ], + [ + 8.829227339050119, + 53.164376276558706 + ], + [ + 8.827221727345655, + 53.16123796221632 + ], + [ + 8.839826704080625, + 53.15741766651851 + ], + [ + 8.841855465139485, + 53.14823366322417 + ], + [ + 8.861770969188568, + 53.137636505917094 + ], + [ + 8.864023195191853, + 53.13172351482289 + ], + [ + 8.898539845744112, + 53.134248542824004 + ], + [ + 8.903929660461523, + 53.13817618591184 + ], + [ + 8.912143303863166, + 53.13261879951947 + ], + [ + 8.921026201078254, + 53.13965692272775 + ], + [ + 8.920907502248967, + 53.14465435614032 + ], + [ + 8.945082912166951, + 53.15201299020181 + ], + [ + 8.956631109750228, + 53.1472413034444 + ], + [ + 8.98418525302057, + 53.12607092984657 + ], + [ + 8.947017836734709, + 53.11610080899127 + ], + [ + 8.959388732727206, + 53.11017046653 + ], + [ + 8.96298904216229, + 53.10029863620715 + ], + [ + 8.970474093990475, + 53.101570426005416 + ], + [ + 8.981523847986912, + 53.09649345279226 + ], + [ + 8.988372046735092, + 53.09847551826897 + ], + [ + 8.99078035598644, + 53.09662616426188 + ], + [ + 8.965676498790652, + 53.09000158536557 + ], + [ + 8.961377207120085, + 53.08521811226193 + ], + [ + 8.965735401884244, + 53.08270145840527 + ], + [ + 8.966562242743663, + 53.06745362628188 + ], + [ + 8.960947194019049, + 53.06623205871044 + ], + [ + 8.963728919757703, + 53.057426216779675 + ], + [ + 8.969779855754535, + 53.05684822691882 + ], + [ + 8.980267134109532, + 53.046747056597425 + ], + [ + 8.966785901704233, + 53.03684956002267 + ], + [ + 8.94568549471928, + 53.03048401855428 + ], + [ + 8.946090130905093, + 53.024673720883165 + ], + [ + 8.938130436878907, + 53.0249856416254 + ], + [ + 8.935915497845368, + 53.01366695515236 + ], + [ + 8.921862030293942, + 53.01487622623795 + ], + [ + 8.915827047813707, + 53.011021378306516 + ], + [ + 8.893251968593326, + 53.014403580897365 + ], + [ + 8.867234971714893, + 53.03300381287035 + ], + [ + 8.867006164658232, + 53.04083261503706 + ], + [ + 8.861867115177695, + 53.036177882466006 + ], + [ + 8.866756113910215, + 53.02211723564252 + ], + [ + 8.854025742236496, + 53.020777087120585 + ], + [ + 8.848211871454101, + 53.01672400297423 + ], + [ + 8.850093686718434, + 53.023052855743195 + ], + [ + 8.838337447346381, + 53.01840619775398 + ], + [ + 8.8222469667878, + 53.02118916742984 + ], + [ + 8.80948416917235, + 53.030904114980395 + ], + [ + 8.778297674258118, + 53.039666684449955 + ], + [ + 8.770704765829844, + 53.05340697203283 + ], + [ + 8.762224722506083, + 53.05083167072952 + ], + [ + 8.763153718754666, + 53.046269859284095 + ], + [ + 8.754737151247225, + 53.04284127283564 + ], + [ + 8.756270723438107, + 53.03878054265169 + ], + [ + 8.743157437268732, + 53.040946037537765 + ], + [ + 8.731491653910052, + 53.03493253213112 + ], + [ + 8.709801137693614, + 53.04601821922462 + ], + [ + 8.709154809808052, + 53.075908334134894 + ], + [ + 8.700762704793005, + 53.082294260721355 + ], + [ + 8.673892633756504, + 53.086742034187466 + ], + [ + 8.666494272015543, + 53.091558799367604 + ], + [ + 8.669831091689062, + 53.102974702431794 + ], + [ + 8.654898618755622, + 53.10886458532636 + ], + [ + 8.657680503247901, + 53.11849192718939 + ], + [ + 8.651966922324473, + 53.116445418512676 + ], + [ + 8.651598158447891, + 53.12205076966399 + ], + [ + 8.63106656832012, + 53.1381756156032 + ], + [ + 8.620785825688236, + 53.166614519015134 + ], + [ + 8.611809772274798, + 53.17032195121267 + ], + [ + 8.581679925765084, + 53.17359377399384 + ], + [ + 8.535954642436154, + 53.18652685949399 + ], + [ + 8.504711920037412, + 53.20078605283261 + ], + [ + 8.481735118728864, + 53.226449542602836 + ], + [ + 8.504608166710035, + 53.22891929660262 + ] + ] + ], + [ + [ + [ + 8.539484104731399, + 53.606290145751835 + ], + [ + 8.558768776140356, + 53.6039069663585 + ], + [ + 8.592283299874302, + 53.59293261174721 + ], + [ + 8.62329626569269, + 53.605333334216965 + ], + [ + 8.650632387019975, + 53.60256521989858 + ], + [ + 8.63795573147082, + 53.59506742059681 + ], + [ + 8.64271581456452, + 53.59255941281019 + ], + [ + 8.62712558542194, + 53.57912011353061 + ], + [ + 8.617596345614901, + 53.57768990944312 + ], + [ + 8.616802851394747, + 53.574370036114345 + ], + [ + 8.630860355393823, + 53.55568958894531 + ], + [ + 8.636334689453903, + 53.553686983432 + ], + [ + 8.646354348842694, + 53.5555456717755 + ], + [ + 8.645226852489554, + 53.540472717553484 + ], + [ + 8.642051824930903, + 53.541683382393806 + ], + [ + 8.638655790477438, + 53.534953556350175 + ], + [ + 8.639775421480124, + 53.52528946936797 + ], + [ + 8.652134242375018, + 53.51601712524021 + ], + [ + 8.648232263441702, + 53.514303291341726 + ], + [ + 8.65055515732474, + 53.51078166507432 + ], + [ + 8.632154016969533, + 53.50166810836933 + ], + [ + 8.63144140176295, + 53.4936617626176 + ], + [ + 8.623028303598536, + 53.49353395391745 + ], + [ + 8.605904617424315, + 53.4842337862802 + ], + [ + 8.577306586624122, + 53.48545327792543 + ], + [ + 8.57376027765244, + 53.48864307269989 + ], + [ + 8.52971379624069, + 53.48034170040678 + ], + [ + 8.518634111680493, + 53.47444590381119 + ], + [ + 8.511604095042195, + 53.47666452411366 + ], + [ + 8.505789852931818, + 53.47117823667435 + ], + [ + 8.492651891758555, + 53.47241975947769 + ], + [ + 8.501544729791618, + 53.49065768833636 + ], + [ + 8.5146089141215, + 53.501413490629496 + ], + [ + 8.552684233566158, + 53.51617564458746 + ], + [ + 8.560907612474352, + 53.50933275235713 + ], + [ + 8.575827944584974, + 53.536317987954334 + ], + [ + 8.559253899218497, + 53.55722741424258 + ], + [ + 8.557321298910958, + 53.55519249922482 + ], + [ + 8.54961704888375, + 53.56310708401593 + ], + [ + 8.549983177299628, + 53.569876057008706 + ], + [ + 8.547814908617243, + 53.56532195485629 + ], + [ + 8.509366805978493, + 53.60312732948411 + ], + [ + 8.520987859504906, + 53.604390290584 + ], + [ + 8.52119007245298, + 53.606439064018076 + ], + [ + 8.526158867376962, + 53.60383991468742 + ], + [ + 8.533651067751817, + 53.60761767767018 + ], + [ + 8.539484104731399, + 53.606290145751835 + ] + ] + ], + [ + [ + [ + 8.647233393432124, + 53.61002843579155 + ], + [ + 8.660884274068112, + 53.60708643578497 + ], + [ + 8.657717087554946, + 53.602985611287615 + ], + [ + 8.64376917660616, + 53.60547338656171 + ], + [ + 8.64262798262025, + 53.60921330655074 + ], + [ + 8.647233393432124, + 53.61002843579155 + ] + ] + ], + [ + [ + [ + 8.616397736621458, + 53.19702603906715 + ], + [ + 8.615217568233339, + 53.19591091818733 + ], + [ + 8.611903031514444, + 53.19744233585235 + ], + [ + 8.613037882304306, + 53.19856578091858 + ], + [ + 8.616397736621458, + 53.19702603906715 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "06", + "AGS": "06", + "SDV_RS": "064140000000", + "GEN": "Hessen", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "06", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE7", + "RS_0": "060000000000", + "AGS_0": "06000000", + "WSK": "2015/01/01", + "DEBKG_ID": "DEBKGDL20000E3LK", + "destatis": { + "population": 6093888, + "population_m": 2991752, + "population_w": 3102136 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 9.494898166322109, + 51.646353025617316 + ], + [ + 9.49192953184265, + 51.63472158023098 + ], + [ + 9.515027492851162, + 51.62627026177145 + ], + [ + 9.530633548218514, + 51.62926939477437 + ], + [ + 9.543630864439992, + 51.63986668833803 + ], + [ + 9.553539215280333, + 51.637318449922674 + ], + [ + 9.55935884678494, + 51.62923169248272 + ], + [ + 9.570707597051527, + 51.62471977512613 + ], + [ + 9.609644970040094, + 51.62957638728749 + ], + [ + 9.625999283681386, + 51.636913968153465 + ], + [ + 9.631617932260282, + 51.634166379989345 + ], + [ + 9.627076387187602, + 51.62895973256221 + ], + [ + 9.636620701333642, + 51.623415841916525 + ], + [ + 9.637835474208496, + 51.608804810355515 + ], + [ + 9.649528854010311, + 51.60627151634232 + ], + [ + 9.661055938379555, + 51.593029604491655 + ], + [ + 9.668637800237503, + 51.59167632801398 + ], + [ + 9.672256981795687, + 51.587369239196725 + ], + [ + 9.679808990730749, + 51.58796119787761 + ], + [ + 9.690947952679238, + 51.57631513922257 + ], + [ + 9.684003674135843, + 51.56653265800835 + ], + [ + 9.66011417848361, + 51.57270785973169 + ], + [ + 9.64487725063231, + 51.58224315570359 + ], + [ + 9.634003998111499, + 51.584485085213466 + ], + [ + 9.62683088430579, + 51.58197606236912 + ], + [ + 9.628368489609636, + 51.56719638033336 + ], + [ + 9.636377648766928, + 51.55893304989422 + ], + [ + 9.645015613578106, + 51.55935585661458 + ], + [ + 9.647755439638924, + 51.55251096635144 + ], + [ + 9.622443388265424, + 51.54867253721827 + ], + [ + 9.617604731686024, + 51.55489838724459 + ], + [ + 9.609101426491979, + 51.5572546747514 + ], + [ + 9.62195014259368, + 51.54186689371579 + ], + [ + 9.62029718664698, + 51.53251354524166 + ], + [ + 9.608917300556298, + 51.52218256715527 + ], + [ + 9.592452328009188, + 51.52337052113343 + ], + [ + 9.586259150380409, + 51.519318923691344 + ], + [ + 9.619586506746154, + 51.48102865901589 + ], + [ + 9.643813807586048, + 51.46916004175173 + ], + [ + 9.630148643422952, + 51.45820917188892 + ], + [ + 9.627620523466518, + 51.44420867315993 + ], + [ + 9.634297056838628, + 51.42608341028881 + ], + [ + 9.64358179036483, + 51.41826072694212 + ], + [ + 9.631145477938334, + 51.4116014199748 + ], + [ + 9.63058216025382, + 51.406106000418404 + ], + [ + 9.610017099546152, + 51.40782260205073 + ], + [ + 9.609854656997225, + 51.404766078153045 + ], + [ + 9.594077815128436, + 51.397987444426626 + ], + [ + 9.587512389611081, + 51.402669322368965 + ], + [ + 9.578518258088607, + 51.40141149518203 + ], + [ + 9.574044967665747, + 51.39210893007976 + ], + [ + 9.564434253527715, + 51.387345108266594 + ], + [ + 9.559336971748268, + 51.37923362288811 + ], + [ + 9.561036958681687, + 51.37483842205027 + ], + [ + 9.575042705444577, + 51.37252919302164 + ], + [ + 9.576746408462375, + 51.36929448421248 + ], + [ + 9.567573775345782, + 51.361574101851765 + ], + [ + 9.550133992220728, + 51.361884226876754 + ], + [ + 9.548441127447324, + 51.35895529980776 + ], + [ + 9.561323738286992, + 51.34527465474826 + ], + [ + 9.568024928945789, + 51.34000145829537 + ], + [ + 9.581656972874693, + 51.34219633507073 + ], + [ + 9.601837052201995, + 51.327677424403056 + ], + [ + 9.606001251657037, + 51.32770922003012 + ], + [ + 9.604434634813018, + 51.32555585065817 + ], + [ + 9.617242032755863, + 51.32792927418443 + ], + [ + 9.633365915362818, + 51.32585404863946 + ], + [ + 9.638543096532114, + 51.3223921246166 + ], + [ + 9.632933187582076, + 51.32442924019248 + ], + [ + 9.628524068111238, + 51.311902585254614 + ], + [ + 9.634455322359544, + 51.311603686575914 + ], + [ + 9.635770951069142, + 51.31707218342341 + ], + [ + 9.662229738071302, + 51.31171261653149 + ], + [ + 9.664290935199004, + 51.31655475568188 + ], + [ + 9.669385916481836, + 51.31771085690032 + ], + [ + 9.678910861748543, + 51.31095779326454 + ], + [ + 9.732304393210685, + 51.295231899245714 + ], + [ + 9.76820035995882, + 51.30672613942366 + ], + [ + 9.775201991304055, + 51.3251962301771 + ], + [ + 9.77034526684916, + 51.32538207019431 + ], + [ + 9.772365928259074, + 51.32928147386392 + ], + [ + 9.763510414226749, + 51.325339374935346 + ], + [ + 9.772456280287853, + 51.33629096544419 + ], + [ + 9.76310755223062, + 51.336160669951546 + ], + [ + 9.76830714137653, + 51.332549271216635 + ], + [ + 9.75650654536778, + 51.32865123185848 + ], + [ + 9.745434331822032, + 51.31898034571388 + ], + [ + 9.738247706697003, + 51.31942876784122 + ], + [ + 9.73684068786483, + 51.32895687476256 + ], + [ + 9.72736664576359, + 51.33638972172233 + ], + [ + 9.720611311330206, + 51.34852752918306 + ], + [ + 9.703983240566332, + 51.358145867850844 + ], + [ + 9.70214378743857, + 51.364571793313054 + ], + [ + 9.723200388933611, + 51.370498229427675 + ], + [ + 9.73845865188033, + 51.36921255172771 + ], + [ + 9.752283766019628, + 51.374690744682525 + ], + [ + 9.756603202117832, + 51.38228486300859 + ], + [ + 9.765789275934647, + 51.38598650818088 + ], + [ + 9.783985811186628, + 51.3892478196513 + ], + [ + 9.801450107502788, + 51.386914687101594 + ], + [ + 9.80012741526172, + 51.3991879813608 + ], + [ + 9.796490064829221, + 51.39814058904134 + ], + [ + 9.792584148124133, + 51.40240880302068 + ], + [ + 9.794136664730969, + 51.407159645367216 + ], + [ + 9.803510305923538, + 51.41040054337647 + ], + [ + 9.821486007301154, + 51.40995683006559 + ], + [ + 9.833808759889921, + 51.40246971530082 + ], + [ + 9.84063660084092, + 51.40264157129166 + ], + [ + 9.840106635530388, + 51.383593239280856 + ], + [ + 9.853212598738006, + 51.37223153331954 + ], + [ + 9.865275914663838, + 51.37161273101082 + ], + [ + 9.867991158435894, + 51.37486634654533 + ], + [ + 9.855920267472591, + 51.38480562618768 + ], + [ + 9.860749184304966, + 51.39428797852673 + ], + [ + 9.850538764030528, + 51.40137571705258 + ], + [ + 9.853849864791966, + 51.41039106678285 + ], + [ + 9.850743073957526, + 51.414413646067054 + ], + [ + 9.868535202646518, + 51.41379077599883 + ], + [ + 9.87831534108597, + 51.404476942675345 + ], + [ + 9.884625566891144, + 51.41020528718944 + ], + [ + 9.88315181094009, + 51.41496600486442 + ], + [ + 9.89927491843477, + 51.41652499386497 + ], + [ + 9.906021117251992, + 51.421138747898134 + ], + [ + 9.913393379343557, + 51.41063124479869 + ], + [ + 9.905706158818031, + 51.40988187409446 + ], + [ + 9.907043320667048, + 51.407711341356155 + ], + [ + 9.931109064927966, + 51.39273322765949 + ], + [ + 9.932581483025707, + 51.37955462708311 + ], + [ + 9.926596305459693, + 51.3763261997193 + ], + [ + 9.9282887124191, + 51.37236379719938 + ], + [ + 9.923293275181997, + 51.36804312137007 + ], + [ + 9.925469057843006, + 51.35379334313917 + ], + [ + 9.932820923317616, + 51.34603756110253 + ], + [ + 9.929936553547739, + 51.339968506701176 + ], + [ + 9.943447818022598, + 51.334509088256894 + ], + [ + 9.947566751394612, + 51.326395110947274 + ], + [ + 9.94903668088304, + 51.31755779556425 + ], + [ + 9.940601875917455, + 51.3062983717157 + ], + [ + 9.94712950109264, + 51.30300034997428 + ], + [ + 9.960183999945514, + 51.30480661153413 + ], + [ + 9.969853097861247, + 51.300271136929624 + ], + [ + 9.97063803723887, + 51.29440850498475 + ], + [ + 9.976383632465128, + 51.29140223992196 + ], + [ + 9.972977323647418, + 51.28435115519915 + ], + [ + 9.983447831561861, + 51.28333607943483 + ], + [ + 10.004331313783283, + 51.286983011458936 + ], + [ + 10.02998733268391, + 51.2778816468862 + ], + [ + 10.041409797836593, + 51.28039211227666 + ], + [ + 10.05991618687408, + 51.275865487642896 + ], + [ + 10.057451668902498, + 51.26765633445984 + ], + [ + 10.046554099817815, + 51.26450096949526 + ], + [ + 10.05011653671058, + 51.25871576503077 + ], + [ + 10.046969080880793, + 51.253425736004566 + ], + [ + 10.06187540453447, + 51.2525614563749 + ], + [ + 10.069058845065316, + 51.24376113826862 + ], + [ + 10.078995134182765, + 51.242780926542785 + ], + [ + 10.072781706076839, + 51.24041015652781 + ], + [ + 10.067634587847154, + 51.23061540624211 + ], + [ + 10.07238184235108, + 51.224780497386284 + ], + [ + 10.09028269042563, + 51.22666898656724 + ], + [ + 10.093513282025931, + 51.22145261520202 + ], + [ + 10.106339003515954, + 51.22160659227665 + ], + [ + 10.113171818442211, + 51.215206065408815 + ], + [ + 10.138446493645164, + 51.22021150935903 + ], + [ + 10.145397771084468, + 51.218079031678975 + ], + [ + 10.143800396256484, + 51.21287513040698 + ], + [ + 10.149790732154122, + 51.206189325198274 + ], + [ + 10.168444936466432, + 51.212189911536555 + ], + [ + 10.187748389048554, + 51.204230781787956 + ], + [ + 10.197029799046565, + 51.19654229818497 + ], + [ + 10.197013747483279, + 51.192057357070766 + ], + [ + 10.211253107639276, + 51.19043651967535 + ], + [ + 10.220191519286644, + 51.18574480641868 + ], + [ + 10.235776989143753, + 51.186695160670666 + ], + [ + 10.229845756101513, + 51.17491231885627 + ], + [ + 10.207323427352021, + 51.16491704696824 + ], + [ + 10.207756863003752, + 51.154766338154595 + ], + [ + 10.200378267675145, + 51.14993066054587 + ], + [ + 10.210689707654977, + 51.14247222376765 + ], + [ + 10.20378754567228, + 51.13565509741729 + ], + [ + 10.210717393583822, + 51.12290527072966 + ], + [ + 10.206190307831212, + 51.12211120727548 + ], + [ + 10.209346042369573, + 51.11816927482103 + ], + [ + 10.199959021874053, + 51.11297207578593 + ], + [ + 10.189454815030487, + 51.116767215645304 + ], + [ + 10.189621328506986, + 51.12197839311144 + ], + [ + 10.179214909029355, + 51.12764725794295 + ], + [ + 10.178483115751966, + 51.13076149015357 + ], + [ + 10.18523602245502, + 51.13249386774521 + ], + [ + 10.184904856929084, + 51.141120066956645 + ], + [ + 10.177453643078225, + 51.14167107291571 + ], + [ + 10.168738649190027, + 51.15326771975589 + ], + [ + 10.146597291179189, + 51.14455277598603 + ], + [ + 10.12572542009371, + 51.14633573154714 + ], + [ + 10.127827413170397, + 51.14376043150792 + ], + [ + 10.11832156426506, + 51.13957300545099 + ], + [ + 10.130822428007468, + 51.135191303488085 + ], + [ + 10.139985039486191, + 51.12470736482093 + ], + [ + 10.14623038199267, + 51.12578691016114 + ], + [ + 10.153791597019543, + 51.118458722123336 + ], + [ + 10.174630971694645, + 51.11686745863592 + ], + [ + 10.175487552380352, + 51.10690542011866 + ], + [ + 10.160415360313063, + 51.10805022347722 + ], + [ + 10.165679542972093, + 51.099499914257486 + ], + [ + 10.157114980350395, + 51.09631700021953 + ], + [ + 10.144694665238312, + 51.084814047640414 + ], + [ + 10.15518829159921, + 51.070419264642176 + ], + [ + 10.144259386138472, + 51.066002257216695 + ], + [ + 10.147021789836966, + 51.06140396129707 + ], + [ + 10.14059015693553, + 51.05849138743716 + ], + [ + 10.171072591852383, + 51.049182796663814 + ], + [ + 10.184671379065689, + 51.049032360358304 + ], + [ + 10.184765452053984, + 51.04569456855378 + ], + [ + 10.204746922270228, + 51.03478948052813 + ], + [ + 10.202925521841012, + 51.03160727183043 + ], + [ + 10.215185734886266, + 51.026419350031354 + ], + [ + 10.20855550766371, + 51.018971076158586 + ], + [ + 10.195368850264968, + 51.020938957368486 + ], + [ + 10.193816248468071, + 51.0159928022068 + ], + [ + 10.201211727738055, + 51.013898036065726 + ], + [ + 10.202904887204381, + 51.00810587902413 + ], + [ + 10.19695317813987, + 51.00663296582166 + ], + [ + 10.190785759330884, + 50.9990678845089 + ], + [ + 10.178159480163982, + 50.996001541982295 + ], + [ + 10.175234161599343, + 50.99857374548999 + ], + [ + 10.170321788090805, + 50.99640732154971 + ], + [ + 10.173277073338799, + 51.000053763201244 + ], + [ + 10.16810688818315, + 51.00132467023677 + ], + [ + 10.166242564121786, + 50.997614557433586 + ], + [ + 10.149744580087377, + 50.9939761292856 + ], + [ + 10.134854687348517, + 50.99564621251884 + ], + [ + 10.12730673086119, + 51.00074059814121 + ], + [ + 10.13308240884271, + 51.00481911262245 + ], + [ + 10.120842833884051, + 51.011700739907184 + ], + [ + 10.108295653875237, + 51.00922459326736 + ], + [ + 10.103483887932635, + 51.00336718323285 + ], + [ + 10.073507813164928, + 51.01136619454358 + ], + [ + 10.065666270194376, + 51.00941522534947 + ], + [ + 10.05363693771815, + 51.01315428354242 + ], + [ + 10.036400427746626, + 51.012376194822714 + ], + [ + 10.027674671769518, + 51.006456748971175 + ], + [ + 10.019470217432884, + 50.98070807804827 + ], + [ + 10.040949143691435, + 50.96752640395313 + ], + [ + 10.03216132676979, + 50.95963537019097 + ], + [ + 10.042036761922812, + 50.957234267740965 + ], + [ + 10.043035337366033, + 50.94862293978813 + ], + [ + 10.047868770416072, + 50.94611886568988 + ], + [ + 10.061191723340238, + 50.94797274515543 + ], + [ + 10.062345938730187, + 50.94378354537778 + ], + [ + 10.053615661383242, + 50.939778882688564 + ], + [ + 10.029439221206118, + 50.93811304461834 + ], + [ + 10.024900853743576, + 50.9437513618399 + ], + [ + 10.014007699079478, + 50.9346790221905 + ], + [ + 10.00337958458248, + 50.94063232511605 + ], + [ + 9.999285361909761, + 50.93664388000772 + ], + [ + 9.991072680513224, + 50.94345415818876 + ], + [ + 9.99156088917052, + 50.940896560694 + ], + [ + 9.982086111901332, + 50.939055016605 + ], + [ + 9.975073801617986, + 50.94342302249407 + ], + [ + 9.950086587172375, + 50.94225025484665 + ], + [ + 9.956555894977926, + 50.93366159030729 + ], + [ + 9.949685257597803, + 50.92650750436961 + ], + [ + 9.957144014946902, + 50.922600190435084 + ], + [ + 9.966067717145975, + 50.92875499316406 + ], + [ + 9.965560176828529, + 50.93358061377089 + ], + [ + 9.974855569815931, + 50.931721111704235 + ], + [ + 9.991996475037794, + 50.93451450955825 + ], + [ + 9.98189245092292, + 50.919947688889536 + ], + [ + 9.969632276619526, + 50.91348753971554 + ], + [ + 9.971463748708201, + 50.90741093660835 + ], + [ + 9.978219755751038, + 50.9052988623773 + ], + [ + 9.98524679339433, + 50.907215652482215 + ], + [ + 9.986912385703446, + 50.91136814342661 + ], + [ + 10.00366394279361, + 50.92155099423676 + ], + [ + 10.015635922065208, + 50.92062394940913 + ], + [ + 10.024850711270851, + 50.91179925543602 + ], + [ + 10.03503025900147, + 50.91002287024081 + ], + [ + 10.040697143630334, + 50.90153437627829 + ], + [ + 10.050909098573305, + 50.90008887925372 + ], + [ + 10.041952475293046, + 50.8933404145218 + ], + [ + 10.047868140623665, + 50.88884988390904 + ], + [ + 10.053456860490783, + 50.890071327201845 + ], + [ + 10.052460866990227, + 50.89260881168969 + ], + [ + 10.058444784098688, + 50.89017533311661 + ], + [ + 10.056237512526428, + 50.887396618084395 + ], + [ + 10.059803703591085, + 50.88539256307137 + ], + [ + 10.055981001309238, + 50.87977162384438 + ], + [ + 10.021893142541915, + 50.86448629775823 + ], + [ + 10.018689019617698, + 50.85567082890117 + ], + [ + 10.021928583470489, + 50.84785663224941 + ], + [ + 10.038620256504196, + 50.85311491054608 + ], + [ + 10.037751702648855, + 50.84529540236945 + ], + [ + 10.026806725491298, + 50.8412833324191 + ], + [ + 10.028488149416855, + 50.83580828097497 + ], + [ + 10.023054523787888, + 50.831631424602264 + ], + [ + 10.006836286542148, + 50.83768212741087 + ], + [ + 9.998018976409707, + 50.826505139431916 + ], + [ + 9.97681640860686, + 50.8332729518737 + ], + [ + 9.952252802569106, + 50.82137450717773 + ], + [ + 9.95023387611449, + 50.81518083227483 + ], + [ + 9.956417425198762, + 50.816051324959425 + ], + [ + 9.956677090278758, + 50.809619121479905 + ], + [ + 9.943569871321133, + 50.79769790651567 + ], + [ + 9.955134945818857, + 50.785550295614755 + ], + [ + 9.949779875686469, + 50.78037975150335 + ], + [ + 9.954092086205785, + 50.77935638407857 + ], + [ + 9.952133926350797, + 50.77329162341066 + ], + [ + 9.943318113649369, + 50.771234124200376 + ], + [ + 9.948749609940148, + 50.77869226810362 + ], + [ + 9.93715367743379, + 50.77410166512487 + ], + [ + 9.92843093764796, + 50.77659421164554 + ], + [ + 9.925526016743598, + 50.774665789268596 + ], + [ + 9.928921270523418, + 50.76963447972193 + ], + [ + 9.920126451564789, + 50.759612032892974 + ], + [ + 9.93961427645136, + 50.75591997628375 + ], + [ + 9.941371631305934, + 50.74183785498917 + ], + [ + 9.935162409945027, + 50.72411799705515 + ], + [ + 9.908890736424809, + 50.704532449326905 + ], + [ + 9.910651795113989, + 50.700691396284 + ], + [ + 9.923955435412095, + 50.69513052004815 + ], + [ + 9.915539995475052, + 50.69369563334715 + ], + [ + 9.906224715375433, + 50.684190941878654 + ], + [ + 9.894677747340031, + 50.683719936172864 + ], + [ + 9.88127320043715, + 50.6733786243984 + ], + [ + 9.884220259263289, + 50.65081340991483 + ], + [ + 9.877320475140962, + 50.63871517473355 + ], + [ + 9.878551050215696, + 50.63478120860465 + ], + [ + 9.886108750315556, + 50.63393596523766 + ], + [ + 9.906105814511017, + 50.6403823423682 + ], + [ + 9.929695559752593, + 50.62901690317894 + ], + [ + 9.94592754577355, + 50.626825684983274 + ], + [ + 9.960722012958694, + 50.62948365212826 + ], + [ + 9.960252303999365, + 50.63550575292771 + ], + [ + 9.96890154574764, + 50.641259441234 + ], + [ + 9.949710896379335, + 50.65587253534848 + ], + [ + 9.94910784920012, + 50.66414254339036 + ], + [ + 9.960689873475145, + 50.66844394386581 + ], + [ + 9.973602968520705, + 50.665946876867196 + ], + [ + 9.989540860816934, + 50.67459455121305 + ], + [ + 10.001994967970054, + 50.676602566290235 + ], + [ + 10.021409955240415, + 50.67304312731762 + ], + [ + 10.031350166184001, + 50.675547803569486 + ], + [ + 10.048934055051632, + 50.673932543715644 + ], + [ + 10.069985062213522, + 50.65587778938285 + ], + [ + 10.07858441006985, + 50.63468821050279 + ], + [ + 10.082964841544237, + 50.63370534522166 + ], + [ + 10.081049838184464, + 50.62002482223614 + ], + [ + 10.072264747765665, + 50.61963236869612 + ], + [ + 10.067222262177543, + 50.62414586215302 + ], + [ + 10.0575038889246, + 50.62612006185502 + ], + [ + 10.045470429119806, + 50.621216817122736 + ], + [ + 10.04796286747078, + 50.61917736361257 + ], + [ + 10.03719106873589, + 50.61292626777508 + ], + [ + 10.040271740312768, + 50.60450765357036 + ], + [ + 10.0487975885647, + 50.598620734538834 + ], + [ + 10.046359122548887, + 50.57125494330287 + ], + [ + 10.052467144555282, + 50.56110859514858 + ], + [ + 10.061828604818569, + 50.556687382855266 + ], + [ + 10.047219088584933, + 50.54551876373349 + ], + [ + 10.047898988999908, + 50.539447943398145 + ], + [ + 10.039692617864015, + 50.532586194306916 + ], + [ + 10.042149891400847, + 50.509372763338526 + ], + [ + 10.03710615753085, + 50.50002195270774 + ], + [ + 10.041188106994237, + 50.49518848322667 + ], + [ + 10.03203655254727, + 50.48639687798607 + ], + [ + 10.033485227786777, + 50.48112107093812 + ], + [ + 10.02202185727108, + 50.475468489313776 + ], + [ + 10.018307426072683, + 50.466455261926384 + ], + [ + 9.99745990997423, + 50.460985536001594 + ], + [ + 9.989984857177136, + 50.44712310052592 + ], + [ + 9.966811329270662, + 50.43453083890927 + ], + [ + 9.957836756942434, + 50.42320405411332 + ], + [ + 9.943399397847568, + 50.42328810201021 + ], + [ + 9.91902204345548, + 50.41055268398667 + ], + [ + 9.883100781724734, + 50.3988934416298 + ], + [ + 9.871571886098947, + 50.40940352475144 + ], + [ + 9.860046301208985, + 50.39747395481095 + ], + [ + 9.849782572797261, + 50.39872793343425 + ], + [ + 9.838411852777684, + 50.40547450649439 + ], + [ + 9.824486555699034, + 50.40527721191925 + ], + [ + 9.81352322582924, + 50.412958935644966 + ], + [ + 9.80798841051105, + 50.412430895953705 + ], + [ + 9.811265389667152, + 50.41712948292364 + ], + [ + 9.807467654732838, + 50.42255044531167 + ], + [ + 9.789424928718692, + 50.42514484848673 + ], + [ + 9.780181271265155, + 50.41843091956212 + ], + [ + 9.771870957156032, + 50.42485970166337 + ], + [ + 9.762063989545554, + 50.425867480190604 + ], + [ + 9.751062366387204, + 50.41355912705609 + ], + [ + 9.759292302640437, + 50.40244589024047 + ], + [ + 9.744441173083887, + 50.37170212873269 + ], + [ + 9.746203925924698, + 50.36617993969245 + ], + [ + 9.732914416644578, + 50.3561496156712 + ], + [ + 9.733235175483376, + 50.351418437989444 + ], + [ + 9.739900752844008, + 50.349699115876874 + ], + [ + 9.747435794889583, + 50.341200297436366 + ], + [ + 9.745881110904376, + 50.31040795469691 + ], + [ + 9.73003169857274, + 50.29624845013133 + ], + [ + 9.713152763728129, + 50.291733976733305 + ], + [ + 9.703422444679282, + 50.28075231126471 + ], + [ + 9.682300233957685, + 50.27848920288494 + ], + [ + 9.664990318141525, + 50.27117511996652 + ], + [ + 9.652396014946826, + 50.26967006842201 + ], + [ + 9.643451000870073, + 50.255116790550325 + ], + [ + 9.63682363791055, + 50.251449889054754 + ], + [ + 9.639013126950237, + 50.24836202877724 + ], + [ + 9.668175938661083, + 50.239435343687184 + ], + [ + 9.663619149581447, + 50.23373346179769 + ], + [ + 9.653726570930264, + 50.232320154352024 + ], + [ + 9.635815885589622, + 50.235227852559596 + ], + [ + 9.620401705340802, + 50.22752526730721 + ], + [ + 9.62159190246356, + 50.22311636239264 + ], + [ + 9.613763107912046, + 50.224756718915145 + ], + [ + 9.6044060715321, + 50.221903582453756 + ], + [ + 9.594279674467488, + 50.2248186543287 + ], + [ + 9.58289899297565, + 50.221528424465184 + ], + [ + 9.57631873448432, + 50.23238894275649 + ], + [ + 9.542029989036147, + 50.22434153435626 + ], + [ + 9.533490750115552, + 50.23449175882821 + ], + [ + 9.514378236028788, + 50.23407706740844 + ], + [ + 9.501174644497613, + 50.24347390876909 + ], + [ + 9.494769673489156, + 50.22667220800381 + ], + [ + 9.50259136182245, + 50.220279825980185 + ], + [ + 9.50362637259949, + 50.20858387432278 + ], + [ + 9.516205472937582, + 50.19961172187504 + ], + [ + 9.512696753757409, + 50.19377771459849 + ], + [ + 9.508122710877567, + 50.195330870008576 + ], + [ + 9.50092554403226, + 50.19298277740118 + ], + [ + 9.498372929450046, + 50.17522507444526 + ], + [ + 9.505055594528983, + 50.16927257927482 + ], + [ + 9.52815238524031, + 50.168139275288866 + ], + [ + 9.531201793407531, + 50.160849668618425 + ], + [ + 9.521804351408658, + 50.14997201186882 + ], + [ + 9.507571330262087, + 50.145557350340866 + ], + [ + 9.519259435031385, + 50.11403889649142 + ], + [ + 9.512464154527564, + 50.09435565601434 + ], + [ + 9.499968262569686, + 50.09725235547201 + ], + [ + 9.45974612950228, + 50.08990181877404 + ], + [ + 9.444989242339485, + 50.08997349720013 + ], + [ + 9.435939529901708, + 50.08503058801312 + ], + [ + 9.413110845238869, + 50.08405988024717 + ], + [ + 9.394463456212053, + 50.09748632408172 + ], + [ + 9.375639432370937, + 50.12966060728185 + ], + [ + 9.341584333586264, + 50.13128240789918 + ], + [ + 9.327428418411674, + 50.14105954023808 + ], + [ + 9.307611935832597, + 50.133407868303436 + ], + [ + 9.28589675229451, + 50.14166503276558 + ], + [ + 9.252559876611269, + 50.139479671636934 + ], + [ + 9.221866090645067, + 50.1494173137484 + ], + [ + 9.211495622000552, + 50.14660139581419 + ], + [ + 9.210222174262459, + 50.14297857705269 + ], + [ + 9.18311095228089, + 50.138375004621665 + ], + [ + 9.191593717780137, + 50.12748724097251 + ], + [ + 9.174558728448217, + 50.11948018728545 + ], + [ + 9.174246377963707, + 50.11414932353349 + ], + [ + 9.158746843710182, + 50.100128483938946 + ], + [ + 9.162545660166174, + 50.09818648021768 + ], + [ + 9.149210889997017, + 50.09063949227142 + ], + [ + 9.143366554981183, + 50.096983032864735 + ], + [ + 9.154371117200792, + 50.10739303498867 + ], + [ + 9.153609320611878, + 50.117930613476936 + ], + [ + 9.14495773018941, + 50.114111915314275 + ], + [ + 9.117457035550851, + 50.126624041913004 + ], + [ + 9.098229912170275, + 50.12641698406259 + ], + [ + 9.089306136213994, + 50.11680439451563 + ], + [ + 9.077268707515335, + 50.11592633089854 + ], + [ + 9.071326685712881, + 50.11943787358174 + ], + [ + 9.018261040104294, + 50.11160420786991 + ], + [ + 8.997391285332869, + 50.09157987837139 + ], + [ + 8.999282563906288, + 50.06936687535561 + ], + [ + 8.99055990143657, + 50.06711915675566 + ], + [ + 8.976611544813418, + 50.05221142971567 + ], + [ + 8.976480289134058, + 50.04717018590013 + ], + [ + 8.985374829884503, + 50.04172710943085 + ], + [ + 9.012308439278184, + 50.04595085010932 + ], + [ + 9.031343852953738, + 50.03957408274835 + ], + [ + 9.031024824698557, + 50.020132294854456 + ], + [ + 9.03981747109247, + 50.01037337552357 + ], + [ + 9.035538161749253, + 50.00183680162922 + ], + [ + 9.048820260170004, + 49.99226560170528 + ], + [ + 9.046073980065877, + 49.99000779167965 + ], + [ + 9.030190178458756, + 49.99060416905039 + ], + [ + 9.022987074030114, + 49.99705398108269 + ], + [ + 9.015714270561551, + 49.989022859038634 + ], + [ + 9.020113698954493, + 49.985894292207334 + ], + [ + 9.018574857058475, + 49.978417147666406 + ], + [ + 9.026372075774066, + 49.9550914657943 + ], + [ + 9.019035578921807, + 49.947050391290944 + ], + [ + 9.025353870433579, + 49.94564799579009 + ], + [ + 9.032264261051115, + 49.924688670633984 + ], + [ + 9.02335988083621, + 49.910136791115505 + ], + [ + 9.031878342317894, + 49.909361261847096 + ], + [ + 9.038428785179692, + 49.87621767217244 + ], + [ + 9.050452507068684, + 49.867571762554135 + ], + [ + 9.033336125006556, + 49.86646665192463 + ], + [ + 9.033787154296288, + 49.860444052402116 + ], + [ + 9.043704577108914, + 49.855543058680944 + ], + [ + 9.04077044012904, + 49.84747711978657 + ], + [ + 9.036080744277898, + 49.846504120615315 + ], + [ + 9.037651961738208, + 49.842564294061205 + ], + [ + 9.041443247591467, + 49.840084403938974 + ], + [ + 9.043227719209796, + 49.8440576514465 + ], + [ + 9.04919173704132, + 49.84241519442147 + ], + [ + 9.059515726041223, + 49.84702774082271 + ], + [ + 9.052839148452666, + 49.84000307482093 + ], + [ + 9.059797319707398, + 49.84071998880839 + ], + [ + 9.056227557503826, + 49.83461779502919 + ], + [ + 9.063956866075772, + 49.83175947608217 + ], + [ + 9.070213873421856, + 49.83325111834945 + ], + [ + 9.084730870580634, + 49.84750638231557 + ], + [ + 9.09008758074451, + 49.84096807369945 + ], + [ + 9.077532510824069, + 49.83461172702808 + ], + [ + 9.082824158175246, + 49.8329525997149 + ], + [ + 9.086665308840612, + 49.826438099156874 + ], + [ + 9.07699281833439, + 49.81822327976254 + ], + [ + 9.085933683651433, + 49.80710690721437 + ], + [ + 9.0908796210555, + 49.790655009985294 + ], + [ + 9.108140121970479, + 49.79798043492194 + ], + [ + 9.131665504759146, + 49.79492793456378 + ], + [ + 9.12908004161615, + 49.787689161452114 + ], + [ + 9.134409139782099, + 49.78263338528537 + ], + [ + 9.127235118503386, + 49.77648207536716 + ], + [ + 9.11336462495498, + 49.773731014970835 + ], + [ + 9.106913989448115, + 49.7586609732101 + ], + [ + 9.127833815401853, + 49.755226588286625 + ], + [ + 9.150809170042198, + 49.74285074183995 + ], + [ + 9.144458397899779, + 49.73779710298848 + ], + [ + 9.134528238275976, + 49.71667980850985 + ], + [ + 9.12254339449413, + 49.71484186848994 + ], + [ + 9.12610915585798, + 49.69997958237794 + ], + [ + 9.089638350706648, + 49.69334572162827 + ], + [ + 9.088859949366558, + 49.6690232226297 + ], + [ + 9.10341891685787, + 49.66043059933481 + ], + [ + 9.099543782045693, + 49.65313936474275 + ], + [ + 9.10201204767688, + 49.64221034381436 + ], + [ + 9.091551107974594, + 49.63515225514139 + ], + [ + 9.084324110454286, + 49.63499011985086 + ], + [ + 9.065283440419336, + 49.61625951713929 + ], + [ + 9.06638137292365, + 49.602365127576554 + ], + [ + 9.082989877534349, + 49.60198701015371 + ], + [ + 9.102644095569236, + 49.57930987880056 + ], + [ + 9.098930718587189, + 49.56055390602041 + ], + [ + 9.082631683242427, + 49.56178920364897 + ], + [ + 9.078042594668831, + 49.57480364099718 + ], + [ + 9.073074261716352, + 49.57494102115746 + ], + [ + 9.072205635986668, + 49.56524922826339 + ], + [ + 9.088063103617339, + 49.55024109094568 + ], + [ + 9.085387937003231, + 49.543432343769055 + ], + [ + 9.113767890363299, + 49.5346335067428 + ], + [ + 9.126459732088064, + 49.52160708659702 + ], + [ + 9.123637692319644, + 49.519773216064934 + ], + [ + 9.12641383154586, + 49.51694579566356 + ], + [ + 9.119530000285394, + 49.51221011561123 + ], + [ + 9.106127381387862, + 49.50979606493179 + ], + [ + 9.099554223765313, + 49.526189352086455 + ], + [ + 9.07885755901251, + 49.524941082884 + ], + [ + 9.06495077885142, + 49.52960601001299 + ], + [ + 9.050509463045556, + 49.51896622860452 + ], + [ + 9.05006324384009, + 49.51316596631787 + ], + [ + 9.042078670812108, + 49.50626987104661 + ], + [ + 9.042823599370386, + 49.49904533646159 + ], + [ + 9.013978091818561, + 49.49815640820787 + ], + [ + 9.012180163170122, + 49.50266760031556 + ], + [ + 8.992255705345986, + 49.50338505750013 + ], + [ + 8.985833819284325, + 49.51033032663123 + ], + [ + 8.979174779888309, + 49.509180363884894 + ], + [ + 8.977471625942606, + 49.50341517994311 + ], + [ + 8.96800290824844, + 49.50159982353594 + ], + [ + 8.951832484391737, + 49.505626233673865 + ], + [ + 8.95772743500557, + 49.49548529696167 + ], + [ + 8.950599560520917, + 49.48779344870401 + ], + [ + 8.954639722267906, + 49.48200922875902 + ], + [ + 8.942795189413959, + 49.4856884940204 + ], + [ + 8.931879784490947, + 49.470636807487026 + ], + [ + 8.950348719801449, + 49.45499288266684 + ], + [ + 8.940888385727046, + 49.45049855598192 + ], + [ + 8.927774526273804, + 49.44931771985754 + ], + [ + 8.92473949227129, + 49.44130328931638 + ], + [ + 8.912567029639735, + 49.437614403171025 + ], + [ + 8.900948949062627, + 49.44336867034699 + ], + [ + 8.892389343535864, + 49.420907378524106 + ], + [ + 8.872745614239015, + 49.412446381150446 + ], + [ + 8.854184152180402, + 49.396349511259054 + ], + [ + 8.845026919548822, + 49.396845190016585 + ], + [ + 8.838182484964161, + 49.405391417915766 + ], + [ + 8.830413501364578, + 49.40833585636664 + ], + [ + 8.821770545862892, + 49.39484546757295 + ], + [ + 8.803540602831967, + 49.403570376708046 + ], + [ + 8.808293518617257, + 49.406422236826515 + ], + [ + 8.801386330262119, + 49.41067336062458 + ], + [ + 8.808323114257457, + 49.411839493459794 + ], + [ + 8.806587634473399, + 49.41920082452017 + ], + [ + 8.81664097045417, + 49.42317561655159 + ], + [ + 8.830501935567668, + 49.42322883400947 + ], + [ + 8.836452906475257, + 49.430218301798284 + ], + [ + 8.83261774289946, + 49.436716500636074 + ], + [ + 8.834607504653329, + 49.45038268032718 + ], + [ + 8.828733135028957, + 49.46092254421862 + ], + [ + 8.823524968197841, + 49.46267839710908 + ], + [ + 8.82660284251139, + 49.46934922012012 + ], + [ + 8.851932271779093, + 49.483588213516825 + ], + [ + 8.866340213295494, + 49.47459268439969 + ], + [ + 8.862923785250944, + 49.466678850224156 + ], + [ + 8.876495012626476, + 49.466686032749 + ], + [ + 8.899354817584529, + 49.484549799914646 + ], + [ + 8.899572708060383, + 49.50365573019601 + ], + [ + 8.882661470488392, + 49.506096148588675 + ], + [ + 8.856782345384271, + 49.50123233488314 + ], + [ + 8.848501613228935, + 49.50217327571615 + ], + [ + 8.844550101608155, + 49.49840152990439 + ], + [ + 8.839448611311312, + 49.498783704906465 + ], + [ + 8.836734185260507, + 49.49290330122769 + ], + [ + 8.831166191014152, + 49.492261999774065 + ], + [ + 8.816962864962058, + 49.505793060971364 + ], + [ + 8.821874005250354, + 49.52463646991499 + ], + [ + 8.80920613456356, + 49.52568010390132 + ], + [ + 8.798128711377453, + 49.51850999898175 + ], + [ + 8.798590607818518, + 49.5116887501799 + ], + [ + 8.776780529010205, + 49.5178719589077 + ], + [ + 8.76420362423733, + 49.51519803236217 + ], + [ + 8.74870874845698, + 49.522427547753196 + ], + [ + 8.740428517306505, + 49.52318969220289 + ], + [ + 8.737227042079278, + 49.519288374046994 + ], + [ + 8.727711249966774, + 49.51833854898071 + ], + [ + 8.724894759646293, + 49.522637102416674 + ], + [ + 8.7355131493785, + 49.52131546274544 + ], + [ + 8.735949885110045, + 49.524845988505696 + ], + [ + 8.724609342609254, + 49.525894434851104 + ], + [ + 8.718692563628876, + 49.53300840228839 + ], + [ + 8.712339598121421, + 49.53171120943032 + ], + [ + 8.707008771493603, + 49.53635102973935 + ], + [ + 8.702650221598939, + 49.53532789846665 + ], + [ + 8.705794410693196, + 49.54796552899523 + ], + [ + 8.698615480328485, + 49.54900407850172 + ], + [ + 8.690770781846195, + 49.55564319374292 + ], + [ + 8.693103991542326, + 49.56072811907392 + ], + [ + 8.684306835073835, + 49.570222471035414 + ], + [ + 8.68466982663634, + 49.575562093136476 + ], + [ + 8.680989340580192, + 49.57554792726386 + ], + [ + 8.683476957951031, + 49.589752092071265 + ], + [ + 8.696334373224976, + 49.592099751668094 + ], + [ + 8.697997510893005, + 49.59975733395298 + ], + [ + 8.691027875155825, + 49.607214190955354 + ], + [ + 8.682127798151921, + 49.603471928719124 + ], + [ + 8.672139781412257, + 49.611194103242724 + ], + [ + 8.677340981249085, + 49.61352777038456 + ], + [ + 8.67779071160163, + 49.60899951640945 + ], + [ + 8.686368561107269, + 49.6084804339261 + ], + [ + 8.686894232778023, + 49.613207177071544 + ], + [ + 8.684375838038594, + 49.61005245995222 + ], + [ + 8.678879168370356, + 49.613867505389386 + ], + [ + 8.683176143044129, + 49.616321323657495 + ], + [ + 8.688392836419554, + 49.61462317146209 + ], + [ + 8.69383695018465, + 49.61935368029901 + ], + [ + 8.692313575495598, + 49.623738857680536 + ], + [ + 8.686617351047483, + 49.62272082330122 + ], + [ + 8.677933667715678, + 49.62594697472169 + ], + [ + 8.653979511190416, + 49.61839033040702 + ], + [ + 8.65042350247613, + 49.62088414782333 + ], + [ + 8.593888978822092, + 49.61094664634904 + ], + [ + 8.595297405560006, + 49.60547431762935 + ], + [ + 8.589315309888745, + 49.60451524790381 + ], + [ + 8.590976799450155, + 49.59594293082642 + ], + [ + 8.594074036232861, + 49.59277130167126 + ], + [ + 8.603231734816736, + 49.59329423652688 + ], + [ + 8.608074076951127, + 49.5702925562777 + ], + [ + 8.621299695655438, + 49.54500989002873 + ], + [ + 8.61089917464312, + 49.538717127821315 + ], + [ + 8.607252976508802, + 49.52846921740933 + ], + [ + 8.597912601862411, + 49.531461953219306 + ], + [ + 8.591295095807684, + 49.52128039393201 + ], + [ + 8.573055375622273, + 49.52149343511518 + ], + [ + 8.560001946957202, + 49.51746242896481 + ], + [ + 8.536775387821308, + 49.532413615594066 + ], + [ + 8.526260278538219, + 49.54799710038107 + ], + [ + 8.495032435020207, + 49.57299667087067 + ], + [ + 8.47990012780106, + 49.57446416575753 + ], + [ + 8.479947343269505, + 49.57858679997134 + ], + [ + 8.474351715280255, + 49.580970557660976 + ], + [ + 8.475795984508384, + 49.5844522617543 + ], + [ + 8.464284652804986, + 49.58952836697012 + ], + [ + 8.448628289214225, + 49.590478377482064 + ], + [ + 8.440464790317138, + 49.589412016406854 + ], + [ + 8.43826610475561, + 49.58390012370693 + ], + [ + 8.42243926254325, + 49.58338541322957 + ], + [ + 8.409047726387538, + 49.60504413662421 + ], + [ + 8.386010772020645, + 49.622102864900015 + ], + [ + 8.369630860386563, + 49.659173048131656 + ], + [ + 8.356488092374597, + 49.67798747723223 + ], + [ + 8.357879059779993, + 49.69334121872588 + ], + [ + 8.38152243888473, + 49.70704300315285 + ], + [ + 8.435958648273074, + 49.720989390372466 + ], + [ + 8.455137211008815, + 49.741838950756105 + ], + [ + 8.478632657918732, + 49.75822837134055 + ], + [ + 8.47957320902805, + 49.762949804247235 + ], + [ + 8.469554065577501, + 49.76917902269364 + ], + [ + 8.429195651840248, + 49.7664454431968 + ], + [ + 8.416297385787301, + 49.77386768574413 + ], + [ + 8.406076882540681, + 49.796569028247255 + ], + [ + 8.378448621262985, + 49.82482008405813 + ], + [ + 8.383583802214691, + 49.85567786038938 + ], + [ + 8.374561373366225, + 49.861620953116685 + ], + [ + 8.35752445650562, + 49.864901495247544 + ], + [ + 8.34401005667369, + 49.88010931854136 + ], + [ + 8.343555977365444, + 49.892872774939626 + ], + [ + 8.354723211580524, + 49.913213171382374 + ], + [ + 8.340963697740076, + 49.95107573683261 + ], + [ + 8.322339373163038, + 49.97359170315227 + ], + [ + 8.290214663589706, + 49.993521414138144 + ], + [ + 8.269515094483001, + 50.01228612051742 + ], + [ + 8.236403687216502, + 50.03013132413778 + ], + [ + 8.18094914141563, + 50.03520598012755 + ], + [ + 8.129761584931918, + 50.024410234720314 + ], + [ + 8.079569940560743, + 50.006898714816266 + ], + [ + 8.036356998092593, + 50.00231165894969 + ], + [ + 7.96740157933075, + 49.97777290734132 + ], + [ + 7.886587426396038, + 49.97190413385907 + ], + [ + 7.870644335860255, + 49.97563270448011 + ], + [ + 7.865575036167787, + 49.98105544193587 + ], + [ + 7.85837430677515, + 50.0060428346363 + ], + [ + 7.852863785520018, + 50.012163088958154 + ], + [ + 7.831246794229171, + 50.020914438234875 + ], + [ + 7.805884392592949, + 50.039341965267546 + ], + [ + 7.779659193851368, + 50.05110661294721 + ], + [ + 7.772651309835323, + 50.06160787708373 + ], + [ + 7.773997184582242, + 50.06654010394074 + ], + [ + 7.787575824261163, + 50.069276366658464 + ], + [ + 7.803461099254937, + 50.08457999934449 + ], + [ + 7.814636916533394, + 50.08342077421479 + ], + [ + 7.816751339725632, + 50.08067947133779 + ], + [ + 7.822089291095029, + 50.08400988197076 + ], + [ + 7.827180286500957, + 50.081572226363605 + ], + [ + 7.837194078536105, + 50.08412892219163 + ], + [ + 7.839230249779607, + 50.087480512267604 + ], + [ + 7.833335059949295, + 50.09226776449214 + ], + [ + 7.836754041299974, + 50.09442724160099 + ], + [ + 7.830064704816435, + 50.093181729246425 + ], + [ + 7.830071078782648, + 50.098025580347034 + ], + [ + 7.83725449346521, + 50.099705739802225 + ], + [ + 7.835231385344913, + 50.11002120563758 + ], + [ + 7.843090832382552, + 50.1116609737194 + ], + [ + 7.84491808361976, + 50.123499256991416 + ], + [ + 7.854016101658575, + 50.12832878612157 + ], + [ + 7.859937359836659, + 50.12762838250318 + ], + [ + 7.8653876464307, + 50.12080375588871 + ], + [ + 7.884716909139839, + 50.11437834930984 + ], + [ + 7.897441790818528, + 50.121529006608235 + ], + [ + 7.903223634914453, + 50.121552456039595 + ], + [ + 7.920085632964827, + 50.108421041027036 + ], + [ + 7.92036364189393, + 50.103680035337426 + ], + [ + 7.930097217747246, + 50.10374011026906 + ], + [ + 7.925326038604813, + 50.10884531236605 + ], + [ + 7.927761768507978, + 50.11913629964696 + ], + [ + 7.922487547292992, + 50.13445730354318 + ], + [ + 7.932942307987951, + 50.14388431500954 + ], + [ + 7.892376956219958, + 50.16180082662783 + ], + [ + 7.884014220552801, + 50.16956859103096 + ], + [ + 7.888663180249435, + 50.173708120708326 + ], + [ + 7.882830210754744, + 50.18131748693557 + ], + [ + 7.910215463692975, + 50.19349452167134 + ], + [ + 7.912503256159891, + 50.196433269271054 + ], + [ + 7.907826667228296, + 50.200756476152506 + ], + [ + 7.911141963298908, + 50.20373042563799 + ], + [ + 7.92079956828427, + 50.20796364382711 + ], + [ + 7.947395101375438, + 50.21007196906264 + ], + [ + 7.9515597525922, + 50.21426097722669 + ], + [ + 7.948094843390666, + 50.21762290353536 + ], + [ + 7.953052225713586, + 50.220398058210854 + ], + [ + 7.97133624472764, + 50.22247760877163 + ], + [ + 7.986556797985776, + 50.228088100013345 + ], + [ + 7.990203926695645, + 50.23866512670506 + ], + [ + 7.997072762835083, + 50.236195586930585 + ], + [ + 7.993521187841953, + 50.2317156765923 + ], + [ + 8.00636808978212, + 50.228701030994245 + ], + [ + 8.002709509698185, + 50.224381133514676 + ], + [ + 8.01152952801061, + 50.22237642664014 + ], + [ + 8.01177271649842, + 50.21803348350693 + ], + [ + 8.035050723525645, + 50.21559294136341 + ], + [ + 8.03692630085204, + 50.218901168317494 + ], + [ + 8.032869172010912, + 50.220821410254615 + ], + [ + 8.04073056080786, + 50.225590676355026 + ], + [ + 8.03971834687679, + 50.22858475863144 + ], + [ + 8.046672259015288, + 50.22763557009848 + ], + [ + 8.05890958579505, + 50.23440564230037 + ], + [ + 8.048395076375614, + 50.24065390765126 + ], + [ + 8.0494373065854, + 50.24436718324554 + ], + [ + 8.044089299100834, + 50.242470236076294 + ], + [ + 8.036137869656454, + 50.24508915467839 + ], + [ + 8.037874879325376, + 50.24910675268587 + ], + [ + 8.031521171428185, + 50.255956035734606 + ], + [ + 8.02494386099316, + 50.254193775014414 + ], + [ + 8.021650501541199, + 50.25834481310948 + ], + [ + 8.035774572585177, + 50.264572885197985 + ], + [ + 8.035891844839828, + 50.27119223184777 + ], + [ + 8.052945810430677, + 50.27413208028197 + ], + [ + 8.072088309726245, + 50.2731525402418 + ], + [ + 8.074710658088811, + 50.26719447466089 + ], + [ + 8.082993207855845, + 50.2659019719302 + ], + [ + 8.079031646981413, + 50.26100216965706 + ], + [ + 8.092001154299348, + 50.26524527183992 + ], + [ + 8.1031208289804, + 50.259788842083964 + ], + [ + 8.121913617230712, + 50.277225030720366 + ], + [ + 8.118600733959914, + 50.299679996705216 + ], + [ + 8.102414395808738, + 50.30982647588674 + ], + [ + 8.107159008835515, + 50.32157438352804 + ], + [ + 8.102677518625223, + 50.32701728359605 + ], + [ + 8.093594600547569, + 50.32808760481621 + ], + [ + 8.094069656402358, + 50.33034813524931 + ], + [ + 8.074385205598885, + 50.329438877009956 + ], + [ + 8.071944285683912, + 50.33177292189797 + ], + [ + 8.076669786974774, + 50.335869797953315 + ], + [ + 8.076769664551493, + 50.34840321976502 + ], + [ + 8.06732390430178, + 50.357755146205164 + ], + [ + 8.059756762013837, + 50.37531153087391 + ], + [ + 8.058396167421481, + 50.373320095530076 + ], + [ + 8.051002529713744, + 50.3759170791099 + ], + [ + 8.050936410554081, + 50.379517149782075 + ], + [ + 8.046051336459595, + 50.37465962791644 + ], + [ + 8.04849464828842, + 50.378285769006524 + ], + [ + 8.042555732070591, + 50.38605418450819 + ], + [ + 8.0336152172176, + 50.3817485410793 + ], + [ + 8.014323001381793, + 50.38447491660246 + ], + [ + 8.020023215035858, + 50.386119475162516 + ], + [ + 8.023757273449347, + 50.40076622461909 + ], + [ + 7.98715391054335, + 50.39805461195276 + ], + [ + 7.984299950400962, + 50.39900952553413 + ], + [ + 7.989643040802809, + 50.40102587934834 + ], + [ + 7.982418559140787, + 50.40809719937817 + ], + [ + 7.971559408169885, + 50.40622046529249 + ], + [ + 7.964191681561698, + 50.412225230325774 + ], + [ + 7.966172023115974, + 50.415212814988514 + ], + [ + 7.974933058413241, + 50.41421708814258 + ], + [ + 7.981239427583963, + 50.41800149318412 + ], + [ + 7.987782203391541, + 50.427921599759465 + ], + [ + 7.984375898112135, + 50.432312574116445 + ], + [ + 7.988095058276608, + 50.43550878850683 + ], + [ + 7.97821989409289, + 50.43434751707751 + ], + [ + 7.97518245218064, + 50.43762097527508 + ], + [ + 7.989391520255479, + 50.43973238356726 + ], + [ + 7.990632849468081, + 50.44393675234323 + ], + [ + 8.001020848774779, + 50.445306104647536 + ], + [ + 8.000115370194463, + 50.44748311571007 + ], + [ + 8.008110241340706, + 50.448799810333526 + ], + [ + 8.01076600093868, + 50.45269242609752 + ], + [ + 8.010474863430256, + 50.460572512869355 + ], + [ + 7.999954801070938, + 50.46293737165452 + ], + [ + 7.994821077378291, + 50.470595202749735 + ], + [ + 7.987667910131343, + 50.47272609665898 + ], + [ + 7.985615914331629, + 50.48258443125067 + ], + [ + 7.979198224986078, + 50.48464087109869 + ], + [ + 7.978902889354805, + 50.49538382800501 + ], + [ + 7.98996693174962, + 50.49856929235406 + ], + [ + 7.982937247871006, + 50.511461090878335 + ], + [ + 7.996564081998503, + 50.51723155223767 + ], + [ + 7.992857647772261, + 50.52211155494625 + ], + [ + 8.004646508158718, + 50.53064985519549 + ], + [ + 8.011075710315309, + 50.530599742973294 + ], + [ + 8.028294119017236, + 50.544501109135226 + ], + [ + 8.028142639102049, + 50.55058367122504 + ], + [ + 8.040995700726029, + 50.55256884848769 + ], + [ + 8.041611266489133, + 50.556993251223524 + ], + [ + 8.046103996545874, + 50.55701686830931 + ], + [ + 8.049348905870723, + 50.55280060222737 + ], + [ + 8.066421972894775, + 50.548930811161846 + ], + [ + 8.070521466867985, + 50.53799815672202 + ], + [ + 8.087303551252788, + 50.538539491643625 + ], + [ + 8.103427207008593, + 50.53262800572239 + ], + [ + 8.11773825073199, + 50.53450892644281 + ], + [ + 8.12088070661784, + 50.539660093716144 + ], + [ + 8.11607625550563, + 50.53857964007655 + ], + [ + 8.110809232851524, + 50.54186453697181 + ], + [ + 8.118991994577344, + 50.548470387613975 + ], + [ + 8.137912756178446, + 50.55094786426129 + ], + [ + 8.132188961761788, + 50.557960319243115 + ], + [ + 8.147141933012486, + 50.582113022927516 + ], + [ + 8.15159216669375, + 50.59937080161556 + ], + [ + 8.12601867235646, + 50.61009313692545 + ], + [ + 8.137736045378297, + 50.61822202898822 + ], + [ + 8.140884865268347, + 50.63022826661346 + ], + [ + 8.128755749355989, + 50.638502978434786 + ], + [ + 8.127491728238653, + 50.64508691696588 + ], + [ + 8.110092340753642, + 50.6572507793635 + ], + [ + 8.110229725126864, + 50.67090117550855 + ], + [ + 8.125517133707703, + 50.68283796877362 + ], + [ + 8.126459048604104, + 50.69274179783639 + ], + [ + 8.131278842690447, + 50.69691964404979 + ], + [ + 8.137413944203473, + 50.6939581806945 + ], + [ + 8.142606559890655, + 50.69544845918114 + ], + [ + 8.16682898997636, + 50.7357106777664 + ], + [ + 8.164890256441671, + 50.74213512647806 + ], + [ + 8.159952572751541, + 50.7427106494012 + ], + [ + 8.164314887805547, + 50.74450251505116 + ], + [ + 8.154852632346914, + 50.748271138077726 + ], + [ + 8.14863441210707, + 50.75586770222767 + ], + [ + 8.151833815993383, + 50.759853883544 + ], + [ + 8.135641284680425, + 50.767216180828875 + ], + [ + 8.141662304177041, + 50.77165990124125 + ], + [ + 8.131708872791766, + 50.777002342018086 + ], + [ + 8.12939000950389, + 50.787463461345496 + ], + [ + 8.125511941065154, + 50.78835590667071 + ], + [ + 8.138362191646909, + 50.7902812834685 + ], + [ + 8.142472776936017, + 50.79464996301238 + ], + [ + 8.16580696544153, + 50.80347589036553 + ], + [ + 8.182840844945888, + 50.82487311852131 + ], + [ + 8.231313895026089, + 50.850639835614366 + ], + [ + 8.233149515420545, + 50.85528460616456 + ], + [ + 8.269835463127334, + 50.88119954545805 + ], + [ + 8.29217936123757, + 50.881707265815386 + ], + [ + 8.291897450048674, + 50.87715612049291 + ], + [ + 8.305473258111922, + 50.86112058851628 + ], + [ + 8.336748641181739, + 50.865712940488166 + ], + [ + 8.352677727380756, + 50.86544141732914 + ], + [ + 8.358600175944622, + 50.86069003236696 + ], + [ + 8.36920145841831, + 50.864602540929894 + ], + [ + 8.36658816693237, + 50.868551149413335 + ], + [ + 8.37191701184083, + 50.87426569055046 + ], + [ + 8.385575975995188, + 50.87579325480489 + ], + [ + 8.389163418779207, + 50.89204265941505 + ], + [ + 8.433426238069966, + 50.91823903738751 + ], + [ + 8.456441091881144, + 50.91653052185888 + ], + [ + 8.458675717316765, + 50.92108824247839 + ], + [ + 8.449323892365017, + 50.941083225263036 + ], + [ + 8.462277137133478, + 50.94969330139456 + ], + [ + 8.459665449499013, + 50.966650247377835 + ], + [ + 8.477891851119297, + 50.96904745630237 + ], + [ + 8.473368208814469, + 50.97503536648197 + ], + [ + 8.495757365752587, + 50.98809597726801 + ], + [ + 8.501414714894237, + 50.99845402475863 + ], + [ + 8.516562233276437, + 51.00580543577808 + ], + [ + 8.514075671555585, + 51.00923733996687 + ], + [ + 8.524560595235005, + 51.00993760082036 + ], + [ + 8.530760672668213, + 51.01377779931585 + ], + [ + 8.530628246785497, + 51.01823986364743 + ], + [ + 8.538782177927967, + 51.01944843005333 + ], + [ + 8.534551052453132, + 51.02062823701152 + ], + [ + 8.531342079976929, + 51.02932265968021 + ], + [ + 8.524318513783223, + 51.032030029751276 + ], + [ + 8.525110558408384, + 51.03890191139535 + ], + [ + 8.520681140374792, + 51.04300308884791 + ], + [ + 8.509803550312789, + 51.03764257018825 + ], + [ + 8.505143530371098, + 51.0414332204929 + ], + [ + 8.515933806599039, + 51.05117598197635 + ], + [ + 8.520434697672078, + 51.05010938626774 + ], + [ + 8.527552171912001, + 51.06337981472936 + ], + [ + 8.522226649872959, + 51.06901401988967 + ], + [ + 8.506235455932776, + 51.07246811267653 + ], + [ + 8.501733297704398, + 51.079465596628204 + ], + [ + 8.517594008664853, + 51.09113982408024 + ], + [ + 8.52261102738209, + 51.090459872301466 + ], + [ + 8.52812272409859, + 51.09695248380078 + ], + [ + 8.540484036876538, + 51.096008553997464 + ], + [ + 8.551019821375563, + 51.10276424295062 + ], + [ + 8.55836742931063, + 51.103453684127885 + ], + [ + 8.601460656891325, + 51.102034562505466 + ], + [ + 8.656632492071319, + 51.0949031986577 + ], + [ + 8.6905346924498, + 51.10915858560236 + ], + [ + 8.706886114330548, + 51.10779080656069 + ], + [ + 8.719655316139768, + 51.110326153217514 + ], + [ + 8.718848165114942, + 51.11569578853908 + ], + [ + 8.701741130828179, + 51.11657664969242 + ], + [ + 8.69216180353735, + 51.132834140378435 + ], + [ + 8.71376124679551, + 51.15190566383345 + ], + [ + 8.718328214635484, + 51.15148037189484 + ], + [ + 8.736326548003486, + 51.16057311866555 + ], + [ + 8.736942759887034, + 51.16393033163894 + ], + [ + 8.758214362271957, + 51.177181727675034 + ], + [ + 8.750004462797593, + 51.18146387979495 + ], + [ + 8.749501813399922, + 51.197731698936394 + ], + [ + 8.765013147420051, + 51.20393076669322 + ], + [ + 8.768194376201677, + 51.208873682855845 + ], + [ + 8.741697463487554, + 51.21842326043187 + ], + [ + 8.727597513512027, + 51.25010269862022 + ], + [ + 8.736585315041035, + 51.262219701964916 + ], + [ + 8.721827237795559, + 51.26774745052558 + ], + [ + 8.721997745453022, + 51.27374380460853 + ], + [ + 8.695833960056497, + 51.2743069363662 + ], + [ + 8.692215487870333, + 51.27657310986116 + ], + [ + 8.679952602984308, + 51.268076538245765 + ], + [ + 8.628340519769566, + 51.260504602002385 + ], + [ + 8.625391094150594, + 51.25331147464841 + ], + [ + 8.61153349633113, + 51.247085886878615 + ], + [ + 8.593562756046166, + 51.24749677620253 + ], + [ + 8.589357314120539, + 51.250011280030414 + ], + [ + 8.5782180949312, + 51.26747828068479 + ], + [ + 8.556347796036086, + 51.27749475046371 + ], + [ + 8.566377620303296, + 51.2877734569823 + ], + [ + 8.59187052064313, + 51.30332347414491 + ], + [ + 8.60324080089121, + 51.31485685257853 + ], + [ + 8.605048337078228, + 51.323694869217796 + ], + [ + 8.617491760636337, + 51.327209840829184 + ], + [ + 8.621098213243496, + 51.33652789514928 + ], + [ + 8.637787568320165, + 51.343613496892814 + ], + [ + 8.653654041856214, + 51.33978949978757 + ], + [ + 8.655559599319602, + 51.34961114745694 + ], + [ + 8.659662020907755, + 51.34838900744424 + ], + [ + 8.666599017144542, + 51.35569685051956 + ], + [ + 8.683476499647153, + 51.36217790429217 + ], + [ + 8.677446063986634, + 51.37179503258846 + ], + [ + 8.693811209359898, + 51.376784751866026 + ], + [ + 8.73285099630853, + 51.372416701413044 + ], + [ + 8.760322472054437, + 51.37827139869458 + ], + [ + 8.772903671531965, + 51.3853937782683 + ], + [ + 8.803993170125432, + 51.390797941574625 + ], + [ + 8.823374914940143, + 51.38982520858854 + ], + [ + 8.827252393415915, + 51.38524592324732 + ], + [ + 8.836583684105333, + 51.38850109065257 + ], + [ + 8.837994438171219, + 51.38329257893739 + ], + [ + 8.854019775269204, + 51.37713784864625 + ], + [ + 8.88958079551572, + 51.392721985940305 + ], + [ + 8.915928443327376, + 51.392837135514704 + ], + [ + 8.939502002802268, + 51.38949902170004 + ], + [ + 8.94307831088136, + 51.39687148421667 + ], + [ + 8.940763338195486, + 51.41032194281195 + ], + [ + 8.951529911132232, + 51.413492782753174 + ], + [ + 8.94590413409648, + 51.41907562190674 + ], + [ + 8.948108682227941, + 51.428218886745064 + ], + [ + 8.93415561910733, + 51.431291039836765 + ], + [ + 8.918786788166999, + 51.43028542794802 + ], + [ + 8.921783451697667, + 51.446053819492285 + ], + [ + 8.913996495295812, + 51.4526171804034 + ], + [ + 8.910699678800418, + 51.46191896841505 + ], + [ + 8.89409102174797, + 51.471236275828964 + ], + [ + 8.890376607820428, + 51.48192827674489 + ], + [ + 8.945737401711908, + 51.50121925828669 + ], + [ + 9.00493273778259, + 51.51240556744487 + ], + [ + 9.018060688067582, + 51.518145491993906 + ], + [ + 9.039285947568548, + 51.50192152220145 + ], + [ + 9.057476861681499, + 51.50251461511676 + ], + [ + 9.060662592064597, + 51.49870347110548 + ], + [ + 9.076521836676083, + 51.50347514554159 + ], + [ + 9.092328869272762, + 51.49438795168085 + ], + [ + 9.092084097380981, + 51.48733042672817 + ], + [ + 9.07718543263466, + 51.46487161124135 + ], + [ + 9.08693706973157, + 51.461164813131745 + ], + [ + 9.085744776691946, + 51.450766443211826 + ], + [ + 9.09303337539976, + 51.445076905028614 + ], + [ + 9.102594184240655, + 51.44320222770015 + ], + [ + 9.131804237135217, + 51.44629001315439 + ], + [ + 9.135749292546791, + 51.45018705747933 + ], + [ + 9.149298761257187, + 51.442015008060274 + ], + [ + 9.158407695529629, + 51.443096082234604 + ], + [ + 9.174350380355168, + 51.46294667891397 + ], + [ + 9.185100362355085, + 51.466333561349686 + ], + [ + 9.216465953777892, + 51.459593997128216 + ], + [ + 9.216640648253486, + 51.48116523360298 + ], + [ + 9.225184632608592, + 51.489837271417876 + ], + [ + 9.23980378050386, + 51.490857374345744 + ], + [ + 9.236704692207347, + 51.492434795144554 + ], + [ + 9.240696811538138, + 51.497183435435645 + ], + [ + 9.264333034402412, + 51.497910643871336 + ], + [ + 9.269430452850383, + 51.50712581975931 + ], + [ + 9.28228510416329, + 51.51437279295623 + ], + [ + 9.308324697000028, + 51.51264327359829 + ], + [ + 9.31616372705741, + 51.52335753141024 + ], + [ + 9.309968656291103, + 51.530910611386545 + ], + [ + 9.320018194767464, + 51.54677198797943 + ], + [ + 9.31703096952167, + 51.552365548523525 + ], + [ + 9.331118931419347, + 51.55682483970977 + ], + [ + 9.352244666162687, + 51.58010181470525 + ], + [ + 9.373522627935134, + 51.59101373235738 + ], + [ + 9.356268196400162, + 51.5976768251476 + ], + [ + 9.337098311723196, + 51.614701568254404 + ], + [ + 9.358030937257961, + 51.6202592434398 + ], + [ + 9.371266831484187, + 51.61924381547859 + ], + [ + 9.37193485109371, + 51.62556629325969 + ], + [ + 9.378266679213729, + 51.62673325343856 + ], + [ + 9.398499433395605, + 51.624557373649914 + ], + [ + 9.426669031862971, + 51.63081380898922 + ], + [ + 9.445084681702896, + 51.644146453853295 + ], + [ + 9.437944705190214, + 51.64771733181217 + ], + [ + 9.440456997710914, + 51.65039402248708 + ], + [ + 9.453276430625795, + 51.64574879731446 + ], + [ + 9.467714408073558, + 51.653847167952726 + ], + [ + 9.493104325392755, + 51.657548005911075 + ], + [ + 9.498597957643995, + 51.65306919441786 + ], + [ + 9.494898166322109, + 51.646353025617316 + ] + ] + ], + [ + [ + [ + 8.680587351526913, + 49.62247104865315 + ], + [ + 8.685867890847106, + 49.62166492570476 + ], + [ + 8.685979754279812, + 49.61835508593153 + ], + [ + 8.671863583570886, + 49.61587813429886 + ], + [ + 8.672807336498051, + 49.619447998687384 + ], + [ + 8.680587351526913, + 49.62247104865315 + ] + ], + [ + [ + 8.680116543597796, + 49.62028571397243 + ], + [ + 8.68006748578963, + 49.618665101451946 + ], + [ + 8.683707192436826, + 49.61911054189151 + ], + [ + 8.684052726817974, + 49.6202229658076 + ], + [ + 8.680116543597796, + 49.62028571397243 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "12", + "AGS": "12", + "SDV_RS": "120540000000", + "GEN": "Brandenburg", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "12", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE4", + "RS_0": "120000000000", + "AGS_0": "12000000", + "WSK": "1999/01/20", + "DEBKG_ID": "DEBKGDL20000E675", + "destatis": { + "population": 2457872, + "population_m": 1210474, + "population_w": 1247398 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 13.80057052128722, + 53.55825461877525 + ], + [ + 13.798463285136021, + 53.54568960468578 + ], + [ + 13.823415741422789, + 53.52193447722345 + ], + [ + 13.821728496694734, + 53.51811033817292 + ], + [ + 13.848404712080526, + 53.51431058947938 + ], + [ + 13.879268138939178, + 53.50413995579448 + ], + [ + 13.873924620763134, + 53.4905949192662 + ], + [ + 13.876228132953065, + 53.48701447305088 + ], + [ + 13.884590220179915, + 53.48533669442799 + ], + [ + 13.875591802271698, + 53.473466196262514 + ], + [ + 13.918213427350251, + 53.45599846969253 + ], + [ + 13.917505496185559, + 53.44652703074172 + ], + [ + 13.906287561579468, + 53.443882946973226 + ], + [ + 13.911394952069093, + 53.43654868180955 + ], + [ + 13.902893508290168, + 53.432025014471265 + ], + [ + 13.916373270042705, + 53.42226627121634 + ], + [ + 13.946492796818838, + 53.43081063013523 + ], + [ + 13.962079707782587, + 53.42989693565613 + ], + [ + 14.001216931640622, + 53.434991562648 + ], + [ + 14.006591071071384, + 53.430410880595886 + ], + [ + 14.045604130974723, + 53.42942541906938 + ], + [ + 14.051325002711168, + 53.41337115608848 + ], + [ + 14.070388343221891, + 53.415006599713934 + ], + [ + 14.082350187553704, + 53.41100211254312 + ], + [ + 14.082240653882765, + 53.415518935751884 + ], + [ + 14.09392242528066, + 53.42211997258983 + ], + [ + 14.10542610093823, + 53.42242613946261 + ], + [ + 14.121843779927282, + 53.44170762279631 + ], + [ + 14.13401005658737, + 53.439038151160304 + ], + [ + 14.136759840686377, + 53.44100114985572 + ], + [ + 14.176961663362285, + 53.42286728995732 + ], + [ + 14.20591111349775, + 53.42302691066436 + ], + [ + 14.224661387871267, + 53.43424798562114 + ], + [ + 14.237712312530538, + 53.42734197916876 + ], + [ + 14.241790504934054, + 53.42243725745555 + ], + [ + 14.236838219654546, + 53.414631114996226 + ], + [ + 14.243142634070596, + 53.39230278053881 + ], + [ + 14.223406621444035, + 53.35856323030549 + ], + [ + 14.182130423918073, + 53.32641358723366 + ], + [ + 14.109653480601855, + 53.28263829009179 + ], + [ + 14.098817345760569, + 53.261671915447984 + ], + [ + 14.12478909771317, + 53.26022516442164 + ], + [ + 14.160239070220907, + 53.267810714182474 + ], + [ + 14.175976626327836, + 53.26207169206201 + ], + [ + 14.200159460384416, + 53.26177238632363 + ], + [ + 14.211057785961147, + 53.25481373373707 + ], + [ + 14.266048355976588, + 53.25959485296453 + ], + [ + 14.262188669946472, + 53.27660236195031 + ], + [ + 14.301854253811007, + 53.28622361062099 + ], + [ + 14.31656942147679, + 53.312335547972445 + ], + [ + 14.348957936651521, + 53.30998995723957 + ], + [ + 14.350244776861507, + 53.3137559793141 + ], + [ + 14.361933978079307, + 53.315212073383535 + ], + [ + 14.361642648658673, + 53.31756161823804 + ], + [ + 14.374817120326313, + 53.31559286155346 + ], + [ + 14.381543152394745, + 53.32388693125456 + ], + [ + 14.403071574456078, + 53.330101922015395 + ], + [ + 14.412381008544738, + 53.32959336345732 + ], + [ + 14.415497624795302, + 53.3242993379329 + ], + [ + 14.40677451147162, + 53.30871101572334 + ], + [ + 14.414987459016004, + 53.301865813126646 + ], + [ + 14.421216586624878, + 53.27613673323109 + ], + [ + 14.445297666049605, + 53.27444507634124 + ], + [ + 14.449598287734638, + 53.259445956625484 + ], + [ + 14.435973243492764, + 53.24958736717984 + ], + [ + 14.430808397172715, + 53.239132051114304 + ], + [ + 14.408495732960233, + 53.22320352453765 + ], + [ + 14.405945249942462, + 53.210836499394766 + ], + [ + 14.377272991498357, + 53.20174829897545 + ], + [ + 14.366254963897175, + 53.171988641975034 + ], + [ + 14.37110772931657, + 53.15728916434208 + ], + [ + 14.38773725882887, + 53.14302568716463 + ], + [ + 14.379024141876737, + 53.11290407076798 + ], + [ + 14.370173398393165, + 53.104597455721176 + ], + [ + 14.366714267143463, + 53.08060963852154 + ], + [ + 14.348570677351638, + 53.05471831137012 + ], + [ + 14.25896007635128, + 53.002983323431074 + ], + [ + 14.235602408655138, + 52.99318832046163 + ], + [ + 14.20685994264946, + 52.98754078472247 + ], + [ + 14.17278558979346, + 52.97558479534592 + ], + [ + 14.162226392481491, + 52.96527256630896 + ], + [ + 14.143657774190986, + 52.96136543787501 + ], + [ + 14.138846626440792, + 52.95177918836533 + ], + [ + 14.14412365655982, + 52.94489730453893 + ], + [ + 14.14264602273121, + 52.93324891269127 + ], + [ + 14.152313428305309, + 52.90064361887063 + ], + [ + 14.161595564684697, + 52.88809495990476 + ], + [ + 14.15771447328845, + 52.874754307600405 + ], + [ + 14.129849054526417, + 52.852717235698194 + ], + [ + 14.12292694749927, + 52.837657107313376 + ], + [ + 14.130087891312693, + 52.828315171435776 + ], + [ + 14.143261915997765, + 52.82385129841093 + ], + [ + 14.217490123495487, + 52.81687246150648 + ], + [ + 14.23007870741098, + 52.805025557334844 + ], + [ + 14.278810272489006, + 52.774454457190174 + ], + [ + 14.351042390392616, + 52.75150720525205 + ], + [ + 14.360871957164171, + 52.74061465210742 + ], + [ + 14.373494846834896, + 52.73666379741006 + ], + [ + 14.413488712321325, + 52.70083656629048 + ], + [ + 14.423988265942661, + 52.69617415132542 + ], + [ + 14.433023178420243, + 52.6814732046498 + ], + [ + 14.450041117564641, + 52.67838791019621 + ], + [ + 14.4577501564833, + 52.6739304453567 + ], + [ + 14.465104602054044, + 52.661325563153945 + ], + [ + 14.50967630915962, + 52.64160962483959 + ], + [ + 14.567321795118971, + 52.623687319672555 + ], + [ + 14.59615532334663, + 52.610662068866766 + ], + [ + 14.608225154725988, + 52.59956886820557 + ], + [ + 14.61370874479387, + 52.586612402355975 + ], + [ + 14.639110577525447, + 52.57299886650773 + ], + [ + 14.637292768029369, + 52.566288258172364 + ], + [ + 14.61571119794757, + 52.55421073235419 + ], + [ + 14.60392149412314, + 52.531339833686054 + ], + [ + 14.612734650116483, + 52.51038675071881 + ], + [ + 14.631680962873943, + 52.50181187715536 + ], + [ + 14.634541163389923, + 52.492337353706475 + ], + [ + 14.626526842395565, + 52.48382160235862 + ], + [ + 14.613391529532064, + 52.47717391652423 + ], + [ + 14.608794361339669, + 52.46386559194123 + ], + [ + 14.5792373024308, + 52.44175117082057 + ], + [ + 14.559397269516637, + 52.43896422625018 + ], + [ + 14.549527445572554, + 52.43362290865843 + ], + [ + 14.544211437045915, + 52.4259750558132 + ], + [ + 14.546638478929275, + 52.41285148019558 + ], + [ + 14.534357221145374, + 52.395007779783086 + ], + [ + 14.552123282379375, + 52.37405367681675 + ], + [ + 14.552131322275146, + 52.35373334443339 + ], + [ + 14.562495312278893, + 52.339817862102805 + ], + [ + 14.561027667910293, + 52.32860842052676 + ], + [ + 14.576201403967612, + 52.321482005643816 + ], + [ + 14.584921859750422, + 52.30645776133327 + ], + [ + 14.574751631869212, + 52.29556257725679 + ], + [ + 14.576039609534028, + 52.28836671377142 + ], + [ + 14.587539868670618, + 52.2834979794219 + ], + [ + 14.59647844851495, + 52.272932672863455 + ], + [ + 14.617122684788315, + 52.27146793719153 + ], + [ + 14.64135306663093, + 52.26365996401974 + ], + [ + 14.692153979592211, + 52.25594603451632 + ], + [ + 14.715746888797897, + 52.23588355455289 + ], + [ + 14.708388064401529, + 52.211746713618645 + ], + [ + 14.685177146741912, + 52.19408442606974 + ], + [ + 14.701205074799532, + 52.18027894706307 + ], + [ + 14.705415465483217, + 52.16962629767171 + ], + [ + 14.67958485191364, + 52.14492951739891 + ], + [ + 14.684210177423711, + 52.12419082706019 + ], + [ + 14.681595447903891, + 52.11665177992806 + ], + [ + 14.700347375448128, + 52.098118678885626 + ], + [ + 14.724303473612112, + 52.09351556790684 + ], + [ + 14.741284122875777, + 52.085227591707046 + ], + [ + 14.759042582403703, + 52.064762032333775 + ], + [ + 14.745243137756791, + 52.05384990084905 + ], + [ + 14.749782022942092, + 52.043038426054075 + ], + [ + 14.748263132051134, + 52.031830244693076 + ], + [ + 14.740365481293711, + 52.029075412688464 + ], + [ + 14.741310434187927, + 52.02341057878188 + ], + [ + 14.726712041856228, + 52.013928842056046 + ], + [ + 14.725246475426061, + 52.00823260138235 + ], + [ + 14.714049732670915, + 52.003692212064756 + ], + [ + 14.721392881264899, + 51.99381845073669 + ], + [ + 14.716203828838147, + 51.98243379244334 + ], + [ + 14.704708297882078, + 51.97661883628879 + ], + [ + 14.707961574717434, + 51.96452575773352 + ], + [ + 14.721230976400129, + 51.9511620951832 + ], + [ + 14.718798730252297, + 51.94131038639969 + ], + [ + 14.703368334145352, + 51.930846992716646 + ], + [ + 14.705491282635439, + 51.92355485656644 + ], + [ + 14.691268719050875, + 51.9080566477191 + ], + [ + 14.694259158084881, + 51.90198462695271 + ], + [ + 14.674470073045624, + 51.89441869826731 + ], + [ + 14.67437317407591, + 51.889559007541685 + ], + [ + 14.663117457005162, + 51.89051289887462 + ], + [ + 14.643357383234715, + 51.866868933129524 + ], + [ + 14.634635455144585, + 51.86538026192816 + ], + [ + 14.624469232056938, + 51.85822905830965 + ], + [ + 14.611001835190233, + 51.85701174491751 + ], + [ + 14.60713753601196, + 51.8522443965751 + ], + [ + 14.611884909982566, + 51.84505240543601 + ], + [ + 14.604140343124097, + 51.84788840759326 + ], + [ + 14.605199229738886, + 51.84041463207347 + ], + [ + 14.596137330911738, + 51.84220978436712 + ], + [ + 14.59015756575177, + 51.83814568121575 + ], + [ + 14.593133449808402, + 51.83064615618036 + ], + [ + 14.590144372430968, + 51.82100999275801 + ], + [ + 14.59715305536185, + 51.817308236125164 + ], + [ + 14.606713642481914, + 51.80403938999318 + ], + [ + 14.622781600754426, + 51.80045425594845 + ], + [ + 14.633109466705188, + 51.801355586054505 + ], + [ + 14.645894353635384, + 51.79508839957525 + ], + [ + 14.6538234636393, + 51.78356600446554 + ], + [ + 14.654736448687531, + 51.76809056832556 + ], + [ + 14.650456644280313, + 51.76207774094617 + ], + [ + 14.66413754582573, + 51.7567046646865 + ], + [ + 14.657620135392571, + 51.75353692969172 + ], + [ + 14.660029473140286, + 51.748757911455996 + ], + [ + 14.656214615863359, + 51.74130531987118 + ], + [ + 14.66812366381597, + 51.725830021072056 + ], + [ + 14.677716597851612, + 51.7226893011273 + ], + [ + 14.690914824770505, + 51.70827392701796 + ], + [ + 14.726139965592127, + 51.689746088420996 + ], + [ + 14.738170746045583, + 51.68706247726563 + ], + [ + 14.737012643620298, + 51.67942662464509 + ], + [ + 14.746769709009252, + 51.676174734668926 + ], + [ + 14.75775151272754, + 51.66104613369175 + ], + [ + 14.750978829585726, + 51.65226090292661 + ], + [ + 14.755889081158212, + 51.6457220797894 + ], + [ + 14.7533132673785, + 51.628008657353476 + ], + [ + 14.763229862676278, + 51.619144096096335 + ], + [ + 14.765701800997137, + 51.610728209646155 + ], + [ + 14.761027961242652, + 51.60250751454886 + ], + [ + 14.751400068808842, + 51.595294429307046 + ], + [ + 14.741484202157418, + 51.592587652664015 + ], + [ + 14.729865560236963, + 51.581777002002696 + ], + [ + 14.711163818472622, + 51.595764909224634 + ], + [ + 14.69664772412747, + 51.59666082991229 + ], + [ + 14.706451661098512, + 51.57646016641638 + ], + [ + 14.692759231120952, + 51.57633522523735 + ], + [ + 14.69575344048256, + 51.574606705063054 + ], + [ + 14.691142421299922, + 51.56278610633662 + ], + [ + 14.674012756405858, + 51.55064535706996 + ], + [ + 14.663996490162418, + 51.55454737519291 + ], + [ + 14.609886945732633, + 51.55014978439863 + ], + [ + 14.603744825276754, + 51.55511637448932 + ], + [ + 14.606366460831362, + 51.55722787409729 + ], + [ + 14.59817064401112, + 51.57248917469619 + ], + [ + 14.58306397112257, + 51.57463525883048 + ], + [ + 14.58048435424069, + 51.580410028384506 + ], + [ + 14.56963510186869, + 51.58119048113655 + ], + [ + 14.560581837609522, + 51.5734613228352 + ], + [ + 14.544438334083118, + 51.57361516457649 + ], + [ + 14.545185106298945, + 51.56177742415794 + ], + [ + 14.52507605823792, + 51.55863081223357 + ], + [ + 14.515453720018995, + 51.55423483708441 + ], + [ + 14.49985690372574, + 51.55940366951107 + ], + [ + 14.454070341319582, + 51.55637198048769 + ], + [ + 14.44673537690033, + 51.55272760922218 + ], + [ + 14.447770786856115, + 51.54206888570234 + ], + [ + 14.441311010013386, + 51.54461378344053 + ], + [ + 14.40943787381737, + 51.53720890591514 + ], + [ + 14.398877064048863, + 51.54178904507041 + ], + [ + 14.387158460248811, + 51.5417708855479 + ], + [ + 14.386688682891291, + 51.53402059934251 + ], + [ + 14.37586651911569, + 51.53313396525917 + ], + [ + 14.35368764281023, + 51.520789465532616 + ], + [ + 14.339930674000405, + 51.52076215753116 + ], + [ + 14.342118093232736, + 51.5108438247694 + ], + [ + 14.3381102183225, + 51.50591161227991 + ], + [ + 14.332350138103498, + 51.50501826420334 + ], + [ + 14.324919587785665, + 51.50714771778146 + ], + [ + 14.322918394674263, + 51.51942604332302 + ], + [ + 14.293084404069553, + 51.52511014498397 + ], + [ + 14.274005491938551, + 51.53213036511619 + ], + [ + 14.255942533885728, + 51.53229829877811 + ], + [ + 14.247044375769475, + 51.527842391318046 + ], + [ + 14.242488150501858, + 51.528759478703165 + ], + [ + 14.24530021097791, + 51.531186975742486 + ], + [ + 14.242108159796524, + 51.53309028394815 + ], + [ + 14.228926525436593, + 51.53283939857733 + ], + [ + 14.213017886557852, + 51.539811848154216 + ], + [ + 14.175136186489217, + 51.539116892657965 + ], + [ + 14.136708928841285, + 51.54330893838749 + ], + [ + 14.129730076359564, + 51.53386106010358 + ], + [ + 14.142359249165233, + 51.522804452032425 + ], + [ + 14.107796742863309, + 51.521760568822415 + ], + [ + 14.100577876957676, + 51.514165002833586 + ], + [ + 14.096060710501504, + 51.49805203107105 + ], + [ + 14.087760578909393, + 51.49396380295589 + ], + [ + 14.073821671590348, + 51.49266749021899 + ], + [ + 14.087258360941595, + 51.47739668372717 + ], + [ + 14.072593722338398, + 51.47208725829162 + ], + [ + 14.03874199579154, + 51.47991067923028 + ], + [ + 14.033005723693138, + 51.47510218879055 + ], + [ + 14.055291851459758, + 51.46094820783808 + ], + [ + 14.05258824086775, + 51.45250807268832 + ], + [ + 14.062837101853969, + 51.44550575592312 + ], + [ + 14.040212572184313, + 51.43728098553133 + ], + [ + 14.037145618177227, + 51.43458503792178 + ], + [ + 14.043548273882752, + 51.43336268168198 + ], + [ + 14.046241448700947, + 51.429134775718296 + ], + [ + 14.03824509089658, + 51.4284438850606 + ], + [ + 14.04458987493301, + 51.418753734378754 + ], + [ + 14.036849738394608, + 51.41679777148433 + ], + [ + 14.027438864844086, + 51.408319903263255 + ], + [ + 14.015903683475143, + 51.40513789563728 + ], + [ + 14.017015973956225, + 51.40047199645298 + ], + [ + 14.02579387289712, + 51.40055182428538 + ], + [ + 14.028091219290928, + 51.39593580552429 + ], + [ + 14.013325115875684, + 51.39832306372595 + ], + [ + 14.003563734393447, + 51.39561192350526 + ], + [ + 14.008315099104662, + 51.39198121206515 + ], + [ + 13.996318439130844, + 51.382607596089024 + ], + [ + 14.000697254240357, + 51.3725959735676 + ], + [ + 13.970209087221445, + 51.3758409262069 + ], + [ + 13.972343683798115, + 51.39382237691531 + ], + [ + 13.956223628794325, + 51.39707171266231 + ], + [ + 13.938988524708328, + 51.38911315162986 + ], + [ + 13.90820470332307, + 51.38323341703199 + ], + [ + 13.909994332528104, + 51.37896814600961 + ], + [ + 13.882632642999008, + 51.37506694091715 + ], + [ + 13.868276710372285, + 51.37691168299801 + ], + [ + 13.863248930278516, + 51.38175706746582 + ], + [ + 13.833190693973803, + 51.383838979464294 + ], + [ + 13.835313220249546, + 51.37678999969994 + ], + [ + 13.818971916501917, + 51.36949891235228 + ], + [ + 13.807640397268631, + 51.37318695710381 + ], + [ + 13.787940659930152, + 51.37090727141151 + ], + [ + 13.780624863420808, + 51.3688476911336 + ], + [ + 13.776524354120504, + 51.36199078453041 + ], + [ + 13.767735944061661, + 51.36300780365274 + ], + [ + 13.763252568096542, + 51.35902035066265 + ], + [ + 13.762684593046304, + 51.36541218406207 + ], + [ + 13.768966955434369, + 51.36939804574241 + ], + [ + 13.757691731615067, + 51.3714945970298 + ], + [ + 13.753155540543224, + 51.36594682643548 + ], + [ + 13.739111250709746, + 51.36120201941882 + ], + [ + 13.727352068016485, + 51.364710250040375 + ], + [ + 13.713393941881103, + 51.36350286555933 + ], + [ + 13.691250599729084, + 51.3740128051821 + ], + [ + 13.682764783548285, + 51.367615273595604 + ], + [ + 13.668403737304994, + 51.376126427063944 + ], + [ + 13.661451523550907, + 51.36897462801059 + ], + [ + 13.63209954595885, + 51.36853507668276 + ], + [ + 13.617225116274195, + 51.37105730835345 + ], + [ + 13.59406313417129, + 51.36935620942162 + ], + [ + 13.59575668972811, + 51.37452798178812 + ], + [ + 13.591344224001848, + 51.37514456660055 + ], + [ + 13.589854832842015, + 51.38423485721147 + ], + [ + 13.56996177701043, + 51.385666024570284 + ], + [ + 13.556267005266124, + 51.37903564514497 + ], + [ + 13.550823539272145, + 51.37925212563413 + ], + [ + 13.546135309826155, + 51.36916738286418 + ], + [ + 13.542628170077014, + 51.36931550527514 + ], + [ + 13.537766397510323, + 51.38104645745235 + ], + [ + 13.523118417971666, + 51.38102642810437 + ], + [ + 13.521217775934359, + 51.402057389515974 + ], + [ + 13.502735567952486, + 51.404706197657454 + ], + [ + 13.4943915148302, + 51.402917947065376 + ], + [ + 13.49135311955664, + 51.40768382152121 + ], + [ + 13.463281913905485, + 51.411753589082664 + ], + [ + 13.465533280850037, + 51.42177463426184 + ], + [ + 13.473786065601084, + 51.417881157559776 + ], + [ + 13.463307820597134, + 51.426261875292646 + ], + [ + 13.460625089355966, + 51.422241415740515 + ], + [ + 13.450052449369915, + 51.42300825763806 + ], + [ + 13.445913131179186, + 51.4314497120755 + ], + [ + 13.446057508330341, + 51.425956520360394 + ], + [ + 13.43340530503055, + 51.42761652421913 + ], + [ + 13.428506814885996, + 51.42179249487532 + ], + [ + 13.42142494754756, + 51.421505005374414 + ], + [ + 13.42814965661049, + 51.43124501041662 + ], + [ + 13.419704985779275, + 51.438844924338554 + ], + [ + 13.412191362864787, + 51.43937428935541 + ], + [ + 13.405634221446189, + 51.44594862837649 + ], + [ + 13.409320226994092, + 51.44977411717499 + ], + [ + 13.401050429956125, + 51.45417172377639 + ], + [ + 13.388230463341952, + 51.4478088921322 + ], + [ + 13.382146484053678, + 51.43604638669049 + ], + [ + 13.372938772173928, + 51.43779565017197 + ], + [ + 13.383076042327348, + 51.42805680360469 + ], + [ + 13.376647808569707, + 51.42461142419729 + ], + [ + 13.358349600653407, + 51.433971242366994 + ], + [ + 13.337948451163985, + 51.42916466612694 + ], + [ + 13.333353583610123, + 51.43744118285325 + ], + [ + 13.320322813016475, + 51.43750047498699 + ], + [ + 13.328343605963473, + 51.426642049253076 + ], + [ + 13.286672469555146, + 51.41138323113536 + ], + [ + 13.286354588449106, + 51.39928818530423 + ], + [ + 13.259983529890837, + 51.40039904009303 + ], + [ + 13.259089376818089, + 51.39533328333621 + ], + [ + 13.263771608558423, + 51.39445796048698 + ], + [ + 13.26366415068697, + 51.39099427884305 + ], + [ + 13.270038189213166, + 51.39050202726645 + ], + [ + 13.268543250046047, + 51.3847932441295 + ], + [ + 13.26371828959976, + 51.38495189015271 + ], + [ + 13.250654592618517, + 51.394108585186245 + ], + [ + 13.21503469253673, + 51.39597772224613 + ], + [ + 13.202189123520181, + 51.41637687501595 + ], + [ + 13.203701756065758, + 51.428490274731296 + ], + [ + 13.199750456679649, + 51.43322594892986 + ], + [ + 13.19338737346663, + 51.43577686872306 + ], + [ + 13.189423718108886, + 51.4342561034472 + ], + [ + 13.184649357529908, + 51.423787027034905 + ], + [ + 13.174310970973542, + 51.42825391768593 + ], + [ + 13.175078704651776, + 51.43278279488173 + ], + [ + 13.184760973874027, + 51.43851289669115 + ], + [ + 13.191840583488622, + 51.43691061964396 + ], + [ + 13.20312168605296, + 51.4510133815797 + ], + [ + 13.203080425539502, + 51.458731935324614 + ], + [ + 13.182922443464571, + 51.47134128005578 + ], + [ + 13.187046114446721, + 51.485753232540205 + ], + [ + 13.182296590743732, + 51.491959293166275 + ], + [ + 13.192071992683092, + 51.48804944990116 + ], + [ + 13.201294463942958, + 51.4917174786283 + ], + [ + 13.196534057634771, + 51.49447056464488 + ], + [ + 13.203923233392908, + 51.49877907642056 + ], + [ + 13.202045180498747, + 51.50411572513054 + ], + [ + 13.207041557601736, + 51.50493725537773 + ], + [ + 13.207957036778813, + 51.52435284618062 + ], + [ + 13.200522824734955, + 51.526035908086854 + ], + [ + 13.19005547048605, + 51.53959030258109 + ], + [ + 13.18557175948486, + 51.55807523593453 + ], + [ + 13.160826606501793, + 51.55896933640719 + ], + [ + 13.158606161102169, + 51.56425874591999 + ], + [ + 13.146715720505886, + 51.5634549507238 + ], + [ + 13.143169244811164, + 51.56746112818962 + ], + [ + 13.1410439508023, + 51.571167233227115 + ], + [ + 13.153207832114044, + 51.58241280223834 + ], + [ + 13.154906540363642, + 51.58939526631148 + ], + [ + 13.16177226783151, + 51.592148294607966 + ], + [ + 13.154954858476632, + 51.60019678363419 + ], + [ + 13.1437768592438, + 51.59787311058614 + ], + [ + 13.121025347004315, + 51.61888754822575 + ], + [ + 13.106747967793181, + 51.61163260056423 + ], + [ + 13.103972710848252, + 51.61647385656971 + ], + [ + 13.097098010447063, + 51.61630730457585 + ], + [ + 13.104872626451153, + 51.60967557255316 + ], + [ + 13.096922946221806, + 51.609216727087876 + ], + [ + 13.093842105729742, + 51.60588332541393 + ], + [ + 13.086304095173091, + 51.60813513764826 + ], + [ + 13.051025246770873, + 51.64767715365189 + ], + [ + 13.154528682259537, + 51.68670591578051 + ], + [ + 13.162459539467722, + 51.69181513163535 + ], + [ + 13.156144751281456, + 51.69472949900417 + ], + [ + 13.161264644451428, + 51.694985955298115 + ], + [ + 13.160818457239552, + 51.69916883921703 + ], + [ + 13.154208824278436, + 51.7107221108394 + ], + [ + 13.161730163841675, + 51.712974635858245 + ], + [ + 13.17010994387656, + 51.708086819031834 + ], + [ + 13.165479199108956, + 51.71755585808941 + ], + [ + 13.168685410620194, + 51.718669186175276 + ], + [ + 13.187071618765234, + 51.715624512949006 + ], + [ + 13.179535238506269, + 51.73117069611961 + ], + [ + 13.167154722020362, + 51.735384124736264 + ], + [ + 13.164127394114269, + 51.74188858453095 + ], + [ + 13.160751932385239, + 51.73986955076241 + ], + [ + 13.154010379840265, + 51.74424794604302 + ], + [ + 13.16329468627971, + 51.75493602736824 + ], + [ + 13.149842175867805, + 51.75932141262806 + ], + [ + 13.155834023475062, + 51.764570213960866 + ], + [ + 13.147481828775215, + 51.7666385313446 + ], + [ + 13.159798631379525, + 51.77459014806283 + ], + [ + 13.16003872287516, + 51.78392847697376 + ], + [ + 13.168708083228653, + 51.78277037472249 + ], + [ + 13.170103760554035, + 51.78702373534476 + ], + [ + 13.157994610740738, + 51.7884481519776 + ], + [ + 13.162691589576895, + 51.79306857213104 + ], + [ + 13.158470923538633, + 51.79761010436624 + ], + [ + 13.163011283424767, + 51.802017992809745 + ], + [ + 13.148523436781929, + 51.82054358954678 + ], + [ + 13.14208951463271, + 51.82065462265405 + ], + [ + 13.139141407549388, + 51.824692823139074 + ], + [ + 13.142163335312382, + 51.82858870806939 + ], + [ + 13.135552091289764, + 51.8328034630649 + ], + [ + 13.12353576619225, + 51.85459253928181 + ], + [ + 13.123477552741365, + 51.85782061801626 + ], + [ + 13.150913369212546, + 51.859610357795745 + ], + [ + 13.149604230062966, + 51.87233145580049 + ], + [ + 13.142228109559838, + 51.87255680749765 + ], + [ + 13.138950995718064, + 51.879512089043025 + ], + [ + 13.124465060179604, + 51.882948190987605 + ], + [ + 13.119075141753536, + 51.88282904014502 + ], + [ + 13.118706565663226, + 51.87693241832316 + ], + [ + 13.113554521452293, + 51.874700939109495 + ], + [ + 13.085005234340814, + 51.874016413567865 + ], + [ + 13.080548073399333, + 51.86747806574704 + ], + [ + 13.039239289923612, + 51.87091214592508 + ], + [ + 13.029163735935503, + 51.88104241225666 + ], + [ + 13.03729343246635, + 51.88025695083062 + ], + [ + 13.037566139257724, + 51.890881038619305 + ], + [ + 13.048537912096316, + 51.89186042965179 + ], + [ + 13.04540786142587, + 51.9005151060307 + ], + [ + 13.022773443464605, + 51.90323001453266 + ], + [ + 13.021779435201069, + 51.89685164720717 + ], + [ + 13.009739072887967, + 51.903020004899936 + ], + [ + 12.984991544854035, + 51.90413416720284 + ], + [ + 12.97266485223506, + 51.90088113948577 + ], + [ + 12.976535927759247, + 51.919863434192564 + ], + [ + 12.95597430532269, + 51.92265712044872 + ], + [ + 12.960567963268087, + 51.93491054143789 + ], + [ + 12.918371522969094, + 51.93935952995356 + ], + [ + 12.917461899024817, + 51.93269138596945 + ], + [ + 12.890424130433587, + 51.9283802482165 + ], + [ + 12.888171516864789, + 51.93476917900446 + ], + [ + 12.852730179074905, + 51.93500528871768 + ], + [ + 12.850254883510924, + 51.95869846941026 + ], + [ + 12.84415364266501, + 51.96773396747717 + ], + [ + 12.811265510476499, + 51.96256512954814 + ], + [ + 12.777612700373414, + 51.96459096390992 + ], + [ + 12.774325112894946, + 51.978359949445235 + ], + [ + 12.759246169112059, + 51.98217687818353 + ], + [ + 12.755476101537793, + 51.98639142679677 + ], + [ + 12.729640934286756, + 51.98896385893223 + ], + [ + 12.711672812068764, + 51.99727062909795 + ], + [ + 12.711938185679152, + 51.99986576339529 + ], + [ + 12.682521599501941, + 52.00332298581763 + ], + [ + 12.66918668387392, + 52.012880743008886 + ], + [ + 12.656502520719918, + 52.01293960542612 + ], + [ + 12.64859703211563, + 52.00831105159496 + ], + [ + 12.644748194772008, + 51.99437984780019 + ], + [ + 12.61439705616749, + 51.99172329359409 + ], + [ + 12.615160259789585, + 51.982281255243564 + ], + [ + 12.53939459126137, + 51.98488894227101 + ], + [ + 12.536306597743916, + 52.002880022150165 + ], + [ + 12.498826521926663, + 52.00892288762048 + ], + [ + 12.484955699945148, + 52.01714982865042 + ], + [ + 12.480615350524882, + 52.03333511456946 + ], + [ + 12.460757552456453, + 52.03472049809046 + ], + [ + 12.450002443909627, + 52.01621286212826 + ], + [ + 12.430227854088743, + 52.01830613611795 + ], + [ + 12.420203660078275, + 52.02652446855204 + ], + [ + 12.398216700103326, + 52.03564719093049 + ], + [ + 12.389599427215902, + 52.04356576771877 + ], + [ + 12.35977739545895, + 52.0465000846083 + ], + [ + 12.348085072708702, + 52.059296586610266 + ], + [ + 12.32903021777733, + 52.0696315893419 + ], + [ + 12.31582350805484, + 52.09237191436492 + ], + [ + 12.27610260120034, + 52.104558064983664 + ], + [ + 12.265110133867484, + 52.13065982268432 + ], + [ + 12.24532000747132, + 52.1387330147082 + ], + [ + 12.231304278786359, + 52.15495143505459 + ], + [ + 12.234003842275886, + 52.16279355776501 + ], + [ + 12.216783136632605, + 52.17006859908047 + ], + [ + 12.228585190869218, + 52.18598478100203 + ], + [ + 12.241560411200899, + 52.18198191657988 + ], + [ + 12.248291791998085, + 52.1842228728287 + ], + [ + 12.241800132657973, + 52.194277005977895 + ], + [ + 12.25367519150017, + 52.20564634401089 + ], + [ + 12.24524926251474, + 52.20738894093371 + ], + [ + 12.248402781724394, + 52.21092359086619 + ], + [ + 12.260424115877559, + 52.21649625392404 + ], + [ + 12.267584039534631, + 52.21418652978869 + ], + [ + 12.278827849246143, + 52.21704284949092 + ], + [ + 12.288915682831538, + 52.225439420433815 + ], + [ + 12.29302065346339, + 52.224037489531234 + ], + [ + 12.29727687736793, + 52.227545378528944 + ], + [ + 12.28688344331793, + 52.23010245512134 + ], + [ + 12.283780377259099, + 52.23451275846623 + ], + [ + 12.264532505102203, + 52.233547427158776 + ], + [ + 12.264238204974014, + 52.23688951265326 + ], + [ + 12.275263787841602, + 52.236273856707186 + ], + [ + 12.270510700832308, + 52.24176306995655 + ], + [ + 12.258007991738445, + 52.24315304066437 + ], + [ + 12.261547086238455, + 52.24598054295536 + ], + [ + 12.244460237494328, + 52.2480021129451 + ], + [ + 12.254671782980122, + 52.261885139018645 + ], + [ + 12.250944382099107, + 52.2725939560245 + ], + [ + 12.262765171239812, + 52.29507163079877 + ], + [ + 12.308127561583808, + 52.3446965302261 + ], + [ + 12.283811380958609, + 52.36425454467519 + ], + [ + 12.286094407070037, + 52.368876320111006 + ], + [ + 12.300648289569462, + 52.37108682833686 + ], + [ + 12.305989507663277, + 52.377433241511284 + ], + [ + 12.29426547362071, + 52.381419995424366 + ], + [ + 12.291807441306318, + 52.3861436086986 + ], + [ + 12.303291610383866, + 52.3975496648098 + ], + [ + 12.302325983568577, + 52.405012810843985 + ], + [ + 12.299401275705398, + 52.409113794048 + ], + [ + 12.292336439608787, + 52.40753710423069 + ], + [ + 12.274842409267956, + 52.41226760810093 + ], + [ + 12.274469663985256, + 52.41606189023258 + ], + [ + 12.29698963626266, + 52.42377807809482 + ], + [ + 12.289252413631598, + 52.43069493104431 + ], + [ + 12.302675222610283, + 52.43449313804071 + ], + [ + 12.307568268886431, + 52.44430900388483 + ], + [ + 12.303247387746636, + 52.44595709838621 + ], + [ + 12.304342700357411, + 52.45050151710541 + ], + [ + 12.316683685521115, + 52.45238484699951 + ], + [ + 12.315081151821952, + 52.460460210532425 + ], + [ + 12.325116194381959, + 52.464230586935955 + ], + [ + 12.33078152882971, + 52.478555663336195 + ], + [ + 12.315935042392613, + 52.47502032609106 + ], + [ + 12.308728688376352, + 52.47897892842061 + ], + [ + 12.30936124324888, + 52.486264840672234 + ], + [ + 12.315872577980496, + 52.49059265172673 + ], + [ + 12.327666001761674, + 52.491412766198465 + ], + [ + 12.330383932113609, + 52.49636731679153 + ], + [ + 12.310129229655926, + 52.490761310945985 + ], + [ + 12.297479052311655, + 52.496177393067356 + ], + [ + 12.293906418194583, + 52.4922607184812 + ], + [ + 12.286198439462177, + 52.49257520487434 + ], + [ + 12.27845001580256, + 52.48714910906327 + ], + [ + 12.271445310455395, + 52.487480836304165 + ], + [ + 12.270005176112736, + 52.49367108555585 + ], + [ + 12.262451996972239, + 52.49547016028787 + ], + [ + 12.270083395973176, + 52.50099835866717 + ], + [ + 12.25992174429509, + 52.50423264272382 + ], + [ + 12.258216197437026, + 52.51788539938599 + ], + [ + 12.246767471591996, + 52.51886145785753 + ], + [ + 12.235559416666307, + 52.52378183113772 + ], + [ + 12.22399820624656, + 52.511525453582486 + ], + [ + 12.227764066073686, + 52.50594845673047 + ], + [ + 12.221679469669168, + 52.50066541673264 + ], + [ + 12.211499985839374, + 52.50313123239177 + ], + [ + 12.202723719928064, + 52.49754365627698 + ], + [ + 12.190584762907953, + 52.49886601605432 + ], + [ + 12.184730556848118, + 52.49604260304967 + ], + [ + 12.170367014375936, + 52.506974819882664 + ], + [ + 12.167294830523584, + 52.514985406617086 + ], + [ + 12.188689499358894, + 52.53242277859245 + ], + [ + 12.179603896482448, + 52.53366350788512 + ], + [ + 12.173888411752207, + 52.53869239761824 + ], + [ + 12.158198181666338, + 52.53421666404987 + ], + [ + 12.154636380025151, + 52.529696391808066 + ], + [ + 12.141811422902686, + 52.52839423804555 + ], + [ + 12.159060053459925, + 52.56069452167769 + ], + [ + 12.181078091048464, + 52.575177083102425 + ], + [ + 12.173384733153195, + 52.582254893631735 + ], + [ + 12.176565309591696, + 52.606469207901796 + ], + [ + 12.170287782809515, + 52.60769850420664 + ], + [ + 12.175568365917501, + 52.61733042238184 + ], + [ + 12.169133257831296, + 52.616753928602265 + ], + [ + 12.171973707327512, + 52.62593395122532 + ], + [ + 12.20353703951854, + 52.61874612424342 + ], + [ + 12.212648480757704, + 52.625099895475415 + ], + [ + 12.236872557387432, + 52.628877018049685 + ], + [ + 12.230845915072923, + 52.62975502832286 + ], + [ + 12.231001579714828, + 52.63988964409219 + ], + [ + 12.236677148475703, + 52.64097750376061 + ], + [ + 12.23789010457373, + 52.64555626293642 + ], + [ + 12.232523801597006, + 52.65361139226862 + ], + [ + 12.239352075635956, + 52.67173600908181 + ], + [ + 12.23538145959315, + 52.68036463829323 + ], + [ + 12.22681230582181, + 52.683797161115656 + ], + [ + 12.232876671190034, + 52.68904403594657 + ], + [ + 12.220878965638907, + 52.6904391851823 + ], + [ + 12.217541892486542, + 52.69982185309293 + ], + [ + 12.224185487922409, + 52.70278538937893 + ], + [ + 12.204085269093564, + 52.71344021681322 + ], + [ + 12.20984355281787, + 52.71762218676044 + ], + [ + 12.204802978903729, + 52.7198248466666 + ], + [ + 12.197548537434837, + 52.71837503216739 + ], + [ + 12.20595688818834, + 52.72651395448671 + ], + [ + 12.201294289439115, + 52.72900380543974 + ], + [ + 12.223168685716473, + 52.739747334438896 + ], + [ + 12.218424184082062, + 52.74352921599894 + ], + [ + 12.219447051074344, + 52.75091493781765 + ], + [ + 12.209433000658967, + 52.75292906776943 + ], + [ + 12.205958399174424, + 52.76091054411791 + ], + [ + 12.214868623451022, + 52.76399555943679 + ], + [ + 12.213132486056805, + 52.77360741864765 + ], + [ + 12.22351087518648, + 52.775843639087626 + ], + [ + 12.220176401694543, + 52.79012795745391 + ], + [ + 12.244659899848102, + 52.7872239781188 + ], + [ + 12.24772412924004, + 52.79651529449702 + ], + [ + 12.255581054301748, + 52.798596277118136 + ], + [ + 12.252488902627709, + 52.80373139458311 + ], + [ + 12.257536445150642, + 52.8049084834972 + ], + [ + 12.243628645155779, + 52.820775937743896 + ], + [ + 12.239683487005781, + 52.843675833484866 + ], + [ + 12.231875311983282, + 52.850667333859434 + ], + [ + 12.232242025606661, + 52.86083387289671 + ], + [ + 12.217391246646462, + 52.86598448025942 + ], + [ + 12.214056297757411, + 52.861667017525725 + ], + [ + 12.209983285712687, + 52.86239890974587 + ], + [ + 12.196936529282945, + 52.877977988869965 + ], + [ + 12.172189499431763, + 52.86470204190685 + ], + [ + 12.126332945675433, + 52.85316119369582 + ], + [ + 12.133116362666728, + 52.865776104580284 + ], + [ + 12.120213078458454, + 52.87551391386617 + ], + [ + 12.122621711722227, + 52.88850154815941 + ], + [ + 12.12848543364625, + 52.89264882565125 + ], + [ + 12.12460126973499, + 52.89358590863163 + ], + [ + 12.112623069406578, + 52.875729089964665 + ], + [ + 12.081383321547447, + 52.87708187887076 + ], + [ + 12.076475091501278, + 52.88639642260409 + ], + [ + 12.066279895330126, + 52.883730176009045 + ], + [ + 12.067544846557961, + 52.886140754308684 + ], + [ + 12.060866136048112, + 52.88816821009722 + ], + [ + 12.048152622751392, + 52.88591360424143 + ], + [ + 12.042999626589564, + 52.88885315254452 + ], + [ + 12.022614192869284, + 52.890370255726936 + ], + [ + 12.006119543033558, + 52.887461929055526 + ], + [ + 12.005318257413709, + 52.88179761247011 + ], + [ + 11.990478383073985, + 52.88121615975248 + ], + [ + 11.9872514468321, + 52.876732490891996 + ], + [ + 11.98155025179862, + 52.87602878346638 + ], + [ + 11.959444743488724, + 52.879927577735565 + ], + [ + 11.948984159189415, + 52.887675786137855 + ], + [ + 11.932252961044343, + 52.891578948669796 + ], + [ + 11.897335379673766, + 52.89336244213151 + ], + [ + 11.871508372490641, + 52.908873823375195 + ], + [ + 11.833997502725467, + 52.910361115778535 + ], + [ + 11.825011417963875, + 52.91577353927553 + ], + [ + 11.823092136651516, + 52.923257635714975 + ], + [ + 11.847927457128998, + 52.94103150466441 + ], + [ + 11.846029989683025, + 52.95159975947097 + ], + [ + 11.828901276089043, + 52.957273415315754 + ], + [ + 11.786303885337125, + 52.96095827329932 + ], + [ + 11.764192987041746, + 52.981411403690856 + ], + [ + 11.742989968775428, + 52.98871467784947 + ], + [ + 11.731284184360414, + 52.98837498762842 + ], + [ + 11.702569301829193, + 52.9778094776993 + ], + [ + 11.690240925201136, + 52.979126390964474 + ], + [ + 11.68302479468409, + 52.986155808514965 + ], + [ + 11.68405775948904, + 52.999740238488044 + ], + [ + 11.67803865780961, + 53.00766566437223 + ], + [ + 11.667996035986475, + 53.00951553578221 + ], + [ + 11.644667587132226, + 53.005484144861384 + ], + [ + 11.626327035647721, + 53.01264736889982 + ], + [ + 11.62702945263579, + 53.02166134381905 + ], + [ + 11.641496738003003, + 53.03285488274124 + ], + [ + 11.63758075762767, + 53.039499614506624 + ], + [ + 11.622004003293476, + 53.04170273317781 + ], + [ + 11.588713305411906, + 53.03520751075152 + ], + [ + 11.565951940771473, + 53.04073993460636 + ], + [ + 11.54810372846739, + 53.052393360639364 + ], + [ + 11.526267757505645, + 53.046933005416385 + ], + [ + 11.509870537968055, + 53.04751934750544 + ], + [ + 11.49670196366243, + 53.0523745273058 + ], + [ + 11.463774738935584, + 53.07442225637836 + ], + [ + 11.448379406431652, + 53.07838158059642 + ], + [ + 11.402588917846927, + 53.072372727176095 + ], + [ + 11.353390665378097, + 53.05460267529505 + ], + [ + 11.340203559260011, + 53.054757113137086 + ], + [ + 11.31188816963654, + 53.076165057484474 + ], + [ + 11.273159370810479, + 53.09721873602502 + ], + [ + 11.267754386551411, + 53.10419283653215 + ], + [ + 11.265731920701217, + 53.12197789416601 + ], + [ + 11.282967054738148, + 53.12143720417901 + ], + [ + 11.29041744197146, + 53.11690346266199 + ], + [ + 11.31024784267957, + 53.1162342203974 + ], + [ + 11.317235508941076, + 53.12000826992774 + ], + [ + 11.3366175147458, + 53.11374620292129 + ], + [ + 11.359020823117408, + 53.116317334488684 + ], + [ + 11.370908392713709, + 53.1115558586168 + ], + [ + 11.386792657593046, + 53.11255116258724 + ], + [ + 11.393767787124393, + 53.110302570283785 + ], + [ + 11.400568233142858, + 53.11581842805746 + ], + [ + 11.391800969450808, + 53.12965422498328 + ], + [ + 11.395627505148992, + 53.140000238410344 + ], + [ + 11.413903223000336, + 53.13669801199715 + ], + [ + 11.421764244077886, + 53.140948355835974 + ], + [ + 11.438672634578998, + 53.13669280746192 + ], + [ + 11.460835197559451, + 53.14023122260026 + ], + [ + 11.473707469937239, + 53.1346094417258 + ], + [ + 11.473430083400418, + 53.12725149114758 + ], + [ + 11.48408134151456, + 53.129033363701666 + ], + [ + 11.500484063741931, + 53.12642114422363 + ], + [ + 11.502223232336524, + 53.121386088956854 + ], + [ + 11.510049322711572, + 53.12554328035426 + ], + [ + 11.534572128981582, + 53.12531834683707 + ], + [ + 11.536372312630558, + 53.129242015358585 + ], + [ + 11.548510907998248, + 53.13082253217899 + ], + [ + 11.54694280643412, + 53.13474633990575 + ], + [ + 11.555961848346486, + 53.13877893532739 + ], + [ + 11.550083332351415, + 53.15107432951107 + ], + [ + 11.556524810771554, + 53.15041946232552 + ], + [ + 11.555869293026042, + 53.15409398852689 + ], + [ + 11.569364934847982, + 53.166094856289895 + ], + [ + 11.562541792266334, + 53.17535067597735 + ], + [ + 11.56707970607861, + 53.18249488122587 + ], + [ + 11.557823813697683, + 53.18485856832438 + ], + [ + 11.560579867103595, + 53.20267318469532 + ], + [ + 11.551317200250615, + 53.20854674447648 + ], + [ + 11.562320506061438, + 53.21281161740709 + ], + [ + 11.57563693303471, + 53.211960483279114 + ], + [ + 11.58664008305401, + 53.21471748077994 + ], + [ + 11.603644288865592, + 53.227434288932976 + ], + [ + 11.617227712972648, + 53.23031121929637 + ], + [ + 11.61975628975109, + 53.23810836154007 + ], + [ + 11.628762122828872, + 53.24239249950526 + ], + [ + 11.640199165644786, + 53.23864798150502 + ], + [ + 11.65545796071717, + 53.23955224399295 + ], + [ + 11.667011121151399, + 53.24421851074625 + ], + [ + 11.690951935002968, + 53.24175642059293 + ], + [ + 11.700389817024702, + 53.24415001299734 + ], + [ + 11.714625445373326, + 53.23050765260754 + ], + [ + 11.727526667983396, + 53.23166458161582 + ], + [ + 11.729017504816616, + 53.217053515542645 + ], + [ + 11.748356827096567, + 53.219911952156394 + ], + [ + 11.769071031935896, + 53.227491112017894 + ], + [ + 11.808470315863532, + 53.226448738757355 + ], + [ + 11.828893642032309, + 53.228655024317426 + ], + [ + 11.831880829079369, + 53.23464503342966 + ], + [ + 11.817224964269498, + 53.24525139608887 + ], + [ + 11.80369182907764, + 53.24662185115996 + ], + [ + 11.796115927372416, + 53.25365688059163 + ], + [ + 11.816670405106793, + 53.25418942550615 + ], + [ + 11.86174684215571, + 53.248216918551975 + ], + [ + 11.866859037153239, + 53.25655141653971 + ], + [ + 11.88986116744363, + 53.269051126874125 + ], + [ + 11.892603005445805, + 53.2789811287978 + ], + [ + 11.904701494280232, + 53.27459043956443 + ], + [ + 11.94541785308124, + 53.274335938544766 + ], + [ + 11.949458598560186, + 53.27179811013475 + ], + [ + 11.965708626780344, + 53.285226268314794 + ], + [ + 11.973857892373013, + 53.29915948765036 + ], + [ + 11.986470174833206, + 53.299825420159394 + ], + [ + 11.987695475120107, + 53.295661067686275 + ], + [ + 11.997066745008716, + 53.293905635890496 + ], + [ + 12.002820551528655, + 53.29964426746239 + ], + [ + 12.018530147864512, + 53.29959472078551 + ], + [ + 12.023639492292483, + 53.30414308499181 + ], + [ + 12.01850605061246, + 53.315434691782436 + ], + [ + 12.022075129323888, + 53.321288747474654 + ], + [ + 12.014610854425943, + 53.33442359863308 + ], + [ + 12.038711890500261, + 53.34508211596349 + ], + [ + 12.057339345280234, + 53.34934209745194 + ], + [ + 12.04740381831178, + 53.36123918617707 + ], + [ + 12.051371611380386, + 53.366868813526025 + ], + [ + 12.045284958893362, + 53.37098764327016 + ], + [ + 12.061623469083678, + 53.37141940588385 + ], + [ + 12.077546786993818, + 53.369386812620306 + ], + [ + 12.082077564321056, + 53.346298661364926 + ], + [ + 12.092089178747614, + 53.344856408151315 + ], + [ + 12.10917305347315, + 53.3438061050489 + ], + [ + 12.108576477187041, + 53.349664995792224 + ], + [ + 12.134450321604772, + 53.34843037667571 + ], + [ + 12.139441255370922, + 53.361416720778315 + ], + [ + 12.141261634201665, + 53.359055147188926 + ], + [ + 12.151951146496405, + 53.3615052343245 + ], + [ + 12.156507838265245, + 53.34971713535692 + ], + [ + 12.168560473525911, + 53.3391169786147 + ], + [ + 12.186848422740574, + 53.34333491440908 + ], + [ + 12.185970017679711, + 53.350282803624026 + ], + [ + 12.191119706636828, + 53.353951088945905 + ], + [ + 12.212185135173677, + 53.353161061384284 + ], + [ + 12.22943532941068, + 53.35816053072821 + ], + [ + 12.23643016386807, + 53.3419790132648 + ], + [ + 12.245293925370998, + 53.33301353927523 + ], + [ + 12.260007360507814, + 53.32772280583779 + ], + [ + 12.260207483207, + 53.323912182461704 + ], + [ + 12.291303295422482, + 53.328676787324994 + ], + [ + 12.310765272233963, + 53.32724170738088 + ], + [ + 12.311021588057542, + 53.323218160027515 + ], + [ + 12.342998587559382, + 53.315915207144506 + ], + [ + 12.363312773953895, + 53.306711316116434 + ], + [ + 12.394247807879589, + 53.301805353837985 + ], + [ + 12.398232220894132, + 53.29465907834695 + ], + [ + 12.391832331107056, + 53.28505686237156 + ], + [ + 12.400425054059001, + 53.279186189401685 + ], + [ + 12.409842759479716, + 53.27967993884586 + ], + [ + 12.428008561564077, + 53.27498756165929 + ], + [ + 12.43157987681481, + 53.262580218125194 + ], + [ + 12.445312163573385, + 53.24992826272 + ], + [ + 12.467090952479067, + 53.256234229367934 + ], + [ + 12.497630933538975, + 53.25520086974752 + ], + [ + 12.50278576638851, + 53.25777820838144 + ], + [ + 12.502400594580415, + 53.26217228722753 + ], + [ + 12.529768323104001, + 53.264788319871386 + ], + [ + 12.549913352980516, + 53.26198049888386 + ], + [ + 12.606046711850986, + 53.244395455921676 + ], + [ + 12.62841923590438, + 53.25455521331564 + ], + [ + 12.660937691084268, + 53.25440286901241 + ], + [ + 12.668288589210938, + 53.24816447981228 + ], + [ + 12.675657612159778, + 53.24771916092771 + ], + [ + 12.666239815044197, + 53.24155558942259 + ], + [ + 12.669438776736637, + 53.23711085229214 + ], + [ + 12.663967039252606, + 53.234950597020706 + ], + [ + 12.671179074702314, + 53.22950464427927 + ], + [ + 12.722738168880474, + 53.22166880488693 + ], + [ + 12.74695669458334, + 53.22563040177645 + ], + [ + 12.757585676653834, + 53.224232766755975 + ], + [ + 12.749508544473503, + 53.20632811725749 + ], + [ + 12.739492981764148, + 53.19960159048524 + ], + [ + 12.759146610511127, + 53.19500350614855 + ], + [ + 12.764381357098497, + 53.18893054526703 + ], + [ + 12.78492043385946, + 53.187844749828216 + ], + [ + 12.790276595346223, + 53.191233873806915 + ], + [ + 12.799087274216253, + 53.19106867941956 + ], + [ + 12.808879483372271, + 53.197647027104274 + ], + [ + 12.81292538434751, + 53.197408771354404 + ], + [ + 12.810259420727794, + 53.19539973674536 + ], + [ + 12.81487183682584, + 53.19197620038474 + ], + [ + 12.817167562976923, + 53.19606053213395 + ], + [ + 12.82078748440408, + 53.19341995682338 + ], + [ + 12.824692307489283, + 53.19705096554576 + ], + [ + 12.837911673819045, + 53.19725783184835 + ], + [ + 12.845979183686255, + 53.20140215240422 + ], + [ + 12.858871614185263, + 53.18817731201022 + ], + [ + 12.868143487525366, + 53.18721572216953 + ], + [ + 12.880109597913071, + 53.17969011624764 + ], + [ + 12.889492297457002, + 53.180404711326524 + ], + [ + 12.892039930376825, + 53.187950268670264 + ], + [ + 12.912841904238281, + 53.195174150900385 + ], + [ + 12.929737504020013, + 53.194417218838566 + ], + [ + 12.919965668098628, + 53.18637684695818 + ], + [ + 12.934397869560483, + 53.18822704856015 + ], + [ + 12.942431011067073, + 53.1859265227484 + ], + [ + 12.943927325782239, + 53.190922637373454 + ], + [ + 12.937114712508833, + 53.19431551018211 + ], + [ + 12.947207073366334, + 53.19915946610658 + ], + [ + 12.964244871625205, + 53.200391511809265 + ], + [ + 12.976586947098529, + 53.19773214682348 + ], + [ + 12.979433532356008, + 53.19055156983593 + ], + [ + 12.941998414459887, + 53.1743154690227 + ], + [ + 12.947271596946058, + 53.172501302408975 + ], + [ + 12.961513638003105, + 53.177737670049225 + ], + [ + 12.968517509473067, + 53.166366298884256 + ], + [ + 12.980466332488923, + 53.16252656651348 + ], + [ + 12.991544408314017, + 53.16855505450378 + ], + [ + 13.00620360567505, + 53.167284673906146 + ], + [ + 13.009133314598165, + 53.17285008804932 + ], + [ + 13.020037207367928, + 53.17570996917992 + ], + [ + 13.0187274987223, + 53.18524596519173 + ], + [ + 13.02801118860066, + 53.1855914159149 + ], + [ + 13.042414509195057, + 53.19649940180966 + ], + [ + 13.069129516265741, + 53.203640371161974 + ], + [ + 13.079532890371828, + 53.20018375351221 + ], + [ + 13.07843184842566, + 53.20466796482851 + ], + [ + 13.087270011387659, + 53.215400157033216 + ], + [ + 13.093809081146192, + 53.2170881337396 + ], + [ + 13.097091843477559, + 53.21304928186143 + ], + [ + 13.10645216013818, + 53.21527764395387 + ], + [ + 13.108277658074892, + 53.225549369079914 + ], + [ + 13.103262173735708, + 53.23554035470529 + ], + [ + 13.109925574031692, + 53.24022827444652 + ], + [ + 13.118353667970013, + 53.24128060427803 + ], + [ + 13.132976753765414, + 53.237317540619685 + ], + [ + 13.137411603334204, + 53.244618114010784 + ], + [ + 13.15193008393299, + 53.25108836949428 + ], + [ + 13.152505881159895, + 53.24624816787554 + ], + [ + 13.16379645820794, + 53.24975994875721 + ], + [ + 13.175203910628513, + 53.24717577250282 + ], + [ + 13.181914293530877, + 53.25073407124972 + ], + [ + 13.20268101018945, + 53.22212072046235 + ], + [ + 13.229391856157877, + 53.216586894876095 + ], + [ + 13.238833468472968, + 53.22550966491718 + ], + [ + 13.23965135137384, + 53.23894298372442 + ], + [ + 13.251243005745252, + 53.24738983754913 + ], + [ + 13.24375124792105, + 53.24869111490479 + ], + [ + 13.252714247667479, + 53.26230544076827 + ], + [ + 13.27531389232599, + 53.265060792883425 + ], + [ + 13.284415602640163, + 53.27567465559215 + ], + [ + 13.297801778454899, + 53.28089250070041 + ], + [ + 13.33707571235413, + 53.273427815238826 + ], + [ + 13.349203210186266, + 53.27825848517706 + ], + [ + 13.36045059902044, + 53.27799893232217 + ], + [ + 13.368601805260237, + 53.27103783293513 + ], + [ + 13.370632438208634, + 53.26175920407404 + ], + [ + 13.38220544704102, + 53.25039680797982 + ], + [ + 13.38611000536222, + 53.25047580986594 + ], + [ + 13.386417975549177, + 53.24411678793182 + ], + [ + 13.405174674132697, + 53.246418234321155 + ], + [ + 13.407683756115375, + 53.26263085879585 + ], + [ + 13.413260237509542, + 53.26302015547943 + ], + [ + 13.420875469716059, + 53.26958704155276 + ], + [ + 13.431510176888882, + 53.28455101153434 + ], + [ + 13.435129710556508, + 53.28278236287559 + ], + [ + 13.44240133013741, + 53.28648496317305 + ], + [ + 13.434024055371982, + 53.29029266023592 + ], + [ + 13.438730754245995, + 53.291987966208175 + ], + [ + 13.434949826079007, + 53.2947230141314 + ], + [ + 13.438231700952949, + 53.299807537840145 + ], + [ + 13.456185331636, + 53.29795499260923 + ], + [ + 13.461282869901881, + 53.28869303818295 + ], + [ + 13.483063872294752, + 53.291203395360114 + ], + [ + 13.497327260664115, + 53.302231627862454 + ], + [ + 13.496419038597947, + 53.30663297299122 + ], + [ + 13.507267351722025, + 53.31623291061068 + ], + [ + 13.502842523932943, + 53.32733324392135 + ], + [ + 13.510114439671518, + 53.317449414915764 + ], + [ + 13.523531386266077, + 53.32008458279725 + ], + [ + 13.519633995260612, + 53.337967282387886 + ], + [ + 13.525261423753955, + 53.3510204157488 + ], + [ + 13.516854328841296, + 53.35209251438891 + ], + [ + 13.525997360699087, + 53.36634695564585 + ], + [ + 13.543424502213798, + 53.36403224316386 + ], + [ + 13.54743100365871, + 53.3718993280164 + ], + [ + 13.55636989626535, + 53.376092379042035 + ], + [ + 13.55679567776443, + 53.37963936440619 + ], + [ + 13.550206569450962, + 53.380936426491346 + ], + [ + 13.556587111971165, + 53.39156274445111 + ], + [ + 13.546206523509156, + 53.394195017411725 + ], + [ + 13.550112203732994, + 53.39908127127465 + ], + [ + 13.56406352529738, + 53.4007594598775 + ], + [ + 13.57361865008258, + 53.408093373819966 + ], + [ + 13.589311433313101, + 53.40969702569941 + ], + [ + 13.593482041294484, + 53.407784222679666 + ], + [ + 13.610508935084637, + 53.41375914241802 + ], + [ + 13.617607213135551, + 53.41301274326823 + ], + [ + 13.619049676757221, + 53.40894641712937 + ], + [ + 13.625216953353814, + 53.40930256585382 + ], + [ + 13.636017347251922, + 53.42351863460039 + ], + [ + 13.628841215210109, + 53.431999781828175 + ], + [ + 13.637299503676525, + 53.43258406588457 + ], + [ + 13.638886397982901, + 53.43805545787316 + ], + [ + 13.633898244800045, + 53.43986754623057 + ], + [ + 13.640500226967305, + 53.44723875102921 + ], + [ + 13.651289688548617, + 53.44369090238775 + ], + [ + 13.66256231805055, + 53.457739649908696 + ], + [ + 13.702992186910219, + 53.473645171574745 + ], + [ + 13.715399780529161, + 53.48226087679135 + ], + [ + 13.735781326959247, + 53.48141305505548 + ], + [ + 13.741372836177598, + 53.48580699817795 + ], + [ + 13.75297612807133, + 53.478275582481324 + ], + [ + 13.77893925700333, + 53.474215230174075 + ], + [ + 13.802029983301834, + 53.478027069315715 + ], + [ + 13.812126823679137, + 53.48429637578012 + ], + [ + 13.827102381680731, + 53.498713706390646 + ], + [ + 13.809829415664822, + 53.50212029734321 + ], + [ + 13.801283437421079, + 53.49822968089819 + ], + [ + 13.792463026913126, + 53.51094196055818 + ], + [ + 13.77765738864566, + 53.51370533784851 + ], + [ + 13.780431034948649, + 53.521553032865 + ], + [ + 13.776376073849724, + 53.53129005934471 + ], + [ + 13.78424189093473, + 53.5518362659649 + ], + [ + 13.791347174739661, + 53.55857792790511 + ], + [ + 13.80057052128722, + 53.55825461877525 + ] + ], + [ + [ + 13.47176748650176, + 52.67192958187978 + ], + [ + 13.465965381099604, + 52.66714855830231 + ], + [ + 13.459511426270637, + 52.668935587074664 + ], + [ + 13.450840916554691, + 52.6627221734393 + ], + [ + 13.462333170346469, + 52.65746449756994 + ], + [ + 13.473894060638683, + 52.65661361262786 + ], + [ + 13.469996224777784, + 52.65207483848825 + ], + [ + 13.459848419332124, + 52.64810317592455 + ], + [ + 13.440932072346827, + 52.649123019220966 + ], + [ + 13.439898545616895, + 52.64533252160048 + ], + [ + 13.434104109196312, + 52.64428548707699 + ], + [ + 13.433778784120202, + 52.6379759668492 + ], + [ + 13.424365184794564, + 52.63563045961624 + ], + [ + 13.412828152830997, + 52.64358542496614 + ], + [ + 13.406997439698497, + 52.64242099792655 + ], + [ + 13.39671209288589, + 52.64830139548784 + ], + [ + 13.388682711663687, + 52.63761389252857 + ], + [ + 13.374375347405548, + 52.631521598712126 + ], + [ + 13.37599292988617, + 52.62929259364679 + ], + [ + 13.357296056793285, + 52.62317467253583 + ], + [ + 13.34461342106865, + 52.62476549382138 + ], + [ + 13.336480521255035, + 52.62267108738835 + ], + [ + 13.313121838258526, + 52.62838271306978 + ], + [ + 13.302422602937773, + 52.62756060095074 + ], + [ + 13.3083090294553, + 52.62969153257978 + ], + [ + 13.303111836210514, + 52.636669187291496 + ], + [ + 13.307860409256318, + 52.63762074259227 + ], + [ + 13.30925742111627, + 52.64314038992002 + ], + [ + 13.300377555118198, + 52.653469840548084 + ], + [ + 13.310033892187887, + 52.657376007515005 + ], + [ + 13.282884651787459, + 52.66078466659798 + ], + [ + 13.282440708991022, + 52.641295356974396 + ], + [ + 13.262156275317246, + 52.640752987437736 + ], + [ + 13.264274727039233, + 52.62692796916948 + ], + [ + 13.220683272035087, + 52.628178719738266 + ], + [ + 13.216984649258725, + 52.620118561030345 + ], + [ + 13.201606488949269, + 52.606381327665474 + ], + [ + 13.217819501372333, + 52.59322170929286 + ], + [ + 13.217336441508346, + 52.58745559153984 + ], + [ + 13.20662630796477, + 52.586742461660606 + ], + [ + 13.164263157199523, + 52.59890032948228 + ], + [ + 13.146851697378532, + 52.59074081922088 + ], + [ + 13.128987291145354, + 52.58744210283722 + ], + [ + 13.132092465133233, + 52.57969904159347 + ], + [ + 13.14960326570009, + 52.583310954424164 + ], + [ + 13.152953085280066, + 52.57278142537554 + ], + [ + 13.145664778982118, + 52.55291135730326 + ], + [ + 13.136295813658677, + 52.55274763245411 + ], + [ + 13.130617438314946, + 52.556353968498584 + ], + [ + 13.117392920151492, + 52.51699532573026 + ], + [ + 13.143010192757826, + 52.51967552467996 + ], + [ + 13.166457606026018, + 52.51012428880995 + ], + [ + 13.125284573237428, + 52.480217680418214 + ], + [ + 13.11779829996098, + 52.478967935726786 + ], + [ + 13.110798676712134, + 52.466063011395164 + ], + [ + 13.109223276102474, + 52.45061950821195 + ], + [ + 13.123176542637212, + 52.43936454618781 + ], + [ + 13.104618625762251, + 52.42405321668389 + ], + [ + 13.09959688446257, + 52.42530475191539 + ], + [ + 13.088333217867776, + 52.41961143497985 + ], + [ + 13.090635996837586, + 52.41181388309701 + ], + [ + 13.097294256065382, + 52.40938448190442 + ], + [ + 13.09722150658276, + 52.412454655270274 + ], + [ + 13.103225064691978, + 52.410222421588415 + ], + [ + 13.11157057498546, + 52.41313661880734 + ], + [ + 13.112596392883901, + 52.4100190750766 + ], + [ + 13.10793181362841, + 52.4094775228816 + ], + [ + 13.111635765489082, + 52.40422327898881 + ], + [ + 13.124875684180239, + 52.39687959063462 + ], + [ + 13.136201770121717, + 52.39861141295782 + ], + [ + 13.138116669253519, + 52.39539271030993 + ], + [ + 13.12746490158974, + 52.391594552438576 + ], + [ + 13.1309895223738, + 52.38722485163279 + ], + [ + 13.142612287742288, + 52.39654478776495 + ], + [ + 13.158888703501859, + 52.39390889801813 + ], + [ + 13.171521555600211, + 52.3958334613179 + ], + [ + 13.171356688541376, + 52.39776296127593 + ], + [ + 13.157827475983888, + 52.39636215655254 + ], + [ + 13.159345750711148, + 52.40287994750761 + ], + [ + 13.195566839492823, + 52.41509482707546 + ], + [ + 13.22228798213338, + 52.42035668080278 + ], + [ + 13.245797291395393, + 52.42080114546168 + ], + [ + 13.249844003482911, + 52.40496478905181 + ], + [ + 13.275099947938966, + 52.40529314969727 + ], + [ + 13.296130131601327, + 52.416451284828604 + ], + [ + 13.311926097251293, + 52.39918547139946 + ], + [ + 13.343248652845482, + 52.41161993837087 + ], + [ + 13.34302847784194, + 52.40767416889929 + ], + [ + 13.372135215904915, + 52.393823824387674 + ], + [ + 13.370454230855316, + 52.38846389934645 + ], + [ + 13.387216841189247, + 52.38858416332825 + ], + [ + 13.388520781676414, + 52.37796846551052 + ], + [ + 13.420984875859583, + 52.376247141406104 + ], + [ + 13.427585365174316, + 52.386823991724775 + ], + [ + 13.418772685611415, + 52.40991740587664 + ], + [ + 13.462321602382982, + 52.42062443564776 + ], + [ + 13.468337475865631, + 52.419431966448634 + ], + [ + 13.4798849976895, + 52.39599663334532 + ], + [ + 13.51516508605631, + 52.40143491237012 + ], + [ + 13.528263237841868, + 52.39839621535205 + ], + [ + 13.538379367186774, + 52.40067906394248 + ], + [ + 13.53566361327925, + 52.38901045454495 + ], + [ + 13.564905285780613, + 52.38828583968813 + ], + [ + 13.592762116551553, + 52.39416968687635 + ], + [ + 13.606959087352894, + 52.374981432205935 + ], + [ + 13.627949923600125, + 52.3817906688727 + ], + [ + 13.633391386446739, + 52.37628388896052 + ], + [ + 13.643364632897185, + 52.37739092555897 + ], + [ + 13.641696955149175, + 52.370953942028656 + ], + [ + 13.64680609080879, + 52.37016052627582 + ], + [ + 13.647105427892695, + 52.366875467220886 + ], + [ + 13.638637532318622, + 52.360161678222426 + ], + [ + 13.636291071051152, + 52.347037924633575 + ], + [ + 13.648400720507018, + 52.338241834876456 + ], + [ + 13.671080360664195, + 52.36635565659906 + ], + [ + 13.680318766045026, + 52.36931591374573 + ], + [ + 13.69056410346979, + 52.36737871018306 + ], + [ + 13.699997283208361, + 52.37512134015785 + ], + [ + 13.698633152878639, + 52.3815850401381 + ], + [ + 13.688061986130233, + 52.382910365706095 + ], + [ + 13.68756177318581, + 52.38582351599059 + ], + [ + 13.716436628926136, + 52.39952743633208 + ], + [ + 13.723344804040657, + 52.39858611408224 + ], + [ + 13.734537746247797, + 52.40197606842484 + ], + [ + 13.738749107474785, + 52.40732177598609 + ], + [ + 13.72951353597843, + 52.41739346647727 + ], + [ + 13.74138452582788, + 52.42691596304363 + ], + [ + 13.737958595131047, + 52.43413775841456 + ], + [ + 13.743118129980322, + 52.433998688672716 + ], + [ + 13.750536117610348, + 52.44145895520405 + ], + [ + 13.754215102892989, + 52.44161149870714 + ], + [ + 13.752296088098218, + 52.43708146072386 + ], + [ + 13.75958721830799, + 52.43627188234686 + ], + [ + 13.759028643932263, + 52.4425793645835 + ], + [ + 13.754107209846588, + 52.44317174302952 + ], + [ + 13.753219910938741, + 52.447597658575916 + ], + [ + 13.729112160282556, + 52.45059682291475 + ], + [ + 13.716447654347183, + 52.46219428867641 + ], + [ + 13.701324132551866, + 52.46814548160447 + ], + [ + 13.705365294119579, + 52.45576642717114 + ], + [ + 13.69843270100847, + 52.455080218438816 + ], + [ + 13.696824929872955, + 52.464160445828995 + ], + [ + 13.682599379301925, + 52.466184849917205 + ], + [ + 13.670661019458446, + 52.473061990223954 + ], + [ + 13.648215009841588, + 52.4787819591035 + ], + [ + 13.640613123533997, + 52.47948463179535 + ], + [ + 13.625808037719068, + 52.47371335501994 + ], + [ + 13.625508626424681, + 52.46835650756556 + ], + [ + 13.611517293139247, + 52.47062733354762 + ], + [ + 13.616397384315563, + 52.474893529409485 + ], + [ + 13.615010814624249, + 52.48082505545475 + ], + [ + 13.63080043499889, + 52.49412005047891 + ], + [ + 13.624670747694312, + 52.49518426233799 + ], + [ + 13.633318829815169, + 52.511826186839485 + ], + [ + 13.65857246404998, + 52.52581115154783 + ], + [ + 13.656895567280975, + 52.52986951137859 + ], + [ + 13.625906814056563, + 52.53014637391589 + ], + [ + 13.626732384469944, + 52.53774857081055 + ], + [ + 13.635358748904617, + 52.541628792401696 + ], + [ + 13.585387117744295, + 52.548471641831796 + ], + [ + 13.587494308559517, + 52.555267017768706 + ], + [ + 13.581539701887284, + 52.570881941777444 + ], + [ + 13.567569498315883, + 52.57374012678187 + ], + [ + 13.547112099867071, + 52.587884765384835 + ], + [ + 13.522430212047652, + 52.59285250167773 + ], + [ + 13.508153615271706, + 52.59218325574802 + ], + [ + 13.496752284616644, + 52.60509353816211 + ], + [ + 13.505817351153057, + 52.62582838120896 + ], + [ + 13.517698657354217, + 52.62963591839791 + ], + [ + 13.523100123203587, + 52.6454301940707 + ], + [ + 13.518873169550258, + 52.647470792904556 + ], + [ + 13.512781529193914, + 52.64556194906857 + ], + [ + 13.490831409724338, + 52.65472873299752 + ], + [ + 13.48529483836277, + 52.65913131845414 + ], + [ + 13.488219322030474, + 52.67055116500835 + ], + [ + 13.47564769432055, + 52.66628065569466 + ], + [ + 13.478789977213793, + 52.673452519811775 + ], + [ + 13.475393917006656, + 52.67491714875839 + ], + [ + 13.47176748650176, + 52.67192958187978 + ] + ] + ], + [ + [ + [ + 12.267155795433219, + 52.23131355623263 + ], + [ + 12.27047351975968, + 52.23110260105865 + ], + [ + 12.27520404478649, + 52.231050547405886 + ], + [ + 12.273664259190591, + 52.22877921525417 + ], + [ + 12.267155795433219, + 52.23131355623263 + ] + ] + ], + [ + [ + [ + 12.286255987354949, + 52.22745841730614 + ], + [ + 12.285081123451066, + 52.22701710849674 + ], + [ + 12.276546163012322, + 52.22829564683909 + ], + [ + 12.279125022722512, + 52.22941792462207 + ], + [ + 12.286255987354949, + 52.22745841730614 + ] + ] + ], + [ + [ + [ + 12.219077200736326, + 52.86085862276213 + ], + [ + 12.217115000476344, + 52.86199253736818 + ], + [ + 12.221316313464374, + 52.86381264775275 + ], + [ + 12.222307576461075, + 52.862548545960884 + ], + [ + 12.219077200736326, + 52.86085862276213 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "03", + "AGS": "03", + "SDV_RS": "032410001001", + "GEN": "Niedersachsen", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "03", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE9", + "RS_0": "030000000000", + "AGS_0": "03000000", + "WSK": "2015/01/01", + "DEBKG_ID": "DEBKGDL20000E6EW", + "destatis": { + "population": 7826739, + "population_m": 3846089, + "population_w": 3980650 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 8.687338331952079, + 53.88976287999694 + ], + [ + 8.683265230304176, + 53.88713359968913 + ], + [ + 8.68667262002164, + 53.8805698603959 + ], + [ + 8.693838838076523, + 53.87646879867565 + ], + [ + 8.702246495001104, + 53.87871119131861 + ], + [ + 8.7284785113449, + 53.85970540329102 + ], + [ + 8.726448961954606, + 53.85766366560107 + ], + [ + 8.774316178549707, + 53.83805637542127 + ], + [ + 8.795931292573423, + 53.833216353526694 + ], + [ + 8.82406830728806, + 53.83184512322059 + ], + [ + 8.834581416481361, + 53.83418794087081 + ], + [ + 8.859428901464465, + 53.83029516615266 + ], + [ + 8.907024936982692, + 53.82856150161718 + ], + [ + 8.987606819589296, + 53.84004376173873 + ], + [ + 9.022382385468616, + 53.83362774021349 + ], + [ + 9.026704103331499, + 53.82503181864426 + ], + [ + 9.030978174443876, + 53.8257383414721 + ], + [ + 9.031464752388809, + 53.829769468782914 + ], + [ + 9.020831372821018, + 53.84259795795521 + ], + [ + 9.093072404392299, + 53.86145125410873 + ], + [ + 9.157728678747523, + 53.86462949940687 + ], + [ + 9.219829132631283, + 53.86295462088432 + ], + [ + 9.274583912243124, + 53.85757776835527 + ], + [ + 9.326200691053781, + 53.826002392779955 + ], + [ + 9.36546036278582, + 53.774593148876505 + ], + [ + 9.417460896908048, + 53.72521410090667 + ], + [ + 9.493783027977564, + 53.678735858809354 + ], + [ + 9.511575292105876, + 53.6562713047716 + ], + [ + 9.518122793938156, + 53.63656510205301 + ], + [ + 9.540300467582178, + 53.61291594863832 + ], + [ + 9.55840437964424, + 53.60685940770992 + ], + [ + 9.586657164346384, + 53.58641666435822 + ], + [ + 9.615873239658637, + 53.5807791626675 + ], + [ + 9.634203151043184, + 53.57095225550009 + ], + [ + 9.648856294967974, + 53.56815153852377 + ], + [ + 9.669384298783596, + 53.5539581806775 + ], + [ + 9.684951073641475, + 53.547852358405294 + ], + [ + 9.692724683478316, + 53.54958968239307 + ], + [ + 9.698469199111898, + 53.545812896311155 + ], + [ + 9.709102538397412, + 53.54510730447811 + ], + [ + 9.711225917268347, + 53.55042679205668 + ], + [ + 9.717959764610287, + 53.55152702883055 + ], + [ + 9.726920236463267, + 53.55045053151438 + ], + [ + 9.728010876977917, + 53.54433953200157 + ], + [ + 9.741610224444939, + 53.54804920221768 + ], + [ + 9.768273960121261, + 53.545867158657416 + ], + [ + 9.772076477709113, + 53.54338611652039 + ], + [ + 9.765441705144093, + 53.541114561563866 + ], + [ + 9.778320126394242, + 53.51946144732589 + ], + [ + 9.771585437850343, + 53.52275584849359 + ], + [ + 9.763793943924538, + 53.508106504069964 + ], + [ + 9.78452477077233, + 53.500011701757394 + ], + [ + 9.782742898818771, + 53.49153897645717 + ], + [ + 9.802426169816288, + 53.493251538270876 + ], + [ + 9.799804376426085, + 53.46963746774069 + ], + [ + 9.807465885354624, + 53.46282824648053 + ], + [ + 9.835896241373785, + 53.45145011143515 + ], + [ + 9.862387477399407, + 53.42987659116133 + ], + [ + 9.861543066718188, + 53.43954318127669 + ], + [ + 9.8666525705304, + 53.44006309790462 + ], + [ + 9.86912038099791, + 53.44458409464696 + ], + [ + 9.873373449784616, + 53.442377825740216 + ], + [ + 9.895945433225203, + 53.457385000827486 + ], + [ + 9.898793191007329, + 53.45511200151591 + ], + [ + 9.90158351081832, + 53.4573226502745 + ], + [ + 9.913898934556729, + 53.44842908634777 + ], + [ + 9.92148617764988, + 53.436550149898316 + ], + [ + 9.914499716371703, + 53.430019520620164 + ], + [ + 9.916452760371266, + 53.424865668304065 + ], + [ + 9.906566144927528, + 53.41579090928585 + ], + [ + 9.916487327887177, + 53.414067878956594 + ], + [ + 9.924552483735086, + 53.41962394993759 + ], + [ + 9.942015790023667, + 53.42105241809559 + ], + [ + 9.949211967467221, + 53.43094997324981 + ], + [ + 9.963272627483008, + 53.42732103521411 + ], + [ + 9.964358565927975, + 53.42217619786358 + ], + [ + 9.970929249463458, + 53.423759372298235 + ], + [ + 9.975455462719706, + 53.42145110069919 + ], + [ + 9.974888824723008, + 53.41473534303626 + ], + [ + 9.984432872198512, + 53.41541377797747 + ], + [ + 9.996389542749169, + 53.42611291700363 + ], + [ + 10.001580055328166, + 53.42483092800273 + ], + [ + 10.009773511211693, + 53.429465158630514 + ], + [ + 10.018640369007482, + 53.429309071130625 + ], + [ + 10.029273487863055, + 53.43516432943543 + ], + [ + 10.01461347547089, + 53.442200797712744 + ], + [ + 10.020944604967063, + 53.44686279054996 + ], + [ + 10.032431613494522, + 53.443923313250906 + ], + [ + 10.035875719627825, + 53.44704577592397 + ], + [ + 10.045738931290535, + 53.44674105060025 + ], + [ + 10.049409552541954, + 53.449908891782016 + ], + [ + 10.04184924758295, + 53.45163342122589 + ], + [ + 10.042178367266906, + 53.45616395979726 + ], + [ + 10.051810704150297, + 53.46391893837159 + ], + [ + 10.084602253565926, + 53.45040106089126 + ], + [ + 10.108735530378492, + 53.42667402693863 + ], + [ + 10.136067516867483, + 53.422120619394036 + ], + [ + 10.155186905049515, + 53.405208254723 + ], + [ + 10.17568864326837, + 53.39658249827006 + ], + [ + 10.198534729920958, + 53.39860815982599 + ], + [ + 10.23764144778565, + 53.39587645059269 + ], + [ + 10.258646421546649, + 53.417784768710106 + ], + [ + 10.3063264216029, + 53.43305674800596 + ], + [ + 10.330768068198745, + 53.42496729894442 + ], + [ + 10.370533932872835, + 53.42591909294575 + ], + [ + 10.419276817589608, + 53.40214202782864 + ], + [ + 10.498919307649667, + 53.37446007363221 + ], + [ + 10.55702527018589, + 53.36872329766507 + ], + [ + 10.57492226960379, + 53.36021174746341 + ], + [ + 10.618065702036764, + 53.36986614465242 + ], + [ + 10.676000471376373, + 53.367684854555485 + ], + [ + 10.693920706572431, + 53.37066143430539 + ], + [ + 10.703123242490816, + 53.369419589277946 + ], + [ + 10.728116834654301, + 53.3572098626926 + ], + [ + 10.738086468683814, + 53.34234375003283 + ], + [ + 10.763084738531767, + 53.33885055513621 + ], + [ + 10.759653772810832, + 53.32998715604154 + ], + [ + 10.767568679746235, + 53.33046448544723 + ], + [ + 10.771590595007483, + 53.325323743891126 + ], + [ + 10.793262566560708, + 53.31556723649004 + ], + [ + 10.826197522160184, + 53.312392379976295 + ], + [ + 10.82864784272351, + 53.30691230217732 + ], + [ + 10.835805650805245, + 53.30496954437406 + ], + [ + 10.85079050377835, + 53.309996747571915 + ], + [ + 10.85392955517071, + 53.31603639516773 + ], + [ + 10.87023997291331, + 53.31771645258343 + ], + [ + 10.871702326440305, + 53.3215929341221 + ], + [ + 10.86604270970104, + 53.32691203132404 + ], + [ + 10.88053498515384, + 53.32109837359658 + ], + [ + 10.888028505409313, + 53.324381915149104 + ], + [ + 10.888503662981705, + 53.32719355386591 + ], + [ + 10.879861911768835, + 53.331300974022845 + ], + [ + 10.881727223070648, + 53.33517783894843 + ], + [ + 10.892650506529407, + 53.334307561884756 + ], + [ + 10.894713589461489, + 53.33665570168293 + ], + [ + 10.899241034348211, + 53.334196442450775 + ], + [ + 10.90967888973924, + 53.33769420465418 + ], + [ + 10.91836571295835, + 53.34796467520828 + ], + [ + 10.928245164779309, + 53.34811826215584 + ], + [ + 10.93169315226537, + 53.340827390951645 + ], + [ + 10.946762422221385, + 53.33560563621433 + ], + [ + 10.955539249184497, + 53.333461304015216 + ], + [ + 10.959360781803214, + 53.33852509120635 + ], + [ + 10.988000624628896, + 53.333426507412774 + ], + [ + 10.982661492963766, + 53.327536423291065 + ], + [ + 10.999075976447896, + 53.321023863047124 + ], + [ + 11.002257820551508, + 53.30520126260285 + ], + [ + 11.008702298027062, + 53.30063582001316 + ], + [ + 11.002985096987002, + 53.29267806236595 + ], + [ + 11.0086303898017, + 53.2918099210307 + ], + [ + 11.00945596378458, + 53.281479224422526 + ], + [ + 11.0275719855871, + 53.2789399153827 + ], + [ + 11.062258288590412, + 53.235453173252175 + ], + [ + 11.089323790948745, + 53.21464143027672 + ], + [ + 11.116758129515315, + 53.20417121431164 + ], + [ + 11.138486824829133, + 53.202504794213084 + ], + [ + 11.136510950699497, + 53.19940495722243 + ], + [ + 11.144989788576941, + 53.197778556127766 + ], + [ + 11.136703673511835, + 53.19184227867575 + ], + [ + 11.179890859658522, + 53.186677202222604 + ], + [ + 11.194111224811964, + 53.181186027403214 + ], + [ + 11.189082437178438, + 53.16561954401038 + ], + [ + 11.171861639261417, + 53.1566442013392 + ], + [ + 11.184781162735, + 53.13627486986744 + ], + [ + 11.195277988509826, + 53.13553244105529 + ], + [ + 11.21631875355316, + 53.14440029386252 + ], + [ + 11.245697267988898, + 53.13642192289616 + ], + [ + 11.267031811243136, + 53.12024375780095 + ], + [ + 11.267754386551411, + 53.10419283653215 + ], + [ + 11.273159370810479, + 53.09721873602502 + ], + [ + 11.31188816963654, + 53.076165057484474 + ], + [ + 11.33646689634611, + 53.055996439928215 + ], + [ + 11.351697748362668, + 53.05424590928744 + ], + [ + 11.402588917846927, + 53.072372727176095 + ], + [ + 11.448379406431652, + 53.07838158059642 + ], + [ + 11.463774738935584, + 53.07442225637836 + ], + [ + 11.507496841989392, + 53.04810536435914 + ], + [ + 11.526267757505645, + 53.046933005416385 + ], + [ + 11.54810372846739, + 53.052393360639364 + ], + [ + 11.569901541225715, + 53.03936577076961 + ], + [ + 11.584188939665909, + 53.035607433848334 + ], + [ + 11.597784506994486, + 53.035926368638904 + ], + [ + 11.563745870208194, + 53.01284337929095 + ], + [ + 11.559249505090884, + 53.01308032524507 + ], + [ + 11.55209003030779, + 53.00472847096072 + ], + [ + 11.560443866786269, + 53.00379970674041 + ], + [ + 11.556416553023253, + 52.99866580230831 + ], + [ + 11.543380404326527, + 52.9994524136372 + ], + [ + 11.526428490681212, + 53.00825854077587 + ], + [ + 11.512490563926427, + 53.00744492597129 + ], + [ + 11.492342519854013, + 52.95966288239679 + ], + [ + 11.505026759494879, + 52.94103266701422 + ], + [ + 11.470061657091557, + 52.938925627413724 + ], + [ + 11.454444417884464, + 52.93339689989636 + ], + [ + 11.432890608219278, + 52.91974981633731 + ], + [ + 11.426075469620686, + 52.91992350041954 + ], + [ + 11.406577800864298, + 52.90410219846193 + ], + [ + 11.392461714410839, + 52.901680110891 + ], + [ + 11.384778189302809, + 52.9035784286038 + ], + [ + 11.354534898171089, + 52.890363015977776 + ], + [ + 11.337184151572623, + 52.8883574223805 + ], + [ + 11.314250103091155, + 52.87823631788915 + ], + [ + 11.29541067026685, + 52.874906896006756 + ], + [ + 11.290662086291915, + 52.8891256608696 + ], + [ + 11.276569532593532, + 52.887532251499756 + ], + [ + 11.267238932685222, + 52.88014081117129 + ], + [ + 11.241125625865912, + 52.87901825053115 + ], + [ + 11.235763576698819, + 52.888613934469305 + ], + [ + 11.219169101578538, + 52.89268118619801 + ], + [ + 11.220645292915023, + 52.89766635432201 + ], + [ + 11.15525787274402, + 52.90621056676437 + ], + [ + 11.154666716381177, + 52.901865343505136 + ], + [ + 11.13890603237415, + 52.89834071045239 + ], + [ + 11.106405528843105, + 52.89622347804997 + ], + [ + 11.093187302358317, + 52.89947142293326 + ], + [ + 11.098675785469528, + 52.912876686874924 + ], + [ + 11.078747416575194, + 52.912964150941 + ], + [ + 11.06458786674955, + 52.9093984678501 + ], + [ + 11.039049495617327, + 52.913399310716024 + ], + [ + 11.01307637388217, + 52.909890239218974 + ], + [ + 11.002075787937091, + 52.91147667636648 + ], + [ + 10.992572500864457, + 52.90645740872054 + ], + [ + 10.985508334857066, + 52.88203313405927 + ], + [ + 10.978814440572016, + 52.87815276266845 + ], + [ + 10.968082322867126, + 52.87932071924568 + ], + [ + 10.967895794137222, + 52.87571612603384 + ], + [ + 10.939633519148424, + 52.85333550935498 + ], + [ + 10.895667013489046, + 52.85637275936312 + ], + [ + 10.892875387526125, + 52.84798245224591 + ], + [ + 10.88468358070937, + 52.84579634036977 + ], + [ + 10.866102062363368, + 52.85572598762166 + ], + [ + 10.860370625547533, + 52.85165152002535 + ], + [ + 10.841555870856915, + 52.85220486155474 + ], + [ + 10.834774625149775, + 52.84747505566994 + ], + [ + 10.80055300489874, + 52.85029181118828 + ], + [ + 10.79614705351651, + 52.84364187621514 + ], + [ + 10.764697233467663, + 52.84047926725806 + ], + [ + 10.77172883132508, + 52.83394567355566 + ], + [ + 10.763985773413204, + 52.830208036094234 + ], + [ + 10.766654543561451, + 52.82619310123291 + ], + [ + 10.756946307398549, + 52.81977474058632 + ], + [ + 10.761743760441158, + 52.80272638769274 + ], + [ + 10.755321247277028, + 52.784829632988426 + ], + [ + 10.775482893085979, + 52.76236112135293 + ], + [ + 10.776207966250166, + 52.754788840050644 + ], + [ + 10.78764507598349, + 52.752967129511156 + ], + [ + 10.791665848053619, + 52.74819657827841 + ], + [ + 10.788176140820354, + 52.733172314478 + ], + [ + 10.793282401341852, + 52.729968280874964 + ], + [ + 10.796696790574803, + 52.714326390056605 + ], + [ + 10.824460067061251, + 52.71797463592656 + ], + [ + 10.829703151025388, + 52.71613516382112 + ], + [ + 10.83615892182715, + 52.707701464196866 + ], + [ + 10.833128900460295, + 52.700938913075795 + ], + [ + 10.83750746858655, + 52.69580956419165 + ], + [ + 10.85967752478328, + 52.6745901683866 + ], + [ + 10.877758863633659, + 52.66383235252555 + ], + [ + 10.87902679157203, + 52.65599633196257 + ], + [ + 10.896868342049826, + 52.64270868907923 + ], + [ + 10.904377954815706, + 52.62746679780099 + ], + [ + 10.913103193598223, + 52.62409808845634 + ], + [ + 10.915052851656169, + 52.617634958866674 + ], + [ + 10.9250262715629, + 52.61459685370367 + ], + [ + 10.921411939012895, + 52.61043708108112 + ], + [ + 10.927160294691314, + 52.60926156812378 + ], + [ + 10.943396820059318, + 52.614913200637815 + ], + [ + 10.945174022104837, + 52.62021641577061 + ], + [ + 10.96424832829456, + 52.62585473092072 + ], + [ + 10.9769679981519, + 52.62414161679185 + ], + [ + 10.97562919020857, + 52.60682491137484 + ], + [ + 10.959519012643494, + 52.59989230564461 + ], + [ + 10.953259829664526, + 52.59286752027712 + ], + [ + 10.939817469906814, + 52.58957309884994 + ], + [ + 10.947435540958756, + 52.58255006677304 + ], + [ + 10.941689468191544, + 52.579744654171456 + ], + [ + 10.93757573538539, + 52.56739965156559 + ], + [ + 10.958992316608404, + 52.53555397015957 + ], + [ + 11.008781743797412, + 52.49674764404583 + ], + [ + 10.98226161318549, + 52.49696464012332 + ], + [ + 10.974840401084535, + 52.501363347755394 + ], + [ + 10.949993652832653, + 52.49560565039983 + ], + [ + 10.943555905367703, + 52.49234952901468 + ], + [ + 10.940981083075862, + 52.47660079336814 + ], + [ + 10.93458499675538, + 52.47617439410258 + ], + [ + 10.933745728234936, + 52.460952125598816 + ], + [ + 10.94782168265518, + 52.453949098168714 + ], + [ + 10.96226112651492, + 52.43473785312719 + ], + [ + 10.98940801527397, + 52.42030296786594 + ], + [ + 10.994628376117381, + 52.41511332472082 + ], + [ + 10.99164501814916, + 52.41333494059596 + ], + [ + 11.005578878172205, + 52.40887152615071 + ], + [ + 11.01869512358527, + 52.39704204588354 + ], + [ + 11.015160052777725, + 52.38810680537989 + ], + [ + 11.022946034006058, + 52.39263545015585 + ], + [ + 11.036299796384762, + 52.38520951147548 + ], + [ + 11.0418673114517, + 52.38638383207872 + ], + [ + 11.039004142151486, + 52.38890951805362 + ], + [ + 11.046752836023455, + 52.3878701759709 + ], + [ + 11.06654420349342, + 52.373199823545114 + ], + [ + 11.068810227145846, + 52.376522122766936 + ], + [ + 11.074479824719837, + 52.37440326430861 + ], + [ + 11.067000152544452, + 52.36987737540694 + ], + [ + 11.068684251700189, + 52.355477634704954 + ], + [ + 11.063810832232909, + 52.35441582873434 + ], + [ + 11.061613904866102, + 52.357452967833936 + ], + [ + 11.05747447818976, + 52.35033314438677 + ], + [ + 11.043939507163884, + 52.34933867879302 + ], + [ + 11.037356480769425, + 52.34474236765471 + ], + [ + 11.023596170173967, + 52.34423206331315 + ], + [ + 11.022980602297192, + 52.34743293332608 + ], + [ + 10.983673923984412, + 52.34168646045201 + ], + [ + 10.98791249876772, + 52.335015946203356 + ], + [ + 11.002083240236393, + 52.3365853825243 + ], + [ + 11.004795267951659, + 52.33074881231778 + ], + [ + 10.999982894462867, + 52.32971240663011 + ], + [ + 11.001076691326242, + 52.327480520572394 + ], + [ + 11.011616662057495, + 52.328241063875964 + ], + [ + 11.020228833088915, + 52.31911791020523 + ], + [ + 11.036015159542432, + 52.310396037263914 + ], + [ + 11.039222681549468, + 52.301671863861486 + ], + [ + 11.012506507526163, + 52.29132000668782 + ], + [ + 11.013800796624643, + 52.286649048106696 + ], + [ + 11.029066817935323, + 52.27012102132033 + ], + [ + 11.042943949686965, + 52.27201068483596 + ], + [ + 11.052167701569534, + 52.26736354912687 + ], + [ + 11.051129729112208, + 52.26279929517395 + ], + [ + 11.056312565862436, + 52.258727964936625 + ], + [ + 11.052367339887669, + 52.25373644876064 + ], + [ + 11.058907194326187, + 52.24065176908868 + ], + [ + 11.07326749974561, + 52.243239689228716 + ], + [ + 11.086244118789406, + 52.228633836442555 + ], + [ + 11.078857657861384, + 52.224649745873485 + ], + [ + 11.077184889367993, + 52.218676562518816 + ], + [ + 11.044883262868717, + 52.21505615605689 + ], + [ + 11.034455569279203, + 52.21031238742629 + ], + [ + 11.029448371030629, + 52.21144837280336 + ], + [ + 11.021394557798542, + 52.20497925656305 + ], + [ + 11.024579873534892, + 52.201095822982104 + ], + [ + 11.017686322601273, + 52.19825257923726 + ], + [ + 11.01364658899064, + 52.19955618987686 + ], + [ + 11.012626473710446, + 52.18834450211659 + ], + [ + 11.017835355814537, + 52.17932758404763 + ], + [ + 11.035923512896062, + 52.17172844254678 + ], + [ + 11.060336961595521, + 52.17238740685909 + ], + [ + 11.061481095435502, + 52.1652430363485 + ], + [ + 11.05461848436036, + 52.16025607480426 + ], + [ + 11.06042836396003, + 52.15347400912416 + ], + [ + 11.045039176631503, + 52.143553841775244 + ], + [ + 11.044135171710142, + 52.133665502858804 + ], + [ + 11.01747008252535, + 52.12825973289111 + ], + [ + 11.009163205336355, + 52.11992783799272 + ], + [ + 10.976877507167082, + 52.1057288521072 + ], + [ + 10.965668144578833, + 52.107115338602625 + ], + [ + 10.942159787336902, + 52.103090282296094 + ], + [ + 10.942004993617832, + 52.094362847131855 + ], + [ + 10.970652819687002, + 52.08626494130666 + ], + [ + 10.973049718068367, + 52.07312392931353 + ], + [ + 10.964414596962717, + 52.05664315887771 + ], + [ + 10.935961365616144, + 52.059709883314966 + ], + [ + 10.878944232307449, + 52.05920303861899 + ], + [ + 10.851441978873389, + 52.050337318518515 + ], + [ + 10.828707490576932, + 52.04774864983605 + ], + [ + 10.774671098974537, + 52.05008909538819 + ], + [ + 10.75989265477887, + 52.04508508619649 + ], + [ + 10.758284328902882, + 52.04804164592134 + ], + [ + 10.745063872921524, + 52.048787942622496 + ], + [ + 10.687385236811572, + 52.048138205141555 + ], + [ + 10.64788665593012, + 52.041720814237095 + ], + [ + 10.65686483217418, + 52.028523818713495 + ], + [ + 10.65549198507614, + 52.02468661603615 + ], + [ + 10.642216826226779, + 52.022916086106214 + ], + [ + 10.638972150916327, + 52.01532529809057 + ], + [ + 10.621436009041293, + 52.01033426271989 + ], + [ + 10.626019658463969, + 52.008197846805714 + ], + [ + 10.61190232511463, + 52.01004676341872 + ], + [ + 10.600194240352286, + 52.00716567546606 + ], + [ + 10.59659996460236, + 52.01436553241478 + ], + [ + 10.592280206287763, + 52.01420352607189 + ], + [ + 10.591595156481953, + 52.01134222442347 + ], + [ + 10.572969628915335, + 52.01044575985055 + ], + [ + 10.574741225890202, + 52.00636094344994 + ], + [ + 10.561226987730976, + 52.00406593861593 + ], + [ + 10.586778820613524, + 51.98273184002828 + ], + [ + 10.585979347625894, + 51.975959121058665 + ], + [ + 10.606232853092317, + 51.977287406718645 + ], + [ + 10.606237284759974, + 51.968665721342184 + ], + [ + 10.619617075895942, + 51.96693615395347 + ], + [ + 10.619941215238676, + 51.957678619347995 + ], + [ + 10.635378441095062, + 51.95906530738353 + ], + [ + 10.641704442298398, + 51.962627962195924 + ], + [ + 10.651303745526786, + 51.95756107707119 + ], + [ + 10.633047017829652, + 51.94849859120703 + ], + [ + 10.622477642076563, + 51.94754118852326 + ], + [ + 10.61326048378171, + 51.939467872228974 + ], + [ + 10.61811139120552, + 51.93147738026018 + ], + [ + 10.613313787501555, + 51.9215152753072 + ], + [ + 10.638159354261576, + 51.91596588184563 + ], + [ + 10.648214683342308, + 51.90824476607125 + ], + [ + 10.649322125581959, + 51.889104933431476 + ], + [ + 10.632329785897452, + 51.87216491605542 + ], + [ + 10.616032827236042, + 51.86965422432467 + ], + [ + 10.602615382830619, + 51.85454513168052 + ], + [ + 10.584468982117192, + 51.853057173917385 + ], + [ + 10.579100529220321, + 51.84825725389399 + ], + [ + 10.576971041291696, + 51.842987258042896 + ], + [ + 10.588429864935806, + 51.83578577047531 + ], + [ + 10.578735940134683, + 51.828652324894655 + ], + [ + 10.574174335702898, + 51.81112656416387 + ], + [ + 10.583918723091337, + 51.798822962496736 + ], + [ + 10.581520144742475, + 51.78000554802283 + ], + [ + 10.59120047977073, + 51.76898765067984 + ], + [ + 10.605945562005266, + 51.76244442234394 + ], + [ + 10.626096714487174, + 51.75901689505588 + ], + [ + 10.63126962432424, + 51.751471124156936 + ], + [ + 10.631713463638965, + 51.739533090725665 + ], + [ + 10.642870747822347, + 51.73028134619563 + ], + [ + 10.642102111369324, + 51.7253614906977 + ], + [ + 10.649337053248967, + 51.71855163919841 + ], + [ + 10.655896852317202, + 51.71821932717627 + ], + [ + 10.668307288497173, + 51.70990802993534 + ], + [ + 10.67261703060319, + 51.69696554175661 + ], + [ + 10.667549207009548, + 51.69667595710321 + ], + [ + 10.663060041348238, + 51.691212375917125 + ], + [ + 10.670507134381431, + 51.66691268035287 + ], + [ + 10.682880157310361, + 51.66062388091583 + ], + [ + 10.691702454483714, + 51.646503906275186 + ], + [ + 10.701371992415018, + 51.64218764258903 + ], + [ + 10.698685310477906, + 51.63948433063857 + ], + [ + 10.677282757060635, + 51.63837585835886 + ], + [ + 10.675842715368255, + 51.6332115614889 + ], + [ + 10.682480919162781, + 51.62891703117605 + ], + [ + 10.667150146662966, + 51.628368453854584 + ], + [ + 10.638209991817845, + 51.6194370342662 + ], + [ + 10.649000507261986, + 51.606514213192064 + ], + [ + 10.633496085008687, + 51.60790292071481 + ], + [ + 10.634444567858665, + 51.594305707022286 + ], + [ + 10.638674695265001, + 51.58411696418498 + ], + [ + 10.658364256862148, + 51.58189707739443 + ], + [ + 10.666306959474996, + 51.57809868286582 + ], + [ + 10.658383766518938, + 51.566657187642306 + ], + [ + 10.660744876666287, + 51.56075235235682 + ], + [ + 10.65679616564362, + 51.558301645546585 + ], + [ + 10.644767149439904, + 51.56001727609204 + ], + [ + 10.645524042068871, + 51.562778309395085 + ], + [ + 10.636525144976394, + 51.56222650367388 + ], + [ + 10.626600308666664, + 51.56775714761241 + ], + [ + 10.62795485058714, + 51.572064953196474 + ], + [ + 10.621637070378135, + 51.57577401911091 + ], + [ + 10.604264264080246, + 51.57957530972973 + ], + [ + 10.587912279841973, + 51.5675855726244 + ], + [ + 10.577367956297882, + 51.565964835416764 + ], + [ + 10.576491678635488, + 51.562680594588535 + ], + [ + 10.569985100740205, + 51.56334159621501 + ], + [ + 10.56026902993225, + 51.55706798652606 + ], + [ + 10.545460227630803, + 51.55573415908262 + ], + [ + 10.534052416582355, + 51.55935853628575 + ], + [ + 10.51897376125845, + 51.553763453188445 + ], + [ + 10.509581470145138, + 51.55679233583436 + ], + [ + 10.495695850954549, + 51.57278824463772 + ], + [ + 10.467039375310346, + 51.583380764124364 + ], + [ + 10.4509737150339, + 51.58402631448628 + ], + [ + 10.444382461913786, + 51.58965620845999 + ], + [ + 10.429199988538747, + 51.592532978818475 + ], + [ + 10.40630345233819, + 51.5865002873712 + ], + [ + 10.370023394490042, + 51.58753647641246 + ], + [ + 10.37879102954003, + 51.57938136855905 + ], + [ + 10.378624329139232, + 51.56270666557081 + ], + [ + 10.36536503979993, + 51.55589099234147 + ], + [ + 10.372184973632212, + 51.552992735494215 + ], + [ + 10.367664032754314, + 51.543036462401346 + ], + [ + 10.348125353284576, + 51.53217339716891 + ], + [ + 10.342275478001767, + 51.51949714600088 + ], + [ + 10.318031301155678, + 51.513977912814426 + ], + [ + 10.30881763563502, + 51.51513978198134 + ], + [ + 10.299850417790578, + 51.50495074136436 + ], + [ + 10.299669826377952, + 51.493896093058886 + ], + [ + 10.28442933601233, + 51.494440472275386 + ], + [ + 10.273233167325579, + 51.49139163785836 + ], + [ + 10.272759014877009, + 51.48822097387354 + ], + [ + 10.244677551323745, + 51.483735085050604 + ], + [ + 10.235877850025664, + 51.47142826880778 + ], + [ + 10.226711304046443, + 51.4738114683735 + ], + [ + 10.21694604343835, + 51.47007501148554 + ], + [ + 10.218201974927803, + 51.478539638740905 + ], + [ + 10.212821835478378, + 51.478662934446746 + ], + [ + 10.20572217944474, + 51.48724330148834 + ], + [ + 10.201975121411838, + 51.486519768660344 + ], + [ + 10.178251589758881, + 51.470016353886486 + ], + [ + 10.186011891536417, + 51.46217418742218 + ], + [ + 10.177202022044895, + 51.45743607489433 + ], + [ + 10.180194512012733, + 51.45578884601784 + ], + [ + 10.174306043331994, + 51.446256097602046 + ], + [ + 10.167618498815218, + 51.44444508678692 + ], + [ + 10.15880583563931, + 51.44675490445717 + ], + [ + 10.155819130957916, + 51.443619448076475 + ], + [ + 10.152150064971085, + 51.44714438862402 + ], + [ + 10.140004544928212, + 51.442614116075234 + ], + [ + 10.141098212716205, + 51.43719013395015 + ], + [ + 10.154470343617403, + 51.431532811934346 + ], + [ + 10.15039877402674, + 51.429424526331964 + ], + [ + 10.140393809920441, + 51.42971824961089 + ], + [ + 10.131754965780882, + 51.435530451354815 + ], + [ + 10.121105093991265, + 51.434156688748956 + ], + [ + 10.116933377480668, + 51.43022977820057 + ], + [ + 10.090837988356414, + 51.435654948405364 + ], + [ + 10.080107993402498, + 51.434560233171425 + ], + [ + 10.079582876608221, + 51.425306089610324 + ], + [ + 10.075219913545407, + 51.419517449214666 + ], + [ + 10.06910808870457, + 51.41843830335814 + ], + [ + 10.064526483039655, + 51.4198211193522 + ], + [ + 10.065619754818378, + 51.42499545263308 + ], + [ + 10.059694010940367, + 51.42828697284843 + ], + [ + 10.05878204634409, + 51.43489252931593 + ], + [ + 10.046672523120987, + 51.43676281921434 + ], + [ + 10.05144247114334, + 51.43032135572857 + ], + [ + 10.042839761189333, + 51.427565673769934 + ], + [ + 10.03784371988374, + 51.42000493706562 + ], + [ + 10.009328775043759, + 51.42060355157446 + ], + [ + 10.007607687600888, + 51.41100057100622 + ], + [ + 10.000780211380238, + 51.407777861254814 + ], + [ + 10.000375476438828, + 51.4036551539765 + ], + [ + 9.994024725286671, + 51.403885080847004 + ], + [ + 9.987396260898809, + 51.39792255651991 + ], + [ + 9.965943385508153, + 51.3954768529318 + ], + [ + 9.941998422070181, + 51.378428531503054 + ], + [ + 9.928338772259963, + 51.37529875261371 + ], + [ + 9.9328883202261, + 51.380584477111086 + ], + [ + 9.931109064927966, + 51.39273322765949 + ], + [ + 9.907043320667048, + 51.407711341356155 + ], + [ + 9.905706158818031, + 51.40988187409446 + ], + [ + 9.913393379343557, + 51.41063124479869 + ], + [ + 9.906021117251992, + 51.421138747898134 + ], + [ + 9.89927491843477, + 51.41652499386497 + ], + [ + 9.88315181094009, + 51.41496600486442 + ], + [ + 9.884625566891144, + 51.41020528718944 + ], + [ + 9.87831534108597, + 51.404476942675345 + ], + [ + 9.868535202646518, + 51.41379077599883 + ], + [ + 9.850743073957526, + 51.414413646067054 + ], + [ + 9.853849864791966, + 51.41039106678285 + ], + [ + 9.850538764030528, + 51.40137571705258 + ], + [ + 9.860749184304966, + 51.39428797852673 + ], + [ + 9.855920267472591, + 51.38480562618768 + ], + [ + 9.867991158435894, + 51.37486634654533 + ], + [ + 9.865275914663838, + 51.37161273101082 + ], + [ + 9.853212598738006, + 51.37223153331954 + ], + [ + 9.840106635530388, + 51.383593239280856 + ], + [ + 9.84063660084092, + 51.40264157129166 + ], + [ + 9.833808759889921, + 51.40246971530082 + ], + [ + 9.816270450748418, + 51.41046644328984 + ], + [ + 9.794136664730969, + 51.407159645367216 + ], + [ + 9.792786898601067, + 51.40138434445831 + ], + [ + 9.796490064829221, + 51.39814058904134 + ], + [ + 9.80012741526172, + 51.3991879813608 + ], + [ + 9.801450107502788, + 51.386914687101594 + ], + [ + 9.783985811186628, + 51.3892478196513 + ], + [ + 9.765789275934647, + 51.38598650818088 + ], + [ + 9.756603202117832, + 51.38228486300859 + ], + [ + 9.752283766019628, + 51.374690744682525 + ], + [ + 9.73845865188033, + 51.36921255172771 + ], + [ + 9.723200388933611, + 51.370498229427675 + ], + [ + 9.70214378743857, + 51.364571793313054 + ], + [ + 9.703983240566332, + 51.358145867850844 + ], + [ + 9.720611311330206, + 51.34852752918306 + ], + [ + 9.72736664576359, + 51.33638972172233 + ], + [ + 9.73684068786483, + 51.32895687476256 + ], + [ + 9.738247706697003, + 51.31942876784122 + ], + [ + 9.745434331822032, + 51.31898034571388 + ], + [ + 9.75650654536778, + 51.32865123185848 + ], + [ + 9.76830714137653, + 51.332549271216635 + ], + [ + 9.76310755223062, + 51.336160669951546 + ], + [ + 9.772456280287853, + 51.33629096544419 + ], + [ + 9.763510414226749, + 51.325339374935346 + ], + [ + 9.772365928259074, + 51.32928147386392 + ], + [ + 9.77034526684916, + 51.32538207019431 + ], + [ + 9.775201991304055, + 51.3251962301771 + ], + [ + 9.76820035995882, + 51.30672613942366 + ], + [ + 9.732304393210685, + 51.295231899245714 + ], + [ + 9.678910861748543, + 51.31095779326454 + ], + [ + 9.669385916481836, + 51.31771085690032 + ], + [ + 9.664290935199004, + 51.31655475568188 + ], + [ + 9.662229738071302, + 51.31171261653149 + ], + [ + 9.635770951069142, + 51.31707218342341 + ], + [ + 9.634455322359544, + 51.311603686575914 + ], + [ + 9.628524068111238, + 51.311902585254614 + ], + [ + 9.632933187582076, + 51.32442924019248 + ], + [ + 9.638543096532114, + 51.3223921246166 + ], + [ + 9.633365915362818, + 51.32585404863946 + ], + [ + 9.617242032755863, + 51.32792927418443 + ], + [ + 9.604434634813018, + 51.32555585065817 + ], + [ + 9.606001251657037, + 51.32770922003012 + ], + [ + 9.601837052201995, + 51.327677424403056 + ], + [ + 9.581656972874693, + 51.34219633507073 + ], + [ + 9.568024928945789, + 51.34000145829537 + ], + [ + 9.548441127447324, + 51.35895529980776 + ], + [ + 9.550133992220728, + 51.361884226876754 + ], + [ + 9.567573775345782, + 51.361574101851765 + ], + [ + 9.576746408462375, + 51.36929448421248 + ], + [ + 9.575042705444577, + 51.37252919302164 + ], + [ + 9.561036958681687, + 51.37483842205027 + ], + [ + 9.559336971748268, + 51.37923362288811 + ], + [ + 9.564434253527715, + 51.387345108266594 + ], + [ + 9.574044967665747, + 51.39210893007976 + ], + [ + 9.578518258088607, + 51.40141149518203 + ], + [ + 9.587512389611081, + 51.402669322368965 + ], + [ + 9.594077815128436, + 51.397987444426626 + ], + [ + 9.609854656997225, + 51.404766078153045 + ], + [ + 9.610017099546152, + 51.40782260205073 + ], + [ + 9.63058216025382, + 51.406106000418404 + ], + [ + 9.631145477938334, + 51.4116014199748 + ], + [ + 9.64358179036483, + 51.41826072694212 + ], + [ + 9.634297056838628, + 51.42608341028881 + ], + [ + 9.627620523466518, + 51.44420867315993 + ], + [ + 9.630148643422952, + 51.45820917188892 + ], + [ + 9.642965308776638, + 51.46599584015249 + ], + [ + 9.643307637239838, + 51.47003808734056 + ], + [ + 9.619586506746154, + 51.48102865901589 + ], + [ + 9.585751022568783, + 51.51731760606673 + ], + [ + 9.591546685156542, + 51.523219589470166 + ], + [ + 9.608917300556298, + 51.52218256715527 + ], + [ + 9.62029718664698, + 51.53251354524166 + ], + [ + 9.62195014259368, + 51.54186689371579 + ], + [ + 9.609101426491979, + 51.5572546747514 + ], + [ + 9.617604731686024, + 51.55489838724459 + ], + [ + 9.622443388265424, + 51.54867253721827 + ], + [ + 9.647755439638924, + 51.55251096635144 + ], + [ + 9.645015613578106, + 51.55935585661458 + ], + [ + 9.636377648766928, + 51.55893304989422 + ], + [ + 9.626494364672794, + 51.570088552285526 + ], + [ + 9.625824919237113, + 51.58020520821283 + ], + [ + 9.630463403468566, + 51.583847259754194 + ], + [ + 9.64487725063231, + 51.58224315570359 + ], + [ + 9.66011417848361, + 51.57270785973169 + ], + [ + 9.684003674135843, + 51.56653265800835 + ], + [ + 9.690947952679238, + 51.57631513922257 + ], + [ + 9.688081409662866, + 51.58000217158042 + ], + [ + 9.679808990730749, + 51.58796119787761 + ], + [ + 9.672256981795687, + 51.587369239196725 + ], + [ + 9.668637800237503, + 51.59167632801398 + ], + [ + 9.661055938379555, + 51.593029604491655 + ], + [ + 9.649528854010311, + 51.60627151634232 + ], + [ + 9.637835474208496, + 51.608804810355515 + ], + [ + 9.636620701333642, + 51.623415841916525 + ], + [ + 9.627076387187602, + 51.62895973256221 + ], + [ + 9.631617932260282, + 51.634166379989345 + ], + [ + 9.625999283681386, + 51.636913968153465 + ], + [ + 9.609644970040094, + 51.62957638728749 + ], + [ + 9.570707597051527, + 51.62471977512613 + ], + [ + 9.55935884678494, + 51.62923169248272 + ], + [ + 9.553539215280333, + 51.637318449922674 + ], + [ + 9.543630864439992, + 51.63986668833803 + ], + [ + 9.530633548218514, + 51.62926939477437 + ], + [ + 9.51633017549295, + 51.62619114606531 + ], + [ + 9.506475377598477, + 51.62735026580064 + ], + [ + 9.49192953184265, + 51.63472158023098 + ], + [ + 9.498576551324478, + 51.651404571716114 + ], + [ + 9.494205856567671, + 51.65744941956604 + ], + [ + 9.467714408073558, + 51.653847167952726 + ], + [ + 9.453276430625795, + 51.64574879731446 + ], + [ + 9.434653445631787, + 51.65117858380277 + ], + [ + 9.417317501499499, + 51.64726925220617 + ], + [ + 9.386311841488538, + 51.64601844290624 + ], + [ + 9.374706085604641, + 51.64984028649132 + ], + [ + 9.379388530882116, + 51.66592673771928 + ], + [ + 9.395687618729884, + 51.673988556165106 + ], + [ + 9.386923489576398, + 51.68982224394587 + ], + [ + 9.401664934979168, + 51.701656162930696 + ], + [ + 9.387318166956309, + 51.719390180465766 + ], + [ + 9.394415502869643, + 51.731971436548655 + ], + [ + 9.378877584218927, + 51.73809621039587 + ], + [ + 9.375500345512682, + 51.744011165104254 + ], + [ + 9.383725124016586, + 51.75023385367308 + ], + [ + 9.384336129984819, + 51.75785097126557 + ], + [ + 9.402696727087433, + 51.759371972495046 + ], + [ + 9.409550769057125, + 51.77104112517435 + ], + [ + 9.448156881625001, + 51.79479940974031 + ], + [ + 9.436367412099424, + 51.797015378177704 + ], + [ + 9.44081744549671, + 51.80345181661288 + ], + [ + 9.430901363143347, + 51.80488327320005 + ], + [ + 9.43054739105141, + 51.810691902733126 + ], + [ + 9.427329971378446, + 51.81049191448682 + ], + [ + 9.440521309240905, + 51.824933024139895 + ], + [ + 9.437933145103234, + 51.830703662680726 + ], + [ + 9.442178494680725, + 51.82922116791767 + ], + [ + 9.433314685955153, + 51.840666379944764 + ], + [ + 9.460284809153494, + 51.854670247442755 + ], + [ + 9.459648734904937, + 51.862797427689245 + ], + [ + 9.437366927412928, + 51.85622165640826 + ], + [ + 9.404902437940068, + 51.85559295544217 + ], + [ + 9.392852288645225, + 51.86035816976773 + ], + [ + 9.362865542207714, + 51.864878964263355 + ], + [ + 9.334699754871146, + 51.8536107402885 + ], + [ + 9.323343735912266, + 51.85506096217584 + ], + [ + 9.33575738631024, + 51.856051510976705 + ], + [ + 9.340165313235872, + 51.87864012155629 + ], + [ + 9.344326577754636, + 51.880201093312955 + ], + [ + 9.340841883310434, + 51.90800232349204 + ], + [ + 9.331904481969081, + 51.917316131916756 + ], + [ + 9.318447703502132, + 51.9184156797912 + ], + [ + 9.314943365319257, + 51.92280706258741 + ], + [ + 9.29426941741104, + 51.9194414579583 + ], + [ + 9.289992522380278, + 51.92269972945507 + ], + [ + 9.287373730691295, + 51.92105368027288 + ], + [ + 9.272069028340102, + 51.9323042080722 + ], + [ + 9.273372678531079, + 51.94008162956461 + ], + [ + 9.278640691720353, + 51.94012683802912 + ], + [ + 9.277070261922086, + 51.94385323087351 + ], + [ + 9.263912830026527, + 51.94805354908316 + ], + [ + 9.268371249457898, + 51.94684927765628 + ], + [ + 9.271728917942477, + 51.94973586305552 + ], + [ + 9.27139377088994, + 51.95513026289741 + ], + [ + 9.286323835664032, + 51.95710974213933 + ], + [ + 9.277575694503588, + 51.961860260480194 + ], + [ + 9.27437535910782, + 51.973603596223874 + ], + [ + 9.268408810753208, + 51.970168380326015 + ], + [ + 9.269997087255845, + 51.97390929746652 + ], + [ + 9.257758111904097, + 51.97720983279267 + ], + [ + 9.216921993280389, + 51.9736242154584 + ], + [ + 9.217123377458584, + 51.96977026309701 + ], + [ + 9.21330001170672, + 51.97087155179969 + ], + [ + 9.209427056320552, + 51.96720200310858 + ], + [ + 9.208896029258678, + 51.9598552911289 + ], + [ + 9.202721501163174, + 51.96493637523705 + ], + [ + 9.198615844558148, + 51.96234553203131 + ], + [ + 9.185820219656689, + 51.966181412026955 + ], + [ + 9.187813208466995, + 51.97281586301539 + ], + [ + 9.176231466447549, + 51.980352693001784 + ], + [ + 9.174689700238913, + 51.98325941368496 + ], + [ + 9.183053126235432, + 51.9857632720515 + ], + [ + 9.183704313629658, + 51.99094345201268 + ], + [ + 9.19679375701672, + 51.996917100160005 + ], + [ + 9.179261561642598, + 52.00269032924773 + ], + [ + 9.197379615501898, + 52.01157315997334 + ], + [ + 9.18903934370744, + 52.02627757599404 + ], + [ + 9.17565496748515, + 52.03457677421371 + ], + [ + 9.172169130315694, + 52.0473705514216 + ], + [ + 9.17443249549783, + 52.060427494457485 + ], + [ + 9.179432730759295, + 52.06212926689109 + ], + [ + 9.181347594718465, + 52.067866441304176 + ], + [ + 9.193280774871425, + 52.07031133927141 + ], + [ + 9.17608700679414, + 52.086116975928114 + ], + [ + 9.154688559698538, + 52.09179213821502 + ], + [ + 9.15560469839149, + 52.0978298710163 + ], + [ + 9.146515018929772, + 52.099922216280575 + ], + [ + 9.134648347273515, + 52.094281430165275 + ], + [ + 9.132977916362119, + 52.09662945210804 + ], + [ + 9.13586306471855, + 52.105837389434186 + ], + [ + 9.146924269336626, + 52.10920185006745 + ], + [ + 9.14620440774805, + 52.11324193099201 + ], + [ + 9.155844925027628, + 52.11434039917865 + ], + [ + 9.159335103714595, + 52.11984022621441 + ], + [ + 9.153344072937578, + 52.129146678601906 + ], + [ + 9.143606819183558, + 52.13507283789312 + ], + [ + 9.12908227071392, + 52.135329873286096 + ], + [ + 9.129796432244232, + 52.1397461147234 + ], + [ + 9.116078186283165, + 52.138445518901285 + ], + [ + 9.107039403126754, + 52.13238508111911 + ], + [ + 9.099140410991408, + 52.133021405062465 + ], + [ + 9.09714192723343, + 52.137127166614825 + ], + [ + 9.094024144750033, + 52.134895468933294 + ], + [ + 9.084912360533437, + 52.13736078681275 + ], + [ + 9.08178334745329, + 52.14110205865908 + ], + [ + 9.067803093393675, + 52.14025160420042 + ], + [ + 9.071614898740272, + 52.14825880323065 + ], + [ + 9.053365580899438, + 52.14822821277588 + ], + [ + 9.0443864898014, + 52.139599791082155 + ], + [ + 9.036256461189936, + 52.140076230966464 + ], + [ + 9.017792061613324, + 52.13242667185156 + ], + [ + 9.011015900219414, + 52.13577000465161 + ], + [ + 9.017538681124051, + 52.14774418304544 + ], + [ + 9.012669278136858, + 52.162410498486686 + ], + [ + 9.021587719353063, + 52.17182335248089 + ], + [ + 9.01146353925308, + 52.17326286815035 + ], + [ + 9.01242270174118, + 52.177907815143755 + ], + [ + 9.00133206075187, + 52.183158033701595 + ], + [ + 9.00104649324995, + 52.18779645484243 + ], + [ + 8.99627319951044, + 52.185649441172295 + ], + [ + 8.993759960317268, + 52.19167221268501 + ], + [ + 8.985833623265101, + 52.1945985936325 + ], + [ + 8.994035622797778, + 52.19613775129346 + ], + [ + 8.999731540244206, + 52.190811658591834 + ], + [ + 9.006990673310465, + 52.189517081431674 + ], + [ + 9.01358963747118, + 52.19537473441808 + ], + [ + 9.01963793569253, + 52.192175168757444 + ], + [ + 9.021111202902047, + 52.18383604850948 + ], + [ + 9.045349209994752, + 52.183773446704194 + ], + [ + 9.043085685313002, + 52.190429933987005 + ], + [ + 9.048523790819269, + 52.195659731047364 + ], + [ + 9.043404742866251, + 52.20414367542282 + ], + [ + 9.045855734174337, + 52.21078548554869 + ], + [ + 9.034064500687416, + 52.217640460438794 + ], + [ + 9.035759915109479, + 52.224525071348666 + ], + [ + 9.04242893087674, + 52.22621671084392 + ], + [ + 9.051747819393405, + 52.220212635408735 + ], + [ + 9.069887598100525, + 52.22678783088412 + ], + [ + 9.076615815364528, + 52.23343716742968 + ], + [ + 9.056558338693844, + 52.23788451165274 + ], + [ + 9.03297001658824, + 52.24952628296926 + ], + [ + 9.006508408565091, + 52.25284434431304 + ], + [ + 9.004221296482639, + 52.25749279556106 + ], + [ + 8.974870267517238, + 52.262555318151236 + ], + [ + 8.972366634417288, + 52.26461945746418 + ], + [ + 8.978577318999589, + 52.27479177439846 + ], + [ + 8.972107487667797, + 52.27345275296536 + ], + [ + 8.963536742965317, + 52.27902697502795 + ], + [ + 8.988077144929187, + 52.287568987179355 + ], + [ + 8.985279911864295, + 52.2957287533707 + ], + [ + 8.998320816218438, + 52.32621485226264 + ], + [ + 9.007703029432415, + 52.32572220539568 + ], + [ + 9.009576702543407, + 52.33121473351154 + ], + [ + 9.018907987028369, + 52.33098843564273 + ], + [ + 9.027357219882479, + 52.345610946129526 + ], + [ + 9.0579248262507, + 52.33957740164747 + ], + [ + 9.059175059529524, + 52.34686059449991 + ], + [ + 9.072541175439044, + 52.34825261458253 + ], + [ + 9.077542753452562, + 52.35405990607756 + ], + [ + 9.083660408342752, + 52.35478887258044 + ], + [ + 9.088926605890585, + 52.366283670655896 + ], + [ + 9.098799447688334, + 52.37294765664839 + ], + [ + 9.10072110199626, + 52.380624812513766 + ], + [ + 9.095461469197195, + 52.38666204330845 + ], + [ + 9.121595839718855, + 52.40166231779638 + ], + [ + 9.123766660934105, + 52.42154768722118 + ], + [ + 9.109809323073582, + 52.42187286207305 + ], + [ + 9.10547228097422, + 52.427462365262926 + ], + [ + 9.112414945251844, + 52.427542664486666 + ], + [ + 9.110523179196164, + 52.4354271843622 + ], + [ + 9.094530000867744, + 52.44282393609016 + ], + [ + 9.102923073659037, + 52.45692635527466 + ], + [ + 9.125618081430208, + 52.46829591004699 + ], + [ + 9.123288968262077, + 52.47461041304461 + ], + [ + 9.136708747385837, + 52.4755456289822 + ], + [ + 9.131973743159916, + 52.483982663928714 + ], + [ + 9.112375502633311, + 52.485781930269134 + ], + [ + 9.099420427691824, + 52.49747790020782 + ], + [ + 9.08802354484065, + 52.495761830735205 + ], + [ + 9.071941690430991, + 52.49866634996737 + ], + [ + 9.06584534443683, + 52.49620139131845 + ], + [ + 9.05229369493843, + 52.5001138036791 + ], + [ + 9.04147811693798, + 52.487345972478586 + ], + [ + 9.044076447979107, + 52.48264624751757 + ], + [ + 9.038287404572767, + 52.47990470822609 + ], + [ + 9.028100008069005, + 52.48059013111743 + ], + [ + 9.022950188948021, + 52.47726199857193 + ], + [ + 9.017158336331722, + 52.45994785684721 + ], + [ + 9.012089081021077, + 52.457311341722 + ], + [ + 8.99891974553588, + 52.4575630043375 + ], + [ + 8.992117983428365, + 52.45060847796376 + ], + [ + 8.978418281809521, + 52.45072161523495 + ], + [ + 8.986727120386318, + 52.44551442261614 + ], + [ + 8.979175718195048, + 52.436260543874 + ], + [ + 8.987056167021224, + 52.4325164217834 + ], + [ + 8.977986504158283, + 52.42699597235529 + ], + [ + 8.96219250528398, + 52.42499603379443 + ], + [ + 8.957962300856119, + 52.41616131126163 + ], + [ + 8.941128429689574, + 52.416323326225005 + ], + [ + 8.946065121402476, + 52.41352675376105 + ], + [ + 8.944139225082996, + 52.40839255530534 + ], + [ + 8.935209162267737, + 52.404642555763104 + ], + [ + 8.937577150676074, + 52.40210070684577 + ], + [ + 8.903104714159046, + 52.404580151492375 + ], + [ + 8.903665581311694, + 52.401912590901105 + ], + [ + 8.89771543655553, + 52.40158479073623 + ], + [ + 8.896027035094857, + 52.40609027110702 + ], + [ + 8.892460430066206, + 52.40570942291009 + ], + [ + 8.889183037763658, + 52.39598121622016 + ], + [ + 8.868558100713125, + 52.39266394664687 + ], + [ + 8.86694957969211, + 52.396252369728415 + ], + [ + 8.85837679661331, + 52.39374971016013 + ], + [ + 8.855101141442411, + 52.38923412328942 + ], + [ + 8.786783987052615, + 52.39870647215561 + ], + [ + 8.746086795443585, + 52.387872222972774 + ], + [ + 8.72491388114986, + 52.400929226598265 + ], + [ + 8.715236303629514, + 52.39256879415206 + ], + [ + 8.707486372863782, + 52.39535126503696 + ], + [ + 8.710902090460364, + 52.40821506138475 + ], + [ + 8.704812068405923, + 52.41300904105851 + ], + [ + 8.704469274294068, + 52.419013165897425 + ], + [ + 8.709439689910981, + 52.42425089440475 + ], + [ + 8.717068847734275, + 52.42519186356069 + ], + [ + 8.71808068533185, + 52.429362910512005 + ], + [ + 8.703326107285472, + 52.44319479941195 + ], + [ + 8.7107091529936, + 52.463698015655126 + ], + [ + 8.709323024838762, + 52.47703584924315 + ], + [ + 8.698548986054817, + 52.4866982769972 + ], + [ + 8.70206180647102, + 52.50347337760163 + ], + [ + 8.69865282111199, + 52.50880737137397 + ], + [ + 8.68412213747445, + 52.51439466155152 + ], + [ + 8.69031361840823, + 52.51877456562046 + ], + [ + 8.671481467533107, + 52.5173946942938 + ], + [ + 8.652550123656718, + 52.53144342793753 + ], + [ + 8.556857517020939, + 52.499095652679266 + ], + [ + 8.516577169085583, + 52.5093153020686 + ], + [ + 8.508848531210432, + 52.514693375556824 + ], + [ + 8.48162895008405, + 52.496976930190954 + ], + [ + 8.472523497212963, + 52.498848145571074 + ], + [ + 8.458861052889935, + 52.49167228495779 + ], + [ + 8.45931298950112, + 52.473633321613185 + ], + [ + 8.45429005960774, + 52.461007062137014 + ], + [ + 8.429822491681762, + 52.44766958604482 + ], + [ + 8.425320748678612, + 52.451730477845466 + ], + [ + 8.417777570230397, + 52.449270046759146 + ], + [ + 8.418144994594284, + 52.44420229713239 + ], + [ + 8.401039510532751, + 52.45107542735406 + ], + [ + 8.386366204796081, + 52.447777652473825 + ], + [ + 8.385907189955644, + 52.44501657888015 + ], + [ + 8.359687310601636, + 52.44403112368321 + ], + [ + 8.345690702879555, + 52.45282315801197 + ], + [ + 8.33430400405074, + 52.45411222834995 + ], + [ + 8.32613101135611, + 52.45167062486265 + ], + [ + 8.311374097326611, + 52.45895155945493 + ], + [ + 8.30692030299067, + 52.45605441582242 + ], + [ + 8.303432823087771, + 52.45900479765338 + ], + [ + 8.297213681304198, + 52.45649790680952 + ], + [ + 8.308312698151989, + 52.44472554917185 + ], + [ + 8.303992534360837, + 52.434309108005 + ], + [ + 8.311724040549748, + 52.4363574120488 + ], + [ + 8.322037248500182, + 52.42616199841492 + ], + [ + 8.315882071017237, + 52.41252344310186 + ], + [ + 8.322902665291723, + 52.41072960877644 + ], + [ + 8.314038742526549, + 52.40572824349928 + ], + [ + 8.323537663013166, + 52.400349359404686 + ], + [ + 8.343918670633085, + 52.39771169749246 + ], + [ + 8.362981856739191, + 52.389945829852145 + ], + [ + 8.393053296605974, + 52.38463785821872 + ], + [ + 8.40095104535807, + 52.377446679645 + ], + [ + 8.432412468335801, + 52.3664550986936 + ], + [ + 8.442614889522172, + 52.35900988978495 + ], + [ + 8.460648530825187, + 52.3187319749583 + ], + [ + 8.472149144049359, + 52.31536409497061 + ], + [ + 8.464937357290061, + 52.30374360081827 + ], + [ + 8.459815835928325, + 52.30470024938609 + ], + [ + 8.457971599912801, + 52.30199669088372 + ], + [ + 8.459406936891472, + 52.28164236036633 + ], + [ + 8.463140818338323, + 52.28211974779086 + ], + [ + 8.466186370199647, + 52.26761383142456 + ], + [ + 8.458796591751623, + 52.25818487567607 + ], + [ + 8.463573784197193, + 52.25661965926696 + ], + [ + 8.468063211130977, + 52.24711366677051 + ], + [ + 8.459847691690992, + 52.24280137712855 + ], + [ + 8.461050875845759, + 52.229071498558824 + ], + [ + 8.44239179371433, + 52.21330681568581 + ], + [ + 8.460188309451018, + 52.195954636390724 + ], + [ + 8.517437324295553, + 52.1849504492298 + ], + [ + 8.505603294823072, + 52.179382181793464 + ], + [ + 8.49309517948417, + 52.16680108284654 + ], + [ + 8.485395749286194, + 52.165879779690115 + ], + [ + 8.480919405366308, + 52.15963180619459 + ], + [ + 8.46209214171106, + 52.15310377841418 + ], + [ + 8.45353379616296, + 52.15538695576305 + ], + [ + 8.41288158642533, + 52.137605644044335 + ], + [ + 8.404652012127368, + 52.129957147718244 + ], + [ + 8.403805013906315, + 52.12425545161557 + ], + [ + 8.411017577262554, + 52.117489240119006 + ], + [ + 8.404937058922057, + 52.11148888792054 + ], + [ + 8.388116119616088, + 52.10802514083595 + ], + [ + 8.373228238828544, + 52.109812468479305 + ], + [ + 8.36370564099861, + 52.118352857598495 + ], + [ + 8.323918346464584, + 52.12592199876621 + ], + [ + 8.311215340994362, + 52.11832908798072 + ], + [ + 8.285224937946518, + 52.12549866223907 + ], + [ + 8.287149520677945, + 52.13517179664269 + ], + [ + 8.273432501000707, + 52.13072355584386 + ], + [ + 8.266731884054417, + 52.13228120240287 + ], + [ + 8.262539078413473, + 52.120378485066276 + ], + [ + 8.245896154337265, + 52.12139729881037 + ], + [ + 8.208913878887168, + 52.09677429021981 + ], + [ + 8.192494536807171, + 52.07261933665121 + ], + [ + 8.172321675054498, + 52.07186741749234 + ], + [ + 8.151526689025575, + 52.0763644207178 + ], + [ + 8.13140135929656, + 52.07200820814122 + ], + [ + 8.129082926566634, + 52.068747936644286 + ], + [ + 8.096448168032627, + 52.057145181957 + ], + [ + 8.092398669030905, + 52.06342670463068 + ], + [ + 8.086882499295381, + 52.064598723449016 + ], + [ + 8.069898622930864, + 52.06518081670162 + ], + [ + 8.066703075985858, + 52.06812138804685 + ], + [ + 8.042459911261876, + 52.06305257973266 + ], + [ + 8.035195978409718, + 52.06452262890538 + ], + [ + 8.032748466987847, + 52.06844093438954 + ], + [ + 8.019258008807574, + 52.06229908431077 + ], + [ + 8.019098103414501, + 52.058606418996305 + ], + [ + 7.993717081084593, + 52.04963608640175 + ], + [ + 7.981101713356266, + 52.03551001568241 + ], + [ + 7.916921270765426, + 52.05163721283782 + ], + [ + 7.920704918432738, + 52.05799708677675 + ], + [ + 7.885188660088946, + 52.084935771185904 + ], + [ + 7.916065692737347, + 52.09607573997902 + ], + [ + 7.950916211465212, + 52.10258525941391 + ], + [ + 7.971769165876316, + 52.11598301454239 + ], + [ + 8.007796128995158, + 52.11533314491299 + ], + [ + 8.003504901191377, + 52.14965820720372 + ], + [ + 7.997776236495387, + 52.150339340059304 + ], + [ + 8.000626025704028, + 52.153305854962454 + ], + [ + 7.997386119836825, + 52.154479988358545 + ], + [ + 8.003146684179077, + 52.154555495292485 + ], + [ + 8.002046653380093, + 52.15995752703275 + ], + [ + 8.023015027307306, + 52.16017968345592 + ], + [ + 8.025188639466212, + 52.163509513271435 + ], + [ + 8.015161878792162, + 52.168611168360776 + ], + [ + 8.016978013416098, + 52.172050699505114 + ], + [ + 8.00591183379716, + 52.176041089690855 + ], + [ + 7.974333253442812, + 52.17113031579249 + ], + [ + 7.957451981263717, + 52.177943418516776 + ], + [ + 7.933986824658277, + 52.17692188689667 + ], + [ + 7.928353006380378, + 52.18125572814602 + ], + [ + 7.912948642893859, + 52.18513533582804 + ], + [ + 7.914245975587368, + 52.18787508412052 + ], + [ + 7.908109126762258, + 52.189863445693135 + ], + [ + 7.908852593361701, + 52.195027449260365 + ], + [ + 7.902993338012227, + 52.1988692861284 + ], + [ + 7.906342520567375, + 52.202523871311215 + ], + [ + 7.899840166832526, + 52.206828610268154 + ], + [ + 7.906361506211221, + 52.2080591397167 + ], + [ + 7.905751625167091, + 52.214084745072384 + ], + [ + 7.91278648345912, + 52.21736895615975 + ], + [ + 7.914577730726942, + 52.222933466407866 + ], + [ + 7.919821308730425, + 52.2216966839825 + ], + [ + 7.926549141484197, + 52.22654833554501 + ], + [ + 7.925623713831175, + 52.26281446184306 + ], + [ + 7.930214495607264, + 52.26538787198975 + ], + [ + 7.945734980646924, + 52.26531057781784 + ], + [ + 7.956465027180013, + 52.27249057894037 + ], + [ + 7.930761564993739, + 52.286422084409146 + ], + [ + 7.930025940823083, + 52.30215503123372 + ], + [ + 7.949574183867191, + 52.30587514364561 + ], + [ + 7.987240444473508, + 52.30358374629764 + ], + [ + 7.990608047644779, + 52.30953959087523 + ], + [ + 7.978010145031644, + 52.31270391515704 + ], + [ + 7.948563556086357, + 52.33512760904739 + ], + [ + 7.95349705587406, + 52.34722099732106 + ], + [ + 7.947781963082546, + 52.35009962675152 + ], + [ + 7.942009971846302, + 52.347568668078324 + ], + [ + 7.94392425047075, + 52.35558901044705 + ], + [ + 7.936669993853385, + 52.36497725671875 + ], + [ + 7.9216822026609, + 52.36561766169283 + ], + [ + 7.891770368088737, + 52.38051298120784 + ], + [ + 7.870512190192898, + 52.37749872344339 + ], + [ + 7.843035816166648, + 52.36902764689798 + ], + [ + 7.807088758695683, + 52.371427029476735 + ], + [ + 7.72343628875695, + 52.400165522512026 + ], + [ + 7.713777690073259, + 52.40098590539843 + ], + [ + 7.702342178971661, + 52.43437005755833 + ], + [ + 7.683545982754405, + 52.456565384785 + ], + [ + 7.667430904008794, + 52.456070040544105 + ], + [ + 7.66770613407625, + 52.45847943039301 + ], + [ + 7.656546757537409, + 52.45997611939137 + ], + [ + 7.655827185181307, + 52.462473632340256 + ], + [ + 7.603452520619055, + 52.47496744895712 + ], + [ + 7.583034404155018, + 52.45486324174427 + ], + [ + 7.57096547778186, + 52.432330502698164 + ], + [ + 7.564310993268271, + 52.43231221270695 + ], + [ + 7.602719467890825, + 52.42103069168474 + ], + [ + 7.601117635426473, + 52.41414293657977 + ], + [ + 7.582761603103493, + 52.403665872211896 + ], + [ + 7.583583468769305, + 52.39553896698813 + ], + [ + 7.571322354863529, + 52.38123506297675 + ], + [ + 7.582566161848537, + 52.37636947037941 + ], + [ + 7.577143585818477, + 52.37540055780911 + ], + [ + 7.57044831918533, + 52.37862159801996 + ], + [ + 7.560242413227735, + 52.37208078077819 + ], + [ + 7.565236310901901, + 52.37262627766461 + ], + [ + 7.563964485922527, + 52.370651955661984 + ], + [ + 7.543056880669209, + 52.36797749555973 + ], + [ + 7.539362630444412, + 52.37045250297543 + ], + [ + 7.529922924360616, + 52.369876429632804 + ], + [ + 7.504727355682732, + 52.360843698557304 + ], + [ + 7.479405082157625, + 52.34763948853561 + ], + [ + 7.43777648374884, + 52.33335651831077 + ], + [ + 7.427224313267955, + 52.314012515181574 + ], + [ + 7.403871786655209, + 52.312934696385184 + ], + [ + 7.396963799880388, + 52.30618486327852 + ], + [ + 7.386480325987149, + 52.30930415766743 + ], + [ + 7.370752596559083, + 52.30023743594604 + ], + [ + 7.36155453620013, + 52.288312394878744 + ], + [ + 7.34559491905113, + 52.28269012932965 + ], + [ + 7.317481058570898, + 52.280272243732426 + ], + [ + 7.297889792664836, + 52.263975123646695 + ], + [ + 7.155731622361413, + 52.26648114530685 + ], + [ + 7.121398968273652, + 52.26121746567406 + ], + [ + 7.109853543951367, + 52.25279700340174 + ], + [ + 7.105718667580479, + 52.24438755865477 + ], + [ + 7.067022804705662, + 52.24114109402029 + ], + [ + 7.042444894433589, + 52.25610336989152 + ], + [ + 7.028761159790517, + 52.27347827912748 + ], + [ + 7.026305099586018, + 52.287444123959844 + ], + [ + 7.041313987352503, + 52.311168522678585 + ], + [ + 7.038797581313369, + 52.31235370847811 + ], + [ + 7.04675937285644, + 52.31618521450056 + ], + [ + 7.047099677233664, + 52.323913348150285 + ], + [ + 7.056425347316357, + 52.33805785959478 + ], + [ + 7.072173798992238, + 52.35226636534672 + ], + [ + 7.072191567609038, + 52.373412437496505 + ], + [ + 7.058798136174794, + 52.39933158321771 + ], + [ + 7.03583489672375, + 52.402526170694365 + ], + [ + 7.022134784762472, + 52.422691594061334 + ], + [ + 7.010888672703284, + 52.42907306515986 + ], + [ + 6.991802702360056, + 52.467452566548445 + ], + [ + 6.987941692967614, + 52.46954097376436 + ], + [ + 6.977563104546445, + 52.46547651784777 + ], + [ + 6.96238147105568, + 52.44404649808723 + ], + [ + 6.941683815438387, + 52.43548963169357 + ], + [ + 6.861857723626541, + 52.4514144611684 + ], + [ + 6.852613058510515, + 52.44994295434756 + ], + [ + 6.854307604177399, + 52.45959874478981 + ], + [ + 6.774632592875929, + 52.45961191886208 + ], + [ + 6.753103464801812, + 52.463796972276235 + ], + [ + 6.697720003411312, + 52.486345212462766 + ], + [ + 6.70536722366836, + 52.52026431719556 + ], + [ + 6.680868310462061, + 52.55333639724526 + ], + [ + 6.716080523148221, + 52.548571013766555 + ], + [ + 6.726180960615611, + 52.56321200795681 + ], + [ + 6.752343289685394, + 52.559125455668955 + ], + [ + 6.766621548573863, + 52.561512581313096 + ], + [ + 6.718712999905786, + 52.588684276134614 + ], + [ + 6.727139788114002, + 52.61505111400625 + ], + [ + 6.710081175897692, + 52.6278426425583 + ], + [ + 6.726186860327983, + 52.63325511606766 + ], + [ + 6.741992061820708, + 52.64532407239984 + ], + [ + 6.758859955983491, + 52.64883841895636 + ], + [ + 6.767955360735368, + 52.64686145198065 + ], + [ + 6.783462530612883, + 52.65254225119713 + ], + [ + 6.80297216515261, + 52.65194029076379 + ], + [ + 6.82132599164078, + 52.64766967189482 + ], + [ + 6.832512330405422, + 52.651668719465555 + ], + [ + 6.851570062248134, + 52.648695155773886 + ], + [ + 6.873112273272574, + 52.653116656221556 + ], + [ + 6.879840777610395, + 52.6505466389438 + ], + [ + 6.897121444927429, + 52.65133273537397 + ], + [ + 6.913953219744005, + 52.64667497002834 + ], + [ + 6.919652199366302, + 52.63984134919113 + ], + [ + 6.953044622979287, + 52.6389449106708 + ], + [ + 6.975803860137166, + 52.64625658793744 + ], + [ + 6.992599679834205, + 52.64131481981991 + ], + [ + 7.002191443242358, + 52.6418311532641 + ], + [ + 7.012810744712354, + 52.63670765405382 + ], + [ + 7.041866612696227, + 52.63268050191147 + ], + [ + 7.055577136997135, + 52.64336988985195 + ], + [ + 7.072044834351442, + 52.81087438767061 + ], + [ + 7.09269194062809, + 52.838201072412474 + ], + [ + 7.087323856041009, + 52.849928586090485 + ], + [ + 7.181569824296965, + 52.941303849341566 + ], + [ + 7.209295072014284, + 53.000244578543885 + ], + [ + 7.217281326942331, + 53.00698383326268 + ], + [ + 7.212802469902274, + 53.01095825556692 + ], + [ + 7.199254856513749, + 53.081018499313075 + ], + [ + 7.202794359405297, + 53.113281649895015 + ], + [ + 7.182865370373132, + 53.12170903241791 + ], + [ + 7.185726584020929, + 53.12419127335768 + ], + [ + 7.180919461292062, + 53.12770462330305 + ], + [ + 7.17893796395619, + 53.138570459983136 + ], + [ + 7.189631670657043, + 53.14802640752695 + ], + [ + 7.190463814994431, + 53.16176176575458 + ], + [ + 7.20374265077043, + 53.17649963523552 + ], + [ + 7.227045346512249, + 53.17992265753859 + ], + [ + 7.207959576557775, + 53.18848437919349 + ], + [ + 7.217603713323118, + 53.198971019219506 + ], + [ + 7.20893521945462, + 53.24306470085908 + ], + [ + 7.219878176231378, + 53.248990389826034 + ], + [ + 7.232820610764164, + 53.26755903019752 + ], + [ + 7.236761480689277, + 53.28741144478653 + ], + [ + 7.22902718776902, + 53.294093927437984 + ], + [ + 7.242548905005716, + 53.30270302811959 + ], + [ + 7.245585669631365, + 53.31931913589343 + ], + [ + 7.25340920374381, + 53.322225269819896 + ], + [ + 7.294605439853042, + 53.31730772663031 + ], + [ + 7.302077587267336, + 53.32363801363603 + ], + [ + 7.270518433788508, + 53.32515064935613 + ], + [ + 7.270878667928852, + 53.33232110031044 + ], + [ + 7.267867349634601, + 53.326466283364546 + ], + [ + 7.225654840834012, + 53.333768055085386 + ], + [ + 7.060495437653347, + 53.33464059637245 + ], + [ + 7.049129172519282, + 53.3385053615193 + ], + [ + 7.02870546233893, + 53.33633698357531 + ], + [ + 7.012918474610112, + 53.344669090635975 + ], + [ + 6.99808948851655, + 53.36533380045536 + ], + [ + 6.998063314914442, + 53.37165585791263 + ], + [ + 7.007831881694504, + 53.3777614934319 + ], + [ + 7.011055096793426, + 53.38529934601875 + ], + [ + 7.007502454667017, + 53.39312309857143 + ], + [ + 7.01272791950764, + 53.40639163644866 + ], + [ + 7.010322348911057, + 53.42407633020484 + ], + [ + 7.024107546729883, + 53.48237144926262 + ], + [ + 7.048688446845871, + 53.508071890101164 + ], + [ + 7.038386602190833, + 53.5200356136822 + ], + [ + 7.033573098729682, + 53.53379015035211 + ], + [ + 7.040104105288278, + 53.538417506334916 + ], + [ + 7.063738851854398, + 53.52397432481763 + ], + [ + 7.076756058690663, + 53.532739715769445 + ], + [ + 7.092757855580449, + 53.51324713223138 + ], + [ + 7.108672626214303, + 53.51126758341465 + ], + [ + 7.099796375197489, + 53.515021659187354 + ], + [ + 7.100759533509834, + 53.52473524086287 + ], + [ + 7.122331302947595, + 53.52520902473599 + ], + [ + 7.1385177897058, + 53.53548083889804 + ], + [ + 7.13223394183362, + 53.53964612659768 + ], + [ + 7.136136935082932, + 53.541508755878965 + ], + [ + 7.127881528832905, + 53.54130715958044 + ], + [ + 7.117653085192565, + 53.548199784779364 + ], + [ + 7.120752540440499, + 53.55049812700618 + ], + [ + 7.087064983552602, + 53.57146719871703 + ], + [ + 7.090335705374252, + 53.579652244708925 + ], + [ + 7.112405360802028, + 53.59482231145564 + ], + [ + 7.14516835225513, + 53.610995228994724 + ], + [ + 7.154901762628205, + 53.6281319441994 + ], + [ + 7.155710520225687, + 53.62175218315251 + ], + [ + 7.156205632788372, + 53.626881249712014 + ], + [ + 7.160063572181282, + 53.62391844545653 + ], + [ + 7.163396838018356, + 53.62541061414901 + ], + [ + 7.158329769031997, + 53.62937618449907 + ], + [ + 7.166382020475048, + 53.62718603945052 + ], + [ + 7.170177253037975, + 53.62886842913096 + ], + [ + 7.182598817381326, + 53.64087219725976 + ], + [ + 7.243064732340629, + 53.66853916016499 + ], + [ + 7.281123230449029, + 53.67427457351914 + ], + [ + 7.290037187186682, + 53.67950764920028 + ], + [ + 7.331279777241057, + 53.6849960834446 + ], + [ + 7.360028445449537, + 53.68684560586183 + ], + [ + 7.360147919417685, + 53.6829583703299 + ], + [ + 7.36609120749772, + 53.6853098914217 + ], + [ + 7.381121709317028, + 53.681791729423864 + ], + [ + 7.480575982429153, + 53.68321072139289 + ], + [ + 7.515830242724792, + 53.67221102165475 + ], + [ + 7.527114210227, + 53.671499794212984 + ], + [ + 7.540485393035386, + 53.675203333151096 + ], + [ + 7.562794499692318, + 53.67573476200238 + ], + [ + 7.56957464052823, + 53.67999664817154 + ], + [ + 7.574327877700864, + 53.67510076510427 + ], + [ + 7.570601342757935, + 53.68042727305103 + ], + [ + 7.584429477805154, + 53.67950352374315 + ], + [ + 7.605921386692497, + 53.686550239724376 + ], + [ + 7.630539059907857, + 53.68883612979823 + ], + [ + 7.703838767770715, + 53.70351795369481 + ], + [ + 7.704646402176313, + 53.700137609856455 + ], + [ + 7.705828040776386, + 53.70344390204883 + ], + [ + 7.717559923964582, + 53.699592571526885 + ], + [ + 7.743120952519726, + 53.69973099493798 + ], + [ + 7.762996777126802, + 53.701699270199015 + ], + [ + 7.787804339169103, + 53.70942046736106 + ], + [ + 7.80970018683975, + 53.71095331692668 + ], + [ + 7.808923166882509, + 53.70689581322424 + ], + [ + 7.811680041240487, + 53.71148870051064 + ], + [ + 7.911923467351516, + 53.71783341815718 + ], + [ + 8.012121159670045, + 53.711703605298226 + ], + [ + 8.032130327160234, + 53.70527752555622 + ], + [ + 8.020358656503431, + 53.68366646985829 + ], + [ + 8.027028588391923, + 53.67894781258698 + ], + [ + 8.029593310804561, + 53.662658224382035 + ], + [ + 8.04232457810378, + 53.641385380397956 + ], + [ + 8.060519912627637, + 53.64241158234368 + ], + [ + 8.071187331910872, + 53.64709324472785 + ], + [ + 8.083842727247141, + 53.644106208456094 + ], + [ + 8.082118773692631, + 53.64194297546419 + ], + [ + 8.088599872184991, + 53.640860581749635 + ], + [ + 8.114287080720628, + 53.61612200277498 + ], + [ + 8.123346058832649, + 53.59860891661552 + ], + [ + 8.148863793622139, + 53.60183230581196 + ], + [ + 8.155599196467382, + 53.58575279771611 + ], + [ + 8.154433007520199, + 53.582900088247506 + ], + [ + 8.142359620732496, + 53.5796683784117 + ], + [ + 8.154395889965205, + 53.56383354839903 + ], + [ + 8.15133996807778, + 53.56082784859756 + ], + [ + 8.156040733542293, + 53.560724931264204 + ], + [ + 8.169434532095606, + 53.543534978411756 + ], + [ + 8.15736488160576, + 53.52916324875355 + ], + [ + 8.164322979046666, + 53.529286024990064 + ], + [ + 8.171247356905651, + 53.54021632384229 + ], + [ + 8.16477092350356, + 53.523271024618246 + ], + [ + 8.15465247454364, + 53.51454450540612 + ], + [ + 8.092631908452349, + 53.501915374447904 + ], + [ + 8.075224043017815, + 53.50208805734688 + ], + [ + 8.06132696259109, + 53.505956798164576 + ], + [ + 8.061118314926233, + 53.48260473067246 + ], + [ + 8.070897637478643, + 53.4649239837289 + ], + [ + 8.098998753460604, + 53.4456768418694 + ], + [ + 8.106697751957402, + 53.44806981072798 + ], + [ + 8.108940542617107, + 53.445651824840105 + ], + [ + 8.121530452856254, + 53.451726884562675 + ], + [ + 8.136941709686106, + 53.45268969599508 + ], + [ + 8.147046658210868, + 53.450052275801966 + ], + [ + 8.195372297630959, + 53.41219800982392 + ], + [ + 8.18977506719447, + 53.40959526903226 + ], + [ + 8.212110889271418, + 53.40118200010008 + ], + [ + 8.249282201879002, + 53.39803392334821 + ], + [ + 8.280468550763683, + 53.41337354762738 + ], + [ + 8.29764972250838, + 53.43063028723536 + ], + [ + 8.296834503190157, + 53.44219124823626 + ], + [ + 8.309525291088542, + 53.44887338806272 + ], + [ + 8.315217678689772, + 53.46179595993149 + ], + [ + 8.316961063426799, + 53.50438263684101 + ], + [ + 8.312829248655762, + 53.52001303191729 + ], + [ + 8.303363811910508, + 53.52548681115672 + ], + [ + 8.265547614900159, + 53.518541136509945 + ], + [ + 8.226915998354722, + 53.520083711981144 + ], + [ + 8.230826529968585, + 53.520775994028064 + ], + [ + 8.234318135496181, + 53.533762491038885 + ], + [ + 8.240912591942077, + 53.577707813481766 + ], + [ + 8.251516423229733, + 53.592543548622764 + ], + [ + 8.262598413664644, + 53.6000514659265 + ], + [ + 8.274476048534522, + 53.607087391072774 + ], + [ + 8.306412656677635, + 53.617682065475826 + ], + [ + 8.332372809639168, + 53.613384686923304 + ], + [ + 8.346606727012654, + 53.607682639415 + ], + [ + 8.356504045125046, + 53.59960055799297 + ], + [ + 8.353918415642868, + 53.59698682078916 + ], + [ + 8.358219070953856, + 53.597945631000535 + ], + [ + 8.38338893624592, + 53.57445862323116 + ], + [ + 8.396933695621314, + 53.56946435218345 + ], + [ + 8.43597655442918, + 53.56197885681921 + ], + [ + 8.464465384459787, + 53.55246966968755 + ], + [ + 8.476436612014755, + 53.55397400898337 + ], + [ + 8.502754124423078, + 53.55072088364061 + ], + [ + 8.517614478514556, + 53.55830070594653 + ], + [ + 8.516551564311362, + 53.5508291915495 + ], + [ + 8.521373490053396, + 53.54699655453517 + ], + [ + 8.550145963969932, + 53.53801829244522 + ], + [ + 8.554955123253656, + 53.524529650295 + ], + [ + 8.546469420637127, + 53.521261275262376 + ], + [ + 8.552684233566158, + 53.51617564458746 + ], + [ + 8.50981844512019, + 53.49833376828311 + ], + [ + 8.492651891758555, + 53.47241975947769 + ], + [ + 8.505789852931818, + 53.47117823667435 + ], + [ + 8.511604095042195, + 53.47666452411366 + ], + [ + 8.518634111680493, + 53.47444590381119 + ], + [ + 8.52971379624069, + 53.48034170040678 + ], + [ + 8.57376027765244, + 53.48864307269989 + ], + [ + 8.577306586624122, + 53.48545327792543 + ], + [ + 8.605904617424315, + 53.4842337862802 + ], + [ + 8.623028303598536, + 53.49353395391745 + ], + [ + 8.63144140176295, + 53.4936617626176 + ], + [ + 8.632154016969533, + 53.50166810836933 + ], + [ + 8.65055515732474, + 53.51078166507432 + ], + [ + 8.648232263441702, + 53.514303291341726 + ], + [ + 8.652134242375018, + 53.51601712524021 + ], + [ + 8.639775421480124, + 53.52528946936797 + ], + [ + 8.638655790477438, + 53.534953556350175 + ], + [ + 8.642051824930903, + 53.541683382393806 + ], + [ + 8.645226852489554, + 53.540472717553484 + ], + [ + 8.646354348842694, + 53.5555456717755 + ], + [ + 8.636334689453903, + 53.553686983432 + ], + [ + 8.630860355393823, + 53.55568958894531 + ], + [ + 8.616802851394747, + 53.574370036114345 + ], + [ + 8.617596345614901, + 53.57768990944312 + ], + [ + 8.62712558542194, + 53.57912011353061 + ], + [ + 8.64271581456452, + 53.59255941281019 + ], + [ + 8.63795573147082, + 53.59506742059681 + ], + [ + 8.650632387019975, + 53.60256521989858 + ], + [ + 8.62329626569269, + 53.605333334216965 + ], + [ + 8.592283299874302, + 53.59293261174721 + ], + [ + 8.558768776140356, + 53.6039069663585 + ], + [ + 8.533651067751817, + 53.60761767767018 + ], + [ + 8.526158867376962, + 53.60383991468742 + ], + [ + 8.52041036342612, + 53.606204878131486 + ], + [ + 8.483953343271075, + 53.655912765538275 + ], + [ + 8.483191312833727, + 53.69406805637262 + ], + [ + 8.52192291685659, + 53.750572949931865 + ], + [ + 8.518485450246967, + 53.75147074045836 + ], + [ + 8.528541825448334, + 53.76765202819693 + ], + [ + 8.532787377598522, + 53.76720139330704 + ], + [ + 8.528981476268477, + 53.76850704577728 + ], + [ + 8.53917767614578, + 53.78881077433555 + ], + [ + 8.541012727291438, + 53.786006649487206 + ], + [ + 8.54471624183884, + 53.788874352661864 + ], + [ + 8.537742594973896, + 53.79214080093758 + ], + [ + 8.541967178549198, + 53.8071399436569 + ], + [ + 8.566060343647457, + 53.84595761144613 + ], + [ + 8.575333473579985, + 53.84429451827398 + ], + [ + 8.60463015066955, + 53.87097419650647 + ], + [ + 8.60114222282061, + 53.874288713345294 + ], + [ + 8.614913869613385, + 53.8821182226146 + ], + [ + 8.62710851837603, + 53.88218556355365 + ], + [ + 8.669284523745086, + 53.89166607820709 + ], + [ + 8.686460992034995, + 53.89208873320967 + ], + [ + 8.687338331952079, + 53.88976287999694 + ] + ], + [ + [ + 8.504608166710035, + 53.22891929660262 + ], + [ + 8.481735118728864, + 53.226449542602836 + ], + [ + 8.504711920037412, + 53.20078605283261 + ], + [ + 8.535954642436154, + 53.18652685949399 + ], + [ + 8.581679925765084, + 53.17359377399384 + ], + [ + 8.611809772274798, + 53.17032195121267 + ], + [ + 8.620785825688236, + 53.166614519015134 + ], + [ + 8.63106656832012, + 53.1381756156032 + ], + [ + 8.651598158447891, + 53.12205076966399 + ], + [ + 8.651966922324473, + 53.116445418512676 + ], + [ + 8.657680503247901, + 53.11849192718939 + ], + [ + 8.654898618755622, + 53.10886458532636 + ], + [ + 8.669831091689062, + 53.102974702431794 + ], + [ + 8.666494272015543, + 53.091558799367604 + ], + [ + 8.673892633756504, + 53.086742034187466 + ], + [ + 8.700762704793005, + 53.082294260721355 + ], + [ + 8.709154809808052, + 53.075908334134894 + ], + [ + 8.709801137693614, + 53.04601821922462 + ], + [ + 8.731491653910052, + 53.03493253213112 + ], + [ + 8.743157437268732, + 53.040946037537765 + ], + [ + 8.756270723438107, + 53.03878054265169 + ], + [ + 8.754737151247225, + 53.04284127283564 + ], + [ + 8.763153718754666, + 53.046269859284095 + ], + [ + 8.762224722506083, + 53.05083167072952 + ], + [ + 8.770704765829844, + 53.05340697203283 + ], + [ + 8.778297674258118, + 53.039666684449955 + ], + [ + 8.80948416917235, + 53.030904114980395 + ], + [ + 8.8222469667878, + 53.02118916742984 + ], + [ + 8.838337447346381, + 53.01840619775398 + ], + [ + 8.850093686718434, + 53.023052855743195 + ], + [ + 8.848211871454101, + 53.01672400297423 + ], + [ + 8.854025742236496, + 53.020777087120585 + ], + [ + 8.866756113910215, + 53.02211723564252 + ], + [ + 8.861867115177695, + 53.036177882466006 + ], + [ + 8.867006164658232, + 53.04083261503706 + ], + [ + 8.867234971714893, + 53.03300381287035 + ], + [ + 8.893251968593326, + 53.014403580897365 + ], + [ + 8.915827047813707, + 53.011021378306516 + ], + [ + 8.921862030293942, + 53.01487622623795 + ], + [ + 8.935915497845368, + 53.01366695515236 + ], + [ + 8.938130436878907, + 53.0249856416254 + ], + [ + 8.946090130905093, + 53.024673720883165 + ], + [ + 8.94568549471928, + 53.03048401855428 + ], + [ + 8.966785901704233, + 53.03684956002267 + ], + [ + 8.980267134109532, + 53.046747056597425 + ], + [ + 8.969779855754535, + 53.05684822691882 + ], + [ + 8.963728919757703, + 53.057426216779675 + ], + [ + 8.960947194019049, + 53.06623205871044 + ], + [ + 8.966562242743663, + 53.06745362628188 + ], + [ + 8.965735401884244, + 53.08270145840527 + ], + [ + 8.961377207120085, + 53.08521811226193 + ], + [ + 8.965676498790652, + 53.09000158536557 + ], + [ + 8.99078035598644, + 53.09662616426188 + ], + [ + 8.988372046735092, + 53.09847551826897 + ], + [ + 8.981523847986912, + 53.09649345279226 + ], + [ + 8.970474093990475, + 53.101570426005416 + ], + [ + 8.96298904216229, + 53.10029863620715 + ], + [ + 8.959388732727206, + 53.11017046653 + ], + [ + 8.947017836734709, + 53.11610080899127 + ], + [ + 8.98418525302057, + 53.12607092984657 + ], + [ + 8.956631109750228, + 53.1472413034444 + ], + [ + 8.945082912166951, + 53.15201299020181 + ], + [ + 8.920907502248967, + 53.14465435614032 + ], + [ + 8.921026201078254, + 53.13965692272775 + ], + [ + 8.912143303863166, + 53.13261879951947 + ], + [ + 8.903929660461523, + 53.13817618591184 + ], + [ + 8.898539845744112, + 53.134248542824004 + ], + [ + 8.864023195191853, + 53.13172351482289 + ], + [ + 8.861770969188568, + 53.137636505917094 + ], + [ + 8.841855465139485, + 53.14823366322417 + ], + [ + 8.839826704080625, + 53.15741766651851 + ], + [ + 8.827221727345655, + 53.16123796221632 + ], + [ + 8.829227339050119, + 53.164376276558706 + ], + [ + 8.815091053916385, + 53.16393962658792 + ], + [ + 8.807362698039114, + 53.16065007917608 + ], + [ + 8.797141843894, + 53.16384393018478 + ], + [ + 8.789137013803707, + 53.160774142600594 + ], + [ + 8.782459373417051, + 53.16361168668038 + ], + [ + 8.775395748740646, + 53.15868402244027 + ], + [ + 8.761738569386145, + 53.165135224352895 + ], + [ + 8.741246363859554, + 53.16463551985254 + ], + [ + 8.743081930463509, + 53.17227749027655 + ], + [ + 8.733555139093898, + 53.172895581553846 + ], + [ + 8.728652284333279, + 53.18022448975544 + ], + [ + 8.714396466754591, + 53.18300239858995 + ], + [ + 8.706292567704319, + 53.17542111880866 + ], + [ + 8.699357718374403, + 53.185479430253025 + ], + [ + 8.677017357251176, + 53.175500962095796 + ], + [ + 8.674706128066312, + 53.17891920230609 + ], + [ + 8.66382835685825, + 53.17624384320961 + ], + [ + 8.659029625992176, + 53.17728169285197 + ], + [ + 8.652338930423085, + 53.188393154986436 + ], + [ + 8.643666420801473, + 53.18922400746934 + ], + [ + 8.627994029664665, + 53.19837235203289 + ], + [ + 8.609010790655317, + 53.19201135145315 + ], + [ + 8.606891682686202, + 53.187662666516935 + ], + [ + 8.592154263348245, + 53.18470937022162 + ], + [ + 8.588962219398885, + 53.1899825893063 + ], + [ + 8.580352119095535, + 53.19002768400021 + ], + [ + 8.585068588332875, + 53.1962248202564 + ], + [ + 8.581097701704895, + 53.198707246275006 + ], + [ + 8.595812800645838, + 53.20643589308046 + ], + [ + 8.599039075620652, + 53.212546229128144 + ], + [ + 8.578477887820995, + 53.21726952277953 + ], + [ + 8.572281808118797, + 53.21076907192033 + ], + [ + 8.566405422025067, + 53.213559774120355 + ], + [ + 8.553698911154836, + 53.207805800259514 + ], + [ + 8.540782167051168, + 53.21537751713142 + ], + [ + 8.530234736296732, + 53.21608950112712 + ], + [ + 8.517333845503478, + 53.228496506049815 + ], + [ + 8.504608166710035, + 53.22891929660262 + ] + ], + [ + [ + 8.64382953712814, + 53.610103206683355 + ], + [ + 8.64376917660616, + 53.60547338656171 + ], + [ + 8.657717087554946, + 53.602985611287615 + ], + [ + 8.660884274068112, + 53.60708643578497 + ], + [ + 8.64382953712814, + 53.610103206683355 + ] + ], + [ + [ + 8.611903031514444, + 53.19744233585235 + ], + [ + 8.615217568233339, + 53.19591091818733 + ], + [ + 8.616397736621458, + 53.19702603906715 + ], + [ + 8.613037882304306, + 53.19856578091858 + ], + [ + 8.611903031514444, + 53.19744233585235 + ] + ] + ], + [ + [ + [ + 6.800336726668767, + 53.60747543853057 + ], + [ + 6.812697182846539, + 53.60187027415089 + ], + [ + 6.796886242458153, + 53.597183937254044 + ], + [ + 6.754629496687834, + 53.596242906084775 + ], + [ + 6.73556944273322, + 53.58709349021537 + ], + [ + 6.71811012806304, + 53.58403653243215 + ], + [ + 6.716662064756662, + 53.5822781517087 + ], + [ + 6.727190430078238, + 53.58126723781023 + ], + [ + 6.732857977431715, + 53.57584600369764 + ], + [ + 6.738571858491539, + 53.57544892061347 + ], + [ + 6.741363234956417, + 53.57085599303054 + ], + [ + 6.757290678997048, + 53.56797171802734 + ], + [ + 6.758660921319396, + 53.562974869733885 + ], + [ + 6.752273130709539, + 53.559090812049384 + ], + [ + 6.752972304112041, + 53.56291344186519 + ], + [ + 6.747146591480616, + 53.56264643075133 + ], + [ + 6.747974415722839, + 53.55746986069908 + ], + [ + 6.743376199296777, + 53.55727719295021 + ], + [ + 6.741987387269026, + 53.560144353412504 + ], + [ + 6.740467040978571, + 53.5571286451477 + ], + [ + 6.741134353702146, + 53.56052941023808 + ], + [ + 6.744297571890541, + 53.56233974542538 + ], + [ + 6.734130966119054, + 53.5697087959801 + ], + [ + 6.707032785615428, + 53.56877030411584 + ], + [ + 6.718858275706664, + 53.55841774594584 + ], + [ + 6.665334765829411, + 53.577523957742365 + ], + [ + 6.656973736562668, + 53.58364836999978 + ], + [ + 6.653795670897639, + 53.59521466477268 + ], + [ + 6.667021848838204, + 53.603196280738864 + ], + [ + 6.74934423770015, + 53.61724900546073 + ], + [ + 6.772029455822015, + 53.61602707081068 + ], + [ + 6.800336726668767, + 53.60747543853057 + ] + ] + ], + [ + [ + [ + 7.340108546539629, + 53.7262785726821 + ], + [ + 7.347234775606133, + 53.723604942456255 + ], + [ + 7.346966784749553, + 53.718658688813996 + ], + [ + 7.30060726562843, + 53.70887576900638 + ], + [ + 7.288764389999351, + 53.71153878045059 + ], + [ + 7.294932627986038, + 53.708027823016515 + ], + [ + 7.270238321322113, + 53.703690349863734 + ], + [ + 7.215462468336977, + 53.70359024531514 + ], + [ + 7.208766399256479, + 53.706599396639504 + ], + [ + 7.193784461939363, + 53.699104493065875 + ], + [ + 7.177801614886327, + 53.70133311153669 + ], + [ + 7.170355802803735, + 53.7078528064029 + ], + [ + 7.165098446621409, + 53.706347149640024 + ], + [ + 7.16945157665491, + 53.701206086778804 + ], + [ + 7.163578941532953, + 53.70014205347065 + ], + [ + 7.166648345849812, + 53.70417054800868 + ], + [ + 7.161721717896264, + 53.70173491986321 + ], + [ + 7.164608147618412, + 53.69755319338176 + ], + [ + 7.152755845994021, + 53.69687666268659 + ], + [ + 7.142038017541003, + 53.70060779233003 + ], + [ + 7.137296138242692, + 53.706975536912395 + ], + [ + 7.143431005413708, + 53.71116352521939 + ], + [ + 7.187149811476086, + 53.72280194152556 + ], + [ + 7.340108546539629, + 53.7262785726821 + ] + ] + ], + [ + [ + [ + 7.549557822409548, + 53.75868026455836 + ], + [ + 7.61317589872015, + 53.75703731998956 + ], + [ + 7.627290852912576, + 53.75422499877683 + ], + [ + 7.631366182862087, + 53.74806495774143 + ], + [ + 7.629776555936131, + 53.745742440973345 + ], + [ + 7.571564573116831, + 53.748425319023085 + ], + [ + 7.539201716290232, + 53.743687506198455 + ], + [ + 7.514685128924476, + 53.74383334149098 + ], + [ + 7.50186530405515, + 53.73534002764395 + ], + [ + 7.505967013374686, + 53.72411480976205 + ], + [ + 7.502653169151528, + 53.73088644069018 + ], + [ + 7.494174559701261, + 53.72642252509199 + ], + [ + 7.495687061082492, + 53.723064403171385 + ], + [ + 7.482648434729344, + 53.72602345018203 + ], + [ + 7.475435156771283, + 53.720708689606916 + ], + [ + 7.461113078382665, + 53.72418866463517 + ], + [ + 7.469256590052603, + 53.74610934124962 + ], + [ + 7.479802090640886, + 53.75436031744093 + ], + [ + 7.549557822409548, + 53.75868026455836 + ] + ] + ], + [ + [ + [ + 7.724526369593851, + 53.78200970007334 + ], + [ + 7.813396161180071, + 53.78151554119442 + ], + [ + 7.81578259259749, + 53.77733333411815 + ], + [ + 7.795162037363826, + 53.7692502210881 + ], + [ + 7.757310595581929, + 53.760430883206354 + ], + [ + 7.702442432381079, + 53.763757068573184 + ], + [ + 7.698384202508756, + 53.76205657867933 + ], + [ + 7.69592374831926, + 53.765608616243256 + ], + [ + 7.682719389774212, + 53.75092871035946 + ], + [ + 7.669600252223757, + 53.753936489043234 + ], + [ + 7.666253634829091, + 53.76342282135973 + ], + [ + 7.682100910551232, + 53.77579558542981 + ], + [ + 7.700330065251219, + 53.781037995668605 + ], + [ + 7.724526369593851, + 53.78200970007334 + ] + ] + ], + [ + [ + [ + 7.065485817787951, + 53.68689720856881 + ], + [ + 7.092227011125651, + 53.685560567479314 + ], + [ + 7.099752608494291, + 53.680949807279504 + ], + [ + 7.095617475896664, + 53.67696655319814 + ], + [ + 7.088523631842541, + 53.67992325752029 + ], + [ + 7.051643248553896, + 53.679054898018485 + ], + [ + 7.016866995810597, + 53.67400618330745 + ], + [ + 6.995911609559063, + 53.67428588906713 + ], + [ + 6.995977717606451, + 53.67023851491404 + ], + [ + 6.988418620796075, + 53.67423667165952 + ], + [ + 6.976176893995561, + 53.66959927100876 + ], + [ + 6.970747967799925, + 53.67215871133912 + ], + [ + 6.918431745562989, + 53.66591635917628 + ], + [ + 6.886932548243639, + 53.664079090045405 + ], + [ + 6.874884953950093, + 53.66669703035132 + ], + [ + 6.860345242279399, + 53.662271443720236 + ], + [ + 6.851816677909825, + 53.66304844077124 + ], + [ + 6.869396469340474, + 53.671391553330196 + ], + [ + 7.065485817787951, + 53.68689720856881 + ] + ] + ], + [ + [ + [ + 7.885377132267765, + 53.79455315447173 + ], + [ + 7.954792714773673, + 53.78697125487866 + ], + [ + 7.97258710350359, + 53.78233917820967 + ], + [ + 7.97771262589472, + 53.77934934028289 + ], + [ + 7.977601276558898, + 53.776575258313414 + ], + [ + 7.974228631850302, + 53.780309851932344 + ], + [ + 7.968849402569134, + 53.77923333614798 + ], + [ + 7.969431973262648, + 53.77576431404563 + ], + [ + 7.945264611088658, + 53.78239212240215 + ], + [ + 7.9350192742147, + 53.77986016205206 + ], + [ + 7.913324116502394, + 53.78047347199809 + ], + [ + 7.870324831282104, + 53.78953436165343 + ], + [ + 7.864772766781386, + 53.773067318340665 + ], + [ + 7.846417509508545, + 53.787975095193744 + ], + [ + 7.866020988843809, + 53.79412602161151 + ], + [ + 7.885377132267765, + 53.79455315447173 + ] + ] + ], + [ + [ + [ + 7.391896092967454, + 53.73581424338216 + ], + [ + 7.433598038763538, + 53.73111920776043 + ], + [ + 7.431967014875174, + 53.72294206649767 + ], + [ + 7.417555462217908, + 53.719681747359246 + ], + [ + 7.387160966740923, + 53.72008764246763 + ], + [ + 7.367260760334135, + 53.72357972846851 + ], + [ + 7.361815283733223, + 53.72111373517696 + ], + [ + 7.36043481372399, + 53.72802625076782 + ], + [ + 7.391896092967454, + 53.73581424338216 + ] + ] + ], + [ + [ + [ + 8.16171548182457, + 53.71929827615373 + ], + [ + 8.152815442999279, + 53.71256580604267 + ], + [ + 8.137405721441738, + 53.7150556145272 + ], + [ + 8.123409076473495, + 53.7097204945193 + ], + [ + 8.1243509072943, + 53.71844491479621 + ], + [ + 8.140891561448504, + 53.730068219111175 + ], + [ + 8.165411201805934, + 53.73188764722782 + ], + [ + 8.186005492115743, + 53.72853008829377 + ], + [ + 8.163489230887045, + 53.722114363376704 + ], + [ + 8.16171548182457, + 53.71929827615373 + ] + ] + ], + [ + [ + [ + 6.900066024854413, + 53.64781783984333 + ], + [ + 6.910214478600123, + 53.64375724498301 + ], + [ + 6.899183964951272, + 53.64005669112935 + ], + [ + 6.891464334832098, + 53.6316914201487 + ], + [ + 6.897920419396109, + 53.62721457645709 + ], + [ + 6.888034486373503, + 53.625712160800724 + ], + [ + 6.87756298710416, + 53.62838095420279 + ], + [ + 6.865525644030625, + 53.63926221186697 + ], + [ + 6.866240133016332, + 53.645114705000566 + ], + [ + 6.898485507569963, + 53.653864948693766 + ], + [ + 6.905670645910909, + 53.65224129112005 + ], + [ + 6.900066024854413, + 53.64781783984333 + ] + ] + ], + [ + [ + [ + 9.681371670097269, + 53.562552612272235 + ], + [ + 9.702779642830231, + 53.55897698238306 + ], + [ + 9.774388785404046, + 53.554323058135914 + ], + [ + 9.774232561884448, + 53.55358255517106 + ], + [ + 9.759327192882008, + 53.551196575291335 + ], + [ + 9.738606661449722, + 53.555662507378365 + ], + [ + 9.699421784032564, + 53.558550877658504 + ], + [ + 9.694357892077575, + 53.56027981845698 + ], + [ + 9.677454937984802, + 53.55652837585751 + ], + [ + 9.662940588846505, + 53.56421296691843 + ], + [ + 9.681371670097269, + 53.562552612272235 + ] + ] + ], + [ + [ + [ + 8.016274564387642, + 53.77563067770623 + ], + [ + 8.017878765768312, + 53.768590729227235 + ], + [ + 8.014702980457624, + 53.769522278856655 + ], + [ + 8.013458496666907, + 53.76581879957506 + ], + [ + 8.006208253719773, + 53.76864231768747 + ], + [ + 8.003871601658352, + 53.76499203745875 + ], + [ + 7.993838865481193, + 53.76968607581576 + ], + [ + 8.004216442587, + 53.77466468835466 + ], + [ + 8.008331392146895, + 53.78085129812107 + ], + [ + 8.016274564387642, + 53.77563067770623 + ] + ] + ], + [ + [ + [ + 9.44471913014453, + 53.719943159388784 + ], + [ + 9.462476257464045, + 53.71411388657636 + ], + [ + 9.47662058602697, + 53.70506205624637 + ], + [ + 9.476239454105098, + 53.69820744008031 + ], + [ + 9.440689426849856, + 53.719509391061884 + ], + [ + 9.44471913014453, + 53.719943159388784 + ] + ] + ], + [ + [ + [ + 8.013035818875055, + 53.75993908439074 + ], + [ + 8.024003267863353, + 53.7571066242314 + ], + [ + 8.024881911055154, + 53.74356598306915 + ], + [ + 8.009421172286126, + 53.750472393744424 + ], + [ + 8.00821771068195, + 53.75814955156292 + ], + [ + 8.013035818875055, + 53.75993908439074 + ] + ] + ], + [ + [ + [ + 9.6102669194814, + 53.5840575219107 + ], + [ + 9.5929706768088, + 53.587838053119874 + ], + [ + 9.572127803680166, + 53.602124034583355 + ], + [ + 9.590165892652953, + 53.59561740276304 + ], + [ + 9.6102669194814, + 53.5840575219107 + ] + ] + ], + [ + [ + [ + 6.865011210101977, + 53.591101676671954 + ], + [ + 6.865541705054671, + 53.59093292795018 + ], + [ + 6.868922264440023, + 53.59189273676996 + ], + [ + 6.863739487188561, + 53.589005510040764 + ], + [ + 6.865011210101977, + 53.591101676671954 + ] + ] + ], + [ + [ + [ + 8.02651693940672, + 53.75720311978527 + ], + [ + 8.025291520156706, + 53.75722624389639 + ], + [ + 8.020995931663666, + 53.76293574138879 + ], + [ + 8.026102330765085, + 53.75860462643274 + ], + [ + 8.02651693940672, + 53.75720311978527 + ] + ] + ], + [ + [ + [ + 9.526888873603745, + 53.6638491881235 + ], + [ + 9.526049459175344, + 53.6637950376509 + ], + [ + 9.519747366348675, + 53.674319873244556 + ], + [ + 9.526849744961636, + 53.664256584791985 + ], + [ + 9.526888873603745, + 53.6638491881235 + ] + ] + ], + [ + [ + [ + 9.773735266415043, + 53.550903311288074 + ], + [ + 9.773577413549281, + 53.550060770308384 + ], + [ + 9.773121532820396, + 53.55043875649932 + ], + [ + 9.773735266415043, + 53.550903311288074 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "13", + "AGS": "13", + "SDV_RS": "130040000000", + "GEN": "Mecklenburg-Vorpommern", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "13", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE8", + "RS_0": "130000000000", + "AGS_0": "13000000", + "WSK": "2014/11/01", + "DEBKG_ID": "DEBKGDL20000004A", + "destatis": { + "population": 1599138, + "population_m": 787945, + "population_w": 811193 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 12.524002997430136, + 54.48672847226828 + ], + [ + 12.528354029339823, + 54.48553596478796 + ], + [ + 12.518488411339456, + 54.48428270201526 + ], + [ + 12.530101415530366, + 54.48172281828857 + ], + [ + 12.525076445204837, + 54.47863576097798 + ], + [ + 12.526536537950134, + 54.475076010199466 + ], + [ + 12.529398228065455, + 54.48001600025229 + ], + [ + 12.527654758930549, + 54.47310134696531 + ], + [ + 12.521532240142415, + 54.47291085973604 + ], + [ + 12.52140027952822, + 54.47711506390106 + ], + [ + 12.517178610631609, + 54.47519382703817 + ], + [ + 12.521798448798483, + 54.46921772016448 + ], + [ + 12.525064018763437, + 54.471891930144515 + ], + [ + 12.539489608419162, + 54.46103016448184 + ], + [ + 12.560918153153697, + 54.45472725776022 + ], + [ + 12.676584980971466, + 54.442182465559014 + ], + [ + 12.819364689474508, + 54.44007216065967 + ], + [ + 12.920989457368139, + 54.44509465148167 + ], + [ + 12.915394374549665, + 54.4388291868618 + ], + [ + 12.926951676208503, + 54.42796397308866 + ], + [ + 12.911515813051665, + 54.41998203029131 + ], + [ + 12.900788447666994, + 54.42054816516187 + ], + [ + 12.874948301261245, + 54.413712243757764 + ], + [ + 12.857539153709844, + 54.42077323113409 + ], + [ + 12.831864395756135, + 54.4230575119679 + ], + [ + 12.812399377645148, + 54.41731516049597 + ], + [ + 12.801847089238127, + 54.40869883325221 + ], + [ + 12.786029448469368, + 54.417371081547266 + ], + [ + 12.770632870598838, + 54.41715038852972 + ], + [ + 12.763237888621664, + 54.41253520051538 + ], + [ + 12.740056859268158, + 54.4152272007015 + ], + [ + 12.725814247558656, + 54.43014083080802 + ], + [ + 12.721032708119736, + 54.43237459538144 + ], + [ + 12.711464681056096, + 54.42824390346051 + ], + [ + 12.693160014778329, + 54.43225405725137 + ], + [ + 12.669319029592618, + 54.42143966971637 + ], + [ + 12.667525902677932, + 54.41856948279955 + ], + [ + 12.668039958323442, + 54.410137969111815 + ], + [ + 12.666362237016868, + 54.40864686846858 + ], + [ + 12.6531477103785, + 54.41050736053979 + ], + [ + 12.647681032858284, + 54.41870260472474 + ], + [ + 12.638081608832922, + 54.42551240450446 + ], + [ + 12.617191074772869, + 54.41795374517063 + ], + [ + 12.610652448929825, + 54.41091018039833 + ], + [ + 12.617513313253605, + 54.4072528989453 + ], + [ + 12.602664186444139, + 54.40943113506992 + ], + [ + 12.577890986178497, + 54.404328982196716 + ], + [ + 12.57748176987434, + 54.396369294447915 + ], + [ + 12.597820657774468, + 54.39156656595285 + ], + [ + 12.592285113855311, + 54.383636900847954 + ], + [ + 12.58706820497634, + 54.38949855443434 + ], + [ + 12.552502909275175, + 54.390124524155716 + ], + [ + 12.535395062164676, + 54.38167620690543 + ], + [ + 12.525821047042415, + 54.38066617107644 + ], + [ + 12.517720219090267, + 54.372699814009955 + ], + [ + 12.49564322755167, + 54.38238971611945 + ], + [ + 12.436138350208061, + 54.379088804429664 + ], + [ + 12.433463272313109, + 54.37573183098544 + ], + [ + 12.418490618004318, + 54.37223009208302 + ], + [ + 12.414104597150176, + 54.36514423355347 + ], + [ + 12.420974232619285, + 54.350425230703074 + ], + [ + 12.416072550623499, + 54.335386334425095 + ], + [ + 12.40590663034905, + 54.33722798419397 + ], + [ + 12.398826181117576, + 54.34448785792452 + ], + [ + 12.384501908478072, + 54.3406159203898 + ], + [ + 12.396665485060016, + 54.332401050186846 + ], + [ + 12.396028654610173, + 54.323499223587845 + ], + [ + 12.382731463693526, + 54.310089635585236 + ], + [ + 12.364965669960053, + 54.310299490649605 + ], + [ + 12.358043148019629, + 54.30193037501658 + ], + [ + 12.366986743003375, + 54.288525116463674 + ], + [ + 12.382455672699642, + 54.278146706079646 + ], + [ + 12.37768960908225, + 54.27222923228097 + ], + [ + 12.366070896468804, + 54.269289154696466 + ], + [ + 12.363647430531174, + 54.26583165639821 + ], + [ + 12.40114418203692, + 54.250133595531494 + ], + [ + 12.435806261801345, + 54.24482327740945 + ], + [ + 12.45966973933289, + 54.24795022315277 + ], + [ + 12.46000843263378, + 54.250575885882334 + ], + [ + 12.449994469431616, + 54.25448572420061 + ], + [ + 12.417734010742377, + 54.25869368836346 + ], + [ + 12.409596259695068, + 54.26816475365469 + ], + [ + 12.40935579974038, + 54.28003921991967 + ], + [ + 12.417808755996024, + 54.288861616715344 + ], + [ + 12.434553388225464, + 54.29659357098505 + ], + [ + 12.478728044380256, + 54.30392873669633 + ], + [ + 12.479550412736184, + 54.31225732545498 + ], + [ + 12.471596474665661, + 54.32215810578139 + ], + [ + 12.473091151465638, + 54.32960979205657 + ], + [ + 12.4955821501036, + 54.33047408403496 + ], + [ + 12.499402010431464, + 54.33352539234813 + ], + [ + 12.514864065931445, + 54.3354602678741 + ], + [ + 12.526266027423693, + 54.33392966304594 + ], + [ + 12.535702203001529, + 54.338429263993405 + ], + [ + 12.538895399279552, + 54.35249370017447 + ], + [ + 12.55329477806369, + 54.35614150632701 + ], + [ + 12.552579069150537, + 54.35955385765036 + ], + [ + 12.535692590316907, + 54.36255502882504 + ], + [ + 12.53433352359382, + 54.365175595147264 + ], + [ + 12.554682421292005, + 54.372512578066505 + ], + [ + 12.553757068532361, + 54.3795855375024 + ], + [ + 12.566506448375915, + 54.37158119066622 + ], + [ + 12.581704476729035, + 54.37338404845862 + ], + [ + 12.57465798821795, + 54.358598823216035 + ], + [ + 12.585803925087642, + 54.35623301058896 + ], + [ + 12.598816067668478, + 54.361805303700116 + ], + [ + 12.6006588976678, + 54.369153460762206 + ], + [ + 12.59685275176319, + 54.371811803779636 + ], + [ + 12.621987285564183, + 54.372130375772464 + ], + [ + 12.629097870102527, + 54.37675687993006 + ], + [ + 12.655315498791435, + 54.383607255800285 + ], + [ + 12.662521594350434, + 54.38990015313797 + ], + [ + 12.671370199005086, + 54.3909456556424 + ], + [ + 12.67143718254911, + 54.395165069118384 + ], + [ + 12.660222263450573, + 54.398580315958114 + ], + [ + 12.659055619952735, + 54.40453183548031 + ], + [ + 12.667457392203596, + 54.40441610705823 + ], + [ + 12.668525236969668, + 54.408133445187644 + ], + [ + 12.68403253102104, + 54.40632732102964 + ], + [ + 12.7074894222532, + 54.41187866737971 + ], + [ + 12.714610036564023, + 54.40396849961889 + ], + [ + 12.688808018191878, + 54.40028436170729 + ], + [ + 12.685625754390873, + 54.39366093069609 + ], + [ + 12.693484911744102, + 54.3860811996795 + ], + [ + 12.681622936356355, + 54.380897369952194 + ], + [ + 12.676439896122629, + 54.37057865899298 + ], + [ + 12.682938469735198, + 54.371419538838 + ], + [ + 12.688406840468861, + 54.3681346588333 + ], + [ + 12.682587050916597, + 54.37440506613926 + ], + [ + 12.696490015837952, + 54.38513563019009 + ], + [ + 12.700087770173917, + 54.398483293152466 + ], + [ + 12.714848482792497, + 54.3989625486345 + ], + [ + 12.71360726379155, + 54.38663256971995 + ], + [ + 12.719571338397062, + 54.371756127330684 + ], + [ + 12.73715465568772, + 54.369573292196954 + ], + [ + 12.744056326652485, + 54.3840608522525 + ], + [ + 12.754510715258007, + 54.37101213106296 + ], + [ + 12.768902802706467, + 54.37160915392387 + ], + [ + 12.774797049534035, + 54.388813822605435 + ], + [ + 12.786491814472173, + 54.39644470818413 + ], + [ + 12.78500124067751, + 54.37947451313246 + ], + [ + 12.795708551296133, + 54.37779675396152 + ], + [ + 12.804007439848435, + 54.370401205533085 + ], + [ + 12.809663608544275, + 54.34360109017538 + ], + [ + 12.817529697842138, + 54.35096448654832 + ], + [ + 12.846313775637634, + 54.35107724936379 + ], + [ + 12.865535645312299, + 54.362325362524544 + ], + [ + 12.878088494052083, + 54.36499793865797 + ], + [ + 12.897716254505188, + 54.40167037010575 + ], + [ + 12.92637267370671, + 54.413955705437985 + ], + [ + 12.953808565206492, + 54.41659020083312 + ], + [ + 12.958925817266856, + 54.42310709508385 + ], + [ + 12.989452398691315, + 54.425883896478496 + ], + [ + 12.995446223800233, + 54.42801847924254 + ], + [ + 13.001450512970429, + 54.437025908760404 + ], + [ + 13.01577802202017, + 54.439393224526796 + ], + [ + 13.028011327506606, + 54.43692398171397 + ], + [ + 13.03427354695725, + 54.431688966471185 + ], + [ + 13.034138235864418, + 54.424222035526036 + ], + [ + 13.02477672607718, + 54.42211840426115 + ], + [ + 13.020222249367887, + 54.41235907510351 + ], + [ + 13.025666121596267, + 54.396506893491406 + ], + [ + 13.038606788180012, + 54.39023506567318 + ], + [ + 13.048460396918887, + 54.3801255598268 + ], + [ + 13.07290454823119, + 54.38305103650089 + ], + [ + 13.08257837604014, + 54.37943038389691 + ], + [ + 13.092195762278516, + 54.36899452581549 + ], + [ + 13.093650003867364, + 54.364381136360564 + ], + [ + 13.085173423591362, + 54.35988280032528 + ], + [ + 13.075831769671847, + 54.34580123225456 + ], + [ + 13.087535011422256, + 54.320055871369924 + ], + [ + 13.099219632024058, + 54.3175842304834 + ], + [ + 13.111952652633162, + 54.30565900997019 + ], + [ + 13.103635564091038, + 54.283441308995435 + ], + [ + 13.132832483648226, + 54.269001282856784 + ], + [ + 13.153245581893405, + 54.268738022502696 + ], + [ + 13.16659804977282, + 54.27893985501411 + ], + [ + 13.176957586680082, + 54.27150196591034 + ], + [ + 13.176645583478257, + 54.26648770403197 + ], + [ + 13.161528739660508, + 54.26792163398939 + ], + [ + 13.146100493835863, + 54.26034555514354 + ], + [ + 13.143236689419068, + 54.253388037107186 + ], + [ + 13.1619511148568, + 54.25978223636884 + ], + [ + 13.167175031798585, + 54.26623279240337 + ], + [ + 13.17268195164214, + 54.26309172309027 + ], + [ + 13.185336941341491, + 54.266342545652314 + ], + [ + 13.190234667769655, + 54.258934452802066 + ], + [ + 13.20232149675444, + 54.2574195869167 + ], + [ + 13.21621586810721, + 54.24981628896397 + ], + [ + 13.210483593076129, + 54.24466233313793 + ], + [ + 13.215672969938947, + 54.24121220946072 + ], + [ + 13.259698906375403, + 54.24110657546086 + ], + [ + 13.291229097628854, + 54.23403459710119 + ], + [ + 13.306337121566722, + 54.204323206604315 + ], + [ + 13.32660818510378, + 54.18382359660869 + ], + [ + 13.347469072781571, + 54.18011146899717 + ], + [ + 13.33665740053555, + 54.17700110966803 + ], + [ + 13.340661722950896, + 54.173828780055686 + ], + [ + 13.335253028730417, + 54.173951313255195 + ], + [ + 13.316391960422667, + 54.160125498210824 + ], + [ + 13.337272728873941, + 54.167504159115175 + ], + [ + 13.346995493175285, + 54.16529080652924 + ], + [ + 13.37900287010842, + 54.177114089622016 + ], + [ + 13.406051317557587, + 54.16924182997702 + ], + [ + 13.4077837150282, + 54.162592978879616 + ], + [ + 13.380285696305382, + 54.15206790068528 + ], + [ + 13.383266742992584, + 54.143157437700324 + ], + [ + 13.398940084283005, + 54.1461464919669 + ], + [ + 13.410834735507702, + 54.1561883647822 + ], + [ + 13.406736828937497, + 54.14703561243014 + ], + [ + 13.428047388844377, + 54.137777607691596 + ], + [ + 13.439969047958133, + 54.123023428177234 + ], + [ + 13.439190038169622, + 54.11227381495498 + ], + [ + 13.448100724049988, + 54.10184402420559 + ], + [ + 13.457879950074528, + 54.097263494532825 + ], + [ + 13.455995030893453, + 54.09213153479495 + ], + [ + 13.464650697505041, + 54.08797883356283 + ], + [ + 13.489404453856254, + 54.083845782542056 + ], + [ + 13.501440022987644, + 54.08558037244265 + ], + [ + 13.476314776321423, + 54.117610203083174 + ], + [ + 13.49255178303412, + 54.125208466997755 + ], + [ + 13.52915001622646, + 54.1310574551659 + ], + [ + 13.55972069808235, + 54.13045634704195 + ], + [ + 13.605564161576272, + 54.136556573905345 + ], + [ + 13.627850025494022, + 54.140948294113414 + ], + [ + 13.648866294035175, + 54.1518559562274 + ], + [ + 13.65929493166909, + 54.14510529729707 + ], + [ + 13.661649746186413, + 54.14628254186255 + ], + [ + 13.649284984126123, + 54.15303030402614 + ], + [ + 13.6961985427943, + 54.17230989804991 + ], + [ + 13.71218587609366, + 54.16926099982562 + ], + [ + 13.718302120068527, + 54.163229567986576 + ], + [ + 13.695619561355207, + 54.15793611744592 + ], + [ + 13.69738920860644, + 54.14892290660929 + ], + [ + 13.718690844942982, + 54.14458480534585 + ], + [ + 13.733568107514644, + 54.134949036366535 + ], + [ + 13.731748538995925, + 54.13682945233372 + ], + [ + 13.749066128722378, + 54.13978287329423 + ], + [ + 13.751573912245785, + 54.13478964233972 + ], + [ + 13.747314704983141, + 54.13459580841519 + ], + [ + 13.762463711444218, + 54.12791082783284 + ], + [ + 13.753115095347, + 54.12266461598114 + ], + [ + 13.754606451658994, + 54.12012422156046 + ], + [ + 13.76554166453745, + 54.11932756770892 + ], + [ + 13.770114934172788, + 54.11374837772716 + ], + [ + 13.78013303995071, + 54.107986047895864 + ], + [ + 13.796984150645851, + 54.10530351402721 + ], + [ + 13.803993004752748, + 54.09714616538192 + ], + [ + 13.793369996568508, + 54.085522087381335 + ], + [ + 13.795335358624811, + 54.07755166283361 + ], + [ + 13.78949166010408, + 54.07092650506366 + ], + [ + 13.79016878254814, + 54.06441493118695 + ], + [ + 13.7850403835639, + 54.065572726828634 + ], + [ + 13.773806348246389, + 54.059802087974326 + ], + [ + 13.785380770240995, + 54.05085076993212 + ], + [ + 13.782645259964225, + 54.04754293636763 + ], + [ + 13.7613965750886, + 54.035653651424596 + ], + [ + 13.744317476814235, + 54.03262647308472 + ], + [ + 13.743604332031424, + 54.02871742857311 + ], + [ + 13.749534276487225, + 54.026244898284276 + ], + [ + 13.757695006001109, + 54.0277784571737 + ], + [ + 13.760540241266927, + 54.015454818700285 + ], + [ + 13.79554426841775, + 53.99580861678154 + ], + [ + 13.810881141431805, + 53.99530216306804 + ], + [ + 13.83382162403247, + 53.98442862836341 + ], + [ + 13.853849802602687, + 53.96462893073078 + ], + [ + 13.852625101080918, + 53.95275542286169 + ], + [ + 13.856599698924164, + 53.950102710306986 + ], + [ + 13.86979291546573, + 53.95239243674952 + ], + [ + 13.88131484954302, + 53.94979509071791 + ], + [ + 13.884566373221167, + 53.94443489996476 + ], + [ + 13.894151942091659, + 53.94268714727463 + ], + [ + 13.914106242710455, + 53.92185745907383 + ], + [ + 13.90328711299315, + 53.91099614184393 + ], + [ + 13.887366981821463, + 53.91015533953119 + ], + [ + 13.864752438751916, + 53.90046065928238 + ], + [ + 13.851308795825862, + 53.888327942746244 + ], + [ + 13.847222143689011, + 53.87795046423105 + ], + [ + 13.824876894116747, + 53.877236612072906 + ], + [ + 13.824689887247626, + 53.864698483100526 + ], + [ + 13.806297974329889, + 53.85913633194592 + ], + [ + 13.810011406588513, + 53.85800968278478 + ], + [ + 13.808221727944982, + 53.85480257280863 + ], + [ + 13.816141307970124, + 53.85293613646309 + ], + [ + 13.814410129103546, + 53.84603439418266 + ], + [ + 13.821665337302791, + 53.846958853227676 + ], + [ + 13.815710919700459, + 53.8436775455537 + ], + [ + 13.8498147173103, + 53.843127100804935 + ], + [ + 13.86776954784841, + 53.83543249840073 + ], + [ + 13.874385010852098, + 53.82010344988017 + ], + [ + 13.882281174613295, + 53.8179795622624 + ], + [ + 13.89896409497842, + 53.8035435405148 + ], + [ + 13.907897563085484, + 53.80210011561607 + ], + [ + 13.915948868926586, + 53.80635028604445 + ], + [ + 13.922219674666234, + 53.79765893584435 + ], + [ + 13.933394087014904, + 53.79715994291295 + ], + [ + 13.936928140714437, + 53.79114766410895 + ], + [ + 13.96877065650725, + 53.77254659353925 + ], + [ + 13.97090915442885, + 53.77417631827461 + ], + [ + 13.998892154389328, + 53.76646518556466 + ], + [ + 14.005200133283441, + 53.76712293371158 + ], + [ + 14.04906066475817, + 53.75281034996617 + ], + [ + 14.059756565305321, + 53.755323777535565 + ], + [ + 14.078256603602272, + 53.74627436081831 + ], + [ + 14.098075902437323, + 53.74415366727195 + ], + [ + 14.10273277853702, + 53.73978212129152 + ], + [ + 14.124438494651216, + 53.73722142821027 + ], + [ + 14.146532031143424, + 53.74207374332026 + ], + [ + 14.165997291992873, + 53.74202649107726 + ], + [ + 14.17420671154215, + 53.735538133014316 + ], + [ + 14.181202456179141, + 53.73522509206596 + ], + [ + 14.210139391327896, + 53.74745120744418 + ], + [ + 14.233120994262084, + 53.76165408524485 + ], + [ + 14.253117229499386, + 53.75706528002913 + ], + [ + 14.265917855847581, + 53.74906438725283 + ], + [ + 14.271662832499036, + 53.73925874743922 + ], + [ + 14.265777286991467, + 53.735478061300064 + ], + [ + 14.265678324895404, + 53.730346229598574 + ], + [ + 14.258858867386936, + 53.72820304809022 + ], + [ + 14.251216287832028, + 53.719493449497946 + ], + [ + 14.218621917286479, + 53.709006106735465 + ], + [ + 14.214806661167902, + 53.70314280460063 + ], + [ + 14.219794592883785, + 53.699033351958995 + ], + [ + 14.245380460758838, + 53.69368901479938 + ], + [ + 14.26727673230592, + 53.69851121134434 + ], + [ + 14.272549138318636, + 53.68936248485722 + ], + [ + 14.283681257633726, + 53.682503981159805 + ], + [ + 14.281114520746014, + 53.67295222227639 + ], + [ + 14.270778297427182, + 53.666583912406914 + ], + [ + 14.28464420068983, + 53.65880037729367 + ], + [ + 14.283849903192584, + 53.634443072256374 + ], + [ + 14.31111047570796, + 53.618454184563866 + ], + [ + 14.316948093601166, + 53.61806704748951 + ], + [ + 14.313961394527752, + 53.56522579192094 + ], + [ + 14.302557317199529, + 53.553404663578696 + ], + [ + 14.307281279720986, + 53.551336374812344 + ], + [ + 14.305766651475727, + 53.54392093872716 + ], + [ + 14.31585286250533, + 53.53693279911786 + ], + [ + 14.319356752446662, + 53.52983283209403 + ], + [ + 14.315746775461982, + 53.52514862314428 + ], + [ + 14.326882895382326, + 53.50381049166067 + ], + [ + 14.350647880704823, + 53.49600626876192 + ], + [ + 14.358030169345323, + 53.45731457618646 + ], + [ + 14.37128148473524, + 53.45643955088371 + ], + [ + 14.368621342754178, + 53.432612616841304 + ], + [ + 14.373283270346503, + 53.408950732653466 + ], + [ + 14.394794064837157, + 53.375719357700966 + ], + [ + 14.39032232302705, + 53.35370943495799 + ], + [ + 14.405479040424753, + 53.347088029110566 + ], + [ + 14.412381008544738, + 53.32959336345732 + ], + [ + 14.39536668923372, + 53.32888334732782 + ], + [ + 14.381543152394745, + 53.32388693125456 + ], + [ + 14.376636295298356, + 53.316282396331616 + ], + [ + 14.361642648658673, + 53.31756161823804 + ], + [ + 14.361933978079307, + 53.315212073383535 + ], + [ + 14.350244776861507, + 53.3137559793141 + ], + [ + 14.348957936651521, + 53.30998995723957 + ], + [ + 14.31656942147679, + 53.312335547972445 + ], + [ + 14.301854253811007, + 53.28622361062099 + ], + [ + 14.262188669946472, + 53.27660236195031 + ], + [ + 14.266048355976588, + 53.25959485296453 + ], + [ + 14.211057785961147, + 53.25481373373707 + ], + [ + 14.200159460384416, + 53.26177238632363 + ], + [ + 14.175976626327836, + 53.26207169206201 + ], + [ + 14.160239070220907, + 53.267810714182474 + ], + [ + 14.12478909771317, + 53.26022516442164 + ], + [ + 14.098817345760569, + 53.261671915447984 + ], + [ + 14.109653480601855, + 53.28263829009179 + ], + [ + 14.182130423918073, + 53.32641358723366 + ], + [ + 14.223406621444035, + 53.35856323030549 + ], + [ + 14.243142634070596, + 53.39230278053881 + ], + [ + 14.236838219654546, + 53.414631114996226 + ], + [ + 14.241790504934054, + 53.42243725745555 + ], + [ + 14.237712312530538, + 53.42734197916876 + ], + [ + 14.224661387871267, + 53.43424798562114 + ], + [ + 14.20591111349775, + 53.42302691066436 + ], + [ + 14.176961663362285, + 53.42286728995732 + ], + [ + 14.136759840686377, + 53.44100114985572 + ], + [ + 14.13401005658737, + 53.439038151160304 + ], + [ + 14.121843779927282, + 53.44170762279631 + ], + [ + 14.10542610093823, + 53.42242613946261 + ], + [ + 14.09392242528066, + 53.42211997258983 + ], + [ + 14.082240653882765, + 53.415518935751884 + ], + [ + 14.082350187553704, + 53.41100211254312 + ], + [ + 14.070388343221891, + 53.415006599713934 + ], + [ + 14.051325002711168, + 53.41337115608848 + ], + [ + 14.045604130974723, + 53.42942541906938 + ], + [ + 14.006591071071384, + 53.430410880595886 + ], + [ + 14.001216931640622, + 53.434991562648 + ], + [ + 13.962079707782587, + 53.42989693565613 + ], + [ + 13.946492796818838, + 53.43081063013523 + ], + [ + 13.916373270042705, + 53.42226627121634 + ], + [ + 13.902893508290168, + 53.432025014471265 + ], + [ + 13.911394952069093, + 53.43654868180955 + ], + [ + 13.906287561579468, + 53.443882946973226 + ], + [ + 13.917505496185559, + 53.44652703074172 + ], + [ + 13.918213427350251, + 53.45599846969253 + ], + [ + 13.875591802271698, + 53.473466196262514 + ], + [ + 13.884590220179915, + 53.48533669442799 + ], + [ + 13.876228132953065, + 53.48701447305088 + ], + [ + 13.873924620763134, + 53.4905949192662 + ], + [ + 13.879268138939178, + 53.50413995579448 + ], + [ + 13.848404712080526, + 53.51431058947938 + ], + [ + 13.821728496694734, + 53.51811033817292 + ], + [ + 13.823415741422789, + 53.52193447722345 + ], + [ + 13.798463285136021, + 53.54568960468578 + ], + [ + 13.80057052128722, + 53.55825461877525 + ], + [ + 13.791347174739661, + 53.55857792790511 + ], + [ + 13.78424189093473, + 53.5518362659649 + ], + [ + 13.776376073849724, + 53.53129005934471 + ], + [ + 13.780431034948649, + 53.521553032865 + ], + [ + 13.77765738864566, + 53.51370533784851 + ], + [ + 13.792463026913126, + 53.51094196055818 + ], + [ + 13.801283437421079, + 53.49822968089819 + ], + [ + 13.809829415664822, + 53.50212029734321 + ], + [ + 13.827102381680731, + 53.498713706390646 + ], + [ + 13.812126823679137, + 53.48429637578012 + ], + [ + 13.802029983301834, + 53.478027069315715 + ], + [ + 13.77893925700333, + 53.474215230174075 + ], + [ + 13.75297612807133, + 53.478275582481324 + ], + [ + 13.741372836177598, + 53.48580699817795 + ], + [ + 13.735781326959247, + 53.48141305505548 + ], + [ + 13.715399780529161, + 53.48226087679135 + ], + [ + 13.702992186910219, + 53.473645171574745 + ], + [ + 13.66256231805055, + 53.457739649908696 + ], + [ + 13.651289688548617, + 53.44369090238775 + ], + [ + 13.640500226967305, + 53.44723875102921 + ], + [ + 13.633898244800045, + 53.43986754623057 + ], + [ + 13.638886397982901, + 53.43805545787316 + ], + [ + 13.637299503676525, + 53.43258406588457 + ], + [ + 13.628841215210109, + 53.431999781828175 + ], + [ + 13.636017347251922, + 53.42351863460039 + ], + [ + 13.625216953353814, + 53.40930256585382 + ], + [ + 13.619049676757221, + 53.40894641712937 + ], + [ + 13.617607213135551, + 53.41301274326823 + ], + [ + 13.610508935084637, + 53.41375914241802 + ], + [ + 13.593482041294484, + 53.407784222679666 + ], + [ + 13.589311433313101, + 53.40969702569941 + ], + [ + 13.57361865008258, + 53.408093373819966 + ], + [ + 13.56406352529738, + 53.4007594598775 + ], + [ + 13.550112203732994, + 53.39908127127465 + ], + [ + 13.546206523509156, + 53.394195017411725 + ], + [ + 13.556587111971165, + 53.39156274445111 + ], + [ + 13.550206569450962, + 53.380936426491346 + ], + [ + 13.55679567776443, + 53.37963936440619 + ], + [ + 13.55636989626535, + 53.376092379042035 + ], + [ + 13.54743100365871, + 53.3718993280164 + ], + [ + 13.543424502213798, + 53.36403224316386 + ], + [ + 13.525997360699087, + 53.36634695564585 + ], + [ + 13.516854328841296, + 53.35209251438891 + ], + [ + 13.525261423753955, + 53.3510204157488 + ], + [ + 13.519633995260612, + 53.337967282387886 + ], + [ + 13.523531386266077, + 53.32008458279725 + ], + [ + 13.510114439671518, + 53.317449414915764 + ], + [ + 13.502842523932943, + 53.32733324392135 + ], + [ + 13.507267351722025, + 53.31623291061068 + ], + [ + 13.496419038597947, + 53.30663297299122 + ], + [ + 13.497327260664115, + 53.302231627862454 + ], + [ + 13.483063872294752, + 53.291203395360114 + ], + [ + 13.461282869901881, + 53.28869303818295 + ], + [ + 13.456185331636, + 53.29795499260923 + ], + [ + 13.438231700952949, + 53.299807537840145 + ], + [ + 13.434949826079007, + 53.2947230141314 + ], + [ + 13.438730754245995, + 53.291987966208175 + ], + [ + 13.434024055371982, + 53.29029266023592 + ], + [ + 13.44240133013741, + 53.28648496317305 + ], + [ + 13.435129710556508, + 53.28278236287559 + ], + [ + 13.431510176888882, + 53.28455101153434 + ], + [ + 13.420875469716059, + 53.26958704155276 + ], + [ + 13.413260237509542, + 53.26302015547943 + ], + [ + 13.407683756115375, + 53.26263085879585 + ], + [ + 13.405174674132697, + 53.246418234321155 + ], + [ + 13.386417975549177, + 53.24411678793182 + ], + [ + 13.38611000536222, + 53.25047580986594 + ], + [ + 13.38220544704102, + 53.25039680797982 + ], + [ + 13.370632438208634, + 53.26175920407404 + ], + [ + 13.368601805260237, + 53.27103783293513 + ], + [ + 13.36045059902044, + 53.27799893232217 + ], + [ + 13.349203210186266, + 53.27825848517706 + ], + [ + 13.33707571235413, + 53.273427815238826 + ], + [ + 13.297801778454899, + 53.28089250070041 + ], + [ + 13.284415602640163, + 53.27567465559215 + ], + [ + 13.27531389232599, + 53.265060792883425 + ], + [ + 13.252714247667479, + 53.26230544076827 + ], + [ + 13.24375124792105, + 53.24869111490479 + ], + [ + 13.251243005745252, + 53.24738983754913 + ], + [ + 13.23965135137384, + 53.23894298372442 + ], + [ + 13.238833468472968, + 53.22550966491718 + ], + [ + 13.229391856157877, + 53.216586894876095 + ], + [ + 13.20268101018945, + 53.22212072046235 + ], + [ + 13.181914293530877, + 53.25073407124972 + ], + [ + 13.175203910628513, + 53.24717577250282 + ], + [ + 13.16379645820794, + 53.24975994875721 + ], + [ + 13.152505881159895, + 53.24624816787554 + ], + [ + 13.15193008393299, + 53.25108836949428 + ], + [ + 13.137411603334204, + 53.244618114010784 + ], + [ + 13.132976753765414, + 53.237317540619685 + ], + [ + 13.118353667970013, + 53.24128060427803 + ], + [ + 13.109925574031692, + 53.24022827444652 + ], + [ + 13.103262173735708, + 53.23554035470529 + ], + [ + 13.108277658074892, + 53.225549369079914 + ], + [ + 13.10645216013818, + 53.21527764395387 + ], + [ + 13.097091843477559, + 53.21304928186143 + ], + [ + 13.093809081146192, + 53.2170881337396 + ], + [ + 13.087270011387659, + 53.215400157033216 + ], + [ + 13.07843184842566, + 53.20466796482851 + ], + [ + 13.079532890371828, + 53.20018375351221 + ], + [ + 13.069129516265741, + 53.203640371161974 + ], + [ + 13.05560323053877, + 53.20105445593335 + ], + [ + 13.042414509195057, + 53.19649940180966 + ], + [ + 13.02801118860066, + 53.1855914159149 + ], + [ + 13.0187274987223, + 53.18524596519173 + ], + [ + 13.020037207367928, + 53.17570996917992 + ], + [ + 13.009133314598165, + 53.17285008804932 + ], + [ + 13.004614653331982, + 53.16691744132569 + ], + [ + 12.991544408314017, + 53.16855505450378 + ], + [ + 12.980466332488923, + 53.16252656651348 + ], + [ + 12.968517509473067, + 53.166366298884256 + ], + [ + 12.961513638003105, + 53.177737670049225 + ], + [ + 12.947271596946058, + 53.172501302408975 + ], + [ + 12.941998414459887, + 53.1743154690227 + ], + [ + 12.979433532356008, + 53.19055156983593 + ], + [ + 12.976586947098529, + 53.19773214682348 + ], + [ + 12.964244871625205, + 53.200391511809265 + ], + [ + 12.947207073366334, + 53.19915946610658 + ], + [ + 12.937114712508833, + 53.19431551018211 + ], + [ + 12.943927325782239, + 53.190922637373454 + ], + [ + 12.942431011067073, + 53.1859265227484 + ], + [ + 12.934397869560483, + 53.18822704856015 + ], + [ + 12.919965668098628, + 53.18637684695818 + ], + [ + 12.929737504020013, + 53.194417218838566 + ], + [ + 12.912841904238281, + 53.195174150900385 + ], + [ + 12.892039930376825, + 53.187950268670264 + ], + [ + 12.889492297457002, + 53.180404711326524 + ], + [ + 12.880109597913071, + 53.17969011624764 + ], + [ + 12.868143487525366, + 53.18721572216953 + ], + [ + 12.858871614185263, + 53.18817731201022 + ], + [ + 12.845979183686255, + 53.20140215240422 + ], + [ + 12.837911673819045, + 53.19725783184835 + ], + [ + 12.824692307489283, + 53.19705096554576 + ], + [ + 12.82078748440408, + 53.19341995682338 + ], + [ + 12.817167562976923, + 53.19606053213395 + ], + [ + 12.81487183682584, + 53.19197620038474 + ], + [ + 12.810259420727794, + 53.19539973674536 + ], + [ + 12.81292538434751, + 53.197408771354404 + ], + [ + 12.808879483372271, + 53.197647027104274 + ], + [ + 12.799087274216253, + 53.19106867941956 + ], + [ + 12.790276595346223, + 53.191233873806915 + ], + [ + 12.78492043385946, + 53.187844749828216 + ], + [ + 12.764381357098497, + 53.18893054526703 + ], + [ + 12.759146610511127, + 53.19500350614855 + ], + [ + 12.739492981764148, + 53.19960159048524 + ], + [ + 12.749508544473503, + 53.20632811725749 + ], + [ + 12.757585676653834, + 53.224232766755975 + ], + [ + 12.74695669458334, + 53.22563040177645 + ], + [ + 12.722738168880474, + 53.22166880488693 + ], + [ + 12.671179074702314, + 53.22950464427927 + ], + [ + 12.663967039252606, + 53.234950597020706 + ], + [ + 12.669438776736637, + 53.23711085229214 + ], + [ + 12.666239815044197, + 53.24155558942259 + ], + [ + 12.675657612159778, + 53.24771916092771 + ], + [ + 12.668288589210938, + 53.24816447981228 + ], + [ + 12.660937691084268, + 53.25440286901241 + ], + [ + 12.62841923590438, + 53.25455521331564 + ], + [ + 12.606046711850986, + 53.244395455921676 + ], + [ + 12.549913352980516, + 53.26198049888386 + ], + [ + 12.529768323104001, + 53.264788319871386 + ], + [ + 12.502400594580415, + 53.26217228722753 + ], + [ + 12.50278576638851, + 53.25777820838144 + ], + [ + 12.497630933538975, + 53.25520086974752 + ], + [ + 12.467090952479067, + 53.256234229367934 + ], + [ + 12.445312163573385, + 53.24992826272 + ], + [ + 12.43157987681481, + 53.262580218125194 + ], + [ + 12.428008561564077, + 53.27498756165929 + ], + [ + 12.409842759479716, + 53.27967993884586 + ], + [ + 12.400425054059001, + 53.279186189401685 + ], + [ + 12.391832331107056, + 53.28505686237156 + ], + [ + 12.398232220894132, + 53.29465907834695 + ], + [ + 12.394247807879589, + 53.301805353837985 + ], + [ + 12.363312773953895, + 53.306711316116434 + ], + [ + 12.342998587559382, + 53.315915207144506 + ], + [ + 12.311021588057542, + 53.323218160027515 + ], + [ + 12.310765272233963, + 53.32724170738088 + ], + [ + 12.291303295422482, + 53.328676787324994 + ], + [ + 12.260207483207, + 53.323912182461704 + ], + [ + 12.260007360507814, + 53.32772280583779 + ], + [ + 12.245293925370998, + 53.33301353927523 + ], + [ + 12.23643016386807, + 53.3419790132648 + ], + [ + 12.22943532941068, + 53.35816053072821 + ], + [ + 12.212185135173677, + 53.353161061384284 + ], + [ + 12.191119706636828, + 53.353951088945905 + ], + [ + 12.185970017679711, + 53.350282803624026 + ], + [ + 12.186848422740574, + 53.34333491440908 + ], + [ + 12.168560473525911, + 53.3391169786147 + ], + [ + 12.156507838265245, + 53.34971713535692 + ], + [ + 12.151951146496405, + 53.3615052343245 + ], + [ + 12.141261634201665, + 53.359055147188926 + ], + [ + 12.139441255370922, + 53.361416720778315 + ], + [ + 12.134450321604772, + 53.34843037667571 + ], + [ + 12.108576477187041, + 53.349664995792224 + ], + [ + 12.10917305347315, + 53.3438061050489 + ], + [ + 12.092089178747614, + 53.344856408151315 + ], + [ + 12.082077564321056, + 53.346298661364926 + ], + [ + 12.077546786993818, + 53.369386812620306 + ], + [ + 12.045284958893362, + 53.37098764327016 + ], + [ + 12.051371611380386, + 53.366868813526025 + ], + [ + 12.04740381831178, + 53.36123918617707 + ], + [ + 12.057339345280234, + 53.34934209745194 + ], + [ + 12.038711890500261, + 53.34508211596349 + ], + [ + 12.014610854425943, + 53.33442359863308 + ], + [ + 12.022075129323888, + 53.321288747474654 + ], + [ + 12.01850605061246, + 53.315434691782436 + ], + [ + 12.023639492292483, + 53.30414308499181 + ], + [ + 12.018530147864512, + 53.29959472078551 + ], + [ + 12.002820551528655, + 53.29964426746239 + ], + [ + 11.997066745008716, + 53.293905635890496 + ], + [ + 11.987695475120107, + 53.295661067686275 + ], + [ + 11.986470174833206, + 53.299825420159394 + ], + [ + 11.973857892373013, + 53.29915948765036 + ], + [ + 11.965708626780344, + 53.285226268314794 + ], + [ + 11.949458598560186, + 53.27179811013475 + ], + [ + 11.94541785308124, + 53.274335938544766 + ], + [ + 11.904701494280232, + 53.27459043956443 + ], + [ + 11.892603005445805, + 53.2789811287978 + ], + [ + 11.88986116744363, + 53.269051126874125 + ], + [ + 11.866859037153239, + 53.25655141653971 + ], + [ + 11.86174684215571, + 53.248216918551975 + ], + [ + 11.816670405106793, + 53.25418942550615 + ], + [ + 11.796115927372416, + 53.25365688059163 + ], + [ + 11.80369182907764, + 53.24662185115996 + ], + [ + 11.817224964269498, + 53.24525139608887 + ], + [ + 11.831880829079369, + 53.23464503342966 + ], + [ + 11.828893642032309, + 53.228655024317426 + ], + [ + 11.808470315863532, + 53.226448738757355 + ], + [ + 11.769071031935896, + 53.227491112017894 + ], + [ + 11.748356827096567, + 53.219911952156394 + ], + [ + 11.729017504816616, + 53.217053515542645 + ], + [ + 11.727526667983396, + 53.23166458161582 + ], + [ + 11.714625445373326, + 53.23050765260754 + ], + [ + 11.700389817024702, + 53.24415001299734 + ], + [ + 11.690951935002968, + 53.24175642059293 + ], + [ + 11.667011121151399, + 53.24421851074625 + ], + [ + 11.65545796071717, + 53.23955224399295 + ], + [ + 11.640199165644786, + 53.23864798150502 + ], + [ + 11.628762122828872, + 53.24239249950526 + ], + [ + 11.61975628975109, + 53.23810836154007 + ], + [ + 11.617227712972648, + 53.23031121929637 + ], + [ + 11.603644288865592, + 53.227434288932976 + ], + [ + 11.58664008305401, + 53.21471748077994 + ], + [ + 11.57563693303471, + 53.211960483279114 + ], + [ + 11.562320506061438, + 53.21281161740709 + ], + [ + 11.551317200250615, + 53.20854674447648 + ], + [ + 11.560579867103595, + 53.20267318469532 + ], + [ + 11.557823813697683, + 53.18485856832438 + ], + [ + 11.56707970607861, + 53.18249488122587 + ], + [ + 11.562541792266334, + 53.17535067597735 + ], + [ + 11.569467070517945, + 53.16660637386569 + ], + [ + 11.555869293026042, + 53.15409398852689 + ], + [ + 11.556524810771554, + 53.15041946232552 + ], + [ + 11.550083332351415, + 53.15107432951107 + ], + [ + 11.555961848346486, + 53.13877893532739 + ], + [ + 11.54694280643412, + 53.13474633990575 + ], + [ + 11.548510907998248, + 53.13082253217899 + ], + [ + 11.536372312630558, + 53.129242015358585 + ], + [ + 11.534572128981582, + 53.12531834683707 + ], + [ + 11.510049322711572, + 53.12554328035426 + ], + [ + 11.502223232336524, + 53.121386088956854 + ], + [ + 11.500484063741931, + 53.12642114422363 + ], + [ + 11.48408134151456, + 53.129033363701666 + ], + [ + 11.473430083400418, + 53.12725149114758 + ], + [ + 11.473707469937239, + 53.1346094417258 + ], + [ + 11.460835197559451, + 53.14023122260026 + ], + [ + 11.438672634578998, + 53.13669280746192 + ], + [ + 11.421764244077886, + 53.140948355835974 + ], + [ + 11.413903223000336, + 53.13669801199715 + ], + [ + 11.395627505148992, + 53.140000238410344 + ], + [ + 11.391800969450808, + 53.12965422498328 + ], + [ + 11.400568233142858, + 53.11581842805746 + ], + [ + 11.393767787124393, + 53.110302570283785 + ], + [ + 11.386792657593046, + 53.11255116258724 + ], + [ + 11.370908392713709, + 53.1115558586168 + ], + [ + 11.359020823117408, + 53.116317334488684 + ], + [ + 11.3366175147458, + 53.11374620292129 + ], + [ + 11.317235508941076, + 53.12000826992774 + ], + [ + 11.31024784267957, + 53.1162342203974 + ], + [ + 11.29041744197146, + 53.11690346266199 + ], + [ + 11.282967054738148, + 53.12143720417901 + ], + [ + 11.265731920701217, + 53.12197789416601 + ], + [ + 11.245697267988898, + 53.13642192289616 + ], + [ + 11.223380281045241, + 53.143774422326636 + ], + [ + 11.21263669315227, + 53.14414313865799 + ], + [ + 11.195277988509826, + 53.13553244105529 + ], + [ + 11.185655356264547, + 53.135775558727545 + ], + [ + 11.171861639261417, + 53.1566442013392 + ], + [ + 11.189082437178438, + 53.16561954401038 + ], + [ + 11.194111224811964, + 53.181186027403214 + ], + [ + 11.179890859658522, + 53.186677202222604 + ], + [ + 11.136703673511835, + 53.19184227867575 + ], + [ + 11.144989788576941, + 53.197778556127766 + ], + [ + 11.136510950699497, + 53.19940495722243 + ], + [ + 11.138486824829133, + 53.202504794213084 + ], + [ + 11.115520265861747, + 53.2045100260836 + ], + [ + 11.080144557629223, + 53.22052073132944 + ], + [ + 11.062258288590412, + 53.235453173252175 + ], + [ + 11.0275719855871, + 53.2789399153827 + ], + [ + 11.00945596378458, + 53.281479224422526 + ], + [ + 11.0086303898017, + 53.2918099210307 + ], + [ + 11.002985096987002, + 53.29267806236595 + ], + [ + 11.008702298027062, + 53.30063582001316 + ], + [ + 11.002257820551508, + 53.30520126260285 + ], + [ + 10.999075976447896, + 53.321023863047124 + ], + [ + 10.982661492963766, + 53.327536423291065 + ], + [ + 10.988000624628896, + 53.333426507412774 + ], + [ + 10.959360781803214, + 53.33852509120635 + ], + [ + 10.955539249184497, + 53.333461304015216 + ], + [ + 10.934005662201997, + 53.3392913524429 + ], + [ + 10.928245164779309, + 53.34811826215584 + ], + [ + 10.919361341299325, + 53.34841964499346 + ], + [ + 10.90967888973924, + 53.33769420465418 + ], + [ + 10.899241034348211, + 53.334196442450775 + ], + [ + 10.894713589461489, + 53.33665570168293 + ], + [ + 10.892650506529407, + 53.334307561884756 + ], + [ + 10.880640252610482, + 53.334498154460555 + ], + [ + 10.888028505409313, + 53.324381915149104 + ], + [ + 10.88053498515384, + 53.32109837359658 + ], + [ + 10.86604270970104, + 53.32691203132404 + ], + [ + 10.871702326440305, + 53.3215929341221 + ], + [ + 10.87023997291331, + 53.31771645258343 + ], + [ + 10.85392955517071, + 53.31603639516773 + ], + [ + 10.85079050377835, + 53.309996747571915 + ], + [ + 10.835805650805245, + 53.30496954437406 + ], + [ + 10.82864784272351, + 53.30691230217732 + ], + [ + 10.826197522160184, + 53.312392379976295 + ], + [ + 10.793262566560708, + 53.31556723649004 + ], + [ + 10.771590595007483, + 53.325323743891126 + ], + [ + 10.767568679746235, + 53.33046448544723 + ], + [ + 10.759653772810832, + 53.32998715604154 + ], + [ + 10.763084738531767, + 53.33885055513621 + ], + [ + 10.738086468683814, + 53.34234375003283 + ], + [ + 10.728116834654301, + 53.3572098626926 + ], + [ + 10.700692790056545, + 53.37002280642234 + ], + [ + 10.676000471376373, + 53.367684854555485 + ], + [ + 10.630703698423083, + 53.3707734280451 + ], + [ + 10.611932917500184, + 53.36914391595485 + ], + [ + 10.595046795514264, + 53.36392755393186 + ], + [ + 10.599104761324925, + 53.37782756717279 + ], + [ + 10.616903898898508, + 53.38456959025576 + ], + [ + 10.621397011258004, + 53.39857065993313 + ], + [ + 10.620974568596678, + 53.404087596349804 + ], + [ + 10.61667996163074, + 53.405090422157876 + ], + [ + 10.618366003490085, + 53.42537129289755 + ], + [ + 10.622706547483, + 53.42586637259632 + ], + [ + 10.632308138308053, + 53.45480292751443 + ], + [ + 10.641980163960074, + 53.45573762675475 + ], + [ + 10.652042560757051, + 53.46147700688397 + ], + [ + 10.692973049913254, + 53.45513809483972 + ], + [ + 10.701661227911885, + 53.478255415963346 + ], + [ + 10.72073630176713, + 53.47606599081484 + ], + [ + 10.72681904336752, + 53.48134794151424 + ], + [ + 10.731238325278195, + 53.47947954638614 + ], + [ + 10.756012051813997, + 53.48339358302604 + ], + [ + 10.76511039250517, + 53.49107437794642 + ], + [ + 10.777781471130465, + 53.49518146780136 + ], + [ + 10.786431193200372, + 53.51045659311987 + ], + [ + 10.810642965268393, + 53.5161898173065 + ], + [ + 10.824333999013238, + 53.51374123218644 + ], + [ + 10.824605697300134, + 53.51785617755549 + ], + [ + 10.81451848306795, + 53.522024906178174 + ], + [ + 10.821614071515494, + 53.52400975536319 + ], + [ + 10.819268985726472, + 53.534521292343875 + ], + [ + 10.831905638862294, + 53.54258247063449 + ], + [ + 10.824407598282466, + 53.556271786010996 + ], + [ + 10.823260709066604, + 53.575180534606154 + ], + [ + 10.842194048199916, + 53.574842280597714 + ], + [ + 10.8501449013191, + 53.56527063131717 + ], + [ + 10.863702017360517, + 53.5646323261324 + ], + [ + 10.894826359576546, + 53.57241099883468 + ], + [ + 10.909484476825025, + 53.571450325433254 + ], + [ + 10.923795348109934, + 53.584186030959664 + ], + [ + 10.917465301094408, + 53.59931596116849 + ], + [ + 10.922263593316831, + 53.60227926111184 + ], + [ + 10.929562993712667, + 53.62870715172765 + ], + [ + 10.947646454764723, + 53.64244438049365 + ], + [ + 10.944968911065711, + 53.646784892405186 + ], + [ + 10.950750904864476, + 53.645829509918514 + ], + [ + 10.954884037805938, + 53.6567054231543 + ], + [ + 10.948568527212013, + 53.6613523211945 + ], + [ + 10.945163435031182, + 53.65909429351939 + ], + [ + 10.938627285459697, + 53.665821587638405 + ], + [ + 10.939801655580503, + 53.67312754470872 + ], + [ + 10.944264482340166, + 53.67417382728778 + ], + [ + 10.941766725283836, + 53.6845423284306 + ], + [ + 10.93711749620658, + 53.6872991930349 + ], + [ + 10.929102606892892, + 53.686509599596 + ], + [ + 10.927255525039236, + 53.68955284498734 + ], + [ + 10.91897174113884, + 53.689158854440386 + ], + [ + 10.926053754651624, + 53.69204576538004 + ], + [ + 10.922141997545808, + 53.69946897237297 + ], + [ + 10.905289034080914, + 53.703294284960606 + ], + [ + 10.886416616242421, + 53.70566335614984 + ], + [ + 10.880307945781556, + 53.70233034798709 + ], + [ + 10.862982071197541, + 53.70394465560777 + ], + [ + 10.850943711713143, + 53.70012492890541 + ], + [ + 10.85217085214653, + 53.70584464888197 + ], + [ + 10.846011016135263, + 53.704343603966336 + ], + [ + 10.843343345233302, + 53.707855012451404 + ], + [ + 10.824675418960938, + 53.71100376674114 + ], + [ + 10.810875909286501, + 53.72007231900012 + ], + [ + 10.805916825311702, + 53.73920982914454 + ], + [ + 10.772504534780825, + 53.749350068423965 + ], + [ + 10.758032962253818, + 53.747517469262974 + ], + [ + 10.7579767983969, + 53.76359398772602 + ], + [ + 10.770256496982926, + 53.77548063506061 + ], + [ + 10.76591543966648, + 53.77990111750473 + ], + [ + 10.773251827760769, + 53.7923874195651 + ], + [ + 10.765025986805485, + 53.803233954201445 + ], + [ + 10.761591085421017, + 53.82260091859674 + ], + [ + 10.747850836947855, + 53.833364330302665 + ], + [ + 10.753650103549603, + 53.84857435684675 + ], + [ + 10.747711196461026, + 53.851510959749625 + ], + [ + 10.759450346948299, + 53.85826038183841 + ], + [ + 10.770835477661995, + 53.873462536107354 + ], + [ + 10.79941678103889, + 53.876154844073355 + ], + [ + 10.818926895011607, + 53.89353337390399 + ], + [ + 10.847210812967674, + 53.89694306831532 + ], + [ + 10.84829537299847, + 53.90511444240117 + ], + [ + 10.855533702000749, + 53.90478856929467 + ], + [ + 10.859162006232829, + 53.909413287576726 + ], + [ + 10.874724244705588, + 53.91454151164009 + ], + [ + 10.882571899042887, + 53.92449744669551 + ], + [ + 10.896087353419183, + 53.917933763675094 + ], + [ + 10.911293635635342, + 53.91522558346816 + ], + [ + 10.902096618647597, + 53.90629077509613 + ], + [ + 10.911023570854562, + 53.89795245495799 + ], + [ + 10.936785593190729, + 53.9006494467437 + ], + [ + 10.958973167768942, + 53.91026217567732 + ], + [ + 10.967064610579545, + 53.90720486395444 + ], + [ + 10.961601488027295, + 53.91420490846356 + ], + [ + 10.949369970070233, + 53.912902219331556 + ], + [ + 10.9393322922323, + 53.919333773530276 + ], + [ + 10.929871939361519, + 53.91827986849019 + ], + [ + 10.913005598792338, + 53.92404096058411 + ], + [ + 10.89879022700395, + 53.922281757281105 + ], + [ + 10.895097607737894, + 53.924548177647466 + ], + [ + 10.896389016485502, + 53.93596997080837 + ], + [ + 10.909462710553397, + 53.946269129822 + ], + [ + 10.903661739173112, + 53.95682190259485 + ], + [ + 10.933514303970876, + 53.96493270336905 + ], + [ + 10.984628352282574, + 53.98863154858529 + ], + [ + 11.042239286261545, + 54.00663971550293 + ], + [ + 11.089594726261764, + 54.013656807240636 + ], + [ + 11.144461517907327, + 54.00964432129355 + ], + [ + 11.179984660849524, + 54.015166311944206 + ], + [ + 11.191356358817867, + 54.00942153890438 + ], + [ + 11.19321749273805, + 54.0003813215615 + ], + [ + 11.20720265226825, + 53.988375364538506 + ], + [ + 11.228124562596399, + 53.98253039231085 + ], + [ + 11.241183386070663, + 53.98241121523918 + ], + [ + 11.253206673037027, + 53.98765602013469 + ], + [ + 11.259721806777922, + 53.983537473751674 + ], + [ + 11.253154605796798, + 53.97367500161143 + ], + [ + 11.245890158332783, + 53.97315705873271 + ], + [ + 11.241388016432225, + 53.95352909033045 + ], + [ + 11.245552611853869, + 53.94279289452106 + ], + [ + 11.253911321355456, + 53.93714908356844 + ], + [ + 11.27320124827665, + 53.93126457908098 + ], + [ + 11.288720973641134, + 53.93157107264141 + ], + [ + 11.314834456597984, + 53.942070602457875 + ], + [ + 11.326423581365898, + 53.95689443626749 + ], + [ + 11.334459459467245, + 53.95897481977266 + ], + [ + 11.349528798353845, + 53.943777464964086 + ], + [ + 11.365038223170773, + 53.93513886144747 + ], + [ + 11.388598159382932, + 53.939132437038346 + ], + [ + 11.406836555230148, + 53.93520241412574 + ], + [ + 11.401162410689581, + 53.92733266430812 + ], + [ + 11.403606831431405, + 53.921493211144345 + ], + [ + 11.435103513567242, + 53.91023732497626 + ], + [ + 11.43616132147874, + 53.9000853842819 + ], + [ + 11.45046927767348, + 53.900075420340904 + ], + [ + 11.452965580059521, + 53.894822218119124 + ], + [ + 11.453167710992004, + 53.89968037743557 + ], + [ + 11.46043599429314, + 53.89542919612195 + ], + [ + 11.457068199409324, + 53.89946699897102 + ], + [ + 11.463784963110474, + 53.89916906367803 + ], + [ + 11.455625239733914, + 53.902070523748144 + ], + [ + 11.463495563493252, + 53.90240365465593 + ], + [ + 11.44729630476687, + 53.904907088182895 + ], + [ + 11.444713658001383, + 53.911358526615714 + ], + [ + 11.458928790908907, + 53.91704177348626 + ], + [ + 11.472851683733664, + 53.928327904853276 + ], + [ + 11.478185798619377, + 53.9256316153068 + ], + [ + 11.48165029972429, + 53.927390628434935 + ], + [ + 11.477756409295363, + 53.934497257436085 + ], + [ + 11.483296407677749, + 53.96744580226562 + ], + [ + 11.478107477026725, + 53.96900772408944 + ], + [ + 11.478091827613264, + 53.96402619203396 + ], + [ + 11.47440391403234, + 53.96492970956012 + ], + [ + 11.47172142562957, + 53.9632203707862 + ], + [ + 11.470157111236439, + 53.96536211677677 + ], + [ + 11.473250470732209, + 53.97110338781032 + ], + [ + 11.483075909465756, + 53.97143840538461 + ], + [ + 11.488146277085917, + 53.97554058211037 + ], + [ + 11.487918701784727, + 53.9682302914084 + ], + [ + 11.493927840945906, + 53.97084195681736 + ], + [ + 11.491306670429458, + 53.97737081809378 + ], + [ + 11.499817375191226, + 53.98595464199965 + ], + [ + 11.490512881822182, + 53.9937872889291 + ], + [ + 11.496912581919492, + 53.99521654384073 + ], + [ + 11.50977577321461, + 54.011905842834665 + ], + [ + 11.534008695634938, + 54.01964439280224 + ], + [ + 11.533409123801949, + 54.025391461876666 + ], + [ + 11.518246624518252, + 54.02572018308096 + ], + [ + 11.518527423712552, + 54.03028601681723 + ], + [ + 11.529102439078025, + 54.03384871160142 + ], + [ + 11.534493674885685, + 54.02724546808331 + ], + [ + 11.546679531157418, + 54.024899405527904 + ], + [ + 11.573729801054961, + 54.033589383121424 + ], + [ + 11.58718529772339, + 54.047290686570605 + ], + [ + 11.582296603269324, + 54.06335957847063 + ], + [ + 11.59458824587121, + 54.06736119517595 + ], + [ + 11.610925957976084, + 54.068314404943095 + ], + [ + 11.613780463909288, + 54.07316338775795 + ], + [ + 11.624469613166069, + 54.07678237981498 + ], + [ + 11.626244382461604, + 54.09015710655574 + ], + [ + 11.613721636403843, + 54.10252138676682 + ], + [ + 11.603985094654275, + 54.102487860745896 + ], + [ + 11.599832775557244, + 54.09955878017449 + ], + [ + 11.602284373918003, + 54.09576271813716 + ], + [ + 11.58748967165213, + 54.09313624555651 + ], + [ + 11.576837920670831, + 54.08082645025512 + ], + [ + 11.563526176190157, + 54.07815441978288 + ], + [ + 11.569142798254239, + 54.07867569525268 + ], + [ + 11.558838019071736, + 54.06977637014135 + ], + [ + 11.548263015805128, + 54.066360544334145 + ], + [ + 11.538729089969443, + 54.05745303758476 + ], + [ + 11.542652999284318, + 54.05547314345113 + ], + [ + 11.532470840371518, + 54.04911687315833 + ], + [ + 11.536994620583117, + 54.05731765608014 + ], + [ + 11.535037692732137, + 54.07342071372542 + ], + [ + 11.53197403014461, + 54.0752434345216 + ], + [ + 11.525593002221518, + 54.068226183968044 + ], + [ + 11.525404352332519, + 54.07154112839315 + ], + [ + 11.555667830923019, + 54.094307554415245 + ], + [ + 11.567841712776174, + 54.098188371218846 + ], + [ + 11.589332554517261, + 54.09953083154124 + ], + [ + 11.614562581916806, + 54.11002938873298 + ], + [ + 11.682936882514374, + 54.15327118011628 + ], + [ + 11.761385158062566, + 54.154501919825705 + ], + [ + 11.797592129584215, + 54.14680314719488 + ], + [ + 11.84977374765226, + 54.145002069260514 + ], + [ + 11.964983955190798, + 54.16669567224203 + ], + [ + 12.01136017102697, + 54.178336332660145 + ], + [ + 12.058252604991344, + 54.17776206371221 + ], + [ + 12.086768579362314, + 54.18508058115209 + ], + [ + 12.087763981856872, + 54.17713996510041 + ], + [ + 12.090587147746307, + 54.18095201275063 + ], + [ + 12.094680746530829, + 54.17430769423538 + ], + [ + 12.087795120701225, + 54.169934866195156 + ], + [ + 12.096252913492936, + 54.16991857337697 + ], + [ + 12.09102555143866, + 54.15093314362592 + ], + [ + 12.079958287133763, + 54.143221459470595 + ], + [ + 12.084936117758646, + 54.14332196554481 + ], + [ + 12.090932231473227, + 54.132959107487075 + ], + [ + 12.085427641512952, + 54.12309033696551 + ], + [ + 12.089005613051995, + 54.113859296999856 + ], + [ + 12.086013958671892, + 54.11096170882072 + ], + [ + 12.090255729763724, + 54.112100741238756 + ], + [ + 12.097989402863579, + 54.102276835848585 + ], + [ + 12.112074157675247, + 54.09444291171559 + ], + [ + 12.148270752398217, + 54.09233267344542 + ], + [ + 12.151354873775544, + 54.09425931200585 + ], + [ + 12.151963692298809, + 54.08528683032946 + ], + [ + 12.153552562288745, + 54.09688429469903 + ], + [ + 12.13654735703745, + 54.09791606115353 + ], + [ + 12.125844739679785, + 54.095375065553 + ], + [ + 12.117166556218733, + 54.097621477826806 + ], + [ + 12.101518853815298, + 54.10991796618881 + ], + [ + 12.097686006432, + 54.12086672444298 + ], + [ + 12.097016922175499, + 54.15189777031925 + ], + [ + 12.100488742075248, + 54.15391044339069 + ], + [ + 12.105012979623742, + 54.145367250477605 + ], + [ + 12.105925886742464, + 54.15608646981892 + ], + [ + 12.11407500564409, + 54.14671895341652 + ], + [ + 12.107998092537121, + 54.15771238788122 + ], + [ + 12.114416509663746, + 54.15889647674234 + ], + [ + 12.126199136462292, + 54.15035911724243 + ], + [ + 12.12191558963178, + 54.15799305625747 + ], + [ + 12.130756306898682, + 54.155146216457226 + ], + [ + 12.130947604375958, + 54.15882499105738 + ], + [ + 12.142718906442072, + 54.15975029801796 + ], + [ + 12.136775333564763, + 54.16276058677816 + ], + [ + 12.143178641851057, + 54.17423299015708 + ], + [ + 12.128408789333468, + 54.17395870956206 + ], + [ + 12.123066863788571, + 54.177694697716575 + ], + [ + 12.107984344643874, + 54.17506036047486 + ], + [ + 12.107272118209414, + 54.17086322607353 + ], + [ + 12.100993420670676, + 54.1692882063768 + ], + [ + 12.095257605835473, + 54.18130143620296 + ], + [ + 12.108208085871873, + 54.17843859811483 + ], + [ + 12.129006230116152, + 54.18693934492634 + ], + [ + 12.151297527000679, + 54.20386711308087 + ], + [ + 12.174898728347179, + 54.2291134613582 + ], + [ + 12.194565681789692, + 54.24186058950684 + ], + [ + 12.306529436312855, + 54.28215034682171 + ], + [ + 12.334977770958728, + 54.296110756663516 + ], + [ + 12.364562451727366, + 54.32445237797725 + ], + [ + 12.40593086773171, + 54.376936025663355 + ], + [ + 12.436295141638722, + 54.39169985220174 + ], + [ + 12.466099819180336, + 54.41938220176426 + ], + [ + 12.50084662143946, + 54.474948852406726 + ], + [ + 12.510195681491158, + 54.48249041624014 + ], + [ + 12.524002997430136, + 54.48672847226828 + ] + ] + ], + [ + [ + [ + 13.430431498381317, + 54.6842544670332 + ], + [ + 13.439012697351298, + 54.67692178783567 + ], + [ + 13.428539366007932, + 54.66014640607666 + ], + [ + 13.41551793615747, + 54.65505662832228 + ], + [ + 13.391083261209833, + 54.65131723559271 + ], + [ + 13.377238393893318, + 54.63555880702733 + ], + [ + 13.383719140888632, + 54.6119903470001 + ], + [ + 13.393314796713296, + 54.59861674584919 + ], + [ + 13.418736461458217, + 54.58086724362902 + ], + [ + 13.434986750562228, + 54.57458740507105 + ], + [ + 13.460385652201328, + 54.570627730531456 + ], + [ + 13.469665355722945, + 54.57541580759591 + ], + [ + 13.490820061456063, + 54.57305633463339 + ], + [ + 13.588259269271022, + 54.584399389738294 + ], + [ + 13.634857260120203, + 54.58546757690242 + ], + [ + 13.66115881182156, + 54.57578946993169 + ], + [ + 13.67980860323092, + 54.56248552037783 + ], + [ + 13.676080031006636, + 54.55425240890566 + ], + [ + 13.68164240392781, + 54.54261644839222 + ], + [ + 13.66997804035842, + 54.52162865305528 + ], + [ + 13.609409738032413, + 54.498861024395495 + ], + [ + 13.597163945646706, + 54.48810214009927 + ], + [ + 13.601918030587797, + 54.483430047577144 + ], + [ + 13.599488931082181, + 54.48078525996563 + ], + [ + 13.593550108908605, + 54.48692763533085 + ], + [ + 13.577997761095995, + 54.47961462634937 + ], + [ + 13.570465490368521, + 54.47038004463542 + ], + [ + 13.571453851321902, + 54.45400796853183 + ], + [ + 13.587437965122497, + 54.42602350085039 + ], + [ + 13.613370272032501, + 54.40337348043927 + ], + [ + 13.627096676428573, + 54.39874912783587 + ], + [ + 13.656599550251432, + 54.399590658325955 + ], + [ + 13.664528383275925, + 54.40321960384134 + ], + [ + 13.67293723826614, + 54.40120108445751 + ], + [ + 13.704791927008493, + 54.380576635233545 + ], + [ + 13.721177838715354, + 54.35913564499241 + ], + [ + 13.74752859349416, + 54.34516134579491 + ], + [ + 13.76727005693586, + 54.34079786602792 + ], + [ + 13.740058041749988, + 54.33548112264412 + ], + [ + 13.732686881705856, + 54.32788297943786 + ], + [ + 13.730549021254129, + 54.31772360620681 + ], + [ + 13.721337751140457, + 54.31464997751467 + ], + [ + 13.715197814158874, + 54.296516203641666 + ], + [ + 13.724230547824098, + 54.27385546490701 + ], + [ + 13.70766143157164, + 54.26874385645765 + ], + [ + 13.698913995964109, + 54.27764195907862 + ], + [ + 13.687040140012039, + 54.27994137130382 + ], + [ + 13.683837408444255, + 54.28344685430983 + ], + [ + 13.690814748858166, + 54.28743593484214 + ], + [ + 13.698696298339595, + 54.28061521612472 + ], + [ + 13.70946986783543, + 54.279912293206934 + ], + [ + 13.702217860655368, + 54.295629683877394 + ], + [ + 13.693256429749527, + 54.29387501418784 + ], + [ + 13.691743214981562, + 54.28971309722815 + ], + [ + 13.6693393159141, + 54.291897906502754 + ], + [ + 13.661703823068702, + 54.28752476896206 + ], + [ + 13.655129192866694, + 54.28847276174948 + ], + [ + 13.645403994623273, + 54.29756068922634 + ], + [ + 13.656620541666976, + 54.30402500172882 + ], + [ + 13.677761019629054, + 54.30839054288942 + ], + [ + 13.681338591624323, + 54.31226887944836 + ], + [ + 13.685400756626391, + 54.3102466212975 + ], + [ + 13.685992520472935, + 54.315123680503774 + ], + [ + 13.699801675730717, + 54.316508718518584 + ], + [ + 13.69679152772038, + 54.3174613048646 + ], + [ + 13.703350122666233, + 54.32046071513869 + ], + [ + 13.704135063213915, + 54.32607623957991 + ], + [ + 13.68118481109275, + 54.32602252293959 + ], + [ + 13.672228455761118, + 54.33030940925259 + ], + [ + 13.63729181395711, + 54.31932096274457 + ], + [ + 13.62089999725514, + 54.31862761953286 + ], + [ + 13.617289209989124, + 54.315514866127295 + ], + [ + 13.609628077179208, + 54.31698862442328 + ], + [ + 13.612007359360947, + 54.32063902204022 + ], + [ + 13.642380188737134, + 54.325494970396015 + ], + [ + 13.674048891578463, + 54.33732550143583 + ], + [ + 13.68460307984796, + 54.3463082403734 + ], + [ + 13.682148615003536, + 54.349891965916136 + ], + [ + 13.674806095073654, + 54.35094809875968 + ], + [ + 13.65404907961968, + 54.34691770559842 + ], + [ + 13.65038010838301, + 54.34905448956857 + ], + [ + 13.635887107040661, + 54.34399546614383 + ], + [ + 13.639096766043416, + 54.33946906500365 + ], + [ + 13.62986162844093, + 54.33893837241921 + ], + [ + 13.623193746929035, + 54.334538937461524 + ], + [ + 13.628859679478209, + 54.33133081309647 + ], + [ + 13.614821608732058, + 54.330181391857515 + ], + [ + 13.600918213145489, + 54.34609882892725 + ], + [ + 13.5897925429212, + 54.3516450832439 + ], + [ + 13.577520627022473, + 54.35306336604911 + ], + [ + 13.550763945724883, + 54.33968729167256 + ], + [ + 13.538146084418495, + 54.343083589818974 + ], + [ + 13.53082988587898, + 54.33991960938318 + ], + [ + 13.51787684882892, + 54.340421294339265 + ], + [ + 13.507070602848941, + 54.34420673147387 + ], + [ + 13.495966404013705, + 54.336797935093315 + ], + [ + 13.483014679766713, + 54.334847164402426 + ], + [ + 13.479465782401135, + 54.330314134822636 + ], + [ + 13.464384567466265, + 54.329127114346484 + ], + [ + 13.45462557381966, + 54.336092717624666 + ], + [ + 13.450553491211068, + 54.33137668354595 + ], + [ + 13.45717691198436, + 54.32918554958154 + ], + [ + 13.45252598232681, + 54.326073675480714 + ], + [ + 13.462301919843917, + 54.329027246558304 + ], + [ + 13.466943739605547, + 54.326416269968185 + ], + [ + 13.461909341692287, + 54.31640666231247 + ], + [ + 13.445169609906579, + 54.31393964534206 + ], + [ + 13.419602258613887, + 54.30278898163111 + ], + [ + 13.412444523439646, + 54.2965072138357 + ], + [ + 13.410859688091445, + 54.286175719953214 + ], + [ + 13.386721412358192, + 54.26656153438675 + ], + [ + 13.390755697011773, + 54.279450284690185 + ], + [ + 13.383937415101595, + 54.27738164876707 + ], + [ + 13.376006391542385, + 54.27907564661063 + ], + [ + 13.371533823404118, + 54.27780852750124 + ], + [ + 13.378623815546364, + 54.27738943738069 + ], + [ + 13.368525584433664, + 54.27071610733858 + ], + [ + 13.361219057784266, + 54.27299407206406 + ], + [ + 13.35082142280256, + 54.26983544335607 + ], + [ + 13.358019543637536, + 54.26005696132903 + ], + [ + 13.358671520733301, + 54.25593366197474 + ], + [ + 13.352294492507385, + 54.253824792007116 + ], + [ + 13.359623604211814, + 54.25046253480705 + ], + [ + 13.357959282843723, + 54.246677261814845 + ], + [ + 13.369372168875008, + 54.254177344945205 + ], + [ + 13.365872549597912, + 54.257966345171795 + ], + [ + 13.363361967746382, + 54.2546569746733 + ], + [ + 13.359018898067568, + 54.257494953299194 + ], + [ + 13.364478087728097, + 54.26410379073555 + ], + [ + 13.378793134102708, + 54.25333392596754 + ], + [ + 13.389873269324998, + 54.25869999300683 + ], + [ + 13.391591761215183, + 54.26396724303605 + ], + [ + 13.401554232521917, + 54.26570604659353 + ], + [ + 13.417371900675901, + 54.255824296529866 + ], + [ + 13.424720026422822, + 54.238545525076084 + ], + [ + 13.417290242043409, + 54.23247463200173 + ], + [ + 13.39929700604527, + 54.226831291350436 + ], + [ + 13.393340918136207, + 54.22092943496758 + ], + [ + 13.383515737587052, + 54.228869888984086 + ], + [ + 13.328583547494679, + 54.23914005448966 + ], + [ + 13.323668996393842, + 54.237543923136826 + ], + [ + 13.308907532553453, + 54.247694578785065 + ], + [ + 13.290848629043682, + 54.25128307429665 + ], + [ + 13.295037628295162, + 54.255422101935444 + ], + [ + 13.297026538459834, + 54.252287031344885 + ], + [ + 13.32167940762836, + 54.245662351693014 + ], + [ + 13.32685632318146, + 54.258470221929386 + ], + [ + 13.322781407081594, + 54.26617949863442 + ], + [ + 13.334211455037957, + 54.27025859074168 + ], + [ + 13.336708765461964, + 54.27856150624832 + ], + [ + 13.309688215744822, + 54.26570288062694 + ], + [ + 13.31458723340022, + 54.2638528167619 + ], + [ + 13.314494888069278, + 54.259461244628035 + ], + [ + 13.321518896132224, + 54.258076759421094 + ], + [ + 13.287434672455545, + 54.25923766382417 + ], + [ + 13.268173002174953, + 54.25372972465602 + ], + [ + 13.25043097576403, + 54.258199460191975 + ], + [ + 13.23984408565021, + 54.26630410154186 + ], + [ + 13.21711096760952, + 54.27301820809244 + ], + [ + 13.21780084703925, + 54.27930802634678 + ], + [ + 13.215349814334534, + 54.271373128322615 + ], + [ + 13.199380385568418, + 54.26997979175375 + ], + [ + 13.196188272446882, + 54.284483600351344 + ], + [ + 13.203024715531614, + 54.290274000884 + ], + [ + 13.192975339628909, + 54.29709023133898 + ], + [ + 13.181069042195118, + 54.28743886636188 + ], + [ + 13.16544785320296, + 54.28940802765479 + ], + [ + 13.141667485420092, + 54.28092434436722 + ], + [ + 13.139702005737833, + 54.29636444374005 + ], + [ + 13.15411225764335, + 54.30464262803992 + ], + [ + 13.164697434007255, + 54.3042522317176 + ], + [ + 13.163972524667763, + 54.30108212611669 + ], + [ + 13.169736537787756, + 54.302267278445996 + ], + [ + 13.18066905749174, + 54.29637669606622 + ], + [ + 13.185501312267274, + 54.300019042549465 + ], + [ + 13.169624899169147, + 54.30982817577656 + ], + [ + 13.149561964777023, + 54.31279152314269 + ], + [ + 13.138935062134179, + 54.31929075450658 + ], + [ + 13.13509608418126, + 54.317358639990324 + ], + [ + 13.129103579090865, + 54.32114076437185 + ], + [ + 13.135003386576322, + 54.32411687829262 + ], + [ + 13.115755861836941, + 54.33108483877001 + ], + [ + 13.113686681457208, + 54.33477905239753 + ], + [ + 13.12379102460436, + 54.365945621605434 + ], + [ + 13.129931726244278, + 54.372092736606405 + ], + [ + 13.157613085491546, + 54.37493428515123 + ], + [ + 13.171651768823372, + 54.37127125921515 + ], + [ + 13.196950058148872, + 54.37591105032721 + ], + [ + 13.202017384628153, + 54.37137256561163 + ], + [ + 13.215900525898125, + 54.3714985777268 + ], + [ + 13.220442548029743, + 54.36772915282243 + ], + [ + 13.236003008205532, + 54.36972820461922 + ], + [ + 13.236595657278658, + 54.377391801285505 + ], + [ + 13.259643171072966, + 54.38016564236766 + ], + [ + 13.262307086223398, + 54.383596545552855 + ], + [ + 13.257333544716444, + 54.38628460345034 + ], + [ + 13.250004390342896, + 54.383865838716105 + ], + [ + 13.237620214322794, + 54.38668660511835 + ], + [ + 13.229841035853003, + 54.40191643716808 + ], + [ + 13.24100077360784, + 54.403642293045465 + ], + [ + 13.244358159365662, + 54.405680004274615 + ], + [ + 13.251690588178901, + 54.401840398907396 + ], + [ + 13.254837850635052, + 54.40571072390448 + ], + [ + 13.249340035251278, + 54.40788185917117 + ], + [ + 13.232403834041332, + 54.40377200176358 + ], + [ + 13.237491190988884, + 54.40993688596225 + ], + [ + 13.232639537943259, + 54.4136077006101 + ], + [ + 13.229454115608238, + 54.41273545143623 + ], + [ + 13.233899152305149, + 54.40958701645967 + ], + [ + 13.220522475408053, + 54.413784318003856 + ], + [ + 13.211861744884095, + 54.42994407503631 + ], + [ + 13.189080220646492, + 54.42318729415416 + ], + [ + 13.171696916953843, + 54.42523980689935 + ], + [ + 13.158302432606172, + 54.42064564801187 + ], + [ + 13.14968913541421, + 54.4229376879326 + ], + [ + 13.149692824201583, + 54.42932661042909 + ], + [ + 13.160391298149076, + 54.43617480063272 + ], + [ + 13.170586190412086, + 54.453728462012265 + ], + [ + 13.19268443719007, + 54.45532059869358 + ], + [ + 13.192636634477042, + 54.450207808721395 + ], + [ + 13.199987703548759, + 54.4480255747583 + ], + [ + 13.206287945675662, + 54.46032206666338 + ], + [ + 13.217680749943234, + 54.45919771728184 + ], + [ + 13.224492329471486, + 54.46430362262595 + ], + [ + 13.2356605550052, + 54.462208005829595 + ], + [ + 13.241253252930951, + 54.46607973446112 + ], + [ + 13.253255862446727, + 54.46427341919875 + ], + [ + 13.248243105641878, + 54.46754394051574 + ], + [ + 13.238299717593355, + 54.46583487932838 + ], + [ + 13.231045619019625, + 54.46789358063154 + ], + [ + 13.242167905485452, + 54.47271503013034 + ], + [ + 13.25334250684827, + 54.47133081756557 + ], + [ + 13.270131134775013, + 54.48017347158235 + ], + [ + 13.257917654957508, + 54.47838735487147 + ], + [ + 13.256251683134384, + 54.4859820598289 + ], + [ + 13.249394841666254, + 54.487529153257874 + ], + [ + 13.23664279186753, + 54.48270088766623 + ], + [ + 13.22858837062884, + 54.485442190919706 + ], + [ + 13.226130446873503, + 54.49299638569361 + ], + [ + 13.232779715200262, + 54.50447902430227 + ], + [ + 13.231376325233335, + 54.51089801874412 + ], + [ + 13.209620593061736, + 54.5079156382772 + ], + [ + 13.200486322037387, + 54.503747663209964 + ], + [ + 13.170685141452429, + 54.50783282640048 + ], + [ + 13.167565089804743, + 54.51179280520842 + ], + [ + 13.162137786209712, + 54.514193193608484 + ], + [ + 13.158279159874791, + 54.53768670022608 + ], + [ + 13.149715737174905, + 54.541954148220256 + ], + [ + 13.139203637750754, + 54.5405104954123 + ], + [ + 13.144180805806702, + 54.54696566434979 + ], + [ + 13.174393209139469, + 54.54570963219214 + ], + [ + 13.243706166647788, + 54.55556790366705 + ], + [ + 13.245174357070804, + 54.55276639614791 + ], + [ + 13.289417087345562, + 54.54163532346155 + ], + [ + 13.295274770750462, + 54.53682380291197 + ], + [ + 13.287938659438439, + 54.52210751481972 + ], + [ + 13.303550089505862, + 54.51406128329047 + ], + [ + 13.309457862372689, + 54.51568885514193 + ], + [ + 13.306264891388597, + 54.51932500807764 + ], + [ + 13.311251192909218, + 54.519974718801784 + ], + [ + 13.31211582485513, + 54.52442382306469 + ], + [ + 13.303087730621428, + 54.52790053290933 + ], + [ + 13.307486252103601, + 54.53949644924757 + ], + [ + 13.297227362655871, + 54.552434452924885 + ], + [ + 13.325090712741225, + 54.568670389711215 + ], + [ + 13.344375200200874, + 54.573742578299345 + ], + [ + 13.346451168790564, + 54.578373160805796 + ], + [ + 13.355024410986559, + 54.58103197955767 + ], + [ + 13.367622400736936, + 54.579264024760626 + ], + [ + 13.370438554589763, + 54.576604816310216 + ], + [ + 13.3614523056319, + 54.569250507420236 + ], + [ + 13.353977810775765, + 54.55142284674412 + ], + [ + 13.348171352781172, + 54.55337911997524 + ], + [ + 13.336187452700326, + 54.548771463671336 + ], + [ + 13.361436902703248, + 54.54338239075617 + ], + [ + 13.360662020593166, + 54.53660547408234 + ], + [ + 13.344269285640998, + 54.52465414494765 + ], + [ + 13.345708024963555, + 54.52048608013467 + ], + [ + 13.353189758553542, + 54.518720094429824 + ], + [ + 13.358824691576075, + 54.52307067246953 + ], + [ + 13.373989745233676, + 54.52035925857338 + ], + [ + 13.37464264473413, + 54.52496501398305 + ], + [ + 13.387669796289329, + 54.53125659949863 + ], + [ + 13.38796481305364, + 54.53997760140578 + ], + [ + 13.379983390254285, + 54.540188238112606 + ], + [ + 13.378386954550423, + 54.54416059247508 + ], + [ + 13.3543639258312, + 54.54736849215527 + ], + [ + 13.364358356165237, + 54.55731376976494 + ], + [ + 13.376176823975326, + 54.55983699765106 + ], + [ + 13.380393889185067, + 54.54623260553885 + ], + [ + 13.396323684988419, + 54.5377826579256 + ], + [ + 13.414581681510148, + 54.51987495321162 + ], + [ + 13.406096513773393, + 54.50569402817613 + ], + [ + 13.412582536302267, + 54.493768653903814 + ], + [ + 13.441668866198858, + 54.4873422780157 + ], + [ + 13.450190315968166, + 54.471836204635174 + ], + [ + 13.470087199500622, + 54.4816185828888 + ], + [ + 13.50466499498132, + 54.48305540521237 + ], + [ + 13.500073309334926, + 54.49256321192492 + ], + [ + 13.509439751193746, + 54.50868518252601 + ], + [ + 13.514126763197439, + 54.51028999879401 + ], + [ + 13.508029045327094, + 54.5246239238178 + ], + [ + 13.513606258227622, + 54.52508502002186 + ], + [ + 13.50795294009744, + 54.52523787631774 + ], + [ + 13.510795553181717, + 54.52883616928694 + ], + [ + 13.514125852488064, + 54.527235723777316 + ], + [ + 13.502184356641418, + 54.548285983910425 + ], + [ + 13.49501139871534, + 54.54961841566446 + ], + [ + 13.493051694568532, + 54.553162475682925 + ], + [ + 13.497146887932777, + 54.55409229243139 + ], + [ + 13.491177191803969, + 54.55860303287609 + ], + [ + 13.495319550742147, + 54.5610987580702 + ], + [ + 13.510272917581332, + 54.55782361828168 + ], + [ + 13.512779181101347, + 54.56517635938097 + ], + [ + 13.490147845044477, + 54.56215170767525 + ], + [ + 13.48998093028027, + 54.55897893387266 + ], + [ + 13.484938042570908, + 54.55871302004202 + ], + [ + 13.490403389169956, + 54.55081851008695 + ], + [ + 13.483947588280493, + 54.554019439169636 + ], + [ + 13.446130971893957, + 54.551601257881586 + ], + [ + 13.424791858413244, + 54.56887819075083 + ], + [ + 13.39643757107751, + 54.572578848576924 + ], + [ + 13.385335251911131, + 54.58072564050859 + ], + [ + 13.384250291343404, + 54.5957341420947 + ], + [ + 13.37033015707644, + 54.61458211217535 + ], + [ + 13.353983328349026, + 54.61151864952651 + ], + [ + 13.34818900511051, + 54.600901044443745 + ], + [ + 13.327577016538815, + 54.59340634815167 + ], + [ + 13.334923654170614, + 54.58506051172605 + ], + [ + 13.332396506417286, + 54.58194074416439 + ], + [ + 13.315044473325202, + 54.57931206798687 + ], + [ + 13.305958051170494, + 54.5730008010583 + ], + [ + 13.288225286283035, + 54.570376981002006 + ], + [ + 13.277842045925748, + 54.564408427633914 + ], + [ + 13.256887344250954, + 54.563102311392775 + ], + [ + 13.245451284993534, + 54.55783264794415 + ], + [ + 13.243147962430152, + 54.56150811732511 + ], + [ + 13.25708302455389, + 54.59008025201768 + ], + [ + 13.287504452185413, + 54.62531443757715 + ], + [ + 13.288066959360574, + 54.63730065056834 + ], + [ + 13.282972712845224, + 54.64558892524387 + ], + [ + 13.263930222547053, + 54.64314538748981 + ], + [ + 13.227096917709092, + 54.62515494465305 + ], + [ + 13.23793905913016, + 54.59418741023783 + ], + [ + 13.235913073586516, + 54.59715818661477 + ], + [ + 13.23132950228339, + 54.59665109194961 + ], + [ + 13.228360047479697, + 54.5874299066416 + ], + [ + 13.214099220933958, + 54.58552114869943 + ], + [ + 13.194760607044529, + 54.572150905038235 + ], + [ + 13.183676291977598, + 54.56955852319807 + ], + [ + 13.177190358158052, + 54.56135447743803 + ], + [ + 13.174870154104314, + 54.56544361197815 + ], + [ + 13.175894601092514, + 54.56090659959116 + ], + [ + 13.160936899600845, + 54.55908335953245 + ], + [ + 13.167249237383919, + 54.573732068736774 + ], + [ + 13.195748149124565, + 54.582610133951114 + ], + [ + 13.214809044176347, + 54.595551909523756 + ], + [ + 13.225740569996518, + 54.61231124317785 + ], + [ + 13.21987845449273, + 54.640779086110776 + ], + [ + 13.250612882142448, + 54.66045915280371 + ], + [ + 13.28762166864883, + 54.673795350120585 + ], + [ + 13.336057421564579, + 54.675442246925414 + ], + [ + 13.378259657822706, + 54.68399352985934 + ], + [ + 13.407983983603982, + 54.68222477419074 + ], + [ + 13.430431498381317, + 54.6842544670332 + ] + ], + [ + [ + 13.50847382269783, + 54.47932202094067 + ], + [ + 13.508337605398223, + 54.47699120269276 + ], + [ + 13.503314555530118, + 54.479333885907394 + ], + [ + 13.48657644569684, + 54.4756700771262 + ], + [ + 13.470625627297297, + 54.454931801645394 + ], + [ + 13.47399744901892, + 54.45172298965903 + ], + [ + 13.506171939986372, + 54.451639630334356 + ], + [ + 13.500081887674321, + 54.44449210280988 + ], + [ + 13.514034758399879, + 54.443191609534026 + ], + [ + 13.503909435634998, + 54.434406282801035 + ], + [ + 13.482732937575475, + 54.43559763457776 + ], + [ + 13.484630792021187, + 54.44041675639102 + ], + [ + 13.49852432939889, + 54.446194917277445 + ], + [ + 13.48346766918343, + 54.442865188402784 + ], + [ + 13.476825159953563, + 54.4377584002356 + ], + [ + 13.48223349159188, + 54.438274677882056 + ], + [ + 13.475551801107558, + 54.43259127532438 + ], + [ + 13.475146369828588, + 54.42620426617309 + ], + [ + 13.494308139427432, + 54.42077527890408 + ], + [ + 13.503640793869096, + 54.425683889286724 + ], + [ + 13.51056459682392, + 54.418462732742135 + ], + [ + 13.528049342373274, + 54.420004488643364 + ], + [ + 13.533779788196977, + 54.41630061490467 + ], + [ + 13.541250548961322, + 54.41932997426513 + ], + [ + 13.542169134706867, + 54.427676105001105 + ], + [ + 13.52003977409081, + 54.42956336003322 + ], + [ + 13.52006096399145, + 54.433913322981034 + ], + [ + 13.553905591272798, + 54.43542297162353 + ], + [ + 13.556964265217275, + 54.44193881206459 + ], + [ + 13.552038249542393, + 54.44673303813967 + ], + [ + 13.529627670994463, + 54.44521365387146 + ], + [ + 13.523909758827283, + 54.449154535766326 + ], + [ + 13.546253777299135, + 54.45612874452889 + ], + [ + 13.54861642622024, + 54.47374240353533 + ], + [ + 13.526747969200366, + 54.480344947530945 + ], + [ + 13.50847382269783, + 54.47932202094067 + ] + ] + ], + [ + [ + [ + 13.797555648665506, + 54.17402460953691 + ], + [ + 13.808924108397232, + 54.16950688493692 + ], + [ + 13.812452519450602, + 54.16942821134585 + ], + [ + 13.83325313670288, + 54.13194104428721 + ], + [ + 13.874714329139799, + 54.100287575227675 + ], + [ + 13.926712551858175, + 54.0782250527307 + ], + [ + 13.967277492802996, + 54.070330836432795 + ], + [ + 14.01621660133138, + 54.053891849917555 + ], + [ + 14.04998968780543, + 54.02940677754876 + ], + [ + 14.142192811506325, + 53.97687827701898 + ], + [ + 14.181793823225142, + 53.94842151690801 + ], + [ + 14.226321977743522, + 53.92864344116296 + ], + [ + 14.207646478314446, + 53.915867452458684 + ], + [ + 14.18531431109768, + 53.91410242441077 + ], + [ + 14.185316005761564, + 53.911970809363915 + ], + [ + 14.205867777913662, + 53.910566527719794 + ], + [ + 14.203947920782953, + 53.906632744637506 + ], + [ + 14.212300979524532, + 53.90029471999485 + ], + [ + 14.21307750822756, + 53.86647963356885 + ], + [ + 14.206114092055529, + 53.86593999137174 + ], + [ + 14.190854626299549, + 53.87300094015655 + ], + [ + 14.179064045328216, + 53.870723189288384 + ], + [ + 14.125798424705236, + 53.87186455188383 + ], + [ + 14.114891802918843, + 53.86912670522886 + ], + [ + 14.085551770360619, + 53.87483077730308 + ], + [ + 14.06278519540821, + 53.86945788159102 + ], + [ + 14.040923856238884, + 53.874508388064214 + ], + [ + 14.019709769324757, + 53.86930093954539 + ], + [ + 13.991286246204014, + 53.84850061971146 + ], + [ + 13.980123645529163, + 53.85021288980688 + ], + [ + 13.939010886284544, + 53.84343669611247 + ], + [ + 13.921753193574368, + 53.84702116067658 + ], + [ + 13.923313253506471, + 53.852088237962484 + ], + [ + 13.93644640842609, + 53.84770251981864 + ], + [ + 13.949911075727574, + 53.84996075180567 + ], + [ + 13.955056460319648, + 53.86032405477556 + ], + [ + 13.934484186840052, + 53.8681588004247 + ], + [ + 13.929839424006552, + 53.87511301672931 + ], + [ + 13.928776561001762, + 53.86206233797894 + ], + [ + 13.913487471968262, + 53.84318716832905 + ], + [ + 13.881475098720054, + 53.83978805896635 + ], + [ + 13.859050251641488, + 53.84314185235268 + ], + [ + 13.84620347254088, + 53.85091700383402 + ], + [ + 13.826150250821621, + 53.849685181878954 + ], + [ + 13.821786999497537, + 53.85703476494558 + ], + [ + 13.829721511769288, + 53.85764091227404 + ], + [ + 13.83414253114547, + 53.87100840301563 + ], + [ + 13.859023828892308, + 53.87165202508637 + ], + [ + 13.874289787055176, + 53.877862520001074 + ], + [ + 13.893418386636826, + 53.87717067715314 + ], + [ + 13.902957706128568, + 53.88544687345907 + ], + [ + 13.921472668742695, + 53.8879653760189 + ], + [ + 13.937972830499916, + 53.90895263827505 + ], + [ + 13.932002550045507, + 53.92028088599486 + ], + [ + 13.932171684358162, + 53.9358648667131 + ], + [ + 13.924189642538797, + 53.94262260252984 + ], + [ + 13.922692555695427, + 53.950629180395 + ], + [ + 13.895136172847575, + 53.96648573282817 + ], + [ + 13.905954691077094, + 53.98954333631846 + ], + [ + 13.930471348928407, + 53.990812520327935 + ], + [ + 13.945111096349857, + 53.99457702597409 + ], + [ + 13.965029898332489, + 53.989799814839444 + ], + [ + 13.96309143663235, + 53.973437645625204 + ], + [ + 13.972228478322377, + 53.96961466400632 + ], + [ + 13.949969503790411, + 53.95887000472203 + ], + [ + 13.958216449419936, + 53.95301696149062 + ], + [ + 13.951361414010627, + 53.94595528503979 + ], + [ + 13.953037989081565, + 53.93480261337247 + ], + [ + 13.95996270561079, + 53.93426777655367 + ], + [ + 13.958666706253727, + 53.93864351416809 + ], + [ + 13.971161755963216, + 53.950258658176374 + ], + [ + 13.963523534523313, + 53.95703787841118 + ], + [ + 13.983681822841282, + 53.96210030227704 + ], + [ + 13.984094493581756, + 53.959405005614734 + ], + [ + 13.995213324110216, + 53.96280518065403 + ], + [ + 14.004308508153027, + 53.959123593598285 + ], + [ + 14.023295886148386, + 53.96221409963328 + ], + [ + 14.024514060807023, + 53.96052366797026 + ], + [ + 14.016582605666436, + 53.96003400525529 + ], + [ + 14.02344768161484, + 53.95812696243806 + ], + [ + 14.010138100588513, + 53.953991573283844 + ], + [ + 14.011792623540495, + 53.94931961559826 + ], + [ + 14.039345782052902, + 53.940573678207286 + ], + [ + 14.043825272935708, + 53.94564279155039 + ], + [ + 14.03692999790714, + 53.94655260033496 + ], + [ + 14.035033492097913, + 53.950004122907046 + ], + [ + 14.04886933728916, + 53.980646369718514 + ], + [ + 14.047581111828352, + 53.99744244897172 + ], + [ + 14.043054844372467, + 53.99956967399888 + ], + [ + 14.047417449000704, + 54.0013585429299 + ], + [ + 14.041425015810072, + 53.999787272072545 + ], + [ + 14.041380856738867, + 54.00872479577244 + ], + [ + 14.034878990711874, + 54.01576122610757 + ], + [ + 14.018561879892525, + 54.01779271450091 + ], + [ + 14.016437449160803, + 54.02147838984297 + ], + [ + 14.017609414658056, + 54.0150217142464 + ], + [ + 14.011972114444369, + 54.010070161599145 + ], + [ + 14.0043611761675, + 54.01065535254968 + ], + [ + 13.997693497037725, + 54.04150401526162 + ], + [ + 13.968865000266803, + 54.059436977774155 + ], + [ + 13.976990561574588, + 54.06212286741316 + ], + [ + 13.973258915622317, + 54.06399662930346 + ], + [ + 13.965955433829054, + 54.05946066248185 + ], + [ + 13.951359787506052, + 54.05897990131168 + ], + [ + 13.911190421584026, + 54.063994330812385 + ], + [ + 13.917224208782667, + 54.06051802797648 + ], + [ + 13.907348924627057, + 54.04311474422234 + ], + [ + 13.915505704312844, + 54.046793929098264 + ], + [ + 13.934209408388577, + 54.02758582636958 + ], + [ + 13.92439243260822, + 54.02324793473886 + ], + [ + 13.926382377764492, + 54.016226666244926 + ], + [ + 13.916452900114013, + 54.02186416371069 + ], + [ + 13.928140340718816, + 54.030678860989205 + ], + [ + 13.923007883795862, + 54.035268358262535 + ], + [ + 13.909527550177058, + 54.02626431955447 + ], + [ + 13.898675175839013, + 54.01207258416625 + ], + [ + 13.86689631720513, + 54.007510351418794 + ], + [ + 13.861864380880466, + 53.99975511616929 + ], + [ + 13.853346612081078, + 54.004384921323364 + ], + [ + 13.853236517666968, + 54.01367774207128 + ], + [ + 13.863675410885458, + 54.022133854213905 + ], + [ + 13.86596802783948, + 54.033041170150746 + ], + [ + 13.8703520695066, + 54.03647293934276 + ], + [ + 13.874106620886451, + 54.0322899785287 + ], + [ + 13.87967646341567, + 54.04025984205131 + ], + [ + 13.875354216077001, + 54.04365048378762 + ], + [ + 13.868145730667532, + 54.04562375290579 + ], + [ + 13.875893320641111, + 54.041765221114986 + ], + [ + 13.873048790629555, + 54.03909984886463 + ], + [ + 13.858941102742088, + 54.04811080696491 + ], + [ + 13.847420129163993, + 54.04674087033544 + ], + [ + 13.847498220703896, + 54.04355017100559 + ], + [ + 13.838366946898427, + 54.04022068370088 + ], + [ + 13.821042414358743, + 54.037688243995035 + ], + [ + 13.809801080252845, + 54.03095068989217 + ], + [ + 13.801286644326956, + 54.018740706517455 + ], + [ + 13.769915621016501, + 54.01918411945079 + ], + [ + 13.764304802705809, + 54.02998066096917 + ], + [ + 13.772888491004508, + 54.040830573434576 + ], + [ + 13.781238662704157, + 54.03854949507108 + ], + [ + 13.784565864510075, + 54.04622066460675 + ], + [ + 13.790568132689668, + 54.04867718562 + ], + [ + 13.788091635244685, + 54.05601212329091 + ], + [ + 13.797938701686746, + 54.061959356129336 + ], + [ + 13.800798756984262, + 54.074807602005656 + ], + [ + 13.808445983846173, + 54.081215997931295 + ], + [ + 13.813377946866154, + 54.09853559440842 + ], + [ + 13.808174726748758, + 54.106484802519844 + ], + [ + 13.813839361064392, + 54.107823258157005 + ], + [ + 13.792500005025424, + 54.11089646687618 + ], + [ + 13.78416495789351, + 54.11889087301464 + ], + [ + 13.774831549516838, + 54.120106014023946 + ], + [ + 13.772326110734957, + 54.133843098763144 + ], + [ + 13.764432408720404, + 54.138073617916426 + ], + [ + 13.764215165234832, + 54.134021841938505 + ], + [ + 13.758700129254976, + 54.13425578385481 + ], + [ + 13.755459065953646, + 54.13767946944639 + ], + [ + 13.751499107790803, + 54.14907553330174 + ], + [ + 13.757985742918008, + 54.15054278862818 + ], + [ + 13.750746030981956, + 54.14996040580104 + ], + [ + 13.749296748353201, + 54.15847457365981 + ], + [ + 13.758304868080058, + 54.16866745944169 + ], + [ + 13.797555648665506, + 54.17402460953691 + ] + ] + ], + [ + [ + [ + 11.473005882856308, + 54.02444752538141 + ], + [ + 11.494150747601466, + 54.021709680315944 + ], + [ + 11.495327760302487, + 54.01111005391592 + ], + [ + 11.488950446045198, + 53.999011292613204 + ], + [ + 11.4874062917019, + 54.00347263009806 + ], + [ + 11.482556376849063, + 54.00166662028133 + ], + [ + 11.485613849373916, + 54.00696621476023 + ], + [ + 11.483554183096256, + 54.00865561818688 + ], + [ + 11.478245159042483, + 53.99797388313438 + ], + [ + 11.480364738720224, + 53.98183380786634 + ], + [ + 11.472046999050834, + 53.97917994862314 + ], + [ + 11.467530566977938, + 53.97337785084097 + ], + [ + 11.47194653312805, + 53.97070932655072 + ], + [ + 11.46342028767619, + 53.969835075970494 + ], + [ + 11.463861375479896, + 53.96646621250015 + ], + [ + 11.454957227813237, + 53.961895324875414 + ], + [ + 11.455957341779554, + 53.95753345345377 + ], + [ + 11.44682500046449, + 53.95862990087807 + ], + [ + 11.441474095872875, + 53.96462178053956 + ], + [ + 11.446521119098334, + 53.97572564094019 + ], + [ + 11.44615408323023, + 53.9973276977551 + ], + [ + 11.4278684798985, + 53.98580985625284 + ], + [ + 11.426502051571308, + 53.96716769155137 + ], + [ + 11.42844789703579, + 53.96165822374094 + ], + [ + 11.43429677794087, + 53.96524618036823 + ], + [ + 11.431768432387784, + 53.96163345325248 + ], + [ + 11.425946064240636, + 53.96076416229983 + ], + [ + 11.420526161354529, + 53.96213526597116 + ], + [ + 11.409895988130952, + 53.968872909741705 + ], + [ + 11.402146922547562, + 53.968315965155135 + ], + [ + 11.393635023291402, + 53.97465173135819 + ], + [ + 11.387012320588546, + 53.967816099348354 + ], + [ + 11.411139877841848, + 53.96657737667901 + ], + [ + 11.400091268021942, + 53.96405273713166 + ], + [ + 11.38708531982697, + 53.96665574850132 + ], + [ + 11.376623083017146, + 53.97870823838279 + ], + [ + 11.376852544163642, + 53.99642692925215 + ], + [ + 11.404023131915597, + 54.00880063508188 + ], + [ + 11.442262684625659, + 54.020191738719184 + ], + [ + 11.473005882856308, + 54.02444752538141 + ] + ] + ], + [ + [ + [ + 13.183614944071241, + 54.49396426074806 + ], + [ + 13.197582724639268, + 54.49169867465963 + ], + [ + 13.196694182864437, + 54.48683181088641 + ], + [ + 13.200669991724666, + 54.48550067666631 + ], + [ + 13.22484160053463, + 54.48660693620606 + ], + [ + 13.227716702777043, + 54.484063479958 + ], + [ + 13.21854877058495, + 54.483201942538905 + ], + [ + 13.224781504272581, + 54.481816637435564 + ], + [ + 13.225492597931959, + 54.47067782639056 + ], + [ + 13.21186026010291, + 54.467119135088524 + ], + [ + 13.203850191218821, + 54.46867732877363 + ], + [ + 13.193174600931835, + 54.46442337841487 + ], + [ + 13.187379361239099, + 54.465613471991354 + ], + [ + 13.187473622224658, + 54.45942724759731 + ], + [ + 13.18168043406445, + 54.45610700821202 + ], + [ + 13.16986142249329, + 54.456777062289824 + ], + [ + 13.160675829850774, + 54.44898153767636 + ], + [ + 13.147095062451736, + 54.44913100507007 + ], + [ + 13.133073426224236, + 54.44316763228382 + ], + [ + 13.121977111453392, + 54.44249010123741 + ], + [ + 13.122169321690587, + 54.4515311107893 + ], + [ + 13.143480888008787, + 54.477984005357015 + ], + [ + 13.161510263359972, + 54.489897435371624 + ], + [ + 13.183614944071241, + 54.49396426074806 + ] + ] + ], + [ + [ + [ + 13.137000780245607, + 54.604756169229965 + ], + [ + 13.146787183889883, + 54.603354278480396 + ], + [ + 13.14831814310946, + 54.59319896464671 + ], + [ + 13.157314248845807, + 54.579151204748236 + ], + [ + 13.157957929593184, + 54.573719408319924 + ], + [ + 13.155360779442, + 54.58010476361351 + ], + [ + 13.152852367899472, + 54.57607943470403 + ], + [ + 13.150799919120509, + 54.575438042533804 + ], + [ + 13.146595739033296, + 54.59551630760085 + ], + [ + 13.144994919204672, + 54.57364889205922 + ], + [ + 13.140851577270011, + 54.58522775795977 + ], + [ + 13.134423352894398, + 54.58847004688139 + ], + [ + 13.13946287655639, + 54.590560813804345 + ], + [ + 13.141350675291267, + 54.59884820685974 + ], + [ + 13.129488169860162, + 54.59125322124587 + ], + [ + 13.125240663632836, + 54.583670486676084 + ], + [ + 13.111421835036058, + 54.584668503206835 + ], + [ + 13.110207172544792, + 54.58153564909584 + ], + [ + 13.119119686423666, + 54.57432981278846 + ], + [ + 13.110133242344686, + 54.57266195157981 + ], + [ + 13.10764805703227, + 54.568457386951245 + ], + [ + 13.115742415155893, + 54.557660196959894 + ], + [ + 13.116746715238683, + 54.53766390254743 + ], + [ + 13.106148279943714, + 54.531951131324305 + ], + [ + 13.100809522595059, + 54.53285961507206 + ], + [ + 13.105531062430964, + 54.53147905046286 + ], + [ + 13.103412477625149, + 54.52889904643972 + ], + [ + 13.092499843843255, + 54.52764045149705 + ], + [ + 13.092906291584374, + 54.517365550548185 + ], + [ + 13.08463244350986, + 54.51916063207792 + ], + [ + 13.08860856644478, + 54.51520073133136 + ], + [ + 13.081698706444824, + 54.51360251305967 + ], + [ + 13.07923885653874, + 54.502074230196975 + ], + [ + 13.072973794327584, + 54.4997494191496 + ], + [ + 13.073845378821574, + 54.491432658173984 + ], + [ + 13.070682065977763, + 54.49178229491787 + ], + [ + 13.076699402406472, + 54.4786263144451 + ], + [ + 13.07134784538964, + 54.479220283071626 + ], + [ + 13.073049242354514, + 54.4692322610848 + ], + [ + 13.067793844565738, + 54.47059417985467 + ], + [ + 13.071366964076786, + 54.468125761548556 + ], + [ + 13.064966655112242, + 54.457732180205674 + ], + [ + 13.061237643625288, + 54.46085958220504 + ], + [ + 13.060965313528671, + 54.478760052983276 + ], + [ + 13.098923190233473, + 54.559889734028374 + ], + [ + 13.102518442770556, + 54.577381475113754 + ], + [ + 13.09797335725701, + 54.590620823089594 + ], + [ + 13.118770629145, + 54.603052910980914 + ], + [ + 13.137000780245607, + 54.604756169229965 + ] + ] + ], + [ + [ + [ + 13.050677147404052, + 54.46023988922324 + ], + [ + 13.058989311518477, + 54.45119964063581 + ], + [ + 13.041558352863692, + 54.44243454635656 + ], + [ + 13.01563795115486, + 54.44367401436572 + ], + [ + 12.998492326975661, + 54.439993584147565 + ], + [ + 12.988628866240342, + 54.433991996470326 + ], + [ + 12.974607070161825, + 54.43279208726741 + ], + [ + 12.977615690780159, + 54.434717259529684 + ], + [ + 12.973190029754315, + 54.4345581664959 + ], + [ + 12.973263387152516, + 54.44040374414656 + ], + [ + 12.984373401857027, + 54.43579780190853 + ], + [ + 13.000399084815012, + 54.447513509344866 + ], + [ + 13.033047794904327, + 54.446804970494476 + ], + [ + 13.050677147404052, + 54.46023988922324 + ] + ] + ], + [ + [ + [ + 12.695731841242456, + 54.43103271945792 + ], + [ + 12.710644702093665, + 54.425633506825505 + ], + [ + 12.724080534077117, + 54.42537341994311 + ], + [ + 12.730906877466827, + 54.416364968613486 + ], + [ + 12.720210345564755, + 54.41517551929807 + ], + [ + 12.699619371836285, + 54.41886353476286 + ], + [ + 12.677280612457993, + 54.41595836613055 + ], + [ + 12.677982974739589, + 54.42249488547015 + ], + [ + 12.690802191278726, + 54.424476980139396 + ], + [ + 12.69358921804792, + 54.42883060283597 + ], + [ + 12.686882471382496, + 54.42759258797282 + ], + [ + 12.695731841242456, + 54.43103271945792 + ] + ] + ], + [ + [ + [ + 13.401533823802872, + 54.179956532589785 + ], + [ + 13.422221292117031, + 54.17029973292641 + ], + [ + 13.422170386048682, + 54.16741152854079 + ], + [ + 13.416518120793938, + 54.165089288367426 + ], + [ + 13.413458559085038, + 54.16073657437908 + ], + [ + 13.410209776385264, + 54.15981573311128 + ], + [ + 13.413154537561592, + 54.16319628280575 + ], + [ + 13.409636894993499, + 54.16835487428978 + ], + [ + 13.400514850720795, + 54.17141539178231 + ], + [ + 13.399751535384599, + 54.17897533830673 + ], + [ + 13.393500138392149, + 54.18077484518068 + ], + [ + 13.401533823802872, + 54.179956532589785 + ] + ] + ], + [ + [ + [ + 12.932044170695294, + 54.443249801322544 + ], + [ + 12.958475112344168, + 54.44168210177586 + ], + [ + 12.961496285603147, + 54.438058252076175 + ], + [ + 12.948367697087173, + 54.440338711248444 + ], + [ + 12.938529830383157, + 54.43856152191738 + ], + [ + 12.928826978158746, + 54.43224644425725 + ], + [ + 12.923932428918269, + 54.43479327749438 + ], + [ + 12.924891158108405, + 54.43876749613888 + ], + [ + 12.932044170695294, + 54.443249801322544 + ] + ] + ], + [ + [ + [ + 13.543897504105741, + 54.32304551343298 + ], + [ + 13.528117789854297, + 54.31845734913337 + ], + [ + 13.524755801911875, + 54.309408154185284 + ], + [ + 13.519072222468555, + 54.31185113136513 + ], + [ + 13.518528205227092, + 54.316262816746715 + ], + [ + 13.524042483699937, + 54.31660579966998 + ], + [ + 13.53030938164215, + 54.326464682780674 + ], + [ + 13.542201345650936, + 54.33240686325114 + ], + [ + 13.547131244051016, + 54.32620076705467 + ], + [ + 13.543897504105741, + 54.32304551343298 + ] + ] + ], + [ + [ + [ + 13.12872719054756, + 54.31408727868414 + ], + [ + 13.123972860893364, + 54.31159913366055 + ], + [ + 13.128786771381721, + 54.30655405425361 + ], + [ + 13.119829216599749, + 54.30288028044798 + ], + [ + 13.111968266019533, + 54.30873510358712 + ], + [ + 13.112409380444355, + 54.31264821408499 + ], + [ + 13.125240940968252, + 54.316118897241786 + ], + [ + 13.12872719054756, + 54.31408727868414 + ] + ] + ], + [ + [ + [ + 13.764135960948188, + 54.12702147381725 + ], + [ + 13.76855055065404, + 54.12650115118749 + ], + [ + 13.771983897582578, + 54.119103315295234 + ], + [ + 13.789981240054953, + 54.108706877060456 + ], + [ + 13.775019102258657, + 54.11139503912109 + ], + [ + 13.766695268467286, + 54.121351270192854 + ], + [ + 13.767046305405364, + 54.11877667706653 + ], + [ + 13.763132579631433, + 54.12097168168407 + ], + [ + 13.764135960948188, + 54.12702147381725 + ] + ] + ], + [ + [ + [ + 12.736578422503147, + 54.412347277522834 + ], + [ + 12.736215002049889, + 54.40801086293112 + ], + [ + 12.729774999217465, + 54.40490285439182 + ], + [ + 12.718130044244027, + 54.40526849553254 + ], + [ + 12.72443601910127, + 54.41242209501957 + ], + [ + 12.736578422503147, + 54.412347277522834 + ] + ] + ], + [ + [ + [ + 14.26700240153083, + 53.70844392503096 + ], + [ + 14.268554966303485, + 53.70555447183363 + ], + [ + 14.255890688776216, + 53.701690052571294 + ], + [ + 14.248686594982686, + 53.70449730957708 + ], + [ + 14.2526330160507, + 53.70902093115489 + ], + [ + 14.263061151768875, + 53.71058988067776 + ], + [ + 14.26700240153083, + 53.70844392503096 + ] + ] + ], + [ + [ + [ + 13.160097845965328, + 54.51285382156483 + ], + [ + 13.169002979714822, + 54.50662832497473 + ], + [ + 13.164879446784724, + 54.50212107042919 + ], + [ + 13.155170991246141, + 54.506655595044606 + ], + [ + 13.160097845965328, + 54.51285382156483 + ] + ] + ], + [ + [ + [ + 11.515053795096577, + 54.03799558396446 + ], + [ + 11.512299928659568, + 54.03993521682723 + ], + [ + 11.51190517038038, + 54.053974364967225 + ], + [ + 11.518053468544995, + 54.063824260293096 + ], + [ + 11.52300169760211, + 54.068487070623185 + ], + [ + 11.515186499937595, + 54.05450101125836 + ], + [ + 11.515053795096577, + 54.03799558396446 + ] + ] + ], + [ + [ + [ + 13.920410473832908, + 54.25146092215774 + ], + [ + 13.92676200857434, + 54.2486706176565 + ], + [ + 13.906818421193828, + 54.24026727010168 + ], + [ + 13.908618926331679, + 54.24414007322318 + ], + [ + 13.920410473832908, + 54.25146092215774 + ] + ] + ], + [ + [ + [ + 13.1247034247699, + 54.54358603437436 + ], + [ + 13.118569020245186, + 54.53893293392037 + ], + [ + 13.116957671253099, + 54.54685861833635 + ], + [ + 13.122935626154721, + 54.54984673494035 + ], + [ + 13.1247034247699, + 54.54358603437436 + ] + ] + ], + [ + [ + [ + 13.21110782115046, + 54.39696703812937 + ], + [ + 13.207394633383645, + 54.39766348413756 + ], + [ + 13.209216092988173, + 54.40109542853478 + ], + [ + 13.21934546138078, + 54.402201676019956 + ], + [ + 13.217181630648508, + 54.397703941745455 + ], + [ + 13.21110782115046, + 54.39696703812937 + ] + ] + ], + [ + [ + [ + 13.36918138953966, + 54.18348006634575 + ], + [ + 13.370544667300763, + 54.18053066196022 + ], + [ + 13.365356030319967, + 54.183153245570914 + ], + [ + 13.347367446697367, + 54.181847324438245 + ], + [ + 13.360178873063575, + 54.18513333202961 + ], + [ + 13.36918138953966, + 54.18348006634575 + ] + ] + ], + [ + [ + [ + 13.796883321164325, + 54.10733616416359 + ], + [ + 13.80853383815317, + 54.10090801234692 + ], + [ + 13.805152055961722, + 54.09469547867575 + ], + [ + 13.802708142610657, + 54.10225771749615 + ], + [ + 13.793842102727824, + 54.10724649323323 + ], + [ + 13.796883321164325, + 54.10733616416359 + ] + ] + ], + [ + [ + [ + 12.644062103468315, + 54.41937398635473 + ], + [ + 12.645030382915358, + 54.415581012553076 + ], + [ + 12.640185969114581, + 54.41937094528766 + ], + [ + 12.637304885337782, + 54.41609817522809 + ], + [ + 12.63535872233259, + 54.42209910057154 + ], + [ + 12.638030612578492, + 54.423542344980724 + ], + [ + 12.644062103468315, + 54.41937398635473 + ] + ] + ], + [ + [ + [ + 11.496341339196265, + 54.03131270475494 + ], + [ + 11.494789052437739, + 54.02419528417081 + ], + [ + 11.488038999598265, + 54.02413479973408 + ], + [ + 11.486354180650785, + 54.02547219568485 + ], + [ + 11.496341339196265, + 54.03131270475494 + ] + ] + ], + [ + [ + [ + 13.224781839435298, + 54.4696662564807 + ], + [ + 13.22282470597175, + 54.46500956293202 + ], + [ + 13.213723127297662, + 54.46448392249477 + ], + [ + 13.213227299325553, + 54.4670590341898 + ], + [ + 13.224781839435298, + 54.4696662564807 + ] + ] + ], + [ + [ + [ + 13.774442465957067, + 54.20626076028892 + ], + [ + 13.77072729193309, + 54.200740339781426 + ], + [ + 13.768949761977504, + 54.20082204624323 + ], + [ + 13.768876806512939, + 54.20892111325703 + ], + [ + 13.774442465957067, + 54.20626076028892 + ] + ] + ], + [ + [ + [ + 12.981012754112815, + 54.442374285384254 + ], + [ + 12.984201126006871, + 54.44058964931741 + ], + [ + 12.981968408055568, + 54.437501447269725 + ], + [ + 12.973554355833837, + 54.44135649485819 + ], + [ + 12.981012754112815, + 54.442374285384254 + ] + ] + ], + [ + [ + [ + 12.531468468592555, + 54.3580708486978 + ], + [ + 12.535520949785772, + 54.35600918110026 + ], + [ + 12.529273978345987, + 54.35468420831814 + ], + [ + 12.53096120879695, + 54.3499278961271 + ], + [ + 12.527863696964623, + 54.3541128343885 + ], + [ + 12.531468468592555, + 54.3580708486978 + ] + ] + ], + [ + [ + [ + 13.209728693948351, + 54.46353929601808 + ], + [ + 13.20312581066635, + 54.461609030485306 + ], + [ + 13.198665217393664, + 54.457295961048025 + ], + [ + 13.199219674657439, + 54.46170417572538 + ], + [ + 13.209728693948351, + 54.46353929601808 + ] + ] + ], + [ + [ + [ + 13.812914916950662, + 54.17026303009809 + ], + [ + 13.809294130481423, + 54.16994984033572 + ], + [ + 13.806582859693357, + 54.174030315475356 + ], + [ + 13.812269905784245, + 54.17336889721447 + ], + [ + 13.812914916950662, + 54.17026303009809 + ] + ] + ], + [ + [ + [ + 13.12306732365958, + 54.42751612477419 + ], + [ + 13.11788180235806, + 54.426711222125064 + ], + [ + 13.116617763110925, + 54.430844603351645 + ], + [ + 13.123002704577527, + 54.42885799694372 + ], + [ + 13.12306732365958, + 54.42751612477419 + ] + ] + ], + [ + [ + [ + 12.665607820583114, + 54.40681859748636 + ], + [ + 12.662395366458345, + 54.40484528379396 + ], + [ + 12.656203921404042, + 54.40711865827461 + ], + [ + 12.658657432954529, + 54.408274353952855 + ], + [ + 12.665607820583114, + 54.40681859748636 + ] + ] + ], + [ + [ + [ + 13.809113396944477, + 54.17798188605804 + ], + [ + 13.811809766134997, + 54.17596601420055 + ], + [ + 13.803328922837782, + 54.17688366336867 + ], + [ + 13.804088403569136, + 54.17818530398132 + ], + [ + 13.809113396944477, + 54.17798188605804 + ] + ] + ], + [ + [ + [ + 13.785243711446197, + 54.052946614653465 + ], + [ + 13.780285006407526, + 54.055786128234594 + ], + [ + 13.78231517097908, + 54.059407588187085 + ], + [ + 13.782735654321057, + 54.05692550637204 + ], + [ + 13.785243711446197, + 54.052946614653465 + ] + ] + ], + [ + [ + [ + 12.10760690749955, + 54.16293721623433 + ], + [ + 12.104576581079325, + 54.16530512905337 + ], + [ + 12.107139287161509, + 54.167508758506216 + ], + [ + 12.108573358698472, + 54.163875450677246 + ], + [ + 12.10760690749955, + 54.16293721623433 + ] + ] + ], + [ + [ + [ + 12.583737873560247, + 54.37529066435999 + ], + [ + 12.58044121310219, + 54.37710558669836 + ], + [ + 12.585217418683449, + 54.38072703248759 + ], + [ + 12.585331477434039, + 54.37610856226827 + ], + [ + 12.583737873560247, + 54.37529066435999 + ] + ] + ], + [ + [ + [ + 11.427837023324235, + 53.94223070365282 + ], + [ + 11.428367075977151, + 53.94009130553481 + ], + [ + 11.426799918588873, + 53.93796751659095 + ], + [ + 11.423207730699986, + 53.9421904703335 + ], + [ + 11.427837023324235, + 53.94223070365282 + ] + ] + ], + [ + [ + [ + 12.92929320625496, + 54.42728750252528 + ], + [ + 12.927395761962888, + 54.430234358402316 + ], + [ + 12.923224697223239, + 54.4330388200628 + ], + [ + 12.929686819414899, + 54.43015429579711 + ], + [ + 12.92929320625496, + 54.42728750252528 + ] + ] + ], + [ + [ + [ + 11.467246061548126, + 53.963787248729105 + ], + [ + 11.467271767832328, + 53.96756162515388 + ], + [ + 11.470645830758357, + 53.968467088665136 + ], + [ + 11.470315220050857, + 53.9666633403787 + ], + [ + 11.467246061548126, + 53.963787248729105 + ] + ] + ], + [ + [ + [ + 14.028817913259733, + 53.94738229148371 + ], + [ + 14.024693869616947, + 53.94964044641762 + ], + [ + 14.024216635388989, + 53.95150980784287 + ], + [ + 14.02732793940917, + 53.951079122588354 + ], + [ + 14.028817913259733, + 53.94738229148371 + ] + ] + ], + [ + [ + [ + 13.804674143353349, + 54.084527109894886 + ], + [ + 13.806362910314006, + 54.08446466261396 + ], + [ + 13.803894009017622, + 54.07907125323187 + ], + [ + 13.801789036411675, + 54.08159842078019 + ], + [ + 13.804674143353349, + 54.084527109894886 + ] + ] + ], + [ + [ + [ + 12.970146867585974, + 54.43642168556945 + ], + [ + 12.967789186793775, + 54.438468493060604 + ], + [ + 12.97125603988434, + 54.44053242673713 + ], + [ + 12.971550046860855, + 54.440264285534234 + ], + [ + 12.970146867585974, + 54.43642168556945 + ] + ] + ], + [ + [ + [ + 12.526437725907803, + 54.36269087626099 + ], + [ + 12.524841928492721, + 54.365092947752956 + ], + [ + 12.528173591551106, + 54.366702787157166 + ], + [ + 12.528555559911245, + 54.36617382776676 + ], + [ + 12.526437725907803, + 54.36269087626099 + ] + ] + ], + [ + [ + [ + 12.52208030732858, + 54.37212388554919 + ], + [ + 12.524355983686087, + 54.3711842962693 + ], + [ + 12.524071651055273, + 54.37033337341174 + ], + [ + 12.518584843570656, + 54.372227501147904 + ], + [ + 12.522531387640136, + 54.373922677330505 + ], + [ + 12.52208030732858, + 54.37212388554919 + ] + ] + ], + [ + [ + [ + 12.529590451001543, + 54.34588629821661 + ], + [ + 12.52801983774446, + 54.34622056040393 + ], + [ + 12.526920293014248, + 54.35222689379889 + ], + [ + 12.529585852471337, + 54.35009267282111 + ], + [ + 12.529590451001543, + 54.34588629821661 + ] + ] + ], + [ + [ + [ + 12.671143667943339, + 54.41619666341832 + ], + [ + 12.668610392544156, + 54.418474068929825 + ], + [ + 12.670447738914001, + 54.420961396628556 + ], + [ + 12.67042682577543, + 54.41813387535428 + ], + [ + 12.671143667943339, + 54.41619666341832 + ] + ] + ], + [ + [ + [ + 12.526974928145497, + 54.36717360661643 + ], + [ + 12.524983408517379, + 54.36722941973563 + ], + [ + 12.523103434537678, + 54.367925032001985 + ], + [ + 12.528543536784172, + 54.368502879963245 + ], + [ + 12.526974928145497, + 54.36717360661643 + ] + ] + ], + [ + [ + [ + 12.725525782091083, + 54.427169161530955 + ], + [ + 12.723097335987676, + 54.427867668030935 + ], + [ + 12.723620914981613, + 54.429645780207146 + ], + [ + 12.725569530204307, + 54.42919824224798 + ], + [ + 12.725525782091083, + 54.427169161530955 + ] + ] + ], + [ + [ + [ + 12.527914089546766, + 54.35777705469677 + ], + [ + 12.525126062949651, + 54.35938853104718 + ], + [ + 12.527680580958108, + 54.361435133254936 + ], + [ + 12.527638533359097, + 54.358821765245125 + ], + [ + 12.527914089546766, + 54.35777705469677 + ] + ] + ], + [ + [ + [ + 13.301308145092651, + 54.54062495542393 + ], + [ + 13.300437926046001, + 54.539225000222075 + ], + [ + 13.302844394710952, + 54.537545047482666 + ], + [ + 13.298631157500639, + 54.539098648228254 + ], + [ + 13.301308145092651, + 54.54062495542393 + ] + ] + ], + [ + [ + [ + 13.080708557598944, + 54.474518092103914 + ], + [ + 13.079930233709566, + 54.4757170644721 + ], + [ + 13.082809619411288, + 54.47687551906969 + ], + [ + 13.083154193481793, + 54.475822745164415 + ], + [ + 13.080708557598944, + 54.474518092103914 + ] + ] + ], + [ + [ + [ + 14.032430923444615, + 53.94403045269655 + ], + [ + 14.031035854364557, + 53.944681519636 + ], + [ + 14.033396112388663, + 53.946521038189736 + ], + [ + 14.034212965379673, + 53.94550866110065 + ], + [ + 14.032430923444615, + 53.94403045269655 + ] + ] + ], + [ + [ + [ + 13.958398432969089, + 53.941000561157104 + ], + [ + 13.957798537792593, + 53.942842660998174 + ], + [ + 13.959170899640906, + 53.94361385965589 + ], + [ + 13.960760534375193, + 53.94195107746801 + ], + [ + 13.958398432969089, + 53.941000561157104 + ] + ] + ], + [ + [ + [ + 13.207447926331923, + 54.4656012408026 + ], + [ + 13.20685234134971, + 54.464936838302656 + ], + [ + 13.203811456562985, + 54.46587270235694 + ], + [ + 13.206325503735929, + 54.46667333997145 + ], + [ + 13.207447926331923, + 54.4656012408026 + ] + ] + ], + [ + [ + [ + 11.476962152289857, + 53.96397800647568 + ], + [ + 11.477496939460421, + 53.96338438107161 + ], + [ + 11.477356710508355, + 53.961478271840896 + ], + [ + 11.474799956796438, + 53.96389985945255 + ], + [ + 11.476962152289857, + 53.96397800647568 + ] + ] + ], + [ + [ + [ + 13.36351423196152, + 54.251087104811575 + ], + [ + 13.362348541837315, + 54.251142227152435 + ], + [ + 13.358607415947048, + 54.25276817577536 + ], + [ + 13.361283236426754, + 54.25270720234217 + ], + [ + 13.36351423196152, + 54.251087104811575 + ] + ] + ], + [ + [ + [ + 13.351558450793526, + 54.17579603555088 + ], + [ + 13.348986275481318, + 54.176432441523616 + ], + [ + 13.348936305751199, + 54.17733237926866 + ], + [ + 13.350474625767815, + 54.17742578732027 + ], + [ + 13.351558450793526, + 54.17579603555088 + ] + ] + ], + [ + [ + [ + 13.211499780623019, + 54.465296901056604 + ], + [ + 13.212493202595107, + 54.464446782983806 + ], + [ + 13.210347675123632, + 54.46364110620372 + ], + [ + 13.209070695617267, + 54.464382190702594 + ], + [ + 13.211499780623019, + 54.465296901056604 + ] + ] + ], + [ + [ + [ + 12.988483091188202, + 54.44372793596605 + ], + [ + 12.986984439601697, + 54.44404269449972 + ], + [ + 12.989248479818954, + 54.44511028734109 + ], + [ + 12.989950198095569, + 54.444554564296595 + ], + [ + 12.988483091188202, + 54.44372793596605 + ] + ] + ], + [ + [ + [ + 13.334161850638713, + 54.169863389194376 + ], + [ + 13.334306211167803, + 54.169095686381695 + ], + [ + 13.332301968550414, + 54.168798098271715 + ], + [ + 13.332029947685568, + 54.169847310720584 + ], + [ + 13.334161850638713, + 54.169863389194376 + ] + ] + ], + [ + [ + [ + 13.812248640050447, + 54.17410603114364 + ], + [ + 13.810580754464102, + 54.174608865654754 + ], + [ + 13.81112046990078, + 54.17539075493312 + ], + [ + 13.812572534017683, + 54.175256271957174 + ], + [ + 13.812248640050447, + 54.17410603114364 + ] + ] + ], + [ + [ + [ + 13.39009851233007, + 54.26422987812583 + ], + [ + 13.388745497791202, + 54.264403674001606 + ], + [ + 13.388997543781581, + 54.265253809331945 + ], + [ + 13.390841055725915, + 54.26512578037614 + ], + [ + 13.39009851233007, + 54.26422987812583 + ] + ] + ], + [ + [ + [ + 13.354684697843881, + 54.17912454589649 + ], + [ + 13.354292550525088, + 54.18022450188357 + ], + [ + 13.35538181279233, + 54.181125101443214 + ], + [ + 13.35545407590932, + 54.18046104894836 + ], + [ + 13.354684697843881, + 54.17912454589649 + ] + ] + ], + [ + [ + [ + 12.103721789937994, + 54.16760349559102 + ], + [ + 12.10217871611718, + 54.16780746876077 + ], + [ + 12.104547491829125, + 54.168401335922226 + ], + [ + 12.104626942020445, + 54.16806797141272 + ], + [ + 12.103721789937994, + 54.16760349559102 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "07", + "AGS": "07", + "SDV_RS": "073150000000", + "GEN": "Rheinland-Pfalz", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "07", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEB", + "RS_0": "070000000000", + "AGS_0": "07000000", + "WSK": "2004/01/01", + "DEBKG_ID": "DEBKGDL20000E6ZO", + "destatis": { + "population": 4011582, + "population_m": 1970535, + "population_w": 2041047 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.808788401220583, + 50.9388044526899 + ], + [ + 7.813265981384604, + 50.940027244636674 + ], + [ + 7.828498720652848, + 50.9288897314374 + ], + [ + 7.835785479104175, + 50.929563828594056 + ], + [ + 7.838306960417486, + 50.9262875677696 + ], + [ + 7.846528597218638, + 50.93074303073695 + ], + [ + 7.851495862006642, + 50.92583240908314 + ], + [ + 7.833709738023687, + 50.90834653428892 + ], + [ + 7.834964820447053, + 50.901856855509656 + ], + [ + 7.826699861653405, + 50.890835915675936 + ], + [ + 7.82926358435423, + 50.88238662032318 + ], + [ + 7.850833319147456, + 50.877707354297115 + ], + [ + 7.869002340066146, + 50.87907078070731 + ], + [ + 7.872827786232592, + 50.87559206526959 + ], + [ + 7.882458169775111, + 50.874891135880425 + ], + [ + 7.887103903220597, + 50.86539832185387 + ], + [ + 7.893955751179649, + 50.86473298173619 + ], + [ + 7.892998209765262, + 50.85948064821847 + ], + [ + 7.905851426965089, + 50.84810944335776 + ], + [ + 7.922851854970482, + 50.84466176324271 + ], + [ + 7.938303447455071, + 50.84837987129838 + ], + [ + 7.952896069320929, + 50.84600905755082 + ], + [ + 7.957688480650591, + 50.848868992206405 + ], + [ + 7.966981799913537, + 50.84403951540331 + ], + [ + 7.968071052673247, + 50.83604172419107 + ], + [ + 7.978313123341388, + 50.83331176276865 + ], + [ + 7.971959957055569, + 50.81469969020495 + ], + [ + 7.973937841822852, + 50.8041734170975 + ], + [ + 7.967312566880147, + 50.798249086365104 + ], + [ + 7.968979052971702, + 50.785618405059246 + ], + [ + 7.964248180921246, + 50.78382248812627 + ], + [ + 7.968861797548623, + 50.77392108722933 + ], + [ + 7.98402780123609, + 50.76099008450697 + ], + [ + 8.000229496272032, + 50.75508077559619 + ], + [ + 8.040325986839502, + 50.72565709111106 + ], + [ + 8.043045796429137, + 50.71171577783464 + ], + [ + 8.039689942322912, + 50.697375345810855 + ], + [ + 8.059656032658374, + 50.695043311150606 + ], + [ + 8.079578597091258, + 50.706084624231494 + ], + [ + 8.08247945190819, + 50.70290436466424 + ], + [ + 8.099173320559608, + 50.70355792490064 + ], + [ + 8.109820137056252, + 50.69800777406989 + ], + [ + 8.121063881397884, + 50.68542016860119 + ], + [ + 8.125776742844804, + 50.68581404948876 + ], + [ + 8.119700185927773, + 50.677146009166044 + ], + [ + 8.112583578268477, + 50.6755679832061 + ], + [ + 8.110092340753642, + 50.6572507793635 + ], + [ + 8.127491728238653, + 50.64508691696588 + ], + [ + 8.128755749355989, + 50.638502978434786 + ], + [ + 8.140884865268347, + 50.63022826661346 + ], + [ + 8.137736045378297, + 50.61822202898822 + ], + [ + 8.12601867235646, + 50.61009313692545 + ], + [ + 8.147507999365018, + 50.602114371017166 + ], + [ + 8.152160898979716, + 50.59367498111868 + ], + [ + 8.139671591626913, + 50.566512704467 + ], + [ + 8.133350568046543, + 50.56181911014791 + ], + [ + 8.131939348606776, + 50.55702796414252 + ], + [ + 8.137912756178446, + 50.55094786426129 + ], + [ + 8.118991994577344, + 50.548470387613975 + ], + [ + 8.111169550744627, + 50.543663464967345 + ], + [ + 8.114081832171285, + 50.53918656741933 + ], + [ + 8.12088070661784, + 50.539660093716144 + ], + [ + 8.11773825073199, + 50.53450892644281 + ], + [ + 8.103427207008593, + 50.53262800572239 + ], + [ + 8.087303551252788, + 50.538539491643625 + ], + [ + 8.070521466867985, + 50.53799815672202 + ], + [ + 8.066421972894775, + 50.548930811161846 + ], + [ + 8.041611266489133, + 50.556993251223524 + ], + [ + 8.040995700726029, + 50.55256884848769 + ], + [ + 8.028142639102049, + 50.55058367122504 + ], + [ + 8.028294119017236, + 50.544501109135226 + ], + [ + 8.01280728181687, + 50.531771448327 + ], + [ + 8.004646508158718, + 50.53064985519549 + ], + [ + 7.992857647772261, + 50.52211155494625 + ], + [ + 7.996564081998503, + 50.51723155223767 + ], + [ + 7.982937247871006, + 50.511461090878335 + ], + [ + 7.98996693174962, + 50.49856929235406 + ], + [ + 7.978902889354805, + 50.49538382800501 + ], + [ + 7.979198224986078, + 50.48464087109869 + ], + [ + 7.985615914331629, + 50.48258443125067 + ], + [ + 7.987667910131343, + 50.47272609665898 + ], + [ + 7.994821077378291, + 50.470595202749735 + ], + [ + 7.999954801070938, + 50.46293737165452 + ], + [ + 8.010474863430256, + 50.460572512869355 + ], + [ + 8.01076600093868, + 50.45269242609752 + ], + [ + 8.008110241340706, + 50.448799810333526 + ], + [ + 8.000115370194463, + 50.44748311571007 + ], + [ + 8.001020848774779, + 50.445306104647536 + ], + [ + 7.990632849468081, + 50.44393675234323 + ], + [ + 7.989391520255479, + 50.43973238356726 + ], + [ + 7.97518245218064, + 50.43762097527508 + ], + [ + 7.97821989409289, + 50.43434751707751 + ], + [ + 7.988095058276608, + 50.43550878850683 + ], + [ + 7.984375898112135, + 50.432312574116445 + ], + [ + 7.987782203391541, + 50.427921599759465 + ], + [ + 7.981239427583963, + 50.41800149318412 + ], + [ + 7.974933058413241, + 50.41421708814258 + ], + [ + 7.966172023115974, + 50.415212814988514 + ], + [ + 7.964191681561698, + 50.412225230325774 + ], + [ + 7.971559408169885, + 50.40622046529249 + ], + [ + 7.982418559140787, + 50.40809719937817 + ], + [ + 7.989643040802809, + 50.40102587934834 + ], + [ + 7.984299950400962, + 50.39900952553413 + ], + [ + 7.98715391054335, + 50.39805461195276 + ], + [ + 8.023757273449347, + 50.40076622461909 + ], + [ + 8.020023215035858, + 50.386119475162516 + ], + [ + 8.014323001381793, + 50.38447491660246 + ], + [ + 8.0336152172176, + 50.3817485410793 + ], + [ + 8.042555732070591, + 50.38605418450819 + ], + [ + 8.04849464828842, + 50.378285769006524 + ], + [ + 8.046051336459595, + 50.37465962791644 + ], + [ + 8.050936410554081, + 50.379517149782075 + ], + [ + 8.051002529713744, + 50.3759170791099 + ], + [ + 8.058396167421481, + 50.373320095530076 + ], + [ + 8.059756762013837, + 50.37531153087391 + ], + [ + 8.06732390430178, + 50.357755146205164 + ], + [ + 8.076769664551493, + 50.34840321976502 + ], + [ + 8.076669786974774, + 50.335869797953315 + ], + [ + 8.071944285683912, + 50.33177292189797 + ], + [ + 8.074385205598885, + 50.329438877009956 + ], + [ + 8.094069656402358, + 50.33034813524931 + ], + [ + 8.093594600547569, + 50.32808760481621 + ], + [ + 8.102677518625223, + 50.32701728359605 + ], + [ + 8.107159008835515, + 50.32157438352804 + ], + [ + 8.102414395808738, + 50.30982647588674 + ], + [ + 8.118600733959914, + 50.299679996705216 + ], + [ + 8.121913617230712, + 50.277225030720366 + ], + [ + 8.1031208289804, + 50.259788842083964 + ], + [ + 8.092001154299348, + 50.26524527183992 + ], + [ + 8.079031646981413, + 50.26100216965706 + ], + [ + 8.082993207855845, + 50.2659019719302 + ], + [ + 8.074710658088811, + 50.26719447466089 + ], + [ + 8.072088309726245, + 50.2731525402418 + ], + [ + 8.052945810430677, + 50.27413208028197 + ], + [ + 8.035891844839828, + 50.27119223184777 + ], + [ + 8.035774572585177, + 50.264572885197985 + ], + [ + 8.021650501541199, + 50.25834481310948 + ], + [ + 8.02494386099316, + 50.254193775014414 + ], + [ + 8.031521171428185, + 50.255956035734606 + ], + [ + 8.037874879325376, + 50.24910675268587 + ], + [ + 8.036137869656454, + 50.24508915467839 + ], + [ + 8.044089299100834, + 50.242470236076294 + ], + [ + 8.0494373065854, + 50.24436718324554 + ], + [ + 8.048395076375614, + 50.24065390765126 + ], + [ + 8.05890958579505, + 50.23440564230037 + ], + [ + 8.046672259015288, + 50.22763557009848 + ], + [ + 8.03971834687679, + 50.22858475863144 + ], + [ + 8.04073056080786, + 50.225590676355026 + ], + [ + 8.032869172010912, + 50.220821410254615 + ], + [ + 8.03692630085204, + 50.218901168317494 + ], + [ + 8.035050723525645, + 50.21559294136341 + ], + [ + 8.01177271649842, + 50.21803348350693 + ], + [ + 8.01152952801061, + 50.22237642664014 + ], + [ + 8.002709509698185, + 50.224381133514676 + ], + [ + 8.00636808978212, + 50.228701030994245 + ], + [ + 7.993521187841953, + 50.2317156765923 + ], + [ + 7.997072762835083, + 50.236195586930585 + ], + [ + 7.990203926695645, + 50.23866512670506 + ], + [ + 7.986556797985776, + 50.228088100013345 + ], + [ + 7.97133624472764, + 50.22247760877163 + ], + [ + 7.953052225713586, + 50.220398058210854 + ], + [ + 7.948094843390666, + 50.21762290353536 + ], + [ + 7.9515597525922, + 50.21426097722669 + ], + [ + 7.947395101375438, + 50.21007196906264 + ], + [ + 7.92079956828427, + 50.20796364382711 + ], + [ + 7.911141963298908, + 50.20373042563799 + ], + [ + 7.907826667228296, + 50.200756476152506 + ], + [ + 7.912503256159891, + 50.196433269271054 + ], + [ + 7.910215463692975, + 50.19349452167134 + ], + [ + 7.882830210754744, + 50.18131748693557 + ], + [ + 7.888663180249435, + 50.173708120708326 + ], + [ + 7.884014220552801, + 50.16956859103096 + ], + [ + 7.892376956219958, + 50.16180082662783 + ], + [ + 7.932942307987951, + 50.14388431500954 + ], + [ + 7.922487547292992, + 50.13445730354318 + ], + [ + 7.927761768507978, + 50.11913629964696 + ], + [ + 7.925326038604813, + 50.10884531236605 + ], + [ + 7.930097217747246, + 50.10374011026906 + ], + [ + 7.92036364189393, + 50.103680035337426 + ], + [ + 7.920085632964827, + 50.108421041027036 + ], + [ + 7.903223634914453, + 50.121552456039595 + ], + [ + 7.897441790818528, + 50.121529006608235 + ], + [ + 7.884716909139839, + 50.11437834930984 + ], + [ + 7.8653876464307, + 50.12080375588871 + ], + [ + 7.859937359836659, + 50.12762838250318 + ], + [ + 7.854016101658575, + 50.12832878612157 + ], + [ + 7.84491808361976, + 50.123499256991416 + ], + [ + 7.843090832382552, + 50.1116609737194 + ], + [ + 7.835231385344913, + 50.11002120563758 + ], + [ + 7.83725449346521, + 50.099705739802225 + ], + [ + 7.830071078782648, + 50.098025580347034 + ], + [ + 7.830064704816435, + 50.093181729246425 + ], + [ + 7.836754041299974, + 50.09442724160099 + ], + [ + 7.833335059949295, + 50.09226776449214 + ], + [ + 7.839230249779607, + 50.087480512267604 + ], + [ + 7.837194078536105, + 50.08412892219163 + ], + [ + 7.827180286500957, + 50.081572226363605 + ], + [ + 7.822089291095029, + 50.08400988197076 + ], + [ + 7.816751339725632, + 50.08067947133779 + ], + [ + 7.814636916533394, + 50.08342077421479 + ], + [ + 7.803461099254937, + 50.08457999934449 + ], + [ + 7.787575824261163, + 50.069276366658464 + ], + [ + 7.773997184582242, + 50.06654010394074 + ], + [ + 7.773721188166926, + 50.056310467532384 + ], + [ + 7.792205296068095, + 50.04418336810352 + ], + [ + 7.805884392592949, + 50.039341965267546 + ], + [ + 7.83005100941362, + 50.02155268241672 + ], + [ + 7.850557168056123, + 50.01393712842022 + ], + [ + 7.857894596436928, + 50.00713007600018 + ], + [ + 7.865575036167787, + 49.98105544193587 + ], + [ + 7.870644335860255, + 49.97563270448011 + ], + [ + 7.886587426396038, + 49.97190413385907 + ], + [ + 7.96740157933075, + 49.97777290734132 + ], + [ + 8.036356998092593, + 50.00231165894969 + ], + [ + 8.079569940560743, + 50.006898714816266 + ], + [ + 8.129761584931918, + 50.024410234720314 + ], + [ + 8.18094914141563, + 50.03520598012755 + ], + [ + 8.229466640382505, + 50.031424728894805 + ], + [ + 8.24455772151978, + 50.027628380371524 + ], + [ + 8.322339373163038, + 49.97359170315227 + ], + [ + 8.33763432900943, + 49.95609945865114 + ], + [ + 8.354604484579857, + 49.915840061381765 + ], + [ + 8.343555977365444, + 49.892872774939626 + ], + [ + 8.34401005667369, + 49.88010931854136 + ], + [ + 8.35752445650562, + 49.864901495247544 + ], + [ + 8.374561373366225, + 49.861620953116685 + ], + [ + 8.383583802214691, + 49.85567786038938 + ], + [ + 8.378448621262985, + 49.82482008405813 + ], + [ + 8.406076882540681, + 49.796569028247255 + ], + [ + 8.416297385787301, + 49.77386768574413 + ], + [ + 8.432657629226314, + 49.76596562265976 + ], + [ + 8.471984259694564, + 49.768889470227 + ], + [ + 8.47985001668383, + 49.761764785561596 + ], + [ + 8.435958648273074, + 49.720989390372466 + ], + [ + 8.38829281329942, + 49.70928438503343 + ], + [ + 8.363357924241733, + 49.69863780729904 + ], + [ + 8.357266999493707, + 49.69214161081254 + ], + [ + 8.356105210589595, + 49.67971727826836 + ], + [ + 8.369630860386563, + 49.659173048131656 + ], + [ + 8.38339396342932, + 49.625194945672135 + ], + [ + 8.409047726387538, + 49.60504413662421 + ], + [ + 8.42309808035221, + 49.581921557902355 + ], + [ + 8.414725337054927, + 49.553896791086984 + ], + [ + 8.42391017022921, + 49.540600893481326 + ], + [ + 8.44296390715355, + 49.49269559036186 + ], + [ + 8.463795388269663, + 49.47040265853366 + ], + [ + 8.460875914051773, + 49.46502234042284 + ], + [ + 8.444322354398025, + 49.459187259002995 + ], + [ + 8.442690860346634, + 49.450239189830704 + ], + [ + 8.455527662012933, + 49.44376037012167 + ], + [ + 8.498879478210446, + 49.44265448497322 + ], + [ + 8.507830567385854, + 49.435971883551574 + ], + [ + 8.49618884507081, + 49.40213635868571 + ], + [ + 8.463528358301478, + 49.38442891570918 + ], + [ + 8.46451707655192, + 49.37639268781574 + ], + [ + 8.47323119175996, + 49.3733642711237 + ], + [ + 8.500397518602853, + 49.38901364784299 + ], + [ + 8.496811191572194, + 49.36418049515139 + ], + [ + 8.483291437272499, + 49.34859153073756 + ], + [ + 8.455523798798923, + 49.33209034565902 + ], + [ + 8.450484520937477, + 49.323141481069655 + ], + [ + 8.455803727584694, + 49.314209758546866 + ], + [ + 8.483849839109405, + 49.30494811548598 + ], + [ + 8.48906884009109, + 49.29312437013262 + ], + [ + 8.4822553809146, + 49.286544260432066 + ], + [ + 8.458194880094936, + 49.27910869189748 + ], + [ + 8.439803283446256, + 49.26234679688815 + ], + [ + 8.400686475554323, + 49.2441593900782 + ], + [ + 8.390815976189977, + 49.23609487302379 + ], + [ + 8.38480377761808, + 49.219627642872325 + ], + [ + 8.398535109197148, + 49.22575275403815 + ], + [ + 8.403539912124113, + 49.224721517472425 + ], + [ + 8.40502125497829, + 49.22035783581349 + ], + [ + 8.39849791752162, + 49.20771875472716 + ], + [ + 8.385015523671914, + 49.19830067203603 + ], + [ + 8.381210558739857, + 49.185686336038714 + ], + [ + 8.368431127803596, + 49.16805240395603 + ], + [ + 8.372708393307626, + 49.151981290540924 + ], + [ + 8.358091293747428, + 49.09778419391171 + ], + [ + 8.311686689927884, + 49.05430717307226 + ], + [ + 8.297374095025905, + 49.01350524902331 + ], + [ + 8.28759666743014, + 48.99842746055962 + ], + [ + 8.277348961239534, + 48.989938939102856 + ], + [ + 8.232632819736883, + 48.96657144569515 + ], + [ + 8.22259587562498, + 48.975929493070446 + ], + [ + 8.215128898792347, + 48.97519231716589 + ], + [ + 8.199480559892683, + 48.96689755762044 + ], + [ + 8.195391565550208, + 48.96905226087473 + ], + [ + 8.19439351584404, + 48.977131670302235 + ], + [ + 8.139902376187194, + 48.97845033055123 + ], + [ + 8.123801235750067, + 48.98636589629724 + ], + [ + 8.119530411419337, + 48.98478811038691 + ], + [ + 8.108169702070517, + 48.98643221923473 + ], + [ + 8.106345675238467, + 48.989078846047605 + ], + [ + 8.087683834748587, + 48.98982019773883 + ], + [ + 8.085517920911084, + 48.99320199507565 + ], + [ + 8.070122491343389, + 48.996296767282196 + ], + [ + 8.063925597952837, + 49.005533429536634 + ], + [ + 8.04897595403849, + 49.014292474882794 + ], + [ + 8.03101940064105, + 49.01886881380863 + ], + [ + 8.022805342867446, + 49.01808700873265 + ], + [ + 8.019110380400559, + 49.02151950751489 + ], + [ + 8.013169572169337, + 49.02130175344573 + ], + [ + 8.011214814678864, + 49.02551562284333 + ], + [ + 7.996330180253335, + 49.029052624570596 + ], + [ + 7.974788940623255, + 49.02679953646687 + ], + [ + 7.966525402812549, + 49.04154071874857 + ], + [ + 7.949018204503139, + 49.04719717919161 + ], + [ + 7.945138573747104, + 49.05540613601759 + ], + [ + 7.940709319958825, + 49.05420950835833 + ], + [ + 7.932791982237623, + 49.05805758229943 + ], + [ + 7.923445617893849, + 49.04406387619281 + ], + [ + 7.916982912555078, + 49.04088245135381 + ], + [ + 7.913112204911944, + 49.04011430882945 + ], + [ + 7.910689599704544, + 49.04510641426929 + ], + [ + 7.902541707915889, + 49.04454318494211 + ], + [ + 7.889131639972351, + 49.04904077469403 + ], + [ + 7.881280536667254, + 49.04604523102763 + ], + [ + 7.866825985706775, + 49.03291668223243 + ], + [ + 7.854653992245091, + 49.035482310208835 + ], + [ + 7.849860801394166, + 49.04400889875766 + ], + [ + 7.845708375484571, + 49.04258737151859 + ], + [ + 7.830512886666118, + 49.04727470681928 + ], + [ + 7.82594165156332, + 49.05218762714999 + ], + [ + 7.812631773256424, + 49.0571067516163 + ], + [ + 7.810483317674332, + 49.06125828096842 + ], + [ + 7.794402496634342, + 49.06568567014436 + ], + [ + 7.789433386249474, + 49.058722271050236 + ], + [ + 7.780016750145345, + 49.05831503683416 + ], + [ + 7.769265702419009, + 49.04757610533077 + ], + [ + 7.761087505950126, + 49.045515244542976 + ], + [ + 7.740745646054962, + 49.04730682560662 + ], + [ + 7.732270143641982, + 49.043960927839734 + ], + [ + 7.731427211750057, + 49.05553086349405 + ], + [ + 7.721168135036947, + 49.051271058595745 + ], + [ + 7.71771627772967, + 49.05390345460754 + ], + [ + 7.708239671875051, + 49.052479151696815 + ], + [ + 7.705630842170269, + 49.05614933514725 + ], + [ + 7.695948360745502, + 49.057797152361765 + ], + [ + 7.692450611990851, + 49.054118031380725 + ], + [ + 7.697621704145612, + 49.04970101942405 + ], + [ + 7.680948195747181, + 49.048953230744715 + ], + [ + 7.673367881959693, + 49.04508635711359 + ], + [ + 7.631201345982033, + 49.05488570567986 + ], + [ + 7.629311381579983, + 49.073550781986015 + ], + [ + 7.620139671042148, + 49.07410715132273 + ], + [ + 7.600971701662242, + 49.08323457135503 + ], + [ + 7.563619454907968, + 49.08022611220444 + ], + [ + 7.535693226389317, + 49.09359543982331 + ], + [ + 7.537795596616453, + 49.09641466722832 + ], + [ + 7.528677760556263, + 49.09709186444524 + ], + [ + 7.529456659948106, + 49.10205384625041 + ], + [ + 7.52198299000612, + 49.10785952478473 + ], + [ + 7.515510035075674, + 49.120956073324855 + ], + [ + 7.505519680028736, + 49.122372717568666 + ], + [ + 7.49757314635147, + 49.134573869785555 + ], + [ + 7.489565927369961, + 49.13647444178345 + ], + [ + 7.489861142607587, + 49.14227725991151 + ], + [ + 7.49525800727344, + 49.1413444455344 + ], + [ + 7.505979072603308, + 49.15051544397801 + ], + [ + 7.5064086758924, + 49.15470704580732 + ], + [ + 7.496054560624053, + 49.15507301898112 + ], + [ + 7.493984310387452, + 49.16936408312879 + ], + [ + 7.47221188474185, + 49.168516654520516 + ], + [ + 7.459746353876781, + 49.162822280421 + ], + [ + 7.448188157806173, + 49.168751348135686 + ], + [ + 7.434461107573666, + 49.164767752176814 + ], + [ + 7.432881775006617, + 49.16812275062589 + ], + [ + 7.44171324240533, + 49.17202573032637 + ], + [ + 7.435884022304502, + 49.17966398504036 + ], + [ + 7.445646678583659, + 49.18415102861099 + ], + [ + 7.365142559879705, + 49.171836318092794 + ], + [ + 7.368864797495803, + 49.16180016342738 + ], + [ + 7.362667862913293, + 49.15838864591025 + ], + [ + 7.361174199105841, + 49.16129978461631 + ], + [ + 7.350148373053672, + 49.1628381862081 + ], + [ + 7.34312213673194, + 49.17300969223593 + ], + [ + 7.335878083265443, + 49.17586662395059 + ], + [ + 7.338485201986057, + 49.18443212361741 + ], + [ + 7.321208562734714, + 49.18851722539237 + ], + [ + 7.303538079256505, + 49.20576894362746 + ], + [ + 7.295756776160004, + 49.20534678830758 + ], + [ + 7.301284782108647, + 49.2094780565057 + ], + [ + 7.298277379272484, + 49.21402320207364 + ], + [ + 7.30400430917686, + 49.22211313175242 + ], + [ + 7.288958157907315, + 49.23059512117974 + ], + [ + 7.294503601356786, + 49.23470803860162 + ], + [ + 7.289132351046915, + 49.23782113535616 + ], + [ + 7.30346386862242, + 49.24549798080273 + ], + [ + 7.306515068977814, + 49.256140381032694 + ], + [ + 7.31218899502186, + 49.25702759615758 + ], + [ + 7.315898347496628, + 49.25148763092178 + ], + [ + 7.324554151910612, + 49.24814168322125 + ], + [ + 7.32778535364219, + 49.25456123616786 + ], + [ + 7.324858097269497, + 49.25746299147824 + ], + [ + 7.339081373821192, + 49.26392833118485 + ], + [ + 7.344019294010748, + 49.2704416768704 + ], + [ + 7.343505859961747, + 49.27428073443731 + ], + [ + 7.334463167126713, + 49.278284891034126 + ], + [ + 7.355823222308884, + 49.2837197161389 + ], + [ + 7.365326613804555, + 49.27812410908538 + ], + [ + 7.367012342630685, + 49.28308699049416 + ], + [ + 7.371695484969128, + 49.28091264986107 + ], + [ + 7.385427185441023, + 49.29412396478912 + ], + [ + 7.379984279246811, + 49.297601308482136 + ], + [ + 7.380675010121815, + 49.306736416081144 + ], + [ + 7.384016031913444, + 49.30995239975594 + ], + [ + 7.391883630277908, + 49.30959716831873 + ], + [ + 7.394494087056305, + 49.31635206094076 + ], + [ + 7.392396318938436, + 49.32067873304191 + ], + [ + 7.38553814077394, + 49.32045292402946 + ], + [ + 7.380800480593716, + 49.316630155535215 + ], + [ + 7.377726254304475, + 49.32039364701972 + ], + [ + 7.392801075442701, + 49.32826178237803 + ], + [ + 7.400526107358908, + 49.33769788189083 + ], + [ + 7.403773227675726, + 49.34611536815623 + ], + [ + 7.398667936005706, + 49.350493834053175 + ], + [ + 7.389888861131539, + 49.34983460057966 + ], + [ + 7.39088729897441, + 49.353439300193834 + ], + [ + 7.402625116195726, + 49.35620933662573 + ], + [ + 7.393351927168817, + 49.363479166214034 + ], + [ + 7.402075304765583, + 49.367718653262386 + ], + [ + 7.39589869312965, + 49.37204605638621 + ], + [ + 7.366870347757815, + 49.36318744998668 + ], + [ + 7.36910657123725, + 49.373982567250216 + ], + [ + 7.354843745799917, + 49.37442171973794 + ], + [ + 7.355817014270639, + 49.37977014508577 + ], + [ + 7.331358268664442, + 49.37885010492474 + ], + [ + 7.317753007506242, + 49.38139681519596 + ], + [ + 7.301944976607358, + 49.3894023723917 + ], + [ + 7.289341252004654, + 49.38881434838944 + ], + [ + 7.289656049223006, + 49.393293756373666 + ], + [ + 7.298941266079032, + 49.39851936391589 + ], + [ + 7.294242900391509, + 49.4010116936649 + ], + [ + 7.297219221321524, + 49.40458100554107 + ], + [ + 7.290070228949014, + 49.41470528896861 + ], + [ + 7.272788930019588, + 49.42421313880991 + ], + [ + 7.260958404781076, + 49.423622182465664 + ], + [ + 7.250246332356223, + 49.43517793327229 + ], + [ + 7.255328278160143, + 49.44059740329297 + ], + [ + 7.246437659795413, + 49.44551838260801 + ], + [ + 7.286927387036537, + 49.45768940858334 + ], + [ + 7.286269749971936, + 49.460077801407635 + ], + [ + 7.301092942893403, + 49.46668537482914 + ], + [ + 7.304825738910357, + 49.472445942119435 + ], + [ + 7.296841236680834, + 49.483549654130364 + ], + [ + 7.278135696870785, + 49.48427479434177 + ], + [ + 7.287066779382975, + 49.49906281903446 + ], + [ + 7.282009466637337, + 49.505807170437016 + ], + [ + 7.282771731305494, + 49.5105112823312 + ], + [ + 7.289313940606124, + 49.51252672933901 + ], + [ + 7.285688643866942, + 49.516906606113864 + ], + [ + 7.29711442434912, + 49.522893214970196 + ], + [ + 7.301645340061919, + 49.52163039139466 + ], + [ + 7.301048505902334, + 49.51796833496552 + ], + [ + 7.309871873370337, + 49.523220517830126 + ], + [ + 7.299706059580689, + 49.5295580060396 + ], + [ + 7.302014890756137, + 49.534812135127446 + ], + [ + 7.276437983280056, + 49.53801983321631 + ], + [ + 7.274861975850555, + 49.56056769752468 + ], + [ + 7.267481188695947, + 49.56387761537453 + ], + [ + 7.26210092822442, + 49.57361086992834 + ], + [ + 7.268704011958365, + 49.58408342405493 + ], + [ + 7.261341656542731, + 49.58317931296571 + ], + [ + 7.25257632307865, + 49.57398589229722 + ], + [ + 7.240775067388396, + 49.57322287952385 + ], + [ + 7.240829448927149, + 49.56897409946413 + ], + [ + 7.224401128431836, + 49.56483394644926 + ], + [ + 7.213352544836279, + 49.56584581258895 + ], + [ + 7.209758738106516, + 49.56817259107611 + ], + [ + 7.21400663874978, + 49.57445572358418 + ], + [ + 7.209999246566887, + 49.577148722940734 + ], + [ + 7.188373828512232, + 49.57566152687335 + ], + [ + 7.182141109660593, + 49.58265593022628 + ], + [ + 7.173454037387954, + 49.585084161203554 + ], + [ + 7.173713123775603, + 49.59906817100776 + ], + [ + 7.165443875921116, + 49.59705048505801 + ], + [ + 7.149309143763702, + 49.60367878264904 + ], + [ + 7.138657458292731, + 49.59731983104412 + ], + [ + 7.11840359441012, + 49.59598284374442 + ], + [ + 7.104798796543287, + 49.599027722023045 + ], + [ + 7.100158923560518, + 49.60568291912356 + ], + [ + 7.100635229561268, + 49.602432886120624 + ], + [ + 7.092991730283482, + 49.6035891003749 + ], + [ + 7.087674799035671, + 49.599583830039585 + ], + [ + 7.079629761683099, + 49.61208414983105 + ], + [ + 7.05907992086318, + 49.63047962017699 + ], + [ + 7.027980123329032, + 49.6394382862208 + ], + [ + 7.012397686298198, + 49.62835844141778 + ], + [ + 7.001023630476491, + 49.63088023547834 + ], + [ + 6.985963675698825, + 49.620731332539876 + ], + [ + 6.991534823681166, + 49.63546787362574 + ], + [ + 6.988892164690392, + 49.63293609784843 + ], + [ + 6.977676573669914, + 49.63271351662401 + ], + [ + 6.978399091413298, + 49.635888332606584 + ], + [ + 6.97507871224605, + 49.63540664226943 + ], + [ + 6.966810451376769, + 49.630393171345055 + ], + [ + 6.958836207543808, + 49.630783286152486 + ], + [ + 6.951395186680251, + 49.62511900769588 + ], + [ + 6.948612308470078, + 49.63512827549991 + ], + [ + 6.940917230464752, + 49.63492246257687 + ], + [ + 6.932763025853745, + 49.63102683364483 + ], + [ + 6.937776297924613, + 49.61773760649415 + ], + [ + 6.935012569038161, + 49.61597392143468 + ], + [ + 6.927691850394199, + 49.61829409294067 + ], + [ + 6.929578000774868, + 49.61243520760287 + ], + [ + 6.92142947393043, + 49.61666304950483 + ], + [ + 6.906315168424979, + 49.614139129797344 + ], + [ + 6.891445252065861, + 49.61628661672013 + ], + [ + 6.885480988668908, + 49.61094790494833 + ], + [ + 6.889807970526877, + 49.60628296302325 + ], + [ + 6.882599488247342, + 49.60843798130881 + ], + [ + 6.879560671639474, + 49.601171027353935 + ], + [ + 6.866435190991229, + 49.608659749692364 + ], + [ + 6.857205794013715, + 49.60518165160796 + ], + [ + 6.846006329811665, + 49.58961585298224 + ], + [ + 6.839124255278359, + 49.59263577231034 + ], + [ + 6.840025349499227, + 49.58738665548862 + ], + [ + 6.835420960914697, + 49.582931923033605 + ], + [ + 6.813441977512877, + 49.59199911721882 + ], + [ + 6.798208284212829, + 49.58634882504196 + ], + [ + 6.778155802611604, + 49.57022395039614 + ], + [ + 6.767500049782122, + 49.56904365745397 + ], + [ + 6.754185942678117, + 49.56026171664291 + ], + [ + 6.74205117407917, + 49.55740504656656 + ], + [ + 6.734255747838774, + 49.560301551800954 + ], + [ + 6.708582332271993, + 49.5533080939552 + ], + [ + 6.699963458834477, + 49.541199762251054 + ], + [ + 6.690446748718792, + 49.5352039011918 + ], + [ + 6.68348035537788, + 49.54843580348675 + ], + [ + 6.664114863251428, + 49.54273708000114 + ], + [ + 6.658208590938328, + 49.54394727600996 + ], + [ + 6.652469592655919, + 49.551157821282665 + ], + [ + 6.645950747264273, + 49.53914295068733 + ], + [ + 6.641348977299989, + 49.537752926721524 + ], + [ + 6.641104266576084, + 49.540238869740264 + ], + [ + 6.632775018230518, + 49.54190342328535 + ], + [ + 6.617884691117428, + 49.535916246951096 + ], + [ + 6.620140302571658, + 49.52896245880778 + ], + [ + 6.60632395903154, + 49.52799115951089 + ], + [ + 6.610318092296231, + 49.52108416452824 + ], + [ + 6.604679365624632, + 49.51725917878175 + ], + [ + 6.588431339114862, + 49.517471818063505 + ], + [ + 6.579728725171209, + 49.52218767735905 + ], + [ + 6.57828873886074, + 49.530128459063825 + ], + [ + 6.563963086135309, + 49.540557588250046 + ], + [ + 6.554750563694194, + 49.53596355848536 + ], + [ + 6.538553917664188, + 49.539452526121984 + ], + [ + 6.525210028271866, + 49.529442708234285 + ], + [ + 6.517436953821706, + 49.527547010549895 + ], + [ + 6.514926785861261, + 49.535080219998044 + ], + [ + 6.494120576207376, + 49.5306228032428 + ], + [ + 6.467921554406391, + 49.54436640673323 + ], + [ + 6.452683238192655, + 49.5384062688611 + ], + [ + 6.449320519213901, + 49.54394374076499 + ], + [ + 6.444061519580507, + 49.54293501986909 + ], + [ + 6.430297760734658, + 49.54896277179499 + ], + [ + 6.414320321026461, + 49.543259004304396 + ], + [ + 6.41090556809256, + 49.547081731639295 + ], + [ + 6.393914488991348, + 49.5474474937609 + ], + [ + 6.380052619918113, + 49.5511047703289 + ], + [ + 6.381403654221693, + 49.55840728941923 + ], + [ + 6.359015161146739, + 49.57029928758666 + ], + [ + 6.357852033799057, + 49.57382073616139 + ], + [ + 6.367681207591827, + 49.578643614082075 + ], + [ + 6.380962499550301, + 49.57717620631457 + ], + [ + 6.374925347871422, + 49.59189399029059 + ], + [ + 6.385821929690697, + 49.59988424678515 + ], + [ + 6.399835667384529, + 49.602717901704345 + ], + [ + 6.421434456277129, + 49.62004862172756 + ], + [ + 6.440802901500791, + 49.65592025889573 + ], + [ + 6.437787737734276, + 49.65993386119763 + ], + [ + 6.42660052762909, + 49.661236214377695 + ], + [ + 6.428219855104849, + 49.66687293988426 + ], + [ + 6.447306884010139, + 49.67824995116463 + ], + [ + 6.45913862881909, + 49.69079033891264 + ], + [ + 6.480366175689616, + 49.69681427285833 + ], + [ + 6.496197969479303, + 49.70967819827134 + ], + [ + 6.507018526938685, + 49.71264027251179 + ], + [ + 6.495976813487973, + 49.725955761719504 + ], + [ + 6.502574667732278, + 49.72670583258161 + ], + [ + 6.511636613662817, + 49.72108847325335 + ], + [ + 6.517162917925342, + 49.723595185638416 + ], + [ + 6.502198342501075, + 49.73261360424692 + ], + [ + 6.500498571485758, + 49.752139084801 + ], + [ + 6.518620189708981, + 49.76244970817101 + ], + [ + 6.517546841110533, + 49.76873962040016 + ], + [ + 6.509760672612762, + 49.77415863878952 + ], + [ + 6.516818202606218, + 49.78324607107805 + ], + [ + 6.506034241327987, + 49.79013302653258 + ], + [ + 6.52099580058177, + 49.79698548515872 + ], + [ + 6.530454810451412, + 49.80499276527283 + ], + [ + 6.529314321485396, + 49.809386853463025 + ], + [ + 6.519506356014224, + 49.81289090613532 + ], + [ + 6.511375083244608, + 49.80179215748466 + ], + [ + 6.505755685312023, + 49.809232545789435 + ], + [ + 6.487732313666255, + 49.812230006414 + ], + [ + 6.470853872635761, + 49.82256209111124 + ], + [ + 6.454502266099464, + 49.81153691633416 + ], + [ + 6.443486362136199, + 49.81163011715482 + ], + [ + 6.440698658025803, + 49.814248244452834 + ], + [ + 6.429140217318306, + 49.81085904701514 + ], + [ + 6.42552445391433, + 49.81590746690996 + ], + [ + 6.397426920238166, + 49.82230528499985 + ], + [ + 6.364172103579636, + 49.850767360130185 + ], + [ + 6.34219332026878, + 49.849106717344945 + ], + [ + 6.335449215578896, + 49.83821646634519 + ], + [ + 6.328294695370059, + 49.83606556541888 + ], + [ + 6.32263656883408, + 49.83803200821225 + ], + [ + 6.31972665265164, + 49.842445484234474 + ], + [ + 6.322510067951925, + 49.85204676766115 + ], + [ + 6.314536093111682, + 49.85967858172249 + ], + [ + 6.311000734605852, + 49.86994450188474 + ], + [ + 6.296540331774472, + 49.866481879534234 + ], + [ + 6.291530080280249, + 49.87456526886963 + ], + [ + 6.281966226966818, + 49.878764833734856 + ], + [ + 6.273524428803798, + 49.877020619510844 + ], + [ + 6.262069226502065, + 49.880933638228086 + ], + [ + 6.246719825958057, + 49.895334443064094 + ], + [ + 6.233642734137827, + 49.90037640828322 + ], + [ + 6.227022248279091, + 49.91076252186059 + ], + [ + 6.234003177010504, + 49.91278907765925 + ], + [ + 6.231751704051122, + 49.91852269095598 + ], + [ + 6.217967265857787, + 49.923536638531104 + ], + [ + 6.226167490322963, + 49.929389021418494 + ], + [ + 6.223549097310382, + 49.934131019577556 + ], + [ + 6.227317621086922, + 49.93658553061084 + ], + [ + 6.216596708460917, + 49.94443285283235 + ], + [ + 6.223907289002486, + 49.949939440090674 + ], + [ + 6.211638032441085, + 49.950231249583034 + ], + [ + 6.205202203756125, + 49.95518686919927 + ], + [ + 6.197562131469608, + 49.94840531603269 + ], + [ + 6.190993858339022, + 49.96875737611615 + ], + [ + 6.181771653363663, + 49.96382962356411 + ], + [ + 6.187855251195456, + 49.95596221167946 + ], + [ + 6.177785500096754, + 49.95403490156877 + ], + [ + 6.175586251444303, + 49.96179171962212 + ], + [ + 6.169884754000206, + 49.963506542399024 + ], + [ + 6.164932604503804, + 49.97054815461021 + ], + [ + 6.172373129596441, + 49.98480145666085 + ], + [ + 6.157250815641807, + 49.98720549128005 + ], + [ + 6.150728141344064, + 49.994186639073476 + ], + [ + 6.141875347619576, + 49.99487850490874 + ], + [ + 6.138016081618508, + 49.998221975737344 + ], + [ + 6.145278937393874, + 49.99841395104751 + ], + [ + 6.149644161846481, + 50.00888242682918 + ], + [ + 6.138241537281501, + 50.01119372449 + ], + [ + 6.129768553286529, + 50.01879587139597 + ], + [ + 6.137420108204326, + 50.015769495555155 + ], + [ + 6.145883525163249, + 50.02273204775549 + ], + [ + 6.12966821887295, + 50.02998105821438 + ], + [ + 6.134330145639235, + 50.04011817327152 + ], + [ + 6.121507671671272, + 50.05287611479486 + ], + [ + 6.123938128283424, + 50.059751552404514 + ], + [ + 6.118116227113203, + 50.056380222816394 + ], + [ + 6.112562493022655, + 50.05922877244466 + ], + [ + 6.11372382803768, + 50.06539747120436 + ], + [ + 6.120575637058666, + 50.06485940449151 + ], + [ + 6.129285903756167, + 50.0735494805791 + ], + [ + 6.124929275965992, + 50.07690240062682 + ], + [ + 6.121019539184756, + 50.07254576375912 + ], + [ + 6.116140603411122, + 50.07433300561406 + ], + [ + 6.121986237915909, + 50.08131100599196 + ], + [ + 6.120486676099084, + 50.09221377293734 + ], + [ + 6.132980627086548, + 50.09323611097648 + ], + [ + 6.125528716635066, + 50.09973301366309 + ], + [ + 6.135513479801395, + 50.10337742184684 + ], + [ + 6.131000428430053, + 50.106953634523656 + ], + [ + 6.134995505368786, + 50.11331624261673 + ], + [ + 6.12883739833295, + 50.11494081816133 + ], + [ + 6.129602539784459, + 50.121580600351614 + ], + [ + 6.136800863156403, + 50.12460298488578 + ], + [ + 6.138819022073445, + 50.135034821811416 + ], + [ + 6.148418665432666, + 50.13625575075816 + ], + [ + 6.154657554124339, + 50.14189971839891 + ], + [ + 6.152871436044511, + 50.150090310648736 + ], + [ + 6.148528332892433, + 50.1518879897542 + ], + [ + 6.140554200378038, + 50.1479807953234 + ], + [ + 6.132113474614614, + 50.15355316554561 + ], + [ + 6.132532510996997, + 50.15554306816206 + ], + [ + 6.143389719968549, + 50.15585822243425 + ], + [ + 6.147522901399979, + 50.16063037354682 + ], + [ + 6.139793749856795, + 50.16926789656215 + ], + [ + 6.147584477576243, + 50.17045700317783 + ], + [ + 6.144272020290036, + 50.17350349831055 + ], + [ + 6.14689498058854, + 50.1777764507104 + ], + [ + 6.160341730368049, + 50.171816125797406 + ], + [ + 6.165317257440059, + 50.179062007717896 + ], + [ + 6.183407962360425, + 50.178150936841064 + ], + [ + 6.192752035321432, + 50.18187400838167 + ], + [ + 6.185830872952662, + 50.184037619080755 + ], + [ + 6.190276672428634, + 50.18761205942406 + ], + [ + 6.183888847855867, + 50.19206692575552 + ], + [ + 6.188914088324327, + 50.20527996583823 + ], + [ + 6.183078494724202, + 50.20766470013113 + ], + [ + 6.177971513222599, + 50.21649389220185 + ], + [ + 6.16640819559778, + 50.22004043620171 + ], + [ + 6.168184967210785, + 50.224551107032795 + ], + [ + 6.177080829322399, + 50.22681614337879 + ], + [ + 6.17568740324416, + 50.235415977169424 + ], + [ + 6.1975175248814, + 50.23810394601525 + ], + [ + 6.205344851483751, + 50.251204916742935 + ], + [ + 6.215766499062665, + 50.25701181393611 + ], + [ + 6.218437775121717, + 50.254380833506424 + ], + [ + 6.223625038174459, + 50.2586596196142 + ], + [ + 6.236086362888631, + 50.26252759943876 + ], + [ + 6.245475391198054, + 50.26194025975441 + ], + [ + 6.258727655587842, + 50.26777594861193 + ], + [ + 6.261544554268843, + 50.26506830626502 + ], + [ + 6.277942724425687, + 50.26643072665048 + ], + [ + 6.292089775766804, + 50.278829168589226 + ], + [ + 6.2851579222793, + 50.28432030056059 + ], + [ + 6.288611011086549, + 50.290516427580684 + ], + [ + 6.285859546390054, + 50.29406528449562 + ], + [ + 6.298094649613678, + 50.302147634413835 + ], + [ + 6.296116167808219, + 50.30901450804156 + ], + [ + 6.30923161415249, + 50.31170244712303 + ], + [ + 6.30646640810521, + 50.32014487607019 + ], + [ + 6.31280238236505, + 50.32186330283551 + ], + [ + 6.318005656403886, + 50.31907010466355 + ], + [ + 6.327274986198357, + 50.32453545689726 + ], + [ + 6.333323257255085, + 50.323160154427924 + ], + [ + 6.334891356054853, + 50.31642209804282 + ], + [ + 6.3429180845657, + 50.31844353848077 + ], + [ + 6.340480403394102, + 50.31576876502389 + ], + [ + 6.348377455079169, + 50.31495540129975 + ], + [ + 6.363317312659558, + 50.30542903521621 + ], + [ + 6.358962505452042, + 50.31349960993694 + ], + [ + 6.375073366638139, + 50.31379527112464 + ], + [ + 6.382575156929721, + 50.322045513849616 + ], + [ + 6.425294811296136, + 50.32301195254229 + ], + [ + 6.424061862476046, + 50.333826803469854 + ], + [ + 6.41499499100711, + 50.33266053878083 + ], + [ + 6.397181221181682, + 50.35791193138345 + ], + [ + 6.405977283141802, + 50.363822030712406 + ], + [ + 6.39545220104351, + 50.361418704867596 + ], + [ + 6.397299928038712, + 50.367684673243204 + ], + [ + 6.389003440978201, + 50.371686508790056 + ], + [ + 6.391868917960935, + 50.37984539128061 + ], + [ + 6.385005839317656, + 50.384186657720804 + ], + [ + 6.413042933613007, + 50.389485960586015 + ], + [ + 6.422030762027406, + 50.38194789658522 + ], + [ + 6.414704856668523, + 50.37459511076757 + ], + [ + 6.42084284846766, + 50.37320022556465 + ], + [ + 6.420877816135519, + 50.36890304105494 + ], + [ + 6.430023535282189, + 50.36318993885433 + ], + [ + 6.435386960738555, + 50.370318842506535 + ], + [ + 6.448561199127526, + 50.37133835961053 + ], + [ + 6.449474166439192, + 50.36378465153005 + ], + [ + 6.46116214082092, + 50.35902685947315 + ], + [ + 6.458667809503482, + 50.34397164775019 + ], + [ + 6.449590632607753, + 50.3383531415604 + ], + [ + 6.451615287002675, + 50.336424101296814 + ], + [ + 6.465982055560946, + 50.34258891733081 + ], + [ + 6.475221217344335, + 50.338452810811766 + ], + [ + 6.484743817213976, + 50.33856106917782 + ], + [ + 6.491782289077296, + 50.34699797236448 + ], + [ + 6.50478940252159, + 50.35235326192724 + ], + [ + 6.507121785940705, + 50.35987731028305 + ], + [ + 6.516404467906884, + 50.35538798993216 + ], + [ + 6.516616695071824, + 50.36218943874366 + ], + [ + 6.530450523945337, + 50.369345352971486 + ], + [ + 6.54218270536481, + 50.3710567721177 + ], + [ + 6.543177865463575, + 50.36624406776606 + ], + [ + 6.55901579218463, + 50.36940999538304 + ], + [ + 6.569188709018549, + 50.37663353032441 + ], + [ + 6.581850140681261, + 50.377543636451584 + ], + [ + 6.585170619972991, + 50.38250437681722 + ], + [ + 6.603085713300447, + 50.38822220430802 + ], + [ + 6.606759411637953, + 50.38096742689408 + ], + [ + 6.601196695041309, + 50.378382073010414 + ], + [ + 6.604088070632451, + 50.37511937540992 + ], + [ + 6.616273171387075, + 50.37701865537534 + ], + [ + 6.625353920072887, + 50.37488358081728 + ], + [ + 6.622245134971886, + 50.35365915613828 + ], + [ + 6.636206238156994, + 50.34537215040639 + ], + [ + 6.654226468018432, + 50.35107678886037 + ], + [ + 6.65601474474183, + 50.367435427737185 + ], + [ + 6.667350810959977, + 50.371967758116014 + ], + [ + 6.686767538461449, + 50.35837876839993 + ], + [ + 6.699244644144724, + 50.33609740069148 + ], + [ + 6.706034430576143, + 50.3427905656316 + ], + [ + 6.732403726931516, + 50.3524974241744 + ], + [ + 6.753523026105354, + 50.35411639418229 + ], + [ + 6.770885567117261, + 50.36121315178975 + ], + [ + 6.776766458461029, + 50.35808862553683 + ], + [ + 6.777686249487061, + 50.36443378534201 + ], + [ + 6.79520383245717, + 50.361973168841814 + ], + [ + 6.79559245517314, + 50.3595442825658 + ], + [ + 6.800711449107814, + 50.3617813358246 + ], + [ + 6.802745410477137, + 50.36930462092996 + ], + [ + 6.784687367783974, + 50.37475056233822 + ], + [ + 6.769311744201992, + 50.39274797838944 + ], + [ + 6.779307456538522, + 50.404972999899535 + ], + [ + 6.779232952984364, + 50.41360654606353 + ], + [ + 6.785122974863888, + 50.42063330188389 + ], + [ + 6.770693110626112, + 50.42504546588647 + ], + [ + 6.771200603419635, + 50.43605305983223 + ], + [ + 6.760315480360885, + 50.43139328926338 + ], + [ + 6.745523502784947, + 50.43592955690019 + ], + [ + 6.743698938627615, + 50.44092420852668 + ], + [ + 6.764625178972132, + 50.450785943491454 + ], + [ + 6.762935908687106, + 50.455695156017114 + ], + [ + 6.766624285258056, + 50.45864375545628 + ], + [ + 6.757072979815688, + 50.463030659617495 + ], + [ + 6.758145396314585, + 50.47093172823957 + ], + [ + 6.753848390073472, + 50.471421266748656 + ], + [ + 6.747733109762257, + 50.46615573593311 + ], + [ + 6.743243953086897, + 50.467748100837106 + ], + [ + 6.744603261529224, + 50.47263045892923 + ], + [ + 6.759128634928792, + 50.47458991652887 + ], + [ + 6.768281663875936, + 50.48428354106652 + ], + [ + 6.775385075629488, + 50.48249548806554 + ], + [ + 6.779861857436353, + 50.48657719181196 + ], + [ + 6.800937205085638, + 50.49131916583926 + ], + [ + 6.806193596482459, + 50.48823565230884 + ], + [ + 6.812069505741337, + 50.47224399622727 + ], + [ + 6.840540212974207, + 50.46394563269712 + ], + [ + 6.858573833167754, + 50.45326582162503 + ], + [ + 6.876703865494547, + 50.46479242501066 + ], + [ + 6.901481602736267, + 50.469091977139364 + ], + [ + 6.903208768908033, + 50.47528063605076 + ], + [ + 6.899213774567536, + 50.478038437037895 + ], + [ + 6.905593791298601, + 50.485048084969065 + ], + [ + 6.901749057877157, + 50.49190948881133 + ], + [ + 6.89786654431954, + 50.49226556791873 + ], + [ + 6.907069078238845, + 50.50264234440768 + ], + [ + 6.888554081665374, + 50.507009018701 + ], + [ + 6.897818523257415, + 50.5176947380777 + ], + [ + 6.884490582014824, + 50.51994384639418 + ], + [ + 6.882098443328173, + 50.52694944029986 + ], + [ + 6.900754710696472, + 50.53078556684465 + ], + [ + 6.89873227799657, + 50.527128051795266 + ], + [ + 6.909003669480685, + 50.525502726767385 + ], + [ + 6.92934970691736, + 50.533143229798505 + ], + [ + 6.922046183465262, + 50.55428087203026 + ], + [ + 6.930971323318114, + 50.56045225414029 + ], + [ + 6.951382132897732, + 50.56337907577823 + ], + [ + 6.956515510189849, + 50.55703307320719 + ], + [ + 6.972098290991903, + 50.555907358881306 + ], + [ + 6.977294072051088, + 50.56344629586995 + ], + [ + 6.983576971721074, + 50.56573420622005 + ], + [ + 6.998096294634187, + 50.56504990464773 + ], + [ + 7.04919447289185, + 50.60434022661949 + ], + [ + 7.056131464348486, + 50.60624075925606 + ], + [ + 7.059252758802113, + 50.60037088156727 + ], + [ + 7.066347430470023, + 50.600699207917046 + ], + [ + 7.069025677549422, + 50.59274423432447 + ], + [ + 7.087431034253972, + 50.586011948981984 + ], + [ + 7.09527131571715, + 50.58636960868053 + ], + [ + 7.103796715873784, + 50.591322552494255 + ], + [ + 7.115121105360966, + 50.61178614459459 + ], + [ + 7.119386718944817, + 50.6123074126252 + ], + [ + 7.135429964682132, + 50.602169056696994 + ], + [ + 7.147851587133212, + 50.600293280365086 + ], + [ + 7.149216780537222, + 50.609483967570895 + ], + [ + 7.154717366986707, + 50.61470533746364 + ], + [ + 7.173019848639377, + 50.61255228387663 + ], + [ + 7.173981968717001, + 50.618909518667 + ], + [ + 7.189838907797947, + 50.62389544364724 + ], + [ + 7.190635542661379, + 50.63604130870753 + ], + [ + 7.198485710421648, + 50.64820873532703 + ], + [ + 7.203786634903006, + 50.649660409136104 + ], + [ + 7.211464004606567, + 50.648160172742024 + ], + [ + 7.212399645217203, + 50.623404919825276 + ], + [ + 7.217027615985182, + 50.628066850697486 + ], + [ + 7.251955077264071, + 50.627838769399155 + ], + [ + 7.256579924083707, + 50.62468025665609 + ], + [ + 7.270054732652263, + 50.62642740760304 + ], + [ + 7.297323120168676, + 50.63181575459909 + ], + [ + 7.305099529211726, + 50.637578811246286 + ], + [ + 7.313097427009887, + 50.63700713937899 + ], + [ + 7.322175247748111, + 50.64171541341142 + ], + [ + 7.333480804094751, + 50.63839606845412 + ], + [ + 7.358976516209164, + 50.64949362023121 + ], + [ + 7.355820998357365, + 50.66523105776928 + ], + [ + 7.364317150400372, + 50.6727024351032 + ], + [ + 7.369315910682903, + 50.67254968931046 + ], + [ + 7.366175165584966, + 50.68070489552597 + ], + [ + 7.372062798617264, + 50.68210706420175 + ], + [ + 7.365116163103972, + 50.68761064149289 + ], + [ + 7.36830787202213, + 50.69709009589077 + ], + [ + 7.357136449297792, + 50.697903894716 + ], + [ + 7.374010755091872, + 50.718218641349644 + ], + [ + 7.397282413114079, + 50.714269920096434 + ], + [ + 7.407050971009926, + 50.718187622324784 + ], + [ + 7.423396633125697, + 50.70995095897779 + ], + [ + 7.432818252008535, + 50.70988584274338 + ], + [ + 7.443087183334344, + 50.711823524077346 + ], + [ + 7.448619767425206, + 50.717444761592226 + ], + [ + 7.479816338232133, + 50.718253910224504 + ], + [ + 7.501940671590177, + 50.730013317243 + ], + [ + 7.520123910656926, + 50.72899687944899 + ], + [ + 7.51938788300207, + 50.73740659061157 + ], + [ + 7.521534042666314, + 50.733655422016575 + ], + [ + 7.551900377325675, + 50.74634314496176 + ], + [ + 7.580246126517786, + 50.738137490239176 + ], + [ + 7.591521558557222, + 50.740276160238366 + ], + [ + 7.595297177492973, + 50.750969326551875 + ], + [ + 7.591505261381609, + 50.755781698964036 + ], + [ + 7.601042633693851, + 50.76631295385786 + ], + [ + 7.618168809410952, + 50.77017082780352 + ], + [ + 7.645393592113547, + 50.77088137756525 + ], + [ + 7.655450742486003, + 50.76786954395592 + ], + [ + 7.662161360059336, + 50.77315629604618 + ], + [ + 7.658936373790994, + 50.7848278735532 + ], + [ + 7.668455510173667, + 50.78618629252221 + ], + [ + 7.675944870216716, + 50.77932768469345 + ], + [ + 7.682222418599937, + 50.795368529370954 + ], + [ + 7.675047644466114, + 50.80266927124949 + ], + [ + 7.679510539182871, + 50.81004670587801 + ], + [ + 7.664109173067756, + 50.81535286028657 + ], + [ + 7.661003633112155, + 50.8203643031954 + ], + [ + 7.67462827739734, + 50.81919510291081 + ], + [ + 7.700016708247848, + 50.82541823289692 + ], + [ + 7.706390791797354, + 50.8338555788233 + ], + [ + 7.713613872861948, + 50.83361503976557 + ], + [ + 7.714285524724176, + 50.8404471850332 + ], + [ + 7.729342105278951, + 50.85052278912818 + ], + [ + 7.75804337937234, + 50.84348242444966 + ], + [ + 7.762187497503389, + 50.845134406837296 + ], + [ + 7.753187095359069, + 50.851368511654286 + ], + [ + 7.765973968659978, + 50.85681947827799 + ], + [ + 7.748309881166158, + 50.867216792961244 + ], + [ + 7.758767439044576, + 50.87977223459712 + ], + [ + 7.753021566030458, + 50.88837918273855 + ], + [ + 7.760427259896, + 50.900393946292986 + ], + [ + 7.750604338818219, + 50.90566329755655 + ], + [ + 7.745064030130164, + 50.905198977016894 + ], + [ + 7.746872127509461, + 50.91239199917908 + ], + [ + 7.735459231714069, + 50.91776539126454 + ], + [ + 7.757281421632989, + 50.920164000038504 + ], + [ + 7.776218913422718, + 50.92903657418395 + ], + [ + 7.785898055946699, + 50.939914116315606 + ], + [ + 7.792810758565112, + 50.94233509200108 + ], + [ + 7.808788401220583, + 50.9388044526899 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "11", + "AGS": "11", + "SDV_RS": "110000000000", + "GEN": "Berlin", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "11", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE3", + "RS_0": "110000000000", + "AGS_0": "11000000", + "WSK": "1990/10/03", + "DEBKG_ID": "DEBKGDL20000E0P5", + "destatis": { + "population": 3469849, + "population_m": 1696218, + "population_w": 1773631 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 13.475512549856449, + 52.668781864128505 + ], + [ + 13.47564769432055, + 52.66628065569466 + ], + [ + 13.488219322030474, + 52.67055116500835 + ], + [ + 13.48529483836277, + 52.65913131845414 + ], + [ + 13.490831409724338, + 52.65472873299752 + ], + [ + 13.512781529193914, + 52.64556194906857 + ], + [ + 13.518873169550258, + 52.647470792904556 + ], + [ + 13.523100123203587, + 52.6454301940707 + ], + [ + 13.517698657354217, + 52.62963591839791 + ], + [ + 13.505817351153057, + 52.62582838120896 + ], + [ + 13.496752284616644, + 52.60509353816211 + ], + [ + 13.508153615271706, + 52.59218325574802 + ], + [ + 13.522430212047652, + 52.59285250167773 + ], + [ + 13.547112099867071, + 52.587884765384835 + ], + [ + 13.567569498315883, + 52.57374012678187 + ], + [ + 13.581539701887284, + 52.570881941777444 + ], + [ + 13.587494308559517, + 52.555267017768706 + ], + [ + 13.585387117744295, + 52.548471641831796 + ], + [ + 13.635358748904617, + 52.541628792401696 + ], + [ + 13.626732384469944, + 52.53774857081055 + ], + [ + 13.625906814056563, + 52.53014637391589 + ], + [ + 13.656895567280975, + 52.52986951137859 + ], + [ + 13.65857246404998, + 52.52581115154783 + ], + [ + 13.633318829815169, + 52.511826186839485 + ], + [ + 13.624670747694312, + 52.49518426233799 + ], + [ + 13.63080043499889, + 52.49412005047891 + ], + [ + 13.615010814624249, + 52.48082505545475 + ], + [ + 13.616397384315563, + 52.474893529409485 + ], + [ + 13.611517293139247, + 52.47062733354762 + ], + [ + 13.625508626424681, + 52.46835650756556 + ], + [ + 13.625808037719068, + 52.47371335501994 + ], + [ + 13.640613123533997, + 52.47948463179535 + ], + [ + 13.648215009841588, + 52.4787819591035 + ], + [ + 13.670661019458446, + 52.473061990223954 + ], + [ + 13.682599379301925, + 52.466184849917205 + ], + [ + 13.696824929872955, + 52.464160445828995 + ], + [ + 13.69843270100847, + 52.455080218438816 + ], + [ + 13.705365294119579, + 52.45576642717114 + ], + [ + 13.701324132551866, + 52.46814548160447 + ], + [ + 13.716447654347183, + 52.46219428867641 + ], + [ + 13.729112160282556, + 52.45059682291475 + ], + [ + 13.753219910938741, + 52.447597658575916 + ], + [ + 13.754107209846588, + 52.44317174302952 + ], + [ + 13.759028643932263, + 52.4425793645835 + ], + [ + 13.75958721830799, + 52.43627188234686 + ], + [ + 13.752296088098218, + 52.43708146072386 + ], + [ + 13.754215102892989, + 52.44161149870714 + ], + [ + 13.750536117610348, + 52.44145895520405 + ], + [ + 13.743118129980322, + 52.433998688672716 + ], + [ + 13.737958595131047, + 52.43413775841456 + ], + [ + 13.74138452582788, + 52.42691596304363 + ], + [ + 13.72951353597843, + 52.41739346647727 + ], + [ + 13.738749107474785, + 52.40732177598609 + ], + [ + 13.734537746247797, + 52.40197606842484 + ], + [ + 13.723344804040657, + 52.39858611408224 + ], + [ + 13.716436628926136, + 52.39952743633208 + ], + [ + 13.68756177318581, + 52.38582351599059 + ], + [ + 13.688061986130233, + 52.382910365706095 + ], + [ + 13.698633152878639, + 52.3815850401381 + ], + [ + 13.699997283208361, + 52.37512134015785 + ], + [ + 13.69056410346979, + 52.36737871018306 + ], + [ + 13.680318766045026, + 52.36931591374573 + ], + [ + 13.671080360664195, + 52.36635565659906 + ], + [ + 13.648400720507018, + 52.338241834876456 + ], + [ + 13.636291071051152, + 52.347037924633575 + ], + [ + 13.638637532318622, + 52.360161678222426 + ], + [ + 13.647105427892695, + 52.366875467220886 + ], + [ + 13.64680609080879, + 52.37016052627582 + ], + [ + 13.641696955149175, + 52.370953942028656 + ], + [ + 13.643364632897185, + 52.37739092555897 + ], + [ + 13.633391386446739, + 52.37628388896052 + ], + [ + 13.627949923600125, + 52.3817906688727 + ], + [ + 13.606959087352894, + 52.374981432205935 + ], + [ + 13.592762116551553, + 52.39416968687635 + ], + [ + 13.564905285780613, + 52.38828583968813 + ], + [ + 13.53566361327925, + 52.38901045454495 + ], + [ + 13.538379367186774, + 52.40067906394248 + ], + [ + 13.528263237841868, + 52.39839621535205 + ], + [ + 13.51516508605631, + 52.40143491237012 + ], + [ + 13.4798849976895, + 52.39599663334532 + ], + [ + 13.468337475865631, + 52.419431966448634 + ], + [ + 13.462321602382982, + 52.42062443564776 + ], + [ + 13.418772685611415, + 52.40991740587664 + ], + [ + 13.427585365174316, + 52.386823991724775 + ], + [ + 13.420984875859583, + 52.376247141406104 + ], + [ + 13.388520781676414, + 52.37796846551052 + ], + [ + 13.387216841189247, + 52.38858416332825 + ], + [ + 13.370454230855316, + 52.38846389934645 + ], + [ + 13.372135215904915, + 52.393823824387674 + ], + [ + 13.34302847784194, + 52.40767416889929 + ], + [ + 13.343248652845482, + 52.41161993837087 + ], + [ + 13.311926097251293, + 52.39918547139946 + ], + [ + 13.296130131601327, + 52.416451284828604 + ], + [ + 13.275099947938966, + 52.40529314969727 + ], + [ + 13.249844003482911, + 52.40496478905181 + ], + [ + 13.245797291395393, + 52.42080114546168 + ], + [ + 13.22228798213338, + 52.42035668080278 + ], + [ + 13.195566839492823, + 52.41509482707546 + ], + [ + 13.159345750711148, + 52.40287994750761 + ], + [ + 13.157827475983888, + 52.39636215655254 + ], + [ + 13.171356688541376, + 52.39776296127593 + ], + [ + 13.171521555600211, + 52.3958334613179 + ], + [ + 13.158888703501859, + 52.39390889801813 + ], + [ + 13.142612287742288, + 52.39654478776495 + ], + [ + 13.1309895223738, + 52.38722485163279 + ], + [ + 13.12746490158974, + 52.391594552438576 + ], + [ + 13.138116669253519, + 52.39539271030993 + ], + [ + 13.136201770121717, + 52.39861141295782 + ], + [ + 13.124875684180239, + 52.39687959063462 + ], + [ + 13.111635765489082, + 52.40422327898881 + ], + [ + 13.10793181362841, + 52.4094775228816 + ], + [ + 13.112596392883901, + 52.4100190750766 + ], + [ + 13.11157057498546, + 52.41313661880734 + ], + [ + 13.103225064691978, + 52.410222421588415 + ], + [ + 13.09722150658276, + 52.412454655270274 + ], + [ + 13.097294256065382, + 52.40938448190442 + ], + [ + 13.090635996837586, + 52.41181388309701 + ], + [ + 13.088333217867776, + 52.41961143497985 + ], + [ + 13.09959688446257, + 52.42530475191539 + ], + [ + 13.104618625762251, + 52.42405321668389 + ], + [ + 13.123176542637212, + 52.43936454618781 + ], + [ + 13.109223276102474, + 52.45061950821195 + ], + [ + 13.110798676712134, + 52.466063011395164 + ], + [ + 13.11779829996098, + 52.478967935726786 + ], + [ + 13.125284573237428, + 52.480217680418214 + ], + [ + 13.166457606026018, + 52.51012428880995 + ], + [ + 13.143010192757826, + 52.51967552467996 + ], + [ + 13.117392920151492, + 52.51699532573026 + ], + [ + 13.130617438314946, + 52.556353968498584 + ], + [ + 13.136295813658677, + 52.55274763245411 + ], + [ + 13.145664778982118, + 52.55291135730326 + ], + [ + 13.152953085280066, + 52.57278142537554 + ], + [ + 13.14960326570009, + 52.583310954424164 + ], + [ + 13.132092465133233, + 52.57969904159347 + ], + [ + 13.128987291145354, + 52.58744210283722 + ], + [ + 13.146851697378532, + 52.59074081922088 + ], + [ + 13.164263157199523, + 52.59890032948228 + ], + [ + 13.20662630796477, + 52.586742461660606 + ], + [ + 13.217336441508346, + 52.58745559153984 + ], + [ + 13.217819501372333, + 52.59322170929286 + ], + [ + 13.201606488949269, + 52.606381327665474 + ], + [ + 13.216984649258725, + 52.620118561030345 + ], + [ + 13.220683272035087, + 52.628178719738266 + ], + [ + 13.264274727039233, + 52.62692796916948 + ], + [ + 13.262156275317246, + 52.640752987437736 + ], + [ + 13.282440708991022, + 52.641295356974396 + ], + [ + 13.282884651787459, + 52.66078466659798 + ], + [ + 13.310033892187887, + 52.657376007515005 + ], + [ + 13.300377555118198, + 52.653469840548084 + ], + [ + 13.30925742111627, + 52.64314038992002 + ], + [ + 13.307860409256318, + 52.63762074259227 + ], + [ + 13.303111836210514, + 52.636669187291496 + ], + [ + 13.3083090294553, + 52.62969153257978 + ], + [ + 13.302422602937773, + 52.62756060095074 + ], + [ + 13.313121838258526, + 52.62838271306978 + ], + [ + 13.336480521255035, + 52.62267108738835 + ], + [ + 13.34461342106865, + 52.62476549382138 + ], + [ + 13.357296056793285, + 52.62317467253583 + ], + [ + 13.37599292988617, + 52.62929259364679 + ], + [ + 13.374375347405548, + 52.631521598712126 + ], + [ + 13.388682711663687, + 52.63761389252857 + ], + [ + 13.39671209288589, + 52.64830139548784 + ], + [ + 13.406997439698497, + 52.64242099792655 + ], + [ + 13.412828152830997, + 52.64358542496614 + ], + [ + 13.424365184794564, + 52.63563045961624 + ], + [ + 13.432682991329205, + 52.63750761888127 + ], + [ + 13.434104109196312, + 52.64428548707699 + ], + [ + 13.439898545616895, + 52.64533252160048 + ], + [ + 13.440932072346827, + 52.649123019220966 + ], + [ + 13.459848419332124, + 52.64810317592455 + ], + [ + 13.473545184261347, + 52.654039400796485 + ], + [ + 13.473894060638683, + 52.65661361262786 + ], + [ + 13.462333170346469, + 52.65746449756994 + ], + [ + 13.450840916554691, + 52.6627221734393 + ], + [ + 13.459511426270637, + 52.668935587074664 + ], + [ + 13.465965381099604, + 52.66714855830231 + ], + [ + 13.475393917006656, + 52.67491714875839 + ], + [ + 13.478789977213793, + 52.673452519811775 + ], + [ + 13.475512549856449, + 52.668781864128505 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 1, + "BSG": 9, + "RS": "08", + "AGS": "08", + "SDV_RS": "081110000000", + "GEN": "Baden-Württemberg (Bodensee)", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "08", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE1", + "RS_0": "080000000000", + "AGS_0": "08000000", + "WSK": "1997/01/01", + "DEBKG_ID": "DEBKGDL20000QBLE", + "destatis": { + "population": 10716644, + "population_m": 5284223, + "population_w": 5432421 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.044918395405183, + 47.816457191155706 + ], + [ + 9.062144578901968, + 47.814725877074345 + ], + [ + 9.088413930832335, + 47.797190013229354 + ], + [ + 9.105757372100461, + 47.79241529190684 + ], + [ + 9.125366126868705, + 47.781823871284644 + ], + [ + 9.13930721645688, + 47.76901931147609 + ], + [ + 9.158564257086656, + 47.76588724555172 + ], + [ + 9.192410149535338, + 47.75084757597448 + ], + [ + 9.223718850560273, + 47.74091828132413 + ], + [ + 9.228652060122323, + 47.72676596257153 + ], + [ + 9.226307792685036, + 47.72312544955567 + ], + [ + 9.239266618426866, + 47.710082054128925 + ], + [ + 9.263417251473694, + 47.69480125449025 + ], + [ + 9.31148398868019, + 47.67382955141673 + ], + [ + 9.324031879030082, + 47.672150391386744 + ], + [ + 9.349721644514068, + 47.660840379078024 + ], + [ + 9.40628183237413, + 47.6682536738464 + ], + [ + 9.421020779712586, + 47.66592932893539 + ], + [ + 9.434193140777083, + 47.65718892984029 + ], + [ + 9.452000178747504, + 47.654854515793545 + ], + [ + 9.462988213962088, + 47.64841732917231 + ], + [ + 9.470672344749827, + 47.65112344351333 + ], + [ + 9.482117036737197, + 47.64884959194515 + ], + [ + 9.488090000304219, + 47.65138567015574 + ], + [ + 9.49528408853278, + 47.65013127090595 + ], + [ + 9.515219134839112, + 47.63475749199255 + ], + [ + 9.518154846310367, + 47.62142992636992 + ], + [ + 9.527458732274027, + 47.6153397887412 + ], + [ + 9.529564547192672, + 47.60346054856791 + ], + [ + 9.550341433050912, + 47.5876753668625 + ], + [ + 9.55441193756507, + 47.59085604573678 + ], + [ + 9.553935754183515, + 47.58725740327832 + ], + [ + 9.55712783760856, + 47.58555159761619 + ], + [ + 9.558093448670698, + 47.58935136448996 + ], + [ + 9.56124531325965, + 47.589153978469994 + ], + [ + 9.559308492958737, + 47.58480587311427 + ], + [ + 9.57292573063913, + 47.583925425478846 + ], + [ + 9.595349241583868, + 47.588095272693366 + ], + [ + 9.60207715349901, + 47.58433799590818 + ], + [ + 9.558720430034388, + 47.541893154337295 + ], + [ + 9.495603773710503, + 47.55145506783344 + ], + [ + 9.394713922943223, + 47.62032606688583 + ], + [ + 9.256560924371913, + 47.65870762970877 + ], + [ + 9.214832096771318, + 47.65509567931659 + ], + [ + 9.178858538515627, + 47.657219599505716 + ], + [ + 9.17842558636803, + 47.666992769571316 + ], + [ + 9.207264300887886, + 47.663159934159786 + ], + [ + 9.21783774670652, + 47.666376699908625 + ], + [ + 9.207599305160374, + 47.687097790415145 + ], + [ + 9.179606442785452, + 47.705150928758066 + ], + [ + 9.180996547818486, + 47.71246592788459 + ], + [ + 9.173324995050361, + 47.73441135769261 + ], + [ + 9.158861678028192, + 47.740112574887696 + ], + [ + 9.149073588009802, + 47.74871026578273 + ], + [ + 9.136283467131797, + 47.74711289024271 + ], + [ + 9.116753498663474, + 47.75927973475106 + ], + [ + 9.091576475727686, + 47.76666055278245 + ], + [ + 9.069701538020986, + 47.77763855505712 + ], + [ + 9.047745765485987, + 47.79604506759322 + ], + [ + 9.030987172858394, + 47.804701765207604 + ], + [ + 9.034426236505391, + 47.81202906419608 + ], + [ + 9.039283061359964, + 47.81340656470119 + ], + [ + 9.038623443571318, + 47.81721806072888 + ], + [ + 9.044918395405183, + 47.816457191155706 + ] + ], + [ + [ + 9.190126763391588, + 47.70611382182946 + ], + [ + 9.189020401849723, + 47.70363784607924 + ], + [ + 9.201817402062165, + 47.70358440488062 + ], + [ + 9.197306717980174, + 47.70803344610664 + ], + [ + 9.190126763391588, + 47.70611382182946 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 2, + "BSG": 1, + "RS": "04", + "AGS": "04", + "SDV_RS": "040110000000", + "GEN": "Bremen", + "BEZ": "Freie Hansestadt", + "IBZ": 23, + "BEM": "--", + "NBD": "ja", + "SN_L": "04", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE5", + "RS_0": "040000000000", + "AGS_0": "04000000", + "WSK": "2010/01/01", + "DEBKG_ID": "DEBKGDL20000004N", + "destatis": { + "population": 661888, + "population_m": 324423, + "population_w": 337465 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.52041036342612, + 53.606204878131486 + ], + [ + 8.509366805978493, + 53.60312732948411 + ], + [ + 8.547814908617243, + 53.56532195485629 + ], + [ + 8.549983177299628, + 53.569876057008706 + ], + [ + 8.551662658808537, + 53.56056856681386 + ], + [ + 8.557321298910958, + 53.55519249922482 + ], + [ + 8.559253899218497, + 53.55722741424258 + ], + [ + 8.559387102318405, + 53.552860911200995 + ], + [ + 8.575568787974353, + 53.53884866966429 + ], + [ + 8.560907612474352, + 53.50933275235713 + ], + [ + 8.546469420637127, + 53.521261275262376 + ], + [ + 8.556702966623844, + 53.52661570632985 + ], + [ + 8.556376714417741, + 53.53492210981658 + ], + [ + 8.503567174835439, + 53.57237960747693 + ], + [ + 8.483202468858675, + 53.600498985179506 + ], + [ + 8.52041036342612, + 53.606204878131486 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 1, + "BSG": 9, + "RS": "09", + "AGS": "09", + "SDV_RS": "091620000000", + "GEN": "Bayern (Bodensee)", + "BEZ": "Freistaat", + "IBZ": 21, + "BEM": "--", + "NBD": "ja", + "SN_L": "09", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE2", + "RS_0": "090000000000", + "AGS_0": "09000000", + "WSK": "2011/07/01", + "DEBKG_ID": "DEBKGDL20000QBLF", + "destatis": { + "population": 12691568, + "population_m": 6249965, + "population_w": 6441603 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.617342617593877, + 47.56880331017009 + ], + [ + 9.628007474077844, + 47.57091127922363 + ], + [ + 9.628870213746197, + 47.56638028460169 + ], + [ + 9.638605938479868, + 47.56693417151621 + ], + [ + 9.653552559008672, + 47.55698746614967 + ], + [ + 9.679038885003779, + 47.557021344132345 + ], + [ + 9.682804387548156, + 47.55244003192541 + ], + [ + 9.675623645853111, + 47.54522412434836 + ], + [ + 9.680775633402654, + 47.54226491488189 + ], + [ + 9.68670321116221, + 47.54362026446618 + ], + [ + 9.691923698571035, + 47.549947327906295 + ], + [ + 9.712683322067422, + 47.550692865200986 + ], + [ + 9.73143365756744, + 47.534471014571935 + ], + [ + 9.680359584704945, + 47.523357570411854 + ], + [ + 9.558720430034388, + 47.541893154337295 + ], + [ + 9.60207715349901, + 47.58433799590818 + ], + [ + 9.606691095562606, + 47.57339796767801 + ], + [ + 9.617342617593877, + 47.56880331017009 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 1, + "BSG": 1, + "RS": "08", + "AGS": "08", + "SDV_RS": "081110000000", + "GEN": "Baden-Württemberg", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "08", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE1", + "RS_0": "080000000000", + "AGS_0": "08000000", + "WSK": "1997/01/01", + "DEBKG_ID": "DEBKGDL20000HKPK", + "destatis": { + "population": 10716644, + "population_m": 5284223, + "population_w": 5432421 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.992169478916624, + 47.74303044374911 + ], + [ + 9.02305625349419, + 47.72837072499896 + ], + [ + 9.09312575031762, + 47.70644105818681 + ], + [ + 9.107887616570997, + 47.69097369055421 + ], + [ + 9.101430950444957, + 47.68768226974747 + ], + [ + 9.087173274241302, + 47.68820824588843 + ], + [ + 9.060403062753052, + 47.70340692588878 + ], + [ + 9.053199749973878, + 47.702484569096704 + ], + [ + 9.048203130977862, + 47.70715483554755 + ], + [ + 9.040976563951244, + 47.70837055083522 + ], + [ + 9.044606069260013, + 47.704032878680074 + ], + [ + 9.04085513168483, + 47.701178388006994 + ], + [ + 9.043334390491747, + 47.693373946766414 + ], + [ + 9.081137109396709, + 47.68330323811969 + ], + [ + 9.094002195287546, + 47.68678667172074 + ], + [ + 9.113125776243406, + 47.68501865855906 + ], + [ + 9.125641404562586, + 47.6742931620718 + ], + [ + 9.127830524028273, + 47.66659864904605 + ], + [ + 9.113863880835739, + 47.66970813712844 + ], + [ + 9.095866892199512, + 47.678666158254174 + ], + [ + 9.073128099321318, + 47.67896949725474 + ], + [ + 9.05951170401065, + 47.68374921711473 + ], + [ + 9.021302804402834, + 47.68663951960907 + ], + [ + 8.933542805403496, + 47.65535561496913 + ], + [ + 8.897469746237354, + 47.648894547418074 + ], + [ + 8.875316070072797, + 47.65472075335112 + ], + [ + 8.878807058979195, + 47.656461523191865 + ], + [ + 8.894180799584706, + 47.65208755259057 + ], + [ + 8.924811881284526, + 47.65975275380763 + ], + [ + 8.937897101857244, + 47.659096496968445 + ], + [ + 8.950321211754668, + 47.6676779904286 + ], + [ + 8.970918277927066, + 47.67202293357549 + ], + [ + 8.976143320421713, + 47.677812642594766 + ], + [ + 8.996146036838718, + 47.68529028089652 + ], + [ + 9.006162673772387, + 47.696115084328454 + ], + [ + 8.999153637421353, + 47.70336209791899 + ], + [ + 8.943741496215004, + 47.723509576610006 + ], + [ + 8.93982835982138, + 47.7280647559866 + ], + [ + 8.942496662788207, + 47.73388260848973 + ], + [ + 8.960688284886967, + 47.737170245063396 + ], + [ + 8.968822493787581, + 47.73395006638084 + ], + [ + 8.975345149735082, + 47.735012281500246 + ], + [ + 8.998634117011044, + 47.725376387854055 + ], + [ + 9.004181217943724, + 47.725982172132646 + ], + [ + 9.006146986735699, + 47.721742011502236 + ], + [ + 9.014928056957078, + 47.71997296440544 + ], + [ + 9.000013596284093, + 47.73350297605043 + ], + [ + 8.986342766151553, + 47.73658577535373 + ], + [ + 8.98397927900196, + 47.74198202096784 + ], + [ + 8.992169478916624, + 47.74303044374911 + ] + ], + [ + [ + 9.1253044427182, + 47.668433515723116 + ], + [ + 9.123335109807655, + 47.673944621003244 + ], + [ + 9.12153587846455, + 47.67483500838321 + ], + [ + 9.12067641253264, + 47.672312941494184 + ], + [ + 9.1253044427182, + 47.668433515723116 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 2, + "BSG": 1, + "RS": "08", + "AGS": "08", + "SDV_RS": "081110000000", + "GEN": "Baden-Württemberg", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "08", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE1", + "RS_0": "080000000000", + "AGS_0": "08000000", + "WSK": "1997/01/01", + "DEBKG_ID": "DEBKGDL20000JP1Z", + "destatis": { + "population": 10716644, + "population_m": 5284223, + "population_w": 5432421 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 9.005668522438857, + 47.72623710371274 + ], + [ + 9.010846545975657, + 47.72371034661748 + ], + [ + 9.009595982585482, + 47.72099673337759 + ], + [ + 9.004181217943724, + 47.725982172132646 + ], + [ + 8.999917329022745, + 47.72523227009696 + ], + [ + 9.001758225314523, + 47.72647103635136 + ], + [ + 9.005668522438857, + 47.72623710371274 + ] + ] + ], + [ + [ + [ + 9.105070363964785, + 47.6969595532288 + ], + [ + 9.105598050803353, + 47.69618435909197 + ], + [ + 9.09808747258445, + 47.70332326809654 + ], + [ + 9.101582435431704, + 47.70167845202527 + ], + [ + 9.105070363964785, + 47.6969595532288 + ] + ] + ], + [ + [ + [ + 9.107887616570997, + 47.69097369055421 + ], + [ + 9.106304396051677, + 47.688571644533695 + ], + [ + 9.10334151987541, + 47.69026834566405 + ], + [ + 9.104228903929583, + 47.69133495098711 + ], + [ + 9.107887616570997, + 47.69097369055421 + ] + ] + ], + [ + [ + [ + 9.108044071307242, + 47.68539421447855 + ], + [ + 9.111441741011733, + 47.68574318629095 + ], + [ + 9.113125776243406, + 47.68501865855906 + ], + [ + 9.10562622354816, + 47.68513015636686 + ], + [ + 9.105447747359413, + 47.686249013068505 + ], + [ + 9.108044071307242, + 47.68539421447855 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 2, + "BSG": 1, + "RS": "02", + "AGS": "02", + "SDV_RS": "020000000000", + "GEN": "Hamburg", + "BEZ": "Freie und Hansestadt", + "IBZ": 22, + "BEM": "--", + "NBD": "ja", + "SN_L": "02", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE6", + "RS_0": "020000000000", + "AGS_0": "02000000", + "WSK": "1974/01/01", + "DEBKG_ID": "DEBKGDL20000QMRX", + "destatis": { + "population": 1762791, + "population_m": 857446, + "population_w": 905345 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 9.74902152813475, + 53.56385188166394 + ], + [ + 9.776937804284158, + 53.56211133028691 + ], + [ + 9.862757498504338, + 53.546669593376016 + ], + [ + 9.935736257889934, + 53.54329548788885 + ], + [ + 9.934437130059498, + 53.53991974515075 + ], + [ + 9.878179984565643, + 53.54011644499803 + ], + [ + 9.82342204768252, + 53.547700381770554 + ], + [ + 9.810036056670743, + 53.54115620876785 + ], + [ + 9.82504439477364, + 53.53348403135279 + ], + [ + 9.816526367092106, + 53.52934837155728 + ], + [ + 9.772836285908225, + 53.54279385021596 + ], + [ + 9.773577413549281, + 53.550060770308384 + ], + [ + 9.783306057763161, + 53.551122425296604 + ], + [ + 9.779012104494946, + 53.55461016671483 + ], + [ + 9.730315195881431, + 53.55801930898749 + ], + [ + 9.734364927261794, + 53.56521556356656 + ], + [ + 9.74902152813475, + 53.56385188166394 + ] + ] + ], + [ + [ + [ + 9.774232561884448, + 53.55358255517106 + ], + [ + 9.779179857936535, + 53.553362928946186 + ], + [ + 9.78075395718632, + 53.55215897119072 + ], + [ + 9.773735266415043, + 53.550903311288074 + ], + [ + 9.774232561884448, + 53.55358255517106 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 2, + "BSG": 1, + "RS": "01", + "AGS": "01", + "SDV_RS": "010020000000", + "GEN": "Schleswig-Holstein", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "01", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEF", + "RS_0": "010000000000", + "AGS_0": "01000000", + "WSK": "2012/02/01", + "DEBKG_ID": "DEBKGDL20000QMSD", + "destatis": { + "population": 2830864, + "population_m": 1381451, + "population_w": 1449413 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.03571356902644, + 53.89981174393829 + ], + [ + 9.04422310890108, + 53.9005584324379 + ], + [ + 9.093606510893167, + 53.888314274887534 + ], + [ + 9.224997954261985, + 53.8876632903925 + ], + [ + 9.30120071197838, + 53.869652722141005 + ], + [ + 9.328330352218778, + 53.85969612558294 + ], + [ + 9.35437470686587, + 53.83873089339642 + ], + [ + 9.376711599519036, + 53.83240794064161 + ], + [ + 9.388303622532643, + 53.82395896999379 + ], + [ + 9.399293701723154, + 53.82607875717617 + ], + [ + 9.401882393143733, + 53.82383712250022 + ], + [ + 9.394457420720782, + 53.8172395548088 + ], + [ + 9.404883060106418, + 53.79934472989479 + ], + [ + 9.40114637565388, + 53.79486753603607 + ], + [ + 9.407073346186186, + 53.79699304550704 + ], + [ + 9.411248947909048, + 53.78801533487823 + ], + [ + 9.408516857783326, + 53.785162879263666 + ], + [ + 9.415444587296609, + 53.785394301383036 + ], + [ + 9.409993940556143, + 53.7843402705647 + ], + [ + 9.422343413467562, + 53.769874543244235 + ], + [ + 9.42977244637438, + 53.75121428941406 + ], + [ + 9.45638189906724, + 53.73206017104489 + ], + [ + 9.487820537566073, + 53.72570772415641 + ], + [ + 9.522019766245334, + 53.713376027105525 + ], + [ + 9.547966462312763, + 53.67655846346699 + ], + [ + 9.558780017422887, + 53.671968668270544 + ], + [ + 9.548488645516793, + 53.67481928988323 + ], + [ + 9.55370841870012, + 53.66858739232581 + ], + [ + 9.551171779325454, + 53.653022852150514 + ], + [ + 9.562016310648202, + 53.64036375952621 + ], + [ + 9.569599672436517, + 53.63447983483229 + ], + [ + 9.573296529126802, + 53.63538963062587 + ], + [ + 9.573490067389658, + 53.62758573056087 + ], + [ + 9.579880714144181, + 53.623541659476345 + ], + [ + 9.566177991477264, + 53.6317149500398 + ], + [ + 9.555454736814566, + 53.62073363079092 + ], + [ + 9.61273956348804, + 53.59755176911278 + ], + [ + 9.622825970564792, + 53.59702169677156 + ], + [ + 9.641282897001581, + 53.59022306215322 + ], + [ + 9.663424944845415, + 53.577569747967715 + ], + [ + 9.672276363416287, + 53.575796194881754 + ], + [ + 9.67228330565749, + 53.57143794919174 + ], + [ + 9.734364927261794, + 53.56521556356656 + ], + [ + 9.730315195881431, + 53.55801930898749 + ], + [ + 9.702788352379388, + 53.559327502229614 + ], + [ + 9.675759962594537, + 53.564688693458706 + ], + [ + 9.587858873249292, + 53.59851708283242 + ], + [ + 9.55064008429099, + 53.616034550624185 + ], + [ + 9.53108302016611, + 53.64284546567209 + ], + [ + 9.52650576375461, + 53.66575269262473 + ], + [ + 9.528955573881632, + 53.68281750768186 + ], + [ + 9.519543091820353, + 53.69889913348846 + ], + [ + 9.510928142124454, + 53.70689050065682 + ], + [ + 9.495828028406763, + 53.710893314548386 + ], + [ + 9.509995469303513, + 53.693935161776295 + ], + [ + 9.51197182063437, + 53.68525950014504 + ], + [ + 9.485889922907313, + 53.707664660506616 + ], + [ + 9.433311108407253, + 53.73197795187897 + ], + [ + 9.358646428705642, + 53.817925032879245 + ], + [ + 9.319462832436825, + 53.85079564677737 + ], + [ + 9.2897277508942, + 53.8633507413695 + ], + [ + 9.230809298568529, + 53.87505621493533 + ], + [ + 9.230586198098083, + 53.877771866511274 + ], + [ + 9.19975124309687, + 53.88010436619212 + ], + [ + 9.143493419525784, + 53.8776259700566 + ], + [ + 9.052705796912335, + 53.881441549707795 + ], + [ + 9.022420176957269, + 53.8795175369778 + ], + [ + 9.018309495333703, + 53.89630949058174 + ], + [ + 9.02898318578536, + 53.90134063245018 + ], + [ + 9.03571356902644, + 53.89981174393829 + ] + ], + [ + [ + 9.555017396563095, + 53.625582693198794 + ], + [ + 9.56446870441249, + 53.633357994675244 + ], + [ + 9.553711529405696, + 53.63801216691135 + ], + [ + 9.547855812333674, + 53.64485631686951 + ], + [ + 9.542272625676238, + 53.664995080554284 + ], + [ + 9.534987077911959, + 53.64551143157069 + ], + [ + 9.555017396563095, + 53.625582693198794 + ] + ], + [ + [ + 9.415923828456261, + 53.75814108187307 + ], + [ + 9.412017781498704, + 53.77134796229798 + ], + [ + 9.389010215376818, + 53.799859635967934 + ], + [ + 9.406255685200756, + 53.7694823624379 + ], + [ + 9.415923828456261, + 53.75814108187307 + ] + ], + [ + [ + 9.55664286032813, + 53.637815868930126 + ], + [ + 9.556019041105856, + 53.64230928452539 + ], + [ + 9.549080533806727, + 53.64695042895511 + ], + [ + 9.551693566853578, + 53.642226000885785 + ], + [ + 9.55664286032813, + 53.637815868930126 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 3, + "BSG": 1, + "RS": "01", + "AGS": "01", + "SDV_RS": "010020000000", + "GEN": "Schleswig-Holstein", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "01", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEF", + "RS_0": "010000000000", + "AGS_0": "01000000", + "WSK": "2012/02/01", + "DEBKG_ID": "DEBKGDL20000QBMI", + "destatis": { + "population": 2830864, + "population_m": 1381451, + "population_w": 1449413 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 9.01352786434521, + 54.47278351423843 + ], + [ + 9.001556215354473, + 54.46170190155392 + ], + [ + 8.958671844470851, + 54.45195917532598 + ], + [ + 8.949697424968216, + 54.43834640806804 + ], + [ + 8.933946938169477, + 54.432699292581916 + ], + [ + 8.912169784055914, + 54.41664350111999 + ], + [ + 8.872674404321712, + 54.405290370120724 + ], + [ + 8.854165793458051, + 54.40280391570987 + ], + [ + 8.832268910444101, + 54.40874918326804 + ], + [ + 8.809293709822725, + 54.409405727198276 + ], + [ + 8.741761235782386, + 54.398755935588774 + ], + [ + 8.699245744124614, + 54.39665571384897 + ], + [ + 8.673801530549616, + 54.399980506343994 + ], + [ + 8.66040538918761, + 54.39507077855169 + ], + [ + 8.652251793105565, + 54.38927561892068 + ], + [ + 8.649391245011266, + 54.37924692364136 + ], + [ + 8.657779526911268, + 54.37428106952043 + ], + [ + 8.690364986820242, + 54.37343197120577 + ], + [ + 8.692982749463772, + 54.356439844282086 + ], + [ + 8.687947249733366, + 54.35370008187247 + ], + [ + 8.659083764977733, + 54.34696743189356 + ], + [ + 8.653770627848331, + 54.348973232288934 + ], + [ + 8.64673921084738, + 54.345537835118286 + ], + [ + 8.652766172212493, + 54.342901700493904 + ], + [ + 8.64606166595309, + 54.33844160795236 + ], + [ + 8.634704360162772, + 54.33734864890988 + ], + [ + 8.622526494745346, + 54.3430862365023 + ], + [ + 8.602134017087746, + 54.34050798743285 + ], + [ + 8.606375203249698, + 54.32903066685751 + ], + [ + 8.605929729721723, + 54.32588938901004 + ], + [ + 8.599952580537732, + 54.32899970980251 + ], + [ + 8.599642320103374, + 54.32152661908045 + ], + [ + 8.609472178755723, + 54.307889521456566 + ], + [ + 8.630671071739348, + 54.301820518136 + ], + [ + 8.657517718085835, + 54.28384918388852 + ], + [ + 8.686898247241388, + 54.278131046448046 + ], + [ + 8.700365371502759, + 54.28397319195236 + ], + [ + 8.6874862926922, + 54.27298778383894 + ], + [ + 8.674104046062082, + 54.271543636912085 + ], + [ + 8.692981704915681, + 54.26970269062235 + ], + [ + 8.675871493741036, + 54.26646098359066 + ], + [ + 8.64601100844485, + 54.27427968904856 + ], + [ + 8.601460844356072, + 54.31188424859615 + ], + [ + 8.59898822382071, + 54.30700252222372 + ], + [ + 8.61035574636701, + 54.29227078734543 + ], + [ + 8.589974417438127, + 54.3033412195854 + ], + [ + 8.609142579520482, + 54.28493772108784 + ], + [ + 8.590544935474748, + 54.292142433835174 + ], + [ + 8.578907810569927, + 54.30710799673416 + ], + [ + 8.587469422572623, + 54.335316247315646 + ], + [ + 8.597494845566564, + 54.34942335898103 + ], + [ + 8.619719465251608, + 54.356870146805576 + ], + [ + 8.615210075384985, + 54.34618249324196 + ], + [ + 8.632881640902921, + 54.3413558868581 + ], + [ + 8.637783624160056, + 54.3473312839726 + ], + [ + 8.649708208751331, + 54.348405425060875 + ], + [ + 8.653026533424834, + 54.35347199073727 + ], + [ + 8.666330781503982, + 54.35474314231589 + ], + [ + 8.674484058916482, + 54.35119565600878 + ], + [ + 8.689629233524116, + 54.35756816631426 + ], + [ + 8.688435571861442, + 54.360712301493784 + ], + [ + 8.688657290319005, + 54.35764399312607 + ], + [ + 8.67357559596174, + 54.354099420200164 + ], + [ + 8.680869482530708, + 54.35670011011983 + ], + [ + 8.675850963730174, + 54.36565715217848 + ], + [ + 8.685049411405757, + 54.36849897345511 + ], + [ + 8.689347261227864, + 54.37176871829272 + ], + [ + 8.668805504102947, + 54.366742979828615 + ], + [ + 8.656499955881104, + 54.36901090335297 + ], + [ + 8.653591355429977, + 54.372294991597364 + ], + [ + 8.65328757964716, + 54.36611234944127 + ], + [ + 8.638951512038359, + 54.36732698564017 + ], + [ + 8.634740432419646, + 54.37339535989391 + ], + [ + 8.635079835454114, + 54.36994442549564 + ], + [ + 8.629977079869771, + 54.37249302480019 + ], + [ + 8.629268229268112, + 54.376617137297536 + ], + [ + 8.646443746820262, + 54.39253735981373 + ], + [ + 8.654849863403067, + 54.392249659822255 + ], + [ + 8.659994250878727, + 54.395722801803956 + ], + [ + 8.673269807085722, + 54.40053294130852 + ], + [ + 8.6884046745329, + 54.39929472524549 + ], + [ + 8.724830699528995, + 54.40311308197669 + ], + [ + 8.724125991010846, + 54.40572601362659 + ], + [ + 8.745817398431694, + 54.40703385008503 + ], + [ + 8.746885921553094, + 54.404581263667744 + ], + [ + 8.749297765789969, + 54.407914639640225 + ], + [ + 8.826818810604184, + 54.41422942670073 + ], + [ + 8.830136963978262, + 54.41278706263219 + ], + [ + 8.827272774870494, + 54.40898679199409 + ], + [ + 8.835066590205805, + 54.411284385905184 + ], + [ + 8.842797004623845, + 54.40815818266622 + ], + [ + 8.85199733946469, + 54.40874958712453 + ], + [ + 8.852497486893892, + 54.40623418620028 + ], + [ + 8.889372355896722, + 54.41125028734284 + ], + [ + 8.916448756799712, + 54.425783035382345 + ], + [ + 8.936053890885134, + 54.44162926412053 + ], + [ + 8.945914787529398, + 54.44491175317893 + ], + [ + 8.949546340561445, + 54.448184280748954 + ], + [ + 8.946478009411654, + 54.4500630598303 + ], + [ + 8.961099374855973, + 54.45743756421902 + ], + [ + 8.976153859707065, + 54.45926777365966 + ], + [ + 8.977083675159168, + 54.45746337805057 + ], + [ + 8.997173202847225, + 54.462457200133244 + ], + [ + 8.993594967676387, + 54.466797717804205 + ], + [ + 9.006699298997443, + 54.476966919164475 + ], + [ + 9.01352786434521, + 54.47278351423843 + ] + ] + ], + [ + [ + [ + 8.812821445440497, + 54.658173313185856 + ], + [ + 8.831836932410553, + 54.65262552788352 + ], + [ + 8.847709764332127, + 54.624581210636165 + ], + [ + 8.887050972119008, + 54.60751890634928 + ], + [ + 8.892967770416462, + 54.59677687465329 + ], + [ + 8.878651304553975, + 54.57715561752557 + ], + [ + 8.874938175032202, + 54.578020169023155 + ], + [ + 8.881957701652352, + 54.59378070947822 + ], + [ + 8.868671440657545, + 54.59850340688224 + ], + [ + 8.877449430235966, + 54.603849600506834 + ], + [ + 8.875219382106334, + 54.607771957524804 + ], + [ + 8.866449120992495, + 54.59905256370816 + ], + [ + 8.850568330749878, + 54.59746960746734 + ], + [ + 8.847222947769476, + 54.60040665872058 + ], + [ + 8.840133405509025, + 54.600320934870865 + ], + [ + 8.820525678929009, + 54.59547658322263 + ], + [ + 8.82411917498642, + 54.60043517322312 + ], + [ + 8.833228490751438, + 54.60340870867629 + ], + [ + 8.824007593742119, + 54.605245882602624 + ], + [ + 8.834581990460666, + 54.60891369297648 + ], + [ + 8.841652966165848, + 54.61846291852605 + ], + [ + 8.83166719553571, + 54.62370907843395 + ], + [ + 8.82408846040878, + 54.63515322868477 + ], + [ + 8.827333110105268, + 54.6369918373038 + ], + [ + 8.822756765920525, + 54.639496702090746 + ], + [ + 8.823121132607877, + 54.647101306638106 + ], + [ + 8.818503048690228, + 54.64721554080208 + ], + [ + 8.814600151548376, + 54.654235310088964 + ], + [ + 8.799786400003425, + 54.658007449256274 + ], + [ + 8.801787435297648, + 54.660535424191174 + ], + [ + 8.812821445440497, + 54.658173313185856 + ] + ] + ], + [ + [ + [ + 8.98704834999267, + 54.52430650561729 + ], + [ + 8.992774725624926, + 54.51658204998341 + ], + [ + 8.989393698911893, + 54.514342090452956 + ], + [ + 8.983558531593948, + 54.52169529705545 + ], + [ + 8.969873631847657, + 54.51839461100212 + ], + [ + 8.971400148760814, + 54.51452902353089 + ], + [ + 8.9638957793423, + 54.51372534484488 + ], + [ + 8.961951926421591, + 54.50194321657647 + ], + [ + 8.955200917561468, + 54.49501825299452 + ], + [ + 8.93966654144395, + 54.491164687757156 + ], + [ + 8.940306552694341, + 54.48087861933567 + ], + [ + 8.933588124775964, + 54.4800406438643 + ], + [ + 8.928364838940439, + 54.468958317890944 + ], + [ + 8.915686586205734, + 54.47105833635606 + ], + [ + 8.916509201589424, + 54.475150707795244 + ], + [ + 8.924559326280079, + 54.47795758967238 + ], + [ + 8.930812423325564, + 54.4911896646601 + ], + [ + 8.949046069834674, + 54.500474522625225 + ], + [ + 8.945681121614069, + 54.512841719777114 + ], + [ + 8.98704834999267, + 54.52430650561729 + ] + ] + ], + [ + [ + [ + 8.605251961075513, + 54.88464701014994 + ], + [ + 8.612653227329096, + 54.8778770661966 + ], + [ + 8.60776158898583, + 54.84105469330635 + ], + [ + 8.644228959011691, + 54.81908284541719 + ], + [ + 8.656872969503935, + 54.796470792177644 + ], + [ + 8.651671719495377, + 54.79662409632685 + ], + [ + 8.648630907788535, + 54.80151680837432 + ], + [ + 8.652848108882367, + 54.802439806274954 + ], + [ + 8.649005434488098, + 54.80932252615391 + ], + [ + 8.643267600926375, + 54.81010963394108 + ], + [ + 8.638366574370284, + 54.818744833102926 + ], + [ + 8.631969413976982, + 54.81893835820277 + ], + [ + 8.632445449001041, + 54.8229576197669 + ], + [ + 8.617530930766758, + 54.830457328297726 + ], + [ + 8.618578155156413, + 54.83326756877252 + ], + [ + 8.605693721407002, + 54.840707059182634 + ], + [ + 8.601918828606136, + 54.8461308819686 + ], + [ + 8.603098695057087, + 54.876383266911716 + ], + [ + 8.593375246178335, + 54.88242564697736 + ], + [ + 8.572193532708507, + 54.88233156912454 + ], + [ + 8.571949630578287, + 54.88421870988141 + ], + [ + 8.605251961075513, + 54.88464701014994 + ] + ] + ], + [ + [ + [ + 8.666872696063757, + 54.79313237987717 + ], + [ + 8.677437807788811, + 54.79307925661063 + ], + [ + 8.681218698993698, + 54.79048049990485 + ], + [ + 8.684709942339563, + 54.792811533284706 + ], + [ + 8.701673876999275, + 54.773688289478855 + ], + [ + 8.696872102995341, + 54.762093165628016 + ], + [ + 8.715450891254518, + 54.737715952354634 + ], + [ + 8.710464714461219, + 54.73546958406995 + ], + [ + 8.70118505929168, + 54.73462285125628 + ], + [ + 8.706422579690031, + 54.743282897638395 + ], + [ + 8.679796832714775, + 54.785548235181835 + ], + [ + 8.67539217338688, + 54.7905082038021 + ], + [ + 8.66183315978117, + 54.79041988667402 + ], + [ + 8.657496918627057, + 54.79520955324387 + ], + [ + 8.666872696063757, + 54.79313237987717 + ] + ] + ], + [ + [ + [ + 8.720562417112578, + 54.72530092768545 + ], + [ + 8.741293673737752, + 54.71641533172915 + ], + [ + 8.745218632660224, + 54.70700101396877 + ], + [ + 8.713713996515164, + 54.717624043672096 + ], + [ + 8.71231786400948, + 54.6954794381717 + ], + [ + 8.72108327817973, + 54.68575842271851 + ], + [ + 8.710247838497288, + 54.673838990001705 + ], + [ + 8.713080503063459, + 54.680071768509094 + ], + [ + 8.698884197519263, + 54.68095849395469 + ], + [ + 8.708168110648941, + 54.68512616569087 + ], + [ + 8.710050005216031, + 54.72348639250352 + ], + [ + 8.720562417112578, + 54.72530092768545 + ] + ] + ], + [ + [ + [ + 8.637871997964815, + 54.91009898047994 + ], + [ + 8.638336183937408, + 54.89717204987067 + ], + [ + 8.632093710037688, + 54.892008274055826 + ], + [ + 8.602399481674114, + 54.88701064353192 + ], + [ + 8.56972950382791, + 54.88651831402201 + ], + [ + 8.624251380601653, + 54.89439953456364 + ], + [ + 8.624778182446802, + 54.897830552854366 + ], + [ + 8.635383255194595, + 54.90291963866891 + ], + [ + 8.63559893968473, + 54.911529323447766 + ], + [ + 8.637871997964815, + 54.91009898047994 + ] + ] + ], + [ + [ + [ + 8.85099662316001, + 54.553313974081526 + ], + [ + 8.827127089261163, + 54.54503995110074 + ], + [ + 8.828267983889877, + 54.54978082420235 + ], + [ + 8.81271600446408, + 54.55404561203253 + ], + [ + 8.829879818089134, + 54.55526939427976 + ], + [ + 8.831671129463405, + 54.55272742802846 + ], + [ + 8.868609356398103, + 54.56180937584803 + ], + [ + 8.870467456724455, + 54.55780160722562 + ], + [ + 8.85099662316001, + 54.553313974081526 + ] + ] + ], + [ + [ + [ + 8.920936200098717, + 54.46588374059154 + ], + [ + 8.895220518621766, + 54.45774305346717 + ], + [ + 8.85839820085726, + 54.45881365691133 + ], + [ + 8.892438255299627, + 54.460384342615136 + ], + [ + 8.915990930985302, + 54.47057326843246 + ], + [ + 8.924526510124124, + 54.468066781660134 + ], + [ + 8.920936200098717, + 54.46588374059154 + ] + ] + ], + [ + [ + [ + 8.7425503975253, + 54.29286355051482 + ], + [ + 8.746088469729527, + 54.29037366548004 + ], + [ + 8.727211662217329, + 54.28808086558768 + ], + [ + 8.71999034438658, + 54.284343316141744 + ], + [ + 8.717201927364597, + 54.28822865746675 + ], + [ + 8.703307944426584, + 54.285868910704565 + ], + [ + 8.70646956966683, + 54.2931453668585 + ], + [ + 8.722723413580852, + 54.28872127389089 + ], + [ + 8.7425503975253, + 54.29286355051482 + ] + ] + ], + [ + [ + [ + 8.663655868840248, + 54.6562145489557 + ], + [ + 8.65647244477417, + 54.6563392867494 + ], + [ + 8.66902837164224, + 54.67161306970754 + ], + [ + 8.681025859952772, + 54.675241485129185 + ], + [ + 8.682297886846303, + 54.673490645634764 + ], + [ + 8.67183174555534, + 54.67096490473877 + ], + [ + 8.663655868840248, + 54.6562145489557 + ] + ] + ], + [ + [ + [ + 9.005805584048579, + 54.499748734688644 + ], + [ + 9.015759392222993, + 54.484243480197144 + ], + [ + 9.01017106943367, + 54.48131343263634 + ], + [ + 9.004864396572767, + 54.48180329760913 + ], + [ + 9.005674572614543, + 54.48596860306458 + ], + [ + 9.0104258812033, + 54.48661864953281 + ], + [ + 9.005805584048579, + 54.499748734688644 + ] + ] + ], + [ + [ + [ + 8.523957616248339, + 54.755883270370056 + ], + [ + 8.534184465750748, + 54.755863711758394 + ], + [ + 8.51468661893798, + 54.7511118720896 + ], + [ + 8.52015099046273, + 54.755610264203014 + ], + [ + 8.523957616248339, + 54.755883270370056 + ] + ] + ], + [ + [ + [ + 8.78101014366479, + 54.66591400779017 + ], + [ + 8.778644425349194, + 54.66519366006171 + ], + [ + 8.766137453693469, + 54.67210991077698 + ], + [ + 8.7673819313532, + 54.67280030050721 + ], + [ + 8.78101014366479, + 54.66591400779017 + ] + ] + ], + [ + [ + [ + 8.76020208144838, + 54.29031966037188 + ], + [ + 8.76636192628147, + 54.288539967412746 + ], + [ + 8.754039258088495, + 54.288393680249186 + ], + [ + 8.75390468452377, + 54.289881598375196 + ], + [ + 8.76020208144838, + 54.29031966037188 + ] + ] + ], + [ + [ + [ + 9.003567939666567, + 54.50243102587595 + ], + [ + 9.005805584048579, + 54.499748734688644 + ], + [ + 8.997547931096067, + 54.50432265159276 + ], + [ + 9.001145479923824, + 54.50482202953138 + ], + [ + 9.003567939666567, + 54.50243102587595 + ] + ] + ], + [ + [ + [ + 8.860424269042962, + 53.994857482177224 + ], + [ + 8.862305164741585, + 53.99539691248023 + ], + [ + 8.866032181732363, + 53.99089717655536 + ], + [ + 8.860680651958182, + 53.99211170565892 + ], + [ + 8.860424269042962, + 53.994857482177224 + ] + ] + ], + [ + [ + [ + 8.709706828968086, + 54.672386781684175 + ], + [ + 8.689226841180322, + 54.67106641636997 + ], + [ + 8.688555357647122, + 54.67220297677428 + ], + [ + 8.709797052521823, + 54.67260171329682 + ], + [ + 8.709706828968086, + 54.672386781684175 + ] + ] + ], + [ + [ + [ + 8.696744653892736, + 54.513166353359765 + ], + [ + 8.6956479629129, + 54.51131142951252 + ], + [ + 8.693360238983992, + 54.51495483067381 + ], + [ + 8.697091305966904, + 54.515347693659166 + ], + [ + 8.696744653892736, + 54.513166353359765 + ] + ] + ], + [ + [ + [ + 8.689636431509378, + 54.67608156220164 + ], + [ + 8.68719674287412, + 54.67734540981266 + ], + [ + 8.694076092885174, + 54.67851576901609 + ], + [ + 8.694385305812665, + 54.67771132773104 + ], + [ + 8.689636431509378, + 54.67608156220164 + ] + ] + ], + [ + [ + [ + 8.62428853924998, + 54.64647596306717 + ], + [ + 8.619412272658579, + 54.64560524553758 + ], + [ + 8.618885874817101, + 54.64639558801044 + ], + [ + 8.628472428894534, + 54.64747816150999 + ], + [ + 8.62428853924998, + 54.64647596306717 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 1, + "BSG": 1, + "RS": "02", + "AGS": "02", + "SDV_RS": "020000000000", + "GEN": "Hamburg", + "BEZ": "Freie und Hansestadt", + "IBZ": 22, + "BEM": "--", + "NBD": "ja", + "SN_L": "02", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE6", + "RS_0": "020000000000", + "AGS_0": "02000000", + "WSK": "1974/01/01", + "DEBKG_ID": "DEBKGDL20000QFG8", + "destatis": { + "population": 1762791, + "population_m": 857446, + "population_w": 905345 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.465687892250562, + 53.98173989993867 + ], + [ + 8.545674453935716, + 53.93007871012205 + ], + [ + 8.560671618164227, + 53.90508127940127 + ], + [ + 8.575333473579985, + 53.84429451827398 + ], + [ + 8.534008838793445, + 53.88508348466467 + ], + [ + 8.429025333986305, + 53.89341587046223 + ], + [ + 8.104499560461521, + 54.02505000832733 + ], + [ + 8.394368924703407, + 54.02764997566624 + ], + [ + 8.465687892250562, + 53.98173989993867 + ] + ], + [ + [ + 8.496001413123542, + 53.912899237553404 + ], + [ + 8.506429755657274, + 53.91453329302286 + ], + [ + 8.517093526722928, + 53.92057012450911 + ], + [ + 8.497869722995048, + 53.931918456477746 + ], + [ + 8.490593251933195, + 53.92804464914974 + ], + [ + 8.486739638625732, + 53.91807611522757 + ], + [ + 8.486976415401191, + 53.91391154602328 + ], + [ + 8.496001413123542, + 53.912899237553404 + ] + ], + [ + [ + 8.439919158782237, + 53.95896976021844 + ], + [ + 8.424034031467704, + 53.955642046315276 + ], + [ + 8.420553948108196, + 53.947514706495575 + ], + [ + 8.42397032686147, + 53.94360887338324 + ], + [ + 8.439927842694575, + 53.94628193847894 + ], + [ + 8.450718012302035, + 53.960989834703405 + ], + [ + 8.440306196516747, + 53.963972220664964 + ], + [ + 8.434485813732199, + 53.96075786881724 + ], + [ + 8.439919158782237, + 53.95896976021844 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "14", + "AGS": "14", + "SDV_RS": "146120000000", + "GEN": "Sachsen", + "BEZ": "Freistaat", + "IBZ": 21, + "BEM": "--", + "NBD": "ja", + "SN_L": "14", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DED", + "RS_0": "140000000000", + "AGS_0": "14000000", + "WSK": "2014/02/01", + "DEBKG_ID": "DEBKGDL20000E3VH", + "destatis": { + "population": 4055274, + "population_m": 1987607, + "population_w": 2067667 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 12.845984828659287, + 51.68354157202188 + ], + [ + 12.859029566085555, + 51.67619488530268 + ], + [ + 12.856780680709676, + 51.67269615116048 + ], + [ + 12.862227438626029, + 51.67378172888936 + ], + [ + 12.860871692778183, + 51.66470775173506 + ], + [ + 12.866515123529298, + 51.66395721905515 + ], + [ + 12.865793810665611, + 51.655026690750766 + ], + [ + 12.880393947199002, + 51.659060201907025 + ], + [ + 12.889194796101236, + 51.666883894000435 + ], + [ + 12.895168608987397, + 51.66376570195462 + ], + [ + 12.890810731691047, + 51.65396787536975 + ], + [ + 12.897524743385638, + 51.647426265685866 + ], + [ + 12.913414145950513, + 51.644118501361454 + ], + [ + 12.91523094746123, + 51.648460801026786 + ], + [ + 12.928109045176067, + 51.64956501299654 + ], + [ + 12.942163597016568, + 51.6380059348683 + ], + [ + 12.952355279400118, + 51.64358867225915 + ], + [ + 12.9495279724466, + 51.649433929850964 + ], + [ + 12.971502577022326, + 51.650248672749505 + ], + [ + 12.966821293609334, + 51.66566476270369 + ], + [ + 12.979417786990325, + 51.66320061644396 + ], + [ + 12.977719402904116, + 51.66832328118768 + ], + [ + 12.996291834807849, + 51.66924715497839 + ], + [ + 13.005058400432345, + 51.661787676162675 + ], + [ + 13.011863251323447, + 51.66465571922742 + ], + [ + 13.017520415933783, + 51.65996588175296 + ], + [ + 13.01785856630364, + 51.644346808800954 + ], + [ + 13.023467076016967, + 51.637303383580786 + ], + [ + 13.051025246770873, + 51.64767715365189 + ], + [ + 13.086304095173091, + 51.60813513764826 + ], + [ + 13.093842105729742, + 51.60588332541393 + ], + [ + 13.096922946221806, + 51.609216727087876 + ], + [ + 13.104872626451153, + 51.60967557255316 + ], + [ + 13.097098010447063, + 51.61630730457585 + ], + [ + 13.103972710848252, + 51.61647385656971 + ], + [ + 13.106747967793181, + 51.61163260056423 + ], + [ + 13.121025347004315, + 51.61888754822575 + ], + [ + 13.1437768592438, + 51.59787311058614 + ], + [ + 13.154954858476632, + 51.60019678363419 + ], + [ + 13.16177226783151, + 51.592148294607966 + ], + [ + 13.154906540363642, + 51.58939526631148 + ], + [ + 13.153207832114044, + 51.58241280223834 + ], + [ + 13.1410439508023, + 51.571167233227115 + ], + [ + 13.143169244811164, + 51.56746112818962 + ], + [ + 13.146715720505886, + 51.5634549507238 + ], + [ + 13.158606161102169, + 51.56425874591999 + ], + [ + 13.160826606501793, + 51.55896933640719 + ], + [ + 13.18557175948486, + 51.55807523593453 + ], + [ + 13.19005547048605, + 51.53959030258109 + ], + [ + 13.200522824734955, + 51.526035908086854 + ], + [ + 13.207957036778813, + 51.52435284618062 + ], + [ + 13.207041557601736, + 51.50493725537773 + ], + [ + 13.202045180498747, + 51.50411572513054 + ], + [ + 13.203923233392908, + 51.49877907642056 + ], + [ + 13.196534057634771, + 51.49447056464488 + ], + [ + 13.201294463942958, + 51.4917174786283 + ], + [ + 13.192071992683092, + 51.48804944990116 + ], + [ + 13.182296590743732, + 51.491959293166275 + ], + [ + 13.187046114446721, + 51.485753232540205 + ], + [ + 13.182922443464571, + 51.47134128005578 + ], + [ + 13.203080425539502, + 51.458731935324614 + ], + [ + 13.20312168605296, + 51.4510133815797 + ], + [ + 13.191840583488622, + 51.43691061964396 + ], + [ + 13.184760973874027, + 51.43851289669115 + ], + [ + 13.175078704651776, + 51.43278279488173 + ], + [ + 13.174310970973542, + 51.42825391768593 + ], + [ + 13.184649357529908, + 51.423787027034905 + ], + [ + 13.189423718108886, + 51.4342561034472 + ], + [ + 13.19338737346663, + 51.43577686872306 + ], + [ + 13.199750456679649, + 51.43322594892986 + ], + [ + 13.203701756065758, + 51.428490274731296 + ], + [ + 13.202189123520181, + 51.41637687501595 + ], + [ + 13.217308924274164, + 51.3950556478678 + ], + [ + 13.250654592618517, + 51.394108585186245 + ], + [ + 13.26371828959976, + 51.38495189015271 + ], + [ + 13.268543250046047, + 51.3847932441295 + ], + [ + 13.270038189213166, + 51.39050202726645 + ], + [ + 13.26366415068697, + 51.39099427884305 + ], + [ + 13.263771608558423, + 51.39445796048698 + ], + [ + 13.259089376818089, + 51.39533328333621 + ], + [ + 13.259983529890837, + 51.40039904009303 + ], + [ + 13.286354588449106, + 51.39928818530423 + ], + [ + 13.286672469555146, + 51.41138323113536 + ], + [ + 13.328343605963473, + 51.426642049253076 + ], + [ + 13.320322813016475, + 51.43750047498699 + ], + [ + 13.333353583610123, + 51.43744118285325 + ], + [ + 13.337948451163985, + 51.42916466612694 + ], + [ + 13.358349600653407, + 51.433971242366994 + ], + [ + 13.376647808569707, + 51.42461142419729 + ], + [ + 13.383076042327348, + 51.42805680360469 + ], + [ + 13.372938772173928, + 51.43779565017197 + ], + [ + 13.382146484053678, + 51.43604638669049 + ], + [ + 13.388230463341952, + 51.4478088921322 + ], + [ + 13.401050429956125, + 51.45417172377639 + ], + [ + 13.409320226994092, + 51.44977411717499 + ], + [ + 13.405634221446189, + 51.44594862837649 + ], + [ + 13.412191362864787, + 51.43937428935541 + ], + [ + 13.419704985779275, + 51.438844924338554 + ], + [ + 13.42814965661049, + 51.43124501041662 + ], + [ + 13.42142494754756, + 51.421505005374414 + ], + [ + 13.428506814885996, + 51.42179249487532 + ], + [ + 13.43340530503055, + 51.42761652421913 + ], + [ + 13.446057508330341, + 51.425956520360394 + ], + [ + 13.44349374753482, + 51.42876514443706 + ], + [ + 13.445913131179186, + 51.4314497120755 + ], + [ + 13.450052449369915, + 51.42300825763806 + ], + [ + 13.460625089355966, + 51.422241415740515 + ], + [ + 13.463307820597134, + 51.426261875292646 + ], + [ + 13.473786065601084, + 51.417881157559776 + ], + [ + 13.465533280850037, + 51.42177463426184 + ], + [ + 13.463281913905485, + 51.411753589082664 + ], + [ + 13.49135311955664, + 51.40768382152121 + ], + [ + 13.4943915148302, + 51.402917947065376 + ], + [ + 13.502735567952486, + 51.404706197657454 + ], + [ + 13.521217775934359, + 51.402057389515974 + ], + [ + 13.523118417971666, + 51.38102642810437 + ], + [ + 13.537766397510323, + 51.38104645745235 + ], + [ + 13.542628170077014, + 51.36931550527514 + ], + [ + 13.546135309826155, + 51.36916738286418 + ], + [ + 13.550823539272145, + 51.37925212563413 + ], + [ + 13.556267005266124, + 51.37903564514497 + ], + [ + 13.56996177701043, + 51.385666024570284 + ], + [ + 13.589854832842015, + 51.38423485721147 + ], + [ + 13.591344224001848, + 51.37514456660055 + ], + [ + 13.59575668972811, + 51.37452798178812 + ], + [ + 13.59406313417129, + 51.36935620942162 + ], + [ + 13.617225116274195, + 51.37105730835345 + ], + [ + 13.63209954595885, + 51.36853507668276 + ], + [ + 13.661451523550907, + 51.36897462801059 + ], + [ + 13.668403737304994, + 51.376126427063944 + ], + [ + 13.682764783548285, + 51.367615273595604 + ], + [ + 13.691250599729084, + 51.3740128051821 + ], + [ + 13.713393941881103, + 51.36350286555933 + ], + [ + 13.727352068016485, + 51.364710250040375 + ], + [ + 13.739111250709746, + 51.36120201941882 + ], + [ + 13.753155540543224, + 51.36594682643548 + ], + [ + 13.757691731615067, + 51.3714945970298 + ], + [ + 13.768966955434369, + 51.36939804574241 + ], + [ + 13.762684593046304, + 51.36541218406207 + ], + [ + 13.763252568096542, + 51.35902035066265 + ], + [ + 13.767735944061661, + 51.36300780365274 + ], + [ + 13.776524354120504, + 51.36199078453041 + ], + [ + 13.780624863420808, + 51.3688476911336 + ], + [ + 13.787940659930152, + 51.37090727141151 + ], + [ + 13.807640397268631, + 51.37318695710381 + ], + [ + 13.818971916501917, + 51.36949891235228 + ], + [ + 13.835313220249546, + 51.37678999969994 + ], + [ + 13.833190693973803, + 51.383838979464294 + ], + [ + 13.863248930278516, + 51.38175706746582 + ], + [ + 13.868276710372285, + 51.37691168299801 + ], + [ + 13.882632642999008, + 51.37506694091715 + ], + [ + 13.909994332528104, + 51.37896814600961 + ], + [ + 13.90820470332307, + 51.38323341703199 + ], + [ + 13.938988524708328, + 51.38911315162986 + ], + [ + 13.956223628794325, + 51.39707171266231 + ], + [ + 13.972343683798115, + 51.39382237691531 + ], + [ + 13.970209087221445, + 51.3758409262069 + ], + [ + 14.000697254240357, + 51.3725959735676 + ], + [ + 13.996318439130844, + 51.382607596089024 + ], + [ + 14.008315099104662, + 51.39198121206515 + ], + [ + 14.003563734393447, + 51.39561192350526 + ], + [ + 14.013325115875684, + 51.39832306372595 + ], + [ + 14.028091219290928, + 51.39593580552429 + ], + [ + 14.02579387289712, + 51.40055182428538 + ], + [ + 14.017015973956225, + 51.40047199645298 + ], + [ + 14.015903683475143, + 51.40513789563728 + ], + [ + 14.027438864844086, + 51.408319903263255 + ], + [ + 14.036849738394608, + 51.41679777148433 + ], + [ + 14.04458987493301, + 51.418753734378754 + ], + [ + 14.03824509089658, + 51.4284438850606 + ], + [ + 14.046241448700947, + 51.429134775718296 + ], + [ + 14.043548273882752, + 51.43336268168198 + ], + [ + 14.037145618177227, + 51.43458503792178 + ], + [ + 14.040212572184313, + 51.43728098553133 + ], + [ + 14.062837101853969, + 51.44550575592312 + ], + [ + 14.05258824086775, + 51.45250807268832 + ], + [ + 14.055291851459758, + 51.46094820783808 + ], + [ + 14.033005723693138, + 51.47510218879055 + ], + [ + 14.03874199579154, + 51.47991067923028 + ], + [ + 14.072593722338398, + 51.47208725829162 + ], + [ + 14.087258360941595, + 51.47739668372717 + ], + [ + 14.073821671590348, + 51.49266749021899 + ], + [ + 14.087760578909393, + 51.49396380295589 + ], + [ + 14.096060710501504, + 51.49805203107105 + ], + [ + 14.100577876957676, + 51.514165002833586 + ], + [ + 14.107796742863309, + 51.521760568822415 + ], + [ + 14.142359249165233, + 51.522804452032425 + ], + [ + 14.129730076359564, + 51.53386106010358 + ], + [ + 14.136708928841285, + 51.54330893838749 + ], + [ + 14.175136186489217, + 51.539116892657965 + ], + [ + 14.213017886557852, + 51.539811848154216 + ], + [ + 14.228926525436593, + 51.53283939857733 + ], + [ + 14.242108159796524, + 51.53309028394815 + ], + [ + 14.24530021097791, + 51.531186975742486 + ], + [ + 14.242488150501858, + 51.528759478703165 + ], + [ + 14.247044375769475, + 51.527842391318046 + ], + [ + 14.255942533885728, + 51.53229829877811 + ], + [ + 14.274005491938551, + 51.53213036511619 + ], + [ + 14.293084404069553, + 51.52511014498397 + ], + [ + 14.322918394674263, + 51.51942604332302 + ], + [ + 14.324919587785665, + 51.50714771778146 + ], + [ + 14.332350138103498, + 51.50501826420334 + ], + [ + 14.3381102183225, + 51.50591161227991 + ], + [ + 14.342118093232736, + 51.5108438247694 + ], + [ + 14.339930674000405, + 51.52076215753116 + ], + [ + 14.35368764281023, + 51.520789465532616 + ], + [ + 14.37586651911569, + 51.53313396525917 + ], + [ + 14.386688682891291, + 51.53402059934251 + ], + [ + 14.387158460248811, + 51.5417708855479 + ], + [ + 14.398877064048863, + 51.54178904507041 + ], + [ + 14.40943787381737, + 51.53720890591514 + ], + [ + 14.441311010013386, + 51.54461378344053 + ], + [ + 14.447770786856115, + 51.54206888570234 + ], + [ + 14.44673537690033, + 51.55272760922218 + ], + [ + 14.454070341319582, + 51.55637198048769 + ], + [ + 14.49985690372574, + 51.55940366951107 + ], + [ + 14.515453720018995, + 51.55423483708441 + ], + [ + 14.52507605823792, + 51.55863081223357 + ], + [ + 14.545185106298945, + 51.56177742415794 + ], + [ + 14.544438334083118, + 51.57361516457649 + ], + [ + 14.560581837609522, + 51.5734613228352 + ], + [ + 14.56963510186869, + 51.58119048113655 + ], + [ + 14.58048435424069, + 51.580410028384506 + ], + [ + 14.58306397112257, + 51.57463525883048 + ], + [ + 14.59817064401112, + 51.57248917469619 + ], + [ + 14.606366460831362, + 51.55722787409729 + ], + [ + 14.603744825276754, + 51.55511637448932 + ], + [ + 14.609886945732633, + 51.55014978439863 + ], + [ + 14.663996490162418, + 51.55454737519291 + ], + [ + 14.674012756405858, + 51.55064535706996 + ], + [ + 14.691142421299922, + 51.56278610633662 + ], + [ + 14.69575344048256, + 51.574606705063054 + ], + [ + 14.692759231120952, + 51.57633522523735 + ], + [ + 14.706451661098512, + 51.57646016641638 + ], + [ + 14.69664772412747, + 51.59666082991229 + ], + [ + 14.707558531677977, + 51.59730833014601 + ], + [ + 14.729865560236963, + 51.581777002002696 + ], + [ + 14.727189761187194, + 51.57535785584555 + ], + [ + 14.711240952831535, + 51.56265530437195 + ], + [ + 14.716394296522903, + 51.55518997509881 + ], + [ + 14.729349148618082, + 51.54974240205026 + ], + [ + 14.731441479372737, + 51.544386620576184 + ], + [ + 14.726305433243354, + 51.53900201035432 + ], + [ + 14.735763417228695, + 51.52595615868468 + ], + [ + 14.751817827156975, + 51.521799937026145 + ], + [ + 14.760993595239317, + 51.52322997725942 + ], + [ + 14.765265601565982, + 51.5189975216359 + ], + [ + 14.795970692561152, + 51.51787202455465 + ], + [ + 14.805404012570053, + 51.514192975982404 + ], + [ + 14.811776916893049, + 51.50609222385812 + ], + [ + 14.819417836149544, + 51.507641485788504 + ], + [ + 14.832413474556015, + 51.503802277093605 + ], + [ + 14.851638904506336, + 51.489556405383105 + ], + [ + 14.86447304731492, + 51.490468441686595 + ], + [ + 14.870783412265386, + 51.48488119066651 + ], + [ + 14.886622832288284, + 51.48794168297511 + ], + [ + 14.897794766018107, + 51.48205385163582 + ], + [ + 14.908069322782824, + 51.483976512215946 + ], + [ + 14.922353451742273, + 51.482259651446746 + ], + [ + 14.92611110305207, + 51.4734839334172 + ], + [ + 14.949088455470312, + 51.471264895126225 + ], + [ + 14.956446438681903, + 51.463370144148186 + ], + [ + 14.955859528819511, + 51.45851625997295 + ], + [ + 14.974216449293571, + 51.44167401958193 + ], + [ + 14.970072263819128, + 51.432171544232396 + ], + [ + 14.963290006718701, + 51.43419599793256 + ], + [ + 14.958634071412206, + 51.431245170320956 + ], + [ + 14.966086123885736, + 51.42677092884296 + ], + [ + 14.967070061385414, + 51.41732358177586 + ], + [ + 14.958724002288921, + 51.40975407443846 + ], + [ + 14.968925515962995, + 51.397729985627784 + ], + [ + 14.95828310627191, + 51.39534469935177 + ], + [ + 14.965885206017292, + 51.39135603152464 + ], + [ + 14.969300868830118, + 51.379075908602935 + ], + [ + 14.983740930568016, + 51.37354957568023 + ], + [ + 14.977166518295993, + 51.3654901384043 + ], + [ + 14.9652434517112, + 51.36108330307241 + ], + [ + 14.976218461347129, + 51.35693640751619 + ], + [ + 14.977772097133698, + 51.34169823737066 + ], + [ + 14.986146668801387, + 51.32929079174105 + ], + [ + 14.99354641398931, + 51.32825505695789 + ], + [ + 14.993141800745516, + 51.322983667735556 + ], + [ + 15.009246227723244, + 51.316298842558744 + ], + [ + 15.006647381715418, + 51.311792729717276 + ], + [ + 15.012631783828354, + 51.30857880531403 + ], + [ + 15.012005599755634, + 51.301310657539254 + ], + [ + 15.02174439592298, + 51.300619667220424 + ], + [ + 15.033481455988085, + 51.293933238523735 + ], + [ + 15.034368031960488, + 51.27744247229692 + ], + [ + 15.041815651616302, + 51.273375950408536 + ], + [ + 15.036760093070042, + 51.270454678442626 + ], + [ + 15.038167332274337, + 51.25848337106773 + ], + [ + 15.025176054171201, + 51.25401503142351 + ], + [ + 15.02339188379517, + 51.250706867338536 + ], + [ + 15.026375475972436, + 51.249046021491246 + ], + [ + 15.029481363353804, + 51.25141577617384 + ], + [ + 15.037618672263925, + 51.244203050841385 + ], + [ + 15.033843831777663, + 51.24105807354681 + ], + [ + 15.028330304974858, + 51.241557810343366 + ], + [ + 15.028617297795323, + 51.23705335717031 + ], + [ + 15.02351344654824, + 51.23521880969365 + ], + [ + 15.025542059060314, + 51.23173456833189 + ], + [ + 15.01620249648196, + 51.227602234986925 + ], + [ + 15.016875191579866, + 51.21492628665209 + ], + [ + 15.00980472248702, + 51.21345340149936 + ], + [ + 15.01305494788201, + 51.20894916300413 + ], + [ + 15.007652880229985, + 51.19982754388874 + ], + [ + 15.014382572572133, + 51.19651200141774 + ], + [ + 15.004737074449693, + 51.19088078638217 + ], + [ + 15.008779123762455, + 51.18233278407862 + ], + [ + 15.00154101578731, + 51.172380904754085 + ], + [ + 15.005042952888523, + 51.16771181696589 + ], + [ + 14.993293233360177, + 51.16283327233935 + ], + [ + 15.000808311785727, + 51.14994703303255 + ], + [ + 14.990427552231559, + 51.14215198816683 + ], + [ + 14.995372980843117, + 51.136868712368596 + ], + [ + 14.997766979497902, + 51.12241750368597 + ], + [ + 14.989200173996748, + 51.11662277499528 + ], + [ + 14.98091480761141, + 51.11605405417785 + ], + [ + 14.978256320478392, + 51.10785648428643 + ], + [ + 14.983986889833139, + 51.102255870530065 + ], + [ + 14.980248654290465, + 51.096045978651276 + ], + [ + 14.98400747712838, + 51.09074998457692 + ], + [ + 14.97632875988709, + 51.08700964426284 + ], + [ + 14.979275099802935, + 51.07707998140433 + ], + [ + 14.967915734959927, + 51.07141996093474 + ], + [ + 14.971305127855338, + 51.066070192917316 + ], + [ + 14.963009377435661, + 51.05789568561941 + ], + [ + 14.964397266126433, + 51.04998628587595 + ], + [ + 14.948963576438178, + 51.04283114001891 + ], + [ + 14.949060768874117, + 51.03060059537456 + ], + [ + 14.945640679026292, + 51.026492112019504 + ], + [ + 14.940293744780105, + 51.02609426557442 + ], + [ + 14.940105562451539, + 51.02092857935784 + ], + [ + 14.935208914832822, + 51.02017467993633 + ], + [ + 14.939284753543467, + 51.017023342582824 + ], + [ + 14.937980712263117, + 51.011466475116386 + ], + [ + 14.929047062905193, + 50.9979796204192 + ], + [ + 14.917197957220724, + 50.99520305327115 + ], + [ + 14.919431940909531, + 50.97534220414612 + ], + [ + 14.903083074079946, + 50.97171677623901 + ], + [ + 14.899601832653655, + 50.963312661029555 + ], + [ + 14.903870857013997, + 50.961222171741625 + ], + [ + 14.897617458796542, + 50.959394711209875 + ], + [ + 14.892963251908357, + 50.949583641216094 + ], + [ + 14.896553476327256, + 50.94064168273622 + ], + [ + 14.89082377400425, + 50.935236396484676 + ], + [ + 14.876854836515387, + 50.932353619194636 + ], + [ + 14.868091897663271, + 50.91790137677019 + ], + [ + 14.851634367432567, + 50.91056925205937 + ], + [ + 14.84340778395915, + 50.90065615493994 + ], + [ + 14.819551274350736, + 50.88506100434585 + ], + [ + 14.817374967449053, + 50.87958090938754 + ], + [ + 14.82474893530447, + 50.86696751700039 + ], + [ + 14.807719034698323, + 50.84641744306291 + ], + [ + 14.8018095106188, + 50.82486433862149 + ], + [ + 14.79391183213035, + 50.82014754219756 + ], + [ + 14.79049622142456, + 50.82408477952238 + ], + [ + 14.779258160698099, + 50.819992240179346 + ], + [ + 14.766437622986395, + 50.81934870229332 + ], + [ + 14.758729663827266, + 50.82471128020085 + ], + [ + 14.749867416567081, + 50.82432342945748 + ], + [ + 14.744951763493585, + 50.829451479236724 + ], + [ + 14.722323033216481, + 50.8220815534058 + ], + [ + 14.716374666309497, + 50.82436061487213 + ], + [ + 14.720066728132872, + 50.83234578405694 + ], + [ + 14.70870656823805, + 50.84088894679929 + ], + [ + 14.690198947465456, + 50.83799914413249 + ], + [ + 14.664787636355332, + 50.8493681948534 + ], + [ + 14.648259914577986, + 50.84872335508853 + ], + [ + 14.61886845419284, + 50.857710300611565 + ], + [ + 14.618729177148724, + 50.8645568085377 + ], + [ + 14.624337147897487, + 50.868701299137584 + ], + [ + 14.63623378569944, + 50.897448620954926 + ], + [ + 14.65289634429997, + 50.90548600128775 + ], + [ + 14.650215414736689, + 50.931534571364665 + ], + [ + 14.628118343826017, + 50.925385579697874 + ], + [ + 14.617110406066738, + 50.92554176153524 + ], + [ + 14.583209774735803, + 50.914256999613016 + ], + [ + 14.564810749580609, + 50.918352964074856 + ], + [ + 14.56066200760019, + 50.92537401373744 + ], + [ + 14.58067626245418, + 50.941875643508844 + ], + [ + 14.596073842678406, + 50.9628084011426 + ], + [ + 14.592153963313015, + 50.96676486715897 + ], + [ + 14.596741384076903, + 50.968912653365116 + ], + [ + 14.600675871578312, + 50.979515655643006 + ], + [ + 14.599177543873045, + 50.98711100487658 + ], + [ + 14.58134046088233, + 50.99354118987175 + ], + [ + 14.578704113458619, + 51.000309449508215 + ], + [ + 14.568722866209466, + 51.00433042930464 + ], + [ + 14.56453118665558, + 51.01013771242074 + ], + [ + 14.560910309188715, + 51.006985780200445 + ], + [ + 14.534698159169839, + 51.00371424013957 + ], + [ + 14.5350582225989, + 51.008934978416484 + ], + [ + 14.539888905389702, + 51.01037677727989 + ], + [ + 14.532145952403555, + 51.016529439666236 + ], + [ + 14.498557610325795, + 51.02205889150093 + ], + [ + 14.508211953750456, + 51.04315459882654 + ], + [ + 14.499785714557905, + 51.04654381826464 + ], + [ + 14.491220962562783, + 51.043530579724006 + ], + [ + 14.492658357223531, + 51.02340395058644 + ], + [ + 14.474365363014378, + 51.0254999771799 + ], + [ + 14.475291001529765, + 51.02949827911414 + ], + [ + 14.46545311531437, + 51.03530710541278 + ], + [ + 14.453819729603303, + 51.03589320673067 + ], + [ + 14.421785808650696, + 51.019569392271656 + ], + [ + 14.40844212223544, + 51.01877159089613 + ], + [ + 14.38476403666901, + 51.02695835476648 + ], + [ + 14.382565513526638, + 51.03856989889001 + ], + [ + 14.37402248762394, + 51.03860640818707 + ], + [ + 14.361987042457963, + 51.04542548166171 + ], + [ + 14.345100429744026, + 51.039073319671594 + ], + [ + 14.33663022222025, + 51.03901930423109 + ], + [ + 14.316923896169293, + 51.055423885510045 + ], + [ + 14.301858340875421, + 51.055046172099864 + ], + [ + 14.28839005494209, + 51.039119663210705 + ], + [ + 14.273792349560402, + 51.03977211813202 + ], + [ + 14.285343704498038, + 51.03220989751747 + ], + [ + 14.286314960854325, + 51.02696194746792 + ], + [ + 14.277671567288605, + 51.0188393189904 + ], + [ + 14.280222181898399, + 51.01409636204703 + ], + [ + 14.26064252292454, + 51.00882924307756 + ], + [ + 14.268802209020423, + 51.000040568342385 + ], + [ + 14.25854389236023, + 50.992131828968105 + ], + [ + 14.258647343803611, + 50.98753751604727 + ], + [ + 14.28577494473084, + 50.976995711541385 + ], + [ + 14.31140777119088, + 50.984663948884815 + ], + [ + 14.323554182964214, + 50.985363648544286 + ], + [ + 14.329728236696349, + 50.982199968224855 + ], + [ + 14.326058808778084, + 50.97782244140378 + ], + [ + 14.32842336944654, + 50.973506377625355 + ], + [ + 14.31295713461664, + 50.97226113333127 + ], + [ + 14.30255905735016, + 50.965332060349006 + ], + [ + 14.316912151032968, + 50.96067128904196 + ], + [ + 14.311707899438343, + 50.95376043690211 + ], + [ + 14.325367534542037, + 50.949717123454505 + ], + [ + 14.345796453336876, + 50.948565829666485 + ], + [ + 14.360522390415387, + 50.94144664389445 + ], + [ + 14.369475838466753, + 50.94217834414947 + ], + [ + 14.373175130402084, + 50.93824178034325 + ], + [ + 14.387322404306024, + 50.94181380480783 + ], + [ + 14.396728062303707, + 50.9364906747366 + ], + [ + 14.402143727477501, + 50.924073246706726 + ], + [ + 14.391800205313304, + 50.920829530348115 + ], + [ + 14.394148567608894, + 50.91815145285055 + ], + [ + 14.385642572074136, + 50.91648999328882 + ], + [ + 14.387635006106986, + 50.899087977230224 + ], + [ + 14.374146331281704, + 50.89623193872624 + ], + [ + 14.349273388396709, + 50.900725826912115 + ], + [ + 14.348213158289711, + 50.89257101980755 + ], + [ + 14.304845069721509, + 50.883981086914496 + ], + [ + 14.289663726690238, + 50.88588984253567 + ], + [ + 14.282200011236839, + 50.89255897723527 + ], + [ + 14.267504609569185, + 50.89530453192602 + ], + [ + 14.252253191313482, + 50.8879174705784 + ], + [ + 14.233150163325407, + 50.887524026272345 + ], + [ + 14.236019929804668, + 50.876449623895965 + ], + [ + 14.223292323819713, + 50.8592367105012 + ], + [ + 14.216504551152164, + 50.860233103279796 + ], + [ + 14.2010278782077, + 50.851336198939535 + ], + [ + 14.16146480334856, + 50.84753721610098 + ], + [ + 14.132872518775697, + 50.8339951372685 + ], + [ + 14.089525614543145, + 50.82584963339478 + ], + [ + 14.079046071537721, + 50.8186696063188 + ], + [ + 14.078378208065534, + 50.81241992946468 + ], + [ + 14.063585688227212, + 50.8099473508798 + ], + [ + 14.041137000849576, + 50.81080187934607 + ], + [ + 14.03066483946394, + 50.80416180000858 + ], + [ + 14.016446100860145, + 50.81111230307312 + ], + [ + 14.00346034894472, + 50.810267139185754 + ], + [ + 14.003390802923287, + 50.814354947857765 + ], + [ + 13.99031103211767, + 50.82000502904564 + ], + [ + 13.970880063712041, + 50.8110937202995 + ], + [ + 13.953779260253606, + 50.80728969428524 + ], + [ + 13.955840745832788, + 50.800589751819814 + ], + [ + 13.939180495649397, + 50.78997900755337 + ], + [ + 13.918370446755928, + 50.789117360701425 + ], + [ + 13.901054928701187, + 50.79342943055201 + ], + [ + 13.896420426723182, + 50.788656016431524 + ], + [ + 13.899944120923262, + 50.78480373361563 + ], + [ + 13.887530921977698, + 50.7704604853524 + ], + [ + 13.889587611095845, + 50.762998487886264 + ], + [ + 13.902751590642557, + 50.752908571755704 + ], + [ + 13.898190315372178, + 50.744485653765906 + ], + [ + 13.880231434787467, + 50.73781457688376 + ], + [ + 13.86177786390482, + 50.74290934966606 + ], + [ + 13.8615729140521, + 50.735315577263954 + ], + [ + 13.855192644662903, + 50.72710970489628 + ], + [ + 13.834649794510511, + 50.72689545685575 + ], + [ + 13.82706920205178, + 50.72422109283607 + ], + [ + 13.807331646963947, + 50.73326441305884 + ], + [ + 13.79087706405493, + 50.73255285277075 + ], + [ + 13.79011389607544, + 50.73504094580929 + ], + [ + 13.784811335044544, + 50.73359489344819 + ], + [ + 13.777307953725073, + 50.736357311801136 + ], + [ + 13.768977815284574, + 50.73297142602575 + ], + [ + 13.758341666984915, + 50.735814603954395 + ], + [ + 13.750751035566049, + 50.72953435679074 + ], + [ + 13.740403594304361, + 50.7271737728628 + ], + [ + 13.7281757928073, + 50.733651440832375 + ], + [ + 13.713656411854497, + 50.72512186292238 + ], + [ + 13.708217319323184, + 50.72531709710867 + ], + [ + 13.712389783346591, + 50.71966383607972 + ], + [ + 13.706467566351352, + 50.7169238154613 + ], + [ + 13.688005795962534, + 50.71960723905864 + ], + [ + 13.664308585732075, + 50.73192859874258 + ], + [ + 13.642634338470177, + 50.7293412979144 + ], + [ + 13.62503670870668, + 50.72284627989972 + ], + [ + 13.626912967916878, + 50.71591524296374 + ], + [ + 13.602253181002824, + 50.71005874269722 + ], + [ + 13.55632677567508, + 50.71454617304327 + ], + [ + 13.538479409004625, + 50.70601422858762 + ], + [ + 13.526820353655774, + 50.70501677553474 + ], + [ + 13.527545422151519, + 50.69901556970096 + ], + [ + 13.540426398370446, + 50.6897535817879 + ], + [ + 13.544372939285433, + 50.67744760186383 + ], + [ + 13.538491340591065, + 50.672874501328074 + ], + [ + 13.540243682842204, + 50.66801061714511 + ], + [ + 13.530621598132962, + 50.66822849289353 + ], + [ + 13.512806843434834, + 50.65371252025263 + ], + [ + 13.516976752965322, + 50.64835008079719 + ], + [ + 13.526109693386491, + 50.649421701360126 + ], + [ + 13.524193076754644, + 50.63926466295063 + ], + [ + 13.497028543470167, + 50.6314235864419 + ], + [ + 13.494155315278855, + 50.62446466280944 + ], + [ + 13.477534250286434, + 50.61543066664534 + ], + [ + 13.46476758444438, + 50.60189259521174 + ], + [ + 13.44109001223328, + 50.61113235583578 + ], + [ + 13.428889947280426, + 50.610756221194734 + ], + [ + 13.425471709946937, + 50.616446504519374 + ], + [ + 13.41530890671223, + 50.616331777993 + ], + [ + 13.405378729410746, + 50.634576925452116 + ], + [ + 13.392658457209473, + 50.64174589171727 + ], + [ + 13.392107757138117, + 50.6463184231856 + ], + [ + 13.38297650711159, + 50.64485209474009 + ], + [ + 13.370982951602592, + 50.650545895518064 + ], + [ + 13.377699915137246, + 50.627675092394014 + ], + [ + 13.369881745116345, + 50.62456968342386 + ], + [ + 13.366657601543551, + 50.618441240825355 + ], + [ + 13.360416106217867, + 50.61925350825373 + ], + [ + 13.351832691470639, + 50.614091010118386 + ], + [ + 13.337449442419011, + 50.61252978799547 + ], + [ + 13.334547856822201, + 50.60691188888091 + ], + [ + 13.324732370493297, + 50.60803862370499 + ], + [ + 13.325872903105614, + 50.60460868730104 + ], + [ + 13.319399721164716, + 50.602166269106434 + ], + [ + 13.323678120040446, + 50.58164863376611 + ], + [ + 13.290912693909664, + 50.575017644478244 + ], + [ + 13.278770585969365, + 50.592994899247685 + ], + [ + 13.260459834868337, + 50.59219534347554 + ], + [ + 13.2551039096001, + 50.59530113724746 + ], + [ + 13.248438251323599, + 50.59205333127881 + ], + [ + 13.247496416732114, + 50.587069876705215 + ], + [ + 13.233633142073538, + 50.579125693026356 + ], + [ + 13.235511348035388, + 50.57037449945396 + ], + [ + 13.22286161558229, + 50.56290340444575 + ], + [ + 13.229077043572982, + 50.54973708407785 + ], + [ + 13.222089398556152, + 50.54621965251543 + ], + [ + 13.209609493437943, + 50.530054735681674 + ], + [ + 13.2073394765459, + 50.521572563278056 + ], + [ + 13.194689488368422, + 50.51526027773816 + ], + [ + 13.195270342566685, + 50.50326286986988 + ], + [ + 13.178113363212184, + 50.50288297833633 + ], + [ + 13.154119359290448, + 50.508512601501046 + ], + [ + 13.13673657576728, + 50.50642449747244 + ], + [ + 13.138644508194801, + 50.51175800438312 + ], + [ + 13.132671092213837, + 50.51827797081913 + ], + [ + 13.101471903786052, + 50.502924513677634 + ], + [ + 13.085345598589022, + 50.50027136371765 + ], + [ + 13.055996593164942, + 50.50125917762745 + ], + [ + 13.042811032280822, + 50.511382107303156 + ], + [ + 13.031745820234978, + 50.5097318038785 + ], + [ + 13.032437858538238, + 50.500969800123585 + ], + [ + 13.022539354239225, + 50.4869233931636 + ], + [ + 13.020174173036015, + 50.4754271682563 + ], + [ + 13.019654281772931, + 50.46074631297587 + ], + [ + 13.023863075745767, + 50.454079780725145 + ], + [ + 13.019865411092495, + 50.44673235069077 + ], + [ + 12.995983287835953, + 50.433775579512655 + ], + [ + 12.983451158496688, + 50.41971505334172 + ], + [ + 12.941897637115575, + 50.41149341446167 + ], + [ + 12.94048927928134, + 50.407706246581306 + ], + [ + 12.94745395149129, + 50.4071966472405 + ], + [ + 12.94797282338827, + 50.4042796595622 + ], + [ + 12.937308320817786, + 50.406328325207404 + ], + [ + 12.936410712995356, + 50.41163677461277 + ], + [ + 12.91239178491579, + 50.42372909077041 + ], + [ + 12.902960692384028, + 50.42282816034523 + ], + [ + 12.894704032790857, + 50.429752048103886 + ], + [ + 12.819380927850762, + 50.45979531584951 + ], + [ + 12.817138192013944, + 50.45010380465417 + ], + [ + 12.806651844227964, + 50.44389131810611 + ], + [ + 12.810618706692095, + 50.43105705655438 + ], + [ + 12.79492996811605, + 50.44944688701445 + ], + [ + 12.734613355740116, + 50.43219795418675 + ], + [ + 12.729800855446998, + 50.42166931264791 + ], + [ + 12.707606946255616, + 50.407829757995664 + ], + [ + 12.707056705882824, + 50.3973174617975 + ], + [ + 12.6731215389194, + 50.41687581729997 + ], + [ + 12.64917310373112, + 50.41074567309841 + ], + [ + 12.626676112068093, + 50.41631253171047 + ], + [ + 12.616952124245683, + 50.41560974696887 + ], + [ + 12.600186605280417, + 50.40580866955381 + ], + [ + 12.580349226492682, + 50.407249304539015 + ], + [ + 12.558441611444223, + 50.39939846417148 + ], + [ + 12.54602967937216, + 50.40088908983185 + ], + [ + 12.542932277740627, + 50.39831585687461 + ], + [ + 12.512047934882599, + 50.39725816884067 + ], + [ + 12.486528323944283, + 50.37084340801187 + ], + [ + 12.492500068296275, + 50.356273094670144 + ], + [ + 12.489306909901519, + 50.34981661745388 + ], + [ + 12.481583433080916, + 50.34701371114244 + ], + [ + 12.46942667224592, + 50.354990385399276 + ], + [ + 12.441802025537164, + 50.34115854010154 + ], + [ + 12.435526180216032, + 50.333217915827234 + ], + [ + 12.437149249801635, + 50.32755617117796 + ], + [ + 12.431200365315597, + 50.3227240477563 + ], + [ + 12.403427155099676, + 50.32395217518544 + ], + [ + 12.398015032562963, + 50.32115327022276 + ], + [ + 12.398366076600103, + 50.307898773968496 + ], + [ + 12.403036984449027, + 50.300720055686774 + ], + [ + 12.400566176403649, + 50.29520771150064 + ], + [ + 12.394256709217395, + 50.289596753017705 + ], + [ + 12.370862761120256, + 50.285273373620846 + ], + [ + 12.352117038488446, + 50.26174587129735 + ], + [ + 12.350105253470922, + 50.253533969398674 + ], + [ + 12.35929947817199, + 50.24231784026747 + ], + [ + 12.349036031969511, + 50.23649686299579 + ], + [ + 12.33108448865803, + 50.24271404945636 + ], + [ + 12.329048765501712, + 50.225331197763886 + ], + [ + 12.33496210319838, + 50.221546581874456 + ], + [ + 12.334514166541572, + 50.21688265967378 + ], + [ + 12.326521081227414, + 50.218654233532796 + ], + [ + 12.327926150226679, + 50.21243075246348 + ], + [ + 12.323054691000115, + 50.207453426445966 + ], + [ + 12.338219956323066, + 50.19247778065138 + ], + [ + 12.32371619211399, + 50.181321487074925 + ], + [ + 12.32764508422138, + 50.1759825945197 + ], + [ + 12.337532512432748, + 50.173381492753194 + ], + [ + 12.322750553586904, + 50.17181519463588 + ], + [ + 12.294938330839493, + 50.174678331426854 + ], + [ + 12.28980362688336, + 50.1769300766899 + ], + [ + 12.289337489197091, + 50.186051594092895 + ], + [ + 12.277431536187255, + 50.191709451734226 + ], + [ + 12.274669295037503, + 50.1966869701365 + ], + [ + 12.288466623066059, + 50.20397566192 + ], + [ + 12.28512763630787, + 50.20602580080569 + ], + [ + 12.28868172666745, + 50.21044515977334 + ], + [ + 12.281823304390862, + 50.208202775496154 + ], + [ + 12.282873182259804, + 50.21366587962614 + ], + [ + 12.293877805197228, + 50.22127014407057 + ], + [ + 12.279320519713416, + 50.222478126797874 + ], + [ + 12.286327836413282, + 50.225482947673726 + ], + [ + 12.274576793447771, + 50.233288282515545 + ], + [ + 12.26689642078741, + 50.231918659971946 + ], + [ + 12.239627312918932, + 50.24616890699827 + ], + [ + 12.241554869738271, + 50.250880181530505 + ], + [ + 12.24959700700219, + 50.25429164795056 + ], + [ + 12.247539958364069, + 50.25779020343327 + ], + [ + 12.255014403505982, + 50.251247864835975 + ], + [ + 12.26603646867368, + 50.250214620704 + ], + [ + 12.266015955048061, + 50.25870157390132 + ], + [ + 12.253703138359898, + 50.2710858926463 + ], + [ + 12.247040661371088, + 50.268262570493945 + ], + [ + 12.201456890086728, + 50.27278175948644 + ], + [ + 12.202320813415092, + 50.28775369807758 + ], + [ + 12.195618728434093, + 50.293171839621934 + ], + [ + 12.201344718816681, + 50.30895158700697 + ], + [ + 12.198275254020281, + 50.3073539952074 + ], + [ + 12.186792283139079, + 50.311678516288055 + ], + [ + 12.182583914080007, + 50.31761820965464 + ], + [ + 12.184453107524524, + 50.32232471696687 + ], + [ + 12.146816566272216, + 50.32180342792833 + ], + [ + 12.125397097870085, + 50.315441343245844 + ], + [ + 12.11633921412099, + 50.315902578036315 + ], + [ + 12.115481008066904, + 50.320471858534255 + ], + [ + 12.106470859769695, + 50.3225331865454 + ], + [ + 12.100900370378817, + 50.31802824256751 + ], + [ + 12.097982065509507, + 50.323031010542294 + ], + [ + 12.090346649753673, + 50.32425138357599 + ], + [ + 12.09134337713328, + 50.332609686326485 + ], + [ + 12.079892805989026, + 50.3268347351348 + ], + [ + 12.064216203920694, + 50.33303947493338 + ], + [ + 12.06162463772534, + 50.32893158000119 + ], + [ + 12.055871959775626, + 50.33165342469973 + ], + [ + 12.057774674307634, + 50.326272930200695 + ], + [ + 12.046435516247806, + 50.33115090308746 + ], + [ + 12.046851905299903, + 50.32499865562854 + ], + [ + 12.038908486920167, + 50.336579681486064 + ], + [ + 12.041828093408398, + 50.33097059892982 + ], + [ + 12.032156904671988, + 50.33007138153239 + ], + [ + 12.030884272090143, + 50.339314739808245 + ], + [ + 12.01941200484044, + 50.340412746976675 + ], + [ + 12.014775570656957, + 50.347560121457064 + ], + [ + 11.997250745961422, + 50.34689452466442 + ], + [ + 11.996971074793862, + 50.35401666559049 + ], + [ + 11.982282317267007, + 50.349878402996175 + ], + [ + 11.976043698084087, + 50.35229268648996 + ], + [ + 11.982554633420019, + 50.356666571492624 + ], + [ + 11.980682143296416, + 50.36159816010363 + ], + [ + 11.97651228391347, + 50.36194463245782 + ], + [ + 11.984773225624329, + 50.36469550379607 + ], + [ + 11.978960912993292, + 50.36949473587759 + ], + [ + 11.98469165525384, + 50.375414425841505 + ], + [ + 11.978598767864973, + 50.380004477603414 + ], + [ + 11.98394319733373, + 50.38870713396207 + ], + [ + 11.974696373427879, + 50.39054495899452 + ], + [ + 11.964572061961299, + 50.39993463459815 + ], + [ + 11.96025004332513, + 50.39541793822294 + ], + [ + 11.95723275995496, + 50.39707807310949 + ], + [ + 11.949376884998236, + 50.394808534372004 + ], + [ + 11.948070278726545, + 50.400377545335076 + ], + [ + 11.954374086543748, + 50.40707448065018 + ], + [ + 11.943573577439407, + 50.41225100452925 + ], + [ + 11.945645080925528, + 50.4162827721736 + ], + [ + 11.934729681085726, + 50.42366379413086 + ], + [ + 11.929779765408746, + 50.42116961277824 + ], + [ + 11.91932285986418, + 50.42472776368945 + ], + [ + 11.927800470443163, + 50.43251523463007 + ], + [ + 11.90815516250408, + 50.436581906462294 + ], + [ + 11.906008499029626, + 50.43425561857066 + ], + [ + 11.903838153809248, + 50.43671499774452 + ], + [ + 11.899640956702497, + 50.43524753804625 + ], + [ + 11.888509460621743, + 50.44360591298987 + ], + [ + 11.894706067149222, + 50.44405482609147 + ], + [ + 11.894996787009193, + 50.44945794797792 + ], + [ + 11.904939531102817, + 50.454376613981246 + ], + [ + 11.919033658298149, + 50.45432079082774 + ], + [ + 11.920343521034823, + 50.460052145064694 + ], + [ + 11.927659655455354, + 50.45924736980572 + ], + [ + 11.931895131475107, + 50.46422276661048 + ], + [ + 11.936293143065361, + 50.45908287822338 + ], + [ + 11.950797995930966, + 50.45406897806354 + ], + [ + 11.942791292914094, + 50.459577339740456 + ], + [ + 11.948392802086698, + 50.465360238033334 + ], + [ + 11.943664397214057, + 50.46444812284338 + ], + [ + 11.943996426528368, + 50.471105659144904 + ], + [ + 11.937693008062011, + 50.471691943954745 + ], + [ + 11.946489442314865, + 50.47936051300139 + ], + [ + 11.959231112825375, + 50.478674600661975 + ], + [ + 11.964228503148322, + 50.4869626004516 + ], + [ + 11.943813274279966, + 50.50561478220009 + ], + [ + 11.939936731207041, + 50.50299047430753 + ], + [ + 11.933976412729082, + 50.50603453689719 + ], + [ + 11.93022859703953, + 50.51293649521619 + ], + [ + 11.93293169950856, + 50.52125632533005 + ], + [ + 11.925251274948227, + 50.52631910200815 + ], + [ + 11.918915883108015, + 50.52238673739341 + ], + [ + 11.918338054841612, + 50.525508269571326 + ], + [ + 11.915851090515737, + 50.5245180420302 + ], + [ + 11.918460470332935, + 50.51698059830353 + ], + [ + 11.888217853047898, + 50.51667864064725 + ], + [ + 11.871462575392819, + 50.53982273998307 + ], + [ + 11.885209238664794, + 50.55194169008261 + ], + [ + 11.913725025520154, + 50.55559153511153 + ], + [ + 11.91770676637304, + 50.56066327045568 + ], + [ + 11.920462122216328, + 50.55555380516839 + ], + [ + 11.926010670402864, + 50.55684426945417 + ], + [ + 11.923149416259362, + 50.560776274443654 + ], + [ + 11.933676233412449, + 50.568524968930845 + ], + [ + 11.923565975605475, + 50.58570803210718 + ], + [ + 11.93596114006353, + 50.58744037636011 + ], + [ + 11.949715469654349, + 50.593897460062244 + ], + [ + 11.9599651216343, + 50.60445467594391 + ], + [ + 11.966204866891742, + 50.59982563109225 + ], + [ + 11.986749819522815, + 50.609484847629 + ], + [ + 11.979268786630927, + 50.62141017779235 + ], + [ + 11.998724671322918, + 50.62713562912433 + ], + [ + 12.003938001174694, + 50.63482545981212 + ], + [ + 12.010397047826531, + 50.63546120720159 + ], + [ + 12.022117527332375, + 50.62553982210933 + ], + [ + 12.012438474510956, + 50.620702337888446 + ], + [ + 12.00548190385253, + 50.61201867774107 + ], + [ + 12.020970313634002, + 50.59855293638082 + ], + [ + 12.031294675712365, + 50.59820714184352 + ], + [ + 12.035007982811127, + 50.59459403104193 + ], + [ + 12.031110192973616, + 50.5819034265453 + ], + [ + 12.035634272106865, + 50.58136535787946 + ], + [ + 12.017535478051487, + 50.56784079074392 + ], + [ + 12.030989895253288, + 50.55777623436533 + ], + [ + 12.032204222033352, + 50.55500114421855 + ], + [ + 12.028347435020162, + 50.553860463147636 + ], + [ + 12.03365185143739, + 50.55321411853689 + ], + [ + 12.030271919844902, + 50.54939778663634 + ], + [ + 12.041216178079178, + 50.55353817652085 + ], + [ + 12.052068202946751, + 50.55096098245605 + ], + [ + 12.065494375492003, + 50.55581940509609 + ], + [ + 12.072689715876397, + 50.555118596416854 + ], + [ + 12.07696840261547, + 50.5592630481337 + ], + [ + 12.078117392269785, + 50.576589695463895 + ], + [ + 12.083594331171394, + 50.57856673829927 + ], + [ + 12.10151776384026, + 50.578940386872304 + ], + [ + 12.115772821189909, + 50.56694834639198 + ], + [ + 12.122792036613255, + 50.56753566375795 + ], + [ + 12.127654065660158, + 50.57412899446228 + ], + [ + 12.156024276839375, + 50.5734915255999 + ], + [ + 12.160679028777025, + 50.58040857346755 + ], + [ + 12.15609217798892, + 50.58557908431453 + ], + [ + 12.151598610302132, + 50.58344577505296 + ], + [ + 12.144832258936171, + 50.58574002031002 + ], + [ + 12.135191115985162, + 50.58213368942595 + ], + [ + 12.12636992726076, + 50.58400131312261 + ], + [ + 12.132649086505221, + 50.587741679876245 + ], + [ + 12.124724022766046, + 50.58442452398657 + ], + [ + 12.110150854538343, + 50.588720041827514 + ], + [ + 12.11592208137294, + 50.59741420397682 + ], + [ + 12.147222144775949, + 50.606097919258694 + ], + [ + 12.145226950397477, + 50.60973703713057 + ], + [ + 12.15082609694121, + 50.615602165819794 + ], + [ + 12.145710757123512, + 50.621428202383235 + ], + [ + 12.1498896509198, + 50.62880250067276 + ], + [ + 12.17044187562045, + 50.629234700836314 + ], + [ + 12.178135353096609, + 50.61864891419767 + ], + [ + 12.174721624452955, + 50.6145138805366 + ], + [ + 12.182766475238678, + 50.61211060156897 + ], + [ + 12.190751568538019, + 50.614423303584374 + ], + [ + 12.188191104420255, + 50.62311895220156 + ], + [ + 12.199690156500404, + 50.63293187511698 + ], + [ + 12.198197471157458, + 50.64131480940935 + ], + [ + 12.207544905798166, + 50.63993512512825 + ], + [ + 12.2073430835159, + 50.63673409865842 + ], + [ + 12.217238712004331, + 50.63374350638468 + ], + [ + 12.216758805327125, + 50.63146462284012 + ], + [ + 12.226448312658897, + 50.629835289531265 + ], + [ + 12.230825128526682, + 50.63263185811867 + ], + [ + 12.232812278382797, + 50.62706702790605 + ], + [ + 12.244589410921849, + 50.63374121139517 + ], + [ + 12.265518391214226, + 50.630793342108774 + ], + [ + 12.264286262044754, + 50.643385439697795 + ], + [ + 12.281318076592116, + 50.64455306760428 + ], + [ + 12.280422546954888, + 50.64707992978598 + ], + [ + 12.298894858770078, + 50.65168210032576 + ], + [ + 12.303543696917997, + 50.66225610397235 + ], + [ + 12.317610091231913, + 50.66348495930745 + ], + [ + 12.314006047014171, + 50.67095781173015 + ], + [ + 12.322048411769533, + 50.68143383574602 + ], + [ + 12.3188962528271, + 50.684003177549506 + ], + [ + 12.30853701807428, + 50.68260884368434 + ], + [ + 12.296887840945374, + 50.686543446330276 + ], + [ + 12.27476180468423, + 50.68611728390504 + ], + [ + 12.262762317854543, + 50.69527646211873 + ], + [ + 12.264900656772062, + 50.70369923263243 + ], + [ + 12.253382117398033, + 50.71570452703789 + ], + [ + 12.273430219359645, + 50.72820205793254 + ], + [ + 12.26475665818875, + 50.737546887240455 + ], + [ + 12.237913783983608, + 50.73302577912727 + ], + [ + 12.226984634304793, + 50.73821847663839 + ], + [ + 12.228688048858753, + 50.757452785872964 + ], + [ + 12.24068973496202, + 50.76724012519951 + ], + [ + 12.263920928737159, + 50.76045602532102 + ], + [ + 12.2840497063273, + 50.77346766943701 + ], + [ + 12.290160811939122, + 50.783427090357094 + ], + [ + 12.28764435335465, + 50.789643325378044 + ], + [ + 12.267571982540677, + 50.7873278462227 + ], + [ + 12.25315365652795, + 50.788834763196746 + ], + [ + 12.254849013455141, + 50.79505915614306 + ], + [ + 12.250176663506531, + 50.79910172797406 + ], + [ + 12.253483552299238, + 50.79950899466119 + ], + [ + 12.242835373458027, + 50.80906045529585 + ], + [ + 12.250825381385155, + 50.8183182609222 + ], + [ + 12.25975806546009, + 50.81145106119953 + ], + [ + 12.275035491048383, + 50.81363880214651 + ], + [ + 12.27265946121579, + 50.816389802083165 + ], + [ + 12.276981907793898, + 50.817859631523795 + ], + [ + 12.279862918887405, + 50.80970437705079 + ], + [ + 12.286074759573633, + 50.81187393294817 + ], + [ + 12.289715311711575, + 50.82396523567385 + ], + [ + 12.295668692757799, + 50.81690079405526 + ], + [ + 12.302356116102823, + 50.81719718267931 + ], + [ + 12.295908167457643, + 50.8283306039888 + ], + [ + 12.298583556347864, + 50.82990021984161 + ], + [ + 12.306948010334269, + 50.81876300202403 + ], + [ + 12.347576712059668, + 50.8236315072143 + ], + [ + 12.348316869658724, + 50.83753494003145 + ], + [ + 12.374856029839458, + 50.84882574441568 + ], + [ + 12.374132737026166, + 50.853249230262094 + ], + [ + 12.378388545323215, + 50.85371150035287 + ], + [ + 12.377031700998726, + 50.84904778577367 + ], + [ + 12.402949550699624, + 50.84922606327097 + ], + [ + 12.407294628738665, + 50.85681358442391 + ], + [ + 12.415189608292337, + 50.85653965469757 + ], + [ + 12.418055649068645, + 50.85540733597923 + ], + [ + 12.411585512461148, + 50.84738245496991 + ], + [ + 12.420206496379745, + 50.83958970667391 + ], + [ + 12.429327591731493, + 50.844161319087426 + ], + [ + 12.43745292019283, + 50.842417403743575 + ], + [ + 12.442501814851576, + 50.8440273940196 + ], + [ + 12.44112721978881, + 50.84939454926638 + ], + [ + 12.448249614336492, + 50.85616979203911 + ], + [ + 12.44415211321811, + 50.8625839225322 + ], + [ + 12.448356980378781, + 50.867448333466115 + ], + [ + 12.464025532864305, + 50.87012522141868 + ], + [ + 12.459254289335727, + 50.88044858282062 + ], + [ + 12.482190588703268, + 50.88867633939635 + ], + [ + 12.480235570907992, + 50.89051004724409 + ], + [ + 12.485245806451939, + 50.89356810126912 + ], + [ + 12.487004290253985, + 50.89136616042416 + ], + [ + 12.511120449669924, + 50.89409886972997 + ], + [ + 12.507862731332803, + 50.903729035752036 + ], + [ + 12.52132239465282, + 50.9075985257802 + ], + [ + 12.525261426168852, + 50.90265563791875 + ], + [ + 12.53819115857687, + 50.90068640705213 + ], + [ + 12.560227495998427, + 50.90613726888537 + ], + [ + 12.573426149242943, + 50.90107806013458 + ], + [ + 12.584735254996883, + 50.904020784468706 + ], + [ + 12.614800867811892, + 50.90480507421591 + ], + [ + 12.620061668555538, + 50.90938146414057 + ], + [ + 12.640121044576528, + 50.90307378192895 + ], + [ + 12.641274410469142, + 50.911423751008705 + ], + [ + 12.65411508943602, + 50.91906273747016 + ], + [ + 12.65286573951243, + 50.92367790176926 + ], + [ + 12.64166261094832, + 50.928807092748514 + ], + [ + 12.642232822341976, + 50.93316777632598 + ], + [ + 12.637630069289704, + 50.93310286562176 + ], + [ + 12.631443609908153, + 50.94014733799314 + ], + [ + 12.624357314839504, + 50.93970986694533 + ], + [ + 12.63011274886899, + 50.94250303056217 + ], + [ + 12.62128878362046, + 50.97577059377081 + ], + [ + 12.616431422986164, + 50.985281876232406 + ], + [ + 12.60731070163954, + 50.99082004248076 + ], + [ + 12.607533973536182, + 50.996731763280934 + ], + [ + 12.601193638279133, + 50.992731000518 + ], + [ + 12.581021526381035, + 50.989235077050296 + ], + [ + 12.57929313317946, + 50.98514208773737 + ], + [ + 12.583653251989324, + 50.98157176053639 + ], + [ + 12.572780190762401, + 50.99023938234264 + ], + [ + 12.555758809307333, + 50.997485504579025 + ], + [ + 12.528349485049375, + 50.99828032972515 + ], + [ + 12.526451553965302, + 51.00148547911937 + ], + [ + 12.540180375574021, + 51.005732581288775 + ], + [ + 12.534771484209587, + 51.01562931900916 + ], + [ + 12.538852057512976, + 51.02425203615404 + ], + [ + 12.518903840009319, + 51.02286481220912 + ], + [ + 12.518156393959092, + 51.02734922937654 + ], + [ + 12.514368601913642, + 51.02687660692161 + ], + [ + 12.516332786297014, + 51.01821992156845 + ], + [ + 12.50738816629394, + 51.017275888204914 + ], + [ + 12.51245151820393, + 51.026419072383064 + ], + [ + 12.502893944610813, + 51.03489967928183 + ], + [ + 12.501925594079015, + 51.05172585782623 + ], + [ + 12.508575942200043, + 51.053062825156374 + ], + [ + 12.504459791262232, + 51.0607910194548 + ], + [ + 12.496357871274412, + 51.06624660628083 + ], + [ + 12.46946768878317, + 51.064217454560676 + ], + [ + 12.467989081023724, + 51.067843082834464 + ], + [ + 12.462914728511446, + 51.0668998018591 + ], + [ + 12.458382880279835, + 51.08455071069888 + ], + [ + 12.45309760985909, + 51.0834614479458 + ], + [ + 12.450744658636452, + 51.077305766130166 + ], + [ + 12.42097553122257, + 51.0781425126888 + ], + [ + 12.410448215750922, + 51.072854818392344 + ], + [ + 12.392957993334875, + 51.08411550098767 + ], + [ + 12.385582747969003, + 51.08349191042557 + ], + [ + 12.384721918150637, + 51.08029249363222 + ], + [ + 12.375320058425695, + 51.077113861210876 + ], + [ + 12.361026050445846, + 51.079799734157824 + ], + [ + 12.35361756363398, + 51.08460672791654 + ], + [ + 12.35658007109189, + 51.09434281994084 + ], + [ + 12.333829532710734, + 51.10344148702679 + ], + [ + 12.321574237181146, + 51.094615270665656 + ], + [ + 12.311462662108278, + 51.093710602575726 + ], + [ + 12.304828430806154, + 51.097484484031106 + ], + [ + 12.28781406011167, + 51.09077452296353 + ], + [ + 12.278635786898578, + 51.09496689166457 + ], + [ + 12.278574707402854, + 51.09928261675148 + ], + [ + 12.262774724329377, + 51.10029374472799 + ], + [ + 12.25308424634908, + 51.09726786855422 + ], + [ + 12.241182952832485, + 51.10298940518647 + ], + [ + 12.230358899156483, + 51.103607495872296 + ], + [ + 12.22119853979302, + 51.10991491225043 + ], + [ + 12.224590416806617, + 51.11932294072223 + ], + [ + 12.220555540727812, + 51.12303893389853 + ], + [ + 12.229073593130298, + 51.12022818918007 + ], + [ + 12.24163764054788, + 51.130704687326364 + ], + [ + 12.230142987937736, + 51.1361989371394 + ], + [ + 12.196192448785222, + 51.141907463460555 + ], + [ + 12.197153576835836, + 51.159910726055436 + ], + [ + 12.201673509193494, + 51.16139295802766 + ], + [ + 12.206261308962617, + 51.17129766431547 + ], + [ + 12.211568925003757, + 51.17236305361674 + ], + [ + 12.208490888551607, + 51.176232895038034 + ], + [ + 12.213084091207062, + 51.183500389315796 + ], + [ + 12.193403872763943, + 51.185307875532715 + ], + [ + 12.174844207819845, + 51.18132731377262 + ], + [ + 12.173678394669606, + 51.19025349677693 + ], + [ + 12.187184697267913, + 51.191463419982355 + ], + [ + 12.185597683416841, + 51.19428514433429 + ], + [ + 12.191795201129603, + 51.19573461347851 + ], + [ + 12.189590359173254, + 51.20398302866076 + ], + [ + 12.205066147449196, + 51.21418003889827 + ], + [ + 12.198109073815424, + 51.21670204325019 + ], + [ + 12.195589210062305, + 51.2236178389084 + ], + [ + 12.192076362489816, + 51.23693234642473 + ], + [ + 12.199492025193154, + 51.2384189072837 + ], + [ + 12.193153823690844, + 51.24139638864074 + ], + [ + 12.189389323838613, + 51.25762272707729 + ], + [ + 12.173679004374614, + 51.25826217342784 + ], + [ + 12.173311286272853, + 51.26631285718555 + ], + [ + 12.166101471281362, + 51.26607361048297 + ], + [ + 12.17225509320162, + 51.28568078047488 + ], + [ + 12.168947866928875, + 51.293756876902734 + ], + [ + 12.157403368488655, + 51.292276896756896 + ], + [ + 12.157626829263922, + 51.30208292920037 + ], + [ + 12.147653576038541, + 51.31996708921038 + ], + [ + 12.164778818797567, + 51.32083505497898 + ], + [ + 12.166825671614927, + 51.32680761574151 + ], + [ + 12.194455127251327, + 51.33032636322133 + ], + [ + 12.190255660128159, + 51.35135930752059 + ], + [ + 12.195523739007262, + 51.35439776917153 + ], + [ + 12.195756783548568, + 51.359728318125704 + ], + [ + 12.186085325319237, + 51.3621290694928 + ], + [ + 12.185632465420001, + 51.365964290570204 + ], + [ + 12.193670708040747, + 51.36915257130123 + ], + [ + 12.192879207218756, + 51.37147678054607 + ], + [ + 12.18175629356454, + 51.368510592878444 + ], + [ + 12.182767859207347, + 51.374519815366206 + ], + [ + 12.189499480456526, + 51.37551401985313 + ], + [ + 12.189963637190342, + 51.37945034604784 + ], + [ + 12.177744542309757, + 51.37516761766891 + ], + [ + 12.172143856819511, + 51.38415769562212 + ], + [ + 12.1848279043405, + 51.387584077506716 + ], + [ + 12.178139364240069, + 51.389146655091515 + ], + [ + 12.173532762032535, + 51.41025697380127 + ], + [ + 12.183202535273855, + 51.41077112648058 + ], + [ + 12.189822026032502, + 51.42085370490039 + ], + [ + 12.185858093463464, + 51.42079406671999 + ], + [ + 12.182482341410092, + 51.43237922122134 + ], + [ + 12.171032337310857, + 51.43423427401332 + ], + [ + 12.16955093614703, + 51.4303137416308 + ], + [ + 12.157213532728811, + 51.432710983709995 + ], + [ + 12.1576317486267, + 51.44430476355283 + ], + [ + 12.154219212580621, + 51.44438525824736 + ], + [ + 12.1583910013481, + 51.44598233782295 + ], + [ + 12.158256603662172, + 51.45124314834441 + ], + [ + 12.153139176264595, + 51.452461230598146 + ], + [ + 12.14858311748122, + 51.46312520609331 + ], + [ + 12.175521037797294, + 51.4696804312859 + ], + [ + 12.175704999784388, + 51.48222232884624 + ], + [ + 12.203081768668046, + 51.48514114836036 + ], + [ + 12.200995314006873, + 51.49029172667167 + ], + [ + 12.207017590165604, + 51.49206414063081 + ], + [ + 12.207896626212433, + 51.502592431773216 + ], + [ + 12.197347562641726, + 51.50286115666198 + ], + [ + 12.19634619112569, + 51.50673275297872 + ], + [ + 12.190395223046494, + 51.50776728473133 + ], + [ + 12.193843726712409, + 51.50839734233194 + ], + [ + 12.19276574469422, + 51.53129860519423 + ], + [ + 12.201940622934352, + 51.531331170765164 + ], + [ + 12.210126727818869, + 51.54192136023238 + ], + [ + 12.222170761136546, + 51.54444571360858 + ], + [ + 12.219018222742069, + 51.54651416052642 + ], + [ + 12.231345874093796, + 51.54734569909685 + ], + [ + 12.230049516803744, + 51.55282534190643 + ], + [ + 12.236045529647633, + 51.552971194909006 + ], + [ + 12.232903894183295, + 51.56112541188742 + ], + [ + 12.243210899206863, + 51.566876046106515 + ], + [ + 12.250477898885697, + 51.55894912341902 + ], + [ + 12.293179327993393, + 51.56055742874507 + ], + [ + 12.297223659328987, + 51.56666744671335 + ], + [ + 12.3132595518303, + 51.56849602534461 + ], + [ + 12.320559363271325, + 51.57467151346882 + ], + [ + 12.31937502348116, + 51.5775784964813 + ], + [ + 12.340912786334277, + 51.57980917550523 + ], + [ + 12.343618404647417, + 51.58258062096127 + ], + [ + 12.3369770406057, + 51.586227166360246 + ], + [ + 12.367681179826706, + 51.583087183753385 + ], + [ + 12.374514487555743, + 51.584517702194326 + ], + [ + 12.366856399045744, + 51.58801381360616 + ], + [ + 12.381600716476804, + 51.585412841567695 + ], + [ + 12.39225631190005, + 51.585629426664006 + ], + [ + 12.391780965670502, + 51.5877608834149 + ], + [ + 12.411419588246673, + 51.58200881158112 + ], + [ + 12.425419164615404, + 51.582131379846324 + ], + [ + 12.427328904288046, + 51.59929886305482 + ], + [ + 12.43682318480013, + 51.59930545075035 + ], + [ + 12.43331281676687, + 51.60583356037513 + ], + [ + 12.438386677852602, + 51.60517439989808 + ], + [ + 12.443962411444506, + 51.609870406877825 + ], + [ + 12.460575958579968, + 51.603260070616194 + ], + [ + 12.486373584471188, + 51.604277731039744 + ], + [ + 12.487185422458152, + 51.60100622430896 + ], + [ + 12.477139906925494, + 51.59627915335608 + ], + [ + 12.482988089637198, + 51.5931841868606 + ], + [ + 12.490097469126395, + 51.5982025284783 + ], + [ + 12.497458606646818, + 51.596563776053884 + ], + [ + 12.495024223011429, + 51.60413185579856 + ], + [ + 12.50354035161842, + 51.6045456051614 + ], + [ + 12.507006969621692, + 51.60845555414171 + ], + [ + 12.515764083245024, + 51.60578645942191 + ], + [ + 12.534479693513607, + 51.606086389707414 + ], + [ + 12.541445247252131, + 51.60250124241974 + ], + [ + 12.544638133690263, + 51.60371330342661 + ], + [ + 12.541712291320364, + 51.60743628966738 + ], + [ + 12.55997963315104, + 51.60851910468582 + ], + [ + 12.562831478024236, + 51.61375557860559 + ], + [ + 12.570270618858684, + 51.61688286710055 + ], + [ + 12.574703163069852, + 51.615433494120616 + ], + [ + 12.580262793397232, + 51.62606533340991 + ], + [ + 12.595492826599253, + 51.61838104576868 + ], + [ + 12.604530296224755, + 51.62624984012853 + ], + [ + 12.624168775694534, + 51.627984238898655 + ], + [ + 12.629228985283145, + 51.62523564653812 + ], + [ + 12.622360137371977, + 51.61644618154687 + ], + [ + 12.608332217827156, + 51.61060204113691 + ], + [ + 12.649112655461325, + 51.62044632617914 + ], + [ + 12.648732249663965, + 51.62505386845759 + ], + [ + 12.665845260059738, + 51.63159937596659 + ], + [ + 12.666523746808258, + 51.64222535155854 + ], + [ + 12.688199108253956, + 51.66242329432536 + ], + [ + 12.716843228273945, + 51.66131351668224 + ], + [ + 12.740164505958704, + 51.655554619342794 + ], + [ + 12.749936275375076, + 51.65005877204912 + ], + [ + 12.760090289181296, + 51.64969423478156 + ], + [ + 12.764607835739428, + 51.64656534886926 + ], + [ + 12.772706245802983, + 51.647509053044715 + ], + [ + 12.792533530530514, + 51.665500814127405 + ], + [ + 12.807350820041345, + 51.66733072332985 + ], + [ + 12.831806999388267, + 51.67602244359318 + ], + [ + 12.827882306837596, + 51.68224717999581 + ], + [ + 12.845984828659287, + 51.68354157202188 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "15", + "AGS": "15", + "SDV_RS": "150030000000", + "GEN": "Sachsen-Anhalt", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "15", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEE", + "RS_0": "150000000000", + "AGS_0": "15000000", + "WSK": "2014/02/01", + "DEBKG_ID": "DEBKGDL20000E66C", + "destatis": { + "population": 2235548, + "population_m": 1095797, + "population_w": 1139751 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 11.626327035647721, + 53.01264736889982 + ], + [ + 11.644667587132226, + 53.005484144861384 + ], + [ + 11.667996035986475, + 53.00951553578221 + ], + [ + 11.67803865780961, + 53.00766566437223 + ], + [ + 11.68405775948904, + 52.999740238488044 + ], + [ + 11.68302479468409, + 52.986155808514965 + ], + [ + 11.692852016272282, + 52.978174760279074 + ], + [ + 11.702569301829193, + 52.9778094776993 + ], + [ + 11.731284184360414, + 52.98837498762842 + ], + [ + 11.742989968775428, + 52.98871467784947 + ], + [ + 11.764192987041746, + 52.981411403690856 + ], + [ + 11.786303885337125, + 52.96095827329932 + ], + [ + 11.828901276089043, + 52.957273415315754 + ], + [ + 11.84205842590816, + 52.95368471248401 + ], + [ + 11.8489864707736, + 52.94845591327139 + ], + [ + 11.848736933671058, + 52.94220045274548 + ], + [ + 11.824567136008048, + 52.92582222620219 + ], + [ + 11.826034257711651, + 52.914656395444354 + ], + [ + 11.839290532837461, + 52.90930483922385 + ], + [ + 11.873351919310736, + 52.908367450363286 + ], + [ + 11.897335379673766, + 52.89336244213151 + ], + [ + 11.932252961044343, + 52.891578948669796 + ], + [ + 11.948984159189415, + 52.887675786137855 + ], + [ + 11.959444743488724, + 52.879927577735565 + ], + [ + 11.98049780113317, + 52.876113550339824 + ], + [ + 11.9872514468321, + 52.876732490891996 + ], + [ + 11.990478383073985, + 52.88121615975248 + ], + [ + 12.005318257413709, + 52.88179761247011 + ], + [ + 12.006119543033558, + 52.887461929055526 + ], + [ + 12.022614192869284, + 52.890370255726936 + ], + [ + 12.042999626589564, + 52.88885315254452 + ], + [ + 12.048152622751392, + 52.88591360424143 + ], + [ + 12.060866136048112, + 52.88816821009722 + ], + [ + 12.067544846557961, + 52.886140754308684 + ], + [ + 12.066279895330126, + 52.883730176009045 + ], + [ + 12.076475091501278, + 52.88639642260409 + ], + [ + 12.081383321547447, + 52.87708187887076 + ], + [ + 12.112623069406578, + 52.875729089964665 + ], + [ + 12.12460126973499, + 52.89358590863163 + ], + [ + 12.12848543364625, + 52.89264882565125 + ], + [ + 12.122621711722227, + 52.88850154815941 + ], + [ + 12.120213078458454, + 52.87551391386617 + ], + [ + 12.133116362666728, + 52.865776104580284 + ], + [ + 12.123714704186419, + 52.853795833592955 + ], + [ + 12.172189499431763, + 52.86470204190685 + ], + [ + 12.196936529282945, + 52.877977988869965 + ], + [ + 12.209983285712687, + 52.86239890974587 + ], + [ + 12.214056297757411, + 52.861667017525725 + ], + [ + 12.217391246646462, + 52.86598448025942 + ], + [ + 12.234056795536333, + 52.85937765159255 + ], + [ + 12.231875311983282, + 52.850667333859434 + ], + [ + 12.239683487005781, + 52.843675833484866 + ], + [ + 12.243628645155779, + 52.820775937743896 + ], + [ + 12.257536445150642, + 52.8049084834972 + ], + [ + 12.252488902627709, + 52.80373139458311 + ], + [ + 12.255581054301748, + 52.798596277118136 + ], + [ + 12.24772412924004, + 52.79651529449702 + ], + [ + 12.244659899848102, + 52.7872239781188 + ], + [ + 12.220176401694543, + 52.79012795745391 + ], + [ + 12.22351087518648, + 52.775843639087626 + ], + [ + 12.213132486056805, + 52.77360741864765 + ], + [ + 12.214868623451022, + 52.76399555943679 + ], + [ + 12.205958399174424, + 52.76091054411791 + ], + [ + 12.209433000658967, + 52.75292906776943 + ], + [ + 12.219447051074344, + 52.75091493781765 + ], + [ + 12.218424184082062, + 52.74352921599894 + ], + [ + 12.223168685716473, + 52.739747334438896 + ], + [ + 12.201294289439115, + 52.72900380543974 + ], + [ + 12.20595688818834, + 52.72651395448671 + ], + [ + 12.197548537434837, + 52.71837503216739 + ], + [ + 12.204802978903729, + 52.7198248466666 + ], + [ + 12.20984355281787, + 52.71762218676044 + ], + [ + 12.204085269093564, + 52.71344021681322 + ], + [ + 12.224185487922409, + 52.70278538937893 + ], + [ + 12.217541892486542, + 52.69982185309293 + ], + [ + 12.220878965638907, + 52.6904391851823 + ], + [ + 12.232876671190034, + 52.68904403594657 + ], + [ + 12.22681230582181, + 52.683797161115656 + ], + [ + 12.23538145959315, + 52.68036463829323 + ], + [ + 12.239352075635956, + 52.67173600908181 + ], + [ + 12.232523801597006, + 52.65361139226862 + ], + [ + 12.23789010457373, + 52.64555626293642 + ], + [ + 12.236677148475703, + 52.64097750376061 + ], + [ + 12.231001579714828, + 52.63988964409219 + ], + [ + 12.230845915072923, + 52.62975502832286 + ], + [ + 12.236872557387432, + 52.628877018049685 + ], + [ + 12.212648480757704, + 52.625099895475415 + ], + [ + 12.20353703951854, + 52.61874612424342 + ], + [ + 12.171973707327512, + 52.62593395122532 + ], + [ + 12.169133257831296, + 52.616753928602265 + ], + [ + 12.175568365917501, + 52.61733042238184 + ], + [ + 12.170287782809515, + 52.60769850420664 + ], + [ + 12.176565309591696, + 52.606469207901796 + ], + [ + 12.173384733153195, + 52.582254893631735 + ], + [ + 12.181078091048464, + 52.575177083102425 + ], + [ + 12.159060053459925, + 52.56069452167769 + ], + [ + 12.141811422902686, + 52.52839423804555 + ], + [ + 12.154636380025151, + 52.529696391808066 + ], + [ + 12.158198181666338, + 52.53421666404987 + ], + [ + 12.173888411752207, + 52.53869239761824 + ], + [ + 12.179603896482448, + 52.53366350788512 + ], + [ + 12.188689499358894, + 52.53242277859245 + ], + [ + 12.167294830523584, + 52.514985406617086 + ], + [ + 12.170367014375936, + 52.506974819882664 + ], + [ + 12.184730556848118, + 52.49604260304967 + ], + [ + 12.190584762907953, + 52.49886601605432 + ], + [ + 12.202723719928064, + 52.49754365627698 + ], + [ + 12.211499985839374, + 52.50313123239177 + ], + [ + 12.221679469669168, + 52.50066541673264 + ], + [ + 12.227764066073686, + 52.50594845673047 + ], + [ + 12.22399820624656, + 52.511525453582486 + ], + [ + 12.235559416666307, + 52.52378183113772 + ], + [ + 12.246767471591996, + 52.51886145785753 + ], + [ + 12.258216197437026, + 52.51788539938599 + ], + [ + 12.25992174429509, + 52.50423264272382 + ], + [ + 12.270083395973176, + 52.50099835866717 + ], + [ + 12.262451996972239, + 52.49547016028787 + ], + [ + 12.270005176112736, + 52.49367108555585 + ], + [ + 12.271445310455395, + 52.487480836304165 + ], + [ + 12.27845001580256, + 52.48714910906327 + ], + [ + 12.286198439462177, + 52.49257520487434 + ], + [ + 12.293906418194583, + 52.4922607184812 + ], + [ + 12.297479052311655, + 52.496177393067356 + ], + [ + 12.310129229655926, + 52.490761310945985 + ], + [ + 12.330383932113609, + 52.49636731679153 + ], + [ + 12.327666001761674, + 52.491412766198465 + ], + [ + 12.315872577980496, + 52.49059265172673 + ], + [ + 12.30936124324888, + 52.486264840672234 + ], + [ + 12.308728688376352, + 52.47897892842061 + ], + [ + 12.315935042392613, + 52.47502032609106 + ], + [ + 12.33078152882971, + 52.478555663336195 + ], + [ + 12.325116194381959, + 52.464230586935955 + ], + [ + 12.315081151821952, + 52.460460210532425 + ], + [ + 12.316683685521115, + 52.45238484699951 + ], + [ + 12.304342700357411, + 52.45050151710541 + ], + [ + 12.303247387746636, + 52.44595709838621 + ], + [ + 12.307568268886431, + 52.44430900388483 + ], + [ + 12.302675222610283, + 52.43449313804071 + ], + [ + 12.289252413631598, + 52.43069493104431 + ], + [ + 12.29698963626266, + 52.42377807809482 + ], + [ + 12.274469663985256, + 52.41606189023258 + ], + [ + 12.274842409267956, + 52.41226760810093 + ], + [ + 12.292336439608787, + 52.40753710423069 + ], + [ + 12.299401275705398, + 52.409113794048 + ], + [ + 12.302325983568577, + 52.405012810843985 + ], + [ + 12.303291610383866, + 52.3975496648098 + ], + [ + 12.291807441306318, + 52.3861436086986 + ], + [ + 12.29426547362071, + 52.381419995424366 + ], + [ + 12.305989507663277, + 52.377433241511284 + ], + [ + 12.300648289569462, + 52.37108682833686 + ], + [ + 12.286094407070037, + 52.368876320111006 + ], + [ + 12.283811380958609, + 52.36425454467519 + ], + [ + 12.308127561583808, + 52.3446965302261 + ], + [ + 12.262765171239812, + 52.29507163079877 + ], + [ + 12.250944382099107, + 52.2725939560245 + ], + [ + 12.254671782980122, + 52.261885139018645 + ], + [ + 12.244460237494328, + 52.2480021129451 + ], + [ + 12.261547086238455, + 52.24598054295536 + ], + [ + 12.258007991738445, + 52.24315304066437 + ], + [ + 12.270510700832308, + 52.24176306995655 + ], + [ + 12.275263787841602, + 52.236273856707186 + ], + [ + 12.264238204974014, + 52.23688951265326 + ], + [ + 12.264532505102203, + 52.233547427158776 + ], + [ + 12.283780377259099, + 52.23451275846623 + ], + [ + 12.28688344331793, + 52.23010245512134 + ], + [ + 12.29727687736793, + 52.227545378528944 + ], + [ + 12.29302065346339, + 52.224037489531234 + ], + [ + 12.288915682831538, + 52.225439420433815 + ], + [ + 12.278827849246143, + 52.21704284949092 + ], + [ + 12.267584039534631, + 52.21418652978869 + ], + [ + 12.260424115877559, + 52.21649625392404 + ], + [ + 12.248402781724394, + 52.21092359086619 + ], + [ + 12.24524926251474, + 52.20738894093371 + ], + [ + 12.25367519150017, + 52.20564634401089 + ], + [ + 12.241800132657973, + 52.194277005977895 + ], + [ + 12.248291791998085, + 52.1842228728287 + ], + [ + 12.241560411200899, + 52.18198191657988 + ], + [ + 12.228585190869218, + 52.18598478100203 + ], + [ + 12.216783136632605, + 52.17006859908047 + ], + [ + 12.234003842275886, + 52.16279355776501 + ], + [ + 12.231304278786359, + 52.15495143505459 + ], + [ + 12.24532000747132, + 52.1387330147082 + ], + [ + 12.265110133867484, + 52.13065982268432 + ], + [ + 12.276724287658777, + 52.1040179784711 + ], + [ + 12.31582350805484, + 52.09237191436492 + ], + [ + 12.32903021777733, + 52.0696315893419 + ], + [ + 12.348085072708702, + 52.059296586610266 + ], + [ + 12.35977739545895, + 52.0465000846083 + ], + [ + 12.389599427215902, + 52.04356576771877 + ], + [ + 12.398216700103326, + 52.03564719093049 + ], + [ + 12.420203660078275, + 52.02652446855204 + ], + [ + 12.430227854088743, + 52.01830613611795 + ], + [ + 12.450002443909627, + 52.01621286212826 + ], + [ + 12.460757552456453, + 52.03472049809046 + ], + [ + 12.480615350524882, + 52.03333511456946 + ], + [ + 12.484955699945148, + 52.01714982865042 + ], + [ + 12.498826521926663, + 52.00892288762048 + ], + [ + 12.536306597743916, + 52.002880022150165 + ], + [ + 12.53939459126137, + 51.98488894227101 + ], + [ + 12.615160259789585, + 51.982281255243564 + ], + [ + 12.61439705616749, + 51.99172329359409 + ], + [ + 12.644748194772008, + 51.99437984780019 + ], + [ + 12.64859703211563, + 52.00831105159496 + ], + [ + 12.656502520719918, + 52.01293960542612 + ], + [ + 12.66918668387392, + 52.012880743008886 + ], + [ + 12.682521599501941, + 52.00332298581763 + ], + [ + 12.711938185679152, + 51.99986576339529 + ], + [ + 12.711672812068764, + 51.99727062909795 + ], + [ + 12.729640934286756, + 51.98896385893223 + ], + [ + 12.755476101537793, + 51.98639142679677 + ], + [ + 12.759246169112059, + 51.98217687818353 + ], + [ + 12.774325112894946, + 51.978359949445235 + ], + [ + 12.777612700373414, + 51.96459096390992 + ], + [ + 12.811265510476499, + 51.96256512954814 + ], + [ + 12.84415364266501, + 51.96773396747717 + ], + [ + 12.850254883510924, + 51.95869846941026 + ], + [ + 12.852730179074905, + 51.93500528871768 + ], + [ + 12.888171516864789, + 51.93476917900446 + ], + [ + 12.890424130433587, + 51.9283802482165 + ], + [ + 12.917461899024817, + 51.93269138596945 + ], + [ + 12.918371522969094, + 51.93935952995356 + ], + [ + 12.960567963268087, + 51.93491054143789 + ], + [ + 12.95597430532269, + 51.92265712044872 + ], + [ + 12.976535927759247, + 51.919863434192564 + ], + [ + 12.97266485223506, + 51.90088113948577 + ], + [ + 12.984991544854035, + 51.90413416720284 + ], + [ + 13.009739072887967, + 51.903020004899936 + ], + [ + 13.021779435201069, + 51.89685164720717 + ], + [ + 13.022773443464605, + 51.90323001453266 + ], + [ + 13.04540786142587, + 51.9005151060307 + ], + [ + 13.048537912096316, + 51.89186042965179 + ], + [ + 13.037566139257724, + 51.890881038619305 + ], + [ + 13.03729343246635, + 51.88025695083062 + ], + [ + 13.029163735935503, + 51.88104241225666 + ], + [ + 13.039239289923612, + 51.87091214592508 + ], + [ + 13.080548073399333, + 51.86747806574704 + ], + [ + 13.085005234340814, + 51.874016413567865 + ], + [ + 13.113554521452293, + 51.874700939109495 + ], + [ + 13.118706565663226, + 51.87693241832316 + ], + [ + 13.119075141753536, + 51.88282904014502 + ], + [ + 13.124465060179604, + 51.882948190987605 + ], + [ + 13.138950995718064, + 51.879512089043025 + ], + [ + 13.142228109559838, + 51.87255680749765 + ], + [ + 13.149604230062966, + 51.87233145580049 + ], + [ + 13.150932689892082, + 51.868926310215045 + ], + [ + 13.150913369212546, + 51.859610357795745 + ], + [ + 13.123477552741365, + 51.85782061801626 + ], + [ + 13.12353576619225, + 51.85459253928181 + ], + [ + 13.135552091289764, + 51.8328034630649 + ], + [ + 13.142163335312382, + 51.82858870806939 + ], + [ + 13.139141407549388, + 51.824692823139074 + ], + [ + 13.14208951463271, + 51.82065462265405 + ], + [ + 13.148523436781929, + 51.82054358954678 + ], + [ + 13.163011283424767, + 51.802017992809745 + ], + [ + 13.158470923538633, + 51.79761010436624 + ], + [ + 13.162691589576895, + 51.79306857213104 + ], + [ + 13.157994610740738, + 51.7884481519776 + ], + [ + 13.170103760554035, + 51.78702373534476 + ], + [ + 13.168708083228653, + 51.78277037472249 + ], + [ + 13.16003872287516, + 51.78392847697376 + ], + [ + 13.159798631379525, + 51.77459014806283 + ], + [ + 13.147481828775215, + 51.7666385313446 + ], + [ + 13.155834023475062, + 51.764570213960866 + ], + [ + 13.149842175867805, + 51.75932141262806 + ], + [ + 13.16329468627971, + 51.75493602736824 + ], + [ + 13.154010379840265, + 51.74424794604302 + ], + [ + 13.160751932385239, + 51.73986955076241 + ], + [ + 13.164127394114269, + 51.74188858453095 + ], + [ + 13.167154722020362, + 51.735384124736264 + ], + [ + 13.179535238506269, + 51.73117069611961 + ], + [ + 13.187071618765234, + 51.715624512949006 + ], + [ + 13.168685410620194, + 51.718669186175276 + ], + [ + 13.165479199108956, + 51.71755585808941 + ], + [ + 13.17010994387656, + 51.708086819031834 + ], + [ + 13.161730163841675, + 51.712974635858245 + ], + [ + 13.154208824278436, + 51.7107221108394 + ], + [ + 13.160818457239552, + 51.69916883921703 + ], + [ + 13.161264644451428, + 51.694985955298115 + ], + [ + 13.156144751281456, + 51.69472949900417 + ], + [ + 13.162459539467722, + 51.69181513163535 + ], + [ + 13.154528682259537, + 51.68670591578051 + ], + [ + 13.023467076016967, + 51.637303383580786 + ], + [ + 13.01785856630364, + 51.644346808800954 + ], + [ + 13.017520415933783, + 51.65996588175296 + ], + [ + 13.011863251323447, + 51.66465571922742 + ], + [ + 13.005058400432345, + 51.661787676162675 + ], + [ + 12.996291834807849, + 51.66924715497839 + ], + [ + 12.977719402904116, + 51.66832328118768 + ], + [ + 12.979417786990325, + 51.66320061644396 + ], + [ + 12.966821293609334, + 51.66566476270369 + ], + [ + 12.971502577022326, + 51.650248672749505 + ], + [ + 12.9495279724466, + 51.649433929850964 + ], + [ + 12.952355279400118, + 51.64358867225915 + ], + [ + 12.942163597016568, + 51.6380059348683 + ], + [ + 12.928109045176067, + 51.64956501299654 + ], + [ + 12.91523094746123, + 51.648460801026786 + ], + [ + 12.913414145950513, + 51.644118501361454 + ], + [ + 12.897524743385638, + 51.647426265685866 + ], + [ + 12.890810731691047, + 51.65396787536975 + ], + [ + 12.895168608987397, + 51.66376570195462 + ], + [ + 12.889194796101236, + 51.666883894000435 + ], + [ + 12.880393947199002, + 51.659060201907025 + ], + [ + 12.865793810665611, + 51.655026690750766 + ], + [ + 12.866515123529298, + 51.66395721905515 + ], + [ + 12.860871692778183, + 51.66470775173506 + ], + [ + 12.862227438626029, + 51.67378172888936 + ], + [ + 12.856780680709676, + 51.67269615116048 + ], + [ + 12.859029566085555, + 51.67619488530268 + ], + [ + 12.84386226781105, + 51.68497371575999 + ], + [ + 12.841896771337044, + 51.68222246477711 + ], + [ + 12.827882306837596, + 51.68224717999581 + ], + [ + 12.831806999388267, + 51.67602244359318 + ], + [ + 12.817739900621849, + 51.670403683109285 + ], + [ + 12.792533530530514, + 51.665500814127405 + ], + [ + 12.772706245802983, + 51.647509053044715 + ], + [ + 12.764607835739428, + 51.64656534886926 + ], + [ + 12.760090289181296, + 51.64969423478156 + ], + [ + 12.749936275375076, + 51.65005877204912 + ], + [ + 12.740164505958704, + 51.655554619342794 + ], + [ + 12.716843228273945, + 51.66131351668224 + ], + [ + 12.688199108253956, + 51.66242329432536 + ], + [ + 12.666523746808258, + 51.64222535155854 + ], + [ + 12.665845260059738, + 51.63159937596659 + ], + [ + 12.648732249663965, + 51.62505386845759 + ], + [ + 12.649112655461325, + 51.62044632617914 + ], + [ + 12.608332217827156, + 51.61060204113691 + ], + [ + 12.622360137371977, + 51.61644618154687 + ], + [ + 12.629228985283145, + 51.62523564653812 + ], + [ + 12.624168775694534, + 51.627984238898655 + ], + [ + 12.604530296224755, + 51.62624984012853 + ], + [ + 12.595492826599253, + 51.61838104576868 + ], + [ + 12.580262793397232, + 51.62606533340991 + ], + [ + 12.574703163069852, + 51.615433494120616 + ], + [ + 12.570270618858684, + 51.61688286710055 + ], + [ + 12.562831478024236, + 51.61375557860559 + ], + [ + 12.55997963315104, + 51.60851910468582 + ], + [ + 12.541712291320364, + 51.60743628966738 + ], + [ + 12.544638133690263, + 51.60371330342661 + ], + [ + 12.541445247252131, + 51.60250124241974 + ], + [ + 12.534479693513607, + 51.606086389707414 + ], + [ + 12.515764083245024, + 51.60578645942191 + ], + [ + 12.507006969621692, + 51.60845555414171 + ], + [ + 12.50354035161842, + 51.6045456051614 + ], + [ + 12.495024223011429, + 51.60413185579856 + ], + [ + 12.497458606646818, + 51.596563776053884 + ], + [ + 12.490097469126395, + 51.5982025284783 + ], + [ + 12.482988089637198, + 51.5931841868606 + ], + [ + 12.477139906925494, + 51.59627915335608 + ], + [ + 12.487185422458152, + 51.60100622430896 + ], + [ + 12.486373584471188, + 51.604277731039744 + ], + [ + 12.460575958579968, + 51.603260070616194 + ], + [ + 12.443962411444506, + 51.609870406877825 + ], + [ + 12.438386677852602, + 51.60517439989808 + ], + [ + 12.43331281676687, + 51.60583356037513 + ], + [ + 12.43682318480013, + 51.59930545075035 + ], + [ + 12.427328904288046, + 51.59929886305482 + ], + [ + 12.425419164615404, + 51.582131379846324 + ], + [ + 12.411419588246673, + 51.58200881158112 + ], + [ + 12.391780965670502, + 51.5877608834149 + ], + [ + 12.39225631190005, + 51.585629426664006 + ], + [ + 12.381600716476804, + 51.585412841567695 + ], + [ + 12.366856399045744, + 51.58801381360616 + ], + [ + 12.374514487555743, + 51.584517702194326 + ], + [ + 12.367681179826706, + 51.583087183753385 + ], + [ + 12.3369770406057, + 51.586227166360246 + ], + [ + 12.343618404647417, + 51.58258062096127 + ], + [ + 12.340912786334277, + 51.57980917550523 + ], + [ + 12.31937502348116, + 51.5775784964813 + ], + [ + 12.320559363271325, + 51.57467151346882 + ], + [ + 12.3132595518303, + 51.56849602534461 + ], + [ + 12.297223659328987, + 51.56666744671335 + ], + [ + 12.293179327993393, + 51.56055742874507 + ], + [ + 12.250477898885697, + 51.55894912341902 + ], + [ + 12.243210899206863, + 51.566876046106515 + ], + [ + 12.232903894183295, + 51.56112541188742 + ], + [ + 12.236045529647633, + 51.552971194909006 + ], + [ + 12.230049516803744, + 51.55282534190643 + ], + [ + 12.231345874093796, + 51.54734569909685 + ], + [ + 12.219018222742069, + 51.54651416052642 + ], + [ + 12.222170761136546, + 51.54444571360858 + ], + [ + 12.210126727818869, + 51.54192136023238 + ], + [ + 12.201940622934352, + 51.531331170765164 + ], + [ + 12.19276574469422, + 51.53129860519423 + ], + [ + 12.193843726712409, + 51.50839734233194 + ], + [ + 12.190395223046494, + 51.50776728473133 + ], + [ + 12.19634619112569, + 51.50673275297872 + ], + [ + 12.197347562641726, + 51.50286115666198 + ], + [ + 12.207896626212433, + 51.502592431773216 + ], + [ + 12.207017590165604, + 51.49206414063081 + ], + [ + 12.200995314006873, + 51.49029172667167 + ], + [ + 12.203081768668046, + 51.48514114836036 + ], + [ + 12.175704999784388, + 51.48222232884624 + ], + [ + 12.175521037797294, + 51.4696804312859 + ], + [ + 12.14858311748122, + 51.46312520609331 + ], + [ + 12.153139176264595, + 51.452461230598146 + ], + [ + 12.158256603662172, + 51.45124314834441 + ], + [ + 12.1583910013481, + 51.44598233782295 + ], + [ + 12.154219212580621, + 51.44438525824736 + ], + [ + 12.1576317486267, + 51.44430476355283 + ], + [ + 12.157213532728811, + 51.432710983709995 + ], + [ + 12.16955093614703, + 51.4303137416308 + ], + [ + 12.171032337310857, + 51.43423427401332 + ], + [ + 12.182482341410092, + 51.43237922122134 + ], + [ + 12.185858093463464, + 51.42079406671999 + ], + [ + 12.189822026032502, + 51.42085370490039 + ], + [ + 12.183202535273855, + 51.41077112648058 + ], + [ + 12.173532762032535, + 51.41025697380127 + ], + [ + 12.178139364240069, + 51.389146655091515 + ], + [ + 12.1848279043405, + 51.387584077506716 + ], + [ + 12.172143856819511, + 51.38415769562212 + ], + [ + 12.177744542309757, + 51.37516761766891 + ], + [ + 12.189963637190342, + 51.37945034604784 + ], + [ + 12.189499480456526, + 51.37551401985313 + ], + [ + 12.182767859207347, + 51.374519815366206 + ], + [ + 12.18175629356454, + 51.368510592878444 + ], + [ + 12.192879207218756, + 51.37147678054607 + ], + [ + 12.193670708040747, + 51.36915257130123 + ], + [ + 12.185632465420001, + 51.365964290570204 + ], + [ + 12.186085325319237, + 51.3621290694928 + ], + [ + 12.195756783548568, + 51.359728318125704 + ], + [ + 12.195523739007262, + 51.35439776917153 + ], + [ + 12.190255660128159, + 51.35135930752059 + ], + [ + 12.194455127251327, + 51.33032636322133 + ], + [ + 12.166825671614927, + 51.32680761574151 + ], + [ + 12.164778818797567, + 51.32083505497898 + ], + [ + 12.147653576038541, + 51.31996708921038 + ], + [ + 12.157626829263922, + 51.30208292920037 + ], + [ + 12.157403368488655, + 51.292276896756896 + ], + [ + 12.168947866928875, + 51.293756876902734 + ], + [ + 12.17225509320162, + 51.28568078047488 + ], + [ + 12.166101471281362, + 51.26607361048297 + ], + [ + 12.173311286272853, + 51.26631285718555 + ], + [ + 12.173679004374614, + 51.25826217342784 + ], + [ + 12.189389323838613, + 51.25762272707729 + ], + [ + 12.193153823690844, + 51.24139638864074 + ], + [ + 12.199492025193154, + 51.2384189072837 + ], + [ + 12.192076362489816, + 51.23693234642473 + ], + [ + 12.195589210062305, + 51.2236178389084 + ], + [ + 12.198109073815424, + 51.21670204325019 + ], + [ + 12.205066147449196, + 51.21418003889827 + ], + [ + 12.189590359173254, + 51.20398302866076 + ], + [ + 12.191795201129603, + 51.19573461347851 + ], + [ + 12.185597683416841, + 51.19428514433429 + ], + [ + 12.187184697267913, + 51.191463419982355 + ], + [ + 12.173678394669606, + 51.19025349677693 + ], + [ + 12.174844207819845, + 51.18132731377262 + ], + [ + 12.193403872763943, + 51.185307875532715 + ], + [ + 12.213084091207062, + 51.183500389315796 + ], + [ + 12.208490888551607, + 51.176232895038034 + ], + [ + 12.211568925003757, + 51.17236305361674 + ], + [ + 12.206261308962617, + 51.17129766431547 + ], + [ + 12.201673509193494, + 51.16139295802766 + ], + [ + 12.197153576835836, + 51.159910726055436 + ], + [ + 12.196192448785222, + 51.141907463460555 + ], + [ + 12.230142987937736, + 51.1361989371394 + ], + [ + 12.24163764054788, + 51.130704687326364 + ], + [ + 12.229073593130298, + 51.12022818918007 + ], + [ + 12.220555540727812, + 51.12303893389853 + ], + [ + 12.224590416806617, + 51.11932294072223 + ], + [ + 12.22119853979302, + 51.10991491225043 + ], + [ + 12.230358899156483, + 51.103607495872296 + ], + [ + 12.241182952832485, + 51.10298940518647 + ], + [ + 12.25308424634908, + 51.09726786855422 + ], + [ + 12.262774724329377, + 51.10029374472799 + ], + [ + 12.278574707402854, + 51.09928261675148 + ], + [ + 12.278635786898578, + 51.09496689166457 + ], + [ + 12.288279374440139, + 51.0882424327301 + ], + [ + 12.273207792817468, + 51.075059637220875 + ], + [ + 12.265596845867098, + 51.076984318296994 + ], + [ + 12.269307430378499, + 51.071812329128754 + ], + [ + 12.258492624047165, + 51.06614387896959 + ], + [ + 12.262206674650464, + 51.049610747470126 + ], + [ + 12.2562808615217, + 51.04924837968444 + ], + [ + 12.256789284568804, + 51.0453347594686 + ], + [ + 12.25046036836333, + 51.04446693802719 + ], + [ + 12.250268436067012, + 51.03787289004578 + ], + [ + 12.280580446352584, + 51.04047835561967 + ], + [ + 12.287045389016138, + 51.037639039932294 + ], + [ + 12.289483102599144, + 51.030450150527436 + ], + [ + 12.293914549743866, + 51.03132995257839 + ], + [ + 12.29174785668694, + 51.01869953524705 + ], + [ + 12.281925765657382, + 51.0106776259284 + ], + [ + 12.283517937532837, + 51.006435973146914 + ], + [ + 12.27789476127906, + 51.00579740479709 + ], + [ + 12.26558817545329, + 50.99185904241562 + ], + [ + 12.239891998158518, + 50.975679991596415 + ], + [ + 12.23234881526451, + 50.96135339045853 + ], + [ + 12.241670525962366, + 50.96151374842581 + ], + [ + 12.238717455762592, + 50.95152809746858 + ], + [ + 12.214580121217244, + 50.93803207630959 + ], + [ + 12.21107399589463, + 50.949571042839494 + ], + [ + 12.215346989001082, + 50.95327012610144 + ], + [ + 12.21381856881956, + 50.95843608723059 + ], + [ + 12.197979396811023, + 50.956783873909366 + ], + [ + 12.182508062997105, + 50.97586604427739 + ], + [ + 12.163207827290305, + 50.966485229065384 + ], + [ + 12.163529546606282, + 50.95859977907033 + ], + [ + 12.158352669128105, + 50.963131218551894 + ], + [ + 12.150049823256714, + 50.964150955447856 + ], + [ + 12.132133920270881, + 50.96126262775185 + ], + [ + 12.13498652737083, + 50.96497545587702 + ], + [ + 12.09215763884182, + 50.976530486346846 + ], + [ + 12.05535675375384, + 50.96861334719242 + ], + [ + 12.037484824646617, + 50.97293644225292 + ], + [ + 12.014126398347441, + 50.96867085466466 + ], + [ + 12.010659468232822, + 50.97469144000443 + ], + [ + 12.017188182362666, + 50.97906123270683 + ], + [ + 12.014309771760368, + 50.983904335650536 + ], + [ + 12.008665204938085, + 50.98394158987385 + ], + [ + 12.006571244227093, + 50.9910241452028 + ], + [ + 11.999335897672516, + 50.988633695009554 + ], + [ + 11.996501891098395, + 50.99316077513779 + ], + [ + 11.974237769141155, + 50.99032192513188 + ], + [ + 11.969873132919219, + 50.99432773123478 + ], + [ + 11.968528753461957, + 50.99915925553693 + ], + [ + 11.975773856579536, + 50.99916670236689 + ], + [ + 11.97864392861341, + 51.003696122336926 + ], + [ + 11.974704292239455, + 51.00982584789465 + ], + [ + 11.980310204511765, + 51.0123453521436 + ], + [ + 11.977137232995462, + 51.01645489769894 + ], + [ + 11.96522696220877, + 51.01834207148541 + ], + [ + 11.96274317977923, + 51.02218315457454 + ], + [ + 11.95831280836955, + 51.02103862535435 + ], + [ + 11.943066187342447, + 51.03244116268608 + ], + [ + 11.921462604591259, + 51.0262939206595 + ], + [ + 11.911895626694195, + 51.028179286164125 + ], + [ + 11.915390046566634, + 51.03793685803939 + ], + [ + 11.910866915877856, + 51.04501989758847 + ], + [ + 11.896015676387364, + 51.045333594140466 + ], + [ + 11.896663051736466, + 51.05047293321077 + ], + [ + 11.888807362338119, + 51.05584043388354 + ], + [ + 11.875513056838958, + 51.05773473673364 + ], + [ + 11.863095833622529, + 51.051145631508646 + ], + [ + 11.860261347322181, + 51.05476396146672 + ], + [ + 11.803893556218469, + 51.04721079603573 + ], + [ + 11.79710147100003, + 51.05040805341785 + ], + [ + 11.787399354595946, + 51.05011059681768 + ], + [ + 11.78686566313415, + 51.05262840385305 + ], + [ + 11.77463427783619, + 51.05315736510943 + ], + [ + 11.770406816956841, + 51.04918031270259 + ], + [ + 11.772094096850658, + 51.04500754079923 + ], + [ + 11.759689950608923, + 51.04285785477688 + ], + [ + 11.759753676759168, + 51.047775838054775 + ], + [ + 11.746197108160608, + 51.05195437086733 + ], + [ + 11.753250386778266, + 51.05698852150597 + ], + [ + 11.73714686546024, + 51.063137447515956 + ], + [ + 11.73229986271994, + 51.06841715488467 + ], + [ + 11.72352338729973, + 51.067995114790016 + ], + [ + 11.721168154079113, + 51.071019811958955 + ], + [ + 11.709846615368363, + 51.068137842062505 + ], + [ + 11.700810413630325, + 51.06940256477674 + ], + [ + 11.701832501840457, + 51.07841512313493 + ], + [ + 11.697597752340526, + 51.08424468625904 + ], + [ + 11.70158187108571, + 51.08582347370056 + ], + [ + 11.693398985146889, + 51.09262028141144 + ], + [ + 11.692382465376038, + 51.099851597090904 + ], + [ + 11.672439705867014, + 51.102901877846044 + ], + [ + 11.666950054277859, + 51.11078547660002 + ], + [ + 11.647079649477014, + 51.10730198180629 + ], + [ + 11.638240030569804, + 51.11112278117411 + ], + [ + 11.62435561135702, + 51.10448152457717 + ], + [ + 11.62021201381665, + 51.0974486614367 + ], + [ + 11.616151624922558, + 51.0979644557857 + ], + [ + 11.620043673665416, + 51.104666931977995 + ], + [ + 11.607503406031551, + 51.11160723314434 + ], + [ + 11.571659895025698, + 51.11936512359049 + ], + [ + 11.558240956094739, + 51.108951272721534 + ], + [ + 11.547819652412816, + 51.11170217407316 + ], + [ + 11.545642779374866, + 51.10245036682987 + ], + [ + 11.512077530979639, + 51.10797399528047 + ], + [ + 11.510594122267138, + 51.10297378030454 + ], + [ + 11.48521893697276, + 51.10253352594178 + ], + [ + 11.483823598436754, + 51.10817941800197 + ], + [ + 11.463156805846083, + 51.11306664796063 + ], + [ + 11.465453882110838, + 51.12738206447062 + ], + [ + 11.459875403286473, + 51.130163065964794 + ], + [ + 11.45100430687818, + 51.14667013075036 + ], + [ + 11.47192917646712, + 51.14818357457041 + ], + [ + 11.47928467495348, + 51.158778321357005 + ], + [ + 11.47256040038652, + 51.16091995894629 + ], + [ + 11.474947699234338, + 51.16582633869905 + ], + [ + 11.485260143823973, + 51.16559279160727 + ], + [ + 11.485548328442897, + 51.16801734689319 + ], + [ + 11.4708176240524, + 51.169838475294995 + ], + [ + 11.46856772864456, + 51.192654104297524 + ], + [ + 11.455836637696517, + 51.195377185381766 + ], + [ + 11.452402961027895, + 51.19247748827776 + ], + [ + 11.446045122223316, + 51.20814376541528 + ], + [ + 11.430948609175962, + 51.212475797285094 + ], + [ + 11.405001376144558, + 51.20737146836508 + ], + [ + 11.40588754576223, + 51.20270284409798 + ], + [ + 11.39919887438971, + 51.206380538980625 + ], + [ + 11.391420063781675, + 51.203533298708464 + ], + [ + 11.389824940320421, + 51.21751519223884 + ], + [ + 11.364832642692466, + 51.221359160985145 + ], + [ + 11.369101132328412, + 51.230612099985514 + ], + [ + 11.376447063414489, + 51.23407119567274 + ], + [ + 11.376377247450538, + 51.23938638956259 + ], + [ + 11.384566954299718, + 51.245632228783 + ], + [ + 11.40061303107411, + 51.24290962033112 + ], + [ + 11.397795323976865, + 51.236737714644825 + ], + [ + 11.412632299869804, + 51.24106203163985 + ], + [ + 11.41996752334854, + 51.246364477957684 + ], + [ + 11.421805873374607, + 51.25323615954592 + ], + [ + 11.429290882419085, + 51.254679659105484 + ], + [ + 11.439522337763623, + 51.26337865816815 + ], + [ + 11.441280275246926, + 51.26696411522637 + ], + [ + 11.437030881086217, + 51.26865453074992 + ], + [ + 11.441744507299695, + 51.27331358056426 + ], + [ + 11.446777525843826, + 51.271122571117914 + ], + [ + 11.456112363573109, + 51.277201274374605 + ], + [ + 11.452325168334774, + 51.279985416293925 + ], + [ + 11.459277674624627, + 51.29350634715702 + ], + [ + 11.46778506022408, + 51.288386860300896 + ], + [ + 11.47522597831953, + 51.29805427521017 + ], + [ + 11.449778952913801, + 51.31378352222866 + ], + [ + 11.445994289784192, + 51.31196057660285 + ], + [ + 11.447413765900986, + 51.31606106485489 + ], + [ + 11.434235478160206, + 51.32042263133713 + ], + [ + 11.428053922798567, + 51.327912731444165 + ], + [ + 11.413594722814809, + 51.33312782331502 + ], + [ + 11.426296568674195, + 51.33622242045509 + ], + [ + 11.4288145555439, + 51.342828577025564 + ], + [ + 11.412042133045041, + 51.34248839050557 + ], + [ + 11.40899213332348, + 51.340082700949225 + ], + [ + 11.399437218037313, + 51.344836154536154 + ], + [ + 11.400975060198654, + 51.349437183403026 + ], + [ + 11.392966719116009, + 51.354101569094986 + ], + [ + 11.389836466525368, + 51.36798681991007 + ], + [ + 11.3911465658744, + 51.372547613022675 + ], + [ + 11.395941107857022, + 51.372934026131674 + ], + [ + 11.396852278681221, + 51.38133072424108 + ], + [ + 11.36840461073202, + 51.38777963951979 + ], + [ + 11.362028479912938, + 51.3828690085643 + ], + [ + 11.357425839968538, + 51.38977460151075 + ], + [ + 11.349892213139755, + 51.38838726203235 + ], + [ + 11.34724969643086, + 51.38456004423309 + ], + [ + 11.339771991638093, + 51.392405453096806 + ], + [ + 11.330795693412671, + 51.390266388555794 + ], + [ + 11.321259842235945, + 51.41037234580523 + ], + [ + 11.284975138297831, + 51.40220792271825 + ], + [ + 11.275246030225642, + 51.4048434600815 + ], + [ + 11.274318772955645, + 51.400754522951594 + ], + [ + 11.252768861228889, + 51.40065315176867 + ], + [ + 11.248506161739268, + 51.39513282565457 + ], + [ + 11.244122912329606, + 51.39695478218874 + ], + [ + 11.247897157698631, + 51.40542056009289 + ], + [ + 11.230167350945038, + 51.405742605621576 + ], + [ + 11.22388299637411, + 51.41318615168727 + ], + [ + 11.209537548203828, + 51.41174291106812 + ], + [ + 11.207723621750196, + 51.40666908589464 + ], + [ + 11.196856632335383, + 51.40803211806097 + ], + [ + 11.19241116464171, + 51.40287528816174 + ], + [ + 11.183596615602154, + 51.40286974487307 + ], + [ + 11.183413273146337, + 51.40589880705801 + ], + [ + 11.17688794582328, + 51.40630791595467 + ], + [ + 11.152934180688053, + 51.40164432358522 + ], + [ + 11.148628558736226, + 51.403981996939855 + ], + [ + 11.141754601862322, + 51.40263265258552 + ], + [ + 11.13505098659327, + 51.406341393796275 + ], + [ + 11.13228483176686, + 51.40447095981794 + ], + [ + 11.131107439663552, + 51.408533630526335 + ], + [ + 11.125661259257301, + 51.4081176575851 + ], + [ + 11.127572764232092, + 51.41325379518786 + ], + [ + 11.116392160823398, + 51.4110006944913 + ], + [ + 11.116555710710788, + 51.4156873029206 + ], + [ + 11.101996258943336, + 51.41690536543601 + ], + [ + 11.103465972675822, + 51.419255054579665 + ], + [ + 11.09520421919804, + 51.41897593915992 + ], + [ + 11.071476060471943, + 51.428634518141266 + ], + [ + 11.061390454954891, + 51.42979197279626 + ], + [ + 11.056930773646458, + 51.4274759750705 + ], + [ + 11.051844974169068, + 51.42953124690335 + ], + [ + 11.046041148551835, + 51.42627015618093 + ], + [ + 11.049852427655415, + 51.42019652842001 + ], + [ + 11.040229670468658, + 51.42459185925196 + ], + [ + 11.025240691729728, + 51.421394512048536 + ], + [ + 11.018749640110917, + 51.417052820723754 + ], + [ + 10.992033080015446, + 51.41785321194477 + ], + [ + 10.999994887768581, + 51.423218473530994 + ], + [ + 11.010663972160202, + 51.42531503044971 + ], + [ + 11.007920436329533, + 51.429268919827074 + ], + [ + 10.989467720794698, + 51.425776500451455 + ], + [ + 10.978113225723273, + 51.426885079962815 + ], + [ + 10.979680169924793, + 51.43192371011911 + ], + [ + 10.966733925720106, + 51.432353205949546 + ], + [ + 10.970928628160124, + 51.44202882010503 + ], + [ + 10.967122259544455, + 51.44571471004422 + ], + [ + 10.97270295837157, + 51.4536660280179 + ], + [ + 10.968290790138475, + 51.45441900709922 + ], + [ + 10.969701830958858, + 51.4589354644967 + ], + [ + 10.962994034935166, + 51.460386861925436 + ], + [ + 10.960817206166812, + 51.47122492606361 + ], + [ + 10.973269908807227, + 51.48204626542689 + ], + [ + 10.952076347567042, + 51.49541771649209 + ], + [ + 10.953760832708237, + 51.49814624293844 + ], + [ + 10.948649094062624, + 51.50162955507476 + ], + [ + 10.946634320993576, + 51.499010171949045 + ], + [ + 10.93972108434198, + 51.50072556311688 + ], + [ + 10.945552756331972, + 51.506382565472016 + ], + [ + 10.936240608666653, + 51.51151519956139 + ], + [ + 10.933751616531834, + 51.51921986199977 + ], + [ + 10.927335259509382, + 51.520853701018176 + ], + [ + 10.932850378031711, + 51.52151732078981 + ], + [ + 10.935151294417032, + 51.5332219886369 + ], + [ + 10.939754083236513, + 51.535604312493255 + ], + [ + 10.947838950641056, + 51.53334586100101 + ], + [ + 10.947971841741799, + 51.537572878002806 + ], + [ + 10.916548649002573, + 51.54745703793711 + ], + [ + 10.911161901663002, + 51.55543114439815 + ], + [ + 10.904473142711009, + 51.54964138201227 + ], + [ + 10.900496028208815, + 51.55065469839176 + ], + [ + 10.895150137916204, + 51.55767092727034 + ], + [ + 10.90024971394113, + 51.56442340683161 + ], + [ + 10.892765968727804, + 51.57114776829071 + ], + [ + 10.8930718985623, + 51.57651765192432 + ], + [ + 10.882051629285211, + 51.580508085501165 + ], + [ + 10.894476281755564, + 51.6018329019709 + ], + [ + 10.896424216029427, + 51.59683842630851 + ], + [ + 10.903331296234999, + 51.59382821453545 + ], + [ + 10.931186218205397, + 51.5914806445608 + ], + [ + 10.937063687557515, + 51.603487289442114 + ], + [ + 10.91409135940129, + 51.61016346096087 + ], + [ + 10.920959015372041, + 51.613652508358975 + ], + [ + 10.922012575111838, + 51.61844743398709 + ], + [ + 10.901525107495912, + 51.61187218462913 + ], + [ + 10.886600560526299, + 51.61211090739236 + ], + [ + 10.883233799559017, + 51.61769414996919 + ], + [ + 10.858615251451875, + 51.63289976835152 + ], + [ + 10.833734255237033, + 51.630687606684766 + ], + [ + 10.822567511621664, + 51.62353957243907 + ], + [ + 10.818215835351001, + 51.639026431289814 + ], + [ + 10.785421223369452, + 51.64187959498943 + ], + [ + 10.771296376271309, + 51.644602738197186 + ], + [ + 10.76451121395882, + 51.649008273821785 + ], + [ + 10.755681214173396, + 51.64506227553569 + ], + [ + 10.756121767270075, + 51.64174800562015 + ], + [ + 10.749365654893545, + 51.64033430064142 + ], + [ + 10.737087376277564, + 51.64507247508976 + ], + [ + 10.709115289233587, + 51.64069881589268 + ], + [ + 10.696011081133783, + 51.64298832173402 + ], + [ + 10.682880157310361, + 51.66062388091583 + ], + [ + 10.670507134381431, + 51.66691268035287 + ], + [ + 10.663060041348238, + 51.691212375917125 + ], + [ + 10.667549207009548, + 51.69667595710321 + ], + [ + 10.67261703060319, + 51.69696554175661 + ], + [ + 10.668307288497173, + 51.70990802993534 + ], + [ + 10.655896852317202, + 51.71821932717627 + ], + [ + 10.649337053248967, + 51.71855163919841 + ], + [ + 10.642102111369324, + 51.7253614906977 + ], + [ + 10.642870747822347, + 51.73028134619563 + ], + [ + 10.631713463638965, + 51.739533090725665 + ], + [ + 10.63126962432424, + 51.751471124156936 + ], + [ + 10.626096714487174, + 51.75901689505588 + ], + [ + 10.593024690787312, + 51.767663849051225 + ], + [ + 10.580437275783451, + 51.78274999612821 + ], + [ + 10.585087555095381, + 51.787631443920404 + ], + [ + 10.584163445537312, + 51.797779286517205 + ], + [ + 10.574174335702898, + 51.81112656416387 + ], + [ + 10.578735940134683, + 51.828652324894655 + ], + [ + 10.588429864935806, + 51.83578577047531 + ], + [ + 10.576971041291696, + 51.842987258042896 + ], + [ + 10.579100529220321, + 51.84825725389399 + ], + [ + 10.584468982117192, + 51.853057173917385 + ], + [ + 10.602615382830619, + 51.85454513168052 + ], + [ + 10.616352999279112, + 51.869842816213584 + ], + [ + 10.632329785897452, + 51.87216491605542 + ], + [ + 10.650437159380608, + 51.89130268627839 + ], + [ + 10.648894730016096, + 51.907173468911324 + ], + [ + 10.639815066992576, + 51.915136376441424 + ], + [ + 10.613313787501555, + 51.9215152753072 + ], + [ + 10.61811139120552, + 51.93147738026018 + ], + [ + 10.61326048378171, + 51.939467872228974 + ], + [ + 10.622477642076563, + 51.94754118852326 + ], + [ + 10.633047017829652, + 51.94849859120703 + ], + [ + 10.651303745526786, + 51.95756107707119 + ], + [ + 10.641704442298398, + 51.962627962195924 + ], + [ + 10.635378441095062, + 51.95906530738353 + ], + [ + 10.619941215238676, + 51.957678619347995 + ], + [ + 10.619617075895942, + 51.96693615395347 + ], + [ + 10.606237284759974, + 51.968665721342184 + ], + [ + 10.606232853092317, + 51.977287406718645 + ], + [ + 10.585979347625894, + 51.975959121058665 + ], + [ + 10.586778820613524, + 51.98273184002828 + ], + [ + 10.561226987730976, + 52.00406593861593 + ], + [ + 10.574741225890202, + 52.00636094344994 + ], + [ + 10.572969628915335, + 52.01044575985055 + ], + [ + 10.591595156481953, + 52.01134222442347 + ], + [ + 10.592280206287763, + 52.01420352607189 + ], + [ + 10.59659996460236, + 52.01436553241478 + ], + [ + 10.600194240352286, + 52.00716567546606 + ], + [ + 10.61190232511463, + 52.01004676341872 + ], + [ + 10.626019658463969, + 52.008197846805714 + ], + [ + 10.621436009041293, + 52.01033426271989 + ], + [ + 10.638972150916327, + 52.01532529809057 + ], + [ + 10.642216826226779, + 52.022916086106214 + ], + [ + 10.65549198507614, + 52.02468661603615 + ], + [ + 10.65686483217418, + 52.028523818713495 + ], + [ + 10.64788665593012, + 52.041720814237095 + ], + [ + 10.687385236811572, + 52.048138205141555 + ], + [ + 10.745063872921524, + 52.048787942622496 + ], + [ + 10.758284328902882, + 52.04804164592134 + ], + [ + 10.75989265477887, + 52.04508508619649 + ], + [ + 10.774671098974537, + 52.05008909538819 + ], + [ + 10.828707490576932, + 52.04774864983605 + ], + [ + 10.851441978873389, + 52.050337318518515 + ], + [ + 10.878944232307449, + 52.05920303861899 + ], + [ + 10.935961365616144, + 52.059709883314966 + ], + [ + 10.964414596962717, + 52.05664315887771 + ], + [ + 10.973049718068367, + 52.07312392931353 + ], + [ + 10.970652819687002, + 52.08626494130666 + ], + [ + 10.942004993617832, + 52.094362847131855 + ], + [ + 10.942159787336902, + 52.103090282296094 + ], + [ + 10.965668144578833, + 52.107115338602625 + ], + [ + 10.976877507167082, + 52.1057288521072 + ], + [ + 11.009163205336355, + 52.11992783799272 + ], + [ + 11.01747008252535, + 52.12825973289111 + ], + [ + 11.044135171710142, + 52.133665502858804 + ], + [ + 11.045039176631503, + 52.143553841775244 + ], + [ + 11.06042836396003, + 52.15347400912416 + ], + [ + 11.05461848436036, + 52.16025607480426 + ], + [ + 11.061481095435502, + 52.1652430363485 + ], + [ + 11.060336961595521, + 52.17238740685909 + ], + [ + 11.035923512896062, + 52.17172844254678 + ], + [ + 11.017835355814537, + 52.17932758404763 + ], + [ + 11.012626473710446, + 52.18834450211659 + ], + [ + 11.01364658899064, + 52.19955618987686 + ], + [ + 11.017686322601273, + 52.19825257923726 + ], + [ + 11.024579873534892, + 52.201095822982104 + ], + [ + 11.021394557798542, + 52.20497925656305 + ], + [ + 11.029448371030629, + 52.21144837280336 + ], + [ + 11.034455569279203, + 52.21031238742629 + ], + [ + 11.044883262868717, + 52.21505615605689 + ], + [ + 11.077184889367993, + 52.218676562518816 + ], + [ + 11.078857657861384, + 52.224649745873485 + ], + [ + 11.086244118789406, + 52.228633836442555 + ], + [ + 11.07326749974561, + 52.243239689228716 + ], + [ + 11.058907194326187, + 52.24065176908868 + ], + [ + 11.052367339887669, + 52.25373644876064 + ], + [ + 11.056312565862436, + 52.258727964936625 + ], + [ + 11.051129729112208, + 52.26279929517395 + ], + [ + 11.052167701569534, + 52.26736354912687 + ], + [ + 11.042943949686965, + 52.27201068483596 + ], + [ + 11.029066817935323, + 52.27012102132033 + ], + [ + 11.013800796624643, + 52.286649048106696 + ], + [ + 11.012506507526163, + 52.29132000668782 + ], + [ + 11.039222681549468, + 52.301671863861486 + ], + [ + 11.036015159542432, + 52.310396037263914 + ], + [ + 11.020228833088915, + 52.31911791020523 + ], + [ + 11.011616662057495, + 52.328241063875964 + ], + [ + 11.001076691326242, + 52.327480520572394 + ], + [ + 10.999982894462867, + 52.32971240663011 + ], + [ + 11.004795267951659, + 52.33074881231778 + ], + [ + 11.002083240236393, + 52.3365853825243 + ], + [ + 10.98791249876772, + 52.335015946203356 + ], + [ + 10.983673923984412, + 52.34168646045201 + ], + [ + 11.022980602297192, + 52.34743293332608 + ], + [ + 11.023596170173967, + 52.34423206331315 + ], + [ + 11.037356480769425, + 52.34474236765471 + ], + [ + 11.043939507163884, + 52.34933867879302 + ], + [ + 11.05747447818976, + 52.35033314438677 + ], + [ + 11.061613904866102, + 52.357452967833936 + ], + [ + 11.063810832232909, + 52.35441582873434 + ], + [ + 11.068684251700189, + 52.355477634704954 + ], + [ + 11.067000152544452, + 52.36987737540694 + ], + [ + 11.074479824719837, + 52.37440326430861 + ], + [ + 11.068810227145846, + 52.376522122766936 + ], + [ + 11.06654420349342, + 52.373199823545114 + ], + [ + 11.046752836023455, + 52.3878701759709 + ], + [ + 11.039004142151486, + 52.38890951805362 + ], + [ + 11.0418673114517, + 52.38638383207872 + ], + [ + 11.036299796384762, + 52.38520951147548 + ], + [ + 11.022946034006058, + 52.39263545015585 + ], + [ + 11.015160052777725, + 52.38810680537989 + ], + [ + 11.01869512358527, + 52.39704204588354 + ], + [ + 11.005578878172205, + 52.40887152615071 + ], + [ + 10.99164501814916, + 52.41333494059596 + ], + [ + 10.994628376117381, + 52.41511332472082 + ], + [ + 10.98940801527397, + 52.42030296786594 + ], + [ + 10.96226112651492, + 52.43473785312719 + ], + [ + 10.94782168265518, + 52.453949098168714 + ], + [ + 10.933745728234936, + 52.460952125598816 + ], + [ + 10.93458499675538, + 52.47617439410258 + ], + [ + 10.940981083075862, + 52.47660079336814 + ], + [ + 10.943555905367703, + 52.49234952901468 + ], + [ + 10.949993652832653, + 52.49560565039983 + ], + [ + 10.974840401084535, + 52.501363347755394 + ], + [ + 10.98226161318549, + 52.49696464012332 + ], + [ + 11.008781743797412, + 52.49674764404583 + ], + [ + 10.958992316608404, + 52.53555397015957 + ], + [ + 10.93757573538539, + 52.56739965156559 + ], + [ + 10.941689468191544, + 52.579744654171456 + ], + [ + 10.947435540958756, + 52.58255006677304 + ], + [ + 10.939817469906814, + 52.58957309884994 + ], + [ + 10.953259829664526, + 52.59286752027712 + ], + [ + 10.959519012643494, + 52.59989230564461 + ], + [ + 10.97562919020857, + 52.60682491137484 + ], + [ + 10.9769679981519, + 52.62414161679185 + ], + [ + 10.96424832829456, + 52.62585473092072 + ], + [ + 10.945174022104837, + 52.62021641577061 + ], + [ + 10.943396820059318, + 52.614913200637815 + ], + [ + 10.927160294691314, + 52.60926156812378 + ], + [ + 10.921411939012895, + 52.61043708108112 + ], + [ + 10.9250262715629, + 52.61459685370367 + ], + [ + 10.915052851656169, + 52.617634958866674 + ], + [ + 10.913103193598223, + 52.62409808845634 + ], + [ + 10.904377954815706, + 52.62746679780099 + ], + [ + 10.896868342049826, + 52.64270868907923 + ], + [ + 10.87902679157203, + 52.65599633196257 + ], + [ + 10.877758863633659, + 52.66383235252555 + ], + [ + 10.85967752478328, + 52.6745901683866 + ], + [ + 10.83750746858655, + 52.69580956419165 + ], + [ + 10.833128900460295, + 52.700938913075795 + ], + [ + 10.83615892182715, + 52.707701464196866 + ], + [ + 10.829703151025388, + 52.71613516382112 + ], + [ + 10.824460067061251, + 52.71797463592656 + ], + [ + 10.796696790574803, + 52.714326390056605 + ], + [ + 10.793282401341852, + 52.729968280874964 + ], + [ + 10.788176140820354, + 52.733172314478 + ], + [ + 10.791665848053619, + 52.74819657827841 + ], + [ + 10.78764507598349, + 52.752967129511156 + ], + [ + 10.776207966250166, + 52.754788840050644 + ], + [ + 10.775482893085979, + 52.76236112135293 + ], + [ + 10.755321247277028, + 52.784829632988426 + ], + [ + 10.761743760441158, + 52.80272638769274 + ], + [ + 10.756946307398549, + 52.81977474058632 + ], + [ + 10.766654543561451, + 52.82619310123291 + ], + [ + 10.763985773413204, + 52.830208036094234 + ], + [ + 10.77172883132508, + 52.83394567355566 + ], + [ + 10.764697233467663, + 52.84047926725806 + ], + [ + 10.79614705351651, + 52.84364187621514 + ], + [ + 10.80055300489874, + 52.85029181118828 + ], + [ + 10.834774625149775, + 52.84747505566994 + ], + [ + 10.841555870856915, + 52.85220486155474 + ], + [ + 10.860370625547533, + 52.85165152002535 + ], + [ + 10.866102062363368, + 52.85572598762166 + ], + [ + 10.88468358070937, + 52.84579634036977 + ], + [ + 10.892875387526125, + 52.84798245224591 + ], + [ + 10.895667013489046, + 52.85637275936312 + ], + [ + 10.939633519148424, + 52.85333550935498 + ], + [ + 10.967895794137222, + 52.87571612603384 + ], + [ + 10.968082322867126, + 52.87932071924568 + ], + [ + 10.978814440572016, + 52.87815276266845 + ], + [ + 10.985508334857066, + 52.88203313405927 + ], + [ + 10.992572500864457, + 52.90645740872054 + ], + [ + 11.002075787937091, + 52.91147667636648 + ], + [ + 11.01307637388217, + 52.909890239218974 + ], + [ + 11.039049495617327, + 52.913399310716024 + ], + [ + 11.06458786674955, + 52.9093984678501 + ], + [ + 11.078747416575194, + 52.912964150941 + ], + [ + 11.098675785469528, + 52.912876686874924 + ], + [ + 11.093187302358317, + 52.89947142293326 + ], + [ + 11.106405528843105, + 52.89622347804997 + ], + [ + 11.13890603237415, + 52.89834071045239 + ], + [ + 11.154666716381177, + 52.901865343505136 + ], + [ + 11.15525787274402, + 52.90621056676437 + ], + [ + 11.220645292915023, + 52.89766635432201 + ], + [ + 11.219169101578538, + 52.89268118619801 + ], + [ + 11.235763576698819, + 52.888613934469305 + ], + [ + 11.241125625865912, + 52.87901825053115 + ], + [ + 11.267238932685222, + 52.88014081117129 + ], + [ + 11.276569532593532, + 52.887532251499756 + ], + [ + 11.290662086291915, + 52.8891256608696 + ], + [ + 11.29541067026685, + 52.874906896006756 + ], + [ + 11.314250103091155, + 52.87823631788915 + ], + [ + 11.337184151572623, + 52.8883574223805 + ], + [ + 11.354534898171089, + 52.890363015977776 + ], + [ + 11.384778189302809, + 52.9035784286038 + ], + [ + 11.392461714410839, + 52.901680110891 + ], + [ + 11.406577800864298, + 52.90410219846193 + ], + [ + 11.426075469620686, + 52.91992350041954 + ], + [ + 11.432890608219278, + 52.91974981633731 + ], + [ + 11.454444417884464, + 52.93339689989636 + ], + [ + 11.470061657091557, + 52.938925627413724 + ], + [ + 11.505026759494879, + 52.94103266701422 + ], + [ + 11.492342519854013, + 52.95966288239679 + ], + [ + 11.512490563926427, + 53.00744492597129 + ], + [ + 11.526428490681212, + 53.00825854077587 + ], + [ + 11.543380404326527, + 52.9994524136372 + ], + [ + 11.556416553023253, + 52.99866580230831 + ], + [ + 11.560443866786269, + 53.00379970674041 + ], + [ + 11.55209003030779, + 53.00472847096072 + ], + [ + 11.559249505090884, + 53.01308032524507 + ], + [ + 11.563745870208194, + 53.01284337929095 + ], + [ + 11.597784506994486, + 53.035926368638904 + ], + [ + 11.623005049053075, + 53.04176544686437 + ], + [ + 11.63758075762767, + 53.039499614506624 + ], + [ + 11.64186002473568, + 53.03537786726167 + ], + [ + 11.625949054929878, + 53.020129857937754 + ], + [ + 11.626327035647721, + 53.01264736889982 + ] + ], + [ + [ + 12.264446159354177, + 52.23171338521416 + ], + [ + 12.273664259190591, + 52.22877921525417 + ], + [ + 12.27520404478649, + 52.231050547405886 + ], + [ + 12.27047351975968, + 52.23110260105865 + ], + [ + 12.264446159354177, + 52.23171338521416 + ] + ], + [ + [ + 12.277072323430184, + 52.22900757332302 + ], + [ + 12.281244456560186, + 52.22743412441702 + ], + [ + 12.286255987354949, + 52.22745841730614 + ], + [ + 12.279125022722512, + 52.22941792462207 + ], + [ + 12.277072323430184, + 52.22900757332302 + ] + ], + [ + [ + 12.222307576461075, + 52.862548545960884 + ], + [ + 12.217115000476344, + 52.86199253736818 + ], + [ + 12.217484901143543, + 52.86002679565631 + ], + [ + 12.219077200736326, + 52.86085862276213 + ], + [ + 12.222307576461075, + 52.862548545960884 + ] + ] + ], + [ + [ + [ + 11.446768080676833, + 51.1944971321898 + ], + [ + 11.439672491196358, + 51.197667592955206 + ], + [ + 11.43938578454155, + 51.199766399347865 + ], + [ + 11.446614450389683, + 51.198880346644536 + ], + [ + 11.446768080676833, + 51.1944971321898 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "02", + "AGS": "02", + "SDV_RS": "020000000000", + "GEN": "Hamburg", + "BEZ": "Freie und Hansestadt", + "IBZ": 22, + "BEM": "--", + "NBD": "ja", + "SN_L": "02", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE6", + "RS_0": "020000000000", + "AGS_0": "02000000", + "WSK": "1974/01/01", + "DEBKG_ID": "DEBKGDL20000E6GD", + "destatis": { + "population": 1762791, + "population_m": 857446, + "population_w": 905345 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 10.185684201431359, + 53.731291611717715 + ], + [ + 10.193670978789703, + 53.7310151156405 + ], + [ + 10.181693594949179, + 53.709251559769605 + ], + [ + 10.173853574320635, + 53.71279697434495 + ], + [ + 10.157523258991786, + 53.705029061854624 + ], + [ + 10.159454876693756, + 53.69081886636747 + ], + [ + 10.150575731014714, + 53.682438316363616 + ], + [ + 10.140273002437437, + 53.680126680571355 + ], + [ + 10.143246259090443, + 53.67556199967417 + ], + [ + 10.15412413434582, + 53.67583545028709 + ], + [ + 10.160377262488403, + 53.671495099818095 + ], + [ + 10.155970535208775, + 53.66950241511714 + ], + [ + 10.172485432818455, + 53.6690029656787 + ], + [ + 10.173865452713343, + 53.66452313727253 + ], + [ + 10.182902768663899, + 53.66373797062869 + ], + [ + 10.187431441818243, + 53.65652722297925 + ], + [ + 10.196056384184377, + 53.65470392905673 + ], + [ + 10.19861919056919, + 53.646436182679615 + ], + [ + 10.18963501877422, + 53.638156660406736 + ], + [ + 10.22176127395128, + 53.63372253359423 + ], + [ + 10.21652379883025, + 53.625444256226274 + ], + [ + 10.205533366063023, + 53.623495735711394 + ], + [ + 10.188952192558002, + 53.61301421535061 + ], + [ + 10.196754340224592, + 53.60040017941131 + ], + [ + 10.191658335673617, + 53.59567912155901 + ], + [ + 10.201449728700773, + 53.584075870637186 + ], + [ + 10.165628177063624, + 53.58251048916099 + ], + [ + 10.161722830928069, + 53.58569873602787 + ], + [ + 10.152083349522155, + 53.5768301041813 + ], + [ + 10.149152551697506, + 53.561986364311984 + ], + [ + 10.160538739881853, + 53.55768295797215 + ], + [ + 10.152881080678299, + 53.5505291296888 + ], + [ + 10.152582687165431, + 53.53979279932001 + ], + [ + 10.155512062369088, + 53.53636749914309 + ], + [ + 10.16687249048638, + 53.5374323556462 + ], + [ + 10.161700335689902, + 53.525938432927724 + ], + [ + 10.164643036338195, + 53.51993916398856 + ], + [ + 10.189708982101285, + 53.512631006149384 + ], + [ + 10.200276465086386, + 53.514226346157095 + ], + [ + 10.210601309388345, + 53.52004653741589 + ], + [ + 10.223945169474211, + 53.505771154727455 + ], + [ + 10.218607039340746, + 53.49905535424519 + ], + [ + 10.22605960564528, + 53.49545964990659 + ], + [ + 10.236678548001505, + 53.49635445350513 + ], + [ + 10.238366620892513, + 53.483264110058016 + ], + [ + 10.252127736381494, + 53.4773084508369 + ], + [ + 10.257892506733748, + 53.47814666014916 + ], + [ + 10.259780745951018, + 53.47443895787108 + ], + [ + 10.26432591949112, + 53.475139689157054 + ], + [ + 10.265197815182372, + 53.4698393413865 + ], + [ + 10.272783959359039, + 53.46783160262546 + ], + [ + 10.26943024237016, + 53.46406002503157 + ], + [ + 10.297844032947278, + 53.45159163410815 + ], + [ + 10.295629322764723, + 53.448712259267985 + ], + [ + 10.301524989656045, + 53.443258013321575 + ], + [ + 10.307983818555154, + 53.44290878578282 + ], + [ + 10.311646183037798, + 53.45232345406419 + ], + [ + 10.325959157503204, + 53.44963953851845 + ], + [ + 10.315456557990432, + 53.44123970050331 + ], + [ + 10.318190260882641, + 53.43533051051012 + ], + [ + 10.307886339226927, + 53.4347843186893 + ], + [ + 10.28481846345573, + 53.424591422919846 + ], + [ + 10.260551460481379, + 53.41878603411772 + ], + [ + 10.243127778336234, + 53.398745912937635 + ], + [ + 10.23151219210089, + 53.3950004667599 + ], + [ + 10.167735069191409, + 53.398502485305 + ], + [ + 10.152813255841258, + 53.406792285250916 + ], + [ + 10.138409181172985, + 53.42094124651158 + ], + [ + 10.108735530378492, + 53.42667402693863 + ], + [ + 10.084602253565926, + 53.45040106089126 + ], + [ + 10.051810704150297, + 53.46391893837159 + ], + [ + 10.042178367266906, + 53.45616395979726 + ], + [ + 10.04184924758295, + 53.45163342122589 + ], + [ + 10.049409552541954, + 53.449908891782016 + ], + [ + 10.045738931290535, + 53.44674105060025 + ], + [ + 10.035875719627825, + 53.44704577592397 + ], + [ + 10.032431613494522, + 53.443923313250906 + ], + [ + 10.020944604967063, + 53.44686279054996 + ], + [ + 10.01461347547089, + 53.442200797712744 + ], + [ + 10.029273487863055, + 53.43516432943543 + ], + [ + 10.018640369007482, + 53.429309071130625 + ], + [ + 10.009773511211693, + 53.429465158630514 + ], + [ + 10.001580055328166, + 53.42483092800273 + ], + [ + 9.996389542749169, + 53.42611291700363 + ], + [ + 9.984432872198512, + 53.41541377797747 + ], + [ + 9.974888824723008, + 53.41473534303626 + ], + [ + 9.975455462719706, + 53.42145110069919 + ], + [ + 9.970929249463458, + 53.423759372298235 + ], + [ + 9.964358565927975, + 53.42217619786358 + ], + [ + 9.963272627483008, + 53.42732103521411 + ], + [ + 9.949211967467221, + 53.43094997324981 + ], + [ + 9.942015790023667, + 53.42105241809559 + ], + [ + 9.924552483735086, + 53.41962394993759 + ], + [ + 9.916487327887177, + 53.414067878956594 + ], + [ + 9.906566144927528, + 53.41579090928585 + ], + [ + 9.916452760371266, + 53.424865668304065 + ], + [ + 9.914499716371703, + 53.430019520620164 + ], + [ + 9.92148617764988, + 53.436550149898316 + ], + [ + 9.913898934556729, + 53.44842908634777 + ], + [ + 9.90158351081832, + 53.4573226502745 + ], + [ + 9.898793191007329, + 53.45511200151591 + ], + [ + 9.895945433225203, + 53.457385000827486 + ], + [ + 9.873373449784616, + 53.442377825740216 + ], + [ + 9.86912038099791, + 53.44458409464696 + ], + [ + 9.8666525705304, + 53.44006309790462 + ], + [ + 9.861543066718188, + 53.43954318127669 + ], + [ + 9.862387477399407, + 53.42987659116133 + ], + [ + 9.835896241373785, + 53.45145011143515 + ], + [ + 9.807465885354624, + 53.46282824648053 + ], + [ + 9.799804376426085, + 53.46963746774069 + ], + [ + 9.802426169816288, + 53.493251538270876 + ], + [ + 9.782742898818771, + 53.49153897645717 + ], + [ + 9.78452477077233, + 53.500011701757394 + ], + [ + 9.763793943924538, + 53.508106504069964 + ], + [ + 9.771585437850343, + 53.52275584849359 + ], + [ + 9.778320126394242, + 53.51946144732589 + ], + [ + 9.765441705144093, + 53.541114561563866 + ], + [ + 9.772076477709113, + 53.54338611652039 + ], + [ + 9.816526367092106, + 53.52934837155728 + ], + [ + 9.82504439477364, + 53.53348403135279 + ], + [ + 9.810036056670743, + 53.54115620876785 + ], + [ + 9.82342204768252, + 53.547700381770554 + ], + [ + 9.878179984565643, + 53.54011644499803 + ], + [ + 9.934437130059498, + 53.53991974515075 + ], + [ + 9.936023974068984, + 53.544384121691024 + ], + [ + 9.862757498504338, + 53.546669593376016 + ], + [ + 9.770567430931612, + 53.56307132952382 + ], + [ + 9.734364927261794, + 53.56521556356656 + ], + [ + 9.736960312632908, + 53.57738982248152 + ], + [ + 9.742487476325886, + 53.57820562178773 + ], + [ + 9.736263386727696, + 53.58185157579794 + ], + [ + 9.745658528654094, + 53.58870269088769 + ], + [ + 9.743435992021185, + 53.597576174138666 + ], + [ + 9.748433152837453, + 53.60389675241702 + ], + [ + 9.75561761719217, + 53.602529448878315 + ], + [ + 9.759101185730396, + 53.610925126374624 + ], + [ + 9.753535447923335, + 53.61299431443449 + ], + [ + 9.7601259536411, + 53.62448168416528 + ], + [ + 9.770293990024692, + 53.6274624146951 + ], + [ + 9.770633503997212, + 53.61622994061122 + ], + [ + 9.798122740372763, + 53.6075163079464 + ], + [ + 9.790020186276863, + 53.60427470330982 + ], + [ + 9.798115235598269, + 53.59592188472634 + ], + [ + 9.816157304404014, + 53.586219904801744 + ], + [ + 9.828781927692743, + 53.58529056771732 + ], + [ + 9.836707190141833, + 53.5875301860782 + ], + [ + 9.839637986646009, + 53.595000525478284 + ], + [ + 9.858104137054651, + 53.59959068182893 + ], + [ + 9.861920450180394, + 53.60722132240761 + ], + [ + 9.879147218863908, + 53.61980798735486 + ], + [ + 9.889685196511644, + 53.62232685359805 + ], + [ + 9.885079826489415, + 53.62352169003423 + ], + [ + 9.904691425336217, + 53.6417951145073 + ], + [ + 9.904751870413802, + 53.651787044021205 + ], + [ + 9.92081042315289, + 53.65546630656932 + ], + [ + 9.984841957333243, + 53.64731229189615 + ], + [ + 9.989837235354289, + 53.64948943232431 + ], + [ + 9.990542573146294, + 53.67070614860927 + ], + [ + 9.998695505614531, + 53.681467459242384 + ], + [ + 10.040778727855786, + 53.68199003929469 + ], + [ + 10.050456295898531, + 53.67694009903421 + ], + [ + 10.069265382287425, + 53.67945055909085 + ], + [ + 10.067134556755057, + 53.68597579868181 + ], + [ + 10.060621309681972, + 53.68852028012235 + ], + [ + 10.065662822793703, + 53.68899448805932 + ], + [ + 10.069387932804963, + 53.69625326531857 + ], + [ + 10.077504785335915, + 53.699748876142856 + ], + [ + 10.07909745481106, + 53.70415678529316 + ], + [ + 10.069628136120706, + 53.70624463780583 + ], + [ + 10.073566464701056, + 53.70922317855362 + ], + [ + 10.069518984749026, + 53.71116783033607 + ], + [ + 10.080016639046711, + 53.71406094292631 + ], + [ + 10.076339390939193, + 53.71529728297146 + ], + [ + 10.081842127963116, + 53.720420081413806 + ], + [ + 10.10235546156596, + 53.71746615822214 + ], + [ + 10.104019694554617, + 53.71491084200711 + ], + [ + 10.115133992767122, + 53.716376167759464 + ], + [ + 10.121056101320123, + 53.71339516739309 + ], + [ + 10.126388389545214, + 53.71962999931771 + ], + [ + 10.161501516426284, + 53.733357248640694 + ], + [ + 10.162874102693495, + 53.73808674378503 + ], + [ + 10.185684201431359, + 53.731291611717715 + ] + ] + ], + [ + [ + [ + 8.502637847575935, + 53.92809681083795 + ], + [ + 8.516904179637224, + 53.92280565536042 + ], + [ + 8.514655342663625, + 53.917649462874365 + ], + [ + 8.500588416126288, + 53.912664209919065 + ], + [ + 8.486976415401191, + 53.91391154602328 + ], + [ + 8.49113103082856, + 53.928670854565794 + ], + [ + 8.497869722995048, + 53.931918456477746 + ], + [ + 8.502637847575935, + 53.92809681083795 + ] + ] + ], + [ + [ + [ + 8.450165207503757, + 53.958933569504204 + ], + [ + 8.438759142421837, + 53.94555272765717 + ], + [ + 8.428038230892776, + 53.94294872223847 + ], + [ + 8.421763719170004, + 53.94483910817989 + ], + [ + 8.425394838001608, + 53.956814890256986 + ], + [ + 8.44057494420577, + 53.95831565098939 + ], + [ + 8.435740315573813, + 53.962252311349125 + ], + [ + 8.445869568229213, + 53.96362371557804 + ], + [ + 8.450165207503757, + 53.958933569504204 + ] + ] + ], + [ + [ + [ + 9.751655990483385, + 53.556820626425356 + ], + [ + 9.779012104494946, + 53.55461016671483 + ], + [ + 9.783306057763161, + 53.551122425296604 + ], + [ + 9.774515433977172, + 53.5497006710467 + ], + [ + 9.779179857936535, + 53.553362928946186 + ], + [ + 9.740285964420952, + 53.55689197189158 + ], + [ + 9.751655990483385, + 53.556820626425356 + ] + ] + ], + [ + [ + [ + 9.731356375892878, + 53.55774732472781 + ], + [ + 9.732040373958869, + 53.55747161827935 + ], + [ + 9.730104054808317, + 53.55758091192113 + ], + [ + 9.730315195881431, + 53.55801930898749 + ], + [ + 9.731356375892878, + 53.55774732472781 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 1, + "BSG": 1, + "RS": "13", + "AGS": "13", + "SDV_RS": "130040000000", + "GEN": "Mecklenburg-Vorpommern", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "13", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE8", + "RS_0": "130000000000", + "AGS_0": "13000000", + "WSK": "2014/11/01", + "DEBKG_ID": "DEBKGDL20000QFG7", + "destatis": { + "population": 1599138, + "population_m": 787945, + "population_w": 811193 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 13.96564938113981, + 54.67372162187854 + ], + [ + 13.995530150647845, + 54.64193911972076 + ], + [ + 14.01060759517279, + 54.61732305035042 + ], + [ + 14.078068663523059, + 54.44249952532589 + ], + [ + 14.069643596710907, + 54.27764356645788 + ], + [ + 14.168036071933772, + 54.238809840368425 + ], + [ + 14.242210996467158, + 53.98771911208748 + ], + [ + 14.226321977743522, + 53.92864344116296 + ], + [ + 14.181793823225142, + 53.94842151690801 + ], + [ + 14.142192811506325, + 53.97687827701898 + ], + [ + 14.04998968780543, + 54.02940677754876 + ], + [ + 14.01621660133138, + 54.053891849917555 + ], + [ + 13.967277492802996, + 54.070330836432795 + ], + [ + 13.926712551858175, + 54.0782250527307 + ], + [ + 13.870066368770175, + 54.10296290882603 + ], + [ + 13.83325313670288, + 54.13194104428721 + ], + [ + 13.812238477728581, + 54.169558009741166 + ], + [ + 13.808924108397232, + 54.16950688493692 + ], + [ + 13.795289528147428, + 54.1745028483234 + ], + [ + 13.758304868080058, + 54.16866745944169 + ], + [ + 13.749296748353201, + 54.15847457365981 + ], + [ + 13.750746030981956, + 54.14996040580104 + ], + [ + 13.757985742918008, + 54.15054278862818 + ], + [ + 13.751499107790803, + 54.14907553330174 + ], + [ + 13.758091047743088, + 54.1345570579223 + ], + [ + 13.772111191609959, + 54.13399878186043 + ], + [ + 13.774831549516838, + 54.120106014023946 + ], + [ + 13.78416495789351, + 54.11889087301464 + ], + [ + 13.792129906387524, + 54.111059036678284 + ], + [ + 13.813839361064392, + 54.107823258157005 + ], + [ + 13.808174726748758, + 54.106484802519844 + ], + [ + 13.813377946866154, + 54.09853559440842 + ], + [ + 13.808445983846173, + 54.081215997931295 + ], + [ + 13.800798756984262, + 54.074807602005656 + ], + [ + 13.797938701686746, + 54.061959356129336 + ], + [ + 13.788091635244685, + 54.05601212329091 + ], + [ + 13.790568132689668, + 54.04867718562 + ], + [ + 13.784565864510075, + 54.04622066460675 + ], + [ + 13.781238662704157, + 54.03854949507108 + ], + [ + 13.772888491004508, + 54.040830573434576 + ], + [ + 13.764304802705809, + 54.02998066096917 + ], + [ + 13.770502404580542, + 54.01882862946805 + ], + [ + 13.801286644326956, + 54.018740706517455 + ], + [ + 13.809801080252845, + 54.03095068989217 + ], + [ + 13.821042414358743, + 54.037688243995035 + ], + [ + 13.838366946898427, + 54.04022068370088 + ], + [ + 13.847498220703896, + 54.04355017100559 + ], + [ + 13.847420129163993, + 54.04674087033544 + ], + [ + 13.858941102742088, + 54.04811080696491 + ], + [ + 13.873048790629555, + 54.03909984886463 + ], + [ + 13.875893320641111, + 54.041765221114986 + ], + [ + 13.868145730667532, + 54.04562375290579 + ], + [ + 13.87967646341567, + 54.04025984205131 + ], + [ + 13.874106620886451, + 54.0322899785287 + ], + [ + 13.8703520695066, + 54.03647293934276 + ], + [ + 13.86596802783948, + 54.033041170150746 + ], + [ + 13.863675410885458, + 54.022133854213905 + ], + [ + 13.853236517666968, + 54.01367774207128 + ], + [ + 13.853346612081078, + 54.004384921323364 + ], + [ + 13.861864380880466, + 53.99975511616929 + ], + [ + 13.86689631720513, + 54.007510351418794 + ], + [ + 13.898675175839013, + 54.01207258416625 + ], + [ + 13.909527550177058, + 54.02626431955447 + ], + [ + 13.923007883795862, + 54.035268358262535 + ], + [ + 13.928140340718816, + 54.030678860989205 + ], + [ + 13.916452900114013, + 54.02186416371069 + ], + [ + 13.926382377764492, + 54.016226666244926 + ], + [ + 13.92439243260822, + 54.02324793473886 + ], + [ + 13.934209408388577, + 54.02758582636958 + ], + [ + 13.915505704312844, + 54.046793929098264 + ], + [ + 13.907348924627057, + 54.04311474422234 + ], + [ + 13.917224208782667, + 54.06051802797648 + ], + [ + 13.911190421584026, + 54.063994330812385 + ], + [ + 13.951359787506052, + 54.05897990131168 + ], + [ + 13.965955433829054, + 54.05946066248185 + ], + [ + 13.973258915622317, + 54.06399662930346 + ], + [ + 13.976990561574588, + 54.06212286741316 + ], + [ + 13.968865000266803, + 54.059436977774155 + ], + [ + 13.997693497037725, + 54.04150401526162 + ], + [ + 14.0043611761675, + 54.01065535254968 + ], + [ + 14.011972114444369, + 54.010070161599145 + ], + [ + 14.017609414658056, + 54.0150217142464 + ], + [ + 14.0147439622995, + 54.02032703121529 + ], + [ + 14.016437449160803, + 54.02147838984297 + ], + [ + 14.018561879892525, + 54.01779271450091 + ], + [ + 14.032710449242925, + 54.01710739475581 + ], + [ + 14.043296760255883, + 54.001829411971784 + ], + [ + 14.037375385039622, + 53.99858090035155 + ], + [ + 14.047581111828352, + 53.99744244897172 + ], + [ + 14.04886933728916, + 53.980646369718514 + ], + [ + 14.035033492097913, + 53.950004122907046 + ], + [ + 14.03692999790714, + 53.94655260033496 + ], + [ + 14.043531510093919, + 53.946193641694066 + ], + [ + 14.040180528730804, + 53.940721263702315 + ], + [ + 14.011792623540495, + 53.94931961559826 + ], + [ + 14.010138100588513, + 53.953991573283844 + ], + [ + 14.02344768161484, + 53.95812696243806 + ], + [ + 14.016582605666436, + 53.96003400525529 + ], + [ + 14.024514060807023, + 53.96052366797026 + ], + [ + 14.023295886148386, + 53.96221409963328 + ], + [ + 14.004308508153027, + 53.959123593598285 + ], + [ + 13.995213324110216, + 53.96280518065403 + ], + [ + 13.984094493581756, + 53.959405005614734 + ], + [ + 13.983681822841282, + 53.96210030227704 + ], + [ + 13.963523534523313, + 53.95703787841118 + ], + [ + 13.971301696757799, + 53.950797221191905 + ], + [ + 13.958666706253727, + 53.93864351416809 + ], + [ + 13.959602032996424, + 53.93399228835181 + ], + [ + 13.952709116924334, + 53.93492593600249 + ], + [ + 13.951361414010627, + 53.94595528503979 + ], + [ + 13.958216449419936, + 53.95301696149062 + ], + [ + 13.949969503790411, + 53.95887000472203 + ], + [ + 13.972228478322377, + 53.96961466400632 + ], + [ + 13.96309143663235, + 53.973437645625204 + ], + [ + 13.965029898332489, + 53.989799814839444 + ], + [ + 13.945111096349857, + 53.99457702597409 + ], + [ + 13.930471348928407, + 53.990812520327935 + ], + [ + 13.905954691077094, + 53.98954333631846 + ], + [ + 13.895136172847575, + 53.96648573282817 + ], + [ + 13.922692555695427, + 53.950629180395 + ], + [ + 13.924189642538797, + 53.94262260252984 + ], + [ + 13.932171684358162, + 53.9358648667131 + ], + [ + 13.932002550045507, + 53.92028088599486 + ], + [ + 13.938260160717368, + 53.913798408818955 + ], + [ + 13.937585419447636, + 53.908335212677244 + ], + [ + 13.921472668742695, + 53.8879653760189 + ], + [ + 13.902957706128568, + 53.88544687345907 + ], + [ + 13.891684095484145, + 53.87661841444226 + ], + [ + 13.874289787055176, + 53.877862520001074 + ], + [ + 13.859023828892308, + 53.87165202508637 + ], + [ + 13.834591743087703, + 53.871196209381345 + ], + [ + 13.829721511769288, + 53.85764091227404 + ], + [ + 13.821786999497537, + 53.85703476494558 + ], + [ + 13.826150250821621, + 53.849685181878954 + ], + [ + 13.845217823210364, + 53.85107677938359 + ], + [ + 13.857522011392522, + 53.846599694015744 + ], + [ + 13.859050251641488, + 53.84314185235268 + ], + [ + 13.898238399674291, + 53.839906142846154 + ], + [ + 13.917839008834173, + 53.84522215307346 + ], + [ + 13.931506522938667, + 53.87037201062712 + ], + [ + 13.955056460319648, + 53.86032405477556 + ], + [ + 13.949911075727574, + 53.84996075180567 + ], + [ + 13.93644640842609, + 53.84770251981864 + ], + [ + 13.923313253506471, + 53.852088237962484 + ], + [ + 13.921753193574368, + 53.84702116067658 + ], + [ + 13.939010886284544, + 53.84343669611247 + ], + [ + 13.980123645529163, + 53.85021288980688 + ], + [ + 13.991286246204014, + 53.84850061971146 + ], + [ + 14.019709769324757, + 53.86930093954539 + ], + [ + 14.040923856238884, + 53.874508388064214 + ], + [ + 14.06278519540821, + 53.86945788159102 + ], + [ + 14.085551770360619, + 53.87483077730308 + ], + [ + 14.114891802918843, + 53.86912670522886 + ], + [ + 14.125798424705236, + 53.87186455188383 + ], + [ + 14.179064045328216, + 53.870723189288384 + ], + [ + 14.190854626299549, + 53.87300094015655 + ], + [ + 14.206114092055529, + 53.86593999137174 + ], + [ + 14.21307750822756, + 53.86647963356885 + ], + [ + 14.270424930257724, + 53.78994875873474 + ], + [ + 14.178515076653134, + 53.8068027660173 + ], + [ + 13.986859913263503, + 53.81220819986815 + ], + [ + 13.920310481888466, + 53.82566965153297 + ], + [ + 13.904453525417184, + 53.82408189670246 + ], + [ + 13.889602068795936, + 53.82718603343637 + ], + [ + 13.851336510222653, + 53.8450587497109 + ], + [ + 13.822463700150278, + 53.84770455435261 + ], + [ + 13.818628812146915, + 53.85921831982827 + ], + [ + 13.826648935721181, + 53.865622274488175 + ], + [ + 13.829385193322718, + 53.8743254692581 + ], + [ + 13.82615377539499, + 53.877628140688046 + ], + [ + 13.847222143689011, + 53.87795046423105 + ], + [ + 13.851308795825862, + 53.888327942746244 + ], + [ + 13.864752438751916, + 53.90046065928238 + ], + [ + 13.887366981821463, + 53.91015533953119 + ], + [ + 13.90328711299315, + 53.91099614184393 + ], + [ + 13.914106242710455, + 53.92185745907383 + ], + [ + 13.894151942091659, + 53.94268714727463 + ], + [ + 13.884566373221167, + 53.94443489996476 + ], + [ + 13.88131484954302, + 53.94979509071791 + ], + [ + 13.86979291546573, + 53.95239243674952 + ], + [ + 13.856599698924164, + 53.950102710306986 + ], + [ + 13.852625101080918, + 53.95275542286169 + ], + [ + 13.853849802602687, + 53.96462893073078 + ], + [ + 13.83382162403247, + 53.98442862836341 + ], + [ + 13.810881141431805, + 53.99530216306804 + ], + [ + 13.79554426841775, + 53.99580861678154 + ], + [ + 13.760540241266927, + 54.015454818700285 + ], + [ + 13.757695006001109, + 54.0277784571737 + ], + [ + 13.749534276487225, + 54.026244898284276 + ], + [ + 13.743604332031424, + 54.02871742857311 + ], + [ + 13.744317476814235, + 54.03262647308472 + ], + [ + 13.7613965750886, + 54.035653651424596 + ], + [ + 13.782645259964225, + 54.04754293636763 + ], + [ + 13.785380770240995, + 54.05085076993212 + ], + [ + 13.773806348246389, + 54.059802087974326 + ], + [ + 13.7850403835639, + 54.065572726828634 + ], + [ + 13.79016878254814, + 54.06441493118695 + ], + [ + 13.78949166010408, + 54.07092650506366 + ], + [ + 13.795335358624811, + 54.07755166283361 + ], + [ + 13.793369996568508, + 54.085522087381335 + ], + [ + 13.808768747141572, + 54.1003803770425 + ], + [ + 13.773558815209109, + 54.11789753323277 + ], + [ + 13.768275246427226, + 54.12666024283209 + ], + [ + 13.747314704983141, + 54.13459580841519 + ], + [ + 13.751573912245785, + 54.13478964233972 + ], + [ + 13.749066128722378, + 54.13978287329423 + ], + [ + 13.734185200255185, + 54.13581994898506 + ], + [ + 13.718690844942982, + 54.14458480534585 + ], + [ + 13.69738920860644, + 54.14892290660929 + ], + [ + 13.695619561355207, + 54.15793611744592 + ], + [ + 13.718302120068527, + 54.163229567986576 + ], + [ + 13.706645710484452, + 54.17161477066323 + ], + [ + 13.6961985427943, + 54.17230989804991 + ], + [ + 13.652950979775436, + 54.1536965082261 + ], + [ + 13.644008771921863, + 54.15697919762264 + ], + [ + 13.641126993577421, + 54.1538528194582 + ], + [ + 13.645725980533548, + 54.15082476237478 + ], + [ + 13.623476488526197, + 54.139660511562035 + ], + [ + 13.575968481474892, + 54.13180816535722 + ], + [ + 13.574243793095977, + 54.13512072984501 + ], + [ + 13.572401855013345, + 54.131800834024176 + ], + [ + 13.55972069808235, + 54.13045634704195 + ], + [ + 13.52915001622646, + 54.1310574551659 + ], + [ + 13.485988283042206, + 54.12277805105457 + ], + [ + 13.47694902174387, + 54.11575418989184 + ], + [ + 13.501854178799121, + 54.087109293963636 + ], + [ + 13.500067612254496, + 54.0846628420327 + ], + [ + 13.489404453856254, + 54.083845782542056 + ], + [ + 13.458847549528906, + 54.090660949192376 + ], + [ + 13.460165599608722, + 54.095582537287754 + ], + [ + 13.448100724049988, + 54.10184402420559 + ], + [ + 13.451198595675391, + 54.105172543834605 + ], + [ + 13.439190038169622, + 54.11227381495498 + ], + [ + 13.439969047958133, + 54.123023428177234 + ], + [ + 13.430165047074775, + 54.135547783814545 + ], + [ + 13.406736828937497, + 54.14703561243014 + ], + [ + 13.414548489129043, + 54.16374703011311 + ], + [ + 13.422170386048682, + 54.16741152854079 + ], + [ + 13.419283788156422, + 54.17283972821223 + ], + [ + 13.394404991111022, + 54.18121048744891 + ], + [ + 13.400193122703671, + 54.17830883276825 + ], + [ + 13.399804827368303, + 54.16964341139353 + ], + [ + 13.37900287010842, + 54.177114089622016 + ], + [ + 13.346995493175285, + 54.16529080652924 + ], + [ + 13.337272728873941, + 54.167504159115175 + ], + [ + 13.316391960422667, + 54.160125498210824 + ], + [ + 13.335253028730417, + 54.173951313255195 + ], + [ + 13.340661722950896, + 54.173828780055686 + ], + [ + 13.33665740053555, + 54.17700110966803 + ], + [ + 13.357489356599084, + 54.18336499830946 + ], + [ + 13.371283612416738, + 54.18176564015851 + ], + [ + 13.365334839476393, + 54.18530443454028 + ], + [ + 13.344701586265598, + 54.181111306911916 + ], + [ + 13.32660818510378, + 54.18382359660869 + ], + [ + 13.306337121566722, + 54.204323206604315 + ], + [ + 13.291229097628854, + 54.23403459710119 + ], + [ + 13.259698906375403, + 54.24110657546086 + ], + [ + 13.215672969938947, + 54.24121220946072 + ], + [ + 13.210483593076129, + 54.24466233313793 + ], + [ + 13.21621586810721, + 54.24981628896397 + ], + [ + 13.20232149675444, + 54.2574195869167 + ], + [ + 13.190234667769655, + 54.258934452802066 + ], + [ + 13.185336941341491, + 54.266342545652314 + ], + [ + 13.17268195164214, + 54.26309172309027 + ], + [ + 13.167175031798585, + 54.26623279240337 + ], + [ + 13.159483806199885, + 54.25849371382538 + ], + [ + 13.14276586122986, + 54.25365470199926 + ], + [ + 13.141921017481998, + 54.25735258101275 + ], + [ + 13.160438543561263, + 54.26763093249802 + ], + [ + 13.176645583478257, + 54.26648770403197 + ], + [ + 13.17842733712906, + 54.26927397840825 + ], + [ + 13.16659804977282, + 54.27893985501411 + ], + [ + 13.154246902603806, + 54.269168547102716 + ], + [ + 13.147670402408322, + 54.267929342041654 + ], + [ + 13.1328730482043, + 54.27941493308666 + ], + [ + 13.130945561514721, + 54.28775186712098 + ], + [ + 13.139910550185702, + 54.30736592063568 + ], + [ + 13.13509608418126, + 54.317358639990324 + ], + [ + 13.138935062134179, + 54.31929075450658 + ], + [ + 13.149561964777023, + 54.31279152314269 + ], + [ + 13.169624899169147, + 54.30982817577656 + ], + [ + 13.185501312267274, + 54.300019042549465 + ], + [ + 13.18066905749174, + 54.29637669606622 + ], + [ + 13.169736537787756, + 54.302267278445996 + ], + [ + 13.163972524667763, + 54.30108212611669 + ], + [ + 13.164697434007255, + 54.3042522317176 + ], + [ + 13.15411225764335, + 54.30464262803992 + ], + [ + 13.139702005737833, + 54.29636444374005 + ], + [ + 13.141667485420092, + 54.28092434436722 + ], + [ + 13.16544785320296, + 54.28940802765479 + ], + [ + 13.181069042195118, + 54.28743886636188 + ], + [ + 13.192975339628909, + 54.29709023133898 + ], + [ + 13.203024715531614, + 54.290274000884 + ], + [ + 13.196188272446882, + 54.284483600351344 + ], + [ + 13.199380385568418, + 54.26997979175375 + ], + [ + 13.215349814334534, + 54.271373128322615 + ], + [ + 13.21780084703925, + 54.27930802634678 + ], + [ + 13.21711096760952, + 54.27301820809244 + ], + [ + 13.23984408565021, + 54.26630410154186 + ], + [ + 13.25043097576403, + 54.258199460191975 + ], + [ + 13.268173002174953, + 54.25372972465602 + ], + [ + 13.287434672455545, + 54.25923766382417 + ], + [ + 13.321518896132224, + 54.258076759421094 + ], + [ + 13.314494888069278, + 54.259461244628035 + ], + [ + 13.31458723340022, + 54.2638528167619 + ], + [ + 13.309688215744822, + 54.26570288062694 + ], + [ + 13.336708765461964, + 54.27856150624832 + ], + [ + 13.334211455037957, + 54.27025859074168 + ], + [ + 13.322781407081594, + 54.26617949863442 + ], + [ + 13.32685632318146, + 54.258470221929386 + ], + [ + 13.32167940762836, + 54.245662351693014 + ], + [ + 13.297026538459834, + 54.252287031344885 + ], + [ + 13.295037628295162, + 54.255422101935444 + ], + [ + 13.290848629043682, + 54.25128307429665 + ], + [ + 13.308907532553453, + 54.247694578785065 + ], + [ + 13.323668996393842, + 54.237543923136826 + ], + [ + 13.328583547494679, + 54.23914005448966 + ], + [ + 13.383515737587052, + 54.228869888984086 + ], + [ + 13.39358718024723, + 54.22097130782947 + ], + [ + 13.39929700604527, + 54.226831291350436 + ], + [ + 13.417290242043409, + 54.23247463200173 + ], + [ + 13.424720026422822, + 54.238545525076084 + ], + [ + 13.417371900675901, + 54.255824296529866 + ], + [ + 13.401554232521917, + 54.26570604659353 + ], + [ + 13.391591761215183, + 54.26396724303605 + ], + [ + 13.389873269324998, + 54.25869999300683 + ], + [ + 13.378793134102708, + 54.25333392596754 + ], + [ + 13.364478087728097, + 54.26410379073555 + ], + [ + 13.359018898067568, + 54.257494953299194 + ], + [ + 13.363361967746382, + 54.2546569746733 + ], + [ + 13.365872549597912, + 54.257966345171795 + ], + [ + 13.369372168875008, + 54.254177344945205 + ], + [ + 13.357959282843723, + 54.246677261814845 + ], + [ + 13.359623604211814, + 54.25046253480705 + ], + [ + 13.352294492507385, + 54.253824792007116 + ], + [ + 13.358671520733301, + 54.25593366197474 + ], + [ + 13.358019543637536, + 54.26005696132903 + ], + [ + 13.35082142280256, + 54.26983544335607 + ], + [ + 13.361219057784266, + 54.27299407206406 + ], + [ + 13.368525584433664, + 54.27071610733858 + ], + [ + 13.378623815546364, + 54.27738943738069 + ], + [ + 13.371533823404118, + 54.27780852750124 + ], + [ + 13.390755697011773, + 54.279450284690185 + ], + [ + 13.386721412358192, + 54.26656153438675 + ], + [ + 13.410859688091445, + 54.286175719953214 + ], + [ + 13.412444523439646, + 54.2965072138357 + ], + [ + 13.419602258613887, + 54.30278898163111 + ], + [ + 13.445169609906579, + 54.31393964534206 + ], + [ + 13.461909341692287, + 54.31640666231247 + ], + [ + 13.466943739605547, + 54.326416269968185 + ], + [ + 13.462301919843917, + 54.329027246558304 + ], + [ + 13.45252598232681, + 54.326073675480714 + ], + [ + 13.45717691198436, + 54.32918554958154 + ], + [ + 13.450553491211068, + 54.33137668354595 + ], + [ + 13.45462557381966, + 54.336092717624666 + ], + [ + 13.464384567466265, + 54.329127114346484 + ], + [ + 13.479465782401135, + 54.330314134822636 + ], + [ + 13.483014679766713, + 54.334847164402426 + ], + [ + 13.495966404013705, + 54.336797935093315 + ], + [ + 13.50079603158131, + 54.34070083010594 + ], + [ + 13.507952525927877, + 54.34026300437091 + ], + [ + 13.507070602848941, + 54.34420673147387 + ], + [ + 13.51787684882892, + 54.340421294339265 + ], + [ + 13.53082988587898, + 54.33991960938318 + ], + [ + 13.538146084418495, + 54.343083589818974 + ], + [ + 13.550763945724883, + 54.33968729167256 + ], + [ + 13.565221780341282, + 54.34499447797968 + ], + [ + 13.575317963564535, + 54.35299834895624 + ], + [ + 13.5897925429212, + 54.3516450832439 + ], + [ + 13.600918213145489, + 54.34609882892725 + ], + [ + 13.614171847825329, + 54.33019748673489 + ], + [ + 13.628859679478209, + 54.33133081309647 + ], + [ + 13.623193746929035, + 54.334538937461524 + ], + [ + 13.62986162844093, + 54.33893837241921 + ], + [ + 13.639096766043416, + 54.33946906500365 + ], + [ + 13.635887107040661, + 54.34399546614383 + ], + [ + 13.65038010838301, + 54.34905448956857 + ], + [ + 13.65404907961968, + 54.34691770559842 + ], + [ + 13.674806095073654, + 54.35094809875968 + ], + [ + 13.682148615003536, + 54.349891965916136 + ], + [ + 13.68460307984796, + 54.3463082403734 + ], + [ + 13.674048891578463, + 54.33732550143583 + ], + [ + 13.642380188737134, + 54.325494970396015 + ], + [ + 13.612007359360947, + 54.32063902204022 + ], + [ + 13.609803577240895, + 54.31660384305984 + ], + [ + 13.617289209989124, + 54.315514866127295 + ], + [ + 13.62089999725514, + 54.31862761953286 + ], + [ + 13.63729181395711, + 54.31932096274457 + ], + [ + 13.672228455761118, + 54.33030940925259 + ], + [ + 13.68118481109275, + 54.32602252293959 + ], + [ + 13.703623142194301, + 54.32630329202669 + ], + [ + 13.703350122666233, + 54.32046071513869 + ], + [ + 13.69679152772038, + 54.3174613048646 + ], + [ + 13.700308264047505, + 54.316757387400465 + ], + [ + 13.685992520472935, + 54.315123680503774 + ], + [ + 13.685400756626391, + 54.3102466212975 + ], + [ + 13.681338591624323, + 54.31226887944836 + ], + [ + 13.677761019629054, + 54.30839054288942 + ], + [ + 13.656620541666976, + 54.30402500172882 + ], + [ + 13.645403994623273, + 54.29756068922634 + ], + [ + 13.655129192866694, + 54.28847276174948 + ], + [ + 13.661703823068702, + 54.28752476896206 + ], + [ + 13.6693393159141, + 54.291897906502754 + ], + [ + 13.691743214981562, + 54.28971309722815 + ], + [ + 13.693256429749527, + 54.29387501418784 + ], + [ + 13.702217860655368, + 54.295629683877394 + ], + [ + 13.70946986783543, + 54.279912293206934 + ], + [ + 13.698696298339595, + 54.28061521612472 + ], + [ + 13.690814748858166, + 54.28743593484214 + ], + [ + 13.684241264778565, + 54.28494898536239 + ], + [ + 13.687040140012039, + 54.27994137130382 + ], + [ + 13.697047651572742, + 54.27877384742994 + ], + [ + 13.70766143157164, + 54.26874385645765 + ], + [ + 13.724230547824098, + 54.27385546490701 + ], + [ + 13.715406242615995, + 54.29408535721023 + ], + [ + 13.719296410668813, + 54.31150637149067 + ], + [ + 13.724224197282487, + 54.31734384793341 + ], + [ + 13.730549021254129, + 54.31772360620681 + ], + [ + 13.732686881705856, + 54.32788297943786 + ], + [ + 13.740058041749988, + 54.33548112264412 + ], + [ + 13.766450128832131, + 54.33964923685142 + ], + [ + 13.766909408244127, + 54.34183448800088 + ], + [ + 13.74752859349416, + 54.34516134579491 + ], + [ + 13.721177838715354, + 54.35913564499241 + ], + [ + 13.70038984953981, + 54.38357474706612 + ], + [ + 13.703277027761917, + 54.385688793076234 + ], + [ + 13.697638487384788, + 54.38406353074777 + ], + [ + 13.67293723826614, + 54.40120108445751 + ], + [ + 13.664528383275925, + 54.40321960384134 + ], + [ + 13.656599550251432, + 54.399590658325955 + ], + [ + 13.627096676428573, + 54.39874912783587 + ], + [ + 13.613370272032501, + 54.40337348043927 + ], + [ + 13.587437965122497, + 54.42602350085039 + ], + [ + 13.570090089614101, + 54.45986853458565 + ], + [ + 13.570731062047223, + 54.471066553618435 + ], + [ + 13.577997761095995, + 54.47961462634937 + ], + [ + 13.584620398662937, + 54.480008298025915 + ], + [ + 13.589105275425483, + 54.48588400107376 + ], + [ + 13.599488931082181, + 54.48078525996563 + ], + [ + 13.601918030587797, + 54.483430047577144 + ], + [ + 13.597163945646706, + 54.48810214009927 + ], + [ + 13.609409738032413, + 54.498861024395495 + ], + [ + 13.628175848007468, + 54.506156801060555 + ], + [ + 13.63432473436388, + 54.50464767317142 + ], + [ + 13.653941013066822, + 54.51629617115725 + ], + [ + 13.669397383034863, + 54.52107268153343 + ], + [ + 13.678610370398365, + 54.53153882352022 + ], + [ + 13.68164240392781, + 54.54261644839222 + ], + [ + 13.676080031006636, + 54.55425240890566 + ], + [ + 13.67980860323092, + 54.56248552037783 + ], + [ + 13.66115881182156, + 54.57578946993169 + ], + [ + 13.634857260120203, + 54.58546757690242 + ], + [ + 13.588259269271022, + 54.584399389738294 + ], + [ + 13.490820061456063, + 54.57305633463339 + ], + [ + 13.469665355722945, + 54.57541580759591 + ], + [ + 13.460385652201328, + 54.570627730531456 + ], + [ + 13.434986750562228, + 54.57458740507105 + ], + [ + 13.418736461458217, + 54.58086724362902 + ], + [ + 13.393314796713296, + 54.59861674584919 + ], + [ + 13.383719140888632, + 54.6119903470001 + ], + [ + 13.377238393893318, + 54.63555880702733 + ], + [ + 13.391083261209833, + 54.65131723559271 + ], + [ + 13.421086231239142, + 54.65637216281828 + ], + [ + 13.432154533311763, + 54.66362405176246 + ], + [ + 13.438944147820287, + 54.677532944381646 + ], + [ + 13.42832921016432, + 54.68499697229954 + ], + [ + 13.407983983603982, + 54.68222477419074 + ], + [ + 13.378259657822706, + 54.68399352985934 + ], + [ + 13.336057421564579, + 54.675442246925414 + ], + [ + 13.28762166864883, + 54.673795350120585 + ], + [ + 13.250612882142448, + 54.66045915280371 + ], + [ + 13.21987845449273, + 54.640779086110776 + ], + [ + 13.225740569996518, + 54.61231124317785 + ], + [ + 13.214809044176347, + 54.595551909523756 + ], + [ + 13.195748149124565, + 54.582610133951114 + ], + [ + 13.167249237383919, + 54.573732068736774 + ], + [ + 13.160936899600845, + 54.55908335953245 + ], + [ + 13.175894601092514, + 54.56090659959116 + ], + [ + 13.174870154104314, + 54.56544361197815 + ], + [ + 13.177190358158052, + 54.56135447743803 + ], + [ + 13.185678194652596, + 54.570823104192606 + ], + [ + 13.194760607044529, + 54.572150905038235 + ], + [ + 13.214099220933958, + 54.58552114869943 + ], + [ + 13.228360047479697, + 54.5874299066416 + ], + [ + 13.229095890988756, + 54.59306276909661 + ], + [ + 13.232229258190026, + 54.59137797330081 + ], + [ + 13.23793905913016, + 54.59418741023783 + ], + [ + 13.227096917709092, + 54.62515494465305 + ], + [ + 13.263930222547053, + 54.64314538748981 + ], + [ + 13.282972712845224, + 54.64558892524387 + ], + [ + 13.288066959360574, + 54.63730065056834 + ], + [ + 13.287504452185413, + 54.62531443757715 + ], + [ + 13.25708302455389, + 54.59008025201768 + ], + [ + 13.243147962430152, + 54.56150811732511 + ], + [ + 13.245451284993534, + 54.55783264794415 + ], + [ + 13.256887344250954, + 54.563102311392775 + ], + [ + 13.277842045925748, + 54.564408427633914 + ], + [ + 13.288225286283035, + 54.570376981002006 + ], + [ + 13.305958051170494, + 54.5730008010583 + ], + [ + 13.315044473325202, + 54.57931206798687 + ], + [ + 13.332396506417286, + 54.58194074416439 + ], + [ + 13.334923654170614, + 54.58506051172605 + ], + [ + 13.327577016538815, + 54.59340634815167 + ], + [ + 13.34818900511051, + 54.600901044443745 + ], + [ + 13.353983328349026, + 54.61151864952651 + ], + [ + 13.37033015707644, + 54.61458211217535 + ], + [ + 13.384250291343404, + 54.5957341420947 + ], + [ + 13.385335251911131, + 54.58072564050859 + ], + [ + 13.39643757107751, + 54.572578848576924 + ], + [ + 13.424791858413244, + 54.56887819075083 + ], + [ + 13.446130971893957, + 54.551601257881586 + ], + [ + 13.483947588280493, + 54.554019439169636 + ], + [ + 13.490403389169956, + 54.55081851008695 + ], + [ + 13.484938042570908, + 54.55871302004202 + ], + [ + 13.48998093028027, + 54.55897893387266 + ], + [ + 13.490147845044477, + 54.56215170767525 + ], + [ + 13.512779181101347, + 54.56517635938097 + ], + [ + 13.510272917581332, + 54.55782361828168 + ], + [ + 13.495319550742147, + 54.5610987580702 + ], + [ + 13.491177191803969, + 54.55860303287609 + ], + [ + 13.497146887932777, + 54.55409229243139 + ], + [ + 13.493051694568532, + 54.553162475682925 + ], + [ + 13.49501139871534, + 54.54961841566446 + ], + [ + 13.502184356641418, + 54.548285983910425 + ], + [ + 13.514125852488064, + 54.527235723777316 + ], + [ + 13.510795553181717, + 54.52883616928694 + ], + [ + 13.50795294009744, + 54.52523787631774 + ], + [ + 13.513606258227622, + 54.52508502002186 + ], + [ + 13.508029045327094, + 54.5246239238178 + ], + [ + 13.514126763197439, + 54.51028999879401 + ], + [ + 13.509439751193746, + 54.50868518252601 + ], + [ + 13.500073309334926, + 54.49256321192492 + ], + [ + 13.50466499498132, + 54.48305540521237 + ], + [ + 13.493590821522202, + 54.4814626307252 + ], + [ + 13.481262153396305, + 54.48380828246946 + ], + [ + 13.448382098051875, + 54.47438154982263 + ], + [ + 13.441668866198858, + 54.4873422780157 + ], + [ + 13.412582536302267, + 54.493768653903814 + ], + [ + 13.406096513773393, + 54.50569402817613 + ], + [ + 13.414581681510148, + 54.51987495321162 + ], + [ + 13.396323684988419, + 54.5377826579256 + ], + [ + 13.380393889185067, + 54.54623260553885 + ], + [ + 13.376176823975326, + 54.55983699765106 + ], + [ + 13.364358356165237, + 54.55731376976494 + ], + [ + 13.3543639258312, + 54.54736849215527 + ], + [ + 13.378386954550423, + 54.54416059247508 + ], + [ + 13.379983390254285, + 54.540188238112606 + ], + [ + 13.38796481305364, + 54.53997760140578 + ], + [ + 13.387669796289329, + 54.53125659949863 + ], + [ + 13.37464264473413, + 54.52496501398305 + ], + [ + 13.373989745233676, + 54.52035925857338 + ], + [ + 13.358824691576075, + 54.52307067246953 + ], + [ + 13.353189758553542, + 54.518720094429824 + ], + [ + 13.345708024963555, + 54.52048608013467 + ], + [ + 13.344269285640998, + 54.52465414494765 + ], + [ + 13.360662020593166, + 54.53660547408234 + ], + [ + 13.361436902703248, + 54.54338239075617 + ], + [ + 13.336187452700326, + 54.548771463671336 + ], + [ + 13.348171352781172, + 54.55337911997524 + ], + [ + 13.353977810775765, + 54.55142284674412 + ], + [ + 13.3614523056319, + 54.569250507420236 + ], + [ + 13.370438554589763, + 54.576604816310216 + ], + [ + 13.367622400736936, + 54.579264024760626 + ], + [ + 13.355024410986559, + 54.58103197955767 + ], + [ + 13.346451168790564, + 54.578373160805796 + ], + [ + 13.344375200200874, + 54.573742578299345 + ], + [ + 13.325090712741225, + 54.568670389711215 + ], + [ + 13.297227362655871, + 54.552434452924885 + ], + [ + 13.307486252103601, + 54.53949644924757 + ], + [ + 13.303087730621428, + 54.52790053290933 + ], + [ + 13.31211582485513, + 54.52442382306469 + ], + [ + 13.311251192909218, + 54.519974718801784 + ], + [ + 13.306264891388597, + 54.51932500807764 + ], + [ + 13.309457862372689, + 54.51568885514193 + ], + [ + 13.303550089505862, + 54.51406128329047 + ], + [ + 13.287938659438439, + 54.52210751481972 + ], + [ + 13.295274770750462, + 54.53682380291197 + ], + [ + 13.289417087345562, + 54.54163532346155 + ], + [ + 13.245174357070804, + 54.55276639614791 + ], + [ + 13.243706166647788, + 54.55556790366705 + ], + [ + 13.174393209139469, + 54.54570963219214 + ], + [ + 13.144180805806702, + 54.54696566434979 + ], + [ + 13.139203637750754, + 54.5405104954123 + ], + [ + 13.149715737174905, + 54.541954148220256 + ], + [ + 13.158279159874791, + 54.53768670022608 + ], + [ + 13.162137786209712, + 54.514193193608484 + ], + [ + 13.167565089804743, + 54.51179280520842 + ], + [ + 13.170685141452429, + 54.50783282640048 + ], + [ + 13.200486322037387, + 54.503747663209964 + ], + [ + 13.209620593061736, + 54.5079156382772 + ], + [ + 13.231376325233335, + 54.51089801874412 + ], + [ + 13.232779715200262, + 54.50447902430227 + ], + [ + 13.226130446873503, + 54.49299638569361 + ], + [ + 13.22858837062884, + 54.485442190919706 + ], + [ + 13.23664279186753, + 54.48270088766623 + ], + [ + 13.249394841666254, + 54.487529153257874 + ], + [ + 13.256251683134384, + 54.4859820598289 + ], + [ + 13.257917654957508, + 54.47838735487147 + ], + [ + 13.270112699209575, + 54.47988865473643 + ], + [ + 13.25334250684827, + 54.47133081756557 + ], + [ + 13.242167905485452, + 54.47271503013034 + ], + [ + 13.231045619019625, + 54.46789358063154 + ], + [ + 13.238299717593355, + 54.46583487932838 + ], + [ + 13.248243105641878, + 54.46754394051574 + ], + [ + 13.253255862446727, + 54.46427341919875 + ], + [ + 13.241253252930951, + 54.46607973446112 + ], + [ + 13.2356605550052, + 54.462208005829595 + ], + [ + 13.224492329471486, + 54.46430362262595 + ], + [ + 13.217680749943234, + 54.45919771728184 + ], + [ + 13.206287945675662, + 54.46032206666338 + ], + [ + 13.199987703548759, + 54.4480255747583 + ], + [ + 13.192636634477042, + 54.450207808721395 + ], + [ + 13.19268443719007, + 54.45532059869358 + ], + [ + 13.170586190412086, + 54.453728462012265 + ], + [ + 13.161289228337726, + 54.43723969098746 + ], + [ + 13.149423427300595, + 54.428134338667455 + ], + [ + 13.150196536966309, + 54.42244213765909 + ], + [ + 13.158302432606172, + 54.42064564801187 + ], + [ + 13.171696916953843, + 54.42523980689935 + ], + [ + 13.191694256713197, + 54.42353081838377 + ], + [ + 13.211861744884095, + 54.42994407503631 + ], + [ + 13.220522475408053, + 54.413784318003856 + ], + [ + 13.233899152305149, + 54.40958701645967 + ], + [ + 13.229454115608238, + 54.41273545143623 + ], + [ + 13.232639537943259, + 54.4136077006101 + ], + [ + 13.237491190988884, + 54.40993688596225 + ], + [ + 13.232403834041332, + 54.40377200176358 + ], + [ + 13.249340035251278, + 54.40788185917117 + ], + [ + 13.254837850635052, + 54.40571072390448 + ], + [ + 13.251690588178901, + 54.401840398907396 + ], + [ + 13.244358159365662, + 54.405680004274615 + ], + [ + 13.230944183517966, + 54.40234891556667 + ], + [ + 13.230236185037867, + 54.3973724994142 + ], + [ + 13.238086457333237, + 54.38633416891146 + ], + [ + 13.250004390342896, + 54.383865838716105 + ], + [ + 13.251561447206727, + 54.38625915377396 + ], + [ + 13.259838297979913, + 54.38562289738811 + ], + [ + 13.260337438736496, + 54.38045384247908 + ], + [ + 13.238031840651463, + 54.377906725236485 + ], + [ + 13.237942707895888, + 54.370808680775326 + ], + [ + 13.220442548029743, + 54.36772915282243 + ], + [ + 13.215900525898125, + 54.3714985777268 + ], + [ + 13.202017384628153, + 54.37137256561163 + ], + [ + 13.196950058148872, + 54.37591105032721 + ], + [ + 13.171651768823372, + 54.37127125921515 + ], + [ + 13.157613085491546, + 54.37493428515123 + ], + [ + 13.129931726244278, + 54.372092736606405 + ], + [ + 13.12379102460436, + 54.365945621605434 + ], + [ + 13.113686681457208, + 54.33477905239753 + ], + [ + 13.115755861836941, + 54.33108483877001 + ], + [ + 13.135003386576322, + 54.32411687829262 + ], + [ + 13.129103579090865, + 54.32114076437185 + ], + [ + 13.11501567438438, + 54.32299783969929 + ], + [ + 13.104709747135459, + 54.347450999518365 + ], + [ + 13.094463445470529, + 54.34636003800123 + ], + [ + 13.079840946731323, + 54.35294526801848 + ], + [ + 13.093836243490635, + 54.36577614154577 + ], + [ + 13.08257837604014, + 54.37943038389691 + ], + [ + 13.07290454823119, + 54.38305103650089 + ], + [ + 13.048460396918887, + 54.3801255598268 + ], + [ + 13.038606788180012, + 54.39023506567318 + ], + [ + 13.025666121596267, + 54.396506893491406 + ], + [ + 13.020222249367887, + 54.41235907510351 + ], + [ + 13.02477672607718, + 54.42211840426115 + ], + [ + 13.034138235864418, + 54.424222035526036 + ], + [ + 13.03427354695725, + 54.431688966471185 + ], + [ + 13.028011327506606, + 54.43692398171397 + ], + [ + 13.01577802202017, + 54.439393224526796 + ], + [ + 13.001450512970429, + 54.437025908760404 + ], + [ + 12.995446223800233, + 54.42801847924254 + ], + [ + 12.989452398691315, + 54.425883896478496 + ], + [ + 12.958925817266856, + 54.42310709508385 + ], + [ + 12.953808565206492, + 54.41659020083312 + ], + [ + 12.92637267370671, + 54.413955705437985 + ], + [ + 12.897716254505188, + 54.40167037010575 + ], + [ + 12.878088494052083, + 54.36499793865797 + ], + [ + 12.865535645312299, + 54.362325362524544 + ], + [ + 12.846313775637634, + 54.35107724936379 + ], + [ + 12.817529697842138, + 54.35096448654832 + ], + [ + 12.809663608544275, + 54.34360109017538 + ], + [ + 12.804007439848435, + 54.370401205533085 + ], + [ + 12.795708551296133, + 54.37779675396152 + ], + [ + 12.78500124067751, + 54.37947451313246 + ], + [ + 12.786491814472173, + 54.39644470818413 + ], + [ + 12.774797049534035, + 54.388813822605435 + ], + [ + 12.768902802706467, + 54.37160915392387 + ], + [ + 12.755854630150761, + 54.37056027101553 + ], + [ + 12.744056326652485, + 54.3840608522525 + ], + [ + 12.740981459530381, + 54.37288647744501 + ], + [ + 12.719540385326068, + 54.373110471301054 + ], + [ + 12.71360726379155, + 54.38663256971995 + ], + [ + 12.715109918024146, + 54.398701292818146 + ], + [ + 12.700087770173917, + 54.398483293152466 + ], + [ + 12.696490015837952, + 54.38513563019009 + ], + [ + 12.682587050916597, + 54.37440506613926 + ], + [ + 12.688406840468861, + 54.3681346588333 + ], + [ + 12.682938469735198, + 54.371419538838 + ], + [ + 12.676439896122629, + 54.37057865899298 + ], + [ + 12.681622936356355, + 54.380897369952194 + ], + [ + 12.693484911744102, + 54.3860811996795 + ], + [ + 12.685625754390873, + 54.39366093069609 + ], + [ + 12.688808018191878, + 54.40028436170729 + ], + [ + 12.714610036564023, + 54.40396849961889 + ], + [ + 12.7074894222532, + 54.41187866737971 + ], + [ + 12.68403253102104, + 54.40632732102964 + ], + [ + 12.668525236969668, + 54.408133445187644 + ], + [ + 12.667457392203596, + 54.40441610705823 + ], + [ + 12.659055619952735, + 54.40453183548031 + ], + [ + 12.660222263450573, + 54.398580315958114 + ], + [ + 12.67143718254911, + 54.395165069118384 + ], + [ + 12.671370199005086, + 54.3909456556424 + ], + [ + 12.662521594350434, + 54.38990015313797 + ], + [ + 12.655315498791435, + 54.383607255800285 + ], + [ + 12.629097870102527, + 54.37675687993006 + ], + [ + 12.621987285564183, + 54.372130375772464 + ], + [ + 12.59685275176319, + 54.371811803779636 + ], + [ + 12.6006588976678, + 54.369153460762206 + ], + [ + 12.598816067668478, + 54.361805303700116 + ], + [ + 12.585803925087642, + 54.35623301058896 + ], + [ + 12.57465798821795, + 54.358598823216035 + ], + [ + 12.581704476729035, + 54.37338404845862 + ], + [ + 12.566506448375915, + 54.37158119066622 + ], + [ + 12.553757068532361, + 54.3795855375024 + ], + [ + 12.554682421292005, + 54.372512578066505 + ], + [ + 12.53433352359382, + 54.365175595147264 + ], + [ + 12.535692590316907, + 54.36255502882504 + ], + [ + 12.552579069150537, + 54.35955385765036 + ], + [ + 12.55329477806369, + 54.35614150632701 + ], + [ + 12.538895399279552, + 54.35249370017447 + ], + [ + 12.535702203001529, + 54.338429263993405 + ], + [ + 12.526266027423693, + 54.33392966304594 + ], + [ + 12.514864065931445, + 54.3354602678741 + ], + [ + 12.499402010431464, + 54.33352539234813 + ], + [ + 12.4955821501036, + 54.33047408403496 + ], + [ + 12.473091151465638, + 54.32960979205657 + ], + [ + 12.471596474665661, + 54.32215810578139 + ], + [ + 12.479550412736184, + 54.31225732545498 + ], + [ + 12.478728044380256, + 54.30392873669633 + ], + [ + 12.434553388225464, + 54.29659357098505 + ], + [ + 12.429371229480553, + 54.29356120803756 + ], + [ + 12.42703576287997, + 54.37400062536911 + ], + [ + 12.436138350208061, + 54.379088804429664 + ], + [ + 12.49564322755167, + 54.38238971611945 + ], + [ + 12.517720219090267, + 54.372699814009955 + ], + [ + 12.525821047042415, + 54.38066617107644 + ], + [ + 12.535395062164676, + 54.38167620690543 + ], + [ + 12.552502909275175, + 54.390124524155716 + ], + [ + 12.58706820497634, + 54.38949855443434 + ], + [ + 12.592285113855311, + 54.383636900847954 + ], + [ + 12.597820657774468, + 54.39156656595285 + ], + [ + 12.57748176987434, + 54.396369294447915 + ], + [ + 12.577890986178497, + 54.404328982196716 + ], + [ + 12.602664186444139, + 54.40943113506992 + ], + [ + 12.617513313253605, + 54.4072528989453 + ], + [ + 12.610652448929825, + 54.41091018039833 + ], + [ + 12.617191074772869, + 54.41795374517063 + ], + [ + 12.638081608832922, + 54.42551240450446 + ], + [ + 12.647681032858284, + 54.41870260472474 + ], + [ + 12.6531477103785, + 54.41050736053979 + ], + [ + 12.666362237016868, + 54.40864686846858 + ], + [ + 12.668039958323442, + 54.410137969111815 + ], + [ + 12.667525902677932, + 54.41856948279955 + ], + [ + 12.669319029592618, + 54.42143966971637 + ], + [ + 12.693160014778329, + 54.43225405725137 + ], + [ + 12.711464681056096, + 54.42824390346051 + ], + [ + 12.721032708119736, + 54.43237459538144 + ], + [ + 12.725814247558656, + 54.43014083080802 + ], + [ + 12.740056859268158, + 54.4152272007015 + ], + [ + 12.763237888621664, + 54.41253520051538 + ], + [ + 12.770632870598838, + 54.41715038852972 + ], + [ + 12.786029448469368, + 54.417371081547266 + ], + [ + 12.801847089238127, + 54.40869883325221 + ], + [ + 12.812399377645148, + 54.41731516049597 + ], + [ + 12.831864395756135, + 54.4230575119679 + ], + [ + 12.857539153709844, + 54.42077323113409 + ], + [ + 12.874948301261245, + 54.413712243757764 + ], + [ + 12.900788447666994, + 54.42054816516187 + ], + [ + 12.911515813051665, + 54.41998203029131 + ], + [ + 12.926951676208503, + 54.42796397308866 + ], + [ + 12.915394374549665, + 54.4388291868618 + ], + [ + 12.920989457368139, + 54.44509465148167 + ], + [ + 12.819364689474508, + 54.44007216065967 + ], + [ + 12.676584980971466, + 54.442182465559014 + ], + [ + 12.560918153153697, + 54.45472725776022 + ], + [ + 12.54213000572252, + 54.459828955080866 + ], + [ + 12.526304422189934, + 54.470171928238535 + ], + [ + 12.529398228065455, + 54.48001600025229 + ], + [ + 12.526536537950134, + 54.475076010199466 + ], + [ + 12.525310267526248, + 54.47942608516998 + ], + [ + 12.530118137585344, + 54.48207539486213 + ], + [ + 12.518488411339456, + 54.48428270201526 + ], + [ + 12.528354029339823, + 54.48553596478796 + ], + [ + 12.522122121867582, + 54.486566149684954 + ], + [ + 12.510195681491158, + 54.48249041624014 + ], + [ + 12.499472848818677, + 54.47334064668527 + ], + [ + 12.467077837092233, + 54.420450483534275 + ], + [ + 12.454640198909377, + 54.40718520723768 + ], + [ + 12.436295141638722, + 54.39169985220174 + ], + [ + 12.40593086773171, + 54.376936025663355 + ], + [ + 12.340871765099374, + 54.30054807175054 + ], + [ + 12.306529436312855, + 54.28215034682171 + ], + [ + 12.223377718069552, + 54.2543280439178 + ], + [ + 12.192888292026595, + 54.24099205400945 + ], + [ + 12.174898728347179, + 54.2291134613582 + ], + [ + 12.151297527000679, + 54.20386711308087 + ], + [ + 12.127472193217368, + 54.18606104806525 + ], + [ + 12.106867363219108, + 54.178336967366185 + ], + [ + 12.102455579480514, + 54.17896330718506 + ], + [ + 12.100414325100026, + 54.18432500672589 + ], + [ + 12.09369465373568, + 54.1854171904573 + ], + [ + 12.100993420670676, + 54.1692882063768 + ], + [ + 12.086852018297863, + 54.18594029077611 + ], + [ + 12.061463651126981, + 54.17805481106891 + ], + [ + 12.01136017102697, + 54.178336332660145 + ], + [ + 11.964983955190798, + 54.16669567224203 + ], + [ + 11.84977374765226, + 54.145002069260514 + ], + [ + 11.797592129584215, + 54.14680314719488 + ], + [ + 11.761385158062566, + 54.154501919825705 + ], + [ + 11.682936882514374, + 54.15327118011628 + ], + [ + 11.608383320671866, + 54.10703224374257 + ], + [ + 11.589332554517261, + 54.09953083154124 + ], + [ + 11.567841712776174, + 54.098188371218846 + ], + [ + 11.55251967522815, + 54.09268650144412 + ], + [ + 11.525096767992464, + 54.070926354316306 + ], + [ + 11.52620547647209, + 54.068281070455534 + ], + [ + 11.530850985836645, + 54.07451429551574 + ], + [ + 11.534542754080782, + 54.07402394301759 + ], + [ + 11.536994620583117, + 54.05731765608014 + ], + [ + 11.53175969027499, + 54.04918266201454 + ], + [ + 11.54218258058522, + 54.05496779466305 + ], + [ + 11.538729089969443, + 54.05745303758476 + ], + [ + 11.548263015805128, + 54.066360544334145 + ], + [ + 11.558838019071736, + 54.06977637014135 + ], + [ + 11.569142798254239, + 54.07867569525268 + ], + [ + 11.563526176190157, + 54.07815441978288 + ], + [ + 11.576837920670831, + 54.08082645025512 + ], + [ + 11.58748967165213, + 54.09313624555651 + ], + [ + 11.602284373918003, + 54.09576271813716 + ], + [ + 11.599832775557244, + 54.09955878017449 + ], + [ + 11.604809508727554, + 54.102832093058396 + ], + [ + 11.61471689511034, + 54.1015838818408 + ], + [ + 11.626244382461604, + 54.09015710655574 + ], + [ + 11.624469613166069, + 54.07678237981498 + ], + [ + 11.613780463909288, + 54.07316338775795 + ], + [ + 11.610400842627708, + 54.0681404332977 + ], + [ + 11.582608514302976, + 54.063688632382494 + ], + [ + 11.587090891448618, + 54.04698526743554 + ], + [ + 11.56879697563682, + 54.03094592996374 + ], + [ + 11.543796589139586, + 54.024769136812544 + ], + [ + 11.532912736615172, + 54.028202806488544 + ], + [ + 11.529102439078025, + 54.03384871160142 + ], + [ + 11.518527423712552, + 54.03028601681723 + ], + [ + 11.518246624518252, + 54.02572018308096 + ], + [ + 11.533409123801949, + 54.025391461876666 + ], + [ + 11.534008695634938, + 54.01964439280224 + ], + [ + 11.50977577321461, + 54.011905842834665 + ], + [ + 11.496912581919492, + 53.99521654384073 + ], + [ + 11.490512881822182, + 53.9937872889291 + ], + [ + 11.499817375191226, + 53.98595464199965 + ], + [ + 11.491306670429458, + 53.97737081809378 + ], + [ + 11.493927840945906, + 53.97084195681736 + ], + [ + 11.487918701784727, + 53.9682302914084 + ], + [ + 11.488146277085917, + 53.97554058211037 + ], + [ + 11.483075909465756, + 53.97143840538461 + ], + [ + 11.473250470732209, + 53.97110338781032 + ], + [ + 11.470157111236439, + 53.96536211677677 + ], + [ + 11.47172142562957, + 53.9632203707862 + ], + [ + 11.47440391403234, + 53.96492970956012 + ], + [ + 11.478091827613264, + 53.96402619203396 + ], + [ + 11.478107477026725, + 53.96900772408944 + ], + [ + 11.483296407677749, + 53.96744580226562 + ], + [ + 11.477756409295363, + 53.934497257436085 + ], + [ + 11.48165029972429, + 53.927390628434935 + ], + [ + 11.478185798619377, + 53.9256316153068 + ], + [ + 11.472851683733664, + 53.928327904853276 + ], + [ + 11.458170157407816, + 53.91667023743098 + ], + [ + 11.444659175692049, + 53.914898493817155 + ], + [ + 11.44729630476687, + 53.904907088182895 + ], + [ + 11.463495563493252, + 53.90240365465593 + ], + [ + 11.455625239733914, + 53.902070523748144 + ], + [ + 11.463784963110474, + 53.89916906367803 + ], + [ + 11.457068199409324, + 53.89946699897102 + ], + [ + 11.46084272949096, + 53.89677984307812 + ], + [ + 11.46043599429314, + 53.89542919612195 + ], + [ + 11.453167710992004, + 53.89968037743557 + ], + [ + 11.452965580059521, + 53.894822218119124 + ], + [ + 11.45046927767348, + 53.900075420340904 + ], + [ + 11.43616132147874, + 53.9000853842819 + ], + [ + 11.439960277879377, + 53.90831824332206 + ], + [ + 11.436374464822244, + 53.91142294410307 + ], + [ + 11.415778245434279, + 53.91554721245423 + ], + [ + 11.403606831431405, + 53.921493211144345 + ], + [ + 11.401162410689581, + 53.92733266430812 + ], + [ + 11.406836555230148, + 53.93520241412574 + ], + [ + 11.388598159382932, + 53.939132437038346 + ], + [ + 11.365038223170773, + 53.93513886144747 + ], + [ + 11.349528798353845, + 53.943777464964086 + ], + [ + 11.348675054732379, + 53.948595524745684 + ], + [ + 11.334459459467245, + 53.95897481977266 + ], + [ + 11.326423581365898, + 53.95689443626749 + ], + [ + 11.314834456597984, + 53.942070602457875 + ], + [ + 11.288720973641134, + 53.93157107264141 + ], + [ + 11.27320124827665, + 53.93126457908098 + ], + [ + 11.253911321355456, + 53.93714908356844 + ], + [ + 11.252873083415144, + 53.942169165339095 + ], + [ + 11.24825830831264, + 53.940413465934725 + ], + [ + 11.245552611853869, + 53.94279289452106 + ], + [ + 11.241388016432225, + 53.95352909033045 + ], + [ + 11.245890158332783, + 53.97315705873271 + ], + [ + 11.25433796647876, + 53.972635302289454 + ], + [ + 11.259721806777922, + 53.983537473751674 + ], + [ + 11.253206673037027, + 53.98765602013469 + ], + [ + 11.241183386070663, + 53.98241121523918 + ], + [ + 11.228124562596399, + 53.98253039231085 + ], + [ + 11.20720265226825, + 53.988375364538506 + ], + [ + 11.19321749273805, + 54.0003813215615 + ], + [ + 11.191356358817867, + 54.00942153890438 + ], + [ + 11.179984660849524, + 54.015166311944206 + ], + [ + 11.144461517907327, + 54.00964432129355 + ], + [ + 11.089594726261764, + 54.013656807240636 + ], + [ + 11.042239286261545, + 54.00663971550293 + ], + [ + 10.984628352282574, + 53.98863154858529 + ], + [ + 10.933514303970876, + 53.96493270336905 + ], + [ + 10.903661739173112, + 53.95682190259485 + ], + [ + 11.123837875139774, + 54.10293831309438 + ], + [ + 11.672452196632076, + 54.31517542249039 + ], + [ + 11.666752568729713, + 54.33092195022823 + ], + [ + 11.951614575381084, + 54.33295973918716 + ], + [ + 12.152451715170853, + 54.384629898869726 + ], + [ + 12.165229824225369, + 54.38463001540901 + ], + [ + 12.25856381451947, + 54.450466312625416 + ], + [ + 12.30022993701534, + 54.511024196236235 + ], + [ + 12.292173999173503, + 54.517413217103 + ], + [ + 12.322173169083579, + 54.57713763661722 + ], + [ + 12.74884653358271, + 54.743257993542585 + ], + [ + 12.97305429474795, + 54.7855396006226 + ], + [ + 13.051827359875501, + 54.823143465207 + ], + [ + 13.124415285493034, + 54.84915335989358 + ], + [ + 13.168505911771142, + 54.86058404439461 + ], + [ + 13.212232585309701, + 54.868055938469666 + ], + [ + 13.358719658227995, + 54.88304121287628 + ], + [ + 13.465882200961719, + 54.88320535689834 + ], + [ + 13.554027482119489, + 54.87073576919348 + ], + [ + 13.633533358232388, + 54.8454636052143 + ], + [ + 13.87908858491382, + 54.730370523543655 + ], + [ + 13.927845203626815, + 54.702499663071684 + ], + [ + 13.96564938113981, + 54.67372162187854 + ] + ], + [ + [ + 11.473005882856308, + 54.02444752538141 + ], + [ + 11.442262684625659, + 54.020191738719184 + ], + [ + 11.404023131915597, + 54.00880063508188 + ], + [ + 11.376852544163642, + 53.99642692925215 + ], + [ + 11.376623083017146, + 53.97870823838279 + ], + [ + 11.38708531982697, + 53.96665574850132 + ], + [ + 11.400091268021942, + 53.96405273713166 + ], + [ + 11.411139877841848, + 53.96657737667901 + ], + [ + 11.387012320588546, + 53.967816099348354 + ], + [ + 11.393635023291402, + 53.97465173135819 + ], + [ + 11.402146922547562, + 53.968315965155135 + ], + [ + 11.409895988130952, + 53.968872909741705 + ], + [ + 11.420526161354529, + 53.96213526597116 + ], + [ + 11.425946064240636, + 53.96076416229983 + ], + [ + 11.431768432387784, + 53.96163345325248 + ], + [ + 11.43429677794087, + 53.96524618036823 + ], + [ + 11.42844789703579, + 53.96165822374094 + ], + [ + 11.426502051571308, + 53.96716769155137 + ], + [ + 11.4278684798985, + 53.98580985625284 + ], + [ + 11.44615408323023, + 53.9973276977551 + ], + [ + 11.446521119098334, + 53.97572564094019 + ], + [ + 11.441474095872875, + 53.96462178053956 + ], + [ + 11.44682500046449, + 53.95862990087807 + ], + [ + 11.455957341779554, + 53.95753345345377 + ], + [ + 11.454957227813237, + 53.961895324875414 + ], + [ + 11.463861375479896, + 53.96646621250015 + ], + [ + 11.46342028767619, + 53.969835075970494 + ], + [ + 11.47194653312805, + 53.97070932655072 + ], + [ + 11.467530566977938, + 53.97337785084097 + ], + [ + 11.472046999050834, + 53.97917994862314 + ], + [ + 11.480364738720224, + 53.98183380786634 + ], + [ + 11.478245159042483, + 53.99797388313438 + ], + [ + 11.483554183096256, + 54.00865561818688 + ], + [ + 11.482556376849063, + 54.00166662028133 + ], + [ + 11.4874062917019, + 54.00347263009806 + ], + [ + 11.488950446045198, + 53.999011292613204 + ], + [ + 11.495327760302487, + 54.01111005391592 + ], + [ + 11.494150747601466, + 54.021709680315944 + ], + [ + 11.473005882856308, + 54.02444752538141 + ] + ], + [ + [ + 13.175213128209895, + 54.49280210166344 + ], + [ + 13.161510263359972, + 54.489897435371624 + ], + [ + 13.143480888008787, + 54.477984005357015 + ], + [ + 13.122169321690587, + 54.4515311107893 + ], + [ + 13.123061281098872, + 54.44207454963332 + ], + [ + 13.147095062451736, + 54.44913100507007 + ], + [ + 13.160675829850774, + 54.44898153767636 + ], + [ + 13.16986142249329, + 54.456777062289824 + ], + [ + 13.18168043406445, + 54.45610700821202 + ], + [ + 13.187473622224658, + 54.45942724759731 + ], + [ + 13.187379361239099, + 54.465613471991354 + ], + [ + 13.193174600931835, + 54.46442337841487 + ], + [ + 13.203850191218821, + 54.46867732877363 + ], + [ + 13.21186026010291, + 54.467119135088524 + ], + [ + 13.225492597931959, + 54.47067782639056 + ], + [ + 13.224781504272581, + 54.481816637435564 + ], + [ + 13.21854877058495, + 54.483201942538905 + ], + [ + 13.227716702777043, + 54.484063479958 + ], + [ + 13.22484160053463, + 54.48660693620606 + ], + [ + 13.200669991724666, + 54.48550067666631 + ], + [ + 13.19572482153808, + 54.4925369375198 + ], + [ + 13.175213128209895, + 54.49280210166344 + ] + ], + [ + [ + 13.123767347998614, + 54.60363383423451 + ], + [ + 13.097800226984406, + 54.59019663813532 + ], + [ + 13.102518442770556, + 54.577381475113754 + ], + [ + 13.098923190233473, + 54.559889734028374 + ], + [ + 13.060965313528671, + 54.478760052983276 + ], + [ + 13.061237643625288, + 54.46085958220504 + ], + [ + 13.064966655112242, + 54.457732180205674 + ], + [ + 13.071366964076786, + 54.468125761548556 + ], + [ + 13.067793844565738, + 54.47059417985467 + ], + [ + 13.073049242354514, + 54.4692322610848 + ], + [ + 13.07134784538964, + 54.479220283071626 + ], + [ + 13.076699402406472, + 54.4786263144451 + ], + [ + 13.070682065977763, + 54.49178229491787 + ], + [ + 13.073845378821574, + 54.491432658173984 + ], + [ + 13.072973794327584, + 54.4997494191496 + ], + [ + 13.07923885653874, + 54.502074230196975 + ], + [ + 13.081698706444824, + 54.51360251305967 + ], + [ + 13.08860856644478, + 54.51520073133136 + ], + [ + 13.08463244350986, + 54.51916063207792 + ], + [ + 13.092906291584374, + 54.517365550548185 + ], + [ + 13.092499843843255, + 54.52764045149705 + ], + [ + 13.103412477625149, + 54.52889904643972 + ], + [ + 13.105531062430964, + 54.53147905046286 + ], + [ + 13.100809522595059, + 54.53285961507206 + ], + [ + 13.106148279943714, + 54.531951131324305 + ], + [ + 13.116746715238683, + 54.53766390254743 + ], + [ + 13.115742415155893, + 54.557660196959894 + ], + [ + 13.10764805703227, + 54.568457386951245 + ], + [ + 13.110133242344686, + 54.57266195157981 + ], + [ + 13.119119686423666, + 54.57432981278846 + ], + [ + 13.110207172544792, + 54.58153564909584 + ], + [ + 13.111421835036058, + 54.584668503206835 + ], + [ + 13.125240663632836, + 54.583670486676084 + ], + [ + 13.129488169860162, + 54.59125322124587 + ], + [ + 13.141350675291267, + 54.59884820685974 + ], + [ + 13.13946287655639, + 54.590560813804345 + ], + [ + 13.134423352894398, + 54.58847004688139 + ], + [ + 13.140851577270011, + 54.58522775795977 + ], + [ + 13.144994919204672, + 54.57364889205922 + ], + [ + 13.146595739033296, + 54.59551630760085 + ], + [ + 13.150799919120509, + 54.575438042533804 + ], + [ + 13.155360779442, + 54.58010476361351 + ], + [ + 13.157957929593184, + 54.573719408319924 + ], + [ + 13.146787183889883, + 54.603354278480396 + ], + [ + 13.132971140492002, + 54.605524416233195 + ], + [ + 13.123767347998614, + 54.60363383423451 + ] + ], + [ + [ + 13.0520571387521, + 54.45716904083824 + ], + [ + 13.0472507547739, + 54.46021702178341 + ], + [ + 13.045290953238863, + 54.45384060249545 + ], + [ + 13.033047794904327, + 54.446804970494476 + ], + [ + 13.024985630093576, + 54.44867783024194 + ], + [ + 12.998314508089612, + 54.44701294785927 + ], + [ + 12.984826788698673, + 54.43585446394451 + ], + [ + 12.973263387152516, + 54.44040374414656 + ], + [ + 12.973190029754315, + 54.4345581664959 + ], + [ + 12.977615690780159, + 54.434717259529684 + ], + [ + 12.974607070161825, + 54.43279208726741 + ], + [ + 12.988628866240342, + 54.433991996470326 + ], + [ + 12.998492326975661, + 54.439993584147565 + ], + [ + 13.01563795115486, + 54.44367401436572 + ], + [ + 13.041558352863692, + 54.44243454635656 + ], + [ + 13.058989311518477, + 54.45119964063581 + ], + [ + 13.0520571387521, + 54.45716904083824 + ] + ], + [ + [ + 12.684379222894417, + 54.41540443924181 + ], + [ + 12.699619371836285, + 54.41886353476286 + ], + [ + 12.729815088354496, + 54.41574265117529 + ], + [ + 12.729965938629078, + 54.421776116085006 + ], + [ + 12.724080534077117, + 54.42537341994311 + ], + [ + 12.710644702093665, + 54.425633506825505 + ], + [ + 12.693349088098715, + 54.431306199027226 + ], + [ + 12.6867014168547, + 54.42723927452951 + ], + [ + 12.69358921804792, + 54.42883060283597 + ], + [ + 12.690802191278726, + 54.424476980139396 + ], + [ + 12.67932934752469, + 54.42332710924597 + ], + [ + 12.675078564216486, + 54.419707647095834 + ], + [ + 12.676708230390068, + 54.41621075591216 + ], + [ + 12.684379222894417, + 54.41540443924181 + ] + ], + [ + [ + 12.933429015851635, + 54.434895544784254 + ], + [ + 12.948367697087173, + 54.440338711248444 + ], + [ + 12.959120854235954, + 54.436735670636104 + ], + [ + 12.961898948814405, + 54.439105607322404 + ], + [ + 12.952215826884666, + 54.44260250799647 + ], + [ + 12.930965626986474, + 54.443213558660254 + ], + [ + 12.923932428918269, + 54.43479327749438 + ], + [ + 12.930187127516383, + 54.43207763790605 + ], + [ + 12.933429015851635, + 54.434895544784254 + ] + ], + [ + [ + 13.525468957839994, + 54.31607216991354 + ], + [ + 13.546695064555806, + 54.32521272929059 + ], + [ + 13.542844439965183, + 54.33229619882585 + ], + [ + 13.53030938164215, + 54.326464682780674 + ], + [ + 13.52306026620962, + 54.31593991227993 + ], + [ + 13.518528205227092, + 54.316262816746715 + ], + [ + 13.518692954721834, + 54.31224066318784 + ], + [ + 13.524755801911875, + 54.309408154185284 + ], + [ + 13.525468957839994, + 54.31607216991354 + ] + ], + [ + [ + 12.735001663609905, + 54.413035684477414 + ], + [ + 12.72443601910127, + 54.41242209501957 + ], + [ + 12.718130044244027, + 54.40526849553254 + ], + [ + 12.729774999217465, + 54.40490285439182 + ], + [ + 12.736545391510276, + 54.408425277869576 + ], + [ + 12.735001663609905, + 54.413035684477414 + ] + ], + [ + [ + 13.15674896196758, + 54.51237542765788 + ], + [ + 13.155170991246141, + 54.506655595044606 + ], + [ + 13.164879446784724, + 54.50212107042919 + ], + [ + 13.163065732813013, + 54.50384662853519 + ], + [ + 13.16908044999052, + 54.50563057264239 + ], + [ + 13.16649999965318, + 54.51074695279847 + ], + [ + 13.15674896196758, + 54.51237542765788 + ] + ], + [ + [ + 11.513840260089047, + 54.03833497251445 + ], + [ + 11.51612645677836, + 54.057668818440625 + ], + [ + 11.52300169760211, + 54.068487070623185 + ], + [ + 11.512419670549198, + 54.05593143998857 + ], + [ + 11.513840260089047, + 54.03833497251445 + ] + ], + [ + [ + 13.908100262965032, + 54.24169310350042 + ], + [ + 13.906818421193828, + 54.24026727010168 + ], + [ + 13.9145630391481, + 54.24227811842483 + ], + [ + 13.92664393733066, + 54.24914551180948 + ], + [ + 13.918149995776993, + 54.25146165976515 + ], + [ + 13.908100262965032, + 54.24169310350042 + ] + ], + [ + [ + 13.118569020245186, + 54.53893293392037 + ], + [ + 13.125116762220019, + 54.54402660960144 + ], + [ + 13.123321462701265, + 54.54983873007559 + ], + [ + 13.116957671253099, + 54.54685861833635 + ], + [ + 13.118569020245186, + 54.53893293392037 + ] + ], + [ + [ + 13.208942358525753, + 54.396762428885644 + ], + [ + 13.217181630648508, + 54.397703941745455 + ], + [ + 13.219795717998416, + 54.40189508345123 + ], + [ + 13.210149702149238, + 54.40162341409401 + ], + [ + 13.208942358525753, + 54.396762428885644 + ] + ], + [ + [ + 12.63821129989619, + 54.42337388727132 + ], + [ + 12.635831435560348, + 54.41688120768798 + ], + [ + 12.640185969114581, + 54.41937094528766 + ], + [ + 12.645030382915358, + 54.415581012553076 + ], + [ + 12.63821129989619, + 54.42337388727132 + ] + ], + [ + [ + 11.487401115812911, + 54.02448207561105 + ], + [ + 11.494789052437739, + 54.02419528417081 + ], + [ + 11.498044366012792, + 54.03093786468067 + ], + [ + 11.48891949478217, + 54.02734099395917 + ], + [ + 11.487401115812911, + 54.02448207561105 + ] + ], + [ + [ + 13.220096516127287, + 54.46770964432537 + ], + [ + 13.213227299325553, + 54.4670590341898 + ], + [ + 13.213723127297662, + 54.46448392249477 + ], + [ + 13.22282470597175, + 54.46500956293202 + ], + [ + 13.226970968314912, + 54.46968038934672 + ], + [ + 13.220096516127287, + 54.46770964432537 + ] + ], + [ + [ + 13.768657958873531, + 54.20603722731831 + ], + [ + 13.768291203377087, + 54.20199100524345 + ], + [ + 13.77072729193309, + 54.200740339781426 + ], + [ + 13.77434983020009, + 54.20806479254347 + ], + [ + 13.769236301993686, + 54.2091138902717 + ], + [ + 13.768657958873531, + 54.20603722731831 + ] + ], + [ + [ + 12.97772463749507, + 54.442438932094554 + ], + [ + 12.973554355833837, + 54.44135649485819 + ], + [ + 12.982992358618972, + 54.437694472782965 + ], + [ + 12.983763272812213, + 54.44128702186588 + ], + [ + 12.97772463749507, + 54.442438932094554 + ] + ], + [ + [ + 12.528762636896085, + 54.357639209706626 + ], + [ + 12.52784126780448, + 54.35363791189055 + ], + [ + 12.53096120879695, + 54.3499278961271 + ], + [ + 12.529273978345987, + 54.35468420831814 + ], + [ + 12.535520949785772, + 54.35600918110026 + ], + [ + 12.528762636896085, + 54.357639209706626 + ] + ], + [ + [ + 13.208553279220611, + 54.46432423563158 + ], + [ + 13.198972750342051, + 54.46154831019048 + ], + [ + 13.19902921246142, + 54.457115513966244 + ], + [ + 13.209654947190629, + 54.463310666874975 + ], + [ + 13.208553279220611, + 54.46432423563158 + ] + ], + [ + [ + 13.809660685310364, + 54.174276145344315 + ], + [ + 13.806358038781903, + 54.17272187232781 + ], + [ + 13.812914916950662, + 54.17026303009809 + ], + [ + 13.812269905784245, + 54.17336889721447 + ], + [ + 13.809660685310364, + 54.174276145344315 + ] + ], + [ + [ + 13.11788180235806, + 54.426711222125064 + ], + [ + 13.120697949537533, + 54.42636748642432 + ], + [ + 13.125346076484135, + 54.42718346640044 + ], + [ + 13.116617763110925, + 54.430844603351645 + ], + [ + 13.11788180235806, + 54.426711222125064 + ] + ], + [ + [ + 12.656323225560225, + 54.4065747993015 + ], + [ + 12.662395366458345, + 54.40484528379396 + ], + [ + 12.665607820583114, + 54.40681859748636 + ], + [ + 12.658657432954529, + 54.408274353952855 + ], + [ + 12.656323225560225, + 54.4065747993015 + ] + ], + [ + [ + 13.805685201587785, + 54.17823079864916 + ], + [ + 13.804684029508099, + 54.17621263844163 + ], + [ + 13.812059778856492, + 54.17614195624155 + ], + [ + 13.811016161085837, + 54.178111903791866 + ], + [ + 13.805685201587785, + 54.17823079864916 + ] + ], + [ + [ + 13.784400955419958, + 54.05289902720458 + ], + [ + 13.785289750897748, + 54.05415246149466 + ], + [ + 13.78231517097908, + 54.059407588187085 + ], + [ + 13.780285006407526, + 54.055786128234594 + ], + [ + 13.784400955419958, + 54.05289902720458 + ] + ], + [ + [ + 12.541160233147103, + 54.48851412721053 + ], + [ + 12.538504402401214, + 54.48802242086998 + ], + [ + 12.534072485566277, + 54.48107263732383 + ], + [ + 12.541916384848882, + 54.48639908958942 + ], + [ + 12.541160233147103, + 54.48851412721053 + ] + ], + [ + [ + 12.585016244002707, + 54.380703418498655 + ], + [ + 12.58044121310219, + 54.37710558669836 + ], + [ + 12.583491479385174, + 54.37528575994731 + ], + [ + 12.585331477434039, + 54.37610856226827 + ], + [ + 12.585016244002707, + 54.380703418498655 + ] + ], + [ + [ + 11.427154497978655, + 53.94301230860349 + ], + [ + 11.423207730699986, + 53.9421904703335 + ], + [ + 11.426799918588873, + 53.93796751659095 + ], + [ + 11.428839603395206, + 53.94295122803128 + ], + [ + 11.427154497978655, + 53.94301230860349 + ] + ], + [ + [ + 12.923720481337067, + 54.43308062362897 + ], + [ + 12.927636225404196, + 54.4299916943868 + ], + [ + 12.929118334869434, + 54.42719206533246 + ], + [ + 12.929686819414899, + 54.43015429579711 + ], + [ + 12.923720481337067, + 54.43308062362897 + ] + ], + [ + [ + 11.466423372547542, + 53.96378464488635 + ], + [ + 11.470315220050857, + 53.9666633403787 + ], + [ + 11.470645830758357, + 53.968467088665136 + ], + [ + 11.467271767832328, + 53.96756162515388 + ], + [ + 11.466423372547542, + 53.96378464488635 + ] + ], + [ + [ + 14.027689102182764, + 53.94778544188877 + ], + [ + 14.028194622104847, + 53.949851901096075 + ], + [ + 14.024913608790884, + 53.951747051930724 + ], + [ + 14.024381305966507, + 53.94996335963919 + ], + [ + 14.027689102182764, + 53.94778544188877 + ] + ], + [ + [ + 13.803670230582199, + 54.07930832011033 + ], + [ + 13.806362910314006, + 54.08446466261396 + ], + [ + 13.80411124072998, + 54.085075414797565 + ], + [ + 13.801789036411675, + 54.08159842078019 + ], + [ + 13.803670230582199, + 54.07930832011033 + ] + ], + [ + [ + 12.971534229468803, + 54.44047777854622 + ], + [ + 12.967789186793775, + 54.438468493060604 + ], + [ + 12.96974969430265, + 54.43636387090957 + ], + [ + 12.970412042147675, + 54.43662967427905 + ], + [ + 12.971534229468803, + 54.44047777854622 + ] + ], + [ + [ + 12.525227951370727, + 54.36292422113977 + ], + [ + 12.526437725907803, + 54.36269087626099 + ], + [ + 12.52865458920033, + 54.3666078103701 + ], + [ + 12.525924652820166, + 54.366477596781465 + ], + [ + 12.525227951370727, + 54.36292422113977 + ] + ], + [ + [ + 12.519461280112436, + 54.37268871978451 + ], + [ + 12.520694991708208, + 54.37036385011194 + ], + [ + 12.524449992455924, + 54.370588691263485 + ], + [ + 12.522531387640136, + 54.373922677330505 + ], + [ + 12.519461280112436, + 54.37268871978451 + ] + ], + [ + [ + 12.527424454696307, + 54.35209956760514 + ], + [ + 12.52801983774446, + 54.34622056040393 + ], + [ + 12.529590451001543, + 54.34588629821661 + ], + [ + 12.529766781732903, + 54.34965361343694 + ], + [ + 12.527424454696307, + 54.35209956760514 + ] + ], + [ + [ + 12.670757826864962, + 54.42064712919733 + ], + [ + 12.66853611713144, + 54.419055073070645 + ], + [ + 12.671008311448373, + 54.41593759330009 + ], + [ + 12.670330089670824, + 54.41944254595974 + ], + [ + 12.670757826864962, + 54.42064712919733 + ] + ], + [ + [ + 12.524983408517379, + 54.36722941973563 + ], + [ + 12.52873479068023, + 54.36738289666537 + ], + [ + 12.529012462884557, + 54.36809133768416 + ], + [ + 12.523234389034203, + 54.36811303778013 + ], + [ + 12.524983408517379, + 54.36722941973563 + ] + ], + [ + [ + 12.724969873760216, + 54.42714304717244 + ], + [ + 12.725796210428063, + 54.428817011567766 + ], + [ + 12.723931995213723, + 54.429703164728174 + ], + [ + 12.722997981042694, + 54.42803108955244 + ], + [ + 12.724969873760216, + 54.42714304717244 + ] + ], + [ + [ + 12.527397118614887, + 54.35765443181633 + ], + [ + 12.527914089546766, + 54.35777705469677 + ], + [ + 12.527680580958108, + 54.361435133254936 + ], + [ + 12.525126062949651, + 54.35938853104718 + ], + [ + 12.527397118614887, + 54.35765443181633 + ] + ], + [ + [ + 13.301884662830565, + 54.537600534737074 + ], + [ + 13.302912796519173, + 54.5376965745306 + ], + [ + 13.30031292317291, + 54.54095640447044 + ], + [ + 13.298631157500639, + 54.539098648228254 + ], + [ + 13.301884662830565, + 54.537600534737074 + ] + ], + [ + [ + 13.082447071137317, + 54.47695423685696 + ], + [ + 13.079930233709566, + 54.4757170644721 + ], + [ + 13.08000167905582, + 54.4744621656436 + ], + [ + 13.083154193481793, + 54.475822745164415 + ], + [ + 13.082447071137317, + 54.47695423685696 + ] + ], + [ + [ + 14.032396561899118, + 53.94641450036966 + ], + [ + 14.031027083605979, + 53.944573855592154 + ], + [ + 14.032262172205616, + 53.944017253505436 + ], + [ + 14.034221744234795, + 53.945616324816335 + ], + [ + 14.032396561899118, + 53.94641450036966 + ] + ], + [ + [ + 13.95809427787856, + 53.941009007276726 + ], + [ + 13.960760534375193, + 53.94195107746801 + ], + [ + 13.959170899640906, + 53.94361385965589 + ], + [ + 13.957798537792593, + 53.942842660998174 + ], + [ + 13.95809427787856, + 53.941009007276726 + ] + ], + [ + [ + 13.208522845578578, + 54.46531026927895 + ], + [ + 13.206325503735929, + 54.46667333997145 + ], + [ + 13.203811456562985, + 54.46587270235694 + ], + [ + 13.20685234134971, + 54.464936838302656 + ], + [ + 13.208522845578578, + 54.46531026927895 + ] + ], + [ + [ + 11.476883223605531, + 53.96190609746315 + ], + [ + 11.477440571734373, + 53.963691307750416 + ], + [ + 11.475104669613247, + 53.96406018180254 + ], + [ + 11.475018366225662, + 53.96357491393358 + ], + [ + 11.476883223605531, + 53.96190609746315 + ] + ], + [ + [ + 13.361744514845839, + 54.25158396956217 + ], + [ + 13.364302100970026, + 54.25121178295254 + ], + [ + 13.358607415947048, + 54.25276817577536 + ], + [ + 13.358874721667265, + 54.25239118273572 + ], + [ + 13.361744514845839, + 54.25158396956217 + ] + ], + [ + [ + 13.349675360655867, + 54.17609576719462 + ], + [ + 13.351864355450207, + 54.176151532384246 + ], + [ + 13.34992547565926, + 54.17764254256558 + ], + [ + 13.348803734981995, + 54.17698229267867 + ], + [ + 13.349675360655867, + 54.17609576719462 + ] + ], + [ + [ + 13.21249306341509, + 54.46506835901706 + ], + [ + 13.210572319459889, + 54.46531682968023 + ], + [ + 13.209070695617267, + 54.464382190702594 + ], + [ + 13.210347675123632, + 54.46364110620372 + ], + [ + 13.21249306341509, + 54.46506835901706 + ] + ], + [ + [ + 12.989776209064226, + 54.44492875328732 + ], + [ + 12.987410194291309, + 54.44463320703379 + ], + [ + 12.98745005674841, + 54.443634238098426 + ], + [ + 12.98933220957741, + 54.44402489322614 + ], + [ + 12.989776209064226, + 54.44492875328732 + ] + ], + [ + [ + 13.333113930739724, + 54.170037125255455 + ], + [ + 13.332029947685568, + 54.169847310720584 + ], + [ + 13.332301968550414, + 54.168798098271715 + ], + [ + 13.334306211167803, + 54.169095686381695 + ], + [ + 13.333113930739724, + 54.170037125255455 + ] + ], + [ + [ + 13.8110897029722, + 54.17442568220891 + ], + [ + 13.812532536450401, + 54.17420425754672 + ], + [ + 13.812341559921808, + 54.17544769317268 + ], + [ + 13.810483361568426, + 54.17501638167688 + ], + [ + 13.8110897029722, + 54.17442568220891 + ] + ], + [ + [ + 13.388745497791202, + 54.264403674001606 + ], + [ + 13.39009851233007, + 54.26422987812583 + ], + [ + 13.390841055725915, + 54.26512578037614 + ], + [ + 13.388997543781581, + 54.265253809331945 + ], + [ + 13.388745497791202, + 54.264403674001606 + ] + ], + [ + [ + 13.355518164715336, + 54.18092716860765 + ], + [ + 13.354622098406859, + 54.18093784614423 + ], + [ + 13.354368367691125, + 54.17911227062852 + ], + [ + 13.354907983145274, + 54.17923635301718 + ], + [ + 13.355518164715336, + 54.18092716860765 + ] + ] + ], + [ + [ + [ + 13.54254987873845, + 54.47659885193415 + ], + [ + 13.54861642622024, + 54.47374240353533 + ], + [ + 13.546870260775922, + 54.45678251222139 + ], + [ + 13.523993894455984, + 54.44803520446018 + ], + [ + 13.531007146269284, + 54.445109183376275 + ], + [ + 13.552038249542393, + 54.44673303813967 + ], + [ + 13.55716212251589, + 54.43853918455254 + ], + [ + 13.54497353983414, + 54.43386079465219 + ], + [ + 13.521040648058126, + 54.43433202621286 + ], + [ + 13.51966336427315, + 54.43116517577336 + ], + [ + 13.542169134706867, + 54.427676105001105 + ], + [ + 13.541250548961322, + 54.41932997426513 + ], + [ + 13.531650294504745, + 54.41616167948639 + ], + [ + 13.528049342373274, + 54.420004488643364 + ], + [ + 13.51056459682392, + 54.418462732742135 + ], + [ + 13.503640793869096, + 54.425683889286724 + ], + [ + 13.494308139427432, + 54.42077527890408 + ], + [ + 13.476842378322534, + 54.42429854028728 + ], + [ + 13.475280474382602, + 54.43197579167533 + ], + [ + 13.48223349159188, + 54.438274677882056 + ], + [ + 13.476825159953563, + 54.4377584002356 + ], + [ + 13.48346766918343, + 54.442865188402784 + ], + [ + 13.49852432939889, + 54.446194917277445 + ], + [ + 13.484630792021187, + 54.44041675639102 + ], + [ + 13.482732937575475, + 54.43559763457776 + ], + [ + 13.503909435634998, + 54.434406282801035 + ], + [ + 13.514034758399879, + 54.443191609534026 + ], + [ + 13.500081887674321, + 54.44449210280988 + ], + [ + 13.505462227027822, + 54.45179653862959 + ], + [ + 13.47203511278329, + 54.452368299587754 + ], + [ + 13.471456201881836, + 54.4577591125692 + ], + [ + 13.483822660488313, + 54.47371486835744 + ], + [ + 13.503314555530118, + 54.479333885907394 + ], + [ + 13.508337605398223, + 54.47699120269276 + ], + [ + 13.511844521560407, + 54.480188034616546 + ], + [ + 13.526747969200366, + 54.480344947530945 + ], + [ + 13.54254987873845, + 54.47659885193415 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 2, + "BSG": 1, + "RS": "03", + "AGS": "03", + "SDV_RS": "032410001001", + "GEN": "Niedersachsen", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "03", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE9", + "RS_0": "030000000000", + "AGS_0": "03000000", + "WSK": "2015/01/01", + "DEBKG_ID": "DEBKGDL200000041", + "destatis": { + "population": 7826739, + "population_m": 3846089, + "population_w": 3980650 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 6.722488231356502, + 53.56948239716692 + ], + [ + 6.732382580557855, + 53.570177286134786 + ], + [ + 6.718225264606438, + 53.56641224765945 + ], + [ + 6.722216236981599, + 53.55860066135981 + ], + [ + 6.720547981928948, + 53.55861502716152 + ], + [ + 6.70647980650924, + 53.56822957096588 + ], + [ + 6.717524309197102, + 53.570925364804964 + ], + [ + 6.722488231356502, + 53.56948239716692 + ] + ] + ], + [ + [ + [ + 8.166213252127667, + 53.53135576572963 + ], + [ + 8.15736488160576, + 53.52916324875355 + ], + [ + 8.163594446978356, + 53.53995305872516 + ], + [ + 8.168852757069581, + 53.54125721960332 + ], + [ + 8.166213252127667, + 53.53135576572963 + ] + ] + ], + [ + [ + [ + 7.50415744897577, + 53.72359525663469 + ], + [ + 7.495687061082492, + 53.723064403171385 + ], + [ + 7.494174559701261, + 53.72642252509199 + ], + [ + 7.502653169151528, + 53.73088644069018 + ], + [ + 7.50415744897577, + 53.72359525663469 + ] + ] + ], + [ + [ + [ + 7.09498156707892, + 53.51584933037718 + ], + [ + 7.097709417082525, + 53.51593973707359 + ], + [ + 7.108672626214303, + 53.51126758341465 + ], + [ + 7.095780083349359, + 53.511721450002256 + ], + [ + 7.088601052037378, + 53.517145704608296 + ], + [ + 7.09498156707892, + 53.51584933037718 + ] + ] + ], + [ + [ + [ + 7.158769868107241, + 53.627808198472216 + ], + [ + 7.163396838018356, + 53.62541061414901 + ], + [ + 7.160063572181282, + 53.62391844545653 + ], + [ + 7.156205632788372, + 53.626881249712014 + ], + [ + 7.154374107109342, + 53.62195399448631 + ], + [ + 7.156217074822218, + 53.63017230254254 + ], + [ + 7.158769868107241, + 53.627808198472216 + ] + ] + ], + [ + [ + [ + 6.750721031441825, + 53.55807707938935 + ], + [ + 6.746681822114981, + 53.55960916127328 + ], + [ + 6.748775861896798, + 53.563208821875904 + ], + [ + 6.752972304112041, + 53.56291344186519 + ], + [ + 6.750721031441825, + 53.55807707938935 + ] + ] + ], + [ + [ + [ + 7.039726431759034, + 53.53578138792154 + ], + [ + 7.03414545066585, + 53.54567022972755 + ], + [ + 7.035951448371076, + 53.546077976369986 + ], + [ + 7.039746023015961, + 53.53836248199039 + ], + [ + 7.039726431759034, + 53.53578138792154 + ] + ] + ], + [ + [ + [ + 7.033553223605344, + 53.53000510715651 + ], + [ + 7.035854610085956, + 53.525207812962364 + ], + [ + 7.03594743594061, + 53.52501429324314 + ], + [ + 7.029219174011625, + 53.53243173040633 + ], + [ + 7.033553223605344, + 53.53000510715651 + ] + ] + ], + [ + [ + [ + 7.166648345849812, + 53.70417054800868 + ], + [ + 7.167681978620109, + 53.701554203679606 + ], + [ + 7.163347905885267, + 53.700922088966216 + ], + [ + 7.16492579486091, + 53.69808111614 + ], + [ + 7.161494310629704, + 53.70103870127814 + ], + [ + 7.166648345849812, + 53.70417054800868 + ] + ] + ], + [ + [ + [ + 7.809633115122707, + 53.70697224287054 + ], + [ + 7.808383495066976, + 53.709285841962966 + ], + [ + 7.811633385676219, + 53.7110497335028 + ], + [ + 7.812216791509115, + 53.708610193295925 + ], + [ + 7.809633115122707, + 53.70697224287054 + ] + ] + ], + [ + [ + [ + 7.368924011450924, + 53.723432927865076 + ], + [ + 7.364279331728926, + 53.72031958150965 + ], + [ + 7.362521646200639, + 53.72077473298848 + ], + [ + 7.36507330095081, + 53.723425484759325 + ], + [ + 7.368924011450924, + 53.723432927865076 + ] + ] + ], + [ + [ + [ + 6.743376199296777, + 53.55727719295021 + ], + [ + 6.74108490806366, + 53.556956040863014 + ], + [ + 6.741987387269026, + 53.560144353412504 + ], + [ + 6.74408353379322, + 53.55994631307354 + ], + [ + 6.743376199296777, + 53.55727719295021 + ] + ] + ], + [ + [ + [ + 7.697489622370146, + 53.76349996562063 + ], + [ + 7.695065337992399, + 53.76312420275464 + ], + [ + 7.69592374831926, + 53.765608616243256 + ], + [ + 7.698454333988558, + 53.76534483212978 + ], + [ + 7.697489622370146, + 53.76349996562063 + ] + ] + ], + [ + [ + [ + 8.086483123114396, + 53.6429876448045 + ], + [ + 8.086000808061648, + 53.642260816210204 + ], + [ + 8.082118773692631, + 53.64194297546419 + ], + [ + 8.08441567954997, + 53.64387954078373 + ], + [ + 8.086483123114396, + 53.6429876448045 + ] + ] + ], + [ + [ + [ + 7.872576105189641, + 53.787574108035066 + ], + [ + 7.869908340074476, + 53.78707876870335 + ], + [ + 7.870003948329052, + 53.789478008264105 + ], + [ + 7.872208409423258, + 53.78900437434541 + ], + [ + 7.872576105189641, + 53.787574108035066 + ] + ] + ], + [ + [ + [ + 8.025754521768272, + 53.68466787054832 + ], + [ + 8.024456193559558, + 53.68342797016064 + ], + [ + 8.020517245184548, + 53.68319932504715 + ], + [ + 8.021381399696017, + 53.684258050345655 + ], + [ + 8.025754521768272, + 53.68466787054832 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "01", + "AGS": "01", + "SDV_RS": "010020000000", + "GEN": "Schleswig-Holstein", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "01", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEF", + "RS_0": "010000000000", + "AGS_0": "01000000", + "WSK": "2012/02/01", + "DEBKG_ID": "DEBKGDL200000029", + "destatis": { + "population": 2830864, + "population_m": 1381451, + "population_w": 1449413 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 8.44921463993128, + 55.04957854492019 + ], + [ + 8.464195699549256, + 55.04571479344304 + ], + [ + 8.448226120064588, + 55.042350643224616 + ], + [ + 8.43244206625022, + 55.04892415147402 + ], + [ + 8.396235406401543, + 55.046154655649175 + ], + [ + 8.400539824502687, + 55.03481393237859 + ], + [ + 8.426277442016561, + 55.032806891617575 + ], + [ + 8.42716514473665, + 55.03701089767452 + ], + [ + 8.436703587215174, + 55.03940879954453 + ], + [ + 8.427298179117166, + 55.030890659469456 + ], + [ + 8.431298341328745, + 55.025358842840404 + ], + [ + 8.430333561704028, + 55.029305002704994 + ], + [ + 8.44040067188545, + 55.02312061156681 + ], + [ + 8.440028994227166, + 55.01587022196929 + ], + [ + 8.417119551807785, + 55.0075815510065 + ], + [ + 8.395487404797471, + 55.004053886596964 + ], + [ + 8.37990226162572, + 54.99677609866008 + ], + [ + 8.352821840538446, + 54.9678570309958 + ], + [ + 8.361671815223827, + 54.95781823192805 + ], + [ + 8.359855222445587, + 54.933479631770254 + ], + [ + 8.361940994801557, + 54.92415310487317 + ], + [ + 8.366786280144018, + 54.92410593970305 + ], + [ + 8.36092013414767, + 54.91791632110795 + ], + [ + 8.366301657227353, + 54.90389976454572 + ], + [ + 8.38063885270951, + 54.89201972396897 + ], + [ + 8.425839746129315, + 54.8776621694995 + ], + [ + 8.486490274837266, + 54.87674306627798 + ], + [ + 8.487370156675507, + 54.879289586851804 + ], + [ + 8.512440162156679, + 54.88432204449851 + ], + [ + 8.61122113443334, + 54.88838230999304 + ], + [ + 8.636313238364146, + 54.894387198014016 + ], + [ + 8.638003412784085, + 54.91125185471705 + ], + [ + 8.660034450768215, + 54.90867586814989 + ], + [ + 8.668524378302777, + 54.91127856751443 + ], + [ + 8.680346010660626, + 54.91049092688796 + ], + [ + 8.72799592585535, + 54.892706712547906 + ], + [ + 8.755057224441657, + 54.896847894384585 + ], + [ + 8.77691171358628, + 54.89266905143613 + ], + [ + 8.776343432029405, + 54.89549897596405 + ], + [ + 8.798959863719583, + 54.90457619716127 + ], + [ + 8.818795764901097, + 54.90395064917231 + ], + [ + 8.824017552047657, + 54.90683304394896 + ], + [ + 8.837005166772588, + 54.90546366807387 + ], + [ + 8.848693929046052, + 54.897278251075605 + ], + [ + 8.859445638535314, + 54.896638249144466 + ], + [ + 8.892035848942857, + 54.904912585684635 + ], + [ + 8.913619549104572, + 54.90215559725721 + ], + [ + 8.947938647704678, + 54.902563364346335 + ], + [ + 9.01475568280116, + 54.886406059231454 + ], + [ + 9.048239957284748, + 54.87187655184235 + ], + [ + 9.090454976687141, + 54.870184702239854 + ], + [ + 9.110216985317384, + 54.87391336362937 + ], + [ + 9.143330468613208, + 54.873022636460774 + ], + [ + 9.240138464331837, + 54.849983793869065 + ], + [ + 9.244829836059813, + 54.84386487553724 + ], + [ + 9.235160472131504, + 54.83510618957955 + ], + [ + 9.235755295908584, + 54.83110351047767 + ], + [ + 9.250081139449874, + 54.80971527872908 + ], + [ + 9.27332931128916, + 54.81175428014376 + ], + [ + 9.284050183812452, + 54.809613519507984 + ], + [ + 9.2860910423615, + 54.80447326317051 + ], + [ + 9.29477651315563, + 54.80187260096309 + ], + [ + 9.293485270179236, + 54.80898389693175 + ], + [ + 9.329345759902342, + 54.80556888051954 + ], + [ + 9.343610061741492, + 54.8002479917951 + ], + [ + 9.343133258764228, + 54.80706563926117 + ], + [ + 9.373848407290712, + 54.821127925326365 + ], + [ + 9.374630309262118, + 54.833258839376946 + ], + [ + 9.37875480134011, + 54.833079837980435 + ], + [ + 9.382680668910853, + 54.83920144945969 + ], + [ + 9.403557077826983, + 54.838859599325225 + ], + [ + 9.41113080368491, + 54.84229701423959 + ], + [ + 9.418044451879034, + 54.83818895295311 + ], + [ + 9.416203009873648, + 54.83378074624492 + ], + [ + 9.427305876025851, + 54.81630975295674 + ], + [ + 9.437558196380124, + 54.80891340491053 + ], + [ + 9.428511475527692, + 54.800088026132045 + ], + [ + 9.436697178515859, + 54.78874409300228 + ], + [ + 9.4383408266429, + 54.80300337146313 + ], + [ + 9.442017460283445, + 54.80457262440766 + ], + [ + 9.440440707922571, + 54.800551444109004 + ], + [ + 9.443779115588919, + 54.80513812534005 + ], + [ + 9.452729919225566, + 54.807548524095175 + ], + [ + 9.465036283990385, + 54.82248373153517 + ], + [ + 9.499096730033504, + 54.82331031076504 + ], + [ + 9.516731278038261, + 54.83886809472809 + ], + [ + 9.52344783966985, + 54.836846833459866 + ], + [ + 9.540130005413664, + 54.84829970183734 + ], + [ + 9.571876609271245, + 54.85712486394655 + ], + [ + 9.573677383174608, + 54.863708580357404 + ], + [ + 9.585793586559289, + 54.86616786587128 + ], + [ + 9.589239437544132, + 54.8764399725977 + ], + [ + 9.613169072429102, + 54.87723542064591 + ], + [ + 9.597176614496222, + 54.86411277107233 + ], + [ + 9.589751214346304, + 54.85106829352157 + ], + [ + 9.593343419691806, + 54.840096399847376 + ], + [ + 9.60443349270336, + 54.83077272475369 + ], + [ + 9.623530118188159, + 54.83174131584221 + ], + [ + 9.65365675220097, + 54.82039749897684 + ], + [ + 9.662634773349318, + 54.82347612514883 + ], + [ + 9.711763039252626, + 54.80859422055635 + ], + [ + 9.760689480632665, + 54.80142293999579 + ], + [ + 9.772299021820887, + 54.795810299402234 + ], + [ + 9.79187734667735, + 54.79781001393684 + ], + [ + 9.807767839414371, + 54.77908327079088 + ], + [ + 9.841437580613428, + 54.75719762653514 + ], + [ + 9.874558997802277, + 54.75235482712407 + ], + [ + 9.882344836474095, + 54.763899704594195 + ], + [ + 9.894488602307009, + 54.77114124749105 + ], + [ + 9.893059017555474, + 54.767715321146966 + ], + [ + 9.902161666327295, + 54.76696064525053 + ], + [ + 9.905374299046553, + 54.76334288667918 + ], + [ + 9.906688144237942, + 54.769237509222 + ], + [ + 9.903550318889028, + 54.77335424301855 + ], + [ + 9.89969756349532, + 54.77279001179729 + ], + [ + 9.9042577761398, + 54.781779396019566 + ], + [ + 9.901623755458122, + 54.78796404298223 + ], + [ + 9.909238649735656, + 54.7999882813309 + ], + [ + 9.913090891370116, + 54.795483371118664 + ], + [ + 9.957233879616108, + 54.77985580985485 + ], + [ + 9.976905807205203, + 54.75683564764199 + ], + [ + 9.988994157314576, + 54.718315221457935 + ], + [ + 10.035282342299055, + 54.68960795771564 + ], + [ + 10.036726319647098, + 54.68258278686017 + ], + [ + 10.033690607253371, + 54.6722625647373 + ], + [ + 10.03320597040697, + 54.67814601335846 + ], + [ + 10.027381628300772, + 54.67862312533212 + ], + [ + 10.035023564820015, + 54.68432669619527 + ], + [ + 10.02443428917868, + 54.682007825644654 + ], + [ + 10.030563330273038, + 54.68739726465777 + ], + [ + 10.026211586034066, + 54.68434159660877 + ], + [ + 10.021579384555682, + 54.684419203477624 + ], + [ + 10.030243432594933, + 54.69038807261079 + ], + [ + 10.026579546855602, + 54.69179921419029 + ], + [ + 10.024335778980829, + 54.68716036296047 + ], + [ + 10.020345946522244, + 54.68840388674062 + ], + [ + 10.023173068129681, + 54.69216639821373 + ], + [ + 10.01651312039177, + 54.69385090735595 + ], + [ + 9.99295503963613, + 54.68197880413725 + ], + [ + 9.988055275779356, + 54.684993425789756 + ], + [ + 9.994308160804296, + 54.689217036882766 + ], + [ + 9.991812439168674, + 54.699132852261215 + ], + [ + 9.983343891093101, + 54.700998329612666 + ], + [ + 9.972737320832533, + 54.68995140038296 + ], + [ + 9.978952757272674, + 54.68792013166065 + ], + [ + 9.97804290214172, + 54.6824789276898 + ], + [ + 9.967844495474798, + 54.68329920533782 + ], + [ + 9.962605489069936, + 54.67884952414068 + ], + [ + 9.948616152039278, + 54.67825940209828 + ], + [ + 9.9377294809923, + 54.67295955446025 + ], + [ + 9.929766793611023, + 54.63380953659728 + ], + [ + 9.931761062624506, + 54.63161050528865 + ], + [ + 9.934350703895001, + 54.634664801577394 + ], + [ + 9.93703622573469, + 54.63282779583943 + ], + [ + 9.931476976954157, + 54.62805762347592 + ], + [ + 9.913789193685203, + 54.62892572986475 + ], + [ + 9.909070249334986, + 54.63446800887369 + ], + [ + 9.90563907705153, + 54.630984765601 + ], + [ + 9.909425863092725, + 54.62785532325465 + ], + [ + 9.89149026639529, + 54.62283384691158 + ], + [ + 9.87666237374355, + 54.60963824352786 + ], + [ + 9.859426216210597, + 54.60221385203913 + ], + [ + 9.833831887015105, + 54.597415109541856 + ], + [ + 9.833831378679564, + 54.59482644038971 + ], + [ + 9.839523010843356, + 54.594405019979746 + ], + [ + 9.825948405929985, + 54.591554812888305 + ], + [ + 9.822462673641274, + 54.584774314964015 + ], + [ + 9.819011817045265, + 54.58369565071477 + ], + [ + 9.811860872224813, + 54.58765536436041 + ], + [ + 9.824082257443361, + 54.59431671821033 + ], + [ + 9.804943550644838, + 54.588045069214516 + ], + [ + 9.802257944485202, + 54.57971790440379 + ], + [ + 9.80949848312343, + 54.587072511567435 + ], + [ + 9.815472232594317, + 54.584665968207005 + ], + [ + 9.81198713554862, + 54.57981866069465 + ], + [ + 9.797859603263321, + 54.57765965338034 + ], + [ + 9.793319274059487, + 54.57384958420429 + ], + [ + 9.772854826621058, + 54.57527741458643 + ], + [ + 9.781377628709507, + 54.57898358567422 + ], + [ + 9.770109315178331, + 54.58043910408747 + ], + [ + 9.763298703915066, + 54.56757459276787 + ], + [ + 9.76891215333701, + 54.56813148833712 + ], + [ + 9.769022748258594, + 54.56509025507263 + ], + [ + 9.75333554338264, + 54.557636000740054 + ], + [ + 9.73787991505814, + 54.542082002804996 + ], + [ + 9.734869066141172, + 54.532278297063975 + ], + [ + 9.725829627188721, + 54.53077442965024 + ], + [ + 9.720170718609214, + 54.53427861737192 + ], + [ + 9.713739685444912, + 54.53307496753784 + ], + [ + 9.719873303593017, + 54.53029798251404 + ], + [ + 9.71218176358742, + 54.52009686341966 + ], + [ + 9.702803620540774, + 54.51942051096775 + ], + [ + 9.697222943141085, + 54.52743704929993 + ], + [ + 9.65848256548787, + 54.52260098020065 + ], + [ + 9.64657690541858, + 54.52378001115108 + ], + [ + 9.650149912152953, + 54.52069257176852 + ], + [ + 9.639152283440374, + 54.52140196460004 + ], + [ + 9.633889864329584, + 54.51310024352351 + ], + [ + 9.625874829877933, + 54.521762128107454 + ], + [ + 9.63311573008354, + 54.526285650555444 + ], + [ + 9.627073386067854, + 54.53105743343217 + ], + [ + 9.603694256974629, + 54.52636548406692 + ], + [ + 9.605549579609264, + 54.521303882943236 + ], + [ + 9.597309339007527, + 54.51895202245281 + ], + [ + 9.58703448102375, + 54.51016126431765 + ], + [ + 9.573145789592907, + 54.51244812864667 + ], + [ + 9.557827150982213, + 54.51093437257441 + ], + [ + 9.556717036356876, + 54.51299986307325 + ], + [ + 9.545098874884495, + 54.50884584143076 + ], + [ + 9.560266810754179, + 54.501714767765606 + ], + [ + 9.575684839806355, + 54.50133475470579 + ], + [ + 9.624568773413978, + 54.5117914256879 + ], + [ + 9.638654051387814, + 54.50802516860031 + ], + [ + 9.64062169823942, + 54.510671733827174 + ], + [ + 9.647803105663183, + 54.51030741657014 + ], + [ + 9.66469843823052, + 54.506904946530156 + ], + [ + 9.674039652370974, + 54.49628544853875 + ], + [ + 9.684296395003338, + 54.49539844084401 + ], + [ + 9.69067983922167, + 54.49062379461316 + ], + [ + 9.70847099240722, + 54.4917061024396 + ], + [ + 9.711996791963493, + 54.50139155285505 + ], + [ + 9.708251234298988, + 54.508997282098505 + ], + [ + 9.698552537037441, + 54.514944051336116 + ], + [ + 9.697021786320226, + 54.51857634443586 + ], + [ + 9.71509440046666, + 54.51712224846141 + ], + [ + 9.72169299910846, + 54.52918142978809 + ], + [ + 9.727014646736507, + 54.52847778270264 + ], + [ + 9.722566591909183, + 54.5215625226314 + ], + [ + 9.725821084481916, + 54.51996737745085 + ], + [ + 9.73553071073622, + 54.524966831172904 + ], + [ + 9.739882690494534, + 54.52363923265475 + ], + [ + 9.744943710205707, + 54.52376457238747 + ], + [ + 9.754761689176577, + 54.527409320386546 + ], + [ + 9.76657922082055, + 54.52648087295792 + ], + [ + 9.759066003328211, + 54.528812205927025 + ], + [ + 9.73995295051093, + 54.52428094995704 + ], + [ + 9.734756686833846, + 54.52714729515375 + ], + [ + 9.742548388745476, + 54.52990189271468 + ], + [ + 9.739417681929524, + 54.53601095247336 + ], + [ + 9.744720591801036, + 54.53639900899729 + ], + [ + 9.749153719822054, + 54.54678089072223 + ], + [ + 9.760475616084783, + 54.54884267206099 + ], + [ + 9.765669329518705, + 54.5556893927585 + ], + [ + 9.773794312614644, + 54.55849136173981 + ], + [ + 9.779333992789986, + 54.55658464506469 + ], + [ + 9.774422894275894, + 54.55275919626481 + ], + [ + 9.778168830430976, + 54.553540649589706 + ], + [ + 9.802491360115539, + 54.56662448965117 + ], + [ + 9.819751970703159, + 54.582603720313564 + ], + [ + 9.838169421793433, + 54.58410257626941 + ], + [ + 9.84169594093009, + 54.59141204799109 + ], + [ + 9.844602958257115, + 54.58852970407946 + ], + [ + 9.848594994867446, + 54.59223145758656 + ], + [ + 9.877907473639427, + 54.598601138011254 + ], + [ + 9.90558087805667, + 54.614598203216254 + ], + [ + 9.918772842948918, + 54.616416796613215 + ], + [ + 9.932790719860341, + 54.623913533150635 + ], + [ + 9.938037267455528, + 54.62331945646813 + ], + [ + 9.93580075104368, + 54.62841535552958 + ], + [ + 9.945232039751998, + 54.63672500500174 + ], + [ + 9.938046600581988, + 54.645388978303146 + ], + [ + 9.936665925225832, + 54.65046297822654 + ], + [ + 9.941562011832383, + 54.65498474082335 + ], + [ + 9.938118278164483, + 54.66067477353933 + ], + [ + 9.948755263984694, + 54.67437585823347 + ], + [ + 9.976872283537759, + 54.67375876125937 + ], + [ + 9.989538392108019, + 54.669939662609984 + ], + [ + 9.988463641883579, + 54.66390366601017 + ], + [ + 9.990561684000873, + 54.6665954948111 + ], + [ + 9.99782727381818, + 54.665389635491 + ], + [ + 10.002893578096039, + 54.67405562406214 + ], + [ + 10.010294392113085, + 54.66152555264151 + ], + [ + 10.016158573861452, + 54.664314959578306 + ], + [ + 10.030167210997966, + 54.66403148027313 + ], + [ + 10.032940956748897, + 54.669057546045345 + ], + [ + 10.02817720506781, + 54.67229603067525 + ], + [ + 10.03488843245214, + 54.670550149204395 + ], + [ + 10.032746392432513, + 54.66251696261379 + ], + [ + 10.016859603521882, + 54.66363423912938 + ], + [ + 10.014303006544491, + 54.66019054080493 + ], + [ + 10.024825934660695, + 54.658136998037286 + ], + [ + 10.032521365805831, + 54.66026753745363 + ], + [ + 10.034485215949049, + 54.65764503444481 + ], + [ + 10.03087060010992, + 54.64144709336456 + ], + [ + 10.033553725311993, + 54.6207395012811 + ], + [ + 10.02680447968092, + 54.603483790528024 + ], + [ + 10.027543941611672, + 54.583794513198804 + ], + [ + 10.022507106066747, + 54.582654059487815 + ], + [ + 10.027650578225444, + 54.581488518216105 + ], + [ + 10.02689190064548, + 54.55093062943332 + ], + [ + 10.014819433264702, + 54.54508980536576 + ], + [ + 9.99832889132673, + 54.52165482641478 + ], + [ + 9.964664115100804, + 54.50247764976453 + ], + [ + 9.879803611591798, + 54.475947104826346 + ], + [ + 9.861794235582012, + 54.47271177159615 + ], + [ + 9.854894105150988, + 54.476397687710275 + ], + [ + 9.84359255315072, + 54.47652796212096 + ], + [ + 9.835394131275642, + 54.475026782539715 + ], + [ + 9.832853906609518, + 54.47355924919411 + ], + [ + 9.841711635960536, + 54.47402392619749 + ], + [ + 9.843841929341172, + 54.461233859300926 + ], + [ + 9.857905543833304, + 54.45054597705145 + ], + [ + 9.867551648700424, + 54.44811974996875 + ], + [ + 9.913749066512231, + 54.45237600636196 + ], + [ + 9.9232092020533, + 54.459680204951646 + ], + [ + 9.9245065572144, + 54.45723552669718 + ], + [ + 9.93234706849991, + 54.460869608141216 + ], + [ + 9.923060313471513, + 54.46018616896949 + ], + [ + 9.924255119254125, + 54.46229375693841 + ], + [ + 9.997511005209715, + 54.468627947836055 + ], + [ + 10.020984832620288, + 54.47541737320421 + ], + [ + 10.127937395251708, + 54.485110209588 + ], + [ + 10.158214644186724, + 54.47512338021965 + ], + [ + 10.188890243824641, + 54.457721342888014 + ], + [ + 10.199299713925907, + 54.455775117112594 + ], + [ + 10.19563225611485, + 54.44982817077898 + ], + [ + 10.184605974887056, + 54.447140782717845 + ], + [ + 10.168516847306986, + 54.432844870224734 + ], + [ + 10.188773122419871, + 54.41108284905239 + ], + [ + 10.19268816355295, + 54.39034391922871 + ], + [ + 10.17613122318031, + 54.38981837894162 + ], + [ + 10.161161601618021, + 54.385157716193824 + ], + [ + 10.166834097369888, + 54.37790652607658 + ], + [ + 10.154140028437803, + 54.36887915367618 + ], + [ + 10.139535751761056, + 54.368479065191906 + ], + [ + 10.148424812093936, + 54.36641225663234 + ], + [ + 10.139159217794473, + 54.36571267302581 + ], + [ + 10.152083022471288, + 54.36332651841844 + ], + [ + 10.147189721817512, + 54.36345783654288 + ], + [ + 10.149781372686132, + 54.35920624925694 + ], + [ + 10.145521627595143, + 54.36105043128488 + ], + [ + 10.141359828118828, + 54.35390545252558 + ], + [ + 10.155254792569773, + 54.34494582613291 + ], + [ + 10.157702751363473, + 54.338370045284584 + ], + [ + 10.136380988722642, + 54.31751881555284 + ], + [ + 10.132533569351969, + 54.31125490216628 + ], + [ + 10.14863347433938, + 54.3218678044541 + ], + [ + 10.152260386991156, + 54.31972111481034 + ], + [ + 10.1506322918192, + 54.32394492321226 + ], + [ + 10.163896807293202, + 54.324038079610496 + ], + [ + 10.169998217488752, + 54.32875529764969 + ], + [ + 10.166971430903928, + 54.33563578183564 + ], + [ + 10.170677227059, + 54.337599225118495 + ], + [ + 10.177155615297645, + 54.33450798051076 + ], + [ + 10.173018880139184, + 54.33761016590798 + ], + [ + 10.178220817600906, + 54.36114311762258 + ], + [ + 10.195952269656269, + 54.366019734649065 + ], + [ + 10.193662463997342, + 54.37925439652846 + ], + [ + 10.208061244501858, + 54.38741265081738 + ], + [ + 10.209165377319358, + 54.39663908199017 + ], + [ + 10.216162906023092, + 54.399283089089415 + ], + [ + 10.226061065814827, + 54.41390558710736 + ], + [ + 10.289805710796287, + 54.41945097510112 + ], + [ + 10.293978608948338, + 54.425814262429775 + ], + [ + 10.28002604196235, + 54.420260912557424 + ], + [ + 10.276060516510826, + 54.421479609063084 + ], + [ + 10.30210849796767, + 54.43315275833613 + ], + [ + 10.315691515151721, + 54.43531111023749 + ], + [ + 10.336814840066921, + 54.435197688838585 + ], + [ + 10.387982309065395, + 54.426445872463816 + ], + [ + 10.47369919323124, + 54.39247291629914 + ], + [ + 10.539874620881001, + 54.379813062390596 + ], + [ + 10.599607975696035, + 54.36373130321508 + ], + [ + 10.638803079853929, + 54.34784473966637 + ], + [ + 10.649243860749392, + 54.333351373993665 + ], + [ + 10.678208070675575, + 54.32144853188996 + ], + [ + 10.684633959463348, + 54.31031893372858 + ], + [ + 10.706974465125718, + 54.30503645901932 + ], + [ + 10.739806647923082, + 54.309586770787796 + ], + [ + 10.758652299045119, + 54.30598592759454 + ], + [ + 10.789502880037096, + 54.312133408044836 + ], + [ + 10.829229581060291, + 54.330023971964316 + ], + [ + 10.871762905694622, + 54.35826985859868 + ], + [ + 10.906994165257275, + 54.36768201774714 + ], + [ + 10.931205242128451, + 54.38193996789257 + ], + [ + 10.949450671477047, + 54.38478377958926 + ], + [ + 10.96128290548078, + 54.38172453865576 + ], + [ + 11.021226870751507, + 54.380633419816796 + ], + [ + 11.023382819256597, + 54.376766425956944 + ], + [ + 11.01702450381311, + 54.375782241351914 + ], + [ + 11.019631805964682, + 54.378864083079726 + ], + [ + 11.018334235475198, + 54.38000234882442 + ], + [ + 11.005836477319216, + 54.37438855282132 + ], + [ + 11.005835625789082, + 54.378767145569604 + ], + [ + 10.997978655872318, + 54.37518535638377 + ], + [ + 10.997957465885863, + 54.377879955192604 + ], + [ + 10.992323302557349, + 54.3759730777848 + ], + [ + 10.993880892235278, + 54.379151400828285 + ], + [ + 10.987429681961265, + 54.375808935564784 + ], + [ + 10.986174818147528, + 54.38009637615764 + ], + [ + 10.980069018046715, + 54.37599877372458 + ], + [ + 10.992109103261777, + 54.370475530647894 + ], + [ + 10.999110766653438, + 54.36958605273971 + ], + [ + 11.00691206009978, + 54.37299720868111 + ], + [ + 11.023741258139541, + 54.36771167335037 + ], + [ + 11.079122260151774, + 54.37757108922442 + ], + [ + 11.09011317161558, + 54.3913406577241 + ], + [ + 11.107674317428337, + 54.397506862258716 + ], + [ + 11.113452989234244, + 54.39114918026181 + ], + [ + 11.108545766922942, + 54.39272129188592 + ], + [ + 11.109706837491032, + 54.389159070819005 + ], + [ + 11.118493157083378, + 54.39233378103334 + ], + [ + 11.1185582299477, + 54.394420938204156 + ], + [ + 11.128829806275096, + 54.38990562194313 + ], + [ + 11.130224548695429, + 54.38332503680408 + ], + [ + 11.12046961863024, + 54.370867432909655 + ], + [ + 11.082242156589354, + 54.35284331063739 + ], + [ + 11.068583054559305, + 54.35835520142103 + ], + [ + 11.061904143929363, + 54.35772002790661 + ], + [ + 11.058109382333939, + 54.35303325273181 + ], + [ + 11.062824070330093, + 54.3441180015101 + ], + [ + 11.075816634205838, + 54.3466783541522 + ], + [ + 11.072493749299843, + 54.33211296562105 + ], + [ + 11.083767658167396, + 54.279279417134454 + ], + [ + 11.08190579986571, + 54.25183417030526 + ], + [ + 11.091205923456338, + 54.21856458953157 + ], + [ + 11.091935758343553, + 54.19731978177715 + ], + [ + 11.070495008833953, + 54.192856777215404 + ], + [ + 11.04691667828122, + 54.17653162810978 + ], + [ + 10.955098331238414, + 54.14108373836974 + ], + [ + 10.926231897815484, + 54.118441190888674 + ], + [ + 10.877515196380605, + 54.088017815503505 + ], + [ + 10.865863013509264, + 54.08481304973755 + ], + [ + 10.853994429527487, + 54.08913889972067 + ], + [ + 10.823867673480661, + 54.089049898467266 + ], + [ + 10.813702012731921, + 54.094022322416215 + ], + [ + 10.815092305553168, + 54.101741555910564 + ], + [ + 10.810451358468988, + 54.10561792061517 + ], + [ + 10.8118617090954, + 54.09668830160285 + ], + [ + 10.80003924103518, + 54.09826742253752 + ], + [ + 10.800451076996351, + 54.092651584968756 + ], + [ + 10.802858050062524, + 54.09503002092188 + ], + [ + 10.806655042718594, + 54.091823525349334 + ], + [ + 10.798917977922894, + 54.08295120632076 + ], + [ + 10.783797396600495, + 54.06978385099584 + ], + [ + 10.757102398851838, + 54.05663884891296 + ], + [ + 10.751079980496412, + 54.0454515575006 + ], + [ + 10.76018652998115, + 54.024607185052076 + ], + [ + 10.78724918504364, + 53.99743861749866 + ], + [ + 10.801641795530594, + 53.9921110435093 + ], + [ + 10.811990100108488, + 53.99263100325346 + ], + [ + 10.809126731678898, + 53.995750137909944 + ], + [ + 10.839312052600112, + 53.99175560469349 + ], + [ + 10.86077398237662, + 53.99373296915261 + ], + [ + 10.878836860776259, + 53.98594747310763 + ], + [ + 10.884538478183403, + 53.978197998220644 + ], + [ + 10.882104524484886, + 53.967585866506084 + ], + [ + 10.886586854769345, + 53.9617624138451 + ], + [ + 10.882767843676016, + 53.95879206062921 + ], + [ + 10.903661739173112, + 53.95682190259485 + ], + [ + 10.90941081511078, + 53.94760020691967 + ], + [ + 10.895583600446813, + 53.934454474891616 + ], + [ + 10.894527221779777, + 53.925421304289955 + ], + [ + 10.898440465020842, + 53.92230982458444 + ], + [ + 10.913005598792338, + 53.92404096058411 + ], + [ + 10.929871939361519, + 53.91827986849019 + ], + [ + 10.9393322922323, + 53.919333773530276 + ], + [ + 10.949369970070233, + 53.912902219331556 + ], + [ + 10.962860013847882, + 53.91379601077321 + ], + [ + 10.968375594131583, + 53.90886177235434 + ], + [ + 10.96433956741497, + 53.907026414622784 + ], + [ + 10.959846607768537, + 53.90941456512279 + ], + [ + 10.963264335258003, + 53.91033611504648 + ], + [ + 10.958973167768942, + 53.91026217567732 + ], + [ + 10.936785593190729, + 53.9006494467437 + ], + [ + 10.911023570854562, + 53.89795245495799 + ], + [ + 10.902096618647597, + 53.90629077509613 + ], + [ + 10.911293635635342, + 53.91522558346816 + ], + [ + 10.896087353419183, + 53.917933763675094 + ], + [ + 10.882571899042887, + 53.92449744669551 + ], + [ + 10.874724244705588, + 53.91454151164009 + ], + [ + 10.859162006232829, + 53.909413287576726 + ], + [ + 10.855533702000749, + 53.90478856929467 + ], + [ + 10.84829537299847, + 53.90511444240117 + ], + [ + 10.847210812967674, + 53.89694306831532 + ], + [ + 10.818926895011607, + 53.89353337390399 + ], + [ + 10.79941678103889, + 53.876154844073355 + ], + [ + 10.770835477661995, + 53.873462536107354 + ], + [ + 10.759450346948299, + 53.85826038183841 + ], + [ + 10.747711196461026, + 53.851510959749625 + ], + [ + 10.753650103549603, + 53.84857435684675 + ], + [ + 10.747850836947855, + 53.833364330302665 + ], + [ + 10.761591085421017, + 53.82260091859674 + ], + [ + 10.765025986805485, + 53.803233954201445 + ], + [ + 10.773251827760769, + 53.7923874195651 + ], + [ + 10.76591543966648, + 53.77990111750473 + ], + [ + 10.770256496982926, + 53.77548063506061 + ], + [ + 10.7579767983969, + 53.76359398772602 + ], + [ + 10.758032962253818, + 53.747517469262974 + ], + [ + 10.772504534780825, + 53.749350068423965 + ], + [ + 10.805916825311702, + 53.73920982914454 + ], + [ + 10.810875909286501, + 53.72007231900012 + ], + [ + 10.824675418960938, + 53.71100376674114 + ], + [ + 10.843343345233302, + 53.707855012451404 + ], + [ + 10.846011016135263, + 53.704343603966336 + ], + [ + 10.85217085214653, + 53.70584464888197 + ], + [ + 10.850943711713143, + 53.70012492890541 + ], + [ + 10.862982071197541, + 53.70394465560777 + ], + [ + 10.880307945781556, + 53.70233034798709 + ], + [ + 10.886416616242421, + 53.70566335614984 + ], + [ + 10.905289034080914, + 53.703294284960606 + ], + [ + 10.922141997545808, + 53.69946897237297 + ], + [ + 10.926053754651624, + 53.69204576538004 + ], + [ + 10.91897174113884, + 53.689158854440386 + ], + [ + 10.927255525039236, + 53.68955284498734 + ], + [ + 10.929102606892892, + 53.686509599596 + ], + [ + 10.93711749620658, + 53.6872991930349 + ], + [ + 10.941766725283836, + 53.6845423284306 + ], + [ + 10.944264482340166, + 53.67417382728778 + ], + [ + 10.939801655580503, + 53.67312754470872 + ], + [ + 10.938627285459697, + 53.665821587638405 + ], + [ + 10.945163435031182, + 53.65909429351939 + ], + [ + 10.948568527212013, + 53.6613523211945 + ], + [ + 10.954884037805938, + 53.6567054231543 + ], + [ + 10.950750904864476, + 53.645829509918514 + ], + [ + 10.944968911065711, + 53.646784892405186 + ], + [ + 10.947646454764723, + 53.64244438049365 + ], + [ + 10.929562993712667, + 53.62870715172765 + ], + [ + 10.922263593316831, + 53.60227926111184 + ], + [ + 10.917465301094408, + 53.59931596116849 + ], + [ + 10.923795348109934, + 53.584186030959664 + ], + [ + 10.909484476825025, + 53.571450325433254 + ], + [ + 10.894826359576546, + 53.57241099883468 + ], + [ + 10.863702017360517, + 53.5646323261324 + ], + [ + 10.8501449013191, + 53.56527063131717 + ], + [ + 10.842194048199916, + 53.574842280597714 + ], + [ + 10.823260709066604, + 53.575180534606154 + ], + [ + 10.824407598282466, + 53.556271786010996 + ], + [ + 10.831905638862294, + 53.54258247063449 + ], + [ + 10.819268985726472, + 53.534521292343875 + ], + [ + 10.821614071515494, + 53.52400975536319 + ], + [ + 10.81451848306795, + 53.522024906178174 + ], + [ + 10.824605697300134, + 53.51785617755549 + ], + [ + 10.824333999013238, + 53.51374123218644 + ], + [ + 10.810642965268393, + 53.5161898173065 + ], + [ + 10.786431193200372, + 53.51045659311987 + ], + [ + 10.777781471130465, + 53.49518146780136 + ], + [ + 10.76511039250517, + 53.49107437794642 + ], + [ + 10.756012051813997, + 53.48339358302604 + ], + [ + 10.731238325278195, + 53.47947954638614 + ], + [ + 10.72681904336752, + 53.48134794151424 + ], + [ + 10.72073630176713, + 53.47606599081484 + ], + [ + 10.701661227911885, + 53.478255415963346 + ], + [ + 10.692973049913254, + 53.45513809483972 + ], + [ + 10.652042560757051, + 53.46147700688397 + ], + [ + 10.641980163960074, + 53.45573762675475 + ], + [ + 10.632308138308053, + 53.45480292751443 + ], + [ + 10.622706547483, + 53.42586637259632 + ], + [ + 10.618366003490085, + 53.42537129289755 + ], + [ + 10.61667996163074, + 53.405090422157876 + ], + [ + 10.620974568596678, + 53.404087596349804 + ], + [ + 10.621397011258004, + 53.39857065993313 + ], + [ + 10.616903898898508, + 53.38456959025576 + ], + [ + 10.599104761324925, + 53.37782756717279 + ], + [ + 10.593407587785135, + 53.36321881633445 + ], + [ + 10.5769349790299, + 53.3599588599815 + ], + [ + 10.55702527018589, + 53.36872329766507 + ], + [ + 10.502239182089912, + 53.37354465612994 + ], + [ + 10.419276817589608, + 53.40214202782864 + ], + [ + 10.375433567710628, + 53.42483037768054 + ], + [ + 10.327420902638595, + 53.42579487010735 + ], + [ + 10.30795414634868, + 53.43320110231418 + ], + [ + 10.318190260882641, + 53.43533051051012 + ], + [ + 10.315456557990432, + 53.44123970050331 + ], + [ + 10.325959157503204, + 53.44963953851845 + ], + [ + 10.311646183037798, + 53.45232345406419 + ], + [ + 10.307983818555154, + 53.44290878578282 + ], + [ + 10.301026933609796, + 53.44355376999603 + ], + [ + 10.295629322764723, + 53.448712259267985 + ], + [ + 10.297844032947278, + 53.45159163410815 + ], + [ + 10.26943024237016, + 53.46406002503157 + ], + [ + 10.272783959359039, + 53.46783160262546 + ], + [ + 10.265197815182372, + 53.4698393413865 + ], + [ + 10.26432591949112, + 53.475139689157054 + ], + [ + 10.259780745951018, + 53.47443895787108 + ], + [ + 10.257892506733748, + 53.47814666014916 + ], + [ + 10.252127736381494, + 53.4773084508369 + ], + [ + 10.238366620892513, + 53.483264110058016 + ], + [ + 10.236678548001505, + 53.49635445350513 + ], + [ + 10.22605960564528, + 53.49545964990659 + ], + [ + 10.218607039340746, + 53.49905535424519 + ], + [ + 10.223945169474211, + 53.505771154727455 + ], + [ + 10.210601309388345, + 53.52004653741589 + ], + [ + 10.200276465086386, + 53.514226346157095 + ], + [ + 10.189708982101285, + 53.512631006149384 + ], + [ + 10.16370502113012, + 53.52034997271751 + ], + [ + 10.161700335689902, + 53.525938432927724 + ], + [ + 10.16687249048638, + 53.5374323556462 + ], + [ + 10.155512062369088, + 53.53636749914309 + ], + [ + 10.151152406673361, + 53.54501790438556 + ], + [ + 10.160538739881853, + 53.55768295797215 + ], + [ + 10.149152551697506, + 53.561986364311984 + ], + [ + 10.152083349522155, + 53.5768301041813 + ], + [ + 10.161722830928069, + 53.58569873602787 + ], + [ + 10.165628177063624, + 53.58251048916099 + ], + [ + 10.201449728700773, + 53.584075870637186 + ], + [ + 10.191658335673617, + 53.59567912155901 + ], + [ + 10.196754340224592, + 53.60040017941131 + ], + [ + 10.188952192558002, + 53.61301421535061 + ], + [ + 10.205533366063023, + 53.623495735711394 + ], + [ + 10.21652379883025, + 53.625444256226274 + ], + [ + 10.22176127395128, + 53.63372253359423 + ], + [ + 10.18963501877422, + 53.638156660406736 + ], + [ + 10.19861919056919, + 53.646436182679615 + ], + [ + 10.196056384184377, + 53.65470392905673 + ], + [ + 10.187431441818243, + 53.65652722297925 + ], + [ + 10.182902768663899, + 53.66373797062869 + ], + [ + 10.173865452713343, + 53.66452313727253 + ], + [ + 10.172485432818455, + 53.6690029656787 + ], + [ + 10.155970535208775, + 53.66950241511714 + ], + [ + 10.160377262488403, + 53.671495099818095 + ], + [ + 10.15412413434582, + 53.67583545028709 + ], + [ + 10.143246259090443, + 53.67556199967417 + ], + [ + 10.140273002437437, + 53.680126680571355 + ], + [ + 10.150575731014714, + 53.682438316363616 + ], + [ + 10.159454876693756, + 53.69081886636747 + ], + [ + 10.157523258991786, + 53.705029061854624 + ], + [ + 10.173853574320635, + 53.71279697434495 + ], + [ + 10.181693594949179, + 53.709251559769605 + ], + [ + 10.193670978789703, + 53.7310151156405 + ], + [ + 10.162874102693495, + 53.73808674378503 + ], + [ + 10.161501516426284, + 53.733357248640694 + ], + [ + 10.126388389545214, + 53.71962999931771 + ], + [ + 10.121056101320123, + 53.71339516739309 + ], + [ + 10.115133992767122, + 53.716376167759464 + ], + [ + 10.104019694554617, + 53.71491084200711 + ], + [ + 10.10235546156596, + 53.71746615822214 + ], + [ + 10.081842127963116, + 53.720420081413806 + ], + [ + 10.076339390939193, + 53.71529728297146 + ], + [ + 10.080016639046711, + 53.71406094292631 + ], + [ + 10.069518984749026, + 53.71116783033607 + ], + [ + 10.073566464701056, + 53.70922317855362 + ], + [ + 10.069628136120706, + 53.70624463780583 + ], + [ + 10.07909745481106, + 53.70415678529316 + ], + [ + 10.077504785335915, + 53.699748876142856 + ], + [ + 10.069387932804963, + 53.69625326531857 + ], + [ + 10.065662822793703, + 53.68899448805932 + ], + [ + 10.060621309681972, + 53.68852028012235 + ], + [ + 10.067134556755057, + 53.68597579868181 + ], + [ + 10.069265382287425, + 53.67945055909085 + ], + [ + 10.050456295898531, + 53.67694009903421 + ], + [ + 10.040778727855786, + 53.68199003929469 + ], + [ + 9.998695505614531, + 53.681467459242384 + ], + [ + 9.990542573146294, + 53.67070614860927 + ], + [ + 9.989837235354289, + 53.64948943232431 + ], + [ + 9.984841957333243, + 53.64731229189615 + ], + [ + 9.92081042315289, + 53.65546630656932 + ], + [ + 9.904751870413802, + 53.651787044021205 + ], + [ + 9.904691425336217, + 53.6417951145073 + ], + [ + 9.885079826489415, + 53.62352169003423 + ], + [ + 9.889685196511644, + 53.62232685359805 + ], + [ + 9.872556800964057, + 53.61566832409591 + ], + [ + 9.858104137054651, + 53.59959068182893 + ], + [ + 9.839637986646009, + 53.595000525478284 + ], + [ + 9.836707190141833, + 53.5875301860782 + ], + [ + 9.824957924962858, + 53.58452794995427 + ], + [ + 9.816157304404014, + 53.586219904801744 + ], + [ + 9.798115235598269, + 53.59592188472634 + ], + [ + 9.790020186276863, + 53.60427470330982 + ], + [ + 9.798122740372763, + 53.6075163079464 + ], + [ + 9.770633503997212, + 53.61622994061122 + ], + [ + 9.770293990024692, + 53.6274624146951 + ], + [ + 9.763672583124265, + 53.62749505988141 + ], + [ + 9.753535447923335, + 53.61299431443449 + ], + [ + 9.759101185730396, + 53.610925126374624 + ], + [ + 9.75561761719217, + 53.602529448878315 + ], + [ + 9.748433152837453, + 53.60389675241702 + ], + [ + 9.743435992021185, + 53.597576174138666 + ], + [ + 9.747260483233353, + 53.59177458610443 + ], + [ + 9.736263386727696, + 53.58185157579794 + ], + [ + 9.742487476325886, + 53.57820562178773 + ], + [ + 9.736960312632908, + 53.57738982248152 + ], + [ + 9.734364927261794, + 53.56521556356656 + ], + [ + 9.674691722709223, + 53.571013740873106 + ], + [ + 9.67039766024753, + 53.572952950753056 + ], + [ + 9.672276363416287, + 53.575796194881754 + ], + [ + 9.663424944845415, + 53.577569747967715 + ], + [ + 9.641282897001581, + 53.59022306215322 + ], + [ + 9.622825970564792, + 53.59702169677156 + ], + [ + 9.61273956348804, + 53.59755176911278 + ], + [ + 9.555454736814566, + 53.62073363079092 + ], + [ + 9.566177991477264, + 53.6317149500398 + ], + [ + 9.571897925766933, + 53.630236609422894 + ], + [ + 9.57409312344111, + 53.62561015063437 + ], + [ + 9.579880714144181, + 53.623541659476345 + ], + [ + 9.573490067389658, + 53.62758573056087 + ], + [ + 9.573296529126802, + 53.63538963062587 + ], + [ + 9.569599672436517, + 53.63447983483229 + ], + [ + 9.562016310648202, + 53.64036375952621 + ], + [ + 9.551171779325454, + 53.653022852150514 + ], + [ + 9.55370841870012, + 53.66858739232581 + ], + [ + 9.548488645516793, + 53.67481928988323 + ], + [ + 9.558780017422887, + 53.671968668270544 + ], + [ + 9.547966462312763, + 53.67655846346699 + ], + [ + 9.522019766245334, + 53.713376027105525 + ], + [ + 9.487820537566073, + 53.72570772415641 + ], + [ + 9.456779455910306, + 53.73191076858154 + ], + [ + 9.442692033217844, + 53.74045313784615 + ], + [ + 9.428258725213254, + 53.752971274809056 + ], + [ + 9.422720357308545, + 53.76923595502884 + ], + [ + 9.409993940556143, + 53.7843402705647 + ], + [ + 9.415444587296609, + 53.785394301383036 + ], + [ + 9.408516857783326, + 53.785162879263666 + ], + [ + 9.407862002320076, + 53.79628682294019 + ], + [ + 9.40114637565388, + 53.79486753603607 + ], + [ + 9.404883060106418, + 53.79934472989479 + ], + [ + 9.394457420720782, + 53.8172395548088 + ], + [ + 9.401706547704794, + 53.82418596235874 + ], + [ + 9.399293701723154, + 53.82607875717617 + ], + [ + 9.38789049656094, + 53.82408105627221 + ], + [ + 9.376711599519036, + 53.83240794064161 + ], + [ + 9.35437470686587, + 53.83873089339642 + ], + [ + 9.327635711636235, + 53.860093872158394 + ], + [ + 9.286926192828723, + 53.874015456359054 + ], + [ + 9.266302958601669, + 53.87642708615098 + ], + [ + 9.218975953018472, + 53.88867956023432 + ], + [ + 9.093134043699672, + 53.888344872976134 + ], + [ + 9.04422310890108, + 53.9005584324379 + ], + [ + 9.029437894079793, + 53.90139092728969 + ], + [ + 9.011944766408458, + 53.89509251032454 + ], + [ + 8.971006071942043, + 53.89198038585479 + ], + [ + 8.915450371451872, + 53.92605166104276 + ], + [ + 8.877715563262587, + 53.97321903267942 + ], + [ + 8.8774428618163, + 53.97770210782603 + ], + [ + 8.883054386626627, + 53.97925637584836 + ], + [ + 8.878755968892246, + 53.984662962335975 + ], + [ + 8.87343360443869, + 53.9825847176802 + ], + [ + 8.847455717258233, + 54.00958281217179 + ], + [ + 8.842073485198414, + 54.00994445749724 + ], + [ + 8.832591823634784, + 54.023929408739676 + ], + [ + 8.804832399125894, + 54.02441515597988 + ], + [ + 8.836404790082693, + 54.028340283884795 + ], + [ + 8.847711338129116, + 54.03982375519127 + ], + [ + 8.881443236711913, + 54.04605222389225 + ], + [ + 8.92704554711132, + 54.04164557736462 + ], + [ + 8.939408769039398, + 54.03368237884519 + ], + [ + 8.95759884984859, + 54.03586512055479 + ], + [ + 8.958582680266257, + 54.03400004730264 + ], + [ + 8.977428590387541, + 54.041233345774806 + ], + [ + 8.985490163202355, + 54.0601272959775 + ], + [ + 8.971386340627417, + 54.06411974117308 + ], + [ + 8.968502652163991, + 54.062030876488095 + ], + [ + 8.958660342001622, + 54.06339300786135 + ], + [ + 8.958706162782413, + 54.066188700224714 + ], + [ + 8.976357937992477, + 54.06888649813198 + ], + [ + 8.976614874428257, + 54.07122838468967 + ], + [ + 8.94781615591702, + 54.09114569596639 + ], + [ + 8.950095759893943, + 54.09307312661277 + ], + [ + 8.926768418372873, + 54.13156930189734 + ], + [ + 8.90939840451499, + 54.13510493414753 + ], + [ + 8.89297376500851, + 54.13323559036091 + ], + [ + 8.860374193004843, + 54.119493725313234 + ], + [ + 8.859603604708173, + 54.122816862345594 + ], + [ + 8.869674211655052, + 54.12584092973 + ], + [ + 8.859955379194057, + 54.12362094984107 + ], + [ + 8.86643257302579, + 54.12744252381518 + ], + [ + 8.859850469136916, + 54.1255778425115 + ], + [ + 8.863871128280726, + 54.129250548911365 + ], + [ + 8.859018620213787, + 54.1273455459019 + ], + [ + 8.857865500919287, + 54.119192577164995 + ], + [ + 8.85473256663469, + 54.128269114368706 + ], + [ + 8.835847331818925, + 54.134109152236626 + ], + [ + 8.826364864643185, + 54.14477723897013 + ], + [ + 8.816773310436954, + 54.16774994486516 + ], + [ + 8.808867636455076, + 54.17103733584576 + ], + [ + 8.809688951407683, + 54.1910119739406 + ], + [ + 8.819725246010231, + 54.206568947384824 + ], + [ + 8.83373033690046, + 54.21446229939511 + ], + [ + 8.839978681009804, + 54.23288205426755 + ], + [ + 8.832131609562284, + 54.23942256244199 + ], + [ + 8.83659293168873, + 54.252485545515036 + ], + [ + 8.843889624676693, + 54.25661650036138 + ], + [ + 8.839508847831965, + 54.28172811592461 + ], + [ + 8.82902915314787, + 54.290143924207044 + ], + [ + 8.822037764153984, + 54.29131020935964 + ], + [ + 8.79170447987246, + 54.28184765008126 + ], + [ + 8.772269608908164, + 54.2815933034615 + ], + [ + 8.768692846059174, + 54.28856750203492 + ], + [ + 8.74838776929489, + 54.28912249674335 + ], + [ + 8.738377443202348, + 54.29378000366065 + ], + [ + 8.722723413580852, + 54.28872127389089 + ], + [ + 8.70646956966683, + 54.2931453668585 + ], + [ + 8.705064294872521, + 54.287153826144625 + ], + [ + 8.689111656081817, + 54.278618694178235 + ], + [ + 8.67435849716601, + 54.27875980501471 + ], + [ + 8.651141577392778, + 54.286836299985154 + ], + [ + 8.627567801785247, + 54.30325631986969 + ], + [ + 8.608311385314021, + 54.308788199901485 + ], + [ + 8.599642320103374, + 54.32152661908045 + ], + [ + 8.599952580537732, + 54.32899970980251 + ], + [ + 8.605929729721723, + 54.32588938901004 + ], + [ + 8.606375203249698, + 54.32903066685751 + ], + [ + 8.601518717605321, + 54.3394748177839 + ], + [ + 8.622526494745346, + 54.3430862365023 + ], + [ + 8.634704360162772, + 54.33734864890988 + ], + [ + 8.64606166595309, + 54.33844160795236 + ], + [ + 8.652766172212493, + 54.342901700493904 + ], + [ + 8.64673921084738, + 54.345537835118286 + ], + [ + 8.653770627848331, + 54.348973232288934 + ], + [ + 8.659083764977733, + 54.34696743189356 + ], + [ + 8.692322589434546, + 54.355684940690985 + ], + [ + 8.691042180231221, + 54.37307622123262 + ], + [ + 8.657779526911268, + 54.37428106952043 + ], + [ + 8.649015551004611, + 54.37975331343734 + ], + [ + 8.652251793105565, + 54.38927561892068 + ], + [ + 8.672813126546542, + 54.39969675840734 + ], + [ + 8.699245744124614, + 54.39665571384897 + ], + [ + 8.741761235782386, + 54.398755935588774 + ], + [ + 8.809293709822725, + 54.409405727198276 + ], + [ + 8.832268910444101, + 54.40874918326804 + ], + [ + 8.854165793458051, + 54.40280391570987 + ], + [ + 8.872674404321712, + 54.405290370120724 + ], + [ + 8.912713517122425, + 54.41692872117208 + ], + [ + 8.933946938169477, + 54.432699292581916 + ], + [ + 8.949697424968216, + 54.43834640806804 + ], + [ + 8.96240241234343, + 54.453832842950305 + ], + [ + 9.001556215354473, + 54.46170190155392 + ], + [ + 9.014537438200717, + 54.47470145396371 + ], + [ + 9.025472841811643, + 54.47283504041045 + ], + [ + 9.00358613388227, + 54.47895763414616 + ], + [ + 9.015759392222993, + 54.484243480197144 + ], + [ + 9.003567939666567, + 54.50243102587595 + ], + [ + 8.990720950053543, + 54.510829702303376 + ], + [ + 8.99080345567395, + 54.523309906035045 + ], + [ + 8.983176171164093, + 54.524682080057 + ], + [ + 8.945681121614069, + 54.512841719777114 + ], + [ + 8.949046069834674, + 54.500474522625225 + ], + [ + 8.930812423325564, + 54.4911896646601 + ], + [ + 8.915990930985302, + 54.47057326843246 + ], + [ + 8.892438255299627, + 54.460384342615136 + ], + [ + 8.841772229575815, + 54.460615718583426 + ], + [ + 8.807015454525482, + 54.470158959131965 + ], + [ + 8.819246764704886, + 54.48651580329107 + ], + [ + 8.80925992663856, + 54.49017420124272 + ], + [ + 8.80643702959003, + 54.498341542351724 + ], + [ + 8.813671868195726, + 54.50399764069202 + ], + [ + 8.835693842868057, + 54.50774837214239 + ], + [ + 8.871453104661368, + 54.52829301635379 + ], + [ + 8.877890403857737, + 54.54546322344992 + ], + [ + 8.868609356398103, + 54.56180937584803 + ], + [ + 8.892967770416462, + 54.59677687465329 + ], + [ + 8.885821819110385, + 54.60893968320088 + ], + [ + 8.846530609297684, + 54.6254635927816 + ], + [ + 8.831741626660678, + 54.65268711554225 + ], + [ + 8.780381512803073, + 54.666130066575576 + ], + [ + 8.752831638647256, + 54.681254035372504 + ], + [ + 8.751576813600566, + 54.699001258272666 + ], + [ + 8.741293673737752, + 54.71641533172915 + ], + [ + 8.71944348701868, + 54.72572511313235 + ], + [ + 8.695739743540788, + 54.72448757985246 + ], + [ + 8.686209753022384, + 54.73034082161545 + ], + [ + 8.715450891254518, + 54.737715952354634 + ], + [ + 8.708765485846756, + 54.7435824179377 + ], + [ + 8.708262681985314, + 54.751097757619995 + ], + [ + 8.69738864509814, + 54.76035581534455 + ], + [ + 8.701673876999275, + 54.773688289478855 + ], + [ + 8.684709942339563, + 54.792811533284706 + ], + [ + 8.681218698993698, + 54.79048049990485 + ], + [ + 8.659149622692084, + 54.79540663014748 + ], + [ + 8.644228959011691, + 54.81908284541719 + ], + [ + 8.60776158898583, + 54.84105469330635 + ], + [ + 8.612614359511827, + 54.87846775911175 + ], + [ + 8.603369079667202, + 54.885707807508396 + ], + [ + 8.509339355913868, + 54.881231799142334 + ], + [ + 8.481743940059788, + 54.87210580544013 + ], + [ + 8.454229281638456, + 54.85971771357639 + ], + [ + 8.454619767500217, + 54.85738347596185 + ], + [ + 8.427642847096166, + 54.85329249572519 + ], + [ + 8.414381017129566, + 54.84724070832466 + ], + [ + 8.40202582698227, + 54.8487692220115 + ], + [ + 8.377918476615283, + 54.858597990555424 + ], + [ + 8.364263388688759, + 54.87590802606742 + ], + [ + 8.346791452479977, + 54.8761591684275 + ], + [ + 8.340561373759169, + 54.88057457051423 + ], + [ + 8.333228204080232, + 54.872819285692785 + ], + [ + 8.332827443643035, + 54.863257746086646 + ], + [ + 8.306950139224522, + 54.8584544176744 + ], + [ + 8.296057254762905, + 54.84239475812228 + ], + [ + 8.293482104189145, + 54.825676477393195 + ], + [ + 8.30054580293334, + 54.81797478743419 + ], + [ + 8.296903881699242, + 54.81111390492832 + ], + [ + 8.299920246295535, + 54.80420357193874 + ], + [ + 8.292048072264903, + 54.78598596249813 + ], + [ + 8.301762261617007, + 54.773038825353524 + ], + [ + 8.300966751063411, + 54.763757573444984 + ], + [ + 8.29374566877362, + 54.75757162389667 + ], + [ + 8.297069625423648, + 54.75762927800191 + ], + [ + 8.297863340885788, + 54.74016580071042 + ], + [ + 8.27855558372647, + 54.752208179558096 + ], + [ + 8.287828196443776, + 54.874476258419186 + ], + [ + 8.301906304649865, + 54.91822795441253 + ], + [ + 8.39594482651249, + 55.05198373063748 + ], + [ + 8.416845554914172, + 55.058383600807225 + ], + [ + 8.44921463993128, + 55.04957854492019 + ] + ] + ], + [ + [ + [ + 11.086175979050156, + 54.53057415209371 + ], + [ + 11.165482891260254, + 54.52248259206414 + ], + [ + 11.188515645834986, + 54.515126877873115 + ], + [ + 11.196784227171184, + 54.509058721092615 + ], + [ + 11.233378996849599, + 54.50165293864557 + ], + [ + 11.241737790413836, + 54.49438936843748 + ], + [ + 11.252615714636391, + 54.47175512763975 + ], + [ + 11.268619329246444, + 54.46313207494118 + ], + [ + 11.279430870255618, + 54.445921360505125 + ], + [ + 11.29807690419996, + 54.43076479835923 + ], + [ + 11.31266282729023, + 54.40225842317283 + ], + [ + 11.24642921364586, + 54.41190402845192 + ], + [ + 11.21348972172043, + 54.41151753155427 + ], + [ + 11.1974673620501, + 54.40670066392429 + ], + [ + 11.19389135168413, + 54.41332657944037 + ], + [ + 11.209180156095085, + 54.41356218435891 + ], + [ + 11.211072233383737, + 54.41493048127064 + ], + [ + 11.210508907222758, + 54.417435012576945 + ], + [ + 11.191954256010336, + 54.41905507635472 + ], + [ + 11.191016810322003, + 54.42177199606779 + ], + [ + 11.173748817809033, + 54.419981650595304 + ], + [ + 11.166109894351404, + 54.41281039754567 + ], + [ + 11.180529533850466, + 54.4055116665985 + ], + [ + 11.186593783144652, + 54.40929533931024 + ], + [ + 11.177587833080556, + 54.40213803393052 + ], + [ + 11.12096563849251, + 54.40207527002224 + ], + [ + 11.095144846291886, + 54.40953359924163 + ], + [ + 11.094908669257142, + 54.422557468361894 + ], + [ + 11.101799257291239, + 54.43156789534182 + ], + [ + 11.095116470303145, + 54.445452705055004 + ], + [ + 11.076411592193871, + 54.449740320571756 + ], + [ + 11.074811552152536, + 54.44532238127575 + ], + [ + 11.073877900542675, + 54.44955946864255 + ], + [ + 11.063190355152363, + 54.452814301830976 + ], + [ + 11.053355148213047, + 54.44974734225349 + ], + [ + 11.053301734311946, + 54.44561095086633 + ], + [ + 11.047884116641654, + 54.44786081213076 + ], + [ + 11.030950293108269, + 54.44305904405156 + ], + [ + 11.022860902558692, + 54.443930697287065 + ], + [ + 11.022078991519122, + 54.43745226771936 + ], + [ + 11.032930848996289, + 54.43715034855892 + ], + [ + 11.03745632882352, + 54.43148729749421 + ], + [ + 11.043754790946213, + 54.43080469739047 + ], + [ + 11.047145004568645, + 54.428281641299264 + ], + [ + 11.038218166757828, + 54.42985929664002 + ], + [ + 11.008926288855365, + 54.44166760858173 + ], + [ + 11.004256858942128, + 54.44900243711601 + ], + [ + 11.010317918417709, + 54.48255704819518 + ], + [ + 11.031162977994645, + 54.51180432090744 + ], + [ + 11.064243732850178, + 54.53505596303769 + ], + [ + 11.086175979050156, + 54.53057415209371 + ] + ] + ], + [ + [ + [ + 8.563332811590465, + 54.752351453137265 + ], + [ + 8.585933479923641, + 54.74398191209906 + ], + [ + 8.588692969381814, + 54.74098330810501 + ], + [ + 8.584304577681504, + 54.73040690542601 + ], + [ + 8.596999617152473, + 54.71909062018063 + ], + [ + 8.58176796809234, + 54.71020265740585 + ], + [ + 8.57191678695389, + 54.69266604057148 + ], + [ + 8.576796968347603, + 54.69252696775865 + ], + [ + 8.56629389560625, + 54.679682183847504 + ], + [ + 8.484872378706422, + 54.68030419526777 + ], + [ + 8.465231127927982, + 54.68419457805618 + ], + [ + 8.452154203919035, + 54.692678410147046 + ], + [ + 8.42508720045481, + 54.69523184114496 + ], + [ + 8.402451790198834, + 54.700168961659436 + ], + [ + 8.396507270425465, + 54.7041865915939 + ], + [ + 8.394939833757128, + 54.71397671051086 + ], + [ + 8.40436074947923, + 54.73013095449994 + ], + [ + 8.427282047580043, + 54.746184306409106 + ], + [ + 8.470349661111385, + 54.75229510831455 + ], + [ + 8.485569812438461, + 54.74958007536118 + ], + [ + 8.514231500113377, + 54.754413446133995 + ], + [ + 8.517297952884713, + 54.75102695721888 + ], + [ + 8.534184465750748, + 54.755863711758394 + ], + [ + 8.563332811590465, + 54.752351453137265 + ] + ] + ], + [ + [ + [ + 8.7050405876487, + 54.55756110663809 + ], + [ + 8.710873833998825, + 54.55296372129352 + ], + [ + 8.706042353901168, + 54.53759588724219 + ], + [ + 8.6966942354473, + 54.52384994817162 + ], + [ + 8.686982249088835, + 54.52106731213448 + ], + [ + 8.696813863761085, + 54.5174969245636 + ], + [ + 8.688708053572684, + 54.51078808993995 + ], + [ + 8.702920766662336, + 54.50106471442903 + ], + [ + 8.687278667541037, + 54.50902146773964 + ], + [ + 8.669849211333833, + 54.49452660966238 + ], + [ + 8.63811351715788, + 54.48940597163433 + ], + [ + 8.620702881706748, + 54.489979622846484 + ], + [ + 8.592239742160261, + 54.508678872807835 + ], + [ + 8.587296838819928, + 54.52243166983192 + ], + [ + 8.590559949968107, + 54.531675473717684 + ], + [ + 8.597876957248754, + 54.53432790388142 + ], + [ + 8.626050111586144, + 54.535627717503324 + ], + [ + 8.641712459115581, + 54.545623237854414 + ], + [ + 8.668393897882464, + 54.549504815151 + ], + [ + 8.686379041391085, + 54.557128610716845 + ], + [ + 8.7050405876487, + 54.55756110663809 + ] + ] + ], + [ + [ + [ + 8.340116631755862, + 54.688076596467084 + ], + [ + 8.361874776306431, + 54.64979928360948 + ], + [ + 8.383314787651917, + 54.639617892847696 + ], + [ + 8.379382217489413, + 54.63278199508351 + ], + [ + 8.384793283266243, + 54.62855597326021 + ], + [ + 8.400267063033326, + 54.62882845668535 + ], + [ + 8.40188843685014, + 54.626186174874974 + ], + [ + 8.386564492375157, + 54.623042935927444 + ], + [ + 8.394618759464285, + 54.61805373668228 + ], + [ + 8.400238682674331, + 54.6209954283916 + ], + [ + 8.395453393805791, + 54.61315455145992 + ], + [ + 8.364501390305666, + 54.60947250186721 + ], + [ + 8.294791535659835, + 54.66461927448368 + ], + [ + 8.293811746621625, + 54.67048204526658 + ], + [ + 8.309176695849159, + 54.68425928804834 + ], + [ + 8.322433295625665, + 54.68853475671916 + ], + [ + 8.341680548667023, + 54.704113743200814 + ], + [ + 8.35927688411825, + 54.71144694755958 + ], + [ + 8.340822475688247, + 54.69675124308725 + ], + [ + 8.340116631755862, + 54.688076596467084 + ] + ] + ], + [ + [ + [ + 8.65680234985156, + 54.643674488929584 + ], + [ + 8.646818029146079, + 54.639310117689774 + ], + [ + 8.607286849544538, + 54.633081757010196 + ], + [ + 8.596648032250863, + 54.63597119388779 + ], + [ + 8.584645354517479, + 54.634121092920495 + ], + [ + 8.569275593212081, + 54.62685209726544 + ], + [ + 8.561972443588905, + 54.62711785328973 + ], + [ + 8.54753471553853, + 54.6177607993254 + ], + [ + 8.528868124418494, + 54.62730577830667 + ], + [ + 8.540466065470804, + 54.63641023340211 + ], + [ + 8.55366759254529, + 54.63545915878198 + ], + [ + 8.602667059401702, + 54.64193502564414 + ], + [ + 8.636997984186879, + 54.649228538343145 + ], + [ + 8.651870162108477, + 54.65763771427038 + ], + [ + 8.663465466338044, + 54.6558792372465 + ], + [ + 8.65680234985156, + 54.643674488929584 + ] + ] + ], + [ + [ + [ + 8.518181788206823, + 54.578797943987475 + ], + [ + 8.532726830207967, + 54.57518713615357 + ], + [ + 8.549936511258872, + 54.57943124879847 + ], + [ + 8.5572579527472, + 54.5785573387272 + ], + [ + 8.561487236970732, + 54.57253322055888 + ], + [ + 8.575502817622313, + 54.56537534559993 + ], + [ + 8.575569922352223, + 54.560455794024335 + ], + [ + 8.564258286186961, + 54.5570865901315 + ], + [ + 8.54798544032795, + 54.557024192545 + ], + [ + 8.536322600540197, + 54.56531092624074 + ], + [ + 8.512780405762895, + 54.57203801909009 + ], + [ + 8.508679764859902, + 54.5773373658586 + ], + [ + 8.518181788206823, + 54.578797943987475 + ] + ] + ], + [ + [ + [ + 9.52650576375461, + 53.66575269262473 + ], + [ + 9.526849744961636, + 53.664256584791985 + ], + [ + 9.496623872869735, + 53.71118264304369 + ], + [ + 9.510928142124454, + 53.70689050065682 + ], + [ + 9.519651889089387, + 53.698774199505955 + ], + [ + 9.528955573881632, + 53.68281750768186 + ], + [ + 9.52650576375461, + 53.66575269262473 + ] + ] + ], + [ + [ + [ + 9.556241781269438, + 53.62558305596112 + ], + [ + 9.534987077911959, + 53.64551143157069 + ], + [ + 9.542272625676238, + 53.664995080554284 + ], + [ + 9.547855812333674, + 53.64485631686951 + ], + [ + 9.553711529405696, + 53.63801216691135 + ], + [ + 9.56446870441249, + 53.633357994675244 + ], + [ + 9.556241781269438, + 53.62558305596112 + ] + ] + ], + [ + [ + [ + 8.692576916707067, + 54.06044539516263 + ], + [ + 8.700484247692938, + 54.057789234177065 + ], + [ + 8.68437087556411, + 54.05246000418055 + ], + [ + 8.68946610259079, + 54.04850226651527 + ], + [ + 8.701101814136658, + 54.04809305222946 + ], + [ + 8.6881394759924, + 54.04544527559065 + ], + [ + 8.67946143638208, + 54.050791566865826 + ], + [ + 8.679733735693716, + 54.06188770069406 + ], + [ + 8.685760017500376, + 54.06806960209525 + ], + [ + 8.697781026071565, + 54.07126310248059 + ], + [ + 8.700047928667448, + 54.06776113956926 + ], + [ + 8.692315866410434, + 54.06387232278824 + ], + [ + 8.692576916707067, + 54.06044539516263 + ] + ] + ], + [ + [ + [ + 8.737438289719627, + 54.64336437088056 + ], + [ + 8.737631890054919, + 54.63463867836154 + ], + [ + 8.72868579834557, + 54.628882622462136 + ], + [ + 8.719132272910704, + 54.62730930254283 + ], + [ + 8.710327744957032, + 54.631594336152645 + ], + [ + 8.717477364997986, + 54.64087194136419 + ], + [ + 8.737438289719627, + 54.64336437088056 + ] + ] + ], + [ + [ + [ + 8.815649194847385, + 54.552718387854654 + ], + [ + 8.828267983889877, + 54.54978082420235 + ], + [ + 8.82435766470188, + 54.543228677069266 + ], + [ + 8.789375359656342, + 54.551904471043386 + ], + [ + 8.804572924159576, + 54.55573224741819 + ], + [ + 8.815649194847385, + 54.552718387854654 + ] + ] + ], + [ + [ + [ + 9.417002462859399, + 53.75929160026285 + ], + [ + 9.416834528096597, + 53.75740770002475 + ], + [ + 9.406255685200756, + 53.7694823624379 + ], + [ + 9.389010215376818, + 53.799859635967934 + ], + [ + 9.410049271476662, + 53.77425078180511 + ], + [ + 9.417002462859399, + 53.75929160026285 + ] + ] + ], + [ + [ + [ + 8.699023285288446, + 54.6808733495365 + ], + [ + 8.713080503063459, + 54.680071768509094 + ], + [ + 8.709797052521823, + 54.67260171329682 + ], + [ + 8.68354351048857, + 54.672062270255545 + ], + [ + 8.681175549064555, + 54.675778616368085 + ], + [ + 8.690774129616623, + 54.6762863207519 + ], + [ + 8.699023285288446, + 54.6808733495365 + ] + ] + ], + [ + [ + [ + 7.883910745182575, + 54.18891906457099 + ], + [ + 7.89425872481335, + 54.17488329658727 + ], + [ + 7.889559923808865, + 54.17229640496466 + ], + [ + 7.869099861201054, + 54.18782725537656 + ], + [ + 7.883910745182575, + 54.18891906457099 + ] + ] + ], + [ + [ + [ + 8.824973778440063, + 54.604271092828924 + ], + [ + 8.833228490751438, + 54.60340870867629 + ], + [ + 8.818064626493587, + 54.5949713576592 + ], + [ + 8.813169915883165, + 54.59709568729008 + ], + [ + 8.808498615395084, + 54.60450765726099 + ], + [ + 8.814715014647527, + 54.60187262686017 + ], + [ + 8.824973778440063, + 54.604271092828924 + ] + ] + ], + [ + [ + [ + 7.919433481304869, + 54.18937623848684 + ], + [ + 7.918168073056388, + 54.181311979408704 + ], + [ + 7.909345556400561, + 54.18120166950621 + ], + [ + 7.901424436484231, + 54.18737847619128 + ], + [ + 7.919433481304869, + 54.18937623848684 + ] + ] + ], + [ + [ + [ + 8.552751326734038, + 54.45973035553628 + ], + [ + 8.544983988801661, + 54.465438490120974 + ], + [ + 8.547709365985476, + 54.46862982397475 + ], + [ + 8.561972408637608, + 54.46478955939064 + ], + [ + 8.552751326734038, + 54.45973035553628 + ] + ] + ], + [ + [ + [ + 8.731176794419017, + 54.4676485420096 + ], + [ + 8.736340653390531, + 54.46780857072045 + ], + [ + 8.727232762350505, + 54.46232314203853 + ], + [ + 8.718479771850598, + 54.46644233327494 + ], + [ + 8.731176794419017, + 54.4676485420096 + ] + ] + ], + [ + [ + [ + 9.552273256483671, + 53.644563039699456 + ], + [ + 9.556019041105856, + 53.64230928452539 + ], + [ + 9.557268995301012, + 53.6377825552786 + ], + [ + 9.549080533806727, + 53.64695042895511 + ], + [ + 9.552273256483671, + 53.644563039699456 + ] + ] + ], + [ + [ + [ + 8.771499038397838, + 54.63698501180216 + ], + [ + 8.762667308453409, + 54.63521592393671 + ], + [ + 8.761193394734208, + 54.635745153082325 + ], + [ + 8.766412089835006, + 54.63784958248582 + ], + [ + 8.771499038397838, + 54.63698501180216 + ] + ] + ], + [ + [ + [ + 11.082480424393713, + 54.438909650925666 + ], + [ + 11.089401369631736, + 54.4379758059226 + ], + [ + 11.091347800569546, + 54.43812044931475 + ], + [ + 11.088575915707489, + 54.435906936586605 + ], + [ + 11.082480424393713, + 54.438909650925666 + ] + ] + ], + [ + [ + [ + 8.510381401164105, + 54.52731902700467 + ], + [ + 8.507215489240027, + 54.52760112097598 + ], + [ + 8.516689792619257, + 54.52901479538369 + ], + [ + 8.514461888361794, + 54.5278258247641 + ], + [ + 8.510381401164105, + 54.52731902700467 + ] + ] + ], + [ + [ + [ + 9.719544300412348, + 53.55870115122389 + ], + [ + 9.725210888044186, + 53.558769293477994 + ], + [ + 9.730315195881431, + 53.55801930898749 + ], + [ + 9.71627908247049, + 53.55851714239314 + ], + [ + 9.719544300412348, + 53.55870115122389 + ] + ] + ], + [ + [ + [ + 8.364335288654644, + 54.86798667470675 + ], + [ + 8.36710861475324, + 54.86854618350379 + ], + [ + 8.362064061564363, + 54.86729483100087 + ], + [ + 8.360345561212851, + 54.869635658699686 + ], + [ + 8.364335288654644, + 54.86798667470675 + ] + ] + ], + [ + [ + [ + 11.209389549636818, + 54.4141251312193 + ], + [ + 11.206849571834404, + 54.415319133732865 + ], + [ + 11.207762322607918, + 54.41652605396848 + ], + [ + 11.210237791734835, + 54.41541680600723 + ], + [ + 11.209389549636818, + 54.4141251312193 + ] + ] + ], + [ + [ + [ + 9.564304525852682, + 54.50748356406432 + ], + [ + 9.561378699371216, + 54.50800342594532 + ], + [ + 9.563878192339791, + 54.51009058523578 + ], + [ + 9.564813533516025, + 54.509967118362674 + ], + [ + 9.564304525852682, + 54.50748356406432 + ] + ] + ], + [ + [ + [ + 9.698629750287974, + 53.56059460504925 + ], + [ + 9.699617984284922, + 53.5600214624223 + ], + [ + 9.691606508901996, + 53.561578995741534 + ], + [ + 9.694945528377769, + 53.56149622553624 + ], + [ + 9.698629750287974, + 53.56059460504925 + ] + ] + ], + [ + [ + [ + 8.345917121576942, + 54.87610928387598 + ], + [ + 8.346814535310969, + 54.874708358123726 + ], + [ + 8.345437849170121, + 54.873798386702795 + ], + [ + 8.344835226380658, + 54.87572043307881 + ], + [ + 8.345917121576942, + 54.87610928387598 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 2, + "BSG": 1, + "RS": "01", + "AGS": "01", + "SDV_RS": "010020000000", + "GEN": "Schleswig-Holstein", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "01", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEF", + "RS_0": "010000000000", + "AGS_0": "01000000", + "WSK": "2012/02/01", + "DEBKG_ID": "DEBKGDL20000E68Q", + "destatis": { + "population": 2830864, + "population_m": 1381451, + "population_w": 1449413 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 9.993986461991742, + 54.68869334219695 + ], + [ + 9.988263179873767, + 54.68406341332429 + ], + [ + 9.995557492947233, + 54.68196225101817 + ], + [ + 9.999863439779498, + 54.68737498404928 + ], + [ + 10.0116003929479, + 54.689700310240006 + ], + [ + 10.01651312039177, + 54.69385090735595 + ], + [ + 10.023173068129681, + 54.69216639821373 + ], + [ + 10.020345946522244, + 54.68840388674062 + ], + [ + 10.024335778980829, + 54.68716036296047 + ], + [ + 10.026579546855602, + 54.69179921419029 + ], + [ + 10.030243432594933, + 54.69038807261079 + ], + [ + 10.021579384555682, + 54.684419203477624 + ], + [ + 10.030563330273038, + 54.68739726465777 + ], + [ + 10.02443428917868, + 54.682007825644654 + ], + [ + 10.031905165747203, + 54.68464767835457 + ], + [ + 10.035317184120913, + 54.683710372907406 + ], + [ + 10.027381628300772, + 54.67862312533212 + ], + [ + 10.03320597040697, + 54.67814601335846 + ], + [ + 10.035541283539814, + 54.67153238342166 + ], + [ + 10.02817720506781, + 54.67229603067525 + ], + [ + 10.032940956748897, + 54.669057546045345 + ], + [ + 10.030167210997966, + 54.66403148027313 + ], + [ + 10.016158573861452, + 54.664314959578306 + ], + [ + 10.009359531871509, + 54.66179202488945 + ], + [ + 10.002893578096039, + 54.67405562406214 + ], + [ + 9.99782727381818, + 54.665389635491 + ], + [ + 9.990561684000873, + 54.6665954948111 + ], + [ + 9.988463641883579, + 54.66390366601017 + ], + [ + 9.989538392108019, + 54.669939662609984 + ], + [ + 9.976872283537759, + 54.67375876125937 + ], + [ + 9.948755263984694, + 54.67437585823347 + ], + [ + 9.938118278164483, + 54.66067477353933 + ], + [ + 9.941562011832383, + 54.65498474082335 + ], + [ + 9.936665925225832, + 54.65046297822654 + ], + [ + 9.938046600581988, + 54.645388978303146 + ], + [ + 9.945232039751998, + 54.63672500500174 + ], + [ + 9.93580075104368, + 54.62841535552958 + ], + [ + 9.938037267455528, + 54.62331945646813 + ], + [ + 9.932790719860341, + 54.623913533150635 + ], + [ + 9.918772842948918, + 54.616416796613215 + ], + [ + 9.90558087805667, + 54.614598203216254 + ], + [ + 9.877907473639427, + 54.598601138011254 + ], + [ + 9.848594994867446, + 54.59223145758656 + ], + [ + 9.844602958257115, + 54.58852970407946 + ], + [ + 9.84169594093009, + 54.59141204799109 + ], + [ + 9.838169421793433, + 54.58410257626941 + ], + [ + 9.819751970703159, + 54.582603720313564 + ], + [ + 9.802491360115539, + 54.56662448965117 + ], + [ + 9.778168830430976, + 54.553540649589706 + ], + [ + 9.774422894275894, + 54.55275919626481 + ], + [ + 9.779333992789986, + 54.55658464506469 + ], + [ + 9.773794312614644, + 54.55849136173981 + ], + [ + 9.765669329518705, + 54.5556893927585 + ], + [ + 9.760475616084783, + 54.54884267206099 + ], + [ + 9.749153719822054, + 54.54678089072223 + ], + [ + 9.744720591801036, + 54.53639900899729 + ], + [ + 9.739417681929524, + 54.53601095247336 + ], + [ + 9.742548388745476, + 54.52990189271468 + ], + [ + 9.734756686833846, + 54.52714729515375 + ], + [ + 9.73995295051093, + 54.52428094995704 + ], + [ + 9.759066003328211, + 54.528812205927025 + ], + [ + 9.76657922082055, + 54.52648087295792 + ], + [ + 9.754761689176577, + 54.527409320386546 + ], + [ + 9.744943710205707, + 54.52376457238747 + ], + [ + 9.739882690494534, + 54.52363923265475 + ], + [ + 9.73553071073622, + 54.524966831172904 + ], + [ + 9.725821084481916, + 54.51996737745085 + ], + [ + 9.722566591909183, + 54.5215625226314 + ], + [ + 9.727014646736507, + 54.52847778270264 + ], + [ + 9.72169299910846, + 54.52918142978809 + ], + [ + 9.71509440046666, + 54.51712224846141 + ], + [ + 9.697021786320226, + 54.51857634443586 + ], + [ + 9.709303153229317, + 54.507501887025384 + ], + [ + 9.713001549931546, + 54.4979885207317 + ], + [ + 9.708900084151477, + 54.491852428717735 + ], + [ + 9.69091248275106, + 54.49055346589577 + ], + [ + 9.684296395003338, + 54.49539844084401 + ], + [ + 9.674039652370974, + 54.49628544853875 + ], + [ + 9.66469843823052, + 54.506904946530156 + ], + [ + 9.647803105663183, + 54.51030741657014 + ], + [ + 9.64062169823942, + 54.510671733827174 + ], + [ + 9.638654051387814, + 54.50802516860031 + ], + [ + 9.624568773413978, + 54.5117914256879 + ], + [ + 9.575684839806355, + 54.50133475470579 + ], + [ + 9.560266810754179, + 54.501714767765606 + ], + [ + 9.545098874884495, + 54.50884584143076 + ], + [ + 9.556717036356876, + 54.51299986307325 + ], + [ + 9.557827150982213, + 54.51093437257441 + ], + [ + 9.573145789592907, + 54.51244812864667 + ], + [ + 9.58703448102375, + 54.51016126431765 + ], + [ + 9.597309339007527, + 54.51895202245281 + ], + [ + 9.605549579609264, + 54.521303882943236 + ], + [ + 9.603694256974629, + 54.52636548406692 + ], + [ + 9.627073386067854, + 54.53105743343217 + ], + [ + 9.63311573008354, + 54.526285650555444 + ], + [ + 9.625874829877933, + 54.521762128107454 + ], + [ + 9.633889864329584, + 54.51310024352351 + ], + [ + 9.639152283440374, + 54.52140196460004 + ], + [ + 9.650149912152953, + 54.52069257176852 + ], + [ + 9.64657690541858, + 54.52378001115108 + ], + [ + 9.65848256548787, + 54.52260098020065 + ], + [ + 9.697222943141085, + 54.52743704929993 + ], + [ + 9.702803620540774, + 54.51942051096775 + ], + [ + 9.71218176358742, + 54.52009686341966 + ], + [ + 9.719873303593017, + 54.53029798251404 + ], + [ + 9.713739685444912, + 54.53307496753784 + ], + [ + 9.720170718609214, + 54.53427861737192 + ], + [ + 9.725829627188721, + 54.53077442965024 + ], + [ + 9.734869066141172, + 54.532278297063975 + ], + [ + 9.73787991505814, + 54.542082002804996 + ], + [ + 9.75333554338264, + 54.557636000740054 + ], + [ + 9.769022748258594, + 54.56509025507263 + ], + [ + 9.76891215333701, + 54.56813148833712 + ], + [ + 9.763303208374552, + 54.5673133659579 + ], + [ + 9.767433871642409, + 54.57909365269249 + ], + [ + 9.781168426012083, + 54.579267396852494 + ], + [ + 9.772854826621058, + 54.57527741458643 + ], + [ + 9.790344368470747, + 54.57328668727333 + ], + [ + 9.797859603263321, + 54.57765965338034 + ], + [ + 9.8111752364247, + 54.57945799804943 + ], + [ + 9.815472232594317, + 54.584665968207005 + ], + [ + 9.80949848312343, + 54.587072511567435 + ], + [ + 9.803571981790526, + 54.57936889449098 + ], + [ + 9.801298619824333, + 54.580876352864536 + ], + [ + 9.804943550644838, + 54.588045069214516 + ], + [ + 9.824082257443361, + 54.59431671821033 + ], + [ + 9.811860872224813, + 54.58765536436041 + ], + [ + 9.819011817045265, + 54.58369565071477 + ], + [ + 9.822462673641274, + 54.584774314964015 + ], + [ + 9.825948405929985, + 54.591554812888305 + ], + [ + 9.839523010843356, + 54.594405019979746 + ], + [ + 9.833831378679564, + 54.59482644038971 + ], + [ + 9.833831887015105, + 54.597415109541856 + ], + [ + 9.859426216210597, + 54.60221385203913 + ], + [ + 9.87666237374355, + 54.60963824352786 + ], + [ + 9.89149026639529, + 54.62283384691158 + ], + [ + 9.909425863092725, + 54.62785532325465 + ], + [ + 9.905630143390393, + 54.63162591908414 + ], + [ + 9.909640710942623, + 54.63466065015062 + ], + [ + 9.913789193685203, + 54.62892572986475 + ], + [ + 9.931476976954157, + 54.62805762347592 + ], + [ + 9.93703622573469, + 54.63282779583943 + ], + [ + 9.934350703895001, + 54.634664801577394 + ], + [ + 9.931761062624506, + 54.63161050528865 + ], + [ + 9.929766793611023, + 54.63380953659728 + ], + [ + 9.9377294809923, + 54.67295955446025 + ], + [ + 9.948616152039278, + 54.67825940209828 + ], + [ + 9.962605489069936, + 54.67884952414068 + ], + [ + 9.967844495474798, + 54.68329920533782 + ], + [ + 9.97804290214172, + 54.6824789276898 + ], + [ + 9.978952757272674, + 54.68792013166065 + ], + [ + 9.972737320832533, + 54.68995140038296 + ], + [ + 9.983343891093101, + 54.700998329612666 + ], + [ + 9.991812439168674, + 54.699132852261215 + ], + [ + 9.993986461991742, + 54.68869334219695 + ] + ], + [ + [ + 9.564468515484434, + 54.510064325521384 + ], + [ + 9.561378699371216, + 54.50800342594532 + ], + [ + 9.564366275494585, + 54.506899703221706 + ], + [ + 9.565580339124748, + 54.507378992663334 + ], + [ + 9.564468515484434, + 54.510064325521384 + ] + ] + ], + [ + [ + [ + 9.591910924653005, + 54.88697021590597 + ], + [ + 9.628016844692068, + 54.8797482568182 + ], + [ + 9.604633056854397, + 54.85459380459238 + ], + [ + 9.739943921955017, + 54.82330923073541 + ], + [ + 9.746717701868361, + 54.824125449480725 + ], + [ + 9.79088053162635, + 54.79797496584935 + ], + [ + 9.772299021820887, + 54.795810299402234 + ], + [ + 9.760689480632665, + 54.80142293999579 + ], + [ + 9.711763039252626, + 54.80859422055635 + ], + [ + 9.662634773349318, + 54.82347612514883 + ], + [ + 9.65365675220097, + 54.82039749897684 + ], + [ + 9.623530118188159, + 54.83174131584221 + ], + [ + 9.60443349270336, + 54.83077272475369 + ], + [ + 9.593343419691806, + 54.840096399847376 + ], + [ + 9.589751214346304, + 54.85106829352157 + ], + [ + 9.599647824353704, + 54.866706419844796 + ], + [ + 9.614178130523923, + 54.87623579941332 + ], + [ + 9.594791033647121, + 54.87630923686441 + ], + [ + 9.593678611150098, + 54.87833293241519 + ], + [ + 9.586329445468886, + 54.87391204780998 + ], + [ + 9.584703102102889, + 54.86519849549148 + ], + [ + 9.573677383174608, + 54.863708580357404 + ], + [ + 9.571876609271245, + 54.85712486394655 + ], + [ + 9.540130005413664, + 54.84829970183734 + ], + [ + 9.52344783966985, + 54.836846833459866 + ], + [ + 9.516731278038261, + 54.83886809472809 + ], + [ + 9.499609044516546, + 54.82350620970666 + ], + [ + 9.467334502005771, + 54.82363231792156 + ], + [ + 9.463032468529041, + 54.821380137879004 + ], + [ + 9.452729919225566, + 54.807548524095175 + ], + [ + 9.443779115588919, + 54.80513812534005 + ], + [ + 9.440440707922571, + 54.800551444109004 + ], + [ + 9.442017460283445, + 54.80457262440766 + ], + [ + 9.4383408266429, + 54.80300337146313 + ], + [ + 9.436697178515859, + 54.78874409300228 + ], + [ + 9.428511475527692, + 54.800088026132045 + ], + [ + 9.437558196380124, + 54.80891340491053 + ], + [ + 9.427305876025851, + 54.81630975295674 + ], + [ + 9.41966251416032, + 54.831629617686886 + ], + [ + 9.435200657747302, + 54.82708983268756 + ], + [ + 9.449432701616898, + 54.83281036153165 + ], + [ + 9.46304067533609, + 54.83164412300993 + ], + [ + 9.49758747457213, + 54.841078265832564 + ], + [ + 9.584412757757626, + 54.886137055325484 + ], + [ + 9.591910924653005, + 54.88697021590597 + ] + ] + ], + [ + [ + [ + 10.15153230858123, + 54.36246213323849 + ], + [ + 10.174162084863477, + 54.34574538418509 + ], + [ + 10.173018880139184, + 54.33761016590798 + ], + [ + 10.177155615297645, + 54.33450798051076 + ], + [ + 10.170677227059, + 54.337599225118495 + ], + [ + 10.166971430903928, + 54.33563578183564 + ], + [ + 10.169998217488752, + 54.32875529764969 + ], + [ + 10.163896807293202, + 54.324038079610496 + ], + [ + 10.1506322918192, + 54.32394492321226 + ], + [ + 10.152260386991156, + 54.31972111481034 + ], + [ + 10.14863347433938, + 54.3218678044541 + ], + [ + 10.13343305682642, + 54.31106766905622 + ], + [ + 10.157609877165893, + 54.337780646651346 + ], + [ + 10.155254792569773, + 54.34494582613291 + ], + [ + 10.141359828118828, + 54.35390545252558 + ], + [ + 10.145521627595143, + 54.36105043128488 + ], + [ + 10.149781372686132, + 54.35920624925694 + ], + [ + 10.147189721817512, + 54.36345783654288 + ], + [ + 10.15153230858123, + 54.36246213323849 + ] + ] + ], + [ + [ + [ + 9.8462443652526, + 54.47650581139292 + ], + [ + 9.855110716440715, + 54.47634493010285 + ], + [ + 9.861794235582012, + 54.47271177159615 + ], + [ + 9.87570583743778, + 54.47584700458206 + ], + [ + 9.87672091806612, + 54.473262875246 + ], + [ + 9.862454379072052, + 54.469649151988655 + ], + [ + 9.8553700688393, + 54.456283167788975 + ], + [ + 9.867316283145453, + 54.452579951877155 + ], + [ + 9.86421809447874, + 54.44852494581101 + ], + [ + 9.843841929341172, + 54.461233859300926 + ], + [ + 9.841711635960536, + 54.47402392619749 + ], + [ + 9.832853906609518, + 54.47355924919411 + ], + [ + 9.8462443652526, + 54.47650581139292 + ] + ] + ], + [ + [ + [ + 11.189793475071431, + 54.42171144841427 + ], + [ + 11.191954256010336, + 54.41905507635472 + ], + [ + 11.209909415043207, + 54.41775907547805 + ], + [ + 11.210788305020824, + 54.414386914232146 + ], + [ + 11.20162627645772, + 54.41225756562015 + ], + [ + 11.195057815666706, + 54.4140577332954 + ], + [ + 11.195996228172143, + 54.40751051998771 + ], + [ + 11.18479928670547, + 54.41031441173993 + ], + [ + 11.180529533850466, + 54.4055116665985 + ], + [ + 11.166109894351404, + 54.41281039754567 + ], + [ + 11.173748817809033, + 54.419981650595304 + ], + [ + 11.189793475071431, + 54.42171144841427 + ] + ], + [ + [ + 11.208125470598075, + 54.414279492452096 + ], + [ + 11.210266345910988, + 54.41528197375295 + ], + [ + 11.207762322607918, + 54.41652605396848 + ], + [ + 11.206849571834404, + 54.415319133732865 + ], + [ + 11.208125470598075, + 54.414279492452096 + ] + ] + ], + [ + [ + [ + 7.903022436383901, + 54.18577621572666 + ], + [ + 7.90861999871269, + 54.18047148258201 + ], + [ + 7.907684732248865, + 54.168880777119185 + ], + [ + 7.899523638848427, + 54.17190169709835 + ], + [ + 7.890842286648588, + 54.16983404186268 + ], + [ + 7.89425872481335, + 54.17488329658727 + ], + [ + 7.888481094773281, + 54.178247398252815 + ], + [ + 7.891803404152931, + 54.180277582896466 + ], + [ + 7.88475566608408, + 54.19140776053945 + ], + [ + 7.891415913170317, + 54.19301121686295 + ], + [ + 7.903022436383901, + 54.18577621572666 + ] + ] + ], + [ + [ + [ + 11.079939572388398, + 54.35355222449439 + ], + [ + 11.086761887820549, + 54.35418654449867 + ], + [ + 11.078935068955584, + 54.34208019410043 + ], + [ + 11.0719180947595, + 54.34224630487959 + ], + [ + 11.075370434474602, + 54.34717584764058 + ], + [ + 11.062824070330093, + 54.3441180015101 + ], + [ + 11.058027848773323, + 54.35239220509731 + ], + [ + 11.061904143929363, + 54.35772002790661 + ], + [ + 11.070532025910014, + 54.35809932407292 + ], + [ + 11.079939572388398, + 54.35355222449439 + ] + ] + ], + [ + [ + [ + 10.986592997855457, + 54.37630390165728 + ], + [ + 10.993880892235278, + 54.379151400828285 + ], + [ + 10.992323302557349, + 54.3759730777848 + ], + [ + 10.997957465885863, + 54.377879955192604 + ], + [ + 10.997978655872318, + 54.37518535638377 + ], + [ + 11.005835625789082, + 54.378767145569604 + ], + [ + 11.005836477319216, + 54.37438855282132 + ], + [ + 11.019329330008846, + 54.37987577203653 + ], + [ + 11.016765957782882, + 54.37608949879426 + ], + [ + 11.022130982922425, + 54.36777537340497 + ], + [ + 11.00691206009978, + 54.37299720868111 + ], + [ + 10.999110766653438, + 54.36958605273971 + ], + [ + 10.992109103261777, + 54.370475530647894 + ], + [ + 10.980069018046715, + 54.37599877372458 + ], + [ + 10.983311648139459, + 54.380102488026075 + ], + [ + 10.986592997855457, + 54.37630390165728 + ] + ] + ], + [ + [ + [ + 10.154140028437803, + 54.36887915367618 + ], + [ + 10.166834097369888, + 54.37790652607658 + ], + [ + 10.161161601618021, + 54.385157716193824 + ], + [ + 10.17613122318031, + 54.38981837894162 + ], + [ + 10.190582548038961, + 54.38959339967082 + ], + [ + 10.154140028437803, + 54.36887915367618 + ] + ] + ], + [ + [ + [ + 10.02644640532566, + 54.66343889262129 + ], + [ + 10.033501435452921, + 54.66346503565534 + ], + [ + 10.043211288357107, + 54.659561549764554 + ], + [ + 10.032668062620159, + 54.657520101532555 + ], + [ + 10.032521365805831, + 54.66026753745363 + ], + [ + 10.024825934660695, + 54.658136998037286 + ], + [ + 10.014303006544491, + 54.66019054080493 + ], + [ + 10.016859603521882, + 54.66363423912938 + ], + [ + 10.02644640532566, + 54.66343889262129 + ] + ] + ], + [ + [ + [ + 10.152083022471288, + 54.36332651841844 + ], + [ + 10.139159217794473, + 54.36571267302581 + ], + [ + 10.148424812093936, + 54.36641225663234 + ], + [ + 10.139535751761056, + 54.368479065191906 + ], + [ + 10.154140028437803, + 54.36887915367618 + ], + [ + 10.152083022471288, + 54.36332651841844 + ] + ] + ], + [ + [ + [ + 10.214469713062016, + 54.40013201361076 + ], + [ + 10.211904953456909, + 54.39688521531878 + ], + [ + 10.20885387487159, + 54.39995596981851 + ], + [ + 10.215906578913712, + 54.40613986331251 + ], + [ + 10.219434217795868, + 54.40342982391681 + ], + [ + 10.214469713062016, + 54.40013201361076 + ] + ] + ], + [ + [ + [ + 8.877281428093749, + 53.98403636865928 + ], + [ + 8.883054386626627, + 53.97925637584836 + ], + [ + 8.8774428618163, + 53.97770210782603 + ], + [ + 8.87343360443869, + 53.9825847176802 + ], + [ + 8.877281428093749, + 53.98403636865928 + ] + ] + ], + [ + [ + [ + 8.859949108111158, + 54.127007409981026 + ], + [ + 8.86643257302579, + 54.12744252381518 + ], + [ + 8.859955379194057, + 54.12362094984107 + ], + [ + 8.869674211655052, + 54.12584092973 + ], + [ + 8.859603604708173, + 54.122816862345594 + ], + [ + 8.858542690620329, + 54.11925850298582 + ], + [ + 8.859018620213787, + 54.1273455459019 + ], + [ + 8.864452057726057, + 54.12885391373959 + ], + [ + 8.859949108111158, + 54.127007409981026 + ] + ] + ], + [ + [ + [ + 11.233378996849599, + 54.50165293864557 + ], + [ + 11.22579980361758, + 54.50503173104659 + ], + [ + 11.229178281840179, + 54.50698938769456 + ], + [ + 11.2336817082064, + 54.50594434636534 + ], + [ + 11.233378996849599, + 54.50165293864557 + ] + ] + ], + [ + [ + [ + 10.814714517381907, + 54.09428116458885 + ], + [ + 10.811910195056923, + 54.097805006470274 + ], + [ + 10.810451358468988, + 54.10561792061517 + ], + [ + 10.815092305553168, + 54.101741555910564 + ], + [ + 10.814714517381907, + 54.09428116458885 + ] + ] + ], + [ + [ + [ + 8.739965240103224, + 54.63628374786035 + ], + [ + 8.737631890054919, + 54.63463867836154 + ], + [ + 8.735572804825651, + 54.64021605093045 + ], + [ + 8.740339064312417, + 54.64361023907627 + ], + [ + 8.739965240103224, + 54.63628374786035 + ] + ] + ], + [ + [ + [ + 8.735579630161963, + 54.64449017465107 + ], + [ + 8.728606150662948, + 54.641280484505145 + ], + [ + 8.718014061630166, + 54.640346325602216 + ], + [ + 8.735579630161963, + 54.64449017465107 + ] + ] + ], + [ + [ + [ + 9.93234706849991, + 54.460869608141216 + ], + [ + 9.9245065572144, + 54.45723552669718 + ], + [ + 9.922976400606407, + 54.4573354284082 + ], + [ + 9.923060313471513, + 54.46018616896949 + ], + [ + 9.93234706849991, + 54.460869608141216 + ] + ] + ], + [ + [ + [ + 8.995902577554672, + 54.5089639381133 + ], + [ + 8.996388739222098, + 54.507547715607714 + ], + [ + 8.997009733148541, + 54.505820072440095 + ], + [ + 8.992408557134286, + 54.50683150650979 + ], + [ + 8.99226585480409, + 54.51101443754949 + ], + [ + 8.995902577554672, + 54.5089639381133 + ] + ] + ], + [ + [ + [ + 10.946831308014698, + 54.13334225035125 + ], + [ + 10.943795626409875, + 54.13403151702162 + ], + [ + 10.948873049003796, + 54.13786277786779 + ], + [ + 10.950717071922682, + 54.136408706767654 + ], + [ + 10.946831308014698, + 54.13334225035125 + ] + ] + ], + [ + [ + [ + 10.171099771385583, + 54.43269596732962 + ], + [ + 10.173464181052864, + 54.43038728712712 + ], + [ + 10.172844804529364, + 54.42768389434275 + ], + [ + 10.168516847306986, + 54.432844870224734 + ], + [ + 10.171099771385583, + 54.43269596732962 + ] + ] + ], + [ + [ + [ + 10.977542198878261, + 54.38154147126052 + ], + [ + 10.97637922618894, + 54.3850437281471 + ], + [ + 10.980451610439726, + 54.38500845317603 + ], + [ + 10.980483208843154, + 54.381759778858616 + ], + [ + 10.977542198878261, + 54.38154147126052 + ] + ] + ], + [ + [ + [ + 10.283484496902688, + 54.41934462780569 + ], + [ + 10.282878802873789, + 54.42085559867274 + ], + [ + 10.289796768152536, + 54.421275223623596 + ], + [ + 10.289805710796287, + 54.41945097510112 + ], + [ + 10.283484496902688, + 54.41934462780569 + ] + ] + ], + [ + [ + [ + 9.877660796238263, + 54.75649364910323 + ], + [ + 9.87251514405002, + 54.75699094168996 + ], + [ + 9.87201971880954, + 54.7589193799889 + ], + [ + 9.877859769517844, + 54.75774203499569 + ], + [ + 9.877660796238263, + 54.75649364910323 + ] + ] + ], + [ + [ + [ + 8.578704220993894, + 54.69490204421674 + ], + [ + 8.578684643471302, + 54.69262616177814 + ], + [ + 8.57191678695389, + 54.69266604057148 + ], + [ + 8.576782152773267, + 54.6962008503758 + ], + [ + 8.578704220993894, + 54.69490204421674 + ] + ] + ], + [ + [ + [ + 8.941667486175916, + 53.91016495953386 + ], + [ + 8.93656167381834, + 53.911896902345504 + ], + [ + 8.938413073064092, + 53.91334519585046 + ], + [ + 8.94328051230588, + 53.91141555459431 + ], + [ + 8.941667486175916, + 53.91016495953386 + ] + ] + ], + [ + [ + [ + 10.802858050062524, + 54.09503002092188 + ], + [ + 10.80793325438097, + 54.09324836962384 + ], + [ + 10.806655042718594, + 54.091823525349334 + ], + [ + 10.803797711803927, + 54.091749098204666 + ], + [ + 10.802858050062524, + 54.09503002092188 + ] + ] + ], + [ + [ + [ + 8.916140246156665, + 53.92568959395928 + ], + [ + 8.915001990463413, + 53.92497485374283 + ], + [ + 8.90939474767142, + 53.93170824354039 + ], + [ + 8.911625659670003, + 53.931508498982545 + ], + [ + 8.916140246156665, + 53.92568959395928 + ] + ] + ], + [ + [ + [ + 10.027543941611672, + 54.583794513198804 + ], + [ + 10.028528001702838, + 54.58179697487517 + ], + [ + 10.022612164013283, + 54.58155040184318 + ], + [ + 10.022507106066747, + 54.582654059487815 + ], + [ + 10.027543941611672, + 54.583794513198804 + ] + ] + ], + [ + [ + [ + 9.025145059391239, + 54.47220301104437 + ], + [ + 9.024061437292724, + 54.47211094271688 + ], + [ + 9.017829475265536, + 54.47373616612498 + ], + [ + 9.018963414078529, + 54.47474565915488 + ], + [ + 9.025145059391239, + 54.47220301104437 + ] + ] + ], + [ + [ + [ + 8.538803577334514, + 54.63286853133381 + ], + [ + 8.535262178215369, + 54.63396591762822 + ], + [ + 8.538843573808041, + 54.635709584536606 + ], + [ + 8.539558089210049, + 54.6347306782547 + ], + [ + 8.538803577334514, + 54.63286853133381 + ] + ] + ], + [ + [ + [ + 9.863544840629089, + 54.75487714418068 + ], + [ + 9.863022788129442, + 54.752690148827035 + ], + [ + 9.859174492836432, + 54.75381902103283 + ], + [ + 9.859298588774177, + 54.75436833796639 + ], + [ + 9.863544840629089, + 54.75487714418068 + ] + ] + ], + [ + [ + [ + 10.801991355959055, + 54.09521930199988 + ], + [ + 10.802858050062524, + 54.09503002092188 + ], + [ + 10.80281587270674, + 54.09236431086188 + ], + [ + 10.799114570334817, + 54.09495704601028 + ], + [ + 10.801991355959055, + 54.09521930199988 + ] + ] + ], + [ + [ + [ + 8.893102513225339, + 53.954071985344044 + ], + [ + 8.89207969008074, + 53.953133306252056 + ], + [ + 8.889258597167723, + 53.956328993210185 + ], + [ + 8.890826436394242, + 53.956749776059624 + ], + [ + 8.893102513225339, + 53.954071985344044 + ] + ] + ], + [ + [ + [ + 10.805258591515836, + 54.09744007426747 + ], + [ + 10.805724816783476, + 54.09604617595927 + ], + [ + 10.800955049862258, + 54.09783030631682 + ], + [ + 10.801734917625241, + 54.09851007131488 + ], + [ + 10.805258591515836, + 54.09744007426747 + ] + ] + ], + [ + [ + [ + 8.901101126862613, + 53.94281886618314 + ], + [ + 8.903888172399732, + 53.9396534909246 + ], + [ + 8.902524384581163, + 53.93917978243219 + ], + [ + 8.899778563805572, + 53.94247102883543 + ], + [ + 8.901101126862613, + 53.94281886618314 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 2, + "BSG": 1, + "RS": "03", + "AGS": "03", + "SDV_RS": "032410001001", + "GEN": "Niedersachsen", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "03", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE9", + "RS_0": "030000000000", + "AGS_0": "03000000", + "WSK": "2015/01/01", + "DEBKG_ID": "DEBKGDL20000QMSE", + "destatis": { + "population": 7826739, + "population_m": 3846089, + "population_w": 3980650 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 9.400853494543968, + 53.76699729890593 + ], + [ + 9.433311108407253, + 53.73197795187897 + ], + [ + 9.485889922907313, + 53.707664660506616 + ], + [ + 9.507804202260006, + 53.69116378339973 + ], + [ + 9.527800308563346, + 53.66293672583481 + ], + [ + 9.536833665233015, + 53.63057098831442 + ], + [ + 9.55064008429099, + 53.616034550624185 + ], + [ + 9.587858873249292, + 53.59851708283242 + ], + [ + 9.675759962594537, + 53.564688693458706 + ], + [ + 9.691606508901996, + 53.561578995741534 + ], + [ + 9.66310334284246, + 53.56438480880121 + ], + [ + 9.677454937984802, + 53.55652837585751 + ], + [ + 9.694357892077575, + 53.56027981845698 + ], + [ + 9.699421784032564, + 53.558550877658504 + ], + [ + 9.738606661449722, + 53.555662507378365 + ], + [ + 9.759327192882008, + 53.551196575291335 + ], + [ + 9.774232561884448, + 53.55358255517106 + ], + [ + 9.772076477709113, + 53.54338611652039 + ], + [ + 9.766088411007816, + 53.54663599065465 + ], + [ + 9.74256126545956, + 53.54805504071437 + ], + [ + 9.728010876977917, + 53.54433953200157 + ], + [ + 9.726920236463267, + 53.55045053151438 + ], + [ + 9.717959764610287, + 53.55152702883055 + ], + [ + 9.711225917268347, + 53.55042679205668 + ], + [ + 9.709102538397412, + 53.54510730447811 + ], + [ + 9.698469199111898, + 53.545812896311155 + ], + [ + 9.692724683478316, + 53.54958968239307 + ], + [ + 9.684951073641475, + 53.547852358405294 + ], + [ + 9.669384298783596, + 53.5539581806775 + ], + [ + 9.648856294967974, + 53.56815153852377 + ], + [ + 9.634203151043184, + 53.57095225550009 + ], + [ + 9.615873239658637, + 53.5807791626675 + ], + [ + 9.586657164346384, + 53.58641666435822 + ], + [ + 9.55840437964424, + 53.60685940770992 + ], + [ + 9.540300467582178, + 53.61291594863832 + ], + [ + 9.518122793938156, + 53.63656510205301 + ], + [ + 9.511575292105876, + 53.6562713047716 + ], + [ + 9.493783027977564, + 53.678735858809354 + ], + [ + 9.417460896908048, + 53.72521410090667 + ], + [ + 9.36546036278582, + 53.774593148876505 + ], + [ + 9.326200691053781, + 53.826002392779955 + ], + [ + 9.275123378568928, + 53.85726930152788 + ], + [ + 9.272732766628975, + 53.867662629841654 + ], + [ + 9.319462832436825, + 53.85079564677737 + ], + [ + 9.358646428705642, + 53.817925032879245 + ], + [ + 9.400853494543968, + 53.76699729890593 + ] + ], + [ + [ + 9.440689426849856, + 53.719509391061884 + ], + [ + 9.461285348232837, + 53.708985524546854 + ], + [ + 9.469398185048806, + 53.700019691016884 + ], + [ + 9.476418796634547, + 53.69830776155304 + ], + [ + 9.47662058602697, + 53.70506205624637 + ], + [ + 9.462660120640122, + 53.71402557241499 + ], + [ + 9.440689426849856, + 53.719509391061884 + ] + ], + [ + [ + 9.594444354829074, + 53.587417525219905 + ], + [ + 9.610601992959024, + 53.58435769278143 + ], + [ + 9.572127803680166, + 53.602124034583355 + ], + [ + 9.576749592637576, + 53.59717135809456 + ], + [ + 9.594444354829074, + 53.587417525219905 + ] + ] + ], + [ + [ + [ + 7.19111572852923, + 53.31760156543374 + ], + [ + 7.247443733798034, + 53.31836979730227 + ], + [ + 7.242548905005716, + 53.30270302811959 + ], + [ + 7.22902718776902, + 53.294093927437984 + ], + [ + 7.236761480689277, + 53.28741144478653 + ], + [ + 7.232820610764164, + 53.26755903019752 + ], + [ + 7.219878176231378, + 53.248990389826034 + ], + [ + 7.20893521945462, + 53.24306470085908 + ], + [ + 7.19111572852923, + 53.31760156543374 + ] + ] + ], + [ + [ + [ + 7.271992860841733, + 53.33106395246494 + ], + [ + 7.270518433788508, + 53.32515064935613 + ], + [ + 7.302077587267336, + 53.32363801363603 + ], + [ + 7.294605439853042, + 53.31730772663031 + ], + [ + 7.25340920374381, + 53.322225269819896 + ], + [ + 7.248408021026994, + 53.320365561262456 + ], + [ + 7.249576554873824, + 53.324885699789874 + ], + [ + 7.267867349634601, + 53.326466283364546 + ], + [ + 7.271992860841733, + 53.33106395246494 + ] + ] + ], + [ + [ + [ + 9.029141185221224, + 53.8315569998875 + ], + [ + 9.030978174443876, + 53.8257383414721 + ], + [ + 9.026704103331499, + 53.82503181864426 + ], + [ + 9.025090949817866, + 53.83197675898716 + ], + [ + 9.013168475080978, + 53.840239379344574 + ], + [ + 9.020032033776435, + 53.841989361235065 + ], + [ + 9.029141185221224, + 53.8315569998875 + ] + ] + ], + [ + [ + [ + 9.18313952799621, + 53.86461894647127 + ], + [ + 9.183156324866246, + 53.86406463655202 + ], + [ + 9.194288614478747, + 53.864052614307646 + ], + [ + 9.200493486495454, + 53.86360007471641 + ], + [ + 9.200564496087292, + 53.86326831621907 + ], + [ + 9.165986941941217, + 53.86404331506981 + ], + [ + 9.18313952799621, + 53.86461894647127 + ] + ] + ], + [ + [ + [ + 9.715933475655595, + 53.55847127720187 + ], + [ + 9.702779642830231, + 53.55897698238306 + ], + [ + 9.699617984284922, + 53.5600214624223 + ], + [ + 9.702788352379388, + 53.559327502229614 + ], + [ + 9.715933475655595, + 53.55847127720187 + ] + ] + ], + [ + [ + [ + 9.737690950245062, + 53.5562499486074 + ], + [ + 9.734729549218553, + 53.55644730048297 + ], + [ + 9.732040373958869, + 53.55747161827935 + ], + [ + 9.740285964420952, + 53.55689197189158 + ], + [ + 9.737690950245062, + 53.5562499486074 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 3, + "BSG": 1, + "RS": "13", + "AGS": "13", + "SDV_RS": "130040000000", + "GEN": "Mecklenburg-Vorpommern", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "13", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE8", + "RS_0": "130000000000", + "AGS_0": "13000000", + "WSK": "2014/11/01", + "DEBKG_ID": "DEBKGDL20000QBMH", + "destatis": { + "population": 1599138, + "population_m": 787945, + "population_w": 811193 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 13.59404151465214, + 54.48355150986059 + ], + [ + 13.592506550033884, + 54.48328453485575 + ], + [ + 13.589105275425483, + 54.48588400107376 + ], + [ + 13.593550108908605, + 54.48692763533085 + ], + [ + 13.59404151465214, + 54.48355150986059 + ] + ] + ], + [ + [ + [ + 12.541924880324746, + 54.4878602290607 + ], + [ + 12.540761008940722, + 54.485277260100226 + ], + [ + 12.534072485566277, + 54.48107263732383 + ], + [ + 12.538504402401214, + 54.48802242086998 + ], + [ + 12.541924880324746, + 54.4878602290607 + ] + ] + ], + [ + [ + [ + 13.586802119566707, + 54.481276706386865 + ], + [ + 13.584620398662937, + 54.480008298025915 + ], + [ + 13.581209953944988, + 54.48141995897133 + ], + [ + 13.58349236817105, + 54.482805680092035 + ], + [ + 13.586802119566707, + 54.481276706386865 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 2, + "BSG": 1, + "RS": "13", + "AGS": "13", + "SDV_RS": "130040000000", + "GEN": "Mecklenburg-Vorpommern", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "13", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE8", + "RS_0": "130000000000", + "AGS_0": "13000000", + "WSK": "2014/11/01", + "DEBKG_ID": "DEBKGDL20000E5I7", + "destatis": { + "population": 1599138, + "population_m": 787945, + "population_w": 811193 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 13.818628812146915, + 53.85921831982827 + ], + [ + 13.823340650667333, + 53.84724047500434 + ], + [ + 13.848696656620621, + 53.8458561532116 + ], + [ + 13.887105479721988, + 53.82791962368386 + ], + [ + 13.904453525417184, + 53.82408189670246 + ], + [ + 13.920310481888466, + 53.82566965153297 + ], + [ + 13.994909729519696, + 53.811586126947375 + ], + [ + 14.073113857282415, + 53.81159939974454 + ], + [ + 14.178515076653134, + 53.8068027660173 + ], + [ + 14.270424930257724, + 53.78994875873474 + ], + [ + 14.28359583254458, + 53.772302948371696 + ], + [ + 14.266948569328099, + 53.75348675300064 + ], + [ + 14.273533997629295, + 53.74435346445641 + ], + [ + 14.26833268181847, + 53.708446265318216 + ], + [ + 14.271929492008105, + 53.70585377028011 + ], + [ + 14.267730040845398, + 53.704632183172045 + ], + [ + 14.266892868574256, + 53.69755811621038 + ], + [ + 14.245380460758838, + 53.69368901479938 + ], + [ + 14.219794592883785, + 53.699033351958995 + ], + [ + 14.214806661167902, + 53.70314280460063 + ], + [ + 14.218621917286479, + 53.709006106735465 + ], + [ + 14.251216287832028, + 53.719493449497946 + ], + [ + 14.258858867386936, + 53.72820304809022 + ], + [ + 14.265678324895404, + 53.730346229598574 + ], + [ + 14.267548025587796, + 53.73751903735415 + ], + [ + 14.2715866639382, + 53.73788155903828 + ], + [ + 14.265917855847581, + 53.74906438725283 + ], + [ + 14.253117229499386, + 53.75706528002913 + ], + [ + 14.229673742241415, + 53.761170293416036 + ], + [ + 14.210139391327896, + 53.74745120744418 + ], + [ + 14.181202456179141, + 53.73522509206596 + ], + [ + 14.17420671154215, + 53.735538133014316 + ], + [ + 14.165997291992873, + 53.74202649107726 + ], + [ + 14.146532031143424, + 53.74207374332026 + ], + [ + 14.124438494651216, + 53.73722142821027 + ], + [ + 14.101747291814196, + 53.74000116076596 + ], + [ + 14.098075902437323, + 53.74415366727195 + ], + [ + 14.078256603602272, + 53.74627436081831 + ], + [ + 14.059756565305321, + 53.755323777535565 + ], + [ + 14.04906066475817, + 53.75281034996617 + ], + [ + 14.005200133283441, + 53.76712293371158 + ], + [ + 13.998892154389328, + 53.76646518556466 + ], + [ + 13.97090915442885, + 53.77417631827461 + ], + [ + 13.96877065650725, + 53.77254659353925 + ], + [ + 13.936928140714437, + 53.79114766410895 + ], + [ + 13.933394087014904, + 53.79715994291295 + ], + [ + 13.922219674666234, + 53.79765893584435 + ], + [ + 13.915948868926586, + 53.80635028604445 + ], + [ + 13.907897563085484, + 53.80210011561607 + ], + [ + 13.89896409497842, + 53.8035435405148 + ], + [ + 13.882281174613295, + 53.8179795622624 + ], + [ + 13.874385010852098, + 53.82010344988017 + ], + [ + 13.86776954784841, + 53.83543249840073 + ], + [ + 13.8498147173103, + 53.843127100804935 + ], + [ + 13.815710919700459, + 53.8436775455537 + ], + [ + 13.821665337302791, + 53.846958853227676 + ], + [ + 13.814410129103546, + 53.84603439418266 + ], + [ + 13.816141307970124, + 53.85293613646309 + ], + [ + 13.808221727944982, + 53.85480257280863 + ], + [ + 13.810011406588513, + 53.85800968278478 + ], + [ + 13.806297974329889, + 53.85913633194592 + ], + [ + 13.824689887247626, + 53.864698483100526 + ], + [ + 13.821990425983156, + 53.87192728214932 + ], + [ + 13.82615377539499, + 53.877628140688046 + ], + [ + 13.829385193322718, + 53.8743254692581 + ], + [ + 13.826648935721181, + 53.865622274488175 + ], + [ + 13.818628812146915, + 53.85921831982827 + ] + ], + [ + [ + 14.259977837248602, + 53.708938829796686 + ], + [ + 14.249738004223147, + 53.70789859729997 + ], + [ + 14.250381704603257, + 53.70270126834631 + ], + [ + 14.255408017411806, + 53.701592131327345 + ], + [ + 14.26925847858239, + 53.70601144965557 + ], + [ + 14.266038020151026, + 53.70990843081067 + ], + [ + 14.259977837248602, + 53.708938829796686 + ] + ] + ], + [ + [ + [ + 12.425561032202955, + 54.372882571698675 + ], + [ + 12.429371229480553, + 54.29356120803756 + ], + [ + 12.415879806602087, + 54.2874152322527 + ], + [ + 12.407783370019379, + 54.276726467097774 + ], + [ + 12.418591162401784, + 54.25825280797471 + ], + [ + 12.449994469431616, + 54.25448572420061 + ], + [ + 12.460427465120217, + 54.25015224108632 + ], + [ + 12.454292167541977, + 54.24655816026184 + ], + [ + 12.435806261801345, + 54.24482327740945 + ], + [ + 12.399465246162602, + 54.2505761030236 + ], + [ + 12.363647430531174, + 54.26583165639821 + ], + [ + 12.366070896468804, + 54.269289154696466 + ], + [ + 12.37768960908225, + 54.27222923228097 + ], + [ + 12.382455672699642, + 54.278146706079646 + ], + [ + 12.366986743003375, + 54.288525116463674 + ], + [ + 12.358043148019629, + 54.30193037501658 + ], + [ + 12.364965669960053, + 54.310299490649605 + ], + [ + 12.382731463693526, + 54.310089635585236 + ], + [ + 12.396028654610173, + 54.323499223587845 + ], + [ + 12.396665485060016, + 54.332401050186846 + ], + [ + 12.384501908478072, + 54.3406159203898 + ], + [ + 12.398826181117576, + 54.34448785792452 + ], + [ + 12.40590663034905, + 54.33722798419397 + ], + [ + 12.416072550623499, + 54.335386334425095 + ], + [ + 12.420974232619285, + 54.350425230703074 + ], + [ + 12.414104597150176, + 54.36514423355347 + ], + [ + 12.418490618004318, + 54.37223009208302 + ], + [ + 12.425561032202955, + 54.372882571698675 + ] + ] + ], + [ + [ + [ + 13.078678113132488, + 54.35186107331892 + ], + [ + 13.094463445470529, + 54.34636003800123 + ], + [ + 13.104709747135459, + 54.347450999518365 + ], + [ + 13.11501567438438, + 54.32299783969929 + ], + [ + 13.128348754335168, + 54.32161475062807 + ], + [ + 13.135614000616203, + 54.31703332643643 + ], + [ + 13.139910550185702, + 54.30736592063568 + ], + [ + 13.130665145544699, + 54.28250406422533 + ], + [ + 13.147670402408322, + 54.267929342041654 + ], + [ + 13.127560847328493, + 54.270466746266464 + ], + [ + 13.103221294413668, + 54.28387556397146 + ], + [ + 13.111952652633162, + 54.30565900997019 + ], + [ + 13.099219632024058, + 54.3175842304834 + ], + [ + 13.087535011422256, + 54.320055871369924 + ], + [ + 13.076239538736804, + 54.34348810611166 + ], + [ + 13.078678113132488, + 54.35186107331892 + ] + ], + [ + [ + 13.125240940968252, + 54.316118897241786 + ], + [ + 13.112409380444355, + 54.31264821408499 + ], + [ + 13.111968266019533, + 54.30873510358712 + ], + [ + 13.120966805091973, + 54.3026409311304 + ], + [ + 13.129611953303595, + 54.30808195061593 + ], + [ + 13.123972860893364, + 54.31159913366055 + ], + [ + 13.12872719054756, + 54.31408727868414 + ], + [ + 13.125240940968252, + 54.316118897241786 + ] + ] + ], + [ + [ + [ + 12.086852018297863, + 54.18594029077611 + ], + [ + 12.088562385657271, + 54.185688969686915 + ], + [ + 12.098636745485383, + 54.169087822726 + ], + [ + 12.107272118209414, + 54.17086322607353 + ], + [ + 12.107984344643874, + 54.17506036047486 + ], + [ + 12.123066863788571, + 54.177694697716575 + ], + [ + 12.128408789333468, + 54.17395870956206 + ], + [ + 12.143178641851057, + 54.17423299015708 + ], + [ + 12.136775333564763, + 54.16276058677816 + ], + [ + 12.142718906442072, + 54.15975029801796 + ], + [ + 12.130947604375958, + 54.15882499105738 + ], + [ + 12.130756306898682, + 54.155146216457226 + ], + [ + 12.12191558963178, + 54.15799305625747 + ], + [ + 12.126199136462292, + 54.15035911724243 + ], + [ + 12.114416509663746, + 54.15889647674234 + ], + [ + 12.107998092537121, + 54.15771238788122 + ], + [ + 12.11407500564409, + 54.14671895341652 + ], + [ + 12.105925886742464, + 54.15608646981892 + ], + [ + 12.105012979623742, + 54.145367250477605 + ], + [ + 12.100488742075248, + 54.15391044339069 + ], + [ + 12.097016922175499, + 54.15189777031925 + ], + [ + 12.097686006432, + 54.12086672444298 + ], + [ + 12.101518853815298, + 54.10991796618881 + ], + [ + 12.117166556218733, + 54.097621477826806 + ], + [ + 12.125844739679785, + 54.095375065553 + ], + [ + 12.13654735703745, + 54.09791606115353 + ], + [ + 12.153552562288745, + 54.09688429469903 + ], + [ + 12.154572621384837, + 54.09078616000361 + ], + [ + 12.151963692298809, + 54.08528683032946 + ], + [ + 12.151354873775544, + 54.09425931200585 + ], + [ + 12.148270752398217, + 54.09233267344542 + ], + [ + 12.112074157675247, + 54.09444291171559 + ], + [ + 12.097989402863579, + 54.102276835848585 + ], + [ + 12.090255729763724, + 54.112100741238756 + ], + [ + 12.086013958671892, + 54.11096170882072 + ], + [ + 12.089005613051995, + 54.113859296999856 + ], + [ + 12.085427641512952, + 54.12309033696551 + ], + [ + 12.090932231473227, + 54.132959107487075 + ], + [ + 12.084936117758646, + 54.14332196554481 + ], + [ + 12.079958287133763, + 54.143221459470595 + ], + [ + 12.09102555143866, + 54.15093314362592 + ], + [ + 12.096252913492936, + 54.16991857337697 + ], + [ + 12.087795120701225, + 54.169934866195156 + ], + [ + 12.094680746530829, + 54.17430769423538 + ], + [ + 12.090587147746307, + 54.18095201275063 + ], + [ + 12.087763981856872, + 54.17713996510041 + ], + [ + 12.086852018297863, + 54.18594029077611 + ] + ], + [ + [ + 12.10217871611718, + 54.16780746876077 + ], + [ + 12.103721789937994, + 54.16760349559102 + ], + [ + 12.104665225574369, + 54.16827407523076 + ], + [ + 12.103567548528412, + 54.16839591670879 + ], + [ + 12.10217871611718, + 54.16780746876077 + ] + ], + [ + [ + 12.104849263705013, + 54.16446982884248 + ], + [ + 12.108138008126248, + 54.16306111284776 + ], + [ + 12.107670482289993, + 54.16741638661123 + ], + [ + 12.10477455774788, + 54.16665497791792 + ], + [ + 12.104849263705013, + 54.16446982884248 + ] + ] + ], + [ + [ + [ + 13.406745953301963, + 54.17000375129344 + ], + [ + 13.413154537561592, + 54.16319628280575 + ], + [ + 13.40983305201797, + 54.16003909349128 + ], + [ + 13.413458559085038, + 54.16073657437908 + ], + [ + 13.41390101191371, + 54.15720134570703 + ], + [ + 13.40538290108341, + 54.15434854950141 + ], + [ + 13.398940084283005, + 54.1461464919669 + ], + [ + 13.383526569409373, + 54.1429293961621 + ], + [ + 13.380285696305382, + 54.15206790068528 + ], + [ + 13.4077837150282, + 54.162592978879616 + ], + [ + 13.408237368449763, + 54.16776436392606 + ], + [ + 13.399804827368303, + 54.16964341139353 + ], + [ + 13.399745699963717, + 54.17227799350987 + ], + [ + 13.406745953301963, + 54.17000375129344 + ] + ] + ], + [ + [ + [ + 13.76091264494404, + 54.12543464644027 + ], + [ + 13.766427691492385, + 54.125408912918346 + ], + [ + 13.763132579631433, + 54.12097168168407 + ], + [ + 13.767046305405364, + 54.11877667706653 + ], + [ + 13.766695268467286, + 54.121351270192854 + ], + [ + 13.775019102258657, + 54.11139503912109 + ], + [ + 13.796883321164325, + 54.10733616416359 + ], + [ + 13.793842102727824, + 54.10724649323323 + ], + [ + 13.802708142610657, + 54.10225771749615 + ], + [ + 13.804858930339527, + 54.0960024635227 + ], + [ + 13.79754511689224, + 54.10503700502204 + ], + [ + 13.77686752118198, + 54.10913306341842 + ], + [ + 13.76554166453745, + 54.11932756770892 + ], + [ + 13.754606451658994, + 54.12012422156046 + ], + [ + 13.753115095347, + 54.12266461598114 + ], + [ + 13.762463711444218, + 54.12791082783284 + ], + [ + 13.76091264494404, + 54.12543464644027 + ] + ] + ], + [ + [ + [ + 13.644008771921863, + 54.15697919762264 + ], + [ + 13.647428780651598, + 54.15720243994426 + ], + [ + 13.661649746186413, + 54.14628254186255 + ], + [ + 13.645725980533548, + 54.15082476237478 + ], + [ + 13.641126993577421, + 54.1538528194582 + ], + [ + 13.644008771921863, + 54.15697919762264 + ] + ] + ], + [ + [ + [ + 13.639403898608904, + 54.50863277945488 + ], + [ + 13.63432473436388, + 54.50464767317142 + ], + [ + 13.628175848007468, + 54.506156801060555 + ], + [ + 13.65083611759886, + 54.515194550689614 + ], + [ + 13.639403898608904, + 54.50863277945488 + ] + ] + ], + [ + [ + [ + 12.103890938369304, + 54.18003583365758 + ], + [ + 12.095257605835473, + 54.18130143620296 + ], + [ + 12.09369465373568, + 54.1854171904573 + ], + [ + 12.100414325100026, + 54.18432500672589 + ], + [ + 12.103890938369304, + 54.18003583365758 + ] + ] + ], + [ + [ + [ + 12.727958090149109, + 54.37306990202557 + ], + [ + 12.73833919411878, + 54.37239531216363 + ], + [ + 12.738006468925791, + 54.36975488560693 + ], + [ + 12.719571338397062, + 54.371756127330684 + ], + [ + 12.727958090149109, + 54.37306990202557 + ] + ] + ], + [ + [ + [ + 13.235913073586516, + 54.59715818661477 + ], + [ + 13.23793905913016, + 54.59418741023783 + ], + [ + 13.232229258190026, + 54.59137797330081 + ], + [ + 13.229947243749262, + 54.595929368757574 + ], + [ + 13.235913073586516, + 54.59715818661477 + ] + ] + ], + [ + [ + [ + 11.25539779859116, + 53.97369668753963 + ], + [ + 11.249649257171818, + 53.971239009984636 + ], + [ + 11.246187514884012, + 53.973463088811926 + ], + [ + 11.253154605796798, + 53.97367500161143 + ], + [ + 11.257648025950065, + 53.97958355223653 + ], + [ + 11.25539779859116, + 53.97369668753963 + ] + ] + ], + [ + [ + [ + 12.520088054399652, + 54.47498691340971 + ], + [ + 12.52499336727625, + 54.47272706988387 + ], + [ + 12.522461838299872, + 54.4692712450472 + ], + [ + 12.516934298086277, + 54.47468449962723 + ], + [ + 12.52140027952822, + 54.47711506390106 + ], + [ + 12.520088054399652, + 54.47498691340971 + ] + ] + ], + [ + [ + [ + 11.436894069637756, + 53.911064746171725 + ], + [ + 11.439960277879377, + 53.90831824332206 + ], + [ + 11.436531157190323, + 53.90730235455247 + ], + [ + 11.431063963750708, + 53.91141529482304 + ], + [ + 11.436894069637756, + 53.911064746171725 + ] + ] + ], + [ + [ + [ + 13.458606357869645, + 54.09514306995501 + ], + [ + 13.4590758449689, + 54.0921748338552 + ], + [ + 13.458847549528906, + 54.090660949192376 + ], + [ + 13.457879950074528, + 54.097263494532825 + ], + [ + 13.458606357869645, + 54.09514306995501 + ] + ] + ], + [ + [ + [ + 11.444713658001383, + 53.911358526615714 + ], + [ + 11.444659175692049, + 53.914898493817155 + ], + [ + 11.457498883154432, + 53.91647850845104 + ], + [ + 11.448325390044957, + 53.91385785090077 + ], + [ + 11.444713658001383, + 53.911358526615714 + ] + ] + ], + [ + [ + [ + 11.613721636403843, + 54.10252138676682 + ], + [ + 11.612806153053125, + 54.10129788038848 + ], + [ + 11.604809508727554, + 54.102832093058396 + ], + [ + 11.609118817837231, + 54.10391030062902 + ], + [ + 11.613721636403843, + 54.10252138676682 + ] + ] + ], + [ + [ + [ + 13.766567795148822, + 54.1343053095755 + ], + [ + 13.764215165234832, + 54.134021841938505 + ], + [ + 13.761351520188937, + 54.13718354566528 + ], + [ + 13.764432408720404, + 54.138073617916426 + ], + [ + 13.766567795148822, + 54.1343053095755 + ] + ] + ], + [ + [ + [ + 13.445818712526844, + 54.10488533855911 + ], + [ + 13.451198595675391, + 54.105172543834605 + ], + [ + 13.451524418558048, + 54.10257407982903 + ], + [ + 13.448143143842625, + 54.102220050096896 + ], + [ + 13.445818712526844, + 54.10488533855911 + ] + ] + ], + [ + [ + [ + 13.929988081025135, + 53.871459717877805 + ], + [ + 13.92827813035748, + 53.86985244786628 + ], + [ + 13.928154317172542, + 53.87338626352977 + ], + [ + 13.930389761580212, + 53.87513596867981 + ], + [ + 13.929988081025135, + 53.871459717877805 + ] + ] + ], + [ + [ + [ + 13.574243793095977, + 54.13512072984501 + ], + [ + 13.575968481474892, + 54.13180816535722 + ], + [ + 13.572401855013345, + 54.131800834024176 + ], + [ + 13.572268221411687, + 54.133260134279084 + ], + [ + 13.574243793095977, + 54.13512072984501 + ] + ] + ], + [ + [ + [ + 11.253228888666495, + 53.94010184811636 + ], + [ + 11.250914916318244, + 53.93907490421526 + ], + [ + 11.249754293414226, + 53.94089062183127 + ], + [ + 11.252873083415144, + 53.942169165339095 + ], + [ + 11.253228888666495, + 53.94010184811636 + ] + ] + ], + [ + [ + [ + 13.504872489047875, + 54.340596960013066 + ], + [ + 13.504352401553506, + 54.34169073193409 + ], + [ + 13.504881189428076, + 54.34307868953918 + ], + [ + 13.50855375244381, + 54.341388692995345 + ], + [ + 13.504872489047875, + 54.340596960013066 + ] + ] + ], + [ + [ + [ + 14.043054844372467, + 53.99956967399888 + ], + [ + 14.03796049282846, + 53.997959057590485 + ], + [ + 14.037375385039622, + 53.99858090035155 + ], + [ + 14.047417449000704, + 54.0013585429299 + ], + [ + 14.043054844372467, + 53.99956967399888 + ] + ] + ], + [ + [ + [ + 13.504477128295424, + 54.340435843518044 + ], + [ + 13.501141434672903, + 54.33986605040094 + ], + [ + 13.501621893194912, + 54.34266744711821 + ], + [ + 13.503731096359976, + 54.340892712203576 + ], + [ + 13.504477128295424, + 54.340435843518044 + ] + ] + ], + [ + [ + [ + 13.727509019930025, + 54.13820093075509 + ], + [ + 13.732177364429758, + 54.13790136634524 + ], + [ + 13.73421000255929, + 54.135375878228565 + ], + [ + 13.730424633554449, + 54.136215547665095 + ], + [ + 13.727509019930025, + 54.13820093075509 + ] + ] + ], + [ + [ + [ + 13.285429232157144, + 54.62147815936651 + ], + [ + 13.282215766656218, + 54.621721134206545 + ], + [ + 13.283882366515492, + 54.623723260333506 + ], + [ + 13.285719712795105, + 54.62286511504975 + ], + [ + 13.285429232157144, + 54.62147815936651 + ] + ] + ], + [ + [ + [ + 13.452175092164179, + 54.471853965042456 + ], + [ + 13.450190315968166, + 54.471836204635174 + ], + [ + 13.449475739223551, + 54.474259720115505 + ], + [ + 13.452574150824091, + 54.47444398669477 + ], + [ + 13.452175092164179, + 54.471853965042456 + ] + ] + ], + [ + [ + [ + 13.35683588693708, + 54.61120661783089 + ], + [ + 13.35437960242782, + 54.61152040757331 + ], + [ + 13.358315935639252, + 54.61329814793768 + ], + [ + 13.359245663898056, + 54.61197815851522 + ], + [ + 13.35683588693708, + 54.61120661783089 + ] + ] + ], + [ + [ + [ + 13.701260587002176, + 54.38432535802179 + ], + [ + 13.698021855229051, + 54.38398893289165 + ], + [ + 13.701800092533677, + 54.386368336037386 + ], + [ + 13.703277027761917, + 54.385688793076234 + ], + [ + 13.701260587002176, + 54.38432535802179 + ] + ] + ], + [ + [ + [ + 11.348772636938127, + 53.94687989168801 + ], + [ + 11.346562402791495, + 53.94639907969477 + ], + [ + 11.345652625820156, + 53.9479508378725 + ], + [ + 11.348675054732379, + 53.948595524745684 + ], + [ + 11.348772636938127, + 53.94687989168801 + ] + ] + ], + [ + [ + [ + 13.347367446697367, + 54.181847324438245 + ], + [ + 13.348650715656627, + 54.180533038283116 + ], + [ + 13.347469072781571, + 54.18011146899717 + ], + [ + 13.346327013381474, + 54.18142198708107 + ], + [ + 13.347367446697367, + 54.181847324438245 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "16", + "AGS": "16", + "SDV_RS": "160510000000", + "GEN": "Thüringen", + "BEZ": "Freistaat", + "IBZ": 21, + "BEM": "--", + "NBD": "ja", + "SN_L": "16", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DEG", + "RS_0": "160000000000", + "AGS_0": "16000000", + "WSK": "2014/02/01", + "DEBKG_ID": "DEBKGDL20000E09Y", + "destatis": { + "population": 2156759, + "population_m": 1062930, + "population_w": 1093829 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.788542128804279, + 51.64152116272316 + ], + [ + 10.818215835351001, + 51.639026431289814 + ], + [ + 10.823072860641467, + 51.62346622094989 + ], + [ + 10.833734255237033, + 51.630687606684766 + ], + [ + 10.85909145168618, + 51.632790366374664 + ], + [ + 10.883233799559017, + 51.61769414996919 + ], + [ + 10.886600560526299, + 51.61211090739236 + ], + [ + 10.894001828412062, + 51.61066064863692 + ], + [ + 10.922012575111838, + 51.61844743398709 + ], + [ + 10.920959015372041, + 51.613652508358975 + ], + [ + 10.91409135940129, + 51.61016346096087 + ], + [ + 10.937063687557515, + 51.603487289442114 + ], + [ + 10.931186218205397, + 51.5914806445608 + ], + [ + 10.903331296234999, + 51.59382821453545 + ], + [ + 10.896424216029427, + 51.59683842630851 + ], + [ + 10.894476281755564, + 51.6018329019709 + ], + [ + 10.882051629285211, + 51.580508085501165 + ], + [ + 10.8930718985623, + 51.57651765192432 + ], + [ + 10.892765968727804, + 51.57114776829071 + ], + [ + 10.90024971394113, + 51.56442340683161 + ], + [ + 10.895150137916204, + 51.55767092727034 + ], + [ + 10.900496028208815, + 51.55065469839176 + ], + [ + 10.904473142711009, + 51.54964138201227 + ], + [ + 10.911161901663002, + 51.55543114439815 + ], + [ + 10.916548649002573, + 51.54745703793711 + ], + [ + 10.947971841741799, + 51.537572878002806 + ], + [ + 10.947838950641056, + 51.53334586100101 + ], + [ + 10.939754083236513, + 51.535604312493255 + ], + [ + 10.935151294417032, + 51.5332219886369 + ], + [ + 10.932850378031711, + 51.52151732078981 + ], + [ + 10.927335259509382, + 51.520853701018176 + ], + [ + 10.933751616531834, + 51.51921986199977 + ], + [ + 10.936240608666653, + 51.51151519956139 + ], + [ + 10.945552756331972, + 51.506382565472016 + ], + [ + 10.93972108434198, + 51.50072556311688 + ], + [ + 10.946634320993576, + 51.499010171949045 + ], + [ + 10.948649094062624, + 51.50162955507476 + ], + [ + 10.953760832708237, + 51.49814624293844 + ], + [ + 10.952076347567042, + 51.49541771649209 + ], + [ + 10.973269908807227, + 51.48204626542689 + ], + [ + 10.960817206166812, + 51.47122492606361 + ], + [ + 10.962994034935166, + 51.460386861925436 + ], + [ + 10.969701830958858, + 51.4589354644967 + ], + [ + 10.968290790138475, + 51.45441900709922 + ], + [ + 10.97270295837157, + 51.4536660280179 + ], + [ + 10.967122259544455, + 51.44571471004422 + ], + [ + 10.970928628160124, + 51.44202882010503 + ], + [ + 10.966733925720106, + 51.432353205949546 + ], + [ + 10.979680169924793, + 51.43192371011911 + ], + [ + 10.978113225723273, + 51.426885079962815 + ], + [ + 10.989467720794698, + 51.425776500451455 + ], + [ + 11.007920436329533, + 51.429268919827074 + ], + [ + 11.010663972160202, + 51.42531503044971 + ], + [ + 10.999994887768581, + 51.423218473530994 + ], + [ + 10.992033080015446, + 51.41785321194477 + ], + [ + 11.018749640110917, + 51.417052820723754 + ], + [ + 11.025240691729728, + 51.421394512048536 + ], + [ + 11.040229670468658, + 51.42459185925196 + ], + [ + 11.049852427655415, + 51.42019652842001 + ], + [ + 11.046041148551835, + 51.42627015618093 + ], + [ + 11.051844974169068, + 51.42953124690335 + ], + [ + 11.056930773646458, + 51.4274759750705 + ], + [ + 11.061390454954891, + 51.42979197279626 + ], + [ + 11.071476060471943, + 51.428634518141266 + ], + [ + 11.09520421919804, + 51.41897593915992 + ], + [ + 11.103465972675822, + 51.419255054579665 + ], + [ + 11.101996258943336, + 51.41690536543601 + ], + [ + 11.116555710710788, + 51.4156873029206 + ], + [ + 11.116392160823398, + 51.4110006944913 + ], + [ + 11.127572764232092, + 51.41325379518786 + ], + [ + 11.125661259257301, + 51.4081176575851 + ], + [ + 11.131107439663552, + 51.408533630526335 + ], + [ + 11.13228483176686, + 51.40447095981794 + ], + [ + 11.13505098659327, + 51.406341393796275 + ], + [ + 11.141754601862322, + 51.40263265258552 + ], + [ + 11.148628558736226, + 51.403981996939855 + ], + [ + 11.152934180688053, + 51.40164432358522 + ], + [ + 11.17688794582328, + 51.40630791595467 + ], + [ + 11.183413273146337, + 51.40589880705801 + ], + [ + 11.183596615602154, + 51.40286974487307 + ], + [ + 11.19241116464171, + 51.40287528816174 + ], + [ + 11.196856632335383, + 51.40803211806097 + ], + [ + 11.207723621750196, + 51.40666908589464 + ], + [ + 11.209537548203828, + 51.41174291106812 + ], + [ + 11.22388299637411, + 51.41318615168727 + ], + [ + 11.230167350945038, + 51.405742605621576 + ], + [ + 11.247897157698631, + 51.40542056009289 + ], + [ + 11.244122912329606, + 51.39695478218874 + ], + [ + 11.248506161739268, + 51.39513282565457 + ], + [ + 11.252768861228889, + 51.40065315176867 + ], + [ + 11.274318772955645, + 51.400754522951594 + ], + [ + 11.275246030225642, + 51.4048434600815 + ], + [ + 11.284975138297831, + 51.40220792271825 + ], + [ + 11.321259842235945, + 51.41037234580523 + ], + [ + 11.330795693412671, + 51.390266388555794 + ], + [ + 11.339771991638093, + 51.392405453096806 + ], + [ + 11.34724969643086, + 51.38456004423309 + ], + [ + 11.349892213139755, + 51.38838726203235 + ], + [ + 11.357425839968538, + 51.38977460151075 + ], + [ + 11.362028479912938, + 51.3828690085643 + ], + [ + 11.36840461073202, + 51.38777963951979 + ], + [ + 11.396852278681221, + 51.38133072424108 + ], + [ + 11.395941107857022, + 51.372934026131674 + ], + [ + 11.3911465658744, + 51.372547613022675 + ], + [ + 11.389836466525368, + 51.36798681991007 + ], + [ + 11.392966719116009, + 51.354101569094986 + ], + [ + 11.400975060198654, + 51.349437183403026 + ], + [ + 11.399437218037313, + 51.344836154536154 + ], + [ + 11.40899213332348, + 51.340082700949225 + ], + [ + 11.412042133045041, + 51.34248839050557 + ], + [ + 11.4288145555439, + 51.342828577025564 + ], + [ + 11.426296568674195, + 51.33622242045509 + ], + [ + 11.413594722814809, + 51.33312782331502 + ], + [ + 11.428053922798567, + 51.327912731444165 + ], + [ + 11.434235478160206, + 51.32042263133713 + ], + [ + 11.447413765900986, + 51.31606106485489 + ], + [ + 11.445994289784192, + 51.31196057660285 + ], + [ + 11.449778952913801, + 51.31378352222866 + ], + [ + 11.47522597831953, + 51.29805427521017 + ], + [ + 11.46778506022408, + 51.288386860300896 + ], + [ + 11.459277674624627, + 51.29350634715702 + ], + [ + 11.452325168334774, + 51.279985416293925 + ], + [ + 11.456112363573109, + 51.277201274374605 + ], + [ + 11.446777525843826, + 51.271122571117914 + ], + [ + 11.441744507299695, + 51.27331358056426 + ], + [ + 11.437030881086217, + 51.26865453074992 + ], + [ + 11.441280275246926, + 51.26696411522637 + ], + [ + 11.439522337763623, + 51.26337865816815 + ], + [ + 11.429290882419085, + 51.254679659105484 + ], + [ + 11.421805873374607, + 51.25323615954592 + ], + [ + 11.41996752334854, + 51.246364477957684 + ], + [ + 11.412632299869804, + 51.24106203163985 + ], + [ + 11.397795323976865, + 51.236737714644825 + ], + [ + 11.40061303107411, + 51.24290962033112 + ], + [ + 11.384566954299718, + 51.245632228783 + ], + [ + 11.376377247450538, + 51.23938638956259 + ], + [ + 11.376447063414489, + 51.23407119567274 + ], + [ + 11.369101132328412, + 51.230612099985514 + ], + [ + 11.364832642692466, + 51.221359160985145 + ], + [ + 11.389824940320421, + 51.21751519223884 + ], + [ + 11.391420063781675, + 51.203533298708464 + ], + [ + 11.39919887438971, + 51.206380538980625 + ], + [ + 11.40588754576223, + 51.20270284409798 + ], + [ + 11.405001376144558, + 51.20737146836508 + ], + [ + 11.430948609175962, + 51.212475797285094 + ], + [ + 11.446045122223316, + 51.20814376541528 + ], + [ + 11.452402961027895, + 51.19247748827776 + ], + [ + 11.455836637696517, + 51.195377185381766 + ], + [ + 11.46856772864456, + 51.192654104297524 + ], + [ + 11.4708176240524, + 51.169838475294995 + ], + [ + 11.485548328442897, + 51.16801734689319 + ], + [ + 11.485260143823973, + 51.16559279160727 + ], + [ + 11.474947699234338, + 51.16582633869905 + ], + [ + 11.47256040038652, + 51.16091995894629 + ], + [ + 11.47928467495348, + 51.158778321357005 + ], + [ + 11.47192917646712, + 51.14818357457041 + ], + [ + 11.45100430687818, + 51.14667013075036 + ], + [ + 11.459875403286473, + 51.130163065964794 + ], + [ + 11.465453882110838, + 51.12738206447062 + ], + [ + 11.463156805846083, + 51.11306664796063 + ], + [ + 11.483823598436754, + 51.10817941800197 + ], + [ + 11.48521893697276, + 51.10253352594178 + ], + [ + 11.510594122267138, + 51.10297378030454 + ], + [ + 11.512077530979639, + 51.10797399528047 + ], + [ + 11.545642779374866, + 51.10245036682987 + ], + [ + 11.547819652412816, + 51.11170217407316 + ], + [ + 11.558240956094739, + 51.108951272721534 + ], + [ + 11.571659895025698, + 51.11936512359049 + ], + [ + 11.607503406031551, + 51.11160723314434 + ], + [ + 11.620043673665416, + 51.104666931977995 + ], + [ + 11.616151624922558, + 51.0979644557857 + ], + [ + 11.62021201381665, + 51.0974486614367 + ], + [ + 11.62435561135702, + 51.10448152457717 + ], + [ + 11.638240030569804, + 51.11112278117411 + ], + [ + 11.647079649477014, + 51.10730198180629 + ], + [ + 11.666950054277859, + 51.11078547660002 + ], + [ + 11.672439705867014, + 51.102901877846044 + ], + [ + 11.692382465376038, + 51.099851597090904 + ], + [ + 11.693398985146889, + 51.09262028141144 + ], + [ + 11.70158187108571, + 51.08582347370056 + ], + [ + 11.697597752340526, + 51.08424468625904 + ], + [ + 11.701832501840457, + 51.07841512313493 + ], + [ + 11.700810413630325, + 51.06940256477674 + ], + [ + 11.709846615368363, + 51.068137842062505 + ], + [ + 11.721168154079113, + 51.071019811958955 + ], + [ + 11.72352338729973, + 51.067995114790016 + ], + [ + 11.73229986271994, + 51.06841715488467 + ], + [ + 11.73714686546024, + 51.063137447515956 + ], + [ + 11.753250386778266, + 51.05698852150597 + ], + [ + 11.746197108160608, + 51.05195437086733 + ], + [ + 11.759753676759168, + 51.047775838054775 + ], + [ + 11.759689950608923, + 51.04285785477688 + ], + [ + 11.772094096850658, + 51.04500754079923 + ], + [ + 11.770406816956841, + 51.04918031270259 + ], + [ + 11.77463427783619, + 51.05315736510943 + ], + [ + 11.78686566313415, + 51.05262840385305 + ], + [ + 11.787399354595946, + 51.05011059681768 + ], + [ + 11.79710147100003, + 51.05040805341785 + ], + [ + 11.803893556218469, + 51.04721079603573 + ], + [ + 11.860261347322181, + 51.05476396146672 + ], + [ + 11.863095833622529, + 51.051145631508646 + ], + [ + 11.875513056838958, + 51.05773473673364 + ], + [ + 11.888807362338119, + 51.05584043388354 + ], + [ + 11.896663051736466, + 51.05047293321077 + ], + [ + 11.896015676387364, + 51.045333594140466 + ], + [ + 11.910866915877856, + 51.04501989758847 + ], + [ + 11.915390046566634, + 51.03793685803939 + ], + [ + 11.911895626694195, + 51.028179286164125 + ], + [ + 11.921462604591259, + 51.0262939206595 + ], + [ + 11.943066187342447, + 51.03244116268608 + ], + [ + 11.95831280836955, + 51.02103862535435 + ], + [ + 11.96274317977923, + 51.02218315457454 + ], + [ + 11.96522696220877, + 51.01834207148541 + ], + [ + 11.977137232995462, + 51.01645489769894 + ], + [ + 11.980310204511765, + 51.0123453521436 + ], + [ + 11.974704292239455, + 51.00982584789465 + ], + [ + 11.97864392861341, + 51.003696122336926 + ], + [ + 11.975773856579536, + 50.99916670236689 + ], + [ + 11.968528753461957, + 50.99915925553693 + ], + [ + 11.969873132919219, + 50.99432773123478 + ], + [ + 11.974237769141155, + 50.99032192513188 + ], + [ + 11.996501891098395, + 50.99316077513779 + ], + [ + 11.999335897672516, + 50.988633695009554 + ], + [ + 12.006571244227093, + 50.9910241452028 + ], + [ + 12.008665204938085, + 50.98394158987385 + ], + [ + 12.014309771760368, + 50.983904335650536 + ], + [ + 12.017188182362666, + 50.97906123270683 + ], + [ + 12.010659468232822, + 50.97469144000443 + ], + [ + 12.014126398347441, + 50.96867085466466 + ], + [ + 12.037484824646617, + 50.97293644225292 + ], + [ + 12.05535675375384, + 50.96861334719242 + ], + [ + 12.09215763884182, + 50.976530486346846 + ], + [ + 12.13498652737083, + 50.96497545587702 + ], + [ + 12.132133920270881, + 50.96126262775185 + ], + [ + 12.150049823256714, + 50.964150955447856 + ], + [ + 12.158352669128105, + 50.963131218551894 + ], + [ + 12.163529546606282, + 50.95859977907033 + ], + [ + 12.163207827290305, + 50.966485229065384 + ], + [ + 12.182508062997105, + 50.97586604427739 + ], + [ + 12.197979396811023, + 50.956783873909366 + ], + [ + 12.21381856881956, + 50.95843608723059 + ], + [ + 12.215346989001082, + 50.95327012610144 + ], + [ + 12.21107399589463, + 50.949571042839494 + ], + [ + 12.214580121217244, + 50.93803207630959 + ], + [ + 12.238717455762592, + 50.95152809746858 + ], + [ + 12.241670525962366, + 50.96151374842581 + ], + [ + 12.23234881526451, + 50.96135339045853 + ], + [ + 12.239891998158518, + 50.975679991596415 + ], + [ + 12.26558817545329, + 50.99185904241562 + ], + [ + 12.27789476127906, + 51.00579740479709 + ], + [ + 12.283517937532837, + 51.006435973146914 + ], + [ + 12.282508513466196, + 51.01169741883625 + ], + [ + 12.29174785668694, + 51.01869953524705 + ], + [ + 12.293914549743866, + 51.03132995257839 + ], + [ + 12.289483102599144, + 51.030450150527436 + ], + [ + 12.287045389016138, + 51.037639039932294 + ], + [ + 12.273056530370168, + 51.040633587821176 + ], + [ + 12.264557977726653, + 51.03751351942431 + ], + [ + 12.250268436067012, + 51.03787289004578 + ], + [ + 12.25046036836333, + 51.04446693802719 + ], + [ + 12.256789284568804, + 51.0453347594686 + ], + [ + 12.2562808615217, + 51.04924837968444 + ], + [ + 12.262206674650464, + 51.049610747470126 + ], + [ + 12.258492624047165, + 51.06614387896959 + ], + [ + 12.269307430378499, + 51.071812329128754 + ], + [ + 12.265596845867098, + 51.076984318296994 + ], + [ + 12.273207792817468, + 51.075059637220875 + ], + [ + 12.288279374440139, + 51.0882424327301 + ], + [ + 12.28354704226007, + 51.09192399066533 + ], + [ + 12.290750421082295, + 51.09098484861413 + ], + [ + 12.304828430806154, + 51.097484484031106 + ], + [ + 12.307434947472228, + 51.094511030992614 + ], + [ + 12.318470379014265, + 51.09382665557248 + ], + [ + 12.331598673825582, + 51.10378250404616 + ], + [ + 12.35658007109189, + 51.09434281994084 + ], + [ + 12.35361756363398, + 51.08460672791654 + ], + [ + 12.37240934038974, + 51.07747447272083 + ], + [ + 12.392957993334875, + 51.08411550098767 + ], + [ + 12.410448215750922, + 51.072854818392344 + ], + [ + 12.42097553122257, + 51.0781425126888 + ], + [ + 12.450744658636452, + 51.077305766130166 + ], + [ + 12.45309760985909, + 51.0834614479458 + ], + [ + 12.458382880279835, + 51.08455071069888 + ], + [ + 12.462914728511446, + 51.0668998018591 + ], + [ + 12.467989081023724, + 51.067843082834464 + ], + [ + 12.46946768878317, + 51.064217454560676 + ], + [ + 12.496357871274412, + 51.06624660628083 + ], + [ + 12.504459791262232, + 51.0607910194548 + ], + [ + 12.508575942200043, + 51.053062825156374 + ], + [ + 12.501925594079015, + 51.05172585782623 + ], + [ + 12.502893944610813, + 51.03489967928183 + ], + [ + 12.51245151820393, + 51.026419072383064 + ], + [ + 12.50738816629394, + 51.017275888204914 + ], + [ + 12.516332786297014, + 51.01821992156845 + ], + [ + 12.514368601913642, + 51.02687660692161 + ], + [ + 12.518156393959092, + 51.02734922937654 + ], + [ + 12.518903840009319, + 51.02286481220912 + ], + [ + 12.538852057512976, + 51.02425203615404 + ], + [ + 12.534771484209587, + 51.01562931900916 + ], + [ + 12.540180375574021, + 51.005732581288775 + ], + [ + 12.526451553965302, + 51.00148547911937 + ], + [ + 12.528349485049375, + 50.99828032972515 + ], + [ + 12.555758809307333, + 50.997485504579025 + ], + [ + 12.572780190762401, + 50.99023938234264 + ], + [ + 12.583653251989324, + 50.98157176053639 + ], + [ + 12.57929313317946, + 50.98514208773737 + ], + [ + 12.581021526381035, + 50.989235077050296 + ], + [ + 12.601193638279133, + 50.992731000518 + ], + [ + 12.607533973536182, + 50.996731763280934 + ], + [ + 12.60731070163954, + 50.99082004248076 + ], + [ + 12.616431422986164, + 50.985281876232406 + ], + [ + 12.62128878362046, + 50.97577059377081 + ], + [ + 12.63011274886899, + 50.94250303056217 + ], + [ + 12.624357314839504, + 50.93970986694533 + ], + [ + 12.631443609908153, + 50.94014733799314 + ], + [ + 12.637630069289704, + 50.93310286562176 + ], + [ + 12.642232822341976, + 50.93316777632598 + ], + [ + 12.64166261094832, + 50.928807092748514 + ], + [ + 12.65286573951243, + 50.92367790176926 + ], + [ + 12.65411508943602, + 50.91906273747016 + ], + [ + 12.641274410469142, + 50.911423751008705 + ], + [ + 12.640121044576528, + 50.90307378192895 + ], + [ + 12.620061668555538, + 50.90938146414057 + ], + [ + 12.614800867811892, + 50.90480507421591 + ], + [ + 12.584735254996883, + 50.904020784468706 + ], + [ + 12.573426149242943, + 50.90107806013458 + ], + [ + 12.560227495998427, + 50.90613726888537 + ], + [ + 12.53819115857687, + 50.90068640705213 + ], + [ + 12.525261426168852, + 50.90265563791875 + ], + [ + 12.52132239465282, + 50.9075985257802 + ], + [ + 12.507862731332803, + 50.903729035752036 + ], + [ + 12.511120449669924, + 50.89409886972997 + ], + [ + 12.487004290253985, + 50.89136616042416 + ], + [ + 12.485245806451939, + 50.89356810126912 + ], + [ + 12.480235570907992, + 50.89051004724409 + ], + [ + 12.482190588703268, + 50.88867633939635 + ], + [ + 12.459254289335727, + 50.88044858282062 + ], + [ + 12.464025532864305, + 50.87012522141868 + ], + [ + 12.448356980378781, + 50.867448333466115 + ], + [ + 12.44415211321811, + 50.8625839225322 + ], + [ + 12.448249614336492, + 50.85616979203911 + ], + [ + 12.44112721978881, + 50.84939454926638 + ], + [ + 12.442501814851576, + 50.8440273940196 + ], + [ + 12.43745292019283, + 50.842417403743575 + ], + [ + 12.429327591731493, + 50.844161319087426 + ], + [ + 12.420206496379745, + 50.83958970667391 + ], + [ + 12.411585512461148, + 50.84738245496991 + ], + [ + 12.418055649068645, + 50.85540733597923 + ], + [ + 12.415189608292337, + 50.85653965469757 + ], + [ + 12.407294628738665, + 50.85681358442391 + ], + [ + 12.402949550699624, + 50.84922606327097 + ], + [ + 12.377031700998726, + 50.84904778577367 + ], + [ + 12.378388545323215, + 50.85371150035287 + ], + [ + 12.374132737026166, + 50.853249230262094 + ], + [ + 12.374856029839458, + 50.84882574441568 + ], + [ + 12.348316869658724, + 50.83753494003145 + ], + [ + 12.347576712059668, + 50.8236315072143 + ], + [ + 12.306948010334269, + 50.81876300202403 + ], + [ + 12.298583556347864, + 50.82990021984161 + ], + [ + 12.295908167457643, + 50.8283306039888 + ], + [ + 12.302356116102823, + 50.81719718267931 + ], + [ + 12.295668692757799, + 50.81690079405526 + ], + [ + 12.289715311711575, + 50.82396523567385 + ], + [ + 12.286074759573633, + 50.81187393294817 + ], + [ + 12.279862918887405, + 50.80970437705079 + ], + [ + 12.276981907793898, + 50.817859631523795 + ], + [ + 12.27265946121579, + 50.816389802083165 + ], + [ + 12.275035491048383, + 50.81363880214651 + ], + [ + 12.25975806546009, + 50.81145106119953 + ], + [ + 12.250825381385155, + 50.8183182609222 + ], + [ + 12.242835373458027, + 50.80906045529585 + ], + [ + 12.253483552299238, + 50.79950899466119 + ], + [ + 12.250176663506531, + 50.79910172797406 + ], + [ + 12.254849013455141, + 50.79505915614306 + ], + [ + 12.25315365652795, + 50.788834763196746 + ], + [ + 12.267571982540677, + 50.7873278462227 + ], + [ + 12.28764435335465, + 50.789643325378044 + ], + [ + 12.290160811939122, + 50.783427090357094 + ], + [ + 12.2840497063273, + 50.77346766943701 + ], + [ + 12.263920928737159, + 50.76045602532102 + ], + [ + 12.24068973496202, + 50.76724012519951 + ], + [ + 12.228688048858753, + 50.757452785872964 + ], + [ + 12.226984634304793, + 50.73821847663839 + ], + [ + 12.237913783983608, + 50.73302577912727 + ], + [ + 12.26475665818875, + 50.737546887240455 + ], + [ + 12.273430219359645, + 50.72820205793254 + ], + [ + 12.253382117398033, + 50.71570452703789 + ], + [ + 12.264900656772062, + 50.70369923263243 + ], + [ + 12.262762317854543, + 50.69527646211873 + ], + [ + 12.27476180468423, + 50.68611728390504 + ], + [ + 12.296887840945374, + 50.686543446330276 + ], + [ + 12.30853701807428, + 50.68260884368434 + ], + [ + 12.3188962528271, + 50.684003177549506 + ], + [ + 12.322048411769533, + 50.68143383574602 + ], + [ + 12.314006047014171, + 50.67095781173015 + ], + [ + 12.317610091231913, + 50.66348495930745 + ], + [ + 12.303543696917997, + 50.66225610397235 + ], + [ + 12.298894858770078, + 50.65168210032576 + ], + [ + 12.280422546954888, + 50.64707992978598 + ], + [ + 12.281318076592116, + 50.64455306760428 + ], + [ + 12.264286262044754, + 50.643385439697795 + ], + [ + 12.265518391214226, + 50.630793342108774 + ], + [ + 12.244589410921849, + 50.63374121139517 + ], + [ + 12.232812278382797, + 50.62706702790605 + ], + [ + 12.230825128526682, + 50.63263185811867 + ], + [ + 12.226448312658897, + 50.629835289531265 + ], + [ + 12.216758805327125, + 50.63146462284012 + ], + [ + 12.217238712004331, + 50.63374350638468 + ], + [ + 12.2073430835159, + 50.63673409865842 + ], + [ + 12.207544905798166, + 50.63993512512825 + ], + [ + 12.198197471157458, + 50.64131480940935 + ], + [ + 12.199690156500404, + 50.63293187511698 + ], + [ + 12.188191104420255, + 50.62311895220156 + ], + [ + 12.190751568538019, + 50.614423303584374 + ], + [ + 12.182766475238678, + 50.61211060156897 + ], + [ + 12.174721624452955, + 50.6145138805366 + ], + [ + 12.178135353096609, + 50.61864891419767 + ], + [ + 12.17044187562045, + 50.629234700836314 + ], + [ + 12.153639989476172, + 50.63050499466795 + ], + [ + 12.146427260209501, + 50.62597887619071 + ], + [ + 12.15082609694121, + 50.615602165819794 + ], + [ + 12.145226950397477, + 50.60973703713057 + ], + [ + 12.147222144775949, + 50.606097919258694 + ], + [ + 12.11592208137294, + 50.59741420397682 + ], + [ + 12.110150854538343, + 50.588720041827514 + ], + [ + 12.124724022766046, + 50.58442452398657 + ], + [ + 12.132649086505221, + 50.587741679876245 + ], + [ + 12.12636992726076, + 50.58400131312261 + ], + [ + 12.135191115985162, + 50.58213368942595 + ], + [ + 12.144832258936171, + 50.58574002031002 + ], + [ + 12.151598610302132, + 50.58344577505296 + ], + [ + 12.15609217798892, + 50.58557908431453 + ], + [ + 12.160679028777025, + 50.58040857346755 + ], + [ + 12.156024276839375, + 50.5734915255999 + ], + [ + 12.127654065660158, + 50.57412899446228 + ], + [ + 12.122792036613255, + 50.56753566375795 + ], + [ + 12.115772821189909, + 50.56694834639198 + ], + [ + 12.10151776384026, + 50.578940386872304 + ], + [ + 12.083594331171394, + 50.57856673829927 + ], + [ + 12.078117392269785, + 50.576589695463895 + ], + [ + 12.079140784314937, + 50.5692590312793 + ], + [ + 12.074673281825184, + 50.56683055661387 + ], + [ + 12.076643573679908, + 50.558007533851594 + ], + [ + 12.052068202946751, + 50.55096098245605 + ], + [ + 12.041216178079178, + 50.55353817652085 + ], + [ + 12.030271919844902, + 50.54939778663634 + ], + [ + 12.03365185143739, + 50.55321411853689 + ], + [ + 12.028347435020162, + 50.553860463147636 + ], + [ + 12.032204222033352, + 50.55500114421855 + ], + [ + 12.030989895253288, + 50.55777623436533 + ], + [ + 12.017535478051487, + 50.56784079074392 + ], + [ + 12.035634272106865, + 50.58136535787946 + ], + [ + 12.031110192973616, + 50.5819034265453 + ], + [ + 12.035007982811127, + 50.59459403104193 + ], + [ + 12.031294675712365, + 50.59820714184352 + ], + [ + 12.020970313634002, + 50.59855293638082 + ], + [ + 12.004761034342158, + 50.613823416535716 + ], + [ + 12.021478079538094, + 50.62679334891023 + ], + [ + 12.010397047826531, + 50.63546120720159 + ], + [ + 12.003938001174694, + 50.63482545981212 + ], + [ + 11.998724671322918, + 50.62713562912433 + ], + [ + 11.979268786630927, + 50.62141017779235 + ], + [ + 11.988779760060869, + 50.61073218560725 + ], + [ + 11.967731503979039, + 50.60012744610196 + ], + [ + 11.9599651216343, + 50.60445467594391 + ], + [ + 11.949715469654349, + 50.593897460062244 + ], + [ + 11.93596114006353, + 50.58744037636011 + ], + [ + 11.923565975605475, + 50.58570803210718 + ], + [ + 11.933676233412449, + 50.568524968930845 + ], + [ + 11.923149416259362, + 50.560776274443654 + ], + [ + 11.926010670402864, + 50.55684426945417 + ], + [ + 11.920462122216328, + 50.55555380516839 + ], + [ + 11.91770676637304, + 50.56066327045568 + ], + [ + 11.913725025520154, + 50.55559153511153 + ], + [ + 11.885209238664794, + 50.55194169008261 + ], + [ + 11.871462575392819, + 50.53982273998307 + ], + [ + 11.888217853047898, + 50.51667864064725 + ], + [ + 11.918460470332935, + 50.51698059830353 + ], + [ + 11.916809112472619, + 50.52538820369159 + ], + [ + 11.918915883108015, + 50.52238673739341 + ], + [ + 11.925251274948227, + 50.52631910200815 + ], + [ + 11.930965234947681, + 50.52296360958931 + ], + [ + 11.933976412729082, + 50.50603453689719 + ], + [ + 11.939936731207041, + 50.50299047430753 + ], + [ + 11.943813274279966, + 50.50561478220009 + ], + [ + 11.96483985423426, + 50.48485798060315 + ], + [ + 11.959231112825375, + 50.478674600661975 + ], + [ + 11.946489442314865, + 50.47936051300139 + ], + [ + 11.937693008062011, + 50.471691943954745 + ], + [ + 11.943996426528368, + 50.471105659144904 + ], + [ + 11.943664397214057, + 50.46444812284338 + ], + [ + 11.948392802086698, + 50.465360238033334 + ], + [ + 11.942791292914094, + 50.459577339740456 + ], + [ + 11.950797995930966, + 50.45406897806354 + ], + [ + 11.936293143065361, + 50.45908287822338 + ], + [ + 11.931895131475107, + 50.46422276661048 + ], + [ + 11.927659655455354, + 50.45924736980572 + ], + [ + 11.920343521034823, + 50.460052145064694 + ], + [ + 11.919033658298149, + 50.45432079082774 + ], + [ + 11.904939531102817, + 50.454376613981246 + ], + [ + 11.894996787009193, + 50.44945794797792 + ], + [ + 11.894706067149222, + 50.44405482609147 + ], + [ + 11.888509460621743, + 50.44360591298987 + ], + [ + 11.899640956702497, + 50.43524753804625 + ], + [ + 11.903838153809248, + 50.43671499774452 + ], + [ + 11.906008499029626, + 50.43425561857066 + ], + [ + 11.90815516250408, + 50.436581906462294 + ], + [ + 11.91620742730632, + 50.43306342067497 + ], + [ + 11.926873242685971, + 50.43306668723862 + ], + [ + 11.924237215639753, + 50.426349707619956 + ], + [ + 11.910426092544808, + 50.42220534306933 + ], + [ + 11.906116976150894, + 50.41720074638423 + ], + [ + 11.88239871693384, + 50.41459423596216 + ], + [ + 11.865811748989847, + 50.400672754818984 + ], + [ + 11.857482502295332, + 50.39941249419511 + ], + [ + 11.85235197492743, + 50.40165969858966 + ], + [ + 11.823488647409429, + 50.3896667965724 + ], + [ + 11.8184039909903, + 50.39356776201699 + ], + [ + 11.827908708245022, + 50.40013566908416 + ], + [ + 11.825495291622692, + 50.40442002946951 + ], + [ + 11.817376095504017, + 50.40058974089775 + ], + [ + 11.797352620754747, + 50.41732136937433 + ], + [ + 11.78719764725343, + 50.41525767530621 + ], + [ + 11.780251136900144, + 50.41875475822229 + ], + [ + 11.77260469340058, + 50.41153247844681 + ], + [ + 11.751172550195873, + 50.414755152985364 + ], + [ + 11.761564495698657, + 50.405255872083345 + ], + [ + 11.744046461736216, + 50.410503984004556 + ], + [ + 11.714721166026989, + 50.396635284989564 + ], + [ + 11.708264194750484, + 50.40393828720644 + ], + [ + 11.683895018228705, + 50.39288929553936 + ], + [ + 11.649490107130946, + 50.39223945380322 + ], + [ + 11.624601485353091, + 50.38687040052876 + ], + [ + 11.594313323668995, + 50.40260407615112 + ], + [ + 11.581404222543986, + 50.39900077143192 + ], + [ + 11.573151887878153, + 50.40012188201921 + ], + [ + 11.560064187301641, + 50.3841269910712 + ], + [ + 11.546187641535427, + 50.38412809745892 + ], + [ + 11.51985324242985, + 50.37426848171776 + ], + [ + 11.518909861091734, + 50.39566600932278 + ], + [ + 11.505861835635177, + 50.39651102917785 + ], + [ + 11.503023641824706, + 50.399649929950606 + ], + [ + 11.48985028145153, + 50.39677460350422 + ], + [ + 11.478737316037002, + 50.40121589240215 + ], + [ + 11.479298723537202, + 50.40721300159288 + ], + [ + 11.488121920625062, + 50.41583513611699 + ], + [ + 11.480552673341325, + 50.42546895192576 + ], + [ + 11.481567954000894, + 50.43162169088266 + ], + [ + 11.46315341267077, + 50.43217564485087 + ], + [ + 11.44344196832748, + 50.4208210794734 + ], + [ + 11.45125429308214, + 50.43103282618065 + ], + [ + 11.440544800755896, + 50.43861640323028 + ], + [ + 11.420630678081077, + 50.44336648314133 + ], + [ + 11.419335802094686, + 50.4542377288817 + ], + [ + 11.423595023732142, + 50.462257101808035 + ], + [ + 11.415499785831273, + 50.46784665997477 + ], + [ + 11.420475393831998, + 50.47425877088932 + ], + [ + 11.418090895253933, + 50.481860317341344 + ], + [ + 11.426473637310549, + 50.484540722503795 + ], + [ + 11.421474864788772, + 50.48638045747437 + ], + [ + 11.418814568850967, + 50.49346144433067 + ], + [ + 11.436031952727864, + 50.49218012144793 + ], + [ + 11.440946481470291, + 50.49995944689326 + ], + [ + 11.429278747518152, + 50.51223288237843 + ], + [ + 11.423893014749233, + 50.51606444127539 + ], + [ + 11.40528031884741, + 50.51617606639626 + ], + [ + 11.393085549052895, + 50.520554319126816 + ], + [ + 11.387615010751597, + 50.51564726556461 + ], + [ + 11.369787978513633, + 50.52323971290245 + ], + [ + 11.357760793757798, + 50.5198728996211 + ], + [ + 11.346569074889356, + 50.52153502500367 + ], + [ + 11.343042712461811, + 50.51851947312295 + ], + [ + 11.346991154148153, + 50.51161026959388 + ], + [ + 11.321355016391704, + 50.50856741603549 + ], + [ + 11.323142335609392, + 50.49116491168244 + ], + [ + 11.300936066601832, + 50.48840597809306 + ], + [ + 11.301695275508049, + 50.48501781363764 + ], + [ + 11.290982389916795, + 50.47525652647392 + ], + [ + 11.289114782453701, + 50.485565975523265 + ], + [ + 11.266426129528712, + 50.47910269484423 + ], + [ + 11.257289938257431, + 50.4818175246059 + ], + [ + 11.247115539634605, + 50.477303828766935 + ], + [ + 11.245131948455061, + 50.470802987574345 + ], + [ + 11.25489290442631, + 50.45642278967389 + ], + [ + 11.247092020796241, + 50.44892431495743 + ], + [ + 11.263200077907573, + 50.442888975120674 + ], + [ + 11.268013487661166, + 50.43221228534494 + ], + [ + 11.268842560209718, + 50.41917759335027 + ], + [ + 11.258055653677731, + 50.400038392149256 + ], + [ + 11.270869179465311, + 50.39420350276256 + ], + [ + 11.264587087619054, + 50.39134807360581 + ], + [ + 11.264334054005534, + 50.38703970833588 + ], + [ + 11.272188800488378, + 50.38542158052263 + ], + [ + 11.27608321800122, + 50.380923347652384 + ], + [ + 11.284252879588163, + 50.36030743253344 + ], + [ + 11.277804262935087, + 50.355663290427614 + ], + [ + 11.262435240700952, + 50.3524010312648 + ], + [ + 11.266225800081779, + 50.35199790453014 + ], + [ + 11.277099066816849, + 50.33596244562568 + ], + [ + 11.261328834928923, + 50.33791262517953 + ], + [ + 11.262503547768954, + 50.3253796621547 + ], + [ + 11.256137835029577, + 50.32283933436388 + ], + [ + 11.27033665786838, + 50.306746591112876 + ], + [ + 11.260501760741075, + 50.30008600388214 + ], + [ + 11.251994605247472, + 50.29926494436318 + ], + [ + 11.251817692470944, + 50.29346244069097 + ], + [ + 11.260240655465925, + 50.28709041043553 + ], + [ + 11.25977795716328, + 50.27494627889334 + ], + [ + 11.252298162023932, + 50.269020959240706 + ], + [ + 11.247547121148497, + 50.26775632065697 + ], + [ + 11.235583782375887, + 50.27530818192093 + ], + [ + 11.214449761039303, + 50.280926841430976 + ], + [ + 11.216084591498511, + 50.284180185558085 + ], + [ + 11.19784829294153, + 50.29185636982069 + ], + [ + 11.187139425416255, + 50.269555724927045 + ], + [ + 11.173970554914122, + 50.27127990729255 + ], + [ + 11.183710072489882, + 50.2808954801108 + ], + [ + 11.165504113914022, + 50.28234318921004 + ], + [ + 11.158479682100308, + 50.289203609563124 + ], + [ + 11.153767358603847, + 50.2835443804324 + ], + [ + 11.151479009139152, + 50.28598680230985 + ], + [ + 11.145922827173408, + 50.28495646852973 + ], + [ + 11.141556937130378, + 50.289191925480964 + ], + [ + 11.143197373062865, + 50.293375508553254 + ], + [ + 11.13972621208406, + 50.29296322187895 + ], + [ + 11.137657278128005, + 50.29972418826618 + ], + [ + 11.133158695109259, + 50.30017761003597 + ], + [ + 11.131754612819627, + 50.30808767530409 + ], + [ + 11.138463588897414, + 50.31643203801064 + ], + [ + 11.158177091558874, + 50.32377543055911 + ], + [ + 11.159197358091687, + 50.33039199146011 + ], + [ + 11.13610886914758, + 50.34966562968792 + ], + [ + 11.139107811733158, + 50.35350569587028 + ], + [ + 11.126678465084545, + 50.356178076846795 + ], + [ + 11.121687076149563, + 50.349001657618885 + ], + [ + 11.116797804074718, + 50.3493339308358 + ], + [ + 11.11404543369656, + 50.35252818344322 + ], + [ + 11.119291316927837, + 50.359290104999886 + ], + [ + 11.11530490993664, + 50.3670069019516 + ], + [ + 11.089737219757279, + 50.36588673319466 + ], + [ + 11.081951467632951, + 50.35389927074564 + ], + [ + 11.085753909390952, + 50.35203374144477 + ], + [ + 11.073566957740518, + 50.353651827964505 + ], + [ + 11.042988392866073, + 50.34472164973116 + ], + [ + 11.036863469534369, + 50.34520931524871 + ], + [ + 11.032407061390279, + 50.35150147049458 + ], + [ + 11.04349697175427, + 50.35223236072834 + ], + [ + 11.031702753469817, + 50.35513081894564 + ], + [ + 11.03622734130006, + 50.35868531838078 + ], + [ + 11.033417377285181, + 50.36135823432292 + ], + [ + 10.993487277919842, + 50.36546867599843 + ], + [ + 10.99414897613589, + 50.3534718883307 + ], + [ + 10.999519308221485, + 50.351973047388654 + ], + [ + 10.996370085720391, + 50.34672303662398 + ], + [ + 10.99295430861571, + 50.34903043494011 + ], + [ + 10.985780725613735, + 50.34732052445778 + ], + [ + 10.961619821666636, + 50.36772451811356 + ], + [ + 10.956661342361802, + 50.36848213221651 + ], + [ + 10.96304837140197, + 50.37246608135027 + ], + [ + 10.961786983856365, + 50.37758531657008 + ], + [ + 10.959681308175965, + 50.375307797573946 + ], + [ + 10.94844082954361, + 50.381751354974185 + ], + [ + 10.937634646955537, + 50.39190511293069 + ], + [ + 10.930218425697769, + 50.39203206651488 + ], + [ + 10.911918205547819, + 50.38526083577098 + ], + [ + 10.909415957544587, + 50.38718627325252 + ], + [ + 10.898854082573568, + 50.384713042162595 + ], + [ + 10.89311800357182, + 50.38032394544992 + ], + [ + 10.884868872559922, + 50.38850371723312 + ], + [ + 10.887187525388805, + 50.3925724865464 + ], + [ + 10.877982654639592, + 50.393232323159275 + ], + [ + 10.876235601220516, + 50.39653118939978 + ], + [ + 10.86774415173512, + 50.39427324884217 + ], + [ + 10.861837963381994, + 50.387669720898174 + ], + [ + 10.83044301316154, + 50.39261550008867 + ], + [ + 10.819969595378469, + 50.38489449791915 + ], + [ + 10.81089436329182, + 50.38411950133928 + ], + [ + 10.804250650400578, + 50.37910881397102 + ], + [ + 10.785881505443411, + 50.38538423228036 + ], + [ + 10.773774016366426, + 50.371969356943026 + ], + [ + 10.76294266598796, + 50.36971825373663 + ], + [ + 10.754509496485959, + 50.35817190923728 + ], + [ + 10.738718421505762, + 50.362866487108676 + ], + [ + 10.71526657289234, + 50.36359110723149 + ], + [ + 10.717929965142138, + 50.355542283695286 + ], + [ + 10.712455140892967, + 50.35464378312514 + ], + [ + 10.714303879824152, + 50.34634559423001 + ], + [ + 10.720194358050174, + 50.349563600713026 + ], + [ + 10.728872533242644, + 50.34794160547015 + ], + [ + 10.728148128306696, + 50.33812014462829 + ], + [ + 10.715001981973689, + 50.333031969564395 + ], + [ + 10.714389547414159, + 50.32547919848374 + ], + [ + 10.721804395424437, + 50.3180212633962 + ], + [ + 10.727314871191796, + 50.31862522721175 + ], + [ + 10.736932475731392, + 50.31415201527991 + ], + [ + 10.741845437674753, + 50.31591428456029 + ], + [ + 10.770728870009279, + 50.292672201155334 + ], + [ + 10.794209683035138, + 50.295376176115475 + ], + [ + 10.802550270198811, + 50.2919808997418 + ], + [ + 10.803919858775577, + 50.27975318627091 + ], + [ + 10.826331418455277, + 50.277949037423106 + ], + [ + 10.835925654243658, + 50.27306492224695 + ], + [ + 10.84635813777867, + 50.27509463534138 + ], + [ + 10.851953018088812, + 50.25160305573902 + ], + [ + 10.84466635752339, + 50.243157724048956 + ], + [ + 10.824047415209074, + 50.23753300049124 + ], + [ + 10.807268588623684, + 50.240196710151345 + ], + [ + 10.800564106865881, + 50.251443342797415 + ], + [ + 10.781843580294044, + 50.25128393838272 + ], + [ + 10.784366730078894, + 50.24850648548124 + ], + [ + 10.769631615489898, + 50.240840246892866 + ], + [ + 10.749816626168332, + 50.24247768423574 + ], + [ + 10.74613391054117, + 50.243782950145075 + ], + [ + 10.74820326998294, + 50.247825679151894 + ], + [ + 10.732167774275574, + 50.25183794482833 + ], + [ + 10.726495208022456, + 50.247564698557156 + ], + [ + 10.729807565115843, + 50.24487686696181 + ], + [ + 10.726238672748403, + 50.24088909706153 + ], + [ + 10.731220988364566, + 50.212654207063615 + ], + [ + 10.724403610144606, + 50.206099649820686 + ], + [ + 10.716645149804643, + 50.20481895715644 + ], + [ + 10.708973024174643, + 50.21027663863792 + ], + [ + 10.69575278047006, + 50.21179943393784 + ], + [ + 10.687640987160314, + 50.21907703267567 + ], + [ + 10.686714458178974, + 50.225907583265595 + ], + [ + 10.66367026905671, + 50.221543073854 + ], + [ + 10.657478913801135, + 50.22367513638675 + ], + [ + 10.662290267096644, + 50.22664509688789 + ], + [ + 10.658961146180555, + 50.230709065581294 + ], + [ + 10.637661361062786, + 50.223268777751095 + ], + [ + 10.612047270268253, + 50.224138440972396 + ], + [ + 10.597108476889037, + 50.246172720281095 + ], + [ + 10.611314699904073, + 50.24907497361569 + ], + [ + 10.604630904268493, + 50.25963524828185 + ], + [ + 10.597829214986815, + 50.262620978556896 + ], + [ + 10.607295940495995, + 50.27125747563892 + ], + [ + 10.593478704211453, + 50.26955105494934 + ], + [ + 10.591040414078387, + 50.27178438092268 + ], + [ + 10.59328149195564, + 50.27797238223007 + ], + [ + 10.601550725947279, + 50.28267146818928 + ], + [ + 10.597534202430214, + 50.28918910958033 + ], + [ + 10.605324194668396, + 50.2935369961232 + ], + [ + 10.59235935152285, + 50.30808136141328 + ], + [ + 10.592322639503951, + 50.31718454578052 + ], + [ + 10.600550295951066, + 50.33368802756181 + ], + [ + 10.58339834631509, + 50.33238812616407 + ], + [ + 10.57469002954455, + 50.33669491930109 + ], + [ + 10.561785333514289, + 50.337098473910174 + ], + [ + 10.552290301723584, + 50.344517122983454 + ], + [ + 10.549758531011689, + 50.34927287531528 + ], + [ + 10.554861100512744, + 50.35465610749548 + ], + [ + 10.544408272568399, + 50.36450557769534 + ], + [ + 10.537305796076248, + 50.362679804652046 + ], + [ + 10.53498576948376, + 50.36568008517255 + ], + [ + 10.531010504470707, + 50.36510988349857 + ], + [ + 10.530382572793243, + 50.36096781428463 + ], + [ + 10.526720959601574, + 50.361454365155936 + ], + [ + 10.523626464771146, + 50.35475674799054 + ], + [ + 10.514624395735078, + 50.34989667261107 + ], + [ + 10.512475549775806, + 50.35980609896309 + ], + [ + 10.503276655461383, + 50.353175569567455 + ], + [ + 10.499040397297875, + 50.35771094546025 + ], + [ + 10.492405731014232, + 50.35505584315468 + ], + [ + 10.485990410785856, + 50.36305402211247 + ], + [ + 10.492854683489709, + 50.36215490302423 + ], + [ + 10.494443233436561, + 50.369442973454426 + ], + [ + 10.490560662592058, + 50.36878590187371 + ], + [ + 10.487284513628497, + 50.37528327120083 + ], + [ + 10.47348280375569, + 50.37250990130315 + ], + [ + 10.467091700403655, + 50.37759320595298 + ], + [ + 10.463657887221977, + 50.376014547154625 + ], + [ + 10.449502846068777, + 50.40304676979003 + ], + [ + 10.4379755714941, + 50.40117864280117 + ], + [ + 10.43789863391464, + 50.39548316276006 + ], + [ + 10.423743404246922, + 50.39253245659201 + ], + [ + 10.396499209469694, + 50.39692895815805 + ], + [ + 10.394493696807722, + 50.39365203254817 + ], + [ + 10.384481053506418, + 50.402846229447675 + ], + [ + 10.384519195708778, + 50.40892927611246 + ], + [ + 10.390064188347079, + 50.40994243294825 + ], + [ + 10.403834693086855, + 50.42477512899851 + ], + [ + 10.392829159111544, + 50.42693652219508 + ], + [ + 10.392463618013236, + 50.430335689267025 + ], + [ + 10.370723798702628, + 50.431913097545184 + ], + [ + 10.372643776793275, + 50.43723205697484 + ], + [ + 10.381332035303496, + 50.43885190385921 + ], + [ + 10.376246613679715, + 50.44066076681486 + ], + [ + 10.367271856545905, + 50.43877357058592 + ], + [ + 10.356725791966957, + 50.455190497388244 + ], + [ + 10.348189499965661, + 50.462557577598766 + ], + [ + 10.336154205451939, + 50.46589718695495 + ], + [ + 10.341410872355087, + 50.482999960682264 + ], + [ + 10.332667237936063, + 50.487090499508255 + ], + [ + 10.330582235808203, + 50.49427653337985 + ], + [ + 10.306570060199219, + 50.492079315093065 + ], + [ + 10.291614380864855, + 50.496336109487316 + ], + [ + 10.274599189133532, + 50.50586856337911 + ], + [ + 10.267694210978508, + 50.50419029757001 + ], + [ + 10.256221692644257, + 50.51281333132129 + ], + [ + 10.251390310025293, + 50.51118344282837 + ], + [ + 10.243665084384162, + 50.515017516104024 + ], + [ + 10.230827931193163, + 50.51180310228552 + ], + [ + 10.225792338686666, + 50.51871942302974 + ], + [ + 10.231973530372962, + 50.531087717575296 + ], + [ + 10.224834808537116, + 50.53037809169903 + ], + [ + 10.221641927125846, + 50.538724532551626 + ], + [ + 10.208325658000705, + 50.540630849640856 + ], + [ + 10.203873884032625, + 50.55470084979471 + ], + [ + 10.177893247874422, + 50.55168002957239 + ], + [ + 10.175441103392153, + 50.54291753848592 + ], + [ + 10.150619875569497, + 50.55202357885803 + ], + [ + 10.1468595063469, + 50.54314940739272 + ], + [ + 10.140366562864758, + 50.54285042488886 + ], + [ + 10.120712415014532, + 50.55585721416836 + ], + [ + 10.12664488174707, + 50.55842685744272 + ], + [ + 10.126217971287538, + 50.561350665254615 + ], + [ + 10.11940829439335, + 50.56422474229534 + ], + [ + 10.10709413565403, + 50.56373360138743 + ], + [ + 10.09973944764262, + 50.5581747347722 + ], + [ + 10.098505660798214, + 50.55215997040331 + ], + [ + 10.094044467833616, + 50.55360199607787 + ], + [ + 10.089842055505907, + 50.54481435288431 + ], + [ + 10.076265268942079, + 50.540887271529584 + ], + [ + 10.070046384212969, + 50.5354206328041 + ], + [ + 10.071825447475675, + 50.52767119967596 + ], + [ + 10.06652016979291, + 50.52896505482177 + ], + [ + 10.051960692672125, + 50.519254838011605 + ], + [ + 10.04133840834817, + 50.51646958036796 + ], + [ + 10.039692617864015, + 50.532586194306916 + ], + [ + 10.047898988999908, + 50.539447943398145 + ], + [ + 10.047219088584933, + 50.54551876373349 + ], + [ + 10.061828604818569, + 50.556687382855266 + ], + [ + 10.052467144555282, + 50.56110859514858 + ], + [ + 10.046359122548887, + 50.57125494330287 + ], + [ + 10.0487975885647, + 50.598620734538834 + ], + [ + 10.040271740312768, + 50.60450765357036 + ], + [ + 10.03719106873589, + 50.61292626777508 + ], + [ + 10.04796286747078, + 50.61917736361257 + ], + [ + 10.045470429119806, + 50.621216817122736 + ], + [ + 10.0575038889246, + 50.62612006185502 + ], + [ + 10.067222262177543, + 50.62414586215302 + ], + [ + 10.072264747765665, + 50.61963236869612 + ], + [ + 10.081049838184464, + 50.62002482223614 + ], + [ + 10.082964841544237, + 50.63370534522166 + ], + [ + 10.07858441006985, + 50.63468821050279 + ], + [ + 10.069985062213522, + 50.65587778938285 + ], + [ + 10.051053800743016, + 50.672897047539216 + ], + [ + 10.033373348477202, + 50.675544076690144 + ], + [ + 10.019910494227068, + 50.673132141817995 + ], + [ + 10.001994967970054, + 50.676602566290235 + ], + [ + 9.989540860816934, + 50.67459455121305 + ], + [ + 9.973602968520705, + 50.665946876867196 + ], + [ + 9.960689873475145, + 50.66844394386581 + ], + [ + 9.951484133054073, + 50.665927444396026 + ], + [ + 9.94757515879068, + 50.662304756940344 + ], + [ + 9.949710896379335, + 50.65587253534848 + ], + [ + 9.96890154574764, + 50.641259441234 + ], + [ + 9.960252303999365, + 50.63550575292771 + ], + [ + 9.960722012958694, + 50.62948365212826 + ], + [ + 9.94592754577355, + 50.626825684983274 + ], + [ + 9.926932525533395, + 50.629811917685345 + ], + [ + 9.906105814511017, + 50.6403823423682 + ], + [ + 9.881570694835496, + 50.634026053569904 + ], + [ + 9.876975921558614, + 50.64174343201551 + ], + [ + 9.884220259263289, + 50.65081340991483 + ], + [ + 9.88127320043715, + 50.6733786243984 + ], + [ + 9.894677747340031, + 50.683719936172864 + ], + [ + 9.906224715375433, + 50.684190941878654 + ], + [ + 9.915539995475052, + 50.69369563334715 + ], + [ + 9.923955435412095, + 50.69513052004815 + ], + [ + 9.910651795113989, + 50.700691396284 + ], + [ + 9.908890736424809, + 50.704532449326905 + ], + [ + 9.935162409945027, + 50.72411799705515 + ], + [ + 9.941371631305934, + 50.74183785498917 + ], + [ + 9.93961427645136, + 50.75591997628375 + ], + [ + 9.920126451564789, + 50.759612032892974 + ], + [ + 9.928921270523418, + 50.76963447972193 + ], + [ + 9.925526016743598, + 50.774665789268596 + ], + [ + 9.92843093764796, + 50.77659421164554 + ], + [ + 9.93715367743379, + 50.77410166512487 + ], + [ + 9.948749609940148, + 50.77869226810362 + ], + [ + 9.943318113649369, + 50.771234124200376 + ], + [ + 9.952133926350797, + 50.77329162341066 + ], + [ + 9.954092086205785, + 50.77935638407857 + ], + [ + 9.949779875686469, + 50.78037975150335 + ], + [ + 9.955134945818857, + 50.785550295614755 + ], + [ + 9.943569871321133, + 50.79769790651567 + ], + [ + 9.956677090278758, + 50.809619121479905 + ], + [ + 9.956417425198762, + 50.816051324959425 + ], + [ + 9.95023387611449, + 50.81518083227483 + ], + [ + 9.952252802569106, + 50.82137450717773 + ], + [ + 9.97681640860686, + 50.8332729518737 + ], + [ + 9.998018976409707, + 50.826505139431916 + ], + [ + 10.006836286542148, + 50.83768212741087 + ], + [ + 10.023054523787888, + 50.831631424602264 + ], + [ + 10.028488149416855, + 50.83580828097497 + ], + [ + 10.026806725491298, + 50.8412833324191 + ], + [ + 10.037751702648855, + 50.84529540236945 + ], + [ + 10.038620256504196, + 50.85311491054608 + ], + [ + 10.021928583470489, + 50.84785663224941 + ], + [ + 10.018689019617698, + 50.85567082890117 + ], + [ + 10.021893142541915, + 50.86448629775823 + ], + [ + 10.055981001309238, + 50.87977162384438 + ], + [ + 10.059803703591085, + 50.88539256307137 + ], + [ + 10.056237512526428, + 50.887396618084395 + ], + [ + 10.058444784098688, + 50.89017533311661 + ], + [ + 10.052460866990227, + 50.89260881168969 + ], + [ + 10.053456860490783, + 50.890071327201845 + ], + [ + 10.047868140623665, + 50.88884988390904 + ], + [ + 10.041952475293046, + 50.8933404145218 + ], + [ + 10.050909098573305, + 50.90008887925372 + ], + [ + 10.040697143630334, + 50.90153437627829 + ], + [ + 10.03503025900147, + 50.91002287024081 + ], + [ + 10.024850711270851, + 50.91179925543602 + ], + [ + 10.015635922065208, + 50.92062394940913 + ], + [ + 10.00366394279361, + 50.92155099423676 + ], + [ + 9.986912385703446, + 50.91136814342661 + ], + [ + 9.98524679339433, + 50.907215652482215 + ], + [ + 9.978219755751038, + 50.9052988623773 + ], + [ + 9.971463748708201, + 50.90741093660835 + ], + [ + 9.969632276619526, + 50.91348753971554 + ], + [ + 9.98189245092292, + 50.919947688889536 + ], + [ + 9.991996475037794, + 50.93451450955825 + ], + [ + 9.974855569815931, + 50.931721111704235 + ], + [ + 9.965560176828529, + 50.93358061377089 + ], + [ + 9.966067717145975, + 50.92875499316406 + ], + [ + 9.957144014946902, + 50.922600190435084 + ], + [ + 9.949685257597803, + 50.92650750436961 + ], + [ + 9.956555894977926, + 50.93366159030729 + ], + [ + 9.950086587172375, + 50.94225025484665 + ], + [ + 9.975073801617986, + 50.94342302249407 + ], + [ + 9.982086111901332, + 50.939055016605 + ], + [ + 9.99156088917052, + 50.940896560694 + ], + [ + 9.991072680513224, + 50.94345415818876 + ], + [ + 9.999285361909761, + 50.93664388000772 + ], + [ + 10.00337958458248, + 50.94063232511605 + ], + [ + 10.014007699079478, + 50.9346790221905 + ], + [ + 10.024900853743576, + 50.9437513618399 + ], + [ + 10.029439221206118, + 50.93811304461834 + ], + [ + 10.053615661383242, + 50.939778882688564 + ], + [ + 10.062345938730187, + 50.94378354537778 + ], + [ + 10.061191723340238, + 50.94797274515543 + ], + [ + 10.047868770416072, + 50.94611886568988 + ], + [ + 10.043035337366033, + 50.94862293978813 + ], + [ + 10.042036761922812, + 50.957234267740965 + ], + [ + 10.03216132676979, + 50.95963537019097 + ], + [ + 10.040949143691435, + 50.96752640395313 + ], + [ + 10.019470217432884, + 50.98070807804827 + ], + [ + 10.027674671769518, + 51.006456748971175 + ], + [ + 10.036400427746626, + 51.012376194822714 + ], + [ + 10.05363693771815, + 51.01315428354242 + ], + [ + 10.065666270194376, + 51.00941522534947 + ], + [ + 10.073507813164928, + 51.01136619454358 + ], + [ + 10.103483887932635, + 51.00336718323285 + ], + [ + 10.108295653875237, + 51.00922459326736 + ], + [ + 10.120842833884051, + 51.011700739907184 + ], + [ + 10.13308240884271, + 51.00481911262245 + ], + [ + 10.127376258271871, + 51.00147880544894 + ], + [ + 10.131562779712475, + 50.99689756574201 + ], + [ + 10.14688003218702, + 50.99382352262279 + ], + [ + 10.165844439773613, + 50.99746045900042 + ], + [ + 10.16810688818315, + 51.00132467023677 + ], + [ + 10.173139245561817, + 51.0003390468761 + ], + [ + 10.171587297168664, + 50.996160933309376 + ], + [ + 10.174374024024617, + 50.99857134501001 + ], + [ + 10.178159480163982, + 50.996001541982295 + ], + [ + 10.190785759330884, + 50.9990678845089 + ], + [ + 10.19695317813987, + 51.00663296582166 + ], + [ + 10.202904887204381, + 51.00810587902413 + ], + [ + 10.201211727738055, + 51.013898036065726 + ], + [ + 10.192621925980665, + 51.01853212121083 + ], + [ + 10.195368850264968, + 51.020938957368486 + ], + [ + 10.20855550766371, + 51.018971076158586 + ], + [ + 10.215185734886266, + 51.026419350031354 + ], + [ + 10.202925521841012, + 51.03160727183043 + ], + [ + 10.204746922270228, + 51.03478948052813 + ], + [ + 10.198846623932097, + 51.04009038725506 + ], + [ + 10.184765452053984, + 51.04569456855378 + ], + [ + 10.184671379065689, + 51.049032360358304 + ], + [ + 10.171072591852383, + 51.049182796663814 + ], + [ + 10.14059015693553, + 51.05849138743716 + ], + [ + 10.147021789836966, + 51.06140396129707 + ], + [ + 10.144259386138472, + 51.066002257216695 + ], + [ + 10.15518829159921, + 51.070419264642176 + ], + [ + 10.144694665238312, + 51.084814047640414 + ], + [ + 10.157114980350395, + 51.09631700021953 + ], + [ + 10.165679542972093, + 51.099499914257486 + ], + [ + 10.160415360313063, + 51.10805022347722 + ], + [ + 10.175487552380352, + 51.10690542011866 + ], + [ + 10.174630971694645, + 51.11686745863592 + ], + [ + 10.153791597019543, + 51.118458722123336 + ], + [ + 10.14623038199267, + 51.12578691016114 + ], + [ + 10.139985039486191, + 51.12470736482093 + ], + [ + 10.130822428007468, + 51.135191303488085 + ], + [ + 10.11832156426506, + 51.13957300545099 + ], + [ + 10.127827413170397, + 51.14376043150792 + ], + [ + 10.12572542009371, + 51.14633573154714 + ], + [ + 10.146597291179189, + 51.14455277598603 + ], + [ + 10.168738649190027, + 51.15326771975589 + ], + [ + 10.177453643078225, + 51.14167107291571 + ], + [ + 10.184904856929084, + 51.141120066956645 + ], + [ + 10.18523602245502, + 51.13249386774521 + ], + [ + 10.178483115751966, + 51.13076149015357 + ], + [ + 10.179214909029355, + 51.12764725794295 + ], + [ + 10.189621328506986, + 51.12197839311144 + ], + [ + 10.189454815030487, + 51.116767215645304 + ], + [ + 10.199959021874053, + 51.11297207578593 + ], + [ + 10.209346042369573, + 51.11816927482103 + ], + [ + 10.206190307831212, + 51.12211120727548 + ], + [ + 10.210717393583822, + 51.12290527072966 + ], + [ + 10.20378754567228, + 51.13565509741729 + ], + [ + 10.210689707654977, + 51.14247222376765 + ], + [ + 10.200378267675145, + 51.14993066054587 + ], + [ + 10.207756863003752, + 51.154766338154595 + ], + [ + 10.207323427352021, + 51.16491704696824 + ], + [ + 10.229845756101513, + 51.17491231885627 + ], + [ + 10.235998831584496, + 51.184767340896066 + ], + [ + 10.234499494392091, + 51.1875206892184 + ], + [ + 10.220191519286644, + 51.18574480641868 + ], + [ + 10.211253107639276, + 51.19043651967535 + ], + [ + 10.197013747483279, + 51.192057357070766 + ], + [ + 10.197029799046565, + 51.19654229818497 + ], + [ + 10.187748389048554, + 51.204230781787956 + ], + [ + 10.168444936466432, + 51.212189911536555 + ], + [ + 10.149790732154122, + 51.206189325198274 + ], + [ + 10.143800396256484, + 51.21287513040698 + ], + [ + 10.145397771084468, + 51.218079031678975 + ], + [ + 10.138446493645164, + 51.22021150935903 + ], + [ + 10.113171818442211, + 51.215206065408815 + ], + [ + 10.106339003515954, + 51.22160659227665 + ], + [ + 10.093513282025931, + 51.22145261520202 + ], + [ + 10.09028269042563, + 51.22666898656724 + ], + [ + 10.07643356226162, + 51.22373451531667 + ], + [ + 10.068673433889751, + 51.22656282046124 + ], + [ + 10.070795869024387, + 51.238054266413954 + ], + [ + 10.078995134182765, + 51.242780926542785 + ], + [ + 10.069058845065316, + 51.24376113826862 + ], + [ + 10.06187540453447, + 51.2525614563749 + ], + [ + 10.046969080880793, + 51.253425736004566 + ], + [ + 10.05011653671058, + 51.25871576503077 + ], + [ + 10.046554099817815, + 51.26450096949526 + ], + [ + 10.057451668902498, + 51.26765633445984 + ], + [ + 10.05991618687408, + 51.275865487642896 + ], + [ + 10.041409797836593, + 51.28039211227666 + ], + [ + 10.02998733268391, + 51.2778816468862 + ], + [ + 10.004331313783283, + 51.286983011458936 + ], + [ + 9.983447831561861, + 51.28333607943483 + ], + [ + 9.972977323647418, + 51.28435115519915 + ], + [ + 9.976383632465128, + 51.29140223992196 + ], + [ + 9.97063803723887, + 51.29440850498475 + ], + [ + 9.969853097861247, + 51.300271136929624 + ], + [ + 9.960183999945514, + 51.30480661153413 + ], + [ + 9.94712950109264, + 51.30300034997428 + ], + [ + 9.93993473671191, + 51.306862012975564 + ], + [ + 9.94903668088304, + 51.31755779556425 + ], + [ + 9.947566751394612, + 51.326395110947274 + ], + [ + 9.943447818022598, + 51.334509088256894 + ], + [ + 9.929936553547739, + 51.339968506701176 + ], + [ + 9.932820923317616, + 51.34603756110253 + ], + [ + 9.925469057843006, + 51.35379334313917 + ], + [ + 9.925462062256951, + 51.372121480620685 + ], + [ + 9.941998422070181, + 51.378428531503054 + ], + [ + 9.965943385508153, + 51.3954768529318 + ], + [ + 9.987396260898809, + 51.39792255651991 + ], + [ + 9.994024725286671, + 51.403885080847004 + ], + [ + 10.000375476438828, + 51.4036551539765 + ], + [ + 10.000780211380238, + 51.407777861254814 + ], + [ + 10.007607687600888, + 51.41100057100622 + ], + [ + 10.009328775043759, + 51.42060355157446 + ], + [ + 10.03784371988374, + 51.42000493706562 + ], + [ + 10.042839761189333, + 51.427565673769934 + ], + [ + 10.05144247114334, + 51.43032135572857 + ], + [ + 10.046672523120987, + 51.43676281921434 + ], + [ + 10.05878204634409, + 51.43489252931593 + ], + [ + 10.059694010940367, + 51.42828697284843 + ], + [ + 10.065619754818378, + 51.42499545263308 + ], + [ + 10.064526483039655, + 51.4198211193522 + ], + [ + 10.06910808870457, + 51.41843830335814 + ], + [ + 10.075219913545407, + 51.419517449214666 + ], + [ + 10.079582876608221, + 51.425306089610324 + ], + [ + 10.080107993402498, + 51.434560233171425 + ], + [ + 10.090837988356414, + 51.435654948405364 + ], + [ + 10.116933377480668, + 51.43022977820057 + ], + [ + 10.121105093991265, + 51.434156688748956 + ], + [ + 10.131754965780882, + 51.435530451354815 + ], + [ + 10.140393809920441, + 51.42971824961089 + ], + [ + 10.15039877402674, + 51.429424526331964 + ], + [ + 10.154470343617403, + 51.431532811934346 + ], + [ + 10.141098212716205, + 51.43719013395015 + ], + [ + 10.140004544928212, + 51.442614116075234 + ], + [ + 10.152150064971085, + 51.44714438862402 + ], + [ + 10.155819130957916, + 51.443619448076475 + ], + [ + 10.15880583563931, + 51.44675490445717 + ], + [ + 10.167618498815218, + 51.44444508678692 + ], + [ + 10.174306043331994, + 51.446256097602046 + ], + [ + 10.180194512012733, + 51.45578884601784 + ], + [ + 10.177202022044895, + 51.45743607489433 + ], + [ + 10.186011891536417, + 51.46217418742218 + ], + [ + 10.178251589758881, + 51.470016353886486 + ], + [ + 10.201975121411838, + 51.486519768660344 + ], + [ + 10.20572217944474, + 51.48724330148834 + ], + [ + 10.212821835478378, + 51.478662934446746 + ], + [ + 10.218201974927803, + 51.478539638740905 + ], + [ + 10.21694604343835, + 51.47007501148554 + ], + [ + 10.226711304046443, + 51.4738114683735 + ], + [ + 10.23317301286644, + 51.4708463829359 + ], + [ + 10.237759443223455, + 51.47746427811781 + ], + [ + 10.243699938063678, + 51.47856280579248 + ], + [ + 10.244677551323745, + 51.483735085050604 + ], + [ + 10.272759014877009, + 51.48822097387354 + ], + [ + 10.273233167325579, + 51.49139163785836 + ], + [ + 10.28442933601233, + 51.494440472275386 + ], + [ + 10.299669826377952, + 51.493896093058886 + ], + [ + 10.299850417790578, + 51.50495074136436 + ], + [ + 10.30881763563502, + 51.51513978198134 + ], + [ + 10.318031301155678, + 51.513977912814426 + ], + [ + 10.342275478001767, + 51.51949714600088 + ], + [ + 10.348125353284576, + 51.53217339716891 + ], + [ + 10.367664032754314, + 51.543036462401346 + ], + [ + 10.372184973632212, + 51.552992735494215 + ], + [ + 10.36536503979993, + 51.55589099234147 + ], + [ + 10.378624329139232, + 51.56270666557081 + ], + [ + 10.378998560066782, + 51.56857269708051 + ], + [ + 10.37879102954003, + 51.57938136855905 + ], + [ + 10.370023394490042, + 51.58753647641246 + ], + [ + 10.40630345233819, + 51.5865002873712 + ], + [ + 10.429199988538747, + 51.592532978818475 + ], + [ + 10.444382461913786, + 51.58965620845999 + ], + [ + 10.4509737150339, + 51.58402631448628 + ], + [ + 10.467039375310346, + 51.583380764124364 + ], + [ + 10.495695850954549, + 51.57278824463772 + ], + [ + 10.509581470145138, + 51.55679233583436 + ], + [ + 10.51897376125845, + 51.553763453188445 + ], + [ + 10.534052416582355, + 51.55935853628575 + ], + [ + 10.545460227630803, + 51.55573415908262 + ], + [ + 10.56026902993225, + 51.55706798652606 + ], + [ + 10.569985100740205, + 51.56334159621501 + ], + [ + 10.576491678635488, + 51.562680594588535 + ], + [ + 10.577367956297882, + 51.565964835416764 + ], + [ + 10.587912279841973, + 51.5675855726244 + ], + [ + 10.604264264080246, + 51.57957530972973 + ], + [ + 10.621637070378135, + 51.57577401911091 + ], + [ + 10.62795485058714, + 51.572064953196474 + ], + [ + 10.626600308666664, + 51.56775714761241 + ], + [ + 10.636525144976394, + 51.56222650367388 + ], + [ + 10.645524042068871, + 51.562778309395085 + ], + [ + 10.644767149439904, + 51.56001727609204 + ], + [ + 10.65679616564362, + 51.558301645546585 + ], + [ + 10.666306959474996, + 51.57809868286582 + ], + [ + 10.658364256862148, + 51.58189707739443 + ], + [ + 10.638674695265001, + 51.58411696418498 + ], + [ + 10.633496085008687, + 51.60790292071481 + ], + [ + 10.649000507261986, + 51.606514213192064 + ], + [ + 10.639299577952203, + 51.615608288300464 + ], + [ + 10.640236799430758, + 51.6220053290334 + ], + [ + 10.672937071877797, + 51.62950264845959 + ], + [ + 10.682480919162781, + 51.62891703117605 + ], + [ + 10.675842715368255, + 51.6332115614889 + ], + [ + 10.677282757060635, + 51.63837585835886 + ], + [ + 10.698685310477906, + 51.63948433063857 + ], + [ + 10.701371992415018, + 51.64218764258903 + ], + [ + 10.709115289233587, + 51.64069881589268 + ], + [ + 10.737087376277564, + 51.64507247508976 + ], + [ + 10.749365654893545, + 51.64033430064142 + ], + [ + 10.756121767270075, + 51.64174800562015 + ], + [ + 10.755681214173396, + 51.64506227553569 + ], + [ + 10.76451121395882, + 51.649008273821785 + ], + [ + 10.771296376271309, + 51.644602738197186 + ], + [ + 10.788542128804279, + 51.64152116272316 + ] + ], + [ + [ + 11.443948290498883, + 51.197363244711745 + ], + [ + 11.445382895159554, + 51.193986453841546 + ], + [ + 11.446614450389683, + 51.198880346644536 + ], + [ + 11.43938578454155, + 51.199766399347865 + ], + [ + 11.443948290498883, + 51.197363244711745 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 1, + "BSG": 1, + "RS": "03", + "AGS": "03", + "SDV_RS": "032410001001", + "GEN": "Niedersachsen", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "03", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE9", + "RS_0": "030000000000", + "AGS_0": "03000000", + "WSK": "2015/01/01", + "DEBKG_ID": "DEBKGDL20000QFG5", + "destatis": { + "population": 7826739, + "population_m": 3846089, + "population_w": 3980650 + } + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 8.21994444028587, + 53.97841179206505 + ], + [ + 8.429025333986305, + 53.89341587046223 + ], + [ + 8.534008838793445, + 53.88508348466467 + ], + [ + 8.57315283626564, + 53.844680055454916 + ], + [ + 8.566060343647457, + 53.84595761144613 + ], + [ + 8.541967178549198, + 53.8071399436569 + ], + [ + 8.537742594973896, + 53.79214080093758 + ], + [ + 8.54471624183884, + 53.788874352661864 + ], + [ + 8.541012727291438, + 53.786006649487206 + ], + [ + 8.53917767614578, + 53.78881077433555 + ], + [ + 8.528981476268477, + 53.76850704577728 + ], + [ + 8.532787377598522, + 53.76720139330704 + ], + [ + 8.528541825448334, + 53.76765202819693 + ], + [ + 8.518485450246967, + 53.75147074045836 + ], + [ + 8.52192291685659, + 53.750572949931865 + ], + [ + 8.48335054816182, + 53.69478407086418 + ], + [ + 8.481675784831586, + 53.67468749133987 + ], + [ + 8.483953343271075, + 53.655912765538275 + ], + [ + 8.52041036342612, + 53.606204878131486 + ], + [ + 8.483202468858675, + 53.600498985179506 + ], + [ + 8.503567174835439, + 53.57237960747693 + ], + [ + 8.556376714417741, + 53.53492210981658 + ], + [ + 8.556702966623844, + 53.52661570632985 + ], + [ + 8.55489825002007, + 53.52513102609373 + ], + [ + 8.549835661132805, + 53.53821026458052 + ], + [ + 8.534242834258347, + 53.54106601943924 + ], + [ + 8.516871201745486, + 53.55012081968795 + ], + [ + 8.517614478514556, + 53.55830070594653 + ], + [ + 8.502754124423078, + 53.55072088364061 + ], + [ + 8.476436612014755, + 53.55397400898337 + ], + [ + 8.464465384459787, + 53.55246966968755 + ], + [ + 8.384470610165458, + 53.57390633354486 + ], + [ + 8.358219070953856, + 53.597945631000535 + ], + [ + 8.353918415642868, + 53.59698682078916 + ], + [ + 8.356504045125046, + 53.59960055799297 + ], + [ + 8.348978684418517, + 53.60617886506624 + ], + [ + 8.332633139134215, + 53.6133173380767 + ], + [ + 8.306412656677635, + 53.617682065475826 + ], + [ + 8.274476048534522, + 53.607087391072774 + ], + [ + 8.251516423229733, + 53.592543548622764 + ], + [ + 8.24297266580456, + 53.58239792235548 + ], + [ + 8.234318135496181, + 53.533762491038885 + ], + [ + 8.230826529968585, + 53.520775994028064 + ], + [ + 8.226915998354722, + 53.520083711981144 + ], + [ + 8.265547614900159, + 53.518541136509945 + ], + [ + 8.300071054656758, + 53.52585128278608 + ], + [ + 8.30941483402875, + 53.52282044587164 + ], + [ + 8.316077823560315, + 53.5141935248433 + ], + [ + 8.315217678689772, + 53.46179595993149 + ], + [ + 8.309525291088542, + 53.44887338806272 + ], + [ + 8.296343620362837, + 53.44157319866216 + ], + [ + 8.29764972250838, + 53.43063028723536 + ], + [ + 8.280468550763683, + 53.41337354762738 + ], + [ + 8.263748682180024, + 53.403150790789596 + ], + [ + 8.247009265985742, + 53.397716648036685 + ], + [ + 8.212110889271418, + 53.40118200010008 + ], + [ + 8.18977506719447, + 53.40959526903226 + ], + [ + 8.195372297630959, + 53.41219800982392 + ], + [ + 8.147046658210868, + 53.450052275801966 + ], + [ + 8.136941709686106, + 53.45268969599508 + ], + [ + 8.121530452856254, + 53.451726884562675 + ], + [ + 8.108940542617107, + 53.445651824840105 + ], + [ + 8.106697751957402, + 53.44806981072798 + ], + [ + 8.098998753460604, + 53.4456768418694 + ], + [ + 8.070897637478643, + 53.4649239837289 + ], + [ + 8.061118314926233, + 53.48260473067246 + ], + [ + 8.06132696259109, + 53.505956798164576 + ], + [ + 8.075224043017815, + 53.50208805734688 + ], + [ + 8.092631908452349, + 53.501915374447904 + ], + [ + 8.15465247454364, + 53.51454450540612 + ], + [ + 8.16477092350356, + 53.523271024618246 + ], + [ + 8.171247356905651, + 53.54021632384229 + ], + [ + 8.156040733542293, + 53.560724931264204 + ], + [ + 8.15133996807778, + 53.56082784859756 + ], + [ + 8.154395889965205, + 53.56383354839903 + ], + [ + 8.142359620732496, + 53.5796683784117 + ], + [ + 8.154433007520199, + 53.582900088247506 + ], + [ + 8.155599196467382, + 53.58575279771611 + ], + [ + 8.148863793622139, + 53.60183230581196 + ], + [ + 8.123346058832649, + 53.59860891661552 + ], + [ + 8.115572777968845, + 53.61455314385892 + ], + [ + 8.086670665013942, + 53.64363812724668 + ], + [ + 8.071187331910872, + 53.64709324472785 + ], + [ + 8.060519912627637, + 53.64241158234368 + ], + [ + 8.04232457810378, + 53.641385380397956 + ], + [ + 8.022061847024819, + 53.682905503207365 + ], + [ + 8.025754521768272, + 53.68466787054832 + ], + [ + 8.02360039604799, + 53.69212668272242 + ], + [ + 8.031651176321606, + 53.699479123338314 + ], + [ + 8.032130327160234, + 53.70527752555622 + ], + [ + 8.02685142574406, + 53.70788373241204 + ], + [ + 7.989857602840934, + 53.7140478503665 + ], + [ + 7.913326656611874, + 53.71783893238596 + ], + [ + 7.811680041240487, + 53.71148870051064 + ], + [ + 7.787804339169103, + 53.70942046736106 + ], + [ + 7.762996777126802, + 53.701699270199015 + ], + [ + 7.743120952519726, + 53.69973099493798 + ], + [ + 7.717559923964582, + 53.699592571526885 + ], + [ + 7.705828040776386, + 53.70344390204883 + ], + [ + 7.704646402176313, + 53.700137609856455 + ], + [ + 7.703838767770715, + 53.70351795369481 + ], + [ + 7.630539059907857, + 53.68883612979823 + ], + [ + 7.605921386692497, + 53.686550239724376 + ], + [ + 7.584429477805154, + 53.67950352374315 + ], + [ + 7.570601342757935, + 53.68042727305103 + ], + [ + 7.574327877700864, + 53.67510076510427 + ], + [ + 7.56957464052823, + 53.67999664817154 + ], + [ + 7.562794499692318, + 53.67573476200238 + ], + [ + 7.540485393035386, + 53.675203333151096 + ], + [ + 7.527114210227, + 53.671499794212984 + ], + [ + 7.515830242724792, + 53.67221102165475 + ], + [ + 7.480575982429153, + 53.68321072139289 + ], + [ + 7.381121709317028, + 53.681791729423864 + ], + [ + 7.36609120749772, + 53.6853098914217 + ], + [ + 7.360147919417685, + 53.6829583703299 + ], + [ + 7.360028445449537, + 53.68684560586183 + ], + [ + 7.331279777241057, + 53.6849960834446 + ], + [ + 7.290037187186682, + 53.67950764920028 + ], + [ + 7.281123230449029, + 53.67427457351914 + ], + [ + 7.243064732340629, + 53.66853916016499 + ], + [ + 7.231542885781529, + 53.66397290964915 + ], + [ + 7.221927570985146, + 53.657031791631816 + ], + [ + 7.182598817381326, + 53.64087219725976 + ], + [ + 7.170177253037975, + 53.62886842913096 + ], + [ + 7.166382020475048, + 53.62718603945052 + ], + [ + 7.156217074822218, + 53.63017230254254 + ], + [ + 7.14516835225513, + 53.610995228994724 + ], + [ + 7.112405360802028, + 53.59482231145564 + ], + [ + 7.090335705374252, + 53.579652244708925 + ], + [ + 7.087254227864141, + 53.5710916280083 + ], + [ + 7.120752540440499, + 53.55049812700618 + ], + [ + 7.117653085192565, + 53.548199784779364 + ], + [ + 7.127881528832905, + 53.54130715958044 + ], + [ + 7.136136935082932, + 53.541508755878965 + ], + [ + 7.13223394183362, + 53.53964612659768 + ], + [ + 7.1385177897058, + 53.53548083889804 + ], + [ + 7.122331302947595, + 53.52520902473599 + ], + [ + 7.100759533509834, + 53.52473524086287 + ], + [ + 7.099796375197489, + 53.515021659187354 + ], + [ + 7.088601052037378, + 53.517145704608296 + ], + [ + 7.076756058690663, + 53.532739715769445 + ], + [ + 7.072259727037678, + 53.52736001190276 + ], + [ + 7.062390035430844, + 53.52423359009582 + ], + [ + 7.039746023015961, + 53.53836248199039 + ], + [ + 7.03414545066585, + 53.54567022972755 + ], + [ + 7.036769804529378, + 53.536307730490684 + ], + [ + 7.029007264383163, + 53.53198348454663 + ], + [ + 7.048688446845871, + 53.508071890101164 + ], + [ + 7.024107546729883, + 53.48237144926262 + ], + [ + 7.010322348911057, + 53.42407633020484 + ], + [ + 7.01272791950764, + 53.40639163644866 + ], + [ + 7.007502454667017, + 53.39312309857143 + ], + [ + 7.011055096793426, + 53.38529934601875 + ], + [ + 7.007831881694504, + 53.3777614934319 + ], + [ + 6.997958942212463, + 53.37136721432694 + ], + [ + 7.000003664044312, + 53.35887967935262 + ], + [ + 7.012918474610112, + 53.344669090635975 + ], + [ + 7.02870546233893, + 53.33633698357531 + ], + [ + 7.049129172519282, + 53.3385053615193 + ], + [ + 7.060495437653347, + 53.33464059637245 + ], + [ + 7.225654840834012, + 53.333768055085386 + ], + [ + 7.265760916241148, + 53.32719714743154 + ], + [ + 7.249576554873824, + 53.324885699789874 + ], + [ + 7.245060267467633, + 53.318297603161696 + ], + [ + 7.19111572852923, + 53.31760156543374 + ], + [ + 7.192054516845962, + 53.31430708639958 + ], + [ + 7.098433227887971, + 53.30899405605468 + ], + [ + 7.05699362214594, + 53.301224807013114 + ], + [ + 7.039192637704648, + 53.3087047526803 + ], + [ + 6.997374399228091, + 53.3141132891113 + ], + [ + 6.953639307279422, + 53.32712778216584 + ], + [ + 6.931610258708974, + 53.33411061591957 + ], + [ + 6.905869456691999, + 53.34889041984791 + ], + [ + 6.890138862065609, + 53.381685883633004 + ], + [ + 6.88205018647277, + 53.419050085425994 + ], + [ + 6.892976957696394, + 53.438391923814336 + ], + [ + 6.878654619590082, + 53.448885258047945 + ], + [ + 6.845662588105117, + 53.45972398891365 + ], + [ + 6.802194982256973, + 53.466901923587656 + ], + [ + 6.728750108718157, + 53.485747928680546 + ], + [ + 6.709221484550453, + 53.49349881342291 + ], + [ + 6.69808411693395, + 53.4940374304947 + ], + [ + 6.696275903106793, + 53.499569532587515 + ], + [ + 6.683627817439264, + 53.49664088162636 + ], + [ + 6.682584743331741, + 53.50168362264296 + ], + [ + 6.68730568921799, + 53.50397138183956 + ], + [ + 6.672539578348898, + 53.51093722617604 + ], + [ + 6.658021034494777, + 53.52689842091023 + ], + [ + 6.628465295871267, + 53.53068000919316 + ], + [ + 6.62650545808684, + 53.53746624119297 + ], + [ + 6.614538926943743, + 53.544306518269735 + ], + [ + 6.613508479908722, + 53.55386631150965 + ], + [ + 6.569794775686261, + 53.5697197512368 + ], + [ + 6.551246451322279, + 53.58261351996936 + ], + [ + 6.412673845432357, + 53.604285077619316 + ], + [ + 6.345854361679566, + 53.72449722383038 + ], + [ + 6.395548920258796, + 53.76066551565258 + ], + [ + 6.458105125037717, + 53.78897258582234 + ], + [ + 6.53010627537794, + 53.80786279587442 + ], + [ + 6.591885290920003, + 53.81550255284371 + ], + [ + 6.666247248396596, + 53.846893173164396 + ], + [ + 6.726720448698543, + 53.862560942718225 + ], + [ + 6.800277434316818, + 53.8734231406251 + ], + [ + 6.896696283558714, + 53.8772575734216 + ], + [ + 6.960030931662192, + 53.88395286974585 + ], + [ + 7.095866570954277, + 53.916205249546714 + ], + [ + 7.186924059101099, + 53.92462309939895 + ], + [ + 7.261286924643778, + 53.925596104137135 + ], + [ + 7.289759726449505, + 53.929152057439595 + ], + [ + 7.36614990550135, + 53.94793118997973 + ], + [ + 7.412011928497253, + 53.95451519104499 + ], + [ + 7.454596176809, + 53.95826573622649 + ], + [ + 7.53284802263328, + 53.95957212014986 + ], + [ + 7.618599591523477, + 53.97685129768138 + ], + [ + 7.697712426998013, + 53.983268957343334 + ], + [ + 7.727935090292497, + 53.993325130534004 + ], + [ + 7.865971663650991, + 54.02235348200651 + ], + [ + 8.104499560461521, + 54.02505000832733 + ], + [ + 8.21994444028587, + 53.97841179206505 + ] + ], + [ + [ + 6.680755758665663, + 53.604050227571676 + ], + [ + 6.667021848838204, + 53.603196280738864 + ], + [ + 6.65470795845286, + 53.59667146619434 + ], + [ + 6.656973736562668, + 53.58364836999978 + ], + [ + 6.665334765829411, + 53.577523957742365 + ], + [ + 6.718858275706664, + 53.55841774594584 + ], + [ + 6.722216236981599, + 53.55860066135981 + ], + [ + 6.718985134052029, + 53.5670314983986 + ], + [ + 6.734130966119054, + 53.5697087959801 + ], + [ + 6.744297571890541, + 53.56233974542538 + ], + [ + 6.74108490806366, + 53.556956040863014 + ], + [ + 6.756644019809992, + 53.56128022821057 + ], + [ + 6.757661013290504, + 53.56761952593043 + ], + [ + 6.741363234956417, + 53.57085599303054 + ], + [ + 6.738571858491539, + 53.57544892061347 + ], + [ + 6.732857977431715, + 53.57584600369764 + ], + [ + 6.727190430078238, + 53.58126723781023 + ], + [ + 6.716662064756662, + 53.5822781517087 + ], + [ + 6.71811012806304, + 53.58403653243215 + ], + [ + 6.73556944273322, + 53.58709349021537 + ], + [ + 6.754629496687834, + 53.596242906084775 + ], + [ + 6.796886242458153, + 53.597183937254044 + ], + [ + 6.813217990633832, + 53.602338091372935 + ], + [ + 6.778030825866715, + 53.61466073856937 + ], + [ + 6.758724476549351, + 53.61782848465808 + ], + [ + 6.680755758665663, + 53.604050227571676 + ] + ], + [ + [ + 7.3401683309261, + 53.717486162299934 + ], + [ + 7.346966784749553, + 53.718658688813996 + ], + [ + 7.347234775606133, + 53.723604942456255 + ], + [ + 7.331965090288944, + 53.72706977994233 + ], + [ + 7.19042043707351, + 53.723055920195414 + ], + [ + 7.148208508039297, + 53.71267307830381 + ], + [ + 7.137296138242692, + 53.706975536912395 + ], + [ + 7.142038017541003, + 53.70060779233003 + ], + [ + 7.152755845994021, + 53.69687666268659 + ], + [ + 7.164608147618412, + 53.69755319338176 + ], + [ + 7.16945157665491, + 53.701206086778804 + ], + [ + 7.165098446621409, + 53.706347149640024 + ], + [ + 7.170355802803735, + 53.7078528064029 + ], + [ + 7.177801614886327, + 53.70133311153669 + ], + [ + 7.195383472816975, + 53.69914717800523 + ], + [ + 7.208766399256479, + 53.706599396639504 + ], + [ + 7.215462468336977, + 53.70359024531514 + ], + [ + 7.270238321322113, + 53.703690349863734 + ], + [ + 7.294932627986038, + 53.708027823016515 + ], + [ + 7.288764389999351, + 53.71153878045059 + ], + [ + 7.30060726562843, + 53.70887576900638 + ], + [ + 7.3401683309261, + 53.717486162299934 + ] + ], + [ + [ + 7.510753452874047, + 53.74264424668383 + ], + [ + 7.571564573116831, + 53.748425319023085 + ], + [ + 7.629776555936131, + 53.745742440973345 + ], + [ + 7.631398309074988, + 53.748539460121144 + ], + [ + 7.625693306955793, + 53.75471132833222 + ], + [ + 7.593289896732371, + 53.759070648293076 + ], + [ + 7.489966599840642, + 53.75650069508749 + ], + [ + 7.477306498066421, + 53.75330030664933 + ], + [ + 7.469256590052603, + 53.74610934124962 + ], + [ + 7.461113078382665, + 53.72418866463517 + ], + [ + 7.475435156771283, + 53.720708689606916 + ], + [ + 7.482648434729344, + 53.72602345018203 + ], + [ + 7.491830334782717, + 53.72260666327494 + ], + [ + 7.504916724440724, + 53.72363740212068 + ], + [ + 7.50186530405515, + 53.73534002764395 + ], + [ + 7.510753452874047, + 53.74264424668383 + ] + ], + [ + [ + 7.69201994775339, + 53.75873171053006 + ], + [ + 7.693341867177213, + 53.76296966914897 + ], + [ + 7.702442432381079, + 53.763757068573184 + ], + [ + 7.757310595581929, + 53.760430883206354 + ], + [ + 7.814399332295091, + 53.77501997040596 + ], + [ + 7.815360877009079, + 53.78091584890832 + ], + [ + 7.698067032439545, + 53.780630111207955 + ], + [ + 7.678089927040024, + 53.77344558069566 + ], + [ + 7.665322794279015, + 53.761070337989246 + ], + [ + 7.669600252223757, + 53.753936489043234 + ], + [ + 7.681996684768745, + 53.750857324579925 + ], + [ + 7.69201994775339, + 53.75873171053006 + ] + ], + [ + [ + 7.063379045696181, + 53.686787481224016 + ], + [ + 6.869396469340474, + 53.671391553330196 + ], + [ + 6.851816677909825, + 53.66304844077124 + ], + [ + 6.860345242279399, + 53.662271443720236 + ], + [ + 6.874884953950093, + 53.66669703035132 + ], + [ + 6.886932548243639, + 53.664079090045405 + ], + [ + 6.918431745562989, + 53.66591635917628 + ], + [ + 6.970747967799925, + 53.67215871133912 + ], + [ + 6.976176893995561, + 53.66959927100876 + ], + [ + 6.988418620796075, + 53.67423667165952 + ], + [ + 6.995977717606451, + 53.67023851491404 + ], + [ + 6.995911609559063, + 53.67428588906713 + ], + [ + 7.016866995810597, + 53.67400618330745 + ], + [ + 7.051643248553896, + 53.679054898018485 + ], + [ + 7.088523631842541, + 53.67992325752029 + ], + [ + 7.095617475896664, + 53.67696655319814 + ], + [ + 7.099752608494291, + 53.680949807279504 + ], + [ + 7.092227011125651, + 53.685560567479314 + ], + [ + 7.063379045696181, + 53.686787481224016 + ] + ], + [ + [ + 7.877918844617008, + 53.79455699849403 + ], + [ + 7.864608563032286, + 53.7938848159248 + ], + [ + 7.846417509508545, + 53.787975095193744 + ], + [ + 7.864772766781386, + 53.773067318340665 + ], + [ + 7.875557601216512, + 53.788576489617164 + ], + [ + 7.913324116502394, + 53.78047347199809 + ], + [ + 7.9350192742147, + 53.77986016205206 + ], + [ + 7.945264611088658, + 53.78239212240215 + ], + [ + 7.969431973262648, + 53.77576431404563 + ], + [ + 7.968849402569134, + 53.77923333614798 + ], + [ + 7.974228631850302, + 53.780309851932344 + ], + [ + 7.977601276558898, + 53.776575258313414 + ], + [ + 7.97258710350359, + 53.78233917820967 + ], + [ + 7.954792714773673, + 53.78697125487866 + ], + [ + 7.904464218856722, + 53.7939867710323 + ], + [ + 7.877918844617008, + 53.79455699849403 + ] + ], + [ + [ + 7.362521646200639, + 53.72077473298848 + ], + [ + 7.372684666326032, + 53.722816128139584 + ], + [ + 7.387160966740923, + 53.72008764246763 + ], + [ + 7.425064989579181, + 53.72013006468972 + ], + [ + 7.431967014875174, + 53.72294206649767 + ], + [ + 7.435253650701097, + 53.72982783093191 + ], + [ + 7.421769665587981, + 53.73384752395681 + ], + [ + 7.388801581175855, + 53.73587935555463 + ], + [ + 7.36043481372399, + 53.72802625076782 + ], + [ + 7.362521646200639, + 53.72077473298848 + ] + ], + [ + [ + 8.140891561448504, + 53.730068219111175 + ], + [ + 8.1243509072943, + 53.71844491479621 + ], + [ + 8.124006941308501, + 53.70930536242514 + ], + [ + 8.137405721441738, + 53.7150556145272 + ], + [ + 8.152815442999279, + 53.71256580604267 + ], + [ + 8.163489230887045, + 53.722114363376704 + ], + [ + 8.186005492115743, + 53.72853008829377 + ], + [ + 8.165411201805934, + 53.73188764722782 + ], + [ + 8.140891561448504, + 53.730068219111175 + ] + ], + [ + [ + 6.876197262802984, + 53.64628758996104 + ], + [ + 6.864963692075823, + 53.64312542343725 + ], + [ + 6.873132640398606, + 53.63158333174504 + ], + [ + 6.885494503636901, + 53.62592352808889 + ], + [ + 6.896579173256933, + 53.626485226097024 + ], + [ + 6.891464334832098, + 53.6316914201487 + ], + [ + 6.899183964951272, + 53.64005669112935 + ], + [ + 6.910214478600123, + 53.64375724498301 + ], + [ + 6.898878489956634, + 53.64861630974117 + ], + [ + 6.905670645910909, + 53.65224129112005 + ], + [ + 6.895325254188093, + 53.65332065439109 + ], + [ + 6.876197262802984, + 53.64628758996104 + ] + ], + [ + [ + 8.005491661284658, + 53.77707503217408 + ], + [ + 7.993838865481193, + 53.76968607581576 + ], + [ + 8.003871601658352, + 53.76499203745875 + ], + [ + 8.006208253719773, + 53.76864231768747 + ], + [ + 8.013458496666907, + 53.76581879957506 + ], + [ + 8.014702980457624, + 53.769522278856655 + ], + [ + 8.017878765768312, + 53.768590729227235 + ], + [ + 8.015878150066678, + 53.776776933838065 + ], + [ + 8.008884215511337, + 53.78090945187028 + ], + [ + 8.005491661284658, + 53.77707503217408 + ] + ], + [ + [ + 8.023326713882343, + 53.75748141526138 + ], + [ + 8.010851618563532, + 53.76079110517928 + ], + [ + 8.007700090723091, + 53.75383547203991 + ], + [ + 8.014082862711295, + 53.74723299069316 + ], + [ + 8.024881911055154, + 53.74356598306915 + ], + [ + 8.023326713882343, + 53.75748141526138 + ] + ], + [ + [ + 6.863010595707465, + 53.59217967748938 + ], + [ + 6.863739487188561, + 53.589005510040764 + ], + [ + 6.868922264440023, + 53.59189273676996 + ], + [ + 6.865541705054671, + 53.59093292795018 + ], + [ + 6.863010595707465, + 53.59217967748938 + ] + ], + [ + [ + 8.021000255801555, + 53.76190036879551 + ], + [ + 8.025291520156706, + 53.75722624389639 + ], + [ + 8.02651693940672, + 53.75720311978527 + ], + [ + 8.020995931663666, + 53.76293574138879 + ], + [ + 8.021000255801555, + 53.76190036879551 + ] + ] + ], + [ + [ + [ + 8.809800105799926, + 53.90646841076545 + ], + [ + 8.994673672619555, + 53.872606313122596 + ], + [ + 9.022420176957269, + 53.8795175369778 + ], + [ + 9.052705796912335, + 53.881441549707795 + ], + [ + 9.143493419525784, + 53.8776259700566 + ], + [ + 9.19975124309687, + 53.88010436619212 + ], + [ + 9.230586198098083, + 53.877771866511274 + ], + [ + 9.230809298568529, + 53.87505621493533 + ], + [ + 9.272732766628975, + 53.867662629841654 + ], + [ + 9.275123378568928, + 53.85726930152788 + ], + [ + 9.18313952799621, + 53.86461894647127 + ], + [ + 9.1230229440391, + 53.86403820947544 + ], + [ + 9.09047757385601, + 53.86110808009021 + ], + [ + 9.068282629677709, + 53.853665761172834 + ], + [ + 9.053888856779713, + 53.852671914361736 + ], + [ + 9.013168475080978, + 53.840239379344574 + ], + [ + 9.018512745788968, + 53.83484122484703 + ], + [ + 8.976920135359578, + 53.84001131773937 + ], + [ + 8.907024936982692, + 53.82856150161718 + ], + [ + 8.859428901464465, + 53.83029516615266 + ], + [ + 8.834581416481361, + 53.83418794087081 + ], + [ + 8.82406830728806, + 53.83184512322059 + ], + [ + 8.795931292573423, + 53.833216353526694 + ], + [ + 8.774316178549707, + 53.83805637542127 + ], + [ + 8.726448961954606, + 53.85766366560107 + ], + [ + 8.7284785113449, + 53.85970540329102 + ], + [ + 8.702246495001104, + 53.87871119131861 + ], + [ + 8.693838838076523, + 53.87646879867565 + ], + [ + 8.688336129961016, + 53.879336098261625 + ], + [ + 8.683227744195069, + 53.88584810651733 + ], + [ + 8.688439680440055, + 53.89034500883741 + ], + [ + 8.67882015361605, + 53.892319510133156 + ], + [ + 8.640610003644294, + 53.886809342539365 + ], + [ + 8.62710851837603, + 53.88218556355365 + ], + [ + 8.614913869613385, + 53.8821182226146 + ], + [ + 8.60114222282061, + 53.874288713345294 + ], + [ + 8.60463015066955, + 53.87097419650647 + ], + [ + 8.57601706013983, + 53.84483769144545 + ], + [ + 8.560671618164227, + 53.90508127940127 + ], + [ + 8.545674453935716, + 53.93007871012205 + ], + [ + 8.394368924703407, + 54.02764997566624 + ], + [ + 8.499016062194402, + 54.028399887628886 + ], + [ + 8.767292191251734, + 53.96467784879628 + ], + [ + 8.809800105799926, + 53.90646841076545 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 4, + "BSG": 1, + "RS": "09", + "AGS": "09", + "SDV_RS": "091620000000", + "GEN": "Bayern", + "BEZ": "Freistaat", + "IBZ": 21, + "BEM": "--", + "NBD": "ja", + "SN_L": "09", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE2", + "RS_0": "090000000000", + "AGS_0": "09000000", + "WSK": "2011/07/01", + "DEBKG_ID": "DEBKGDL20000E5HO", + "destatis": { + "population": 12691568, + "population_m": 6249965, + "population_w": 6441603 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.453980128926101, + 47.55557895878625 + ], + [ + 10.4388765351277, + 47.523492110885876 + ], + [ + 10.440550844775249, + 47.513569435069364 + ], + [ + 10.431323512106077, + 47.50367761645749 + ], + [ + 10.442767953985848, + 47.48461689901729 + ], + [ + 10.451310953876451, + 47.48568509393649 + ], + [ + 10.463220692620105, + 47.48277492285588 + ], + [ + 10.468022327336886, + 47.47691846928863 + ], + [ + 10.470200813947887, + 47.46835679859946 + ], + [ + 10.465591334949336, + 47.464244871448884 + ], + [ + 10.465719266874213, + 47.45353109917846 + ], + [ + 10.475930146012358, + 47.432149508166106 + ], + [ + 10.459103803528174, + 47.42816611430214 + ], + [ + 10.456182528236827, + 47.41925120189416 + ], + [ + 10.436173530195537, + 47.41098241694174 + ], + [ + 10.437550548962026, + 47.40674669757394 + ], + [ + 10.431243634976171, + 47.40273601072208 + ], + [ + 10.434158374290398, + 47.400024660661984 + ], + [ + 10.429103379722719, + 47.391010588431804 + ], + [ + 10.436472140004836, + 47.380647803221244 + ], + [ + 10.419604562682633, + 47.384627862963654 + ], + [ + 10.41093712614614, + 47.377787286824706 + ], + [ + 10.394861833742418, + 47.375728679962165 + ], + [ + 10.388683292646677, + 47.369109996813805 + ], + [ + 10.386292692366839, + 47.3562249453611 + ], + [ + 10.356833690796089, + 47.33697580815898 + ], + [ + 10.345760342202647, + 47.32165130342369 + ], + [ + 10.348779405674739, + 47.317401046792604 + ], + [ + 10.3300306287582, + 47.30471226506855 + ], + [ + 10.315029929374012, + 47.306524644287386 + ], + [ + 10.301634059801112, + 47.29861822051799 + ], + [ + 10.295805281055076, + 47.299927887644124 + ], + [ + 10.281478670884999, + 47.28754811514741 + ], + [ + 10.265972738763963, + 47.287901834983174 + ], + [ + 10.259921644439027, + 47.28160950858933 + ], + [ + 10.24561531010242, + 47.280458377343805 + ], + [ + 10.238072193438379, + 47.271991892361214 + ], + [ + 10.23229953776453, + 47.27047759418179 + ], + [ + 10.222226480620952, + 47.275814979739 + ], + [ + 10.201252904945665, + 47.2768717239063 + ], + [ + 10.178345298769408, + 47.27012360470015 + ], + [ + 10.173979530614476, + 47.2702650059357 + ], + [ + 10.172036399557165, + 47.279041221595506 + ], + [ + 10.17872638784873, + 47.29572663591593 + ], + [ + 10.189539019667695, + 47.2938807583988 + ], + [ + 10.199089891066484, + 47.29752798156172 + ], + [ + 10.212371204181006, + 47.311243762542915 + ], + [ + 10.215876173007631, + 47.31095840252004 + ], + [ + 10.211114671738473, + 47.31894092971773 + ], + [ + 10.199483048971867, + 47.326599003286184 + ], + [ + 10.207442530054037, + 47.332424128626016 + ], + [ + 10.204207868001529, + 47.33673392724898 + ], + [ + 10.21760819116612, + 47.35041821541527 + ], + [ + 10.216739414136715, + 47.35400955363956 + ], + [ + 10.237011102294908, + 47.37345640488157 + ], + [ + 10.231561064954533, + 47.378635674335484 + ], + [ + 10.23619638027804, + 47.3818607686114 + ], + [ + 10.226981859707026, + 47.38884788641468 + ], + [ + 10.212637083246225, + 47.38041129159143 + ], + [ + 10.181712556034569, + 47.392282839465445 + ], + [ + 10.182705425741782, + 47.388119710581705 + ], + [ + 10.169193209780802, + 47.385793914491465 + ], + [ + 10.169482359379069, + 47.37134625734171 + ], + [ + 10.165863958043209, + 47.368794742605004 + ], + [ + 10.141673252217062, + 47.367159282451446 + ], + [ + 10.11926568659919, + 47.37570261613395 + ], + [ + 10.099780481487947, + 47.35473600228192 + ], + [ + 10.082890219624083, + 47.39373416264029 + ], + [ + 10.086257427869281, + 47.39930988322619 + ], + [ + 10.069157668204273, + 47.409849735680226 + ], + [ + 10.073998220079336, + 47.41461180550091 + ], + [ + 10.09570068541308, + 47.41781534468368 + ], + [ + 10.09625276335139, + 47.422366101590924 + ], + [ + 10.105422741209765, + 47.42874014692083 + ], + [ + 10.093891790618848, + 47.44034410153611 + ], + [ + 10.091470374016017, + 47.45907615830005 + ], + [ + 10.088234966006992, + 47.46021256725175 + ], + [ + 10.080315793798501, + 47.4554081819986 + ], + [ + 10.070354467299639, + 47.45600041324594 + ], + [ + 10.064670640533064, + 47.46364174982419 + ], + [ + 10.053568642245258, + 47.46657938425251 + ], + [ + 10.054146100049682, + 47.47594970519115 + ], + [ + 10.044684743786693, + 47.487611738178 + ], + [ + 10.036189949414188, + 47.488833631686724 + ], + [ + 10.010735494880928, + 47.481941239959866 + ], + [ + 10.001804211549633, + 47.48192166671642 + ], + [ + 9.995348118461735, + 47.48631524658179 + ], + [ + 9.987653590235471, + 47.49856159587015 + ], + [ + 9.995696953698113, + 47.50293005251624 + ], + [ + 9.965203633330889, + 47.52116206626515 + ], + [ + 9.968301971032822, + 47.528337317550985 + ], + [ + 9.964900277619815, + 47.53785383269261 + ], + [ + 9.970898558181085, + 47.545680436791045 + ], + [ + 9.958897661265945, + 47.5429866791682 + ], + [ + 9.963684782831622, + 47.53471755393631 + ], + [ + 9.941094522933298, + 47.53822574848404 + ], + [ + 9.93354019896564, + 47.53259976627118 + ], + [ + 9.921551235864873, + 47.529671820292535 + ], + [ + 9.913475553155019, + 47.532647813783605 + ], + [ + 9.906673248856276, + 47.54217121578835 + ], + [ + 9.889243103091472, + 47.54413408454505 + ], + [ + 9.880978139836749, + 47.548057565124395 + ], + [ + 9.875103144440336, + 47.5433712947763 + ], + [ + 9.878035920218833, + 47.53931649673649 + ], + [ + 9.873978009081757, + 47.52871985310817 + ], + [ + 9.858369160987133, + 47.53392995304429 + ], + [ + 9.849237734227927, + 47.54196701371253 + ], + [ + 9.81567610884816, + 47.547609149369634 + ], + [ + 9.81698526069159, + 47.55323489432884 + ], + [ + 9.825894216724985, + 47.55980219331331 + ], + [ + 9.82076785087418, + 47.570699375333255 + ], + [ + 9.825440061395126, + 47.57299878545878 + ], + [ + 9.827199688296359, + 47.579982434872264 + ], + [ + 9.823746518740453, + 47.58718389673292 + ], + [ + 9.81409305474631, + 47.588083913721405 + ], + [ + 9.802437588582514, + 47.59587131574332 + ], + [ + 9.79066254426868, + 47.593559702099945 + ], + [ + 9.777214104111893, + 47.59528563781683 + ], + [ + 9.7693678095667, + 47.58765557365217 + ], + [ + 9.765470283736098, + 47.58885611091533 + ], + [ + 9.7619589201966, + 47.581072065012265 + ], + [ + 9.75604224799676, + 47.57914872181032 + ], + [ + 9.756265534345776, + 47.57267390510105 + ], + [ + 9.748035109355179, + 47.570506028585974 + ], + [ + 9.751959065699102, + 47.56748040611381 + ], + [ + 9.743408388716258, + 47.55871957997118 + ], + [ + 9.747037145483835, + 47.555663585092205 + ], + [ + 9.741529808573144, + 47.55476937574023 + ], + [ + 9.735247326601362, + 47.54673703409594 + ], + [ + 9.736766578114995, + 47.53559274489228 + ], + [ + 9.733215094817723, + 47.53368479316281 + ], + [ + 9.712683322067422, + 47.550692865200986 + ], + [ + 9.691923698571035, + 47.549947327906295 + ], + [ + 9.68670321116221, + 47.54362026446618 + ], + [ + 9.680775633402654, + 47.54226491488189 + ], + [ + 9.675623645853111, + 47.54522412434836 + ], + [ + 9.682804387548156, + 47.55244003192541 + ], + [ + 9.679038885003779, + 47.557021344132345 + ], + [ + 9.651554764547171, + 47.55737624222758 + ], + [ + 9.638605938479868, + 47.56693417151621 + ], + [ + 9.628870213746197, + 47.56638028460169 + ], + [ + 9.628007474077844, + 47.57091127922363 + ], + [ + 9.618224231179312, + 47.56850494569993 + ], + [ + 9.606458933114112, + 47.573755500368534 + ], + [ + 9.60207715349901, + 47.58433799590818 + ], + [ + 9.605885715365096, + 47.58570228856193 + ], + [ + 9.614055646106433, + 47.5811503369226 + ], + [ + 9.619756271970727, + 47.583227520391794 + ], + [ + 9.626340585914688, + 47.59249143486241 + ], + [ + 9.633101282281505, + 47.5940642282124 + ], + [ + 9.643284835743525, + 47.58975973645594 + ], + [ + 9.6402089459103, + 47.60095018309134 + ], + [ + 9.634638558577583, + 47.60267626994013 + ], + [ + 9.653814997214889, + 47.60557700690715 + ], + [ + 9.657709588410063, + 47.61172524823889 + ], + [ + 9.671443790854749, + 47.611374109425 + ], + [ + 9.678102239383067, + 47.60490065264272 + ], + [ + 9.68378165278148, + 47.60454804831916 + ], + [ + 9.69215155718136, + 47.61042347113462 + ], + [ + 9.694582152866271, + 47.60466454370186 + ], + [ + 9.70629373447182, + 47.60181220922718 + ], + [ + 9.712022724144788, + 47.60667944220796 + ], + [ + 9.726917415818006, + 47.6067234703338 + ], + [ + 9.734340392137804, + 47.6165259910318 + ], + [ + 9.737457798652635, + 47.61170434332249 + ], + [ + 9.745651920031696, + 47.617296984447 + ], + [ + 9.746899428131957, + 47.61302820967648 + ], + [ + 9.740357989771192, + 47.60453573770737 + ], + [ + 9.747811632002735, + 47.603679967727025 + ], + [ + 9.75606611451225, + 47.60966759291999 + ], + [ + 9.754884840918132, + 47.614008797496574 + ], + [ + 9.774775830628283, + 47.62516932275644 + ], + [ + 9.777821572362948, + 47.630536402629176 + ], + [ + 9.79525606567016, + 47.63571901069615 + ], + [ + 9.800141869696223, + 47.64470091890612 + ], + [ + 9.795646056375771, + 47.64760146122085 + ], + [ + 9.801668776025567, + 47.650863035426966 + ], + [ + 9.816176936983158, + 47.649664494613255 + ], + [ + 9.828553281770313, + 47.657901205301485 + ], + [ + 9.83060629565077, + 47.671375577502026 + ], + [ + 9.834213481751586, + 47.67323993579779 + ], + [ + 9.837816238597233, + 47.66946960322983 + ], + [ + 9.84219083987396, + 47.67769183455643 + ], + [ + 9.874861671471079, + 47.67527824306187 + ], + [ + 9.893277498506903, + 47.66323277310765 + ], + [ + 9.91630331433732, + 47.661022238314935 + ], + [ + 9.930496512592477, + 47.654043179412746 + ], + [ + 9.940860856784926, + 47.657995570238135 + ], + [ + 9.959522463349368, + 47.65230409774051 + ], + [ + 9.970746357474779, + 47.65362632422229 + ], + [ + 9.977723418884738, + 47.66172071382315 + ], + [ + 9.976022662405448, + 47.66532503689979 + ], + [ + 10.001902409660058, + 47.68199943427236 + ], + [ + 10.028966243439378, + 47.68654120112772 + ], + [ + 10.03049126274231, + 47.67445209527095 + ], + [ + 10.03873632274922, + 47.67776736230575 + ], + [ + 10.04336609139908, + 47.67784978336355 + ], + [ + 10.04198056095984, + 47.67514805582369 + ], + [ + 10.04703997329387, + 47.67623859925514 + ], + [ + 10.048337620305317, + 47.681321290261515 + ], + [ + 10.059312463455347, + 47.680628777048675 + ], + [ + 10.068159476381526, + 47.663608820483695 + ], + [ + 10.07516168231095, + 47.65833450994544 + ], + [ + 10.072017980882864, + 47.64344114700552 + ], + [ + 10.0772923993975, + 47.63927426207253 + ], + [ + 10.082945111974635, + 47.650124308760844 + ], + [ + 10.08136231277178, + 47.65488987378629 + ], + [ + 10.09021566300277, + 47.66026136107368 + ], + [ + 10.08838506563919, + 47.662869440371395 + ], + [ + 10.093423672458826, + 47.66322086856478 + ], + [ + 10.093527261104114, + 47.67006877471308 + ], + [ + 10.088402275892548, + 47.67363504685089 + ], + [ + 10.111133755915336, + 47.66599043428786 + ], + [ + 10.130059542806936, + 47.67727125524948 + ], + [ + 10.132769416550868, + 47.68508056587024 + ], + [ + 10.12832227545009, + 47.69071791409876 + ], + [ + 10.13925055320935, + 47.697880901949084 + ], + [ + 10.139437677548777, + 47.70327340754865 + ], + [ + 10.122519791892568, + 47.71166344051406 + ], + [ + 10.116428888952811, + 47.71931672603968 + ], + [ + 10.118638682192616, + 47.73328979075081 + ], + [ + 10.113633618797232, + 47.74137823046397 + ], + [ + 10.118252462371503, + 47.75058803407323 + ], + [ + 10.11402522388417, + 47.754401563740636 + ], + [ + 10.119049494526047, + 47.759586709767625 + ], + [ + 10.082513094304112, + 47.77118098643326 + ], + [ + 10.084840348970685, + 47.776636030431476 + ], + [ + 10.079614724213148, + 47.78126235010893 + ], + [ + 10.067390652861931, + 47.78243680999842 + ], + [ + 10.064681025461597, + 47.785887717885686 + ], + [ + 10.085536018029076, + 47.795484737239896 + ], + [ + 10.09190245882469, + 47.80143132431699 + ], + [ + 10.090134546380591, + 47.803905186456554 + ], + [ + 10.093683742145432, + 47.80205135149858 + ], + [ + 10.096261048030447, + 47.80465642599252 + ], + [ + 10.101994588789081, + 47.800479998465526 + ], + [ + 10.116879805827267, + 47.80062314207839 + ], + [ + 10.119430489346287, + 47.80371469355182 + ], + [ + 10.108782375558429, + 47.80577107929914 + ], + [ + 10.115746515856804, + 47.810873642998814 + ], + [ + 10.128015961198116, + 47.81331575918974 + ], + [ + 10.131846049810354, + 47.80961698437877 + ], + [ + 10.138022984091181, + 47.80963764355654 + ], + [ + 10.132328794896594, + 47.81467847027029 + ], + [ + 10.131470000253085, + 47.82250356791559 + ], + [ + 10.125608607882, + 47.82289704590062 + ], + [ + 10.109871903891703, + 47.8402057435608 + ], + [ + 10.102770972447162, + 47.8423743243356 + ], + [ + 10.11007223440925, + 47.84697409105557 + ], + [ + 10.107154657825985, + 47.85289545770091 + ], + [ + 10.099247333022964, + 47.844930681220944 + ], + [ + 10.097384612986547, + 47.848318892950914 + ], + [ + 10.094422815360783, + 47.84388828984812 + ], + [ + 10.091604866363976, + 47.845621380218304 + ], + [ + 10.095376094585788, + 47.851396470060244 + ], + [ + 10.099353490294613, + 47.851608857609314 + ], + [ + 10.098266187321334, + 47.855604364044936 + ], + [ + 10.10191156264762, + 47.853972968951055 + ], + [ + 10.105104472943284, + 47.85713922205841 + ], + [ + 10.104617332881036, + 47.86462420422203 + ], + [ + 10.08296168829282, + 47.85571777939854 + ], + [ + 10.07675553379619, + 47.86780934957141 + ], + [ + 10.082656577344515, + 47.86972846354249 + ], + [ + 10.0915987501387, + 47.86739846965412 + ], + [ + 10.097922307206506, + 47.87656248490105 + ], + [ + 10.105704628582853, + 47.879026534318 + ], + [ + 10.105458971397546, + 47.8830252331653 + ], + [ + 10.095332148287293, + 47.885158809582045 + ], + [ + 10.103447322365033, + 47.890621695909765 + ], + [ + 10.101696086464052, + 47.905634205367384 + ], + [ + 10.110211777678147, + 47.91063526691626 + ], + [ + 10.108314410470937, + 47.91557192044812 + ], + [ + 10.111105704476808, + 47.91595937987552 + ], + [ + 10.10501280185758, + 47.92383809443883 + ], + [ + 10.111010296151239, + 47.93487908394004 + ], + [ + 10.089487632616228, + 47.94797725669152 + ], + [ + 10.084893699950998, + 47.96130765335526 + ], + [ + 10.093207080655855, + 47.97233172986026 + ], + [ + 10.114954568812266, + 47.97625743516829 + ], + [ + 10.114791141430587, + 47.98862509091525 + ], + [ + 10.121624322034883, + 47.99853638246783 + ], + [ + 10.119550393186508, + 48.00349993131166 + ], + [ + 10.134326495000675, + 48.01759961392574 + ], + [ + 10.135727944606302, + 48.02376160140277 + ], + [ + 10.127111483967031, + 48.03271248297758 + ], + [ + 10.141255833244534, + 48.04670148845853 + ], + [ + 10.139156160063246, + 48.05151269205708 + ], + [ + 10.143901696556343, + 48.05900706679429 + ], + [ + 10.140640573553393, + 48.06490224612962 + ], + [ + 10.14373670731883, + 48.07441383921764 + ], + [ + 10.134081879986173, + 48.07947892238258 + ], + [ + 10.140392398126298, + 48.098916557750165 + ], + [ + 10.136661343304016, + 48.10078303888052 + ], + [ + 10.136247105300413, + 48.11144304886106 + ], + [ + 10.123590498706946, + 48.11651536791496 + ], + [ + 10.107074310791878, + 48.132144184014976 + ], + [ + 10.085717414862836, + 48.18219242060539 + ], + [ + 10.08371062848253, + 48.209640227938976 + ], + [ + 10.077004112042959, + 48.210612542418204 + ], + [ + 10.078320370428944, + 48.220237006581314 + ], + [ + 10.076318737629089, + 48.22302525207945 + ], + [ + 10.069454398224744, + 48.2233582138038 + ], + [ + 10.070144239489304, + 48.23062497805636 + ], + [ + 10.060721236111553, + 48.24009045403836 + ], + [ + 10.069026271021633, + 48.253761581503284 + ], + [ + 10.06196003497708, + 48.258129985586116 + ], + [ + 10.065548390593253, + 48.26189319540954 + ], + [ + 10.062202412239493, + 48.271715480612755 + ], + [ + 10.066752984615679, + 48.2749161020188 + ], + [ + 10.065816519721793, + 48.28181712210158 + ], + [ + 10.042549427433878, + 48.29422970898688 + ], + [ + 10.043081011589123, + 48.300443596412855 + ], + [ + 10.022922309161432, + 48.32400382657288 + ], + [ + 10.012286806076204, + 48.33063748953779 + ], + [ + 10.010403135112673, + 48.34238923952366 + ], + [ + 9.99813180924917, + 48.34751287757681 + ], + [ + 9.99482228553174, + 48.3552809030714 + ], + [ + 9.99992493746783, + 48.3634531127554 + ], + [ + 9.993339461309887, + 48.36356692714289 + ], + [ + 9.992995102521004, + 48.36815979217246 + ], + [ + 9.987733752230046, + 48.370626032204974 + ], + [ + 9.982988562855688, + 48.36760986107141 + ], + [ + 9.98412768585787, + 48.363227538125955 + ], + [ + 9.977615125793555, + 48.36282826301525 + ], + [ + 9.967275614675764, + 48.3744043557181 + ], + [ + 9.969934361786917, + 48.379380285909626 + ], + [ + 9.984912613004894, + 48.38610468689725 + ], + [ + 9.989868427575587, + 48.393707310272106 + ], + [ + 10.015279482465408, + 48.40435057117032 + ], + [ + 10.018815882202453, + 48.418248658397935 + ], + [ + 10.042414152617061, + 48.42973203637246 + ], + [ + 10.040789678749718, + 48.43439185262572 + ], + [ + 10.037450407438772, + 48.435799706687675 + ], + [ + 10.034854837930114, + 48.43329704555247 + ], + [ + 10.028050577018968, + 48.43691872661841 + ], + [ + 10.028636617355053, + 48.44201041117411 + ], + [ + 10.03822677392702, + 48.44445300522946 + ], + [ + 10.03588767130213, + 48.45129476791081 + ], + [ + 10.03088752149245, + 48.453586070026695 + ], + [ + 10.038927605916252, + 48.459929022454276 + ], + [ + 10.039044314450841, + 48.45787408325378 + ], + [ + 10.064009813362064, + 48.45638920099003 + ], + [ + 10.094376749345459, + 48.46712384223617 + ], + [ + 10.103565697214345, + 48.47277692650354 + ], + [ + 10.104855352385817, + 48.47748470931856 + ], + [ + 10.117366731603099, + 48.475387567540416 + ], + [ + 10.11725175968831, + 48.46813587099881 + ], + [ + 10.133895409080948, + 48.45487141530527 + ], + [ + 10.160457289802327, + 48.458759600189374 + ], + [ + 10.17184642135382, + 48.457786946141326 + ], + [ + 10.172772750083405, + 48.462788973104026 + ], + [ + 10.177862981164552, + 48.4638019814095 + ], + [ + 10.17504082739488, + 48.469377473343606 + ], + [ + 10.184600949983157, + 48.467211217486536 + ], + [ + 10.181529013584795, + 48.46970206406912 + ], + [ + 10.184701021576851, + 48.47266038888199 + ], + [ + 10.177378803077957, + 48.47161422855491 + ], + [ + 10.182582932878907, + 48.4739850832475 + ], + [ + 10.180125246452377, + 48.475524554954355 + ], + [ + 10.217915369411392, + 48.48846743070459 + ], + [ + 10.235443310104946, + 48.488960323176855 + ], + [ + 10.241406301494708, + 48.491959651653715 + ], + [ + 10.237506682641522, + 48.50019583996504 + ], + [ + 10.242472678426692, + 48.50009960988427 + ], + [ + 10.241051145133362, + 48.5053744305576 + ], + [ + 10.228049715041111, + 48.50497457927604 + ], + [ + 10.226631163062777, + 48.50699422585316 + ], + [ + 10.231602956567487, + 48.508436085042256 + ], + [ + 10.23796639724846, + 48.50782191387101 + ], + [ + 10.230779588424218, + 48.51051118153766 + ], + [ + 10.248273717779977, + 48.511244724015945 + ], + [ + 10.249831598204763, + 48.51622070864187 + ], + [ + 10.252682296968564, + 48.51454565206096 + ], + [ + 10.25746240677595, + 48.51946574860613 + ], + [ + 10.286794508167684, + 48.516091275580074 + ], + [ + 10.312023162436935, + 48.52294378204318 + ], + [ + 10.309262093805478, + 48.52632897260187 + ], + [ + 10.314838712269527, + 48.52650928555373 + ], + [ + 10.31237478321773, + 48.53007489459068 + ], + [ + 10.303183364627124, + 48.52982514737729 + ], + [ + 10.300846789625465, + 48.545071209364764 + ], + [ + 10.304651297164327, + 48.545293792325204 + ], + [ + 10.30489911032223, + 48.55105806566365 + ], + [ + 10.31418392558785, + 48.55628937611747 + ], + [ + 10.31300460554813, + 48.56712277011966 + ], + [ + 10.304752750971339, + 48.584265449349616 + ], + [ + 10.29311431291937, + 48.58976551933045 + ], + [ + 10.297108769188782, + 48.60380974179912 + ], + [ + 10.301563862561107, + 48.6052116037474 + ], + [ + 10.307219067076266, + 48.60150778564945 + ], + [ + 10.30686630180681, + 48.60499616091657 + ], + [ + 10.320212232826783, + 48.60393953669318 + ], + [ + 10.318774912038153, + 48.607615026843675 + ], + [ + 10.323094951504181, + 48.6091327037685 + ], + [ + 10.297810681822455, + 48.6241875763611 + ], + [ + 10.296510056419132, + 48.633564249045286 + ], + [ + 10.283566456306884, + 48.63678601341814 + ], + [ + 10.280522996632707, + 48.646770648464155 + ], + [ + 10.274449325164763, + 48.6454815372608 + ], + [ + 10.272355911042206, + 48.64915518813448 + ], + [ + 10.26831023678869, + 48.64660194076707 + ], + [ + 10.270384297273297, + 48.6519210322484 + ], + [ + 10.259529864757612, + 48.65489233620336 + ], + [ + 10.266623162676158, + 48.65883721710139 + ], + [ + 10.256410901060041, + 48.66247524573403 + ], + [ + 10.25460021770829, + 48.66620317764276 + ], + [ + 10.26484861015608, + 48.6721424911989 + ], + [ + 10.25537166365959, + 48.67749061509661 + ], + [ + 10.25634705025003, + 48.680667166673274 + ], + [ + 10.268762917156923, + 48.67989337048934 + ], + [ + 10.264688064905338, + 48.6828883589803 + ], + [ + 10.273039774614078, + 48.68589131098094 + ], + [ + 10.268706812656797, + 48.70354711793377 + ], + [ + 10.282522165748977, + 48.700976783986775 + ], + [ + 10.292015966369295, + 48.691593867203764 + ], + [ + 10.317503169526526, + 48.682933763261964 + ], + [ + 10.31740006782168, + 48.688697893139505 + ], + [ + 10.32100470925422, + 48.687246947807935 + ], + [ + 10.326574274034442, + 48.69078091584333 + ], + [ + 10.337429497202338, + 48.689021806666354 + ], + [ + 10.347422983160333, + 48.67910738154069 + ], + [ + 10.351078887159579, + 48.65489107618259 + ], + [ + 10.361128679628967, + 48.652826841132445 + ], + [ + 10.368441433805645, + 48.663878556303686 + ], + [ + 10.373591781032616, + 48.66305837496715 + ], + [ + 10.37999826986611, + 48.66767751466259 + ], + [ + 10.389421373725366, + 48.667201703122004 + ], + [ + 10.386757991383421, + 48.674087328279306 + ], + [ + 10.392478463641693, + 48.678400470918106 + ], + [ + 10.392510309576132, + 48.688580166536674 + ], + [ + 10.407887768852571, + 48.694502173145466 + ], + [ + 10.40887136005722, + 48.698792502863455 + ], + [ + 10.426198254512203, + 48.69488454935447 + ], + [ + 10.431747641811786, + 48.69949236081635 + ], + [ + 10.43739374706901, + 48.693101879984646 + ], + [ + 10.429635276848927, + 48.68602537646477 + ], + [ + 10.426519975084187, + 48.691571939838795 + ], + [ + 10.422781642701636, + 48.69075458667428 + ], + [ + 10.422574801394848, + 48.684162828497136 + ], + [ + 10.418720957163224, + 48.68227162204103 + ], + [ + 10.424468920110996, + 48.679321886090214 + ], + [ + 10.42610929294289, + 48.67295145634826 + ], + [ + 10.422215739586198, + 48.67088949750704 + ], + [ + 10.419306776063868, + 48.67295571309463 + ], + [ + 10.40869847584739, + 48.66783971784348 + ], + [ + 10.410638817881154, + 48.66103394693287 + ], + [ + 10.419335308958553, + 48.66392720815949 + ], + [ + 10.432751179282114, + 48.66144521751107 + ], + [ + 10.432815405925583, + 48.66408905863122 + ], + [ + 10.441853368043507, + 48.666809907281745 + ], + [ + 10.449172634824292, + 48.665158872578274 + ], + [ + 10.45419051154007, + 48.67061054143036 + ], + [ + 10.464998022718046, + 48.67053354189023 + ], + [ + 10.480987695204785, + 48.68141846443379 + ], + [ + 10.481746282580096, + 48.6864994275667 + ], + [ + 10.495083372665363, + 48.6872472084087 + ], + [ + 10.48559562241638, + 48.691603328352166 + ], + [ + 10.48725776665536, + 48.696661912096516 + ], + [ + 10.47954257007912, + 48.69479927229644 + ], + [ + 10.480260345978806, + 48.700159050543384 + ], + [ + 10.471509766203582, + 48.70281000303809 + ], + [ + 10.474483674592928, + 48.70560746585511 + ], + [ + 10.483528290720233, + 48.70524282887304 + ], + [ + 10.483382299783264, + 48.70806417292474 + ], + [ + 10.48164137376167, + 48.71258725889261 + ], + [ + 10.473732241582185, + 48.711979229394494 + ], + [ + 10.465492621770093, + 48.719804630390854 + ], + [ + 10.467598126054305, + 48.72144195672019 + ], + [ + 10.462052166433258, + 48.722303512243705 + ], + [ + 10.464956862526027, + 48.727736140215626 + ], + [ + 10.455739515052485, + 48.72904580867984 + ], + [ + 10.4650061761956, + 48.73476857926647 + ], + [ + 10.450064918841665, + 48.73498769367242 + ], + [ + 10.44788353526748, + 48.72804419555374 + ], + [ + 10.443424627701964, + 48.72941335778862 + ], + [ + 10.439877456255347, + 48.73876866086363 + ], + [ + 10.431803340867754, + 48.737307150259554 + ], + [ + 10.434857232540988, + 48.74116694067642 + ], + [ + 10.416176715769993, + 48.748105967966865 + ], + [ + 10.423085180114594, + 48.747949088317434 + ], + [ + 10.41720613878182, + 48.75050786041873 + ], + [ + 10.41816702689933, + 48.75328740124248 + ], + [ + 10.428186611785504, + 48.755884303789095 + ], + [ + 10.418218812616017, + 48.76292794206966 + ], + [ + 10.417717795164432, + 48.76960940597011 + ], + [ + 10.41310131348076, + 48.772087982477295 + ], + [ + 10.42011496032817, + 48.77623905218932 + ], + [ + 10.417848569210935, + 48.77273009800487 + ], + [ + 10.427562521484363, + 48.773096570580144 + ], + [ + 10.428519823364521, + 48.7697697538508 + ], + [ + 10.432001393968827, + 48.7706892291229 + ], + [ + 10.429625151221256, + 48.776865998144274 + ], + [ + 10.434265962723092, + 48.77623032727426 + ], + [ + 10.426773954436472, + 48.7817474160485 + ], + [ + 10.427460900259817, + 48.786487246556966 + ], + [ + 10.43432947154393, + 48.78964810790419 + ], + [ + 10.427711828972114, + 48.79163149497191 + ], + [ + 10.430771578908406, + 48.79354898618093 + ], + [ + 10.420913694387341, + 48.79545796539185 + ], + [ + 10.421083752752832, + 48.79941156745186 + ], + [ + 10.433905473266252, + 48.801177120960396 + ], + [ + 10.440770268213885, + 48.809481739319246 + ], + [ + 10.448624089161527, + 48.81196777996309 + ], + [ + 10.449102462724571, + 48.830323023142796 + ], + [ + 10.44244271568302, + 48.834421069653786 + ], + [ + 10.426268382341837, + 48.83692068955834 + ], + [ + 10.42741549817268, + 48.8429889974183 + ], + [ + 10.452844396279895, + 48.85171169491664 + ], + [ + 10.454106805950223, + 48.860300585484424 + ], + [ + 10.448353934043583, + 48.86113446268536 + ], + [ + 10.452580966325176, + 48.87347545543452 + ], + [ + 10.44477458259801, + 48.880270998712504 + ], + [ + 10.452992995051284, + 48.88443880029681 + ], + [ + 10.450215786872683, + 48.89308945932111 + ], + [ + 10.421320367883704, + 48.905762889102135 + ], + [ + 10.443609809543833, + 48.90864537714201 + ], + [ + 10.457000572319146, + 48.9171414250224 + ], + [ + 10.456656414946593, + 48.9204959635369 + ], + [ + 10.45199140338018, + 48.926667709669275 + ], + [ + 10.437942062032088, + 48.933399855892254 + ], + [ + 10.448220713010958, + 48.93487345099323 + ], + [ + 10.451372668918884, + 48.93866072530817 + ], + [ + 10.44482543310909, + 48.940371013108454 + ], + [ + 10.44333440627785, + 48.9458165986831 + ], + [ + 10.430902321186792, + 48.94630282557073 + ], + [ + 10.431022214191142, + 48.95344182106967 + ], + [ + 10.419458015260261, + 48.959175871634216 + ], + [ + 10.424932592292395, + 48.960681674850264 + ], + [ + 10.418751746689951, + 48.9685792042748 + ], + [ + 10.403681379556081, + 48.96679025526484 + ], + [ + 10.40147999704759, + 48.97452316960691 + ], + [ + 10.409430792422516, + 48.97575710731015 + ], + [ + 10.411773416305458, + 48.97895683170199 + ], + [ + 10.404022693947095, + 48.98066830151933 + ], + [ + 10.39468305772591, + 48.9901576130122 + ], + [ + 10.380483235423139, + 48.98921171020055 + ], + [ + 10.381896484484347, + 48.99904898868993 + ], + [ + 10.375442808523506, + 48.999716540998826 + ], + [ + 10.372808985719152, + 49.00323927419356 + ], + [ + 10.352157950840825, + 49.00600205054018 + ], + [ + 10.356091845159394, + 49.013509723373225 + ], + [ + 10.34543868014299, + 49.016633076135605 + ], + [ + 10.345197407283171, + 49.019384970275546 + ], + [ + 10.350274854859256, + 49.022521874267 + ], + [ + 10.350256584364432, + 49.0284220708075 + ], + [ + 10.336952049550193, + 49.02727018625706 + ], + [ + 10.332901137869701, + 49.03192323317631 + ], + [ + 10.333616422400244, + 49.026788577227336 + ], + [ + 10.32749023742205, + 49.030278059841784 + ], + [ + 10.328960582506017, + 49.02449701377205 + ], + [ + 10.320476555800207, + 49.02571592508206 + ], + [ + 10.30945568023092, + 49.031957695295134 + ], + [ + 10.302714057084172, + 49.03146930788488 + ], + [ + 10.300568132349978, + 49.04034069015014 + ], + [ + 10.294007324341354, + 49.04277743787391 + ], + [ + 10.292825651983144, + 49.04076052660915 + ], + [ + 10.284939365080147, + 49.04208579510155 + ], + [ + 10.288068407468502, + 49.03988815866738 + ], + [ + 10.284838754215617, + 49.03657532930641 + ], + [ + 10.277240661813817, + 49.0382391452633 + ], + [ + 10.277220932095542, + 49.0425204044392 + ], + [ + 10.26499009568884, + 49.04520267192498 + ], + [ + 10.252994971560135, + 49.03897972568797 + ], + [ + 10.250016794250664, + 49.04080795257531 + ], + [ + 10.255756684520229, + 49.044751162296954 + ], + [ + 10.251709391204265, + 49.04955423549085 + ], + [ + 10.25732847027712, + 49.05326325567823 + ], + [ + 10.256055946283578, + 49.061364445300995 + ], + [ + 10.263992966289706, + 49.061669289315404 + ], + [ + 10.257791425036025, + 49.07011080837805 + ], + [ + 10.245544908891368, + 49.07433931307447 + ], + [ + 10.235635729825237, + 49.07370342483265 + ], + [ + 10.23416989496196, + 49.07636232040267 + ], + [ + 10.24098427891099, + 49.082197738793184 + ], + [ + 10.241643574590043, + 49.07925805921483 + ], + [ + 10.24714540475334, + 49.079720347970365 + ], + [ + 10.250596709597069, + 49.092815123449654 + ], + [ + 10.22907001913913, + 49.089760921201325 + ], + [ + 10.222778543096537, + 49.09785861824168 + ], + [ + 10.21273107686484, + 49.09446931907781 + ], + [ + 10.204997648711412, + 49.09811900125143 + ], + [ + 10.208833170372731, + 49.09808406747216 + ], + [ + 10.206841425218187, + 49.101262958243474 + ], + [ + 10.215625560070615, + 49.106109204950435 + ], + [ + 10.215249857100297, + 49.11328348387377 + ], + [ + 10.22658035227439, + 49.11102707705675 + ], + [ + 10.229568828592807, + 49.117309929748586 + ], + [ + 10.225287850255533, + 49.1190561373429 + ], + [ + 10.25111113211268, + 49.12587148372616 + ], + [ + 10.252748772539121, + 49.129913725365334 + ], + [ + 10.25694731996055, + 49.129050426196144 + ], + [ + 10.251562751717431, + 49.13398570378018 + ], + [ + 10.255479653628933, + 49.138302641436894 + ], + [ + 10.248022910291846, + 49.14928110721375 + ], + [ + 10.238356838125762, + 49.1494874297077 + ], + [ + 10.230977046177225, + 49.15346815283298 + ], + [ + 10.228141118876069, + 49.15989024839039 + ], + [ + 10.21869104457522, + 49.15995688367546 + ], + [ + 10.21837911032891, + 49.16348984812764 + ], + [ + 10.20664772158294, + 49.15909029082929 + ], + [ + 10.205166969864212, + 49.15563160172595 + ], + [ + 10.196814396492854, + 49.15576223558174 + ], + [ + 10.200049891260438, + 49.160331318731544 + ], + [ + 10.192707093360697, + 49.16759726863199 + ], + [ + 10.1952440241054, + 49.16988889053508 + ], + [ + 10.187715569919948, + 49.17004369763938 + ], + [ + 10.188631111654175, + 49.174401466717825 + ], + [ + 10.186296970927378, + 49.17051571868305 + ], + [ + 10.177317878688163, + 49.17350865733903 + ], + [ + 10.181182663231416, + 49.18240668974667 + ], + [ + 10.171029492317365, + 49.178275682089556 + ], + [ + 10.166467833421976, + 49.179215671806304 + ], + [ + 10.153573664817108, + 49.188411658511114 + ], + [ + 10.156808452166771, + 49.19271495340792 + ], + [ + 10.142404979140583, + 49.195440428270814 + ], + [ + 10.13532454325376, + 49.20064374431422 + ], + [ + 10.129171664378294, + 49.1957212905339 + ], + [ + 10.130081142278904, + 49.19882757480987 + ], + [ + 10.124899273051641, + 49.19973685943683 + ], + [ + 10.130455046437584, + 49.20376708118073 + ], + [ + 10.125622454463091, + 49.21089314063028 + ], + [ + 10.140135950139605, + 49.208889741963745 + ], + [ + 10.138989004360239, + 49.21592538269336 + ], + [ + 10.13258984338711, + 49.21724870349171 + ], + [ + 10.127462295291304, + 49.22331249535168 + ], + [ + 10.1239890860103, + 49.24601370202885 + ], + [ + 10.11982908162641, + 49.24735797417799 + ], + [ + 10.133209340678837, + 49.25310543360947 + ], + [ + 10.109875036634046, + 49.258298030285566 + ], + [ + 10.118701571998757, + 49.257869577964 + ], + [ + 10.11397417962735, + 49.266407933740844 + ], + [ + 10.119550373491977, + 49.2669756656093 + ], + [ + 10.123625095207709, + 49.27499520116887 + ], + [ + 10.131392016838307, + 49.27508391287389 + ], + [ + 10.123560393368685, + 49.27096508917643 + ], + [ + 10.12663993151348, + 49.26238025002518 + ], + [ + 10.134156874380032, + 49.26222969747966 + ], + [ + 10.147428862494012, + 49.26854182797047 + ], + [ + 10.145388721967244, + 49.27491306440348 + ], + [ + 10.150681257075716, + 49.2806506530941 + ], + [ + 10.156620293956514, + 49.28075890825894 + ], + [ + 10.149895719282378, + 49.28467811240602 + ], + [ + 10.150171929163076, + 49.28829509661188 + ], + [ + 10.142379483554858, + 49.287649896730485 + ], + [ + 10.144107654838422, + 49.2901201063759 + ], + [ + 10.138413628321011, + 49.29202694150626 + ], + [ + 10.132298987536506, + 49.30031883734926 + ], + [ + 10.131680316159114, + 49.30512301514575 + ], + [ + 10.145247059640097, + 49.31649820818129 + ], + [ + 10.140101716876575, + 49.32557627177666 + ], + [ + 10.132711242825904, + 49.327743686543144 + ], + [ + 10.121334637891735, + 49.324956945044775 + ], + [ + 10.117468971792661, + 49.32912363100172 + ], + [ + 10.110636380158379, + 49.328968398897736 + ], + [ + 10.10795288923992, + 49.33229641484786 + ], + [ + 10.113086502315381, + 49.33577746208242 + ], + [ + 10.104846911230396, + 49.338411505840355 + ], + [ + 10.10295785180215, + 49.34378419629657 + ], + [ + 10.109087752656663, + 49.348456363820446 + ], + [ + 10.107615522897111, + 49.35169864481914 + ], + [ + 10.123719470956427, + 49.35081809471909 + ], + [ + 10.124555669364497, + 49.35613756199266 + ], + [ + 10.113373867925151, + 49.35994054619316 + ], + [ + 10.117413522555044, + 49.36902314587085 + ], + [ + 10.10731828526815, + 49.37878490767072 + ], + [ + 10.111966360277538, + 49.38491033159403 + ], + [ + 10.122258914500687, + 49.387713293406236 + ], + [ + 10.144924268661855, + 49.3844136455831 + ], + [ + 10.14640397836919, + 49.38743185175383 + ], + [ + 10.16121077783902, + 49.39035597739768 + ], + [ + 10.161698240225757, + 49.395493980584256 + ], + [ + 10.138638066788905, + 49.40309572194488 + ], + [ + 10.152217242862575, + 49.40101546398997 + ], + [ + 10.147652145008252, + 49.41075266043347 + ], + [ + 10.151680498063907, + 49.41229446213163 + ], + [ + 10.137427055733939, + 49.424717663271124 + ], + [ + 10.133620232923182, + 49.43200995897307 + ], + [ + 10.13810835067667, + 49.43312194631935 + ], + [ + 10.133705133115091, + 49.43714685845224 + ], + [ + 10.118781030305366, + 49.443898261297484 + ], + [ + 10.110624884955671, + 49.44250301986162 + ], + [ + 10.111758983646423, + 49.43874665619504 + ], + [ + 10.105708278065501, + 49.444815869476486 + ], + [ + 10.094741443537172, + 49.44789856821685 + ], + [ + 10.097826625704792, + 49.45701059556448 + ], + [ + 10.108231467257488, + 49.46020766998641 + ], + [ + 10.105487697613361, + 49.46323873536286 + ], + [ + 10.115844314040615, + 49.461300592700624 + ], + [ + 10.122251831673841, + 49.46390783931587 + ], + [ + 10.115118200213526, + 49.473959198106314 + ], + [ + 10.116088966850675, + 49.47857744192661 + ], + [ + 10.11071222209559, + 49.477623439161235 + ], + [ + 10.108102174232995, + 49.482853609514784 + ], + [ + 10.101243509227944, + 49.485641800399314 + ], + [ + 10.099991354559776, + 49.49172767905284 + ], + [ + 10.109812080994285, + 49.50169368622634 + ], + [ + 10.117116621977301, + 49.503742807509276 + ], + [ + 10.115364093765383, + 49.50695744222821 + ], + [ + 10.120859798581126, + 49.50727289981458 + ], + [ + 10.121323095077363, + 49.51104620481235 + ], + [ + 10.108475105153817, + 49.51147678587876 + ], + [ + 10.10571754027477, + 49.515105816682414 + ], + [ + 10.084146564660216, + 49.5117588641704 + ], + [ + 10.076885757835816, + 49.51988287444617 + ], + [ + 10.08064160718088, + 49.52119589269297 + ], + [ + 10.079052669745387, + 49.527461738397015 + ], + [ + 10.089598028509144, + 49.530521244585174 + ], + [ + 10.0855198719157, + 49.54221400297515 + ], + [ + 10.061427506118283, + 49.54513845487393 + ], + [ + 10.061730829983867, + 49.54164927917807 + ], + [ + 10.057105076028032, + 49.54068132807665 + ], + [ + 10.061367726568148, + 49.53746825170943 + ], + [ + 10.040019271114813, + 49.529010433980716 + ], + [ + 10.05718463948679, + 49.519318579353225 + ], + [ + 10.056145910801199, + 49.51494530650538 + ], + [ + 10.051520203180944, + 49.51441601463474 + ], + [ + 10.052403774124352, + 49.5106747098984 + ], + [ + 10.046235533147826, + 49.50697967303831 + ], + [ + 10.027794006842104, + 49.504070274714365 + ], + [ + 10.020790169583181, + 49.48614751609398 + ], + [ + 10.01011843401845, + 49.483213958351676 + ], + [ + 9.99200636724019, + 49.48640294033842 + ], + [ + 9.975210373495921, + 49.48085298739023 + ], + [ + 9.97402362316156, + 49.4858223095545 + ], + [ + 9.951881740495237, + 49.48036425404729 + ], + [ + 9.926561179604287, + 49.48483546107638 + ], + [ + 9.913740586223174, + 49.493252989138355 + ], + [ + 9.9251292888582, + 49.50865009264166 + ], + [ + 9.916959262740981, + 49.51780230499668 + ], + [ + 9.918395299399036, + 49.522379822299925 + ], + [ + 9.923814994020082, + 49.52412139353586 + ], + [ + 9.927050474151264, + 49.536077300067234 + ], + [ + 9.921547139391814, + 49.54113353587148 + ], + [ + 9.920725245812589, + 49.551012274356815 + ], + [ + 9.924395393774542, + 49.54883164033142 + ], + [ + 9.92685272085041, + 49.55164311899224 + ], + [ + 9.92073339470839, + 49.553402194895625 + ], + [ + 9.924655934186868, + 49.559539760123926 + ], + [ + 9.920848873545804, + 49.56328080615484 + ], + [ + 9.899064871401407, + 49.561079934039306 + ], + [ + 9.897994833459286, + 49.564780761307574 + ], + [ + 9.906140853896074, + 49.577094971068526 + ], + [ + 9.915721194570782, + 49.58222786881854 + ], + [ + 9.912438199701592, + 49.58590840181786 + ], + [ + 9.901830927663568, + 49.58541196926742 + ], + [ + 9.898791276106873, + 49.58834669526389 + ], + [ + 9.893524694180108, + 49.583523453962336 + ], + [ + 9.875725005751429, + 49.57863147098388 + ], + [ + 9.874058697526612, + 49.57169497850081 + ], + [ + 9.864550355559732, + 49.567881415747 + ], + [ + 9.866639552616773, + 49.55746313201531 + ], + [ + 9.860457299386107, + 49.55351509092038 + ], + [ + 9.859309914127925, + 49.54604448445355 + ], + [ + 9.849911875471733, + 49.54576589872484 + ], + [ + 9.840564908526567, + 49.55069351449189 + ], + [ + 9.82804003825022, + 49.55159090529486 + ], + [ + 9.81799237056124, + 49.55588778011925 + ], + [ + 9.817997679116548, + 49.558613668093294 + ], + [ + 9.811544997644287, + 49.55568263085139 + ], + [ + 9.84849517729607, + 49.57771315936848 + ], + [ + 9.841046741746936, + 49.59514126929463 + ], + [ + 9.85946011695623, + 49.60298407010977 + ], + [ + 9.85993258465434, + 49.60801582484307 + ], + [ + 9.872808264217106, + 49.61007617040476 + ], + [ + 9.868045003446786, + 49.61117423895486 + ], + [ + 9.867509196313422, + 49.62131939575758 + ], + [ + 9.864120230639756, + 49.62146091504991 + ], + [ + 9.85541090607662, + 49.64148458138062 + ], + [ + 9.83674876641153, + 49.6453265399064 + ], + [ + 9.830060280716133, + 49.651742768843896 + ], + [ + 9.833814044013089, + 49.65628511004163 + ], + [ + 9.829400800820006, + 49.659695819133404 + ], + [ + 9.832495186149197, + 49.66041584302011 + ], + [ + 9.822358443793497, + 49.6647100825669 + ], + [ + 9.825613518720006, + 49.667541233873706 + ], + [ + 9.823416618437914, + 49.67317337367887 + ], + [ + 9.829946964140863, + 49.68101239592722 + ], + [ + 9.840933845540423, + 49.681616637064174 + ], + [ + 9.841172423466475, + 49.68341738172782 + ], + [ + 9.830327936355959, + 49.68745635888655 + ], + [ + 9.836147407777442, + 49.691740750680914 + ], + [ + 9.831804629418135, + 49.70380331719699 + ], + [ + 9.82816056915509, + 49.70645384714673 + ], + [ + 9.823358965554926, + 49.704669849516456 + ], + [ + 9.821427220046921, + 49.70973359244938 + ], + [ + 9.796514481386367, + 49.720710944949225 + ], + [ + 9.79999375793532, + 49.73094323894178 + ], + [ + 9.791444324094838, + 49.730947288967336 + ], + [ + 9.786755849162768, + 49.72184658490265 + ], + [ + 9.771602621704837, + 49.720109572019396 + ], + [ + 9.752953959054741, + 49.7101218406804 + ], + [ + 9.749890203647201, + 49.69585945081638 + ], + [ + 9.739419988276882, + 49.68819070181467 + ], + [ + 9.72755041873848, + 49.68872778251847 + ], + [ + 9.728354246235295, + 49.698189050700044 + ], + [ + 9.719290824447736, + 49.701941708552745 + ], + [ + 9.709719303162661, + 49.72705805618026 + ], + [ + 9.700724817317578, + 49.7221456148922 + ], + [ + 9.70038158421551, + 49.716960895785206 + ], + [ + 9.695889204135428, + 49.7192233772688 + ], + [ + 9.67719387300892, + 49.71620121304938 + ], + [ + 9.67614790781558, + 49.69334726411841 + ], + [ + 9.65349645916717, + 49.687137201394094 + ], + [ + 9.648879733841465, + 49.69173610127887 + ], + [ + 9.632460374111815, + 49.6931860991694 + ], + [ + 9.63046300406233, + 49.70156507961062 + ], + [ + 9.62544912535249, + 49.70373673872044 + ], + [ + 9.633052601734569, + 49.71706895115755 + ], + [ + 9.640874054127377, + 49.72033719873522 + ], + [ + 9.638929369402984, + 49.725550024466536 + ], + [ + 9.627715246395352, + 49.73196330776036 + ], + [ + 9.636562795691587, + 49.73165311779079 + ], + [ + 9.638059303265006, + 49.737112664867915 + ], + [ + 9.645859593168419, + 49.736474001917884 + ], + [ + 9.646936205199102, + 49.739145263549304 + ], + [ + 9.638998493496299, + 49.74050685476654 + ], + [ + 9.645552783917086, + 49.746910388480295 + ], + [ + 9.637951868615318, + 49.7538507510153 + ], + [ + 9.651865836817151, + 49.766371739282285 + ], + [ + 9.644322198694672, + 49.77860965303989 + ], + [ + 9.651418612909339, + 49.78055704496921 + ], + [ + 9.64873620261789, + 49.79147764978886 + ], + [ + 9.620304742504707, + 49.78375722785252 + ], + [ + 9.589686356546112, + 49.78116759487835 + ], + [ + 9.581076413323913, + 49.77803014417021 + ], + [ + 9.57634645094466, + 49.77905345344756 + ], + [ + 9.580057328168454, + 49.78403212989314 + ], + [ + 9.561809835621835, + 49.780616782049655 + ], + [ + 9.557604079575553, + 49.77618222956029 + ], + [ + 9.55839297704999, + 49.76509501457036 + ], + [ + 9.568946331913887, + 49.74963468797587 + ], + [ + 9.56225639612768, + 49.7445411050285 + ], + [ + 9.55506067779949, + 49.74752250024397 + ], + [ + 9.552429578478733, + 49.76042974186791 + ], + [ + 9.54646223687128, + 49.76642600159493 + ], + [ + 9.53763258952304, + 49.76755713848204 + ], + [ + 9.522996548829097, + 49.76120590228084 + ], + [ + 9.514512299370619, + 49.76378679387834 + ], + [ + 9.510047534550795, + 49.77009113868452 + ], + [ + 9.512861169288252, + 49.78179433973407 + ], + [ + 9.503232404000777, + 49.788395361867686 + ], + [ + 9.479097061983726, + 49.78689431037743 + ], + [ + 9.468763638630131, + 49.773790498663764 + ], + [ + 9.457007338179723, + 49.769472253017206 + ], + [ + 9.445002526846057, + 49.773959075347506 + ], + [ + 9.434851987211722, + 49.78737869285938 + ], + [ + 9.422815875064144, + 49.78931964734244 + ], + [ + 9.391546882925343, + 49.77012060586345 + ], + [ + 9.372610337537285, + 49.778976811849255 + ], + [ + 9.351035813617637, + 49.769006988632185 + ], + [ + 9.315683247395151, + 49.768328736516025 + ], + [ + 9.313250661047402, + 49.76169895010865 + ], + [ + 9.323124375776603, + 49.74379726942433 + ], + [ + 9.315897258052324, + 49.74016796762797 + ], + [ + 9.295673221395285, + 49.74053093594394 + ], + [ + 9.32286705265911, + 49.731170810798496 + ], + [ + 9.341713435908169, + 49.73419909354363 + ], + [ + 9.374211198361545, + 49.728002029965324 + ], + [ + 9.344030942261565, + 49.71861396812636 + ], + [ + 9.352232357020267, + 49.71648171747813 + ], + [ + 9.357409236454538, + 49.70428829291196 + ], + [ + 9.372068999180856, + 49.70399847429332 + ], + [ + 9.382528565795383, + 49.70746287837742 + ], + [ + 9.380160749175271, + 49.726118346286626 + ], + [ + 9.386761384291619, + 49.72841157841804 + ], + [ + 9.385645191653582, + 49.73091454484835 + ], + [ + 9.399960653370538, + 49.72884051299427 + ], + [ + 9.401067576039267, + 49.72056451511309 + ], + [ + 9.407930499165658, + 49.721458583237954 + ], + [ + 9.418680826535576, + 49.71189830059227 + ], + [ + 9.416870872247088, + 49.7023976997828 + ], + [ + 9.422312960529633, + 49.696079383707065 + ], + [ + 9.413357933315476, + 49.68296229099613 + ], + [ + 9.406391045204082, + 49.67958151166111 + ], + [ + 9.412472092265732, + 49.675469289166465 + ], + [ + 9.403767108232067, + 49.67559432678798 + ], + [ + 9.398080490330466, + 49.67148132900826 + ], + [ + 9.412035264335477, + 49.66079236727571 + ], + [ + 9.41949546307367, + 49.658853552256886 + ], + [ + 9.40600042189255, + 49.64531278609782 + ], + [ + 9.393784063169903, + 49.6463097642174 + ], + [ + 9.382237956353714, + 49.64318018564812 + ], + [ + 9.367577758801508, + 49.65874605767053 + ], + [ + 9.343880585475636, + 49.64429965197113 + ], + [ + 9.304083058091193, + 49.65494425258378 + ], + [ + 9.306487190426042, + 49.65080375595246 + ], + [ + 9.290493301428516, + 49.64376892061828 + ], + [ + 9.285576822547556, + 49.636050385493675 + ], + [ + 9.278420316057709, + 49.637988837326326 + ], + [ + 9.27072260140703, + 49.63401856525693 + ], + [ + 9.27481872796133, + 49.63094982170535 + ], + [ + 9.27009917642614, + 49.62648984147282 + ], + [ + 9.285023050526675, + 49.61480132910543 + ], + [ + 9.26457762232631, + 49.60681972515635 + ], + [ + 9.259036536374268, + 49.59327621331704 + ], + [ + 9.24945845923933, + 49.59380054220646 + ], + [ + 9.246443172503637, + 49.590024204984125 + ], + [ + 9.248940156297035, + 49.58451840479485 + ], + [ + 9.194410460237151, + 49.57404063897721 + ], + [ + 9.187303514840826, + 49.576891554588016 + ], + [ + 9.180803939801969, + 49.5737477277168 + ], + [ + 9.173276474333068, + 49.57776255271976 + ], + [ + 9.164997222546189, + 49.57545168313551 + ], + [ + 9.158889937145641, + 49.57959030216266 + ], + [ + 9.117713691137151, + 49.57367777581959 + ], + [ + 9.108265918947957, + 49.57930243583091 + ], + [ + 9.103006166758915, + 49.577456012611755 + ], + [ + 9.082989877534349, + 49.60198701015371 + ], + [ + 9.06638137292365, + 49.602365127576554 + ], + [ + 9.065859960350565, + 49.61965906047907 + ], + [ + 9.085871981762642, + 49.63605323175563 + ], + [ + 9.091551107974594, + 49.63515225514139 + ], + [ + 9.10201204767688, + 49.64221034381436 + ], + [ + 9.099543782045693, + 49.65313936474275 + ], + [ + 9.10341891685787, + 49.66043059933481 + ], + [ + 9.088859949366558, + 49.6690232226297 + ], + [ + 9.089638350706648, + 49.69334572162827 + ], + [ + 9.12610915585798, + 49.69997958237794 + ], + [ + 9.12254339449413, + 49.71484186848994 + ], + [ + 9.134528238275976, + 49.71667980850985 + ], + [ + 9.144458397899779, + 49.73779710298848 + ], + [ + 9.150809170042198, + 49.74285074183995 + ], + [ + 9.127833815401853, + 49.755226588286625 + ], + [ + 9.106913989448115, + 49.7586609732101 + ], + [ + 9.11336462495498, + 49.773731014970835 + ], + [ + 9.127235118503386, + 49.77648207536716 + ], + [ + 9.134409139782099, + 49.78263338528537 + ], + [ + 9.12908004161615, + 49.787689161452114 + ], + [ + 9.131665504759146, + 49.79492793456378 + ], + [ + 9.108140121970479, + 49.79798043492194 + ], + [ + 9.0908796210555, + 49.790655009985294 + ], + [ + 9.085933683651433, + 49.80710690721437 + ], + [ + 9.07699281833439, + 49.81822327976254 + ], + [ + 9.086665308840612, + 49.826438099156874 + ], + [ + 9.082824158175246, + 49.8329525997149 + ], + [ + 9.077532510824069, + 49.83461172702808 + ], + [ + 9.09008758074451, + 49.84096807369945 + ], + [ + 9.084730870580634, + 49.84750638231557 + ], + [ + 9.070213873421856, + 49.83325111834945 + ], + [ + 9.063956866075772, + 49.83175947608217 + ], + [ + 9.056227557503826, + 49.83461779502919 + ], + [ + 9.059797319707398, + 49.84071998880839 + ], + [ + 9.052839148452666, + 49.84000307482093 + ], + [ + 9.059515726041223, + 49.84702774082271 + ], + [ + 9.04919173704132, + 49.84241519442147 + ], + [ + 9.043227719209796, + 49.8440576514465 + ], + [ + 9.041443247591467, + 49.840084403938974 + ], + [ + 9.037651961738208, + 49.842564294061205 + ], + [ + 9.036080744277898, + 49.846504120615315 + ], + [ + 9.04077044012904, + 49.84747711978657 + ], + [ + 9.043704577108914, + 49.855543058680944 + ], + [ + 9.033787154296288, + 49.860444052402116 + ], + [ + 9.033336125006556, + 49.86646665192463 + ], + [ + 9.050452507068684, + 49.867571762554135 + ], + [ + 9.038428785179692, + 49.87621767217244 + ], + [ + 9.031878342317894, + 49.909361261847096 + ], + [ + 9.02335988083621, + 49.910136791115505 + ], + [ + 9.032264261051115, + 49.924688670633984 + ], + [ + 9.025353870433579, + 49.94564799579009 + ], + [ + 9.019035578921807, + 49.947050391290944 + ], + [ + 9.026372075774066, + 49.9550914657943 + ], + [ + 9.018574857058475, + 49.978417147666406 + ], + [ + 9.020113698954493, + 49.985894292207334 + ], + [ + 9.015714270561551, + 49.989022859038634 + ], + [ + 9.022987074030114, + 49.99705398108269 + ], + [ + 9.030190178458756, + 49.99060416905039 + ], + [ + 9.036552346582955, + 49.98980028071637 + ], + [ + 9.046073980065877, + 49.99000779167965 + ], + [ + 9.048476005399417, + 49.993935002005045 + ], + [ + 9.035538161749253, + 50.00183680162922 + ], + [ + 9.03981747109247, + 50.01037337552357 + ], + [ + 9.031024824698557, + 50.020132294854456 + ], + [ + 9.031343852953738, + 50.03957408274835 + ], + [ + 9.012308439278184, + 50.04595085010932 + ], + [ + 8.985374829884503, + 50.04172710943085 + ], + [ + 8.977722033391299, + 50.045494921261785 + ], + [ + 8.976611544813418, + 50.05221142971567 + ], + [ + 8.99055990143657, + 50.06711915675566 + ], + [ + 8.999282563906288, + 50.06936687535561 + ], + [ + 8.997391285332869, + 50.09157987837139 + ], + [ + 9.018261040104294, + 50.11160420786991 + ], + [ + 9.071326685712881, + 50.11943787358174 + ], + [ + 9.077268707515335, + 50.11592633089854 + ], + [ + 9.089306136213994, + 50.11680439451563 + ], + [ + 9.098229912170275, + 50.12641698406259 + ], + [ + 9.120204397651516, + 50.12649524244741 + ], + [ + 9.14495773018941, + 50.114111915314275 + ], + [ + 9.153609320611878, + 50.117930613476936 + ], + [ + 9.154371117200792, + 50.10739303498867 + ], + [ + 9.143366554981183, + 50.096983032864735 + ], + [ + 9.149210889997017, + 50.09063949227142 + ], + [ + 9.162545660166174, + 50.09818648021768 + ], + [ + 9.158746843710182, + 50.100128483938946 + ], + [ + 9.174246377963707, + 50.11414932353349 + ], + [ + 9.174558728448217, + 50.11948018728545 + ], + [ + 9.191593717780137, + 50.12748724097251 + ], + [ + 9.18311095228089, + 50.138375004621665 + ], + [ + 9.210222174262459, + 50.14297857705269 + ], + [ + 9.211495622000552, + 50.14660139581419 + ], + [ + 9.221866090645067, + 50.1494173137484 + ], + [ + 9.252559876611269, + 50.139479671636934 + ], + [ + 9.28589675229451, + 50.14166503276558 + ], + [ + 9.307611935832597, + 50.133407868303436 + ], + [ + 9.327428418411674, + 50.14105954023808 + ], + [ + 9.341584333586264, + 50.13128240789918 + ], + [ + 9.375639432370937, + 50.12966060728185 + ], + [ + 9.394463456212053, + 50.09748632408172 + ], + [ + 9.413110845238869, + 50.08405988024717 + ], + [ + 9.435939529901708, + 50.08503058801312 + ], + [ + 9.444989242339485, + 50.08997349720013 + ], + [ + 9.45974612950228, + 50.08990181877404 + ], + [ + 9.499968262569686, + 50.09725235547201 + ], + [ + 9.512464154527564, + 50.09435565601434 + ], + [ + 9.519259435031385, + 50.11403889649142 + ], + [ + 9.507571330262087, + 50.145557350340866 + ], + [ + 9.521804351408658, + 50.14997201186882 + ], + [ + 9.531201793407531, + 50.160849668618425 + ], + [ + 9.52815238524031, + 50.168139275288866 + ], + [ + 9.505055594528983, + 50.16927257927482 + ], + [ + 9.498372929450046, + 50.17522507444526 + ], + [ + 9.50092554403226, + 50.19298277740118 + ], + [ + 9.508122710877567, + 50.195330870008576 + ], + [ + 9.512696753757409, + 50.19377771459849 + ], + [ + 9.516205472937582, + 50.19961172187504 + ], + [ + 9.50362637259949, + 50.20858387432278 + ], + [ + 9.50259136182245, + 50.220279825980185 + ], + [ + 9.494769673489156, + 50.22667220800381 + ], + [ + 9.501174644497613, + 50.24347390876909 + ], + [ + 9.514378236028788, + 50.23407706740844 + ], + [ + 9.533490750115552, + 50.23449175882821 + ], + [ + 9.542029989036147, + 50.22434153435626 + ], + [ + 9.57631873448432, + 50.23238894275649 + ], + [ + 9.58289899297565, + 50.221528424465184 + ], + [ + 9.594279674467488, + 50.2248186543287 + ], + [ + 9.6044060715321, + 50.221903582453756 + ], + [ + 9.613763107912046, + 50.224756718915145 + ], + [ + 9.62159190246356, + 50.22311636239264 + ], + [ + 9.620401705340802, + 50.22752526730721 + ], + [ + 9.635815885589622, + 50.235227852559596 + ], + [ + 9.653726570930264, + 50.232320154352024 + ], + [ + 9.663619149581447, + 50.23373346179769 + ], + [ + 9.668175938661083, + 50.239435343687184 + ], + [ + 9.639013126950237, + 50.24836202877724 + ], + [ + 9.63682363791055, + 50.251449889054754 + ], + [ + 9.643451000870073, + 50.255116790550325 + ], + [ + 9.652396014946826, + 50.26967006842201 + ], + [ + 9.664990318141525, + 50.27117511996652 + ], + [ + 9.682300233957685, + 50.27848920288494 + ], + [ + 9.703422444679282, + 50.28075231126471 + ], + [ + 9.713152763728129, + 50.291733976733305 + ], + [ + 9.73003169857274, + 50.29624845013133 + ], + [ + 9.745881110904376, + 50.31040795469691 + ], + [ + 9.747435794889583, + 50.341200297436366 + ], + [ + 9.739900752844008, + 50.349699115876874 + ], + [ + 9.733235175483376, + 50.351418437989444 + ], + [ + 9.732914416644578, + 50.3561496156712 + ], + [ + 9.746203925924698, + 50.36617993969245 + ], + [ + 9.744441173083887, + 50.37170212873269 + ], + [ + 9.759292302640437, + 50.40244589024047 + ], + [ + 9.751062366387204, + 50.41355912705609 + ], + [ + 9.762063989545554, + 50.425867480190604 + ], + [ + 9.771870957156032, + 50.42485970166337 + ], + [ + 9.780181271265155, + 50.41843091956212 + ], + [ + 9.789424928718692, + 50.42514484848673 + ], + [ + 9.802589727745625, + 50.42399692356631 + ], + [ + 9.810901701061796, + 50.418881903249414 + ], + [ + 9.80798841051105, + 50.412430895953705 + ], + [ + 9.81352322582924, + 50.412958935644966 + ], + [ + 9.823439845870665, + 50.40553293936275 + ], + [ + 9.838411852777684, + 50.40547450649439 + ], + [ + 9.847254850947538, + 50.399298480349934 + ], + [ + 9.860046301208985, + 50.39747395481095 + ], + [ + 9.869996703417868, + 50.40926894051946 + ], + [ + 9.883100781724734, + 50.3988934416298 + ], + [ + 9.91902204345548, + 50.41055268398667 + ], + [ + 9.943399397847568, + 50.42328810201021 + ], + [ + 9.957836756942434, + 50.42320405411332 + ], + [ + 9.966811329270662, + 50.43453083890927 + ], + [ + 9.989984857177136, + 50.44712310052592 + ], + [ + 9.99745990997423, + 50.460985536001594 + ], + [ + 10.018307426072683, + 50.466455261926384 + ], + [ + 10.02202185727108, + 50.475468489313776 + ], + [ + 10.033485227786777, + 50.48112107093812 + ], + [ + 10.03203655254727, + 50.48639687798607 + ], + [ + 10.041188106994237, + 50.49518848322667 + ], + [ + 10.03710615753085, + 50.50002195270774 + ], + [ + 10.042149891400847, + 50.509372763338526 + ], + [ + 10.039741212358924, + 50.51561808189678 + ], + [ + 10.051960692672125, + 50.519254838011605 + ], + [ + 10.06652016979291, + 50.52896505482177 + ], + [ + 10.071825447475675, + 50.52767119967596 + ], + [ + 10.070046384212969, + 50.5354206328041 + ], + [ + 10.076265268942079, + 50.540887271529584 + ], + [ + 10.089842055505907, + 50.54481435288431 + ], + [ + 10.094044467833616, + 50.55360199607787 + ], + [ + 10.098505660798214, + 50.55215997040331 + ], + [ + 10.09973944764262, + 50.5581747347722 + ], + [ + 10.10709413565403, + 50.56373360138743 + ], + [ + 10.11940829439335, + 50.56422474229534 + ], + [ + 10.126217971287538, + 50.561350665254615 + ], + [ + 10.12664488174707, + 50.55842685744272 + ], + [ + 10.120712415014532, + 50.55585721416836 + ], + [ + 10.140366562864758, + 50.54285042488886 + ], + [ + 10.1468595063469, + 50.54314940739272 + ], + [ + 10.150619875569497, + 50.55202357885803 + ], + [ + 10.175441103392153, + 50.54291753848592 + ], + [ + 10.177893247874422, + 50.55168002957239 + ], + [ + 10.203873884032625, + 50.55470084979471 + ], + [ + 10.208325658000705, + 50.540630849640856 + ], + [ + 10.221641927125846, + 50.538724532551626 + ], + [ + 10.224834808537116, + 50.53037809169903 + ], + [ + 10.231973530372962, + 50.531087717575296 + ], + [ + 10.225792338686666, + 50.51871942302974 + ], + [ + 10.230827931193163, + 50.51180310228552 + ], + [ + 10.243665084384162, + 50.515017516104024 + ], + [ + 10.251390310025293, + 50.51118344282837 + ], + [ + 10.256221692644257, + 50.51281333132129 + ], + [ + 10.267694210978508, + 50.50419029757001 + ], + [ + 10.274599189133532, + 50.50586856337911 + ], + [ + 10.291614380864855, + 50.496336109487316 + ], + [ + 10.306570060199219, + 50.492079315093065 + ], + [ + 10.330582235808203, + 50.49427653337985 + ], + [ + 10.332667237936063, + 50.487090499508255 + ], + [ + 10.341410872355087, + 50.482999960682264 + ], + [ + 10.336154205451939, + 50.46589718695495 + ], + [ + 10.348189499965661, + 50.462557577598766 + ], + [ + 10.356725791966957, + 50.455190497388244 + ], + [ + 10.367271856545905, + 50.43877357058592 + ], + [ + 10.376246613679715, + 50.44066076681486 + ], + [ + 10.381332035303496, + 50.43885190385921 + ], + [ + 10.372643776793275, + 50.43723205697484 + ], + [ + 10.370723798702628, + 50.431913097545184 + ], + [ + 10.392463618013236, + 50.430335689267025 + ], + [ + 10.392829159111544, + 50.42693652219508 + ], + [ + 10.403834693086855, + 50.42477512899851 + ], + [ + 10.390064188347079, + 50.40994243294825 + ], + [ + 10.384519195708778, + 50.40892927611246 + ], + [ + 10.384481053506418, + 50.402846229447675 + ], + [ + 10.394493696807722, + 50.39365203254817 + ], + [ + 10.396499209469694, + 50.39692895815805 + ], + [ + 10.423743404246922, + 50.39253245659201 + ], + [ + 10.43789863391464, + 50.39548316276006 + ], + [ + 10.4379755714941, + 50.40117864280117 + ], + [ + 10.449502846068777, + 50.40304676979003 + ], + [ + 10.463657887221977, + 50.376014547154625 + ], + [ + 10.467091700403655, + 50.37759320595298 + ], + [ + 10.47348280375569, + 50.37250990130315 + ], + [ + 10.487284513628497, + 50.37528327120083 + ], + [ + 10.490560662592058, + 50.36878590187371 + ], + [ + 10.494443233436561, + 50.369442973454426 + ], + [ + 10.492854683489709, + 50.36215490302423 + ], + [ + 10.485990410785856, + 50.36305402211247 + ], + [ + 10.492405731014232, + 50.35505584315468 + ], + [ + 10.499040397297875, + 50.35771094546025 + ], + [ + 10.503276655461383, + 50.353175569567455 + ], + [ + 10.512475549775806, + 50.35980609896309 + ], + [ + 10.514624395735078, + 50.34989667261107 + ], + [ + 10.523626464771146, + 50.35475674799054 + ], + [ + 10.526720959601574, + 50.361454365155936 + ], + [ + 10.530382572793243, + 50.36096781428463 + ], + [ + 10.531010504470707, + 50.36510988349857 + ], + [ + 10.53498576948376, + 50.36568008517255 + ], + [ + 10.537305796076248, + 50.362679804652046 + ], + [ + 10.544408272568399, + 50.36450557769534 + ], + [ + 10.554861100512744, + 50.35465610749548 + ], + [ + 10.549758531011689, + 50.34927287531528 + ], + [ + 10.552290301723584, + 50.344517122983454 + ], + [ + 10.561785333514289, + 50.337098473910174 + ], + [ + 10.57469002954455, + 50.33669491930109 + ], + [ + 10.58339834631509, + 50.33238812616407 + ], + [ + 10.600550295951066, + 50.33368802756181 + ], + [ + 10.592322639503951, + 50.31718454578052 + ], + [ + 10.59235935152285, + 50.30808136141328 + ], + [ + 10.605324194668396, + 50.2935369961232 + ], + [ + 10.597534202430214, + 50.28918910958033 + ], + [ + 10.601550725947279, + 50.28267146818928 + ], + [ + 10.59328149195564, + 50.27797238223007 + ], + [ + 10.591040414078387, + 50.27178438092268 + ], + [ + 10.593478704211453, + 50.26955105494934 + ], + [ + 10.607295940495995, + 50.27125747563892 + ], + [ + 10.597829214986815, + 50.262620978556896 + ], + [ + 10.604630904268493, + 50.25963524828185 + ], + [ + 10.611314699904073, + 50.24907497361569 + ], + [ + 10.597108476889037, + 50.246172720281095 + ], + [ + 10.612047270268253, + 50.224138440972396 + ], + [ + 10.637661361062786, + 50.223268777751095 + ], + [ + 10.658961146180555, + 50.230709065581294 + ], + [ + 10.662290267096644, + 50.22664509688789 + ], + [ + 10.657478913801135, + 50.22367513638675 + ], + [ + 10.66367026905671, + 50.221543073854 + ], + [ + 10.686714458178974, + 50.225907583265595 + ], + [ + 10.687640987160314, + 50.21907703267567 + ], + [ + 10.69575278047006, + 50.21179943393784 + ], + [ + 10.708973024174643, + 50.21027663863792 + ], + [ + 10.716645149804643, + 50.20481895715644 + ], + [ + 10.724403610144606, + 50.206099649820686 + ], + [ + 10.731220988364566, + 50.212654207063615 + ], + [ + 10.726238672748403, + 50.24088909706153 + ], + [ + 10.729807565115843, + 50.24487686696181 + ], + [ + 10.726495208022456, + 50.247564698557156 + ], + [ + 10.732167774275574, + 50.25183794482833 + ], + [ + 10.74820326998294, + 50.247825679151894 + ], + [ + 10.74613391054117, + 50.243782950145075 + ], + [ + 10.749816626168332, + 50.24247768423574 + ], + [ + 10.769631615489898, + 50.240840246892866 + ], + [ + 10.784366730078894, + 50.24850648548124 + ], + [ + 10.781843580294044, + 50.25128393838272 + ], + [ + 10.800564106865881, + 50.251443342797415 + ], + [ + 10.807268588623684, + 50.240196710151345 + ], + [ + 10.824047415209074, + 50.23753300049124 + ], + [ + 10.84466635752339, + 50.243157724048956 + ], + [ + 10.851953018088812, + 50.25160305573902 + ], + [ + 10.84635813777867, + 50.27509463534138 + ], + [ + 10.835925654243658, + 50.27306492224695 + ], + [ + 10.826331418455277, + 50.277949037423106 + ], + [ + 10.803919858775577, + 50.27975318627091 + ], + [ + 10.802550270198811, + 50.2919808997418 + ], + [ + 10.794209683035138, + 50.295376176115475 + ], + [ + 10.770728870009279, + 50.292672201155334 + ], + [ + 10.741845437674753, + 50.31591428456029 + ], + [ + 10.736932475731392, + 50.31415201527991 + ], + [ + 10.727314871191796, + 50.31862522721175 + ], + [ + 10.721804395424437, + 50.3180212633962 + ], + [ + 10.714389547414159, + 50.32547919848374 + ], + [ + 10.715001981973689, + 50.333031969564395 + ], + [ + 10.728148128306696, + 50.33812014462829 + ], + [ + 10.728872533242644, + 50.34794160547015 + ], + [ + 10.720194358050174, + 50.349563600713026 + ], + [ + 10.714303879824152, + 50.34634559423001 + ], + [ + 10.712455140892967, + 50.35464378312514 + ], + [ + 10.717929965142138, + 50.355542283695286 + ], + [ + 10.71526657289234, + 50.36359110723149 + ], + [ + 10.738718421505762, + 50.362866487108676 + ], + [ + 10.754509496485959, + 50.35817190923728 + ], + [ + 10.76294266598796, + 50.36971825373663 + ], + [ + 10.773774016366426, + 50.371969356943026 + ], + [ + 10.785881505443411, + 50.38538423228036 + ], + [ + 10.804250650400578, + 50.37910881397102 + ], + [ + 10.81089436329182, + 50.38411950133928 + ], + [ + 10.819969595378469, + 50.38489449791915 + ], + [ + 10.83044301316154, + 50.39261550008867 + ], + [ + 10.861837963381994, + 50.387669720898174 + ], + [ + 10.86774415173512, + 50.39427324884217 + ], + [ + 10.876235601220516, + 50.39653118939978 + ], + [ + 10.877982654639592, + 50.393232323159275 + ], + [ + 10.887187525388805, + 50.3925724865464 + ], + [ + 10.884868872559922, + 50.38850371723312 + ], + [ + 10.89311800357182, + 50.38032394544992 + ], + [ + 10.898854082573568, + 50.384713042162595 + ], + [ + 10.909415957544587, + 50.38718627325252 + ], + [ + 10.911918205547819, + 50.38526083577098 + ], + [ + 10.930218425697769, + 50.39203206651488 + ], + [ + 10.937634646955537, + 50.39190511293069 + ], + [ + 10.94844082954361, + 50.381751354974185 + ], + [ + 10.959681308175965, + 50.375307797573946 + ], + [ + 10.961786983856365, + 50.37758531657008 + ], + [ + 10.96304837140197, + 50.37246608135027 + ], + [ + 10.956661342361802, + 50.36848213221651 + ], + [ + 10.961619821666636, + 50.36772451811356 + ], + [ + 10.985780725613735, + 50.34732052445778 + ], + [ + 10.99295430861571, + 50.34903043494011 + ], + [ + 10.996370085720391, + 50.34672303662398 + ], + [ + 10.999519308221485, + 50.351973047388654 + ], + [ + 10.99414897613589, + 50.3534718883307 + ], + [ + 10.993487277919842, + 50.36546867599843 + ], + [ + 11.033417377285181, + 50.36135823432292 + ], + [ + 11.03622734130006, + 50.35868531838078 + ], + [ + 11.031702753469817, + 50.35513081894564 + ], + [ + 11.04349697175427, + 50.35223236072834 + ], + [ + 11.032407061390279, + 50.35150147049458 + ], + [ + 11.036863469534369, + 50.34520931524871 + ], + [ + 11.042988392866073, + 50.34472164973116 + ], + [ + 11.073566957740518, + 50.353651827964505 + ], + [ + 11.085753909390952, + 50.35203374144477 + ], + [ + 11.081951467632951, + 50.35389927074564 + ], + [ + 11.089737219757279, + 50.36588673319466 + ], + [ + 11.11530490993664, + 50.3670069019516 + ], + [ + 11.119291316927837, + 50.359290104999886 + ], + [ + 11.11404543369656, + 50.35252818344322 + ], + [ + 11.116797804074718, + 50.3493339308358 + ], + [ + 11.121687076149563, + 50.349001657618885 + ], + [ + 11.126678465084545, + 50.356178076846795 + ], + [ + 11.139107811733158, + 50.35350569587028 + ], + [ + 11.13610886914758, + 50.34966562968792 + ], + [ + 11.159197358091687, + 50.33039199146011 + ], + [ + 11.158177091558874, + 50.32377543055911 + ], + [ + 11.138463588897414, + 50.31643203801064 + ], + [ + 11.131754612819627, + 50.30808767530409 + ], + [ + 11.133158695109259, + 50.30017761003597 + ], + [ + 11.137657278128005, + 50.29972418826618 + ], + [ + 11.13972621208406, + 50.29296322187895 + ], + [ + 11.143197373062865, + 50.293375508553254 + ], + [ + 11.141556937130378, + 50.289191925480964 + ], + [ + 11.145922827173408, + 50.28495646852973 + ], + [ + 11.151479009139152, + 50.28598680230985 + ], + [ + 11.153767358603847, + 50.2835443804324 + ], + [ + 11.158479682100308, + 50.289203609563124 + ], + [ + 11.165504113914022, + 50.28234318921004 + ], + [ + 11.183710072489882, + 50.2808954801108 + ], + [ + 11.173970554914122, + 50.27127990729255 + ], + [ + 11.187139425416255, + 50.269555724927045 + ], + [ + 11.19784829294153, + 50.29185636982069 + ], + [ + 11.216084591498511, + 50.284180185558085 + ], + [ + 11.214449761039303, + 50.280926841430976 + ], + [ + 11.235583782375887, + 50.27530818192093 + ], + [ + 11.247547121148497, + 50.26775632065697 + ], + [ + 11.252298162023932, + 50.269020959240706 + ], + [ + 11.25977795716328, + 50.27494627889334 + ], + [ + 11.260240655465925, + 50.28709041043553 + ], + [ + 11.251817692470944, + 50.29346244069097 + ], + [ + 11.251994605247472, + 50.29926494436318 + ], + [ + 11.260501760741075, + 50.30008600388214 + ], + [ + 11.27033665786838, + 50.306746591112876 + ], + [ + 11.256137835029577, + 50.32283933436388 + ], + [ + 11.262503547768954, + 50.3253796621547 + ], + [ + 11.261328834928923, + 50.33791262517953 + ], + [ + 11.277099066816849, + 50.33596244562568 + ], + [ + 11.266225800081779, + 50.35199790453014 + ], + [ + 11.262435240700952, + 50.3524010312648 + ], + [ + 11.277804262935087, + 50.355663290427614 + ], + [ + 11.284252879588163, + 50.36030743253344 + ], + [ + 11.27608321800122, + 50.380923347652384 + ], + [ + 11.272188800488378, + 50.38542158052263 + ], + [ + 11.264334054005534, + 50.38703970833588 + ], + [ + 11.264587087619054, + 50.39134807360581 + ], + [ + 11.270869179465311, + 50.39420350276256 + ], + [ + 11.258055653677731, + 50.400038392149256 + ], + [ + 11.268842560209718, + 50.41917759335027 + ], + [ + 11.268013487661166, + 50.43221228534494 + ], + [ + 11.263200077907573, + 50.442888975120674 + ], + [ + 11.247092020796241, + 50.44892431495743 + ], + [ + 11.25489290442631, + 50.45642278967389 + ], + [ + 11.245131948455061, + 50.470802987574345 + ], + [ + 11.247115539634605, + 50.477303828766935 + ], + [ + 11.257289938257431, + 50.4818175246059 + ], + [ + 11.266426129528712, + 50.47910269484423 + ], + [ + 11.289114782453701, + 50.485565975523265 + ], + [ + 11.290982389916795, + 50.47525652647392 + ], + [ + 11.301695275508049, + 50.48501781363764 + ], + [ + 11.300936066601832, + 50.48840597809306 + ], + [ + 11.323142335609392, + 50.49116491168244 + ], + [ + 11.321355016391704, + 50.50856741603549 + ], + [ + 11.346991154148153, + 50.51161026959388 + ], + [ + 11.343042712461811, + 50.51851947312295 + ], + [ + 11.346569074889356, + 50.52153502500367 + ], + [ + 11.357760793757798, + 50.5198728996211 + ], + [ + 11.369787978513633, + 50.52323971290245 + ], + [ + 11.387615010751597, + 50.51564726556461 + ], + [ + 11.393085549052895, + 50.520554319126816 + ], + [ + 11.40528031884741, + 50.51617606639626 + ], + [ + 11.423893014749233, + 50.51606444127539 + ], + [ + 11.429278747518152, + 50.51223288237843 + ], + [ + 11.440946481470291, + 50.49995944689326 + ], + [ + 11.436031952727864, + 50.49218012144793 + ], + [ + 11.418814568850967, + 50.49346144433067 + ], + [ + 11.421474864788772, + 50.48638045747437 + ], + [ + 11.426473637310549, + 50.484540722503795 + ], + [ + 11.418090895253933, + 50.481860317341344 + ], + [ + 11.420475393831998, + 50.47425877088932 + ], + [ + 11.415499785831273, + 50.46784665997477 + ], + [ + 11.423595023732142, + 50.462257101808035 + ], + [ + 11.419335802094686, + 50.4542377288817 + ], + [ + 11.420630678081077, + 50.44336648314133 + ], + [ + 11.440544800755896, + 50.43861640323028 + ], + [ + 11.45125429308214, + 50.43103282618065 + ], + [ + 11.44344196832748, + 50.4208210794734 + ], + [ + 11.46315341267077, + 50.43217564485087 + ], + [ + 11.481567954000894, + 50.43162169088266 + ], + [ + 11.480552673341325, + 50.42546895192576 + ], + [ + 11.488121920625062, + 50.41583513611699 + ], + [ + 11.479298723537202, + 50.40721300159288 + ], + [ + 11.478737316037002, + 50.40121589240215 + ], + [ + 11.48985028145153, + 50.39677460350422 + ], + [ + 11.503023641824706, + 50.399649929950606 + ], + [ + 11.505861835635177, + 50.39651102917785 + ], + [ + 11.518909861091734, + 50.39566600932278 + ], + [ + 11.51985324242985, + 50.37426848171776 + ], + [ + 11.546187641535427, + 50.38412809745892 + ], + [ + 11.560064187301641, + 50.3841269910712 + ], + [ + 11.573151887878153, + 50.40012188201921 + ], + [ + 11.581404222543986, + 50.39900077143192 + ], + [ + 11.594313323668995, + 50.40260407615112 + ], + [ + 11.624601485353091, + 50.38687040052876 + ], + [ + 11.649490107130946, + 50.39223945380322 + ], + [ + 11.683895018228705, + 50.39288929553936 + ], + [ + 11.708264194750484, + 50.40393828720644 + ], + [ + 11.714721166026989, + 50.396635284989564 + ], + [ + 11.744046461736216, + 50.410503984004556 + ], + [ + 11.761564495698657, + 50.405255872083345 + ], + [ + 11.751172550195873, + 50.414755152985364 + ], + [ + 11.77260469340058, + 50.41153247844681 + ], + [ + 11.780251136900144, + 50.41875475822229 + ], + [ + 11.78719764725343, + 50.41525767530621 + ], + [ + 11.797352620754747, + 50.41732136937433 + ], + [ + 11.817376095504017, + 50.40058974089775 + ], + [ + 11.825495291622692, + 50.40442002946951 + ], + [ + 11.827908708245022, + 50.40013566908416 + ], + [ + 11.8184039909903, + 50.39356776201699 + ], + [ + 11.824265369755564, + 50.389756843886715 + ], + [ + 11.85235197492743, + 50.40165969858966 + ], + [ + 11.857482502295332, + 50.39941249419511 + ], + [ + 11.866580676650619, + 50.400969591061454 + ], + [ + 11.885421622243856, + 50.41585375327729 + ], + [ + 11.906116976150894, + 50.41720074638423 + ], + [ + 11.905833723561619, + 50.419690012966214 + ], + [ + 11.91932285986418, + 50.42472776368945 + ], + [ + 11.929779765408746, + 50.42116961277824 + ], + [ + 11.934729681085726, + 50.42366379413086 + ], + [ + 11.945645080925528, + 50.4162827721736 + ], + [ + 11.945910923933413, + 50.41027691313624 + ], + [ + 11.954374086543748, + 50.40707448065018 + ], + [ + 11.948070278726545, + 50.400377545335076 + ], + [ + 11.949376884998236, + 50.394808534372004 + ], + [ + 11.95723275995496, + 50.39707807310949 + ], + [ + 11.96025004332513, + 50.39541793822294 + ], + [ + 11.964572061961299, + 50.39993463459815 + ], + [ + 11.974696373427879, + 50.39054495899452 + ], + [ + 11.98394319733373, + 50.38870713396207 + ], + [ + 11.978598767864973, + 50.380004477603414 + ], + [ + 11.98469165525384, + 50.375414425841505 + ], + [ + 11.978960912993292, + 50.36949473587759 + ], + [ + 11.984773225624329, + 50.36469550379607 + ], + [ + 11.97651228391347, + 50.36194463245782 + ], + [ + 11.980682143296416, + 50.36159816010363 + ], + [ + 11.982554633420019, + 50.356666571492624 + ], + [ + 11.977170940226701, + 50.35148311138844 + ], + [ + 11.988169480788253, + 50.35062224554683 + ], + [ + 11.996971074793862, + 50.35401666559049 + ], + [ + 11.997250745961422, + 50.34689452466442 + ], + [ + 12.014775570656957, + 50.347560121457064 + ], + [ + 12.01941200484044, + 50.340412746976675 + ], + [ + 12.030884272090143, + 50.339314739808245 + ], + [ + 12.032156904671988, + 50.33007138153239 + ], + [ + 12.041828093408398, + 50.33097059892982 + ], + [ + 12.038908486920167, + 50.336579681486064 + ], + [ + 12.046851905299903, + 50.32499865562854 + ], + [ + 12.046435516247806, + 50.33115090308746 + ], + [ + 12.057774674307634, + 50.326272930200695 + ], + [ + 12.055871959775626, + 50.33165342469973 + ], + [ + 12.06162463772534, + 50.32893158000119 + ], + [ + 12.064216203920694, + 50.33303947493338 + ], + [ + 12.079892805989026, + 50.3268347351348 + ], + [ + 12.09134337713328, + 50.332609686326485 + ], + [ + 12.090346649753673, + 50.32425138357599 + ], + [ + 12.094080388889083, + 50.32511397562828 + ], + [ + 12.104854563019188, + 50.314887405629314 + ], + [ + 12.125560837245718, + 50.30761714368253 + ], + [ + 12.119579245844593, + 50.29942749914728 + ], + [ + 12.12234770507236, + 50.29164577029395 + ], + [ + 12.139920828175505, + 50.27757485165734 + ], + [ + 12.12005378610574, + 50.26688922084255 + ], + [ + 12.113453990708644, + 50.267914354299954 + ], + [ + 12.097471286875775, + 50.262388574148424 + ], + [ + 12.102511401425815, + 50.255784579299196 + ], + [ + 12.090759844058251, + 50.252384392973276 + ], + [ + 12.097769822566647, + 50.24641646852571 + ], + [ + 12.106356943185887, + 50.246704212905456 + ], + [ + 12.10892051834175, + 50.237929692841824 + ], + [ + 12.12698839009811, + 50.232490894001636 + ], + [ + 12.141357324739529, + 50.23051068226673 + ], + [ + 12.142088139409854, + 50.233787490240644 + ], + [ + 12.151332130785317, + 50.23572460331264 + ], + [ + 12.145543610150565, + 50.23038724859411 + ], + [ + 12.157605939293235, + 50.22715025805638 + ], + [ + 12.156533698350069, + 50.22362597890861 + ], + [ + 12.162127956097638, + 50.2235449714954 + ], + [ + 12.164037685443951, + 50.21784169572973 + ], + [ + 12.157711126608044, + 50.21442029049501 + ], + [ + 12.159498485544198, + 50.21118073308714 + ], + [ + 12.16494766145079, + 50.2136133802454 + ], + [ + 12.175722718707895, + 50.21285977419083 + ], + [ + 12.178390536466448, + 50.20513749364981 + ], + [ + 12.185610449671831, + 50.20375215431842 + ], + [ + 12.182819849954473, + 50.199364191020386 + ], + [ + 12.197454144121584, + 50.19883867870257 + ], + [ + 12.18894121609945, + 50.19550569227515 + ], + [ + 12.201260710170681, + 50.188789519184056 + ], + [ + 12.20730186145937, + 50.16950994861835 + ], + [ + 12.215995454447778, + 50.168179820888255 + ], + [ + 12.211218985843896, + 50.15878890404955 + ], + [ + 12.200498194713884, + 50.15245092397 + ], + [ + 12.203607229426618, + 50.14583488258464 + ], + [ + 12.195202153928351, + 50.143043838087806 + ], + [ + 12.196508289761903, + 50.12322052036617 + ], + [ + 12.202343687021797, + 50.115482299352195 + ], + [ + 12.199606920384921, + 50.11119278073548 + ], + [ + 12.210479144652806, + 50.10168041654806 + ], + [ + 12.221054011793143, + 50.10386712966175 + ], + [ + 12.228771744546194, + 50.102310046639225 + ], + [ + 12.227391401697528, + 50.097004945136405 + ], + [ + 12.231797171491266, + 50.09416225216536 + ], + [ + 12.24694945136079, + 50.097443297947706 + ], + [ + 12.24616681539697, + 50.092288069998546 + ], + [ + 12.252001925360766, + 50.0919368251547 + ], + [ + 12.259108262857094, + 50.08299509802436 + ], + [ + 12.275353647196978, + 50.07647093112046 + ], + [ + 12.261113458700802, + 50.06469483528933 + ], + [ + 12.260912108199891, + 50.058430353645434 + ], + [ + 12.272516136114756, + 50.06125113242363 + ], + [ + 12.279292123330391, + 50.055162982473824 + ], + [ + 12.299071909184205, + 50.058668443344985 + ], + [ + 12.317333127079111, + 50.05337868703755 + ], + [ + 12.319154522869795, + 50.048806289046595 + ], + [ + 12.315611629133135, + 50.04611142317528 + ], + [ + 12.324464913449429, + 50.038848060309036 + ], + [ + 12.32540971242812, + 50.033018856190964 + ], + [ + 12.328852813424085, + 50.03221798393153 + ], + [ + 12.338880724566678, + 50.03961000071586 + ], + [ + 12.347720841389204, + 50.03637254550658 + ], + [ + 12.358642908844674, + 50.02468013698068 + ], + [ + 12.365783546873189, + 50.02277015817375 + ], + [ + 12.36753309261413, + 50.0174437935913 + ], + [ + 12.378506721157024, + 50.01905658742442 + ], + [ + 12.379620795091423, + 50.014043211109204 + ], + [ + 12.386561272310123, + 50.0125014699954 + ], + [ + 12.400648869839653, + 50.01500427943411 + ], + [ + 12.40292709027377, + 50.013325734211485 + ], + [ + 12.397637310067541, + 50.008553514346474 + ], + [ + 12.402601500643106, + 50.00756452308363 + ], + [ + 12.401899305504228, + 50.00525380771641 + ], + [ + 12.414398719350901, + 50.00461606872938 + ], + [ + 12.424525801925846, + 50.00032525325752 + ], + [ + 12.431223628860412, + 50.002615083642276 + ], + [ + 12.435233451762809, + 49.99378092412702 + ], + [ + 12.425579170366682, + 49.991199308841736 + ], + [ + 12.431433491131028, + 49.988580247902796 + ], + [ + 12.431519615999763, + 49.98438186309238 + ], + [ + 12.458964061875543, + 49.994760530574055 + ], + [ + 12.46743128165746, + 49.992851934947524 + ], + [ + 12.47653253066725, + 49.98076912647355 + ], + [ + 12.489889638031123, + 49.981760805412804 + ], + [ + 12.499541529608427, + 49.97201625300627 + ], + [ + 12.493863851552046, + 49.96975818356718 + ], + [ + 12.490610279555453, + 49.95860293831405 + ], + [ + 12.481405464159021, + 49.95827519790743 + ], + [ + 12.47048162874547, + 49.949030972221216 + ], + [ + 12.475514391308394, + 49.937918526189286 + ], + [ + 12.478408983732024, + 49.93567258937343 + ], + [ + 12.494354408519513, + 49.936933174075605 + ], + [ + 12.493048857017113, + 49.93322672483443 + ], + [ + 12.504450310049117, + 49.929339686778945 + ], + [ + 12.538495381844598, + 49.92482393311086 + ], + [ + 12.547730388145522, + 49.92034323903272 + ], + [ + 12.549673107108074, + 49.90109238080236 + ], + [ + 12.539959606580014, + 49.89120067200526 + ], + [ + 12.521871472815787, + 49.88172603938281 + ], + [ + 12.512106089510718, + 49.85942569357462 + ], + [ + 12.49784537904492, + 49.85690503491858 + ], + [ + 12.498008182483671, + 49.83757961303241 + ], + [ + 12.482636330099183, + 49.841718113604244 + ], + [ + 12.47294694514724, + 49.83358868396546 + ], + [ + 12.474943568010906, + 49.81929829802416 + ], + [ + 12.464217560254895, + 49.810222996433104 + ], + [ + 12.470653215487443, + 49.79958457606908 + ], + [ + 12.46529381211783, + 49.795415041493854 + ], + [ + 12.474309556272885, + 49.7919487378592 + ], + [ + 12.472723170031893, + 49.785937780944344 + ], + [ + 12.46827687644279, + 49.78665394012904 + ], + [ + 12.404741038841749, + 49.76279869627182 + ], + [ + 12.400717371401466, + 49.75384886807324 + ], + [ + 12.406365571548424, + 49.73948121391696 + ], + [ + 12.41278982354065, + 49.73251761653645 + ], + [ + 12.425711487055002, + 49.730465458783804 + ], + [ + 12.442886119197611, + 49.703699873110345 + ], + [ + 12.480921766076689, + 49.695031746792324 + ], + [ + 12.485220994829193, + 49.68788535385591 + ], + [ + 12.491779711695928, + 49.68601327831082 + ], + [ + 12.521638214395573, + 49.68676182687045 + ], + [ + 12.529845754133587, + 49.66624985868784 + ], + [ + 12.522446159480571, + 49.66045305660459 + ], + [ + 12.525916536972993, + 49.654198626708656 + ], + [ + 12.517534732243117, + 49.64450405695614 + ], + [ + 12.52885953308115, + 49.63923166087237 + ], + [ + 12.52264360684392, + 49.63378704978262 + ], + [ + 12.523665072657458, + 49.6279594454853 + ], + [ + 12.534401555059235, + 49.62630669041656 + ], + [ + 12.52692730871968, + 49.6222758144023 + ], + [ + 12.528168524235829, + 49.61818385411838 + ], + [ + 12.545992434774217, + 49.62133684652028 + ], + [ + 12.560669828433802, + 49.619634293718825 + ], + [ + 12.556884828742533, + 49.61429785038526 + ], + [ + 12.562667123004404, + 49.60873138857466 + ], + [ + 12.564190846363775, + 49.596238921770436 + ], + [ + 12.577077738087262, + 49.58630177056825 + ], + [ + 12.571059484685211, + 49.569753123250344 + ], + [ + 12.574164352089136, + 49.55944373588666 + ], + [ + 12.59500878729239, + 49.54154755711629 + ], + [ + 12.588501690430807, + 49.53853616317448 + ], + [ + 12.614717670689163, + 49.528364892673466 + ], + [ + 12.618814873039076, + 49.52934459768748 + ], + [ + 12.620703466258467, + 49.526558876216775 + ], + [ + 12.628587182654764, + 49.526982036501366 + ], + [ + 12.630558255472552, + 49.530992905234285 + ], + [ + 12.635890166582652, + 49.532011359833696 + ], + [ + 12.644250380376526, + 49.52304246365928 + ], + [ + 12.639703538704657, + 49.500586942237724 + ], + [ + 12.644093585255, + 49.4849053427339 + ], + [ + 12.633763691983862, + 49.476195016822054 + ], + [ + 12.649327983203412, + 49.46693586276626 + ], + [ + 12.657977984583848, + 49.4505082774156 + ], + [ + 12.655893346232562, + 49.43454683331438 + ], + [ + 12.67919623410972, + 49.4262509937841 + ], + [ + 12.708718924992374, + 49.424677256722475 + ], + [ + 12.714710448258483, + 49.41400294381716 + ], + [ + 12.732945567454806, + 49.40990313540634 + ], + [ + 12.757631007912535, + 49.3947568465789 + ], + [ + 12.761125455279656, + 49.382513990036315 + ], + [ + 12.758089044102444, + 49.3751884475599 + ], + [ + 12.768382987412519, + 49.365322142241496 + ], + [ + 12.781380402480714, + 49.360320830343454 + ], + [ + 12.778810244921319, + 49.34807853795213 + ], + [ + 12.786286615212349, + 49.34539791987057 + ], + [ + 12.802536027780713, + 49.34156558818666 + ], + [ + 12.837039261810133, + 49.34071907701224 + ], + [ + 12.843334188948779, + 49.345222969228004 + ], + [ + 12.853479653473954, + 49.3380813139397 + ], + [ + 12.886922448243231, + 49.332300542691726 + ], + [ + 12.880237337379494, + 49.350523495880225 + ], + [ + 12.90166879010395, + 49.34956759890241 + ], + [ + 12.919901821832173, + 49.343440160856986 + ], + [ + 12.92901189120621, + 49.34483885071996 + ], + [ + 12.938720861464232, + 49.342133726179604 + ], + [ + 12.94295857633246, + 49.34419944159118 + ], + [ + 12.958370568898832, + 49.336620765967616 + ], + [ + 12.972595292920643, + 49.33388783115285 + ], + [ + 13.00389362519606, + 49.3122710467757 + ], + [ + 13.007572661923755, + 49.305997519800044 + ], + [ + 13.02910928165295, + 49.304348045193954 + ], + [ + 13.030618101766402, + 49.28759402515317 + ], + [ + 13.025663128834319, + 49.27892099345316 + ], + [ + 13.033896389852211, + 49.263902733652536 + ], + [ + 13.055185791746434, + 49.26400767668703 + ], + [ + 13.060085970213098, + 49.250597105674295 + ], + [ + 13.072635634666037, + 49.24649998853081 + ], + [ + 13.080762122056186, + 49.24741741899388 + ], + [ + 13.088328053466057, + 49.237018506604635 + ], + [ + 13.086049922771716, + 49.229411500287775 + ], + [ + 13.114122112973305, + 49.21842832410789 + ], + [ + 13.10997028264576, + 49.203178909464036 + ], + [ + 13.129336381645384, + 49.196858175620996 + ], + [ + 13.161894166943915, + 49.174623332502314 + ], + [ + 13.170908084717528, + 49.173579733078896 + ], + [ + 13.176875559855949, + 49.164226697390255 + ], + [ + 13.170321563626189, + 49.14404040107475 + ], + [ + 13.182791683148286, + 49.13447841220473 + ], + [ + 13.205650269464899, + 49.122127127546584 + ], + [ + 13.236364793842458, + 49.11359506081833 + ], + [ + 13.276359939819583, + 49.12047769787537 + ], + [ + 13.28918860892856, + 49.11863468850856 + ], + [ + 13.34466900078959, + 49.08846630455135 + ], + [ + 13.346479603754274, + 49.08227579624506 + ], + [ + 13.364008324496021, + 49.06906403728348 + ], + [ + 13.370113303942208, + 49.0678001132065 + ], + [ + 13.375877726265234, + 49.058398329730664 + ], + [ + 13.397147200768549, + 49.051009996163565 + ], + [ + 13.397338107326055, + 49.04483314031293 + ], + [ + 13.391992196385615, + 49.04173147335564 + ], + [ + 13.399683616811817, + 49.03703395863291 + ], + [ + 13.40585526573235, + 49.023652129320155 + ], + [ + 13.400292889897253, + 49.016240954646484 + ], + [ + 13.409274362701703, + 49.00306682620482 + ], + [ + 13.402174142365832, + 48.9942383131935 + ], + [ + 13.40289555268823, + 48.98734273407675 + ], + [ + 13.424610284100906, + 48.977272927857754 + ], + [ + 13.426188541439393, + 48.972501806782375 + ], + [ + 13.459491181648408, + 48.96261124635608 + ], + [ + 13.466983114300715, + 48.95563889052459 + ], + [ + 13.48355207491488, + 48.951263867280495 + ], + [ + 13.487570614349725, + 48.945814786206746 + ], + [ + 13.499067792577076, + 48.94116213290854 + ], + [ + 13.508258016620884, + 48.942165882768606 + ], + [ + 13.507073735235366, + 48.96908625091133 + ], + [ + 13.515861613672822, + 48.968753891624196 + ], + [ + 13.529236960046441, + 48.97410286235742 + ], + [ + 13.536922519908364, + 48.973461961024036 + ], + [ + 13.548029512193464, + 48.966889813498554 + ], + [ + 13.557067930444504, + 48.96709514645938 + ], + [ + 13.563251411077538, + 48.970486295485316 + ], + [ + 13.572756762795139, + 48.966068897504286 + ], + [ + 13.580125157260797, + 48.970724565381325 + ], + [ + 13.592316599813591, + 48.96217320141745 + ], + [ + 13.590728725438336, + 48.95277354089687 + ], + [ + 13.605484554014744, + 48.94168164102829 + ], + [ + 13.608540676687008, + 48.9404871960367 + ], + [ + 13.608188311378152, + 48.94382537145498 + ], + [ + 13.62140312518182, + 48.94885633419741 + ], + [ + 13.629711798203987, + 48.94831827522517 + ], + [ + 13.6223356076241, + 48.93899525174518 + ], + [ + 13.638018963045514, + 48.925697401711666 + ], + [ + 13.638086345378152, + 48.91906086887265 + ], + [ + 13.655197416838515, + 48.893465514597175 + ], + [ + 13.660233251038527, + 48.89448407980619 + ], + [ + 13.669582411610657, + 48.8902667009794 + ], + [ + 13.67160241682943, + 48.880071439850425 + ], + [ + 13.689132319535085, + 48.878362843361735 + ], + [ + 13.702584493488942, + 48.88168124908901 + ], + [ + 13.71681955810928, + 48.878157736101834 + ], + [ + 13.730533259321659, + 48.88710300858984 + ], + [ + 13.737929347529738, + 48.88584781683369 + ], + [ + 13.737243913960082, + 48.87967476708663 + ], + [ + 13.75060607354123, + 48.86675703894532 + ], + [ + 13.750146788550477, + 48.85829101637695 + ], + [ + 13.76474636253012, + 48.834246105855726 + ], + [ + 13.773933648223727, + 48.83057136271391 + ], + [ + 13.778974429163773, + 48.8323908701333 + ], + [ + 13.793092274583895, + 48.830221350738434 + ], + [ + 13.787993135136919, + 48.825179085712186 + ], + [ + 13.815318339068716, + 48.79690072652103 + ], + [ + 13.803902388779195, + 48.78112642054356 + ], + [ + 13.813168403541662, + 48.77398241754375 + ], + [ + 13.839506768566103, + 48.771604903009674 + ], + [ + 13.836126830980723, + 48.76265471859732 + ], + [ + 13.82124567290569, + 48.75447624227115 + ], + [ + 13.818805072360924, + 48.73151913135379 + ], + [ + 13.810250343338698, + 48.72875773067678 + ], + [ + 13.801467746263942, + 48.71707720442086 + ], + [ + 13.794917175072653, + 48.714928273128514 + ], + [ + 13.802957178267015, + 48.70819590074852 + ], + [ + 13.811182159866616, + 48.70863182951977 + ], + [ + 13.814210134458142, + 48.701004354034836 + ], + [ + 13.83757629335258, + 48.70066740864841 + ], + [ + 13.833574089884763, + 48.691963291663626 + ], + [ + 13.817859293601895, + 48.694696831563206 + ], + [ + 13.813676369760906, + 48.69191607164496 + ], + [ + 13.813075541979673, + 48.683569383115405 + ], + [ + 13.819659355397066, + 48.67125441909244 + ], + [ + 13.814177186329154, + 48.64978742445342 + ], + [ + 13.82370130436891, + 48.6421079177199 + ], + [ + 13.82698333059366, + 48.627936726303886 + ], + [ + 13.822612772363744, + 48.6143513851227 + ], + [ + 13.815660726588304, + 48.61424788504479 + ], + [ + 13.81462893728642, + 48.609447029978895 + ], + [ + 13.807341114913257, + 48.604925232079545 + ], + [ + 13.808409238526767, + 48.599871873827155 + ], + [ + 13.801471108634342, + 48.59759512959647 + ], + [ + 13.801684482483907, + 48.592333370532856 + ], + [ + 13.807106009330353, + 48.590263854242956 + ], + [ + 13.805489464603436, + 48.5795532442873 + ], + [ + 13.8004935180688, + 48.573389006210654 + ], + [ + 13.790461594558689, + 48.571852428873136 + ], + [ + 13.78165936360652, + 48.56567565280171 + ], + [ + 13.770427372009257, + 48.55364358569335 + ], + [ + 13.76020536203216, + 48.56548203294765 + ], + [ + 13.754124826210125, + 48.5637797529237 + ], + [ + 13.74665274823101, + 48.55246661523436 + ], + [ + 13.754782999450967, + 48.55120380794025 + ], + [ + 13.743727243873561, + 48.5440744906997 + ], + [ + 13.748488234098552, + 48.53966970913132 + ], + [ + 13.747541593171452, + 48.529878474000846 + ], + [ + 13.733589482597766, + 48.52543176831119 + ], + [ + 13.731952602679955, + 48.51615643994614 + ], + [ + 13.727359451344052, + 48.513008207046234 + ], + [ + 13.705170420744796, + 48.51778255063629 + ], + [ + 13.687338877031332, + 48.527956438248985 + ], + [ + 13.664587448365157, + 48.53403891949831 + ], + [ + 13.653285423638144, + 48.54890653751634 + ], + [ + 13.625784804870545, + 48.55399466946272 + ], + [ + 13.599471891497197, + 48.56936497307462 + ], + [ + 13.590255637504939, + 48.568651020677194 + ], + [ + 13.581122733260512, + 48.559643800702375 + ], + [ + 13.569516851629244, + 48.561280624903425 + ], + [ + 13.524833874992227, + 48.58836993694688 + ], + [ + 13.50899216306442, + 48.59060155066124 + ], + [ + 13.501675874010866, + 48.58089101660857 + ], + [ + 13.50697946908607, + 48.57771010896528 + ], + [ + 13.503966049830556, + 48.57248194255427 + ], + [ + 13.491947995785031, + 48.56937757401576 + ], + [ + 13.489131019729946, + 48.562929415716354 + ], + [ + 13.484846921796635, + 48.561509186275 + ], + [ + 13.478927609500728, + 48.564650672464595 + ], + [ + 13.47459002017357, + 48.562350487120426 + ], + [ + 13.475392159640053, + 48.556094956578946 + ], + [ + 13.4636604186124, + 48.55398097026544 + ], + [ + 13.450104068303059, + 48.56397307988946 + ], + [ + 13.438054967039953, + 48.55774207071343 + ], + [ + 13.438756244916274, + 48.54822937998988 + ], + [ + 13.450163883488978, + 48.53761291855648 + ], + [ + 13.445014237027241, + 48.52952495018615 + ], + [ + 13.446304476267422, + 48.52374022830095 + ], + [ + 13.45803967235777, + 48.51194432275298 + ], + [ + 13.427425096050039, + 48.45809174451201 + ], + [ + 13.43995816804222, + 48.432967396102214 + ], + [ + 13.421672432884716, + 48.40396597802994 + ], + [ + 13.417602794521523, + 48.383841703074744 + ], + [ + 13.40778748688299, + 48.37199932875172 + ], + [ + 13.367894500094021, + 48.35333727791255 + ], + [ + 13.329748843811046, + 48.32352787582938 + ], + [ + 13.25519276030769, + 48.29338997849469 + ], + [ + 13.179159296815188, + 48.29473832478287 + ], + [ + 13.129069900886284, + 48.27863621895205 + ], + [ + 13.081157708299378, + 48.27725630353247 + ], + [ + 13.05464708107605, + 48.26527893635151 + ], + [ + 13.022392355833931, + 48.257974006181996 + ], + [ + 13.011511937960261, + 48.25173708827465 + ], + [ + 12.996763427332366, + 48.23585410168288 + ], + [ + 12.95714434469828, + 48.20963503232731 + ], + [ + 12.868643757232944, + 48.200846337634154 + ], + [ + 12.847746041931574, + 48.167453408183434 + ], + [ + 12.835736074828807, + 48.16493457808713 + ], + [ + 12.833780234405959, + 48.15715123755555 + ], + [ + 12.827297245572572, + 48.152809719271886 + ], + [ + 12.810852854055696, + 48.15128903640524 + ], + [ + 12.798789149832803, + 48.146164156502365 + ], + [ + 12.798155283048263, + 48.13924886573153 + ], + [ + 12.786893601680882, + 48.123609956507764 + ], + [ + 12.767323886374829, + 48.128899410058054 + ], + [ + 12.758258590911142, + 48.126325186269945 + ], + [ + 12.758580945859169, + 48.11840843790956 + ], + [ + 12.74913336445698, + 48.108309587322594 + ], + [ + 12.753416629130792, + 48.085711216083276 + ], + [ + 12.759719209890942, + 48.07505039171868 + ], + [ + 12.851375613392023, + 48.01483389119348 + ], + [ + 12.87330302537267, + 47.96416467588944 + ], + [ + 12.884846485234782, + 47.95920140962782 + ], + [ + 12.917866941339502, + 47.95462775854084 + ], + [ + 12.922835988811183, + 47.939121742792366 + ], + [ + 12.932982184662933, + 47.93996671452841 + ], + [ + 12.937822200391912, + 47.94366302895309 + ], + [ + 12.946417191193458, + 47.921815902919185 + ], + [ + 12.964600348382751, + 47.90333170453681 + ], + [ + 13.003294582569946, + 47.850311691071326 + ], + [ + 13.002718234017447, + 47.84208762522712 + ], + [ + 12.984118183981012, + 47.8278636200259 + ], + [ + 12.964635072780798, + 47.80051018133867 + ], + [ + 12.947141542497608, + 47.78626494176181 + ], + [ + 12.939518842304501, + 47.78508946949988 + ], + [ + 12.93983562716234, + 47.77852471568502 + ], + [ + 12.9282232572942, + 47.771256402564944 + ], + [ + 12.942384192248364, + 47.77095943827367 + ], + [ + 12.944764888189269, + 47.76460279949235 + ], + [ + 12.935572751997029, + 47.758501110576525 + ], + [ + 12.935195282263276, + 47.74731836635249 + ], + [ + 12.917437278182053, + 47.74189330653367 + ], + [ + 12.905046865925852, + 47.723643418113504 + ], + [ + 12.925392717010716, + 47.71032153808968 + ], + [ + 12.946789271306297, + 47.71214515839456 + ], + [ + 12.955512981325544, + 47.70777946262623 + ], + [ + 12.962390084264445, + 47.709464743514495 + ], + [ + 12.973525841353597, + 47.70706584114055 + ], + [ + 12.991431862428868, + 47.70866931673802 + ], + [ + 12.994918926525383, + 47.713045464417895 + ], + [ + 13.001998171218034, + 47.71320162807485 + ], + [ + 13.008318557997752, + 47.72226377320931 + ], + [ + 13.017504911495624, + 47.72288808223715 + ], + [ + 13.026929865447505, + 47.71642052940298 + ], + [ + 13.043893563964076, + 47.71382651988869 + ], + [ + 13.060834878098422, + 47.69711041655522 + ], + [ + 13.080793954131886, + 47.687024143219986 + ], + [ + 13.077159064888676, + 47.669430176882884 + ], + [ + 13.09866058915063, + 47.635407063457535 + ], + [ + 13.095626719340023, + 47.62800763757855 + ], + [ + 13.080387577357182, + 47.61877468381545 + ], + [ + 13.069748847877875, + 47.60496646376908 + ], + [ + 13.06295551129592, + 47.60213285375636 + ], + [ + 13.071881532144852, + 47.58837246041249 + ], + [ + 13.043574403475358, + 47.58344655758905 + ], + [ + 13.042720141468488, + 47.57375649729135 + ], + [ + 13.050856403418193, + 47.563496077258776 + ], + [ + 13.057295139881544, + 47.562109385740094 + ], + [ + 13.031031506738827, + 47.53308655932724 + ], + [ + 13.047331499975263, + 47.52137729165356 + ], + [ + 13.043349511880463, + 47.51986456327585 + ], + [ + 13.04750486091597, + 47.492083025520536 + ], + [ + 13.026176947555534, + 47.48620866281967 + ], + [ + 13.022049382463814, + 47.477658555930766 + ], + [ + 13.00624606112752, + 47.463989248387776 + ], + [ + 13.001083990770404, + 47.46388374649781 + ], + [ + 12.993404834118278, + 47.47166775587034 + ], + [ + 12.994603890441477, + 47.47850166882924 + ], + [ + 12.989320495598912, + 47.47758517092053 + ], + [ + 12.977907427547855, + 47.48462597535849 + ], + [ + 12.973261684276089, + 47.483175729336374 + ], + [ + 12.97273077846294, + 47.47408127512632 + ], + [ + 12.969434352327744, + 47.47418338317756 + ], + [ + 12.908724054337242, + 47.49698922195078 + ], + [ + 12.884407992802482, + 47.51269691543479 + ], + [ + 12.885112695721748, + 47.51859159776778 + ], + [ + 12.880401723254042, + 47.52192234011197 + ], + [ + 12.867514181605445, + 47.52384938988147 + ], + [ + 12.863459943625351, + 47.52796029873986 + ], + [ + 12.85769904685331, + 47.52681310350402 + ], + [ + 12.851984967431846, + 47.530560714710866 + ], + [ + 12.847566238493979, + 47.546034761376056 + ], + [ + 12.817694742361121, + 47.54490706267614 + ], + [ + 12.794479345174974, + 47.55662972508706 + ], + [ + 12.792268330767724, + 47.565135680301125 + ], + [ + 12.784311395017932, + 47.568848701653025 + ], + [ + 12.779230114716123, + 47.57933186820883 + ], + [ + 12.795318871516145, + 47.59325428592097 + ], + [ + 12.791208391558477, + 47.59807616330306 + ], + [ + 12.793545863539022, + 47.60098880436244 + ], + [ + 12.80730291089358, + 47.61022745700855 + ], + [ + 12.813298925684883, + 47.61197830567816 + ], + [ + 12.822798659128164, + 47.609679577925405 + ], + [ + 12.824613710409556, + 47.612104081415175 + ], + [ + 12.789471816480571, + 47.63338336753357 + ], + [ + 12.780705598970995, + 47.63277643595748 + ], + [ + 12.759012632226195, + 47.6509038880939 + ], + [ + 12.760473872584779, + 47.654946117547105 + ], + [ + 12.778405650161266, + 47.660833165041815 + ], + [ + 12.78392748916664, + 47.671618977191706 + ], + [ + 12.781115044923729, + 47.6741413572358 + ], + [ + 12.772528194131725, + 47.6658587567657 + ], + [ + 12.763437083789574, + 47.66701593304573 + ], + [ + 12.757193877782301, + 47.66301170267954 + ], + [ + 12.745756057859523, + 47.67516741830743 + ], + [ + 12.732918019796532, + 47.679463458849014 + ], + [ + 12.715199484673189, + 47.67626937485039 + ], + [ + 12.695908284923512, + 47.6822050073784 + ], + [ + 12.666105063435234, + 47.68077937499811 + ], + [ + 12.64861619497608, + 47.670327279323985 + ], + [ + 12.645386223022237, + 47.67358414993142 + ], + [ + 12.638753305447388, + 47.67100459078951 + ], + [ + 12.630080225225354, + 47.67608732432167 + ], + [ + 12.616801083688188, + 47.67246275999266 + ], + [ + 12.607415246262843, + 47.67371332406658 + ], + [ + 12.596855281995271, + 47.66629531922982 + ], + [ + 12.575034110563818, + 47.632319557972174 + ], + [ + 12.536344089901382, + 47.63647521318671 + ], + [ + 12.512033570616325, + 47.62532322017037 + ], + [ + 12.499216429464555, + 47.62501700328419 + ], + [ + 12.491133479591843, + 47.636998282728094 + ], + [ + 12.4651397582135, + 47.64962436034724 + ], + [ + 12.452843822331545, + 47.66779724251936 + ], + [ + 12.440728358110439, + 47.6738571287735 + ], + [ + 12.443002763634999, + 47.691777182384314 + ], + [ + 12.440126464847236, + 47.69517254648623 + ], + [ + 12.42922215913995, + 47.69622028763597 + ], + [ + 12.401358119459244, + 47.69224480727824 + ], + [ + 12.363702107035863, + 47.68379956905545 + ], + [ + 12.35154231530666, + 47.6920958652889 + ], + [ + 12.338549190790616, + 47.69054639081675 + ], + [ + 12.33519793071897, + 47.6928205914956 + ], + [ + 12.338045373452129, + 47.69708734585649 + ], + [ + 12.28509601025074, + 47.690183767845106 + ], + [ + 12.263200870051039, + 47.678201518078076 + ], + [ + 12.255189496747, + 47.67929499155621 + ], + [ + 12.241167476200498, + 47.69410412403182 + ], + [ + 12.246862654867742, + 47.710842899364174 + ], + [ + 12.264886375492198, + 47.73248306173317 + ], + [ + 12.256972280686906, + 47.743007169680446 + ], + [ + 12.249599236988836, + 47.74143111821112 + ], + [ + 12.22664459026756, + 47.71829077337797 + ], + [ + 12.203651083571108, + 47.70740326862237 + ], + [ + 12.19637569953942, + 47.70845625110176 + ], + [ + 12.183930850938538, + 47.700370556256 + ], + [ + 12.16259845076124, + 47.70112977625077 + ], + [ + 12.168826779773077, + 47.680039148593096 + ], + [ + 12.181792024949976, + 47.66856687276124 + ], + [ + 12.19879337999815, + 47.641441346441624 + ], + [ + 12.208133503262959, + 47.61387732659944 + ], + [ + 12.203881946658136, + 47.6068097342553 + ], + [ + 12.185707725468902, + 47.60469597531738 + ], + [ + 12.178144002295998, + 47.6008666528495 + ], + [ + 12.179044990888634, + 47.61436863046737 + ], + [ + 12.163567401785443, + 47.613477719794346 + ], + [ + 12.139767792500814, + 47.60530345073943 + ], + [ + 12.129001161341325, + 47.60563307613819 + ], + [ + 12.115204887503621, + 47.61143135270149 + ], + [ + 12.082350945591331, + 47.60973439458541 + ], + [ + 12.064237610008513, + 47.618737003045105 + ], + [ + 12.05122565071218, + 47.61486660747184 + ], + [ + 12.03714792784787, + 47.617585619288214 + ], + [ + 12.029536528449729, + 47.61161812186265 + ], + [ + 12.022278158024122, + 47.61113579959274 + ], + [ + 12.008548722112625, + 47.62514902060446 + ], + [ + 11.980852809354113, + 47.618790109096985 + ], + [ + 11.976197767291337, + 47.61296071268332 + ], + [ + 11.968202470542566, + 47.617137187211064 + ], + [ + 11.933131593801159, + 47.6127788402083 + ], + [ + 11.913665543834952, + 47.613795678501184 + ], + [ + 11.90274780443133, + 47.608371582634504 + ], + [ + 11.895403874037772, + 47.60905105222358 + ], + [ + 11.864295076394844, + 47.6010165072227 + ], + [ + 11.854913362816374, + 47.602337562172735 + ], + [ + 11.847336871169542, + 47.58228625862448 + ], + [ + 11.843867748321227, + 47.58121483646446 + ], + [ + 11.829395331258464, + 47.582112623693135 + ], + [ + 11.827411994954574, + 47.5854895621029 + ], + [ + 11.789977303790906, + 47.58769144007645 + ], + [ + 11.78103549404382, + 47.59118533084269 + ], + [ + 11.745031713604966, + 47.587722011550206 + ], + [ + 11.700139838611634, + 47.58894493228617 + ], + [ + 11.681287040369831, + 47.58380760386017 + ], + [ + 11.660253356564764, + 47.58378455588493 + ], + [ + 11.649245394512514, + 47.59032736012748 + ], + [ + 11.64335149742188, + 47.58927200146109 + ], + [ + 11.63713909971425, + 47.59425903776726 + ], + [ + 11.63116731791862, + 47.58671218939696 + ], + [ + 11.633911713569374, + 47.58083171598368 + ], + [ + 11.622131604561849, + 47.58425094682226 + ], + [ + 11.612497836183854, + 47.57984349759572 + ], + [ + 11.605554467553779, + 47.580808683024955 + ], + [ + 11.60043602467938, + 47.567523366926785 + ], + [ + 11.587157418808822, + 47.5551729394017 + ], + [ + 11.587980725052159, + 47.52539813657776 + ], + [ + 11.572452230981039, + 47.51450976932945 + ], + [ + 11.551772336905087, + 47.51336663977197 + ], + [ + 11.535024219146672, + 47.50908249184311 + ], + [ + 11.518341836706544, + 47.51095191012803 + ], + [ + 11.50559888894243, + 47.5047314525608 + ], + [ + 11.487557751571071, + 47.50901607480772 + ], + [ + 11.449547639868031, + 47.50713535909925 + ], + [ + 11.441730599660714, + 47.51761800078528 + ], + [ + 11.437108055175843, + 47.51585355625952 + ], + [ + 11.416676255974664, + 47.50217817167907 + ], + [ + 11.407671843717136, + 47.4908797668877 + ], + [ + 11.391040716733642, + 47.48230562438797 + ], + [ + 11.383809621204762, + 47.472207698936586 + ], + [ + 11.391354971204004, + 47.4665571470881 + ], + [ + 11.409372652960677, + 47.46673893098904 + ], + [ + 11.411704925631952, + 47.456183308388084 + ], + [ + 11.421453926648388, + 47.4447142686482 + ], + [ + 11.375509770391778, + 47.44910481890348 + ], + [ + 11.364434108155054, + 47.44471820594333 + ], + [ + 11.357511900777618, + 47.44875214820126 + ], + [ + 11.338124368194284, + 47.44971730772568 + ], + [ + 11.330917790279752, + 47.44418621349188 + ], + [ + 11.330938888336778, + 47.439075721529434 + ], + [ + 11.32124665933112, + 47.437568270337565 + ], + [ + 11.317453475863656, + 47.43235896098212 + ], + [ + 11.299788234351182, + 47.430817255149535 + ], + [ + 11.2910597949656, + 47.42717287614051 + ], + [ + 11.290032491626222, + 47.40737822979338 + ], + [ + 11.27289185380696, + 47.397852570410876 + ], + [ + 11.236866585254647, + 47.39808991706341 + ], + [ + 11.22500175168975, + 47.395272781338335 + ], + [ + 11.22380062378006, + 47.40136229404967 + ], + [ + 11.24031275200853, + 47.419565241681326 + ], + [ + 11.25341075450496, + 47.428243803408435 + ], + [ + 11.248886574778764, + 47.43256601743399 + ], + [ + 11.220534144681277, + 47.43041477914841 + ], + [ + 11.206910413567664, + 47.43380120784688 + ], + [ + 11.198162189205986, + 47.42748782610892 + ], + [ + 11.155804456357808, + 47.42113987199048 + ], + [ + 11.141063000543804, + 47.41436398256195 + ], + [ + 11.129196925598778, + 47.41279839500556 + ], + [ + 11.122752097985199, + 47.406510645752206 + ], + [ + 11.1242999924508, + 47.40012287140981 + ], + [ + 11.115455043729382, + 47.395593074032625 + ], + [ + 11.061485908007604, + 47.39655863564328 + ], + [ + 11.048272645093752, + 47.39388469285374 + ], + [ + 11.037378272333504, + 47.39653720736673 + ], + [ + 11.031417128151359, + 47.393386234789524 + ], + [ + 11.024098452035078, + 47.396952677028686 + ], + [ + 11.005836953189249, + 47.394119675352805 + ], + [ + 10.970328786407698, + 47.400020582580254 + ], + [ + 10.968640359599831, + 47.41186008695661 + ], + [ + 10.972254471186734, + 47.41754940227327 + ], + [ + 10.984836160432907, + 47.42097075467502 + ], + [ + 10.983600033685594, + 47.430014555641215 + ], + [ + 10.928072665023844, + 47.47192523576567 + ], + [ + 10.9370545250571, + 47.481466456823526 + ], + [ + 10.910112935054041, + 47.48552022734941 + ], + [ + 10.881332422651994, + 47.47925470195229 + ], + [ + 10.870048943881013, + 47.48322013285603 + ], + [ + 10.87047788373288, + 47.49936918999409 + ], + [ + 10.890821767628136, + 47.5075097624903 + ], + [ + 10.9179148111859, + 47.51362991374262 + ], + [ + 10.91560143468307, + 47.51929938841553 + ], + [ + 10.90567615199849, + 47.51747338756505 + ], + [ + 10.900917870269739, + 47.520996658990526 + ], + [ + 10.89020901979512, + 47.5372021994175 + ], + [ + 10.853523710260111, + 47.534625490178755 + ], + [ + 10.83850574171191, + 47.52545111426858 + ], + [ + 10.83101423508293, + 47.52837453660142 + ], + [ + 10.813118553285424, + 47.526418800406155 + ], + [ + 10.81246325011096, + 47.519871223450664 + ], + [ + 10.795397921315264, + 47.52119085966664 + ], + [ + 10.777572469995121, + 47.51393853811711 + ], + [ + 10.763801095611452, + 47.51973852876078 + ], + [ + 10.764018432234538, + 47.52821089361399 + ], + [ + 10.757582351377414, + 47.53472579699362 + ], + [ + 10.738584926306784, + 47.53873741715799 + ], + [ + 10.718336407430977, + 47.53812822827115 + ], + [ + 10.70891616140147, + 47.54370970778652 + ], + [ + 10.694834381401538, + 47.54463813038571 + ], + [ + 10.691187265475326, + 47.55844114010014 + ], + [ + 10.680448815268404, + 47.555472206004524 + ], + [ + 10.676612266283014, + 47.55904566644592 + ], + [ + 10.635409164089534, + 47.55898803433396 + ], + [ + 10.626110225732793, + 47.56097139471871 + ], + [ + 10.619047121481687, + 47.566863353247136 + ], + [ + 10.607918590633973, + 47.56571340601223 + ], + [ + 10.597954197459046, + 47.56971523836228 + ], + [ + 10.58976145122356, + 47.55971994722956 + ], + [ + 10.580289444107446, + 47.555555104102666 + ], + [ + 10.582003029981747, + 47.54827717810306 + ], + [ + 10.573367983135595, + 47.53391708971907 + ], + [ + 10.56420250290559, + 47.53401478303957 + ], + [ + 10.559083647590777, + 47.53715049614183 + ], + [ + 10.5244790078325, + 47.53518709391245 + ], + [ + 10.488858468779737, + 47.54035428297411 + ], + [ + 10.472673078554466, + 47.55088344822777 + ], + [ + 10.454459535594923, + 47.55573834243701 + ], + [ + 10.473073913551241, + 47.57047145389471 + ], + [ + 10.470641833622329, + 47.57969316492846 + ], + [ + 10.47877870954071, + 47.580752011450365 + ], + [ + 10.481778586075086, + 47.58452644573934 + ], + [ + 10.470833617795005, + 47.58707593518665 + ], + [ + 10.456373777893692, + 47.58272212478771 + ], + [ + 10.435533936241663, + 47.58388016270222 + ], + [ + 10.43531151595643, + 47.579279753084144 + ], + [ + 10.429571183322963, + 47.57712329191718 + ], + [ + 10.43538369831302, + 47.567685689059736 + ], + [ + 10.445129000733301, + 47.567280122630024 + ], + [ + 10.451022891906605, + 47.55459572233198 + ], + [ + 10.453980128926101, + 47.55557895878625 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "ADE": 2, + "GF": 1, + "BSG": 1, + "RS": "03", + "AGS": "03", + "SDV_RS": "032410001001", + "GEN": "Niedersachsen", + "BEZ": "Land", + "IBZ": 20, + "BEM": "--", + "NBD": "ja", + "SN_L": "03", + "SN_R": "0", + "SN_K": "00", + "SN_V1": "00", + "SN_V2": "00", + "SN_G": "000", + "FK_S3": "0", + "NUTS": "DE9", + "RS_0": "030000000000", + "AGS_0": "03000000", + "WSK": "2015/01/01", + "DEBKG_ID": "DEBKGDL200010SHR", + "destatis": { + "population": 7826739, + "population_m": 3846089, + "population_w": 3980650 + } + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.549846486929489, + 54.02679661116703 + ], + [ + 7.408732555192809, + 54.00679456590699 + ], + [ + 7.408728796807753, + 54.135687485250344 + ], + [ + 7.448451912139306, + 54.137910176948516 + ], + [ + 7.549846486929489, + 54.02679661116703 + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/README.md b/test/examples/rfc7946/README.md new file mode 100644 index 00000000..793082b3 --- /dev/null +++ b/test/examples/rfc7946/README.md @@ -0,0 +1,5 @@ +Examples copied from RFC 7946 https://datatracker.ietf.org/doc/html/rfc7946 + +Examples licensed under Simplified BSD License + +[![License](https://img.shields.io/badge/License-BSD_2--Clause-orange.svg)](https://opensource.org/licenses/BSD-2-Clause) diff --git a/test/examples/rfc7946/antimeridianCutting1.geojson b/test/examples/rfc7946/antimeridianCutting1.geojson new file mode 100644 index 00000000..81ec5c86 --- /dev/null +++ b/test/examples/rfc7946/antimeridianCutting1.geojson @@ -0,0 +1,25 @@ +{ + "type": "MultiLineString", + "coordinates": [ + [ + [ + 170.0, + 45.0 + ], + [ + 180.0, + 45.0 + ] + ], + [ + [ + -180.0, + 45.0 + ], + [ + -170.0, + 45.0 + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/antimeridianCutting2.geojson b/test/examples/rfc7946/antimeridianCutting2.geojson new file mode 100644 index 00000000..f544abe6 --- /dev/null +++ b/test/examples/rfc7946/antimeridianCutting2.geojson @@ -0,0 +1,53 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 180.0, + 40.0 + ], + [ + 180.0, + 50.0 + ], + [ + 170.0, + 50.0 + ], + [ + 170.0, + 40.0 + ], + [ + 180.0, + 40.0 + ] + ] + ], + [ + [ + [ + -170.0, + 40.0 + ], + [ + -170.0, + 50.0 + ], + [ + -180.0, + 50.0 + ], + [ + -180.0, + 40.0 + ], + [ + -170.0, + 40.0 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/featureCollection.geojson b/test/examples/rfc7946/featureCollection.geojson new file mode 100644 index 00000000..8adcf72d --- /dev/null +++ b/test/examples/rfc7946/featureCollection.geojson @@ -0,0 +1,82 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 102.0, + 0.5 + ] + }, + "properties": { + "prop0": "value0" + } + }, + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 102.0, + 0.0 + ], + [ + 103.0, + 1.0 + ], + [ + 104.0, + 0.0 + ], + [ + 105.0, + 1.0 + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": 0.0 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 0.0 + ], + [ + 101.0, + 1.0 + ], + [ + 100.0, + 1.0 + ], + [ + 100.0, + 0.0 + ] + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + } + } + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/featureCollectionWithBBox1.geojson b/test/examples/rfc7946/featureCollectionWithBBox1.geojson new file mode 100644 index 00000000..cbcb9eaa --- /dev/null +++ b/test/examples/rfc7946/featureCollectionWithBBox1.geojson @@ -0,0 +1,10 @@ +{ + "type": "FeatureCollection", + "bbox": [ + 100.0, + 0.0, + 105.0, + 1.0 + ], + "features": [] +} \ No newline at end of file diff --git a/test/examples/rfc7946/featureCollectionWithBBox2.geojson b/test/examples/rfc7946/featureCollectionWithBBox2.geojson new file mode 100644 index 00000000..314acd34 --- /dev/null +++ b/test/examples/rfc7946/featureCollectionWithBBox2.geojson @@ -0,0 +1,12 @@ +{ + "type": "FeatureCollection", + "bbox": [ + 100.0, + 0.0, + -100.0, + 105.0, + 1.0, + 0.0 + ], + "features": [] +} \ No newline at end of file diff --git a/test/examples/rfc7946/featureWithBBox.geojson b/test/examples/rfc7946/featureWithBBox.geojson new file mode 100644 index 00000000..64143f0c --- /dev/null +++ b/test/examples/rfc7946/featureWithBBox.geojson @@ -0,0 +1,32 @@ +{ + "type": "Feature", + "bbox": [ + -10.0, + -10.0, + 10.0, + 10.0 + ], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -10.0, + -10.0 + ], + [ + 10.0, + -10.0 + ], + [ + 10.0, + 10.0 + ], + [ + -10.0, + -10.0 + ] + ] + ] + } +} \ No newline at end of file diff --git a/test/examples/rfc7946/geometryCollection.geojson b/test/examples/rfc7946/geometryCollection.geojson new file mode 100644 index 00000000..26a66aee --- /dev/null +++ b/test/examples/rfc7946/geometryCollection.geojson @@ -0,0 +1,25 @@ +{ + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "coordinates": [ + 100.0, + 0.0 + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 101.0, + 0.0 + ], + [ + 102.0, + 1.0 + ] + ] + } + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/lineString.geojson b/test/examples/rfc7946/lineString.geojson new file mode 100644 index 00000000..2bb9ba0f --- /dev/null +++ b/test/examples/rfc7946/lineString.geojson @@ -0,0 +1,13 @@ +{ + "type": "LineString", + "coordinates": [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/multiLineString.geojson b/test/examples/rfc7946/multiLineString.geojson new file mode 100644 index 00000000..e99fac02 --- /dev/null +++ b/test/examples/rfc7946/multiLineString.geojson @@ -0,0 +1,25 @@ +{ + "type": "MultiLineString", + "coordinates": [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 1.0 + ] + ], + [ + [ + 102.0, + 2.0 + ], + [ + 103.0, + 3.0 + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/multiPoint.geojson b/test/examples/rfc7946/multiPoint.geojson new file mode 100644 index 00000000..5da5fd3d --- /dev/null +++ b/test/examples/rfc7946/multiPoint.geojson @@ -0,0 +1,13 @@ +{ + "type": "MultiPoint", + "coordinates": [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/multiPolygon.geojson b/test/examples/rfc7946/multiPolygon.geojson new file mode 100644 index 00000000..93530710 --- /dev/null +++ b/test/examples/rfc7946/multiPolygon.geojson @@ -0,0 +1,75 @@ +{ + "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.2, + 0.8 + ], + [ + 100.8, + 0.8 + ], + [ + 100.8, + 0.2 + ], + [ + 100.2, + 0.2 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/point.geojson b/test/examples/rfc7946/point.geojson new file mode 100644 index 00000000..68185cef --- /dev/null +++ b/test/examples/rfc7946/point.geojson @@ -0,0 +1,7 @@ +{ + "type": "Point", + "coordinates": [ + 100.0, + 0.0 + ] +} \ No newline at end of file diff --git a/test/examples/rfc7946/polygon1.geojson b/test/examples/rfc7946/polygon1.geojson new file mode 100644 index 00000000..fecd9ae6 --- /dev/null +++ b/test/examples/rfc7946/polygon1.geojson @@ -0,0 +1,27 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 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/rfc7946/polygon2.geojson b/test/examples/rfc7946/polygon2.geojson new file mode 100644 index 00000000..d3d3589c --- /dev/null +++ b/test/examples/rfc7946/polygon2.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.8, + 0.8 + ], + [ + 100.8, + 0.2 + ], + [ + 100.2, + 0.2 + ], + [ + 100.2, + 0.8 + ], + [ + 100.8, + 0.8 + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/README.md b/test/examples/wikipedia/README.md new file mode 100644 index 00000000..16515051 --- /dev/null +++ b/test/examples/wikipedia/README.md @@ -0,0 +1,5 @@ +Examples copied from Wikipedia https://en.wikipedia.org/wiki/GeoJSON#Geometries + +Examples licensed under Creative Commons Attribution-ShareAlike + +[![License: CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/80x15.png)](https://creativecommons.org/licenses/by-sa/4.0/) \ No newline at end of file diff --git a/test/examples/wikipedia/featureCollection.geojson b/test/examples/wikipedia/featureCollection.geojson new file mode 100644 index 00000000..8adcf72d --- /dev/null +++ b/test/examples/wikipedia/featureCollection.geojson @@ -0,0 +1,82 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 102.0, + 0.5 + ] + }, + "properties": { + "prop0": "value0" + } + }, + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 102.0, + 0.0 + ], + [ + 103.0, + 1.0 + ], + [ + 104.0, + 0.0 + ], + [ + 105.0, + 1.0 + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": 0.0 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 0.0 + ], + [ + 101.0, + 1.0 + ], + [ + 100.0, + 1.0 + ], + [ + 100.0, + 0.0 + ] + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + } + } + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/geometryCollection.geojson b/test/examples/wikipedia/geometryCollection.geojson new file mode 100644 index 00000000..ae97f05d --- /dev/null +++ b/test/examples/wikipedia/geometryCollection.geojson @@ -0,0 +1,52 @@ +{ + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "coordinates": [ + 40.0, + 10.0 + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 10.0, + 10.0 + ], + [ + 20.0, + 20.0 + ], + [ + 10.0, + 40.0 + ] + ] + }, + { + "type": "Polygon", + "coordinates": [ + [ + [ + 40.0, + 40.0 + ], + [ + 20.0, + 45.0 + ], + [ + 45.0, + 30.0 + ], + [ + 40.0, + 40.0 + ] + ] + ] + } + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/lineString.geojson b/test/examples/wikipedia/lineString.geojson new file mode 100644 index 00000000..6e57a5b2 --- /dev/null +++ b/test/examples/wikipedia/lineString.geojson @@ -0,0 +1,17 @@ +{ + "type": "LineString", + "coordinates": [ + [ + 30.0, + 10.0 + ], + [ + 10.0, + 30.0 + ], + [ + 40.0, + 40.0 + ] + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/multiLineString.geojson b/test/examples/wikipedia/multiLineString.geojson new file mode 100644 index 00000000..9b3fe67c --- /dev/null +++ b/test/examples/wikipedia/multiLineString.geojson @@ -0,0 +1,37 @@ +{ + "type": "MultiLineString", + "coordinates": [ + [ + [ + 10.0, + 10.0 + ], + [ + 20.0, + 20.0 + ], + [ + 10.0, + 40.0 + ] + ], + [ + [ + 40.0, + 40.0 + ], + [ + 30.0, + 30.0 + ], + [ + 40.0, + 20.0 + ], + [ + 30.0, + 10.0 + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/multiPoint.geojson b/test/examples/wikipedia/multiPoint.geojson new file mode 100644 index 00000000..46299d13 --- /dev/null +++ b/test/examples/wikipedia/multiPoint.geojson @@ -0,0 +1,21 @@ +{ + "type": "MultiPoint", + "coordinates": [ + [ + 10.0, + 40.0 + ], + [ + 40.0, + 30.0 + ], + [ + 20.0, + 20.0 + ], + [ + 30.0, + 10.0 + ] + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/multiPolygon1.geojson b/test/examples/wikipedia/multiPolygon1.geojson new file mode 100644 index 00000000..c5f47a26 --- /dev/null +++ b/test/examples/wikipedia/multiPolygon1.geojson @@ -0,0 +1,49 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 30.0, + 20.0 + ], + [ + 45.0, + 40.0 + ], + [ + 10.0, + 40.0 + ], + [ + 30.0, + 20.0 + ] + ] + ], + [ + [ + [ + 15.0, + 5.0 + ], + [ + 40.0, + 10.0 + ], + [ + 10.0, + 20.0 + ], + [ + 5.0, + 10.0 + ], + [ + 15.0, + 5.0 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/multiPolygon2.geojson b/test/examples/wikipedia/multiPolygon2.geojson new file mode 100644 index 00000000..46b55de8 --- /dev/null +++ b/test/examples/wikipedia/multiPolygon2.geojson @@ -0,0 +1,71 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 40.0, + 40.0 + ], + [ + 20.0, + 45.0 + ], + [ + 45.0, + 30.0 + ], + [ + 40.0, + 40.0 + ] + ] + ], + [ + [ + [ + 20.0, + 35.0 + ], + [ + 10.0, + 30.0 + ], + [ + 10.0, + 10.0 + ], + [ + 30.0, + 5.0 + ], + [ + 45.0, + 20.0 + ], + [ + 20.0, + 35.0 + ] + ], + [ + [ + 30.0, + 20.0 + ], + [ + 20.0, + 15.0 + ], + [ + 20.0, + 25.0 + ], + [ + 30.0, + 20.0 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/point.geojson b/test/examples/wikipedia/point.geojson new file mode 100644 index 00000000..a5f7d568 --- /dev/null +++ b/test/examples/wikipedia/point.geojson @@ -0,0 +1,7 @@ +{ + "type": "Point", + "coordinates": [ + 30.0, + 10.0 + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/polygon1.geojson b/test/examples/wikipedia/polygon1.geojson new file mode 100644 index 00000000..6591ba56 --- /dev/null +++ b/test/examples/wikipedia/polygon1.geojson @@ -0,0 +1,27 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 30.0, + 10.0 + ], + [ + 40.0, + 40.0 + ], + [ + 20.0, + 40.0 + ], + [ + 10.0, + 20.0 + ], + [ + 30.0, + 10.0 + ] + ] + ] +} \ No newline at end of file diff --git a/test/examples/wikipedia/polygon2.geojson b/test/examples/wikipedia/polygon2.geojson new file mode 100644 index 00000000..f9c99d73 --- /dev/null +++ b/test/examples/wikipedia/polygon2.geojson @@ -0,0 +1,45 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 35.0, + 10.0 + ], + [ + 45.0, + 45.0 + ], + [ + 15.0, + 40.0 + ], + [ + 10.0, + 20.0 + ], + [ + 35.0, + 10.0 + ] + ], + [ + [ + 20.0, + 30.0 + ], + [ + 35.0, + 35.0 + ], + [ + 30.0, + 20.0 + ], + [ + 20.0, + 30.0 + ] + ] + ] +} \ No newline at end of file From 0b0260887ebcbae9f7a86fce629473a5845974d2 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Sun, 19 Dec 2021 16:24:09 +0100 Subject: [PATCH 18/72] bump version for release --- CHANGELOG.md | 8 ++++++++ pubspec.yaml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2abddef5..e1c510f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.0.4 + +- Implements the `featureEach` and `propEach` meta function. [#24](https://github.com/dartclub/turf_dart/pull/24) +- PR [#43](https://github.com/dartclub/turf_dart/pull/43): + - Several bugfixes with the deserialization of JSON + - Several new constructors + - Vector arithmetics operations + ## 0.0.3 - Null-safety support diff --git a/pubspec.yaml b/pubspec.yaml index e887e425..40148b30 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.3 +version: 0.0.4 environment: sdk: '>=2.12.0 <3.0.0' homepage: https://github.com/dartclub/turf_dart From d427d05cfdf54db5b43af203885198cd8f3d01fe Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Sat, 15 Jan 2022 09:37:40 +0100 Subject: [PATCH 19/72] Add basic benchmarking framework (#51) --- README.md | 7 +++ benchmark/meta_benchmark.dart | 83 +++++++++++++++++++++++++++++++++++ pubspec.yaml | 1 + 3 files changed, 91 insertions(+) create mode 100644 benchmark/meta_benchmark.dart diff --git a/README.md b/README.md index a2eb1560..5543df01 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,13 @@ 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). +## Tests and Benchmarks +Tests are run with `dart test` and benchmarks can be run with +`dart run benchmark` + +Any new benchmarks must be named `*_benchmark.dart` and reside in the +`./benchmark` folder. + ## Components ### Measurement diff --git a/benchmark/meta_benchmark.dart b/benchmark/meta_benchmark.dart new file mode 100644 index 00000000..feadb231 --- /dev/null +++ b/benchmark/meta_benchmark.dart @@ -0,0 +1,83 @@ +import 'package:benchmark/benchmark.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/meta.dart'; + +void main() { + Point pt = Point.fromJson({ + 'coordinates': [0, 0] + }); + + Feature featurePt = Feature(geometry: pt.clone()); + + List points = []; + List> pointFeatures = []; + + for (int i = 0; i < 1000; i++) { + points.add(pt.clone()); + pointFeatures.add(Feature(geometry: pt.clone())); + } + + GeometryCollection geomCollection = GeometryCollection( + geometries: points, + ); + + FeatureCollection featureCollection = FeatureCollection( + features: pointFeatures, + ); + + group('geomEach', () { + void geomEachNoopCB( + GeometryObject? currentGeometry, + int? featureIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, + ) {} + + benchmark('geometry', () { + geomEach(pt, geomEachNoopCB); + }); + + benchmark('feature', () { + geomEach(featurePt, geomEachNoopCB); + }); + + benchmark('geometry collection', () { + geomEach(geomCollection, geomEachNoopCB); + }); + + benchmark('feature collection', () { + geomEach(featureCollection, geomEachNoopCB); + }); + }); + + group('propEach', () { + void propEachNoopCB( + Map? currentProperties, + num featureIndex, + ) {} + + benchmark('feature', () { + propEach(featurePt, propEachNoopCB); + }); + + benchmark('feature collection', () { + propEach(featureCollection, propEachNoopCB); + }); + }); + + group('featureEach', () { + void featureEachNoopCB( + Feature currentFeature, + num featureIndex, + ) {} + + benchmark('feature', () { + featureEach(featurePt, featureEachNoopCB); + }); + + benchmark('feature collection', () { + featureEach(featureCollection, featureEachNoopCB); + }); + }); +} diff --git a/pubspec.yaml b/pubspec.yaml index 40148b30..c0b5780c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,3 +15,4 @@ dev_dependencies: json_serializable: ^6.1.1 build_runner: ^2.1.5 analyzer: ^2.7.0 + benchmark: ^0.3.0 From fde76424c6a812ccc584c9c4573651dfe1c5d89c Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Sat, 15 Jan 2022 13:59:35 +0100 Subject: [PATCH 20/72] Add pub version badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5543df01..9cca176a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # turf.dart +[![pub package](https://img.shields.io/pub/v/turf.svg)](https://pub.dev/packages/turf) + THIS PROJECT IS WORK IN PROCESS A [turf.js](https://github.com/Turfjs/turf)-like geospatial analysis library working with GeoJSON, written in pure Dart. From 2aff26ea4f5361d7e515219354a0c38fd7c35338 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Sun, 20 Feb 2022 07:31:31 +0100 Subject: [PATCH 21/72] [meta] add coordeach implementation (#50) * [meta] add coordeach implementation * [benchmark] add coordeach benchmark using test fixtures --- README.md | 8 +- benchmark/meta_benchmark.dart | 40 ++++ lib/src/meta.dart | 144 +++++++++++++ test/components/meta_test.dart | 383 +++++++++++++++++++++++++++++++++ 4 files changed, 571 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9cca176a..6359f4db 100644 --- a/README.md +++ b/README.md @@ -129,9 +129,9 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the ### META - [ ] coordAll -- [ ] coordEach +- [x] coordEach - [ ] coordReduce -- [ ] featureEach +- [x] featureEach - [ ] featureReduce - [ ] flattenEach - [ ] flattenReduce @@ -139,9 +139,9 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] getCoords - [ ] getGeom - [ ] getType -- [ ] geomEach +- [x] geomEach - [ ] geomReduce -- [ ] propEach +- [x] propEach - [ ] propReduce - [ ] segmentEach - [ ] segmentReduce diff --git a/benchmark/meta_benchmark.dart b/benchmark/meta_benchmark.dart index feadb231..0b6132af 100644 --- a/benchmark/meta_benchmark.dart +++ b/benchmark/meta_benchmark.dart @@ -2,6 +2,9 @@ import 'package:benchmark/benchmark.dart'; import 'package:turf/helpers.dart'; import 'package:turf/meta.dart'; +import 'dart:convert'; +import 'dart:io'; + void main() { Point pt = Point.fromJson({ 'coordinates': [0, 0] @@ -25,6 +28,43 @@ void main() { features: pointFeatures, ); + group('coordEach', () { + void coordEachNoopCB( + CoordinateType? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, + ) {} + + benchmark('geometry', () { + coordEach(pt, coordEachNoopCB); + }); + + benchmark('feature', () { + coordEach(featurePt, coordEachNoopCB); + }); + + benchmark('geometry collection', () { + coordEach(geomCollection, coordEachNoopCB); + }); + + benchmark('feature collection', () { + coordEach(featureCollection, coordEachNoopCB); + }); + + var dir = Directory('./test/examples'); + for (var file in dir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var source = (file).readAsStringSync(); + var geoJSON = GeoJSONObject.fromJson(jsonDecode(source)); + benchmark(file.path, () { + coordEach(geoJSON, coordEachNoopCB); + }); + } + } + }); + group('geomEach', () { void geomEachNoopCB( GeometryObject? currentGeometry, diff --git a/lib/src/meta.dart b/lib/src/meta.dart index e673cae7..7f535198 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -1,5 +1,149 @@ import 'geojson.dart'; +typedef CoordEachCallback = dynamic Function( + CoordinateType? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, +); + +/// +/// Iterate over coordinates in any [geoJSON] object, similar to Array.forEach() +/// +/// For example: +/// +/// ```dart +/// // TODO add example +/// ``` +void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, + [bool excludeWrapCoord = false]) { + dynamic coords; + dynamic geometry; + int stopG; + GeoJSONObject? geometryMaybeCollection; + int wrapShrink = 0; + int coordIndex = 0; + bool isGeometryCollection; + bool isFeatureCollection = geoJSON is FeatureCollection; + bool isFeature = geoJSON is Feature; + int stop = isFeatureCollection ? geoJSON.features.length : 1; + + try { + for (var featureIndex = 0; featureIndex < stop; featureIndex++) { + geometryMaybeCollection = isFeatureCollection + ? geoJSON.features[featureIndex].geometry + : isFeature + ? geoJSON.geometry + : geoJSON; + + isGeometryCollection = geometryMaybeCollection != null + ? geometryMaybeCollection is GeometryCollection + : false; + + stopG = + isGeometryCollection ? geometryMaybeCollection.geometries.length : 1; + + for (int geomIndex = 0; geomIndex < stopG; geomIndex++) { + int multiFeatureIndex = 0; + int geometryIndex = 0; + geometry = isGeometryCollection + ? geometryMaybeCollection.geometries[geomIndex] + : geometryMaybeCollection; + + // Handles null Geometry -- Skips this geometry + if (geometry == null) { + continue; + } + coords = geometry.coordinates as Iterable; + GeoJSONObjectType geomType = geometry.type; + + wrapShrink = excludeWrapCoord && + (geomType == GeoJSONObjectType.polygon || + geomType == GeoJSONObjectType.multiLineString) + ? 1 + : 0; + + if (geomType == GeoJSONObjectType.point) { + if (callback(coords as CoordinateType, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) == + false) { + throw _ShortCircuit(); + } + coordIndex++; + multiFeatureIndex++; + break; + } else if (geomType == GeoJSONObjectType.lineString || + geomType == GeoJSONObjectType.multiPoint) { + for (var j = 0; j < coords.length; j++) { + if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, + geometryIndex) == + false) { + throw _ShortCircuit(); + } + coordIndex++; + if (geomType == GeoJSONObjectType.multiPoint) { + multiFeatureIndex++; + } + } + if (geomType == GeoJSONObjectType.lineString) { + multiFeatureIndex++; + } + } else if (geomType == GeoJSONObjectType.polygon || + geomType == GeoJSONObjectType.multiLineString) { + for (var j = 0; j < coords.length; j++) { + for (var k = 0; k < coords[j].length - wrapShrink; k++) { + if (callback(coords[j][k], coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) == + false) { + throw _ShortCircuit(); + } + coordIndex++; + } + if (geomType == GeoJSONObjectType.multiLineString) { + multiFeatureIndex++; + } + if (geomType == GeoJSONObjectType.polygon) { + geometryIndex++; + } + } + if (geomType == GeoJSONObjectType.polygon) { + multiFeatureIndex++; + } + } else if (geomType == GeoJSONObjectType.multiPolygon) { + for (var j = 0; j < coords.length; j++) { + geometryIndex = 0; + for (var k = 0; k < coords[j].length; k++) { + for (var l = 0; l < coords[j][k].length - wrapShrink; l++) { + if (callback(coords[j][k][l], coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) == + false) { + throw _ShortCircuit(); + } + coordIndex++; + } + geometryIndex++; + } + multiFeatureIndex++; + } + } else if (geomType == GeoJSONObjectType.geometryCollection) { + for (var j = 0; j < geometry.geometries.length; j++) { + try { + coordEach(geometry.geometries[j], callback, excludeWrapCoord); + } on _ShortCircuit { + rethrow; + } + } + } else { + throw Exception('Unknown Geometry Type'); + } + } + } + } on _ShortCircuit { + return; + } +} + typedef GeomEachCallback = dynamic Function( GeometryObject? currentGeometry, int? featureIndex, diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index e96a1adb..7179ccc4 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -10,6 +10,7 @@ Feature pt = Feature( 'a': 1, }, ); + Feature line = Feature( geometry: LineString.fromJson({ 'coordinates': [ @@ -18,6 +19,41 @@ Feature line = Feature( ] }), ); + +Feature poly = Feature( + geometry: Polygon.fromJson({ + 'coordinates': [ + [ + [0, 0], + [1, 1], + [0, 1], + [0, 0], + ], + ] + }), +); + +Feature polyWithHole = Feature( + geometry: Polygon.fromJson({ + '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], + ], + ] + }), +); + Feature multiline = Feature( geometry: MultiLineString.fromJson({ 'coordinates': [ @@ -32,6 +68,30 @@ Feature multiline = Feature( ], }), ); + +Feature multiPoly = Feature( + geometry: MultiPolygon.fromJson({ + 'coordinates': [ + [ + [ + [0, 0], + [1, 1], + [0, 1], + [0, 0], + ], + ], + [ + [ + [3, 3], + [2, 2], + [1, 2], + [3, 3], + ], + ], + ] + }), +); + Feature geomCollection = Feature( geometry: GeometryCollection( geometries: [ @@ -42,6 +102,36 @@ Feature geomCollection = Feature( ), ); +FeatureCollection fcMixed = FeatureCollection(features: [ + Feature( + geometry: Point.fromJson({ + 'coordinates': [0, 0], + }), + ), + Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [1, 1], + [2, 2], + ] + }), + ), + Feature( + geometry: MultiLineString.fromJson({ + 'coordinates': [ + [ + [1, 1], + [0, 0], + ], + [ + [4, 4], + [5, 5], + ], + ], + }), + ), +]); + List collection(Feature feature) { FeatureCollection featureCollection = FeatureCollection( features: [ @@ -67,6 +157,299 @@ List featureAndCollection(GeometryObject geometry) { } main() { + test('coordEach -- Point', () { + featureAndCollection(pt.geometry!).forEach((input) { + coordEach(input, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + expect(currentCoord, [0, 0]); + expect(coordIndex, 0); + expect(featureIndex, 0); + expect(multiFeatureIndex, 0); + expect(geometryIndex, 0); + }); + }); + }); + + test('coordEach -- LineString', () { + featureAndCollection(line.geometry!).forEach((input) { + List output = []; + int? lastIndex = 0; + coordEach(input, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + output.add(currentCoord); + lastIndex = coordIndex; + }); + expect(output, [ + [0, 0], + [1, 1] + ]); + expect(lastIndex, 1); + }); + }); + + test('coordEach -- Polygon', () { + featureAndCollection(poly.geometry!).forEach((input) { + List output = []; + int? lastIndex = 0; + coordEach(input, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + output.add(currentCoord); + lastIndex = coordIndex; + }); + expect(output, [ + [0, 0], + [1, 1], + [0, 1], + [0, 0] + ]); + expect(lastIndex, 3); + }); + }); + + test('coordEach -- Polygon excludeWrapCoord', () { + featureAndCollection(poly.geometry!).forEach((input) { + List output = []; + int? lastIndex = 0; + coordEach(input, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + output.add(currentCoord); + lastIndex = coordIndex; + }, true); + expect(lastIndex, 2); + }); + }); + + test('coordEach -- MultiPolygon', () { + List coords = []; + List coordIndexes = []; + List featureIndexes = []; + List multiFeatureIndexes = []; + coordEach(multiPoly, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + coords.add(currentCoord); + coordIndexes.add(coordIndex); + featureIndexes.add(featureIndex); + multiFeatureIndexes.add(multiFeatureIndex); + }); + expect(coordIndexes, [0, 1, 2, 3, 4, 5, 6, 7]); + expect(featureIndexes, [0, 0, 0, 0, 0, 0, 0, 0]); + expect(multiFeatureIndexes, [0, 0, 0, 0, 1, 1, 1, 1]); + expect(coords.length, 8); + }); + + test('coordEach -- FeatureCollection', () { + List coords = []; + List coordIndexes = []; + List featureIndexes = []; + List multiFeatureIndexes = []; + coordEach(fcMixed, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + coords.add(currentCoord); + coordIndexes.add(coordIndex); + featureIndexes.add(featureIndex); + multiFeatureIndexes.add(multiFeatureIndex); + }); + expect(coordIndexes, [0, 1, 2, 3, 4, 5, 6]); + expect(featureIndexes, [0, 1, 1, 2, 2, 2, 2]); + expect(multiFeatureIndexes, [0, 0, 0, 0, 0, 1, 1]); + expect(coords.length, 7); + }); + + test('coordEach -- indexes -- PolygonWithHole', () { + List coordIndexes = []; + List featureIndexes = []; + List multiFeatureIndexes = []; + List geometryIndexes = []; + coordEach(polyWithHole, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + coordIndexes.add(coordIndex); + featureIndexes.add(featureIndex); + multiFeatureIndexes.add(multiFeatureIndex); + geometryIndexes.add(geometryIndex); + }); + expect(coordIndexes, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + expect(featureIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + expect(multiFeatureIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + expect(geometryIndexes, [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]); + }); + + test('coordEach -- indexes -- Multi-Polygon with hole', () { + List featureIndexes = []; + List multiFeatureIndexes = []; + List geometryIndexes = []; + List coordIndexes = []; + + Feature multiPolyWithHole = Feature( + geometry: MultiPolygon.fromJson({ + '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], + ], + ], + ] + }), + ); + + coordEach(multiPolyWithHole, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + coordIndexes.add(coordIndex); + featureIndexes.add(featureIndex); + multiFeatureIndexes.add(multiFeatureIndex); + geometryIndexes.add(geometryIndex); + }); + expect(coordIndexes, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]); + expect(featureIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + expect(multiFeatureIndexes, [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]); + expect(geometryIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]); + }); + + test('coordEach -- indexes -- Polygon with hole', () { + List featureIndexes = []; + List multiFeatureIndexes = []; + List geometryIndexes = []; + List coordIndexes = []; + + Feature polygonWithHole = Feature( + geometry: Polygon.fromJson({ + '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], + ], + ] + }), + ); + + coordEach(polygonWithHole, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + coordIndexes.add(coordIndex); + featureIndexes.add(featureIndex); + multiFeatureIndexes.add(multiFeatureIndex); + geometryIndexes.add(geometryIndex); + }); + expect(coordIndexes, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + expect(featureIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + expect(multiFeatureIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + expect(geometryIndexes, [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]); + }); + + test('coordEach -- indexes -- FeatureCollection of LineString', () { + List featureIndexes = []; + List multiFeatureIndexes = []; + List geometryIndexes = []; + List coordIndexes = []; + + FeatureCollection line = FeatureCollection(features: [ + Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0], + ] + }), + ), + Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [100.2, 0.2], + [100.8, 0.2], + [100.8, 0.8], + [100.2, 0.8], + [100.2, 0.2], + ] + }), + ), + ]); + + coordEach(line, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, + geometryIndex) { + coordIndexes.add(coordIndex); + featureIndexes.add(featureIndex); + multiFeatureIndexes.add(multiFeatureIndex); + geometryIndexes.add(geometryIndex); + }); + expect(coordIndexes, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + expect(featureIndexes, [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]); + expect(multiFeatureIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + expect(geometryIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + }); + + test('coordEach -- breaking of iterations - featureCollection', () { + var count = 0; + + FeatureCollection lines = FeatureCollection(features: [ + Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [10, 10], + [50, 30], + [30, 40], + ] + }), + ), + Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [-10, -10], + [-50, -30], + [-30, -40], + ] + }), + ), + ]); + + coordEach(lines, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, + geometryIndex) { + count += 1; + return false; + }); + expect(count, 1); + }); + + test('coordEach -- breaking of iterations - multiGeometry', () { + var count = 0; + coordEach(multiline, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + count += 1; + return false; + }); + expect(count, 1); + }); + test('propEach --featureCollection', () { collection(pt).forEach((input) { propEach(input, (prop, i) { From f3b6b0aee7d8768af2a12c5b12aec2d340014477 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Wed, 16 Mar 2022 07:38:32 +0100 Subject: [PATCH 22/72] Add implementation for getCoord & getCoords // invariant package (#53) * initial getCoord & getCoords implementation * WIP test coords/coord * test gitpod flutter config * ports invariants package (#62) * dart pub get added * wip, type problem * fixed return error of the test * Gitpod config * new test cases, changed comments * standardized the comments * wrapped List in brackets * some minor typo edit * added highlight in documentation * formatted conflicting files * deleted the gitpod files Co-authored-by: Arman Torkzaban Co-authored-by: arman Co-authored-by: arman Co-authored-by: Arman Torkzaban --- lib/src/invariant.dart | 77 +++++++++++++++++++++++++++++ lib/src/meta.dart | 4 +- test/components/invariant_test.dart | 56 +++++++++++++++++++++ 3 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 lib/src/invariant.dart create mode 100644 test/components/invariant_test.dart diff --git a/lib/src/invariant.dart b/lib/src/invariant.dart new file mode 100644 index 00000000..2cf0859e --- /dev/null +++ b/lib/src/invariant.dart @@ -0,0 +1,77 @@ +import 'package:turf/turf.dart'; + +/// Unwraps a coordinate from a [Point], [Feature], and a [Position]. +/// +/// gets [Position], [Point], and [Feature] and returns [Position]. +/// For example: +/// +/// ```dart +/// var point = Point(coordinates: Position.named(lng: 10, lat: 10)); +/// Position position = getCoord(point); // Position(10, 10) +Position getCoord(dynamic coord) { + if (coord == null) { + throw Exception("coord is required"); + } + + if (coord is Feature && coord.geometry != null) { + return coord.geometry!.coordinates; + } + if (coord is Point) { + return coord.coordinates; + } + if (coord is Position) { + return coord; + } + + throw Exception("coord must be GeoJSON Point or Position"); +} + +/// Unwrap coordinates from a [Feature], [GeometryObject] or a [List] +/// +/// Gets a [List], [GeometryObject] or a [Feature] or a [List] and +/// returns [List]. +/// For example: +/// ```dart +/// var polygon = Polygon(coordinates: [ +/// [ +/// Position(119.32, -8.7), +/// Position(119.55, -8.69), +/// Position(119.51, -8.54), +/// Position(119.32, -8.7) +/// ] +/// ]); +/// +/// var coords = getCoords(poly); +/// /* [[Position(119.32, -8.7), +/// Position(119.55, -8.69), +/// Position(119.51, -8.54), +/// Position(119.32, -8.7)]] */ +/// ``` +List getCoords(dynamic coords) { + if (coords == null) { + throw Exception("coords is required"); + } + + if (coords is List) { + return coords; + } + + if (coords is Feature && coords.geometry != null) { + return _getCoordsForGeometry(coords.geometry!); + } + + if (coords is GeometryObject) { + return _getCoordsForGeometry(coords); + } + + throw Exception( + "Parameter must be a List, Geometry, Feature. coords Feature, Geometry Object or a List"); +} + +_getCoordsForGeometry(GeometryObject geom) { + if (geom is Point || geom is GeometryCollection) { + throw Exception("Type must contain a list of Positions e.g Polygon"); + } + + return (geom as GeometryType).coordinates; +} diff --git a/lib/src/meta.dart b/lib/src/meta.dart index 7f535198..b79c2a33 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -158,8 +158,8 @@ class _ShortCircuit { _ShortCircuit(); } -/// Iterate over each geometry in [geoJSON], calling [callback] on each -/// iteration. Similar to Array.forEach() +/// Iterates over each geometry in [geoJSON], calling [callback] on each +/// iteration. Similar to Iterable.forEach() /// /// For example: /// diff --git a/test/components/invariant_test.dart b/test/components/invariant_test.dart new file mode 100644 index 00000000..3e19cc6c --- /dev/null +++ b/test/components/invariant_test.dart @@ -0,0 +1,56 @@ +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/invariant.dart'; + +main() { + LineString line1 = LineString(coordinates: [Position(1, 2), Position(3, 4)]); + var feature1 = + Feature(geometry: Point(coordinates: Position(1, 2, 3))); + test("invariant -- getCoord", () { + expect(() => getCoord(line1), throwsA(isA())); + expect(() => getCoord(null), throwsA(isA())); + expect(() => getCoord(false), throwsA(isA())); + expect(getCoord(feature1.geometry), Position(1, 2, 3)); + expect(getCoord(feature1), Position(1, 2, 3)); + expect(getCoord(feature1.geometry!.coordinates), Position(1, 2, 3)); + }); + + test("invariant -- getCoords", () { + var feature2 = Feature(geometry: line1); + var polygon = Polygon(coordinates: [ + [ + Position(119.32, -8.7), + Position(119.55, -8.69), + Position(119.51, -8.54), + Position(119.32, -8.7) + ] + ]); + expect(() => getCoords(null), throwsA(isA())); + expect( + getCoords([ + Position.of([119.32, -8.7]), + Position.of([119.55, -8.69]), + Position.of([119.51, -8.54]), + Position.of([119.32, -8.7]) + ]), + equals([ + Position.of([119.32, -8.7]), + Position.of([119.55, -8.69]), + Position.of([119.51, -8.54]), + Position.of([119.32, -8.7]) + ])); + expect(() => getCoords(feature1), throwsA(isA())); + expect(getCoords(feature2), equals([Position(1, 2), Position(3, 4)])); + expect( + getCoords(polygon), + equals([ + [ + Position(119.32, -8.7), + Position(119.55, -8.69), + Position(119.51, -8.54), + Position(119.32, -8.7) + ] + ])); + expect(getCoords(line1), [Position(1, 2), Position(3, 4)]); + }); +} From 0c4522c7f5b71b04c06bb4d758957edab6d749fa Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Wed, 16 Mar 2022 08:21:33 +0100 Subject: [PATCH 23/72] Add flattenEach function and tests (#48) * Add flattenEach function and tests * Refactor flattenEach slightly * Refactor meta -- breaking of iterations tests * Explicitly do not support nested GeometryCollections * Update documentation links * Use more specific type checks in flattenEach test * rm duplicate fcMixed * remove geometryCollection clause * warning for nested GeometryCollection Co-authored-by: Lukas Himsel --- README.md | 41 ++++++---- lib/src/geojson.dart | 3 + lib/src/meta.dart | 80 ++++++++++++++++++- test/components/meta_test.dart | 142 +++++++++++++++++++++++---------- 4 files changed, 204 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 6359f4db..d2e1edc4 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,13 @@ 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). + +## 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` @@ -24,15 +31,15 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] area - [ ] bbox - [ ] bboxPolygon -- [x] [bearing](https://github.com/dartclub/turf_dart/blob/master/lib/bearing.dart) +- [x] [bearing](https://github.com/dartclub/turf_dart/blob/main/lib/bearing.dart) - [ ] center - [ ] centerOfMass - [ ] centroid -- [x] [destination](https://github.com/dartclub/turf_dart/blob/master/lib/destination.dart) -- [x] [distance](https://github.com/dartclub/turf_dart/blob/master/lib/distance.dart) +- [x] [destination](https://github.com/dartclub/turf_dart/blob/main/lib/destination.dart) +- [x] [distance](https://github.com/dartclub/turf_dart/blob/main/lib/distance.dart) - [ ] envelope - [ ] length -- [x] [midpoint](https://github.com/dartclub/turf_dart/blob/master/lib/midpoint.dart) +- [x] [midpoint](https://github.com/dartclub/turf_dart/blob/main/lib/midpoint.dart) - [ ] pointOnFeature - [ ] polygonTangents - [ ] pointToLineDistance @@ -120,7 +127,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] triangleGrid ### Classification -- [x] [nearestPoint](https://github.com/dartclub/turf_dart/blob/master/lib/nearest_point.dart) +- [x] [nearestPoint](https://github.com/dartclub/turf_dart/blob/main/lib/nearest_point.dart) ### Aggregation - [ ] collect @@ -131,17 +138,17 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] coordAll - [x] coordEach - [ ] coordReduce -- [x] featureEach +- [x] [featureEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L157) - [ ] featureReduce -- [ ] flattenEach +- [x] [flattenEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L181) - [ ] flattenReduce - [ ] getCoord - [ ] getCoords - [ ] getGeom - [ ] getType -- [x] geomEach +- [x] [geomEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L34) - [ ] geomReduce -- [x] propEach +- [x] [propEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L124) - [ ] propReduce - [ ] segmentEach - [ ] segmentReduce @@ -168,13 +175,13 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] booleanWithin ### Unit Conversion -- [x] [bearingToAzimuth](https://github.com/dartclub/turf_dart/blob/master/lib/src/helpers.dart#L103) -- [x] [convertArea](https://github.com/dartclub/turf_dart/blob/master/lib/src/helpers.dart#L132) -- [x] [convertLength](https://github.com/dartclub/turf_dart/blob/master/lib/src/helpers.dart#L121) -- [x] [degreesToRadians](https://github.com/dartclub/turf_dart/blob/master/lib/src/helpers.dart#L116) -- [x] [lengthToRadians](https://github.com/dartclub/turf_dart/blob/master/lib/src/helpers.dart#L91) -- [x] [lengthToDegrees](https://github.com/dartclub/turf_dart/blob/master/lib/src/helpers.dart#L99) -- [x] [radiansToLength](https://github.com/dartclub/turf_dart/blob/master/lib/src/helpers.dart#L83) -- [x] [radiansToDegrees](https://github.com/dartclub/turf_dart/blob/master/lib/src/helpers.dart#L111) +- [x] [bearingToAzimuth](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L103) +- [x] [convertArea](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L132) +- [x] [convertLength](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L121) +- [x] [degreesToRadians](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L116) +- [x] [lengthToRadians](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L91) +- [x] [lengthToDegrees](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L99) +- [x] [radiansToLength](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L83) +- [x] [radiansToDegrees](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L111) - [ ] toMercator - [ ] toWgs84 diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index 516effca..6e811578 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -388,6 +388,9 @@ abstract class GeometryType extends GeometryObject { return Polygon.fromJson(json); case GeoJSONObjectType.multiPolygon: return MultiPolygon.fromJson(json); + case GeoJSONObjectType.geometryCollection: + throw Exception( + 'This implementation does not support nested GeometryCollections'); default: throw Exception('${json['type']} is not a valid GeoJSON type'); } diff --git a/lib/src/meta.dart b/lib/src/meta.dart index b79c2a33..d020b915 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -145,7 +145,7 @@ void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, } typedef GeomEachCallback = dynamic Function( - GeometryObject? currentGeometry, + GeometryType? currentGeometry, int? featureIndex, Map? featureProperties, BBox? featureBBox, @@ -309,3 +309,81 @@ void featureEach(GeoJSONObject geoJSON, FeatureEachCallback callback) { throw Exception('Unknown Feature/FeatureCollection Type'); } } + +/// Callback for flattenEach +typedef FlattenEachCallback = dynamic Function( + Feature currentFeature, int featureIndex, int multiFeatureIndex); + +/// Iterate over flattened features in any [geoJSON] object, similar to +/// Array.forEach, calling [callback] on each flattened feature + +/// +/// flattenEach(featureCollection, (currentFeature, featureIndex, multiFeatureIndex) { +/// someOperationOnEachFeature(currentFeature); +/// }); +/// ``` +void flattenEach(GeoJSONObject geoJSON, FlattenEachCallback callback) { + try { + geomEach(geoJSON, (GeometryType? currentGeomObject, featureIndex, + featureProperties, featureBBox, featureId) { + if (currentGeomObject == null || + currentGeomObject is Point || + currentGeomObject is LineString || + currentGeomObject is Polygon) { + _callFlattenEachCallback(callback, currentGeomObject as GeometryType, + featureProperties, featureIndex, 0); + } else { + _forEachFeatureOfMultiFeature( + currentGeomObject, callback, featureProperties, featureIndex); + } + }); + } on _ShortCircuit { + return; + } +} + +void _forEachFeatureOfMultiFeature( + GeoJSONObject currentGeomObject, + FlattenEachCallback callback, + Map? featureProperties, + int? featureIndex) { + if (currentGeomObject is GeometryType) { + for (int multiFeatureIndex = 0; + multiFeatureIndex < currentGeomObject.coordinates.length; + multiFeatureIndex++) { + GeometryType geom; + if (currentGeomObject is MultiPoint) { + geom = Point( + coordinates: currentGeomObject.coordinates[multiFeatureIndex]); + } else if (currentGeomObject is MultiLineString) { + geom = LineString( + coordinates: currentGeomObject.coordinates[multiFeatureIndex]); + } else if (currentGeomObject is MultiPolygon) { + geom = Polygon( + coordinates: currentGeomObject.coordinates[multiFeatureIndex]); + } else { + throw Exception('Unsupported Geometry type'); + } + _callFlattenEachCallback( + callback, geom, featureProperties, featureIndex, multiFeatureIndex); + } + } +} + +void _callFlattenEachCallback( + FlattenEachCallback callback, + GeometryType geom, + Map? featureProperties, + int? featureIndex, + int multiFeatureIndex) { + if (callback( + Feature( + geometry: geom, + properties: featureProperties, + ), + featureIndex ?? 0, + multiFeatureIndex) == + false) { + throw _ShortCircuit(); + } +} diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 7179ccc4..3e2e17bf 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -11,6 +11,12 @@ Feature pt = Feature( }, ); +Feature pt2 = Feature( + geometry: Point.fromJson({ + 'coordinates': [1, 1], + }), +); + Feature line = Feature( geometry: LineString.fromJson({ 'coordinates': [ @@ -69,6 +75,14 @@ Feature multiline = Feature( }), ); +Feature multiPoint = Feature( + geometry: MultiPoint.fromJson({ + 'coordinates': [ + [0, 0], + [1, 1], + ], +})); + Feature multiPoly = Feature( geometry: MultiPolygon.fromJson({ 'coordinates': [ @@ -466,15 +480,6 @@ main() { }); }); - test('propEach --breaking of iterations', () { - var count = 0; - propEach(multiline, (prop, i) { - count += 1; - return false; - }); - expect(count, 1); - }); - test('featureEach --featureCollection', () { collection(pt).forEach((input) { featureEach(input, (feature, i) { @@ -501,15 +506,6 @@ main() { }); }); - test('featureEach --breaking of iterations', () { - var count = 0; - featureEach(multiline, (feature, i) { - count += 1; - return false; - }); - expect(count, 1); - }); - test('geomEach -- GeometryCollection', () { featureAndCollection(geomCollection.geometry!) .forEach((GeoJSONObject input) { @@ -580,7 +576,7 @@ main() { ); }); - test('meta -- breaking of iterations', () { + group('meta -- breaking of iterations', () { FeatureCollection lines = FeatureCollection( features: [ Feature( @@ -619,37 +615,95 @@ main() { ] }), ); + + int iterationCount = 0; + + void runBreakingIterationTest(dynamic func, dynamic callback) { + iterationCount = 0; + func(lines, callback); + expect(iterationCount, 1, reason: func.toString()); + iterationCount = 0; + func(multiLine, callback); + expect(iterationCount, 1, reason: func.toString()); + } + // Each Iterators // meta.segmentEach has been purposely excluded from this list // TODO fill out this list will all 'each' iterators - for (Function func in [geomEach]) { - // Meta Each function should only a value of 1 after returning `false` - // FeatureCollection - var count = 0; - func(lines, ( - GeometryObject? currentGeometry, - int? featureIndex, - Map? featureProperties, - BBox? featureBBox, - dynamic featureId, - ) { - count += 1; + test('geomEach', () { + runBreakingIterationTest(geomEach, (geom, i, props, bbox, id) { + iterationCount += 1; return false; }); - expect(count, 1, reason: func.toString()); - // Multi Geometry - var multiCount = 0; - func(multiLine, ( - GeometryObject? currentGeometry, - int? featureIndex, - Map? featureProperties, - BBox? featureBBox, - dynamic featureId, - ) { - multiCount += 1; + }); + + test('flattenEach', () { + runBreakingIterationTest(flattenEach, (feature, i, mI) { + iterationCount += 1; return false; }); - expect(multiCount, 1, reason: func.toString()); - } + }); + + test('propEach', () { + runBreakingIterationTest(propEach, (prop, i) { + iterationCount += 1; + return false; + }); + }); + + test('featureEach', () { + runBreakingIterationTest(featureEach, (feature, i) { + iterationCount += 1; + return false; + }); + }); + }); + + test('flattenEach -- MultiPoint', () { + featureAndCollection(multiPoint.geometry!).forEach((input) { + List output = []; + flattenEach(input, (currentFeature, index, multiIndex) { + output.add(currentFeature.geometry); + }); + expect(output, [pt.geometry!, pt2.geometry!]); + }); + }); + + test('flattenEach -- Mixed FeatureCollection', () { + List features = []; + List featureIndices = []; + List multiFeatureIndicies = []; + flattenEach(fcMixed, (currentFeature, index, multiIndex) { + features.add(currentFeature); + featureIndices.add(index); + multiFeatureIndicies.add(multiIndex); + }); + expect(featureIndices, [0, 1, 2, 2]); + expect(multiFeatureIndicies, [0, 0, 0, 1]); + expect(features.length, 4); + expect(features[0].geometry, isA()); + expect(features[1].geometry, isA()); + expect(features[2].geometry, isA()); + expect(features[3].geometry, isA()); + }); + + test('flattenEach -- Point-properties', () { + collection(pt).forEach((input) { + Map? lastProperties; + flattenEach(input, (currentFeature, index, multiIndex) { + lastProperties = currentFeature.properties; + }); + expect(lastProperties, pt.properties); + }); + }); + + test('flattenEach -- multiGeometryFeature-properties', () { + collection(geomCollection).forEach((element) { + Map? lastProperties; + flattenEach(element, (currentFeature, index, multiIndex) { + lastProperties = currentFeature.properties; + }); + expect(lastProperties, geomCollection.properties); + }); }); } From ad7b2ad68933d9d75806f989cc108afbf78124a8 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Sat, 19 Mar 2022 13:13:32 +0100 Subject: [PATCH 24/72] refactor coordEach with geomEach, change type in geomEach callback (#68) * [meta] add coordeach implementation * Rework coordEach implementation to match setup more from geomEach * cleanup * optimize for geometry collection * refactor coordEach with geomEach, change type in geomEach callback Co-authored-by: Tobrun Van Nuland --- lib/src/meta.dart | 244 ++++++++++++++++++++++++---------------------- 1 file changed, 130 insertions(+), 114 deletions(-) diff --git a/lib/src/meta.dart b/lib/src/meta.dart index d020b915..88271c90 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -18,132 +18,148 @@ typedef CoordEachCallback = dynamic Function( /// ``` void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, [bool excludeWrapCoord = false]) { - dynamic coords; - dynamic geometry; - int stopG; - GeoJSONObject? geometryMaybeCollection; - int wrapShrink = 0; - int coordIndex = 0; - bool isGeometryCollection; - bool isFeatureCollection = geoJSON is FeatureCollection; - bool isFeature = geoJSON is Feature; - int stop = isFeatureCollection ? geoJSON.features.length : 1; - + _IndexCounter indexCounter = _IndexCounter(); try { - for (var featureIndex = 0; featureIndex < stop; featureIndex++) { - geometryMaybeCollection = isFeatureCollection - ? geoJSON.features[featureIndex].geometry - : isFeature - ? geoJSON.geometry - : geoJSON; - - isGeometryCollection = geometryMaybeCollection != null - ? geometryMaybeCollection is GeometryCollection - : false; + geomEach( + geoJSON, + ( + GeometryType? currentGeometry, + int? featureIndex, + featureProperties, + featureBBox, + featureId, + ) { + if (currentGeometry == null) return; - stopG = - isGeometryCollection ? geometryMaybeCollection.geometries.length : 1; + indexCounter.featureIndex = featureIndex ?? 0; - for (int geomIndex = 0; geomIndex < stopG; geomIndex++) { - int multiFeatureIndex = 0; - int geometryIndex = 0; - geometry = isGeometryCollection - ? geometryMaybeCollection.geometries[geomIndex] - : geometryMaybeCollection; + _forEachCoordInGeometryObject( + currentGeometry, callback, excludeWrapCoord, indexCounter); + }, + ); + } on _ShortCircuit { + return; + } +} - // Handles null Geometry -- Skips this geometry - if (geometry == null) { - continue; - } - coords = geometry.coordinates as Iterable; - GeoJSONObjectType geomType = geometry.type; +void _forEachCoordInGeometryObject( + GeometryType geometry, + CoordEachCallback callback, + bool excludeWrapCoord, + _IndexCounter indexCounter) { + GeoJSONObjectType geomType = geometry.type; + int wrapShrink = excludeWrapCoord && + (geomType == GeoJSONObjectType.polygon || + geomType == GeoJSONObjectType.multiLineString) + ? 1 + : 0; + indexCounter.multiFeatureIndex = 0; - wrapShrink = excludeWrapCoord && - (geomType == GeoJSONObjectType.polygon || - geomType == GeoJSONObjectType.multiLineString) - ? 1 - : 0; + dynamic coords = geometry.coordinates as Iterable; + if (geomType == GeoJSONObjectType.point) { + _forEachCoordInPoint(coords as CoordinateType, callback, indexCounter); + } else if (geomType == GeoJSONObjectType.lineString || + geomType == GeoJSONObjectType.multiPoint) { + _forEachCoordInCollection(coords, geomType, callback, indexCounter); + } else if (geomType == GeoJSONObjectType.polygon || + geomType == GeoJSONObjectType.multiLineString) { + _forEachCoordInNestedCollection( + coords, geomType, wrapShrink, callback, indexCounter); + } else if (geomType == GeoJSONObjectType.multiPolygon) { + _forEachCoordInMultiNestedCollection( + coords, geomType, wrapShrink, callback, indexCounter); + } else { + throw Exception('Unknown Geometry Type'); + } +} - if (geomType == GeoJSONObjectType.point) { - if (callback(coords as CoordinateType, coordIndex, featureIndex, - multiFeatureIndex, geometryIndex) == - false) { - throw _ShortCircuit(); - } - coordIndex++; - multiFeatureIndex++; - break; - } else if (geomType == GeoJSONObjectType.lineString || - geomType == GeoJSONObjectType.multiPoint) { - for (var j = 0; j < coords.length; j++) { - if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, - geometryIndex) == - false) { - throw _ShortCircuit(); - } - coordIndex++; - if (geomType == GeoJSONObjectType.multiPoint) { - multiFeatureIndex++; - } - } - if (geomType == GeoJSONObjectType.lineString) { - multiFeatureIndex++; - } - } else if (geomType == GeoJSONObjectType.polygon || - geomType == GeoJSONObjectType.multiLineString) { - for (var j = 0; j < coords.length; j++) { - for (var k = 0; k < coords[j].length - wrapShrink; k++) { - if (callback(coords[j][k], coordIndex, featureIndex, - multiFeatureIndex, geometryIndex) == - false) { - throw _ShortCircuit(); - } - coordIndex++; - } - if (geomType == GeoJSONObjectType.multiLineString) { - multiFeatureIndex++; - } - if (geomType == GeoJSONObjectType.polygon) { - geometryIndex++; - } - } - if (geomType == GeoJSONObjectType.polygon) { - multiFeatureIndex++; - } - } else if (geomType == GeoJSONObjectType.multiPolygon) { - for (var j = 0; j < coords.length; j++) { - geometryIndex = 0; - for (var k = 0; k < coords[j].length; k++) { - for (var l = 0; l < coords[j][k].length - wrapShrink; l++) { - if (callback(coords[j][k][l], coordIndex, featureIndex, - multiFeatureIndex, geometryIndex) == - false) { - throw _ShortCircuit(); - } - coordIndex++; - } - geometryIndex++; - } - multiFeatureIndex++; - } - } else if (geomType == GeoJSONObjectType.geometryCollection) { - for (var j = 0; j < geometry.geometries.length; j++) { - try { - coordEach(geometry.geometries[j], callback, excludeWrapCoord); - } on _ShortCircuit { - rethrow; - } - } - } else { - throw Exception('Unknown Geometry Type'); +void _forEachCoordInMultiNestedCollection(coords, GeoJSONObjectType geomType, + int wrapShrink, CoordEachCallback callback, _IndexCounter indexCounter) { + for (var j = 0; j < coords.length; j++) { + int geometryIndex = 0; + for (var k = 0; k < coords[j].length; k++) { + for (var l = 0; l < coords[j][k].length - wrapShrink; l++) { + if (callback( + coords[j][k][l], + indexCounter.coordIndex, + indexCounter.featureIndex, + indexCounter.multiFeatureIndex, + geometryIndex) == + false) { + throw _ShortCircuit(); } + indexCounter.coordIndex++; } + geometryIndex++; } - } on _ShortCircuit { - return; + indexCounter.multiFeatureIndex++; } } +void _forEachCoordInNestedCollection(coords, GeoJSONObjectType geomType, + int wrapShrink, CoordEachCallback callback, _IndexCounter indexCounter) { + for (var j = 0; j < coords.length; j++) { + for (var k = 0; k < coords[j].length - wrapShrink; k++) { + if (callback( + coords[j][k], + indexCounter.coordIndex, + indexCounter.featureIndex, + indexCounter.multiFeatureIndex, + indexCounter.geometryIndex) == + false) { + throw _ShortCircuit(); + } + indexCounter.coordIndex++; + } + if (geomType == GeoJSONObjectType.multiLineString) { + indexCounter.multiFeatureIndex++; + } + if (geomType == GeoJSONObjectType.polygon) { + indexCounter.geometryIndex++; + } + } + if (geomType == GeoJSONObjectType.polygon) { + indexCounter.multiFeatureIndex++; + } +} + +void _forEachCoordInCollection(coords, GeoJSONObjectType geomType, + CoordEachCallback callback, _IndexCounter indexCounter) { + for (var j = 0; j < coords.length; j++) { + if (callback(coords[j], indexCounter.coordIndex, indexCounter.featureIndex, + indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == + false) { + throw _ShortCircuit(); + } + indexCounter.coordIndex++; + if (geomType == GeoJSONObjectType.multiPoint) { + indexCounter.multiFeatureIndex++; + } + } + if (geomType == GeoJSONObjectType.lineString) { + indexCounter.multiFeatureIndex++; + } +} + +void _forEachCoordInPoint(CoordinateType coords, CoordEachCallback callback, + _IndexCounter indexCounter) { + if (callback(coords, indexCounter.coordIndex, indexCounter.featureIndex, + indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == + false) { + throw _ShortCircuit(); + } + indexCounter.coordIndex++; + indexCounter.multiFeatureIndex++; +} + +/// A simple class to manage counters from CoordinateEach functions +class _IndexCounter { + int coordIndex = 0; + int geometryIndex = 0; + int multiFeatureIndex = 0; + int featureIndex = 0; +} + typedef GeomEachCallback = dynamic Function( GeometryType? currentGeometry, int? featureIndex, From 5c0d02a06743d58770b16f32c15ee1549b24f66c Mon Sep 17 00:00:00 2001 From: arman Date: Mon, 21 Mar 2022 09:15:04 +0100 Subject: [PATCH 25/72] Port coordAll function and test, also: refactor coordEach callback (#64) * beginning * wip coordAll * coordAll test, WIP * changes CoordEachCallback's signature * typecast removed, test corrected * changes before merging * refactor for Position in CoordEachCallback Co-authored-by: Lukas Himsel --- README.md | 2 +- lib/src/meta.dart | 49 +++++++++++++++++++++++++++------- test/components/meta_test.dart | 35 ++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d2e1edc4..5ec7449d 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] clustersKmeans ### META -- [ ] coordAll +- [x] coordAll - [x] coordEach - [ ] coordReduce - [x] [featureEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L157) diff --git a/lib/src/meta.dart b/lib/src/meta.dart index 88271c90..51782dbe 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -1,7 +1,7 @@ import 'geojson.dart'; typedef CoordEachCallback = dynamic Function( - CoordinateType? currentCoord, + Position? currentCoord, int? coordIndex, int? featureIndex, int? multiFeatureIndex, @@ -9,12 +9,12 @@ typedef CoordEachCallback = dynamic Function( ); /// -/// Iterate over coordinates in any [geoJSON] object, similar to Array.forEach() +/// Iterate over coordinates in any [geoJSON] object, similar to [Iterable.forEach()] /// /// For example: /// /// ```dart -/// // TODO add example +/// //TODO add example /// ``` void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, [bool excludeWrapCoord = false]) { @@ -55,9 +55,9 @@ void _forEachCoordInGeometryObject( : 0; indexCounter.multiFeatureIndex = 0; - dynamic coords = geometry.coordinates as Iterable; + var coords = geometry.coordinates; if (geomType == GeoJSONObjectType.point) { - _forEachCoordInPoint(coords as CoordinateType, callback, indexCounter); + _forEachCoordInPoint(coords, callback, indexCounter); } else if (geomType == GeoJSONObjectType.lineString || geomType == GeoJSONObjectType.multiPoint) { _forEachCoordInCollection(coords, geomType, callback, indexCounter); @@ -141,8 +141,8 @@ void _forEachCoordInCollection(coords, GeoJSONObjectType geomType, } } -void _forEachCoordInPoint(CoordinateType coords, CoordEachCallback callback, - _IndexCounter indexCounter) { +void _forEachCoordInPoint( + Position coords, CoordEachCallback callback, _IndexCounter indexCounter) { if (callback(coords, indexCounter.coordIndex, indexCounter.featureIndex, indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == false) { @@ -265,7 +265,7 @@ typedef PropEachCallback = dynamic Function( Map? currentProperties, num featureIndex); /// Iterate over properties in any [geoJSON] object, calling [callback] on each -/// iteration. Similar to Array.forEach() +/// iteration. Similar to [Iterable.forEach()] /// /// For example: /// @@ -298,7 +298,7 @@ typedef FeatureEachCallback = dynamic Function( Feature currentFeature, num featureIndex); /// Iterate over features in any [geoJSON] object, calling [callback] on each -/// iteration. Similar to Array.forEach. +/// iteration. Similar to [Iterable.forEach()]. /// /// For example: /// @@ -331,7 +331,7 @@ typedef FlattenEachCallback = dynamic Function( Feature currentFeature, int featureIndex, int multiFeatureIndex); /// Iterate over flattened features in any [geoJSON] object, similar to -/// Array.forEach, calling [callback] on each flattened feature +/// [Iterable.forEach()], calling [callback] on each flattened feature /// /// flattenEach(featureCollection, (currentFeature, featureIndex, multiFeatureIndex) { @@ -403,3 +403,32 @@ void _callFlattenEachCallback( throw _ShortCircuit(); } } + +/// Gets all coordinates from any [GeoJSONObject]. +/// Receives any [GeoJSONObject] +/// Returns [List] +/// For example: +/// +/// ```dart +/// var featureColl = FeatureCollection(features: +/// [Feature(geometry: Point(coordinates: Position(13,15))) +/// ,Feature(geometry: LineString(coordinates: [Position(1, 2), +/// Position(67, 50)]))]); +/// +/// var coords = coordAll(features); +/// //= [Position(13,15), Position(1, 2), Position(67, 50)] +/// +List coordAll(GeoJSONObject geojson) { + List coords = []; + coordEach(geojson, ( + Position? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, + ) { + coords.add(currentCoord); + return true; + }); + return coords; +} diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 3e2e17bf..adbfffe7 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -706,4 +706,39 @@ main() { expect(lastProperties, geomCollection.properties); }); }); + + test('meta -- coordAll', () { + FeatureCollection lines = FeatureCollection( + features: [ + Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [10, 10], + [50, 30], + [30, 40] + ] + }), + ), + Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [-10, -10], + [-50, -30], + [-30, -40] + ] + }), + ), + ], + ); + + List results = coordAll(lines); + expect(results, [ + Position.of([10, 10]), + Position.of([50, 30]), + Position.of([30, 40]), + Position.of([-10, -10]), + Position.of([-50, -30]), + Position.of([-30, -40]), + ]); + }); } From 4f49a28f70976240f9f573bb31b0ae78fb58f549 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Thu, 24 Mar 2022 09:40:22 +0100 Subject: [PATCH 26/72] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5ec7449d..82c1d72e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,9 @@ 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). +## GeoJSON Object Model + +![polymorphism](https://user-images.githubusercontent.com/10634693/159876354-f9da2f37-02b3-4546-b32a-c0f82c372272.png) ## Notable Design Decisions - Nested `GeometryCollections` (as described in From 16ade7ab6d46a4e7381836a7771a89e63008c346 Mon Sep 17 00:00:00 2001 From: Brad Parham Date: Fri, 25 Mar 2022 11:40:52 +0100 Subject: [PATCH 27/72] Feature reducers (#49) * Temporarily type geomEach callback to GeometryType * Add geomReduce function and tests * propReduce function * WIP - featureReduce() * WIP * added examples and documentations * flattenReduce WIP * WIP * coordReduce * documentation * add static types * merge readme * prepare new merge * generic types for all reducer functions * TurfJS compatible solution with type checks * add cloning * fixed types passed to callbacks, propReduce test * flattenReduce and featureReduce test * coordReduce * minor type conv. num to int Co-authored-by: Arman Torkzaban Co-authored-by: Lukas Himsel --- lib/src/meta.dart | 392 +++++++++++++++++++++++++++++++-- test/components/meta_test.dart | 272 ++++++++++++++++++++--- 2 files changed, 620 insertions(+), 44 deletions(-) diff --git a/lib/src/meta.dart b/lib/src/meta.dart index 51782dbe..f34e581a 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -8,13 +8,23 @@ typedef CoordEachCallback = dynamic Function( int? geometryIndex, ); -/// -/// Iterate over coordinates in any [geoJSON] object, similar to [Iterable.forEach()] +/// Iterates over coordinates in any [geoJSON] object, similar to [Iterable.forEach] /// /// For example: /// /// ```dart -/// //TODO add example +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// coordEach(features, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) { +/// //=currentCoord +/// //=coordIndex +/// //=featureIndex +/// //=multiFeatureIndex +/// //=geometryIndex +/// }); /// ``` void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, [bool excludeWrapCoord = false]) { @@ -175,7 +185,7 @@ class _ShortCircuit { } /// Iterates over each geometry in [geoJSON], calling [callback] on each -/// iteration. Similar to Iterable.forEach() +/// iteration. Similar to [Iterable.forEach] /// /// For example: /// @@ -260,12 +270,92 @@ void _forEachGeomInGeometryObject( } } +/// Callback for geomReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an [initialValue] argument. +/// +/// If an initialValue is provided to the reduce method: +/// - The [previousValue] argument is [initialValue]. +/// - The [currentValue] argument is the value of the first element present in the [List]. +/// +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in the [List]. +/// - The [currentGeometry] argument is the value of the second element present in the [List]. +typedef GeomReduceCallback = T? Function( + T? previousValue, + GeometryType? currentGeometry, + int? featureIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, +); + +/// Reduces geometry in any [GeoJSONObject], similar to [Iterable.reduce]. +/// +/// Takes [FeatureCollection], [Feature] or [GeometryObject], a [GeomReduceCallback] method +/// that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) and +/// an [initialValue] Value to use as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// geomReduce(features, (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) { +/// //=previousValue +/// //=currentGeometry +/// //=featureIndex +/// //=featureProperties +/// //=featureBBox +/// //=featureId +/// return currentGeometry +/// }); +/// ``` + +T? geomReduce( + GeoJSONObject geoJSON, + GeomReduceCallback callback, + T? initialValue, +) { + T? previousValue = initialValue; + geomEach( + geoJSON, + ( + currentGeometry, + featureIndex, + featureProperties, + featureBBox, + featureId, + ) { + if (previousValue == null && featureIndex == 0 && currentGeometry is T) { + previousValue = currentGeometry?.clone() as T; + } else { + previousValue = callback( + previousValue, + currentGeometry, + featureIndex, + featureProperties, + featureBBox, + featureId, + ); + } + }, + ); + return previousValue; +} + /// Callback for propEach typedef PropEachCallback = dynamic Function( - Map? currentProperties, num featureIndex); + Map? currentProperties, + int featureIndex, +); -/// Iterate over properties in any [geoJSON] object, calling [callback] on each -/// iteration. Similar to [Iterable.forEach()] +/// Iterates over properties in any [geoJSON] object, calling [callback] on each +/// iteration. Similar to [Iterable.forEach] /// /// For example: /// @@ -295,10 +385,12 @@ void propEach(GeoJSONObject geoJSON, PropEachCallback callback) { /// Callback for featureEach typedef FeatureEachCallback = dynamic Function( - Feature currentFeature, num featureIndex); + Feature currentFeature, + int featureIndex, +); -/// Iterate over features in any [geoJSON] object, calling [callback] on each -/// iteration. Similar to [Iterable.forEach()]. +/// Iterates over features in any [geoJSONObject], calling [callback] on each +/// iteration. Similar to [Iterable.forEach]. /// /// For example: /// @@ -328,12 +420,14 @@ void featureEach(GeoJSONObject geoJSON, FeatureEachCallback callback) { /// Callback for flattenEach typedef FlattenEachCallback = dynamic Function( - Feature currentFeature, int featureIndex, int multiFeatureIndex); - -/// Iterate over flattened features in any [geoJSON] object, similar to -/// [Iterable.forEach()], calling [callback] on each flattened feature + Feature currentFeature, + int featureIndex, + int multiFeatureIndex, +); -/// +/// Iterates over flattened features in any [geoJSONObject], similar to +/// [Iterate.forEach], calling [callback] on each flattened feature +///```dart /// flattenEach(featureCollection, (currentFeature, featureIndex, multiFeatureIndex) { /// someOperationOnEachFeature(currentFeature); /// }); @@ -404,6 +498,274 @@ void _callFlattenEachCallback( } } +/// Callback for propReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an [initialValue] argument. +/// +/// If an [initialValue] is provided to the reduce method: +/// - The [previousValue] argument is initialValue. +/// - The [currentValue] argument is the value of the first element present in the [List]. +/// +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in the [List]. +/// - The [currentValue] argument is the value of the second element present in the [List]. +/// +/// propReduceCallback +/// [previousValue] The accumulated value previously returned in the last invocation +/// of the callback, or [initialValue], if supplied. +/// [currentProperties] The current Properties being processed. +/// [featureIndex] The current index of the Feature being processed. +/// +typedef PropReduceCallback = T? Function( + T? previousValue, // todo: or 'Map?'? + Map? currentProperties, + int featureIndex, +); + +/// Reduces properties in any [GeoJSONObject] into a single value, +/// similar to how [Iterable.reduce] works. However, in this case we lazily run +/// the reduction, so List of all properties is unnecessary. +/// +/// Takes any [FeatureCollection] or [Feature], a [PropReduceCallback], an [initialValue] +/// to be used as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// propReduce(features, (previousValue, currentProperties, featureIndex) { +/// //=previousValue +/// //=currentProperties +/// //=featureIndex +/// return currentProperties +/// }); +/// ``` + +T? propReduce( + GeoJSONObject geojson, + PropReduceCallback callback, + T? initialValue, +) { + T? previousValue = initialValue; + propEach(geojson, (currentProperties, featureIndex) { + if (featureIndex == 0 && initialValue == null) { + previousValue = currentProperties != null + ? Map.of(currentProperties) as T + : null; + } else { + previousValue = callback(previousValue, currentProperties, featureIndex); + } + }); + return previousValue; +} + +/// Callback for featureReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an initialValue argument. +/// +/// If an initialValue is provided to the reduce method: +/// - The previousValue argument is initialValue. +/// - The currentValue argument is the value of the first element present in the List. +/// +/// If an initialValue is not provided: +/// - The previousValue argument is the value of the first element present in the List. +/// - The currentValue argument is the value of the second element present in the List. +/// +/// FeatureReduceCallback +/// [previousValue] is the accumulated value previously returned in the last invocation +/// of the callback, or [initialValue], if supplied. +/// currentFeature is the current [Feature] being processed. +/// [featureIndex] is the current index of the [Feature] being processed. + +typedef FeatureReduceCallback = T? Function( + T? previousValue, // todo or Feature ? + Feature currentFeature, + int featureIndex, +); + +/// Reduces features in any GeoJSONObject, similar to [Iterable.reduce]. +/// +/// Takes [FeatureCollection], [Feature], or [GeometryObject], +/// a [FeatureReduceCallback] method that takes (previousValue, currentFeature, featureIndex), and +/// an [initialValue] Value to use as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// featureReduce(features, (previousValue, currentFeature, featureIndex) { +/// //=previousValue +/// //=currentFeature +/// //=featureIndex +/// return currentFeature +/// }); +/// ``` + +T? featureReduce( + GeoJSONObject geojson, + FeatureReduceCallback callback, + T? initialValue, +) { + T? previousValue = initialValue; + featureEach(geojson, (currentFeature, featureIndex) { + if (featureIndex == 0 && initialValue == null && currentFeature is T) { + previousValue = currentFeature.clone() as T; + } else { + previousValue = callback(previousValue, currentFeature, featureIndex); + } + }); + return previousValue; +} + +/// Callback for flattenReduce +/// The first time the callback function is called, the values provided as +/// arguments depend on whether the reduce method has an [initialValue] argument. +/// If an [initialValue] is provided to the reduce method: +/// - The [previousValue] argument is initialValue. +/// - The [currentValue] argument is the value of the first element present in the +/// [List]. +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in +/// the [List]. +/// - The [currentValue] argument is the value of the second element present in +/// the [List]. +/// +/// flattenReduceCallback +/// [previousValue] is the accumulated value previously returned in the +/// last invocation of the callback, or [initialValue], if supplied. +/// [currentFeature] is the current Feature being processed. +/// [featureIndex] is the current index of the Feature being processed. +/// [multiFeatureIndex] is the current index of the Multi-Feature being +/// processed. +typedef FlattenReduceCallback = T? Function(T? previousValue, + Feature currentFeature, int featureIndex, int multiFeatureIndex); + +/// Reduces flattened features in any [GeoJSONObject], similar to [Iterable.reduce]. +/// Takes a [FeatureCollection], [Feature], or [Geometry] +/// a [FlattenReduceCallback] method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex), +/// an [initialValue] Value to use as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// flattenReduce(features, (previousValue, currentFeature, featureIndex, multiFeatureIndex) { +/// //=previousValue +/// //=currentFeature +/// //=featureIndex +/// //=multiFeatureIndex +/// return currentFeature +/// }); +/// ``` + +T? flattenReduce( + GeoJSONObject geojson, + FlattenReduceCallback callback, + T? initialValue, +) { + T? previousValue = initialValue; + flattenEach(geojson, (currentFeature, featureIndex, multiFeatureIndex) { + if (featureIndex == 0 && + multiFeatureIndex == 0 && + initialValue == null && + currentFeature is T) { + previousValue = currentFeature.clone() as T; + } else { + previousValue = callback( + previousValue, currentFeature, featureIndex, multiFeatureIndex); + } + }); + return previousValue; +} + +/// Callback for coordReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an initialValue argument. +/// +/// If an [initialValue] is provided to the reduce method: +/// - The [previousValue] argument is initialValue. +/// - The [currentValue] argument is the value of the first element present in the [List]. +/// +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in the [List]. +/// - The [currentValue] argument is the value of the second element present in the [List]. +/// +/// Takes [previousValue], the accumulated value previously returned in the last invocation +/// of the callback, or [initialValue], if supplied, +/// [Position][currentCoord] The current coordinate being processed, [coordIndex] +/// The current index of the coordinate being processed. Starts at index 0, if an +/// initialValue is provided, and at index 1 otherwise, [featureIndex] The current +/// index of the Feature being processed, [multiFeatureIndex], the current index +/// of the Multi-Feature being processed., and [geometryIndex], the current index of the Geometry being processed. +typedef CoordReduceCallback = T? Function( + T? previousValue, // todo: change to CoordType + Position? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, +); + +/// Reduces coordinates in any [GeoJSONObject], similar to [Iterable.reduce] +/// +/// Takes [FeatureCollection], [GeometryObject], or a [Feature], +/// a [CoordReduceCallback] method that takes (previousValue, currentCoord, coordIndex), an +/// [initialValue] Value to use as the first argument to the first call of the callback, +/// and a boolean [excludeWrapCoord=false] for whether or not to include the final coordinate +/// of LinearRings that wraps the ring in its iteration. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// coordReduce(features, (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) { +/// //=previousValue +/// //=currentCoord +/// //=coordIndex +/// //=featureIndex +/// //=multiFeatureIndex +/// //=geometryIndex +/// return currentCoord; +/// }); + +T? coordReduce( + GeoJSONObject geojson, + CoordReduceCallback callback, + T? initialValue, [ + bool excludeWrapCoord = false, +]) { + var previousValue = initialValue; + coordEach(geojson, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, + geometryIndex) { + if (coordIndex == 0 && initialValue == null && currentCoord is T) { + previousValue = currentCoord?.clone() as T; + } else { + previousValue = callback(previousValue, currentCoord, coordIndex, + featureIndex, multiFeatureIndex, geometryIndex); + } + }, excludeWrapCoord); + return previousValue; +} + /// Gets all coordinates from any [GeoJSONObject]. /// Receives any [GeoJSONObject] /// Returns [List] diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index adbfffe7..2fe18aef 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:test/test.dart'; import 'package:turf/helpers.dart'; import 'package:turf/meta.dart'; @@ -118,32 +120,35 @@ Feature geomCollection = Feature( FeatureCollection fcMixed = FeatureCollection(features: [ Feature( - geometry: Point.fromJson({ - 'coordinates': [0, 0], - }), + geometry: Point.fromJson( + { + 'coordinates': [0, 0], + }, + ), + properties: {'foo': 'bar'}, ), Feature( - geometry: LineString.fromJson({ - 'coordinates': [ - [1, 1], - [2, 2], - ] - }), - ), - Feature( - geometry: MultiLineString.fromJson({ - 'coordinates': [ - [ + geometry: LineString.fromJson({ + 'coordinates': [ [1, 1], - [0, 0], - ], - [ - [4, 4], - [5, 5], + [2, 2], + ] + }), + properties: {'foo': 'buz'}), + Feature( + geometry: MultiLineString.fromJson({ + 'coordinates': [ + [ + [1, 1], + [0, 0], + ], + [ + [4, 4], + [5, 5], + ], ], - ], - }), - ), + }), + properties: {'foo': 'qux'}), ]); List collection(Feature feature) { @@ -170,6 +175,35 @@ List featureAndCollection(GeometryObject geometry) { return [geometry, feature, featureCollection]; } +/// Returns a FeatureCollection with a total of 8 copies of [geometryType] +/// in a mix of features of [geometryType], and features of geometry collections +/// containing [geometryType] +FeatureCollection getAsMixedFeatCollection( + GeometryType geometryType, +) { + GeometryCollection geometryCollection = GeometryCollection( + geometries: [ + geometryType, + geometryType, + geometryType, + ], + ); + Feature geomCollectionFeature = Feature( + geometry: geometryCollection, + ); + Feature geomFeature = Feature( + geometry: geometryType, + ); + return FeatureCollection( + features: [ + geomFeature, + geomCollectionFeature, + geomFeature, + geomCollectionFeature, + ], + ); +} + main() { test('coordEach -- Point', () { featureAndCollection(pt.geometry!).forEach((input) { @@ -269,7 +303,7 @@ main() { expect(coords.length, 7); }); - test('coordEach -- indexes -- PolygonWithHole', () { + test('coordEach -- Indexes -- PolygonWithHole', () { List coordIndexes = []; List featureIndexes = []; List multiFeatureIndexes = []; @@ -287,7 +321,7 @@ main() { expect(geometryIndexes, [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]); }); - test('coordEach -- indexes -- Multi-Polygon with hole', () { + test('coordEach -- Indexes -- Multi-Polygon with hole', () { List featureIndexes = []; List multiFeatureIndexes = []; List geometryIndexes = []; @@ -338,7 +372,7 @@ main() { expect(geometryIndexes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]); }); - test('coordEach -- indexes -- Polygon with hole', () { + test('coordEach -- Indexes -- Polygon with hole', () { List featureIndexes = []; List multiFeatureIndexes = []; List geometryIndexes = []; @@ -378,7 +412,7 @@ main() { expect(geometryIndexes, [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]); }); - test('coordEach -- indexes -- FeatureCollection of LineString', () { + test('coordEach -- Indexes -- FeatureCollection of LineString', () { List featureIndexes = []; List multiFeatureIndexes = []; List geometryIndexes = []; @@ -671,14 +705,14 @@ main() { test('flattenEach -- Mixed FeatureCollection', () { List features = []; - List featureIndices = []; + List featureIndexes = []; List multiFeatureIndicies = []; flattenEach(fcMixed, (currentFeature, index, multiIndex) { features.add(currentFeature); - featureIndices.add(index); + featureIndexes.add(index); multiFeatureIndicies.add(multiIndex); }); - expect(featureIndices, [0, 1, 2, 2]); + expect(featureIndexes, [0, 1, 2, 2]); expect(multiFeatureIndicies, [0, 0, 0, 1]); expect(features.length, 4); expect(features[0].geometry, isA()); @@ -707,6 +741,186 @@ main() { }); }); + test('propReduce with initialValue', () { + String concatPropertyValues( + previousValue, + currentProperties, + featureIndex, + ) { + return "$previousValue ${currentProperties?.values.first}"; + } + + expect(propReduce(pt, concatPropertyValues, 'hello'), 'hello 1'); + }); + + test('propReduce -- without initial value', () { + Map? concatPropertyValues( + Map? previousValue, + Map? currentProperties, + num featureIndex, + ) { + return {'foo': previousValue!['foo'] + currentProperties!['foo']}; + } + + var results = + propReduce>(fcMixed, concatPropertyValues, null); + expect(results?['foo'], 'barbuzqux'); + }); + + test('featureReduce -- with/out initialValue', () { + int? countReducer( + int? previousValue, + currentFeature, + featureIndex, + ) { + return (previousValue ?? 0) + 1; + } + + expect(featureReduce(fcMixed, countReducer, null), 3); + expect(featureReduce(fcMixed, countReducer, 5), 8); + expect(featureReduce(pt, countReducer, null), 1); + }); + test('flattenReduce -- with/out initialValue', () { + int? countReducer(int? previousValue, Feature currentFeature, + int featureIndex, int multiFeatureIndex) { + return (previousValue ?? 0) + 1; + } + + expect(flattenReduce(fcMixed, countReducer, null), 4); + expect(flattenReduce(fcMixed, countReducer, 5), 9); + expect(flattenReduce(pt, countReducer, null), 1); + }); + + test('coordReduce -- with/out initialValue', () { + int? countReducer( + int? previousValue, + Position? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, + ) { + return (previousValue ?? 0) + 1; + } + + expect(coordReduce(fcMixed, countReducer, null), 7); + expect(coordReduce(fcMixed, countReducer, 5), 12); + expect(coordReduce(pt, countReducer, null), 1); + }); + + test('geomReduce', () { + int? countReducer( + int? previousValue, + currentGeometry, + featureIndex, + featureProperties, + featureBBox, + featureId, + ) { + return (previousValue ?? 0) + 1; + } + + expect(geomReduce(geomCollection, countReducer, 0), 3); + expect(geomReduce(geomCollection, countReducer, 5), 8); + + // test more complex feature collection with geoms and geomCollections + expect( + geomReduce( + getAsMixedFeatCollection(pt.geometry!), + countReducer, + 0, + ), + 8, + ); + expect( + geomReduce( + getAsMixedFeatCollection(pt.geometry!), + countReducer, + 10, + ), + 18, + ); + }); + + test('geomReduce -- no intial value and dynamic types', () { + LineString? lineGenerator( + LineString? previousValue, + GeometryType? currentGeometry, + int? featureIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, + ) { + if (currentGeometry is Point) { + previousValue!.coordinates.add(currentGeometry.coordinates); + } else if (currentGeometry is LineString) { + previousValue!.coordinates.addAll(currentGeometry.coordinates); + } else if (currentGeometry is MultiLineString) { + for (List l in currentGeometry.coordinates) { + previousValue!.coordinates.addAll(l); + } + } + return previousValue; + } + + FeatureCollection featureCollection = FeatureCollection( + features: [ + line, + pt, + multiline, + ], + ); + + LineString expectedLine = LineString.fromJson({ + 'coordinates': [ + // line + [0, 0], + [1, 1], + // point + [0, 0], + // multiline, line 1 + [0, 0], + [1, 1], + // multuline, line 2 + [3, 3], + [4, 4], + ] + }); + LineString? actualLineString = geomReduce( + featureCollection, + lineGenerator, + null, + ); + expect(actualLineString?.toJson(), expectedLine.toJson()); + + LineString? lineGeneratorDynamic( + dynamic previousValue, + GeometryType? currentGeometry, + int? featureIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, + ) { + if (currentGeometry is Point) { + previousValue!.coordinates.add(currentGeometry.coordinates); + } else if (currentGeometry is LineString) { + previousValue!.coordinates.addAll(currentGeometry.coordinates); + } else if (currentGeometry is MultiLineString) { + for (List l in currentGeometry.coordinates) { + previousValue!.coordinates.addAll(l); + } + } + return previousValue; + } + + LineString? actualDynamic = geomReduce( + featureCollection, + lineGeneratorDynamic, + null, + ); + expect(actualDynamic?.toJson(), expectedLine.toJson()); + }); + test('meta -- coordAll', () { FeatureCollection lines = FeatureCollection( features: [ From 03d1839cd4deed66009c16e5e6813ca0c6dae0e1 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Fri, 1 Apr 2022 14:25:18 +0200 Subject: [PATCH 28/72] Port cluster functions and tests (#69) * port functions * getCluster documentation * WIP documentation * Did the documentation * wrote tests * benchmarks - in process * moved benchmarks to separate file * exported clusters.dart Co-authored-by: armantorkzaban --- benchmark/cluster_benchmark.dart | 44 ++++ benchmark/meta_benchmark.dart | 9 +- lib/clusters.dart | 3 + lib/src/clusters.dart | 333 ++++++++++++++++++++++++++++++ lib/src/meta.dart | 2 - test/components/cluster_test.dart | 96 +++++++++ 6 files changed, 481 insertions(+), 6 deletions(-) create mode 100644 benchmark/cluster_benchmark.dart create mode 100644 lib/clusters.dart create mode 100644 lib/src/clusters.dart create mode 100644 test/components/cluster_test.dart diff --git a/benchmark/cluster_benchmark.dart b/benchmark/cluster_benchmark.dart new file mode 100644 index 00000000..0f96f0b0 --- /dev/null +++ b/benchmark/cluster_benchmark.dart @@ -0,0 +1,44 @@ +import 'package:benchmark/benchmark.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/clusters.dart'; + +void main() { + Point pt = Point( + coordinates: Position(0, 0), + ); + + List points = []; + List> pointFeatures = []; + + for (int i = 0; i < 1000; i++) { + points.add(pt.clone()); + pointFeatures + .add(Feature(geometry: pt.clone(), properties: {"cluster": 0})); + } + + FeatureCollection featureCollection = FeatureCollection( + features: pointFeatures, + ); + + group('cluster', () { + benchmark('getCluster', () { + getCluster(featureCollection, '0'); + }); + + benchmark('clusterEach', () { + List clusters = []; + int total = 0; + clusterEach(featureCollection, "cluster", + (cluster, clusterValue, currentIndex) { + total += cluster!.features.length; + clusters.add(cluster); + }); + }); + List clusters = []; + clusterReduce(featureCollection, "cluster", + (previousValue, cluster, clusterValue, currentIndex) { + clusters.add(cluster); + return previousValue! + cluster!.features.length; + }, 0); + }); +} diff --git a/benchmark/meta_benchmark.dart b/benchmark/meta_benchmark.dart index 0b6132af..04eb9493 100644 --- a/benchmark/meta_benchmark.dart +++ b/benchmark/meta_benchmark.dart @@ -6,9 +6,9 @@ import 'dart:convert'; import 'dart:io'; void main() { - Point pt = Point.fromJson({ - 'coordinates': [0, 0] - }); + Point pt = Point( + coordinates: Position(0, 0), + ); Feature featurePt = Feature(geometry: pt.clone()); @@ -17,7 +17,8 @@ void main() { for (int i = 0; i < 1000; i++) { points.add(pt.clone()); - pointFeatures.add(Feature(geometry: pt.clone())); + pointFeatures + .add(Feature(geometry: pt.clone(), properties: {"cluster": 0})); } GeometryCollection geomCollection = GeometryCollection( diff --git a/lib/clusters.dart b/lib/clusters.dart new file mode 100644 index 00000000..65f84813 --- /dev/null +++ b/lib/clusters.dart @@ -0,0 +1,3 @@ +library turf_clusters; + +export 'package:turf/src/clusters.dart'; //TODO: should we show helpers too? diff --git a/lib/src/clusters.dart b/lib/src/clusters.dart new file mode 100644 index 00000000..49b0d06d --- /dev/null +++ b/lib/src/clusters.dart @@ -0,0 +1,333 @@ +import '../meta.dart'; +import '../helpers.dart'; + +/// Get Cluster +/// Takes a [FeatureCollection] and a [dynamic] [filter] used on GeoJSON properties +/// to get Cluster. +/// Returns a [FeatureCollection] single cluster filtered by GeoJSON Properties +/// For example: +/// +/// ```dart +/// var geojson = FeatureCollection(features: [ +/// Feature( +/// geometry: Point(coordinates: Position.of([10, 10])), +/// properties: {'marker-symbol': 'circle'}, +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([20, 20])), +/// properties: {'marker-symbol': 'circle'}, +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([30, 30])), +/// properties: {'marker-symbol': 'square'}, +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([40, 40])), +/// properties: {'marker-symbol': 'triangle'}, +/// ), +/// ]); +/// +/// // Creates a cluster using K-Means (adds `cluster` to GeoJSON properties) +/// var clustered = clustersKmeans(geojson); +/// +/// // Retrieves first cluster (0) +/// var cluster = getCluster(clustered, {cluster: 0}); +/// //= cluster +/// +/// // Retrieves cluster based on custom properties +/// getCluster(clustered, {'marker-symbol': 'circle'}).length; +/// //= 2 +/// getCluster(clustered, {'marker-symbol': 'square'}).length; +/// //= 1 +/// ``` + +FeatureCollection getCluster(FeatureCollection geojson, dynamic filter) { + // Filter Features + List features = []; + featureEach(geojson, (feature, i) { + if (applyFilter(feature.properties, filter)) features.add(feature); + }); + return FeatureCollection(features: features); +} + +/// ClusterEachCallback +/// Takes a [FeatureCollection], the cluster being processed, a [clusterValue] +/// used to create cluster being processed, and the [currentIndex], the index of +/// current element being processed in the [List]. Starts at index 0 +/// Returns void. +typedef ClusterEachCallback = dynamic Function( + FeatureCollection? cluster, + dynamic clusterValue, + int? currentIndex, +); + +/// clusterEach +/// Takes a [FeatureCollection], a dynamic [property] key/value used to create clusters, +/// and a [ClusterEachCallback] method that takes (cluster, clusterValue, currentIndex) and +/// Returns void. +/// For example: +/// +/// ```dart +/// var geojson = FeatureCollection(features: [ +/// Feature( +/// geometry: Point(coordinates: Position.of([10, 10])), +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([20, 20])), +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([30, 30])), +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([40, 40])), +/// ), +/// ]); +/// +/// // Create a cluster using K-Means (adds `cluster` to [GeoJSONObject]'s properties) +/// var clustered = clustersKmeans(geojson); +/// +/// // Iterates over each cluster +/// clusterEach(clustered, 'cluster', (cluster, clusterValue, currentIndex) { +/// //= cluster +/// //= clusterValue +/// //= currentIndex +/// }) +/// +/// // Calculates the total number of clusters +/// var total = 0 +/// clusterEach(clustered, 'cluster', function () { +/// total++; +/// }); +/// +/// // Creates [List] of all the values retrieved from the 'cluster' property +/// var values = [] +/// clusterEach(clustered, 'cluster', (cluster, clusterValue) { +/// values.add(clusterValue); +/// }); +/// ``` + +void clusterEach( + FeatureCollection geojson, dynamic property, ClusterEachCallback callback) { + if (property == null) { + throw Exception("property is required"); + } + + // Creates clusters based on property values + var bins = createBins(geojson, property); + var values = bins.keys.toList(); + for (var index = 0; index < values.length; index++) { + var value = values[index]; + List bin = bins[value]!; + List features = []; + for (var i = 0; i < bin.length; i++) { + features.add(geojson.features[bin[i]]); + } + callback(FeatureCollection(features: features), value, index); + } +} + +/// ClusterReduceCallback +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an [initialValue] argument. +/// +/// If an [initialValue] is provided to the reduce method: +/// - The [previousValue] argument is [initialValue]. +/// - The [currentValue] argument is the value of the first element present in the [List]. +/// +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in the [List]. +/// - The [currentValue] argument is the value of the second element present in the [List]. +/// +/// Takes a [previousValue], the accumulated value previously returned in the last invocation +/// of the callback, or [initialValue], if supplied, a [FeatureCollection] [cluster], the current +/// cluster being processed, a [clusterValue] used to create cluster being processed and a +/// [currentIndex], the index of the current element being processed in the +/// [List]. +/// Starts at index 0, if an [initialValue] is provided, and at index 1 otherwise. +typedef ClusterReduceCallback = T? Function( + T? previousValue, + FeatureCollection? cluster, + dynamic clusterValue, + int? currentIndex, +); + +/// Reduces clusters in Features, similar to [Iterable.reduce] +/// Takes a [FeatureCollection][geojson], a dynamic [porperty], a [GeoJSONObject]'s property key/value +/// used to create clusters, a [ClusterReduceCallback] method, and an [initialValue] to +/// use as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var geojson = FeatureCollection(features: [ +/// Feature( +/// geometry: Point(coordinates: Position.of([10, 10])), +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([20, 20])), +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([30, 30])), +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([40, 40])), +/// ), +/// ]); +/// +/// // Creates a cluster using K-Means (adds `cluster` to GeoJSON properties) +/// var clustered = clustersKmeans(geojson); +/// +/// // Iterates over each cluster and perform a calculation +/// var initialValue = 0 +/// clusterReduce(clustered, 'cluster', (previousValue, cluster, clusterValue, currentIndex) { +/// //=previousValue +/// //=cluster +/// //=clusterValue +/// //=currentIndex +/// return previousValue++; +/// }, initialValue); +/// +/// // Calculates the total number of clusters +/// var total = clusterReduce(clustered, 'cluster', function (previousValue) { +/// return previousValue++; +/// }, 0); +/// +/// // Creates a [List] of all the values retrieved from the 'cluster' property. +/// var values = clusterReduce(clustered, 'cluster', (previousValue, cluster, clusterValue){ +/// return previousValue.addAll(clusterValue); +/// }, []); +/// ``` + +T? clusterReduce( + FeatureCollection geojson, + dynamic property, + ClusterReduceCallback callback, + dynamic initialValue, +) { + var previousValue = initialValue; + clusterEach(geojson, property, (cluster, clusterValue, currentIndex) { + if (currentIndex == 0 && initialValue == null) { + previousValue = cluster; + } else { + previousValue = + callback(previousValue, cluster, clusterValue, currentIndex); + } + }); + return previousValue; +} + +/// createBins +/// Takes a [FeatureCollection] geojson, and dynamic [property] key whose +/// corresponding values of the [Feature]s will be used to create bins. +/// Returns Map> bins with Feature IDs +/// For example +/// +/// ```dart +/// var geojson = FeatureCollection(features: [ +/// Feature( +/// geometry: Point(coordinates: Position.of([10, 10])), +/// properties:{'cluster': 0, 'foo': 'null'}, +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([20, 20])), +/// properties: {'cluster': 1, 'foo': 'bar'}, +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([30, 30])), +/// properties: {'0': 'foo'}, +/// ), +/// Feature( +/// geometry: Point(coordinates: Position.of([40, 40])), +/// properties: {'cluster': 1}, +/// ), +/// ]); +/// createBins(geojson, 'cluster'); +/// //= { '0': [ 0 ], '1': [ 1, 3 ] } +/// ``` + +Map> createBins( + FeatureCollection geojson, dynamic property) { + Map> bins = {}; + + featureEach(geojson, (feature, i) { + var properties = feature.properties ?? {}; + if (properties.containsKey(property)) { + var value = properties[property]; + if (bins.containsKey(value)) { + bins[value]!.add(i); + } else { + bins[value] = [i]; + } + } + }); + return bins; +} + +/// applyFilter +/// Takes a [Map] [properties] and a [filter], +/// Returns a [bool] indicating filter is applied to the properties. + +bool applyFilter(Map? properties, dynamic filter) { + if (properties == null) return false; + if (filter is! List && filter is! Map && filter is! String) { + throw Exception("filter('s) key must be String"); + } + if (filter is String) { + return properties.containsKey(filter); + } + if (filter is List) { + for (var i = 0; i < filter.length; i++) { + if (!applyFilter(properties, filter[i])) return false; + } + return true; + } + if (filter is Map) { + return propertiesContainsFilter(properties, filter); + } + return false; +} + +/// Properties contains filter (does not apply deepEqual operations) +/// Takes a [Map] [properties] value, and a [Map] filter and +/// Returns [bool] if filter does equal the [properties] +/// For example +/// +/// ```dart +/// propertiesContainsFilter({foo: 'bar', cluster: 0}, {cluster: 0}) +/// //= true +/// propertiesContainsFilter({foo: 'bar', cluster: 0}, {cluster: 1}) +/// //= false +/// ``` +bool propertiesContainsFilter(Map properties, Map filter) { + var keys = filter.keys.toList(); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (properties[key] != filter[key]) return false; + } + return true; +} + +/// filterProperties +/// Takes [Map] [properties], and [List] [keys] used to +/// filter Properties. +/// Returns [Map] filtered Properties +/// For example: +/// +/// ```dart +/// filterProperties({foo: 'bar', cluster: 0}, ['cluster']) +/// //= {cluster: 0} +/// ``` + +Map filterProperties( + Map properties, List? keys) { + if (keys == null || keys.isEmpty) return {}; + + Map newProperties = {}; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (properties.containsKey(key)) { + newProperties[key] = properties[key]; + } + } + return newProperties; +} diff --git a/lib/src/meta.dart b/lib/src/meta.dart index f34e581a..868c6bbb 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -516,7 +516,6 @@ void _callFlattenEachCallback( /// of the callback, or [initialValue], if supplied. /// [currentProperties] The current Properties being processed. /// [featureIndex] The current index of the Feature being processed. -/// typedef PropReduceCallback = T? Function( T? previousValue, // todo: or 'Map?'? Map? currentProperties, @@ -779,7 +778,6 @@ T? coordReduce( /// /// var coords = coordAll(features); /// //= [Position(13,15), Position(1, 2), Position(67, 50)] -/// List coordAll(GeoJSONObject geojson) { List coords = []; coordEach(geojson, ( diff --git a/test/components/cluster_test.dart b/test/components/cluster_test.dart new file mode 100644 index 00000000..05f82669 --- /dev/null +++ b/test/components/cluster_test.dart @@ -0,0 +1,96 @@ +import 'dart:math'; + +import 'package:turf/helpers.dart'; +import 'package:test/test.dart'; +import 'package:turf/src/clusters.dart'; + +final properties = {"foo": "bar", "cluster": 0}; +final geojson = FeatureCollection(features: [ + Feature( + geometry: Point(coordinates: Position.of([0, 0])), + properties: {"cluster": 0, "foo": "null"}), + Feature( + geometry: Point(coordinates: Position.of([2, 4])), + properties: {"cluster": 1, "foo": "bar"}), + Feature( + geometry: Point(coordinates: Position.of([3, 6])), + properties: {"cluster": 1}), + Feature( + geometry: Point(coordinates: Position.of([5, 1])), + properties: {"0": "foo"}), + Feature( + geometry: Point(coordinates: Position.of([4, 2])), + properties: {"bar": "foo"}), + Feature(geometry: Point(coordinates: Position.of([2, 4])), properties: {}), + Feature(geometry: Point(coordinates: Position.of([4, 3])), properties: null), +]); + +main() { + test("clusters -- getCluster", () { + expect(getCluster(geojson, '0').features.length, 1); + expect(() => getCluster(geojson, 1), throwsA(isA())); + expect(getCluster(geojson, "bar").features.length, 1); + expect(getCluster(geojson, "cluster").features.length, 3); + expect(getCluster(geojson, {"cluster": 1}).features.length, 2); + expect(getCluster(geojson, {"cluster": 0}).features.length, 1); + expect( + getCluster(geojson, [ + "cluster", + {"foo": "bar"} + ]).features.length, + 1); + expect(getCluster(geojson, ["cluster", "foo"]).features.length, 2); + expect(getCluster(geojson, ["cluster"]).features.length, 3); + }); + + test("clusters -- clusterEach", () { + List clusters = []; + int total = 0; + clusterEach(geojson, "cluster", (cluster, clusterValue, currentIndex) { + total += cluster!.features.length; + clusters.add(cluster); + expect(cluster.features.isNotEmpty, true); + }); + expect(total, 3); + expect(clusters.length, 2); + }); + + test("clusters -- clusterReduce", () { + List clusters = []; + var total = clusterReduce(geojson, "cluster", + (previousValue, cluster, clusterValue, currentIndex) { + clusters.add(cluster); + return previousValue! + cluster!.features.length; + }, 0); + expect(total, 3); + expect(clusters.length, 2); + }); + + test("applyFilter", () { + expect(applyFilter(properties, ["cluster"]), isTrue); + expect(applyFilter(properties, {"cluster": 1}), isFalse); + expect(applyFilter(properties, {"cluster": 0}), isTrue); + expect(applyFilter(null, {"cluster": 0}), isFalse); + }); + + test("filterProperties", () { + expect(filterProperties(properties, ["cluster"]), equals({"cluster": 0})); + expect(filterProperties(properties, []), equals({})); + expect(filterProperties(properties, null), equals({})); + }); + + test("propertiesContainsFilter", () { + expect(propertiesContainsFilter(properties, {"cluster": 0}), isTrue); + expect(propertiesContainsFilter(properties, {"cluster": 1}), isFalse); + expect(propertiesContainsFilter(properties, {"bar": "foo"}), isFalse); + }); + + test("propertiesContainsFilter", () { + expect( + createBins(geojson, "cluster"), + equals({ + 0: [0], + 1: [1, 2] + })); + }); +} From b3b0ae2026df78bbf105f0a3792b31c64665abc3 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Mon, 4 Apr 2022 06:51:48 +0200 Subject: [PATCH 29/72] Port meta segment functions & lineSegment (#70) * initial commit to segment file * beginning * lineSegment() * lineSegment * refactor * lineSegment tests * polygon test * wip segmentEach * rewrite segmentEach witohut coordEach * fix flattenEachCallback * combine units * tests for segmentEach * segmentEach id check tests * segmentReduce impltd. * updated README * Documentation * benchmark init Co-authored-by: Arman Torkzaban --- README.md | 22 +- benchmark/line_segment_benchmark.dart | 89 ++++++++ lib/line_segment.dart | 3 + lib/meta.dart | 1 + lib/src/line_segment.dart | 272 +++++++++++++++++++++++++ lib/src/meta.dart | 7 +- test/components/line_segment_test.dart | 127 ++++++++++++ test/components/meta_test.dart | 2 - 8 files changed, 505 insertions(+), 18 deletions(-) create mode 100644 benchmark/line_segment_benchmark.dart create mode 100644 lib/line_segment.dart create mode 100644 lib/src/line_segment.dart create mode 100644 test/components/line_segment_test.dart diff --git a/README.md b/README.md index 82c1d72e..d12d5c19 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] lineChunk - [ ] lineIntersect - [ ] lineOverlap -- [ ] lineSegment +- [x] lineSegment - [ ] lineSlice - [ ] lineSliceAlong - [ ] lineSplit @@ -140,21 +140,19 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the ### META - [x] coordAll - [x] coordEach -- [ ] coordReduce +- [x] coordReduce - [x] [featureEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L157) -- [ ] featureReduce +- [x] featureReduce - [x] [flattenEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L181) -- [ ] flattenReduce -- [ ] getCoord -- [ ] getCoords -- [ ] getGeom -- [ ] getType +- [x] flattenReduce +- [x] getCoord +- [x] getCoords - [x] [geomEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L34) -- [ ] geomReduce +- [x] geomReduce - [x] [propEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L124) -- [ ] propReduce -- [ ] segmentEach -- [ ] segmentReduce +- [x] propReduce +- [x] segmentEach +- [x] segmentReduce - [ ] getCluster - [ ] clusterEach - [ ] clusterReduce diff --git a/benchmark/line_segment_benchmark.dart b/benchmark/line_segment_benchmark.dart new file mode 100644 index 00000000..e401dd2e --- /dev/null +++ b/benchmark/line_segment_benchmark.dart @@ -0,0 +1,89 @@ +import 'package:benchmark/benchmark.dart'; +import 'package:turf/line_segment.dart'; +import 'package:turf/helpers.dart'; + +void main() { + LineString lineString = LineString( + coordinates: [Position(1, 1), Position(2, 2), Position(3, 3)], + ); + + Feature multiLine = Feature( + geometry: MultiLineString( + coordinates: [ + [ + Position.of([5, 5]), + Position.of([6, 6]), + Position.of([9, 9]) + ], + [ + Position.of([7, 7]), + Position.of([8, 8]), + ], + ], + ), + ); + + Feature poly = Feature( + geometry: Polygon(coordinates: [ + [ + Position.of([0, 0]), + Position.of([1, 1]), + Position.of([0, 1]), + Position.of([0, 0]), + ], + ]), + ); + + Feature geomCollection1 = Feature( + geometry: GeometryCollection( + geometries: [ + lineString, + ], + ), + ); + + Feature poly1 = Feature( + geometry: Polygon(coordinates: [ + [ + Position.of([0, 0]), + Position.of([2, 2]), + Position.of([0, 1]), + Position.of([0, 0]), + ], + [ + Position.of([0, 0]), + Position.of([1, 1]), + Position.of([0, 1]), + Position.of([0, 0]), + ], + ]), + ); + + List> list = [ + multiLine, + poly, + poly1, + geomCollection1 + ]; + List> list2 = []; + for (int i = 0; i < list.length; i++) { + for (int j = 0; j < 1000; j++) { + list2.add(list[i]); + } + } + FeatureCollection collection = FeatureCollection( + features: list2, + ); + group('lineSegment', () { + benchmark('lineSegment', () { + lineSegment(collection); + }); + benchmark('segmentReduce', () { + segmentReduce(collection, (previousValue, currentSegment, initialValue, + featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) { + previousValue++; + return previousValue; + }, 0, combineNestedGeometries: false); + }); + }); +} diff --git a/lib/line_segment.dart b/lib/line_segment.dart new file mode 100644 index 00000000..8afc6343 --- /dev/null +++ b/lib/line_segment.dart @@ -0,0 +1,3 @@ +library turf_line_segment; + +export "src/line_segment.dart"; diff --git a/lib/meta.dart b/lib/meta.dart index 1486f746..3f35450a 100644 --- a/lib/meta.dart +++ b/lib/meta.dart @@ -1,3 +1,4 @@ library turf_meta; export 'src/meta.dart'; +export 'src/line_segment.dart' show segmentEach, segmentReduce; diff --git a/lib/src/line_segment.dart b/lib/src/line_segment.dart new file mode 100644 index 00000000..c69d7a8b --- /dev/null +++ b/lib/src/line_segment.dart @@ -0,0 +1,272 @@ +import 'package:turf/meta.dart'; + +import 'geojson.dart'; + +// export default lineSegment; + +/// Creates a [FeatureCollection] of 2-vertex [LineString] segments from a +/// [LineString] or [MultiLineString] or [Polygon] and [MultiPolygon] +/// Returns [FeatureCollection] 2-vertex line segments +/// For example: +/// +/// ```dart +/// var polygon = Polygon.fromJson({ +/// 'coordinates': [ +/// [ +/// [0, 0], +/// [1, 1], +/// [0, 1], +/// [0, 0], +/// ], +/// ]; +/// var segments = lineSegment(polygon); +/// //addToMap +/// var addToMap = [polygon, segments] + +FeatureCollection lineSegment(GeoJSONObject geoJson, + {bool combineGeometries = false}) { + List> features = []; + segmentEach( + geoJson, + (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, + segmentIndex) { + features.add(currentSegment); + }, + combineNestedGeometries: combineGeometries, + ); + return FeatureCollection(features: features); +} + +/// SegmentEachCallback +typedef dynamic SegmentEachCallback( + Feature currentSegment, + int featureIndex, + int? multiFeatureIndex, + int? geometryIndex, + int segmentIndex, +); + +/// Iterates over 2-vertex line segment in any GeoJSON object, similar to [Iterable.forEach] +/// (Multi)Point geometries do not contain segments therefore they are ignored during this operation. +/// +/// Takes [FeatureCollection],[Feature] or [GeometryObject] geojson any GeoJSON +/// a [SegmentEachCallback] method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex), +/// and a [combineNestedGeometries] flag that connects [Polygon]'s geometries with each other. +/// For example: +/// +/// ```dart +/// var polygon = Polygon(coordinates: [ +/// [ +/// Position.of([0, 0]), +/// Position.of([1, 1]), +/// Position.of([0, 1]), +/// Position.of([0, 0]), +/// ], +/// ]), +/// ``` +/// Iterates over GeoJSON by 2-vertex segments +/// segmentEach(polygon, (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) { +/// //=currentSegment +/// //=featureIndex +/// //=multiFeatureIndex +/// //=geometryIndex +/// //=segmentIndex +/// }); +/// +/// // Calculate the total number of segments +/// var total = 0; +/// turf.segmentEach(polygon, function () { +/// total++; +/// }); +/// +/// +/// +/// + +void segmentEach( + GeoJSONObject geojson, + SegmentEachCallback callback, { + bool combineNestedGeometries = true, +}) { + int segmentIndex = 0; + flattenEach( + geojson, + (Feature currentFeature, int featureIndex, + int multiFeatureIndex) { + var geometry = currentFeature.geometry; + + if (geometry is Point) { + return false; + } + + if (geometry != null && combineNestedGeometries) { + segmentIndex = _segmentEachforEachUnit( + geometry, + callback, + currentFeature.properties, + featureIndex, + multiFeatureIndex, + segmentIndex, + ); + } else { + List> coords = []; + if (geometry is Polygon) { + coords = geometry.coordinates; + } + if (geometry is LineString) { + coords.add(geometry.coordinates); + } + + for (int i = 0; i < coords.length; i++) { + var line = LineString(coordinates: coords[i]); + + segmentIndex = _segmentEachforEachUnit( + line, + callback, + currentFeature.properties, + featureIndex, + multiFeatureIndex, + segmentIndex, + ); + } + } + }, + ); +} + +int _segmentEachforEachUnit( + GeometryType geometry, + SegmentEachCallback callback, + Map? currentProperties, + int featureIndex, + int multiFeatureIndex, + int segmentIndex, +) { + coordReduce( + geometry, + ( + previousCoord, + currentCoord, + coordIndex, + featureIndex2, + multiFeatureIndex2, + geometryIndex, + ) { + Feature segment = Feature( + id: segmentIndex, + geometry: LineString(coordinates: [previousCoord!, currentCoord!]), + properties: Map.of(currentProperties ?? {}), + bbox: BBox.named( + lat1: previousCoord.lat, + lat2: currentCoord.lat, + lng1: previousCoord.lng, + lng2: currentCoord.lng, + ), + ); + callback( + segment, + featureIndex, + multiFeatureIndex, + geometryIndex, + segmentIndex, + ); + segmentIndex++; + return currentCoord; + }, + null, + ); + return segmentIndex; +} + +/// Callback for segmentReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an [initialValue] argument. +/// +/// If an [initialValue] is provided to the reduce method: +/// - The [previousValue] argument is initialValue. +/// - The [currentValue] argument is the value of the first element present in the [List]. +/// +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in the [List]. +/// - The [currentValue] argument is the value of the second element present in the [List]. +/// +/// SegmentReduceCallback +/// [previousValue] The accumulated value previously returned in the last invocation +/// of the callback, or [initialValue], if supplied. +/// [Feature] [currentSegment] The current Segment being processed. +/// [featureIndex] The current index of the Feature being processed. +/// [multiFeatureIndex] The current index of the Multi-Feature being processed. +/// [geometryIndex] The current index of the Geometry being processed. +/// [segmentIndex] The current index of the Segment being processed. +typedef T? SegmentReduceCallback( + T? previousValue, + Feature currentSegment, + T? initialValue, + int featureIndex, + int? multiFeatureIndex, + int? geometryIndex, + int segmentIndex, +); + +/// Reduce 2-vertex line segment in any GeoJSON object, similar to [Iterable.reduce]() +/// (Multi)Point geometries do not contain segments therefore they are ignored during this operation. +/// +/// Takes [FeatureCollection], [Feature], [GeoJSONObject], a +/// [SegmentReduceCallback] method that takes (previousValue, currentSegment, currentIndex), an +/// [initialValue] value to use as the first argument to the first call of the callback. +/// +/// Iterates over [GeoJSONObject] by 2-vertex segments +/// For example: +/// +/// ```dart +/// var polygon =Polygon(coordinates: [ +/// [ +/// Position.of([0, 0]), +/// Position.of([1, 1]), +/// Position.of([0, 1]), +/// Position.of([0, 0]), +/// ], +/// ]), +/// +/// segmentReduce(polygon, (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) { +/// //= previousSegment +/// //= currentSegment +/// //= featureIndex +/// //= multiFeatureIndex +/// //= geometryIndex +/// //= segmentIndex +/// return currentSegment +/// }); +/// +/// // Calculate the total number of segments +/// var total = segmentReduce(polygon, (previousValue) { +/// previousValue++; +/// return previousValue; +/// }, 0); +/// ``` + +T? segmentReduce( + GeoJSONObject geojson, + SegmentReduceCallback callback, + T? initialValue, { + bool combineNestedGeometries = true, +}) { + T? previousValue = initialValue; + var started = false; + segmentEach( + geojson, + (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, + segmentIndex) { + if (started == false && initialValue == null && initialValue is T) { + previousValue = currentSegment.clone() as T; + } else { + previousValue = callback(previousValue, currentSegment, initialValue, + featureIndex, multiFeatureIndex, geometryIndex, segmentIndex); + } + started = true; + }, + combineNestedGeometries: combineNestedGeometries, + ); + return previousValue; +} diff --git a/lib/src/meta.dart b/lib/src/meta.dart index 868c6bbb..3a4eb2e9 100644 --- a/lib/src/meta.dart +++ b/lib/src/meta.dart @@ -251,7 +251,7 @@ void _forEachGeomInGeometryObject( throw _ShortCircuit(); } } else if (geometryObject is GeometryCollection) { - num geometryCollectionLength = geometryObject.geometries.length; + int geometryCollectionLength = geometryObject.geometries.length; for (int geometryIndex = 0; geometryIndex < geometryCollectionLength; @@ -420,7 +420,7 @@ void featureEach(GeoJSONObject geoJSON, FeatureEachCallback callback) { /// Callback for flattenEach typedef FlattenEachCallback = dynamic Function( - Feature currentFeature, + Feature currentFeature, int featureIndex, int multiFeatureIndex, ); @@ -487,7 +487,7 @@ void _callFlattenEachCallback( int? featureIndex, int multiFeatureIndex) { if (callback( - Feature( + Feature( geometry: geom, properties: featureProperties, ), @@ -788,7 +788,6 @@ List coordAll(GeoJSONObject geojson) { int? geometryIndex, ) { coords.add(currentCoord); - return true; }); return coords; } diff --git a/test/components/line_segment_test.dart b/test/components/line_segment_test.dart new file mode 100644 index 00000000..8dbf85ee --- /dev/null +++ b/test/components/line_segment_test.dart @@ -0,0 +1,127 @@ +import 'package:turf/src/line_segment.dart'; +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; + +main() { + Feature multiLine = Feature( + geometry: MultiLineString( + coordinates: [ + [ + Position.of([5, 5]), + Position.of([6, 6]), + Position.of([9, 9]) + ], + [ + Position.of([7, 7]), + Position.of([8, 8]), + ], + ], + ), + ); + + Feature multiPoint = Feature( + geometry: MultiPoint( + coordinates: [ + Position.of([0, 0]), + Position.of([1, 1]), + ], + )); + + MultiPoint multiPoint1 = MultiPoint(coordinates: []); + + LineString lineString = LineString( + coordinates: [Position(1, 1), Position(2, 2), Position(3, 3)], + ); + + Feature poly = Feature( + geometry: Polygon(coordinates: [ + [ + Position.of([0, 0]), + Position.of([1, 1]), + Position.of([0, 1]), + Position.of([0, 0]), + ], + ]), + ); + + Feature poly1 = Feature( + geometry: Polygon(coordinates: [ + [ + Position.of([0, 0]), + Position.of([2, 2]), + Position.of([0, 1]), + Position.of([0, 0]), + ], + [ + Position.of([0, 0]), + Position.of([1, 1]), + Position.of([0, 1]), + Position.of([0, 0]), + ], + ]), + ); + Feature geomCollection1 = Feature( + geometry: GeometryCollection( + geometries: [ + multiPoint1, // should throw + lineString, + ], + ), + ); + test("lineSegment -- GeometryColletion", () { + // Multipoint gets ignored + expect(lineSegment(multiPoint1).features.isEmpty, true); + + // Feature passed to lineSegment produces and empty FeatureCollection + FeatureCollection results = lineSegment(multiPoint); + expect(results.features.isEmpty, true); + + // LineString with multiple coordinates passed to the lineSegment will + // produce a FeatureCollection with segmented LineStrings + var lineStringResult = lineSegment(lineString); + expect(lineStringResult.features.length, 2); + expect(lineStringResult.features.first.geometry!.coordinates[0], + Position(1, 1)); + + // A more complex object + var geomCollectionResult = lineSegment(geomCollection1); + expect(geomCollectionResult.features.length, 2); + + // MultiLines + var multiLineResults = lineSegment(multiLine); + expect(multiLineResults.features.length, 3); + + // Polygon + var polygonResult = lineSegment(poly); + expect(polygonResult.features.length, 3); + }); + + test("segmentEach polygon combineGeometries == true", () { + var resultCombined = lineSegment(poly1, combineGeometries: true); + var resultNotCombined = lineSegment(poly1); + expect(resultCombined.features.length, 7); + expect(resultNotCombined.features.length, 6); + expect(resultCombined.features[3].geometry!.coordinates.first, + Position.of([0, 0])); + expect(resultCombined.features[3].geometry!.coordinates[1], + Position.of([0, 0])); + expect(resultNotCombined.features.first.id, 0); + expect(resultNotCombined.features.last.id, 5); + expect(resultCombined.features.last.id, 6); + expect(resultCombined.features.first.id, 0); + }); + + test("segmentReduce", () { + var total = segmentReduce(poly1, (previousValue, + currentSegment, + initialValue, + featureIndex, + multiFeatureIndex, + geometryIndex, + segmentIndex) { + previousValue++; + return previousValue; + }, 0, combineNestedGeometries: false); + expect(total, 6); + }); +} diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 2fe18aef..0f2b8905 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -1,5 +1,3 @@ -import 'dart:math'; - import 'package:test/test.dart'; import 'package:turf/helpers.dart'; import 'package:turf/meta.dart'; From f8f95eb87b1c49c408ef36dc1386366cc3b03073 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Mon, 4 Apr 2022 08:12:12 +0200 Subject: [PATCH 30/72] split up meta into separate files (#72) --- benchmark/cluster_benchmark.dart | 2 +- benchmark/meta_benchmark.dart | 6 +- lib/clusters.dart | 2 +- lib/meta.dart | 7 +- lib/src/line_segment.dart | 3 +- lib/src/meta.dart | 793 ------------------- lib/src/{clusters.dart => meta/cluster.dart} | 4 +- lib/src/meta/coord.dart | 274 +++++++ lib/src/meta/feature.dart | 99 +++ lib/src/meta/flatten.dart | 148 ++++ lib/src/meta/geom.dart | 174 ++++ lib/src/meta/prop.dart | 101 +++ lib/src/meta/short_circuit.dart | 5 + test/components/cluster_test.dart | 4 +- test/components/meta_test.dart | 6 +- 15 files changed, 824 insertions(+), 804 deletions(-) delete mode 100644 lib/src/meta.dart rename lib/src/{clusters.dart => meta/cluster.dart} (99%) create mode 100644 lib/src/meta/coord.dart create mode 100644 lib/src/meta/feature.dart create mode 100644 lib/src/meta/flatten.dart create mode 100644 lib/src/meta/geom.dart create mode 100644 lib/src/meta/prop.dart create mode 100644 lib/src/meta/short_circuit.dart diff --git a/benchmark/cluster_benchmark.dart b/benchmark/cluster_benchmark.dart index 0f96f0b0..e2966a53 100644 --- a/benchmark/cluster_benchmark.dart +++ b/benchmark/cluster_benchmark.dart @@ -1,6 +1,6 @@ import 'package:benchmark/benchmark.dart'; import 'package:turf/helpers.dart'; -import 'package:turf/src/clusters.dart'; +import 'package:turf/src/meta/cluster.dart'; void main() { Point pt = Point( diff --git a/benchmark/meta_benchmark.dart b/benchmark/meta_benchmark.dart index 04eb9493..5878de57 100644 --- a/benchmark/meta_benchmark.dart +++ b/benchmark/meta_benchmark.dart @@ -1,10 +1,14 @@ import 'package:benchmark/benchmark.dart'; import 'package:turf/helpers.dart'; -import 'package:turf/meta.dart'; import 'dart:convert'; import 'dart:io'; +import 'package:turf/src/meta/coord.dart'; +import 'package:turf/src/meta/feature.dart'; +import 'package:turf/src/meta/geom.dart'; +import 'package:turf/src/meta/prop.dart'; + void main() { Point pt = Point( coordinates: Position(0, 0), diff --git a/lib/clusters.dart b/lib/clusters.dart index 65f84813..5e7bdea9 100644 --- a/lib/clusters.dart +++ b/lib/clusters.dart @@ -1,3 +1,3 @@ library turf_clusters; -export 'package:turf/src/clusters.dart'; //TODO: should we show helpers too? +export 'src/meta/cluster.dart'; diff --git a/lib/meta.dart b/lib/meta.dart index 3f35450a..7152d8ad 100644 --- a/lib/meta.dart +++ b/lib/meta.dart @@ -1,4 +1,9 @@ library turf_meta; -export 'src/meta.dart'; +export 'src/meta/cluster.dart'; +export 'src/meta/coord.dart'; +export 'src/meta/feature.dart'; +export 'src/meta/flatten.dart'; +export 'src/meta/geom.dart'; export 'src/line_segment.dart' show segmentEach, segmentReduce; +export 'src/meta/prop.dart'; diff --git a/lib/src/line_segment.dart b/lib/src/line_segment.dart index c69d7a8b..3123a63e 100644 --- a/lib/src/line_segment.dart +++ b/lib/src/line_segment.dart @@ -1,4 +1,5 @@ -import 'package:turf/meta.dart'; +import 'package:turf/src/meta/coord.dart'; +import 'package:turf/src/meta/flatten.dart'; import 'geojson.dart'; diff --git a/lib/src/meta.dart b/lib/src/meta.dart deleted file mode 100644 index 3a4eb2e9..00000000 --- a/lib/src/meta.dart +++ /dev/null @@ -1,793 +0,0 @@ -import 'geojson.dart'; - -typedef CoordEachCallback = dynamic Function( - Position? currentCoord, - int? coordIndex, - int? featureIndex, - int? multiFeatureIndex, - int? geometryIndex, -); - -/// Iterates over coordinates in any [geoJSON] object, similar to [Iterable.forEach] -/// -/// For example: -/// -/// ```dart -/// var features = FeatureCollection(features: [ -/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), -/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) -/// ]); -/// -/// coordEach(features, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) { -/// //=currentCoord -/// //=coordIndex -/// //=featureIndex -/// //=multiFeatureIndex -/// //=geometryIndex -/// }); -/// ``` -void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, - [bool excludeWrapCoord = false]) { - _IndexCounter indexCounter = _IndexCounter(); - try { - geomEach( - geoJSON, - ( - GeometryType? currentGeometry, - int? featureIndex, - featureProperties, - featureBBox, - featureId, - ) { - if (currentGeometry == null) return; - - indexCounter.featureIndex = featureIndex ?? 0; - - _forEachCoordInGeometryObject( - currentGeometry, callback, excludeWrapCoord, indexCounter); - }, - ); - } on _ShortCircuit { - return; - } -} - -void _forEachCoordInGeometryObject( - GeometryType geometry, - CoordEachCallback callback, - bool excludeWrapCoord, - _IndexCounter indexCounter) { - GeoJSONObjectType geomType = geometry.type; - int wrapShrink = excludeWrapCoord && - (geomType == GeoJSONObjectType.polygon || - geomType == GeoJSONObjectType.multiLineString) - ? 1 - : 0; - indexCounter.multiFeatureIndex = 0; - - var coords = geometry.coordinates; - if (geomType == GeoJSONObjectType.point) { - _forEachCoordInPoint(coords, callback, indexCounter); - } else if (geomType == GeoJSONObjectType.lineString || - geomType == GeoJSONObjectType.multiPoint) { - _forEachCoordInCollection(coords, geomType, callback, indexCounter); - } else if (geomType == GeoJSONObjectType.polygon || - geomType == GeoJSONObjectType.multiLineString) { - _forEachCoordInNestedCollection( - coords, geomType, wrapShrink, callback, indexCounter); - } else if (geomType == GeoJSONObjectType.multiPolygon) { - _forEachCoordInMultiNestedCollection( - coords, geomType, wrapShrink, callback, indexCounter); - } else { - throw Exception('Unknown Geometry Type'); - } -} - -void _forEachCoordInMultiNestedCollection(coords, GeoJSONObjectType geomType, - int wrapShrink, CoordEachCallback callback, _IndexCounter indexCounter) { - for (var j = 0; j < coords.length; j++) { - int geometryIndex = 0; - for (var k = 0; k < coords[j].length; k++) { - for (var l = 0; l < coords[j][k].length - wrapShrink; l++) { - if (callback( - coords[j][k][l], - indexCounter.coordIndex, - indexCounter.featureIndex, - indexCounter.multiFeatureIndex, - geometryIndex) == - false) { - throw _ShortCircuit(); - } - indexCounter.coordIndex++; - } - geometryIndex++; - } - indexCounter.multiFeatureIndex++; - } -} - -void _forEachCoordInNestedCollection(coords, GeoJSONObjectType geomType, - int wrapShrink, CoordEachCallback callback, _IndexCounter indexCounter) { - for (var j = 0; j < coords.length; j++) { - for (var k = 0; k < coords[j].length - wrapShrink; k++) { - if (callback( - coords[j][k], - indexCounter.coordIndex, - indexCounter.featureIndex, - indexCounter.multiFeatureIndex, - indexCounter.geometryIndex) == - false) { - throw _ShortCircuit(); - } - indexCounter.coordIndex++; - } - if (geomType == GeoJSONObjectType.multiLineString) { - indexCounter.multiFeatureIndex++; - } - if (geomType == GeoJSONObjectType.polygon) { - indexCounter.geometryIndex++; - } - } - if (geomType == GeoJSONObjectType.polygon) { - indexCounter.multiFeatureIndex++; - } -} - -void _forEachCoordInCollection(coords, GeoJSONObjectType geomType, - CoordEachCallback callback, _IndexCounter indexCounter) { - for (var j = 0; j < coords.length; j++) { - if (callback(coords[j], indexCounter.coordIndex, indexCounter.featureIndex, - indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == - false) { - throw _ShortCircuit(); - } - indexCounter.coordIndex++; - if (geomType == GeoJSONObjectType.multiPoint) { - indexCounter.multiFeatureIndex++; - } - } - if (geomType == GeoJSONObjectType.lineString) { - indexCounter.multiFeatureIndex++; - } -} - -void _forEachCoordInPoint( - Position coords, CoordEachCallback callback, _IndexCounter indexCounter) { - if (callback(coords, indexCounter.coordIndex, indexCounter.featureIndex, - indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == - false) { - throw _ShortCircuit(); - } - indexCounter.coordIndex++; - indexCounter.multiFeatureIndex++; -} - -/// A simple class to manage counters from CoordinateEach functions -class _IndexCounter { - int coordIndex = 0; - int geometryIndex = 0; - int multiFeatureIndex = 0; - int featureIndex = 0; -} - -typedef GeomEachCallback = dynamic Function( - GeometryType? currentGeometry, - int? featureIndex, - Map? featureProperties, - BBox? featureBBox, - dynamic featureId, -); - -/// A simple class to manage short circuiting from *Each functions while still -/// allowing an Exception to be thrown and raised -class _ShortCircuit { - _ShortCircuit(); -} - -/// Iterates over each geometry in [geoJSON], calling [callback] on each -/// iteration. Similar to [Iterable.forEach] -/// -/// For example: -/// -/// ```dart -/// FeatureCollection featureCollection = FeatureCollection( -/// features: [ -/// point1, -/// point2, -/// point3, -/// ], -/// ); -/// geomEach(featureCollection, (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) { -/// someOperationOnEachPoint(currentGeometry); -/// }); -/// ``` -void geomEach(GeoJSONObject geoJSON, GeomEachCallback callback) { - try { - if (geoJSON is FeatureCollection) { - _forEachGeomInFeatureCollection(geoJSON, callback); - } else if (geoJSON is Feature) { - _forEachGeomInFeature(geoJSON, callback, 0); - } else if (geoJSON is GeometryObject) { - _forEachGeomInGeometryObject(geoJSON, callback, {}, null, null, 0); - } else { - throw Exception('Unknown Geometry Type'); - } - } on _ShortCircuit { - return; - } -} - -void _forEachGeomInFeatureCollection( - FeatureCollection featureCollection, GeomEachCallback callback) { - int featuresLength = featureCollection.features.length; - for (int featureIndex = 0; featureIndex < featuresLength; featureIndex++) { - _forEachGeomInFeature( - featureCollection.features[featureIndex], callback, featureIndex); - } -} - -void _forEachGeomInFeature(Feature feature, - GeomEachCallback callback, int featureIndex) { - _forEachGeomInGeometryObject(feature.geometry, callback, feature.properties, - feature.bbox, feature.id, featureIndex); -} - -void _forEachGeomInGeometryObject( - GeometryObject? geometryObject, - GeomEachCallback callback, - Map? featureProperties, - BBox? featureBBox, - dynamic featureId, - int featureIndex) { - if (geometryObject is GeometryType) { - if (callback( - geometryObject, - featureIndex, - featureProperties, - featureBBox, - featureId, - ) == - false) { - throw _ShortCircuit(); - } - } else if (geometryObject is GeometryCollection) { - int geometryCollectionLength = geometryObject.geometries.length; - - for (int geometryIndex = 0; - geometryIndex < geometryCollectionLength; - geometryIndex++) { - _forEachGeomInGeometryObject( - geometryObject.geometries[geometryIndex], - callback, - featureProperties, - featureBBox, - featureId, - featureIndex, - ); - } - } else { - throw Exception('Unknown Geometry Type'); - } -} - -/// Callback for geomReduce -/// -/// The first time the callback function is called, the values provided as arguments depend -/// on whether the reduce method has an [initialValue] argument. -/// -/// If an initialValue is provided to the reduce method: -/// - The [previousValue] argument is [initialValue]. -/// - The [currentValue] argument is the value of the first element present in the [List]. -/// -/// If an [initialValue] is not provided: -/// - The [previousValue] argument is the value of the first element present in the [List]. -/// - The [currentGeometry] argument is the value of the second element present in the [List]. -typedef GeomReduceCallback = T? Function( - T? previousValue, - GeometryType? currentGeometry, - int? featureIndex, - Map? featureProperties, - BBox? featureBBox, - dynamic featureId, -); - -/// Reduces geometry in any [GeoJSONObject], similar to [Iterable.reduce]. -/// -/// Takes [FeatureCollection], [Feature] or [GeometryObject], a [GeomReduceCallback] method -/// that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) and -/// an [initialValue] Value to use as the first argument to the first call of the callback. -/// Returns the value that results from the reduction. -/// For example: -/// -/// ```dart -/// var features = FeatureCollection(features: [ -/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), -/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) -/// ]); -/// -/// geomReduce(features, (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) { -/// //=previousValue -/// //=currentGeometry -/// //=featureIndex -/// //=featureProperties -/// //=featureBBox -/// //=featureId -/// return currentGeometry -/// }); -/// ``` - -T? geomReduce( - GeoJSONObject geoJSON, - GeomReduceCallback callback, - T? initialValue, -) { - T? previousValue = initialValue; - geomEach( - geoJSON, - ( - currentGeometry, - featureIndex, - featureProperties, - featureBBox, - featureId, - ) { - if (previousValue == null && featureIndex == 0 && currentGeometry is T) { - previousValue = currentGeometry?.clone() as T; - } else { - previousValue = callback( - previousValue, - currentGeometry, - featureIndex, - featureProperties, - featureBBox, - featureId, - ); - } - }, - ); - return previousValue; -} - -/// Callback for propEach -typedef PropEachCallback = dynamic Function( - Map? currentProperties, - int featureIndex, -); - -/// Iterates over properties in any [geoJSON] object, calling [callback] on each -/// iteration. Similar to [Iterable.forEach] -/// -/// For example: -/// -/// ```dart -/// FeatureCollection featureCollection = FeatureCollection( -/// features: [ -/// point1, -/// point2, -/// point3, -/// ], -/// ); -/// propEach(featureCollection, (currentProperties, featureIndex) { -/// someOperationOnEachProperty(currentProperties); -/// }); -/// ``` -void propEach(GeoJSONObject geoJSON, PropEachCallback callback) { - if (geoJSON is FeatureCollection) { - for (var i = 0; i < geoJSON.features.length; i++) { - if (callback(geoJSON.features[i].properties, i) == false) break; - } - } else if (geoJSON is Feature) { - callback(geoJSON.properties, 0); - } else { - throw Exception('Unknown Feature/FeatureCollection Type'); - } -} - -/// Callback for featureEach -typedef FeatureEachCallback = dynamic Function( - Feature currentFeature, - int featureIndex, -); - -/// Iterates over features in any [geoJSONObject], calling [callback] on each -/// iteration. Similar to [Iterable.forEach]. -/// -/// For example: -/// -/// ```dart -/// FeatureCollection featureCollection = FeatureCollection( -/// features: [ -/// point1, -/// point2, -/// point3, -/// ], -/// ); -/// featureEach(featureCollection, (currentFeature, featureIndex) { -/// someOperationOnEachFeature(currentFeature); -/// }); -/// ``` -void featureEach(GeoJSONObject geoJSON, FeatureEachCallback callback) { - if (geoJSON is Feature) { - callback(geoJSON, 0); - } else if (geoJSON is FeatureCollection) { - for (var i = 0; i < geoJSON.features.length; i++) { - if (callback(geoJSON.features[i], i) == false) break; - } - } else { - throw Exception('Unknown Feature/FeatureCollection Type'); - } -} - -/// Callback for flattenEach -typedef FlattenEachCallback = dynamic Function( - Feature currentFeature, - int featureIndex, - int multiFeatureIndex, -); - -/// Iterates over flattened features in any [geoJSONObject], similar to -/// [Iterate.forEach], calling [callback] on each flattened feature -///```dart -/// flattenEach(featureCollection, (currentFeature, featureIndex, multiFeatureIndex) { -/// someOperationOnEachFeature(currentFeature); -/// }); -/// ``` -void flattenEach(GeoJSONObject geoJSON, FlattenEachCallback callback) { - try { - geomEach(geoJSON, (GeometryType? currentGeomObject, featureIndex, - featureProperties, featureBBox, featureId) { - if (currentGeomObject == null || - currentGeomObject is Point || - currentGeomObject is LineString || - currentGeomObject is Polygon) { - _callFlattenEachCallback(callback, currentGeomObject as GeometryType, - featureProperties, featureIndex, 0); - } else { - _forEachFeatureOfMultiFeature( - currentGeomObject, callback, featureProperties, featureIndex); - } - }); - } on _ShortCircuit { - return; - } -} - -void _forEachFeatureOfMultiFeature( - GeoJSONObject currentGeomObject, - FlattenEachCallback callback, - Map? featureProperties, - int? featureIndex) { - if (currentGeomObject is GeometryType) { - for (int multiFeatureIndex = 0; - multiFeatureIndex < currentGeomObject.coordinates.length; - multiFeatureIndex++) { - GeometryType geom; - if (currentGeomObject is MultiPoint) { - geom = Point( - coordinates: currentGeomObject.coordinates[multiFeatureIndex]); - } else if (currentGeomObject is MultiLineString) { - geom = LineString( - coordinates: currentGeomObject.coordinates[multiFeatureIndex]); - } else if (currentGeomObject is MultiPolygon) { - geom = Polygon( - coordinates: currentGeomObject.coordinates[multiFeatureIndex]); - } else { - throw Exception('Unsupported Geometry type'); - } - _callFlattenEachCallback( - callback, geom, featureProperties, featureIndex, multiFeatureIndex); - } - } -} - -void _callFlattenEachCallback( - FlattenEachCallback callback, - GeometryType geom, - Map? featureProperties, - int? featureIndex, - int multiFeatureIndex) { - if (callback( - Feature( - geometry: geom, - properties: featureProperties, - ), - featureIndex ?? 0, - multiFeatureIndex) == - false) { - throw _ShortCircuit(); - } -} - -/// Callback for propReduce -/// -/// The first time the callback function is called, the values provided as arguments depend -/// on whether the reduce method has an [initialValue] argument. -/// -/// If an [initialValue] is provided to the reduce method: -/// - The [previousValue] argument is initialValue. -/// - The [currentValue] argument is the value of the first element present in the [List]. -/// -/// If an [initialValue] is not provided: -/// - The [previousValue] argument is the value of the first element present in the [List]. -/// - The [currentValue] argument is the value of the second element present in the [List]. -/// -/// propReduceCallback -/// [previousValue] The accumulated value previously returned in the last invocation -/// of the callback, or [initialValue], if supplied. -/// [currentProperties] The current Properties being processed. -/// [featureIndex] The current index of the Feature being processed. -typedef PropReduceCallback = T? Function( - T? previousValue, // todo: or 'Map?'? - Map? currentProperties, - int featureIndex, -); - -/// Reduces properties in any [GeoJSONObject] into a single value, -/// similar to how [Iterable.reduce] works. However, in this case we lazily run -/// the reduction, so List of all properties is unnecessary. -/// -/// Takes any [FeatureCollection] or [Feature], a [PropReduceCallback], an [initialValue] -/// to be used as the first argument to the first call of the callback. -/// Returns the value that results from the reduction. -/// For example: -/// -/// ```dart -/// var features = FeatureCollection(features: [ -/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), -/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) -/// ]); -/// -/// propReduce(features, (previousValue, currentProperties, featureIndex) { -/// //=previousValue -/// //=currentProperties -/// //=featureIndex -/// return currentProperties -/// }); -/// ``` - -T? propReduce( - GeoJSONObject geojson, - PropReduceCallback callback, - T? initialValue, -) { - T? previousValue = initialValue; - propEach(geojson, (currentProperties, featureIndex) { - if (featureIndex == 0 && initialValue == null) { - previousValue = currentProperties != null - ? Map.of(currentProperties) as T - : null; - } else { - previousValue = callback(previousValue, currentProperties, featureIndex); - } - }); - return previousValue; -} - -/// Callback for featureReduce -/// -/// The first time the callback function is called, the values provided as arguments depend -/// on whether the reduce method has an initialValue argument. -/// -/// If an initialValue is provided to the reduce method: -/// - The previousValue argument is initialValue. -/// - The currentValue argument is the value of the first element present in the List. -/// -/// If an initialValue is not provided: -/// - The previousValue argument is the value of the first element present in the List. -/// - The currentValue argument is the value of the second element present in the List. -/// -/// FeatureReduceCallback -/// [previousValue] is the accumulated value previously returned in the last invocation -/// of the callback, or [initialValue], if supplied. -/// currentFeature is the current [Feature] being processed. -/// [featureIndex] is the current index of the [Feature] being processed. - -typedef FeatureReduceCallback = T? Function( - T? previousValue, // todo or Feature ? - Feature currentFeature, - int featureIndex, -); - -/// Reduces features in any GeoJSONObject, similar to [Iterable.reduce]. -/// -/// Takes [FeatureCollection], [Feature], or [GeometryObject], -/// a [FeatureReduceCallback] method that takes (previousValue, currentFeature, featureIndex), and -/// an [initialValue] Value to use as the first argument to the first call of the callback. -/// Returns the value that results from the reduction. -/// For example: -/// -/// ```dart -/// var features = FeatureCollection(features: [ -/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), -/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) -/// ]); -/// -/// featureReduce(features, (previousValue, currentFeature, featureIndex) { -/// //=previousValue -/// //=currentFeature -/// //=featureIndex -/// return currentFeature -/// }); -/// ``` - -T? featureReduce( - GeoJSONObject geojson, - FeatureReduceCallback callback, - T? initialValue, -) { - T? previousValue = initialValue; - featureEach(geojson, (currentFeature, featureIndex) { - if (featureIndex == 0 && initialValue == null && currentFeature is T) { - previousValue = currentFeature.clone() as T; - } else { - previousValue = callback(previousValue, currentFeature, featureIndex); - } - }); - return previousValue; -} - -/// Callback for flattenReduce -/// The first time the callback function is called, the values provided as -/// arguments depend on whether the reduce method has an [initialValue] argument. -/// If an [initialValue] is provided to the reduce method: -/// - The [previousValue] argument is initialValue. -/// - The [currentValue] argument is the value of the first element present in the -/// [List]. -/// If an [initialValue] is not provided: -/// - The [previousValue] argument is the value of the first element present in -/// the [List]. -/// - The [currentValue] argument is the value of the second element present in -/// the [List]. -/// -/// flattenReduceCallback -/// [previousValue] is the accumulated value previously returned in the -/// last invocation of the callback, or [initialValue], if supplied. -/// [currentFeature] is the current Feature being processed. -/// [featureIndex] is the current index of the Feature being processed. -/// [multiFeatureIndex] is the current index of the Multi-Feature being -/// processed. -typedef FlattenReduceCallback = T? Function(T? previousValue, - Feature currentFeature, int featureIndex, int multiFeatureIndex); - -/// Reduces flattened features in any [GeoJSONObject], similar to [Iterable.reduce]. -/// Takes a [FeatureCollection], [Feature], or [Geometry] -/// a [FlattenReduceCallback] method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex), -/// an [initialValue] Value to use as the first argument to the first call of the callback. -/// Returns the value that results from the reduction. -/// For example: -/// -/// ```dart -/// var features = FeatureCollection(features: [ -/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), -/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) -/// ]); -/// -/// flattenReduce(features, (previousValue, currentFeature, featureIndex, multiFeatureIndex) { -/// //=previousValue -/// //=currentFeature -/// //=featureIndex -/// //=multiFeatureIndex -/// return currentFeature -/// }); -/// ``` - -T? flattenReduce( - GeoJSONObject geojson, - FlattenReduceCallback callback, - T? initialValue, -) { - T? previousValue = initialValue; - flattenEach(geojson, (currentFeature, featureIndex, multiFeatureIndex) { - if (featureIndex == 0 && - multiFeatureIndex == 0 && - initialValue == null && - currentFeature is T) { - previousValue = currentFeature.clone() as T; - } else { - previousValue = callback( - previousValue, currentFeature, featureIndex, multiFeatureIndex); - } - }); - return previousValue; -} - -/// Callback for coordReduce -/// -/// The first time the callback function is called, the values provided as arguments depend -/// on whether the reduce method has an initialValue argument. -/// -/// If an [initialValue] is provided to the reduce method: -/// - The [previousValue] argument is initialValue. -/// - The [currentValue] argument is the value of the first element present in the [List]. -/// -/// If an [initialValue] is not provided: -/// - The [previousValue] argument is the value of the first element present in the [List]. -/// - The [currentValue] argument is the value of the second element present in the [List]. -/// -/// Takes [previousValue], the accumulated value previously returned in the last invocation -/// of the callback, or [initialValue], if supplied, -/// [Position][currentCoord] The current coordinate being processed, [coordIndex] -/// The current index of the coordinate being processed. Starts at index 0, if an -/// initialValue is provided, and at index 1 otherwise, [featureIndex] The current -/// index of the Feature being processed, [multiFeatureIndex], the current index -/// of the Multi-Feature being processed., and [geometryIndex], the current index of the Geometry being processed. -typedef CoordReduceCallback = T? Function( - T? previousValue, // todo: change to CoordType - Position? currentCoord, - int? coordIndex, - int? featureIndex, - int? multiFeatureIndex, - int? geometryIndex, -); - -/// Reduces coordinates in any [GeoJSONObject], similar to [Iterable.reduce] -/// -/// Takes [FeatureCollection], [GeometryObject], or a [Feature], -/// a [CoordReduceCallback] method that takes (previousValue, currentCoord, coordIndex), an -/// [initialValue] Value to use as the first argument to the first call of the callback, -/// and a boolean [excludeWrapCoord=false] for whether or not to include the final coordinate -/// of LinearRings that wraps the ring in its iteration. -/// Returns the value that results from the reduction. -/// For example: -/// -/// ```dart -/// var features = FeatureCollection(features: [ -/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), -/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) -/// ]); -/// -/// coordReduce(features, (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) { -/// //=previousValue -/// //=currentCoord -/// //=coordIndex -/// //=featureIndex -/// //=multiFeatureIndex -/// //=geometryIndex -/// return currentCoord; -/// }); - -T? coordReduce( - GeoJSONObject geojson, - CoordReduceCallback callback, - T? initialValue, [ - bool excludeWrapCoord = false, -]) { - var previousValue = initialValue; - coordEach(geojson, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, - geometryIndex) { - if (coordIndex == 0 && initialValue == null && currentCoord is T) { - previousValue = currentCoord?.clone() as T; - } else { - previousValue = callback(previousValue, currentCoord, coordIndex, - featureIndex, multiFeatureIndex, geometryIndex); - } - }, excludeWrapCoord); - return previousValue; -} - -/// Gets all coordinates from any [GeoJSONObject]. -/// Receives any [GeoJSONObject] -/// Returns [List] -/// For example: -/// -/// ```dart -/// var featureColl = FeatureCollection(features: -/// [Feature(geometry: Point(coordinates: Position(13,15))) -/// ,Feature(geometry: LineString(coordinates: [Position(1, 2), -/// Position(67, 50)]))]); -/// -/// var coords = coordAll(features); -/// //= [Position(13,15), Position(1, 2), Position(67, 50)] -List coordAll(GeoJSONObject geojson) { - List coords = []; - coordEach(geojson, ( - Position? currentCoord, - int? coordIndex, - int? featureIndex, - int? multiFeatureIndex, - int? geometryIndex, - ) { - coords.add(currentCoord); - }); - return coords; -} diff --git a/lib/src/clusters.dart b/lib/src/meta/cluster.dart similarity index 99% rename from lib/src/clusters.dart rename to lib/src/meta/cluster.dart index 49b0d06d..1aa3efdc 100644 --- a/lib/src/clusters.dart +++ b/lib/src/meta/cluster.dart @@ -1,5 +1,5 @@ -import '../meta.dart'; -import '../helpers.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/meta/feature.dart'; /// Get Cluster /// Takes a [FeatureCollection] and a [dynamic] [filter] used on GeoJSON properties diff --git a/lib/src/meta/coord.dart b/lib/src/meta/coord.dart new file mode 100644 index 00000000..f9712d1e --- /dev/null +++ b/lib/src/meta/coord.dart @@ -0,0 +1,274 @@ +import 'package:turf/helpers.dart'; +import 'package:turf/src/meta/geom.dart'; +import 'package:turf/src/meta/short_circuit.dart'; + +typedef CoordEachCallback = dynamic Function( + Position? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, +); + +/// Iterates over coordinates in any [geoJSON] object, similar to [Iterable.forEach] +/// +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// coordEach(features, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) { +/// //=currentCoord +/// //=coordIndex +/// //=featureIndex +/// //=multiFeatureIndex +/// //=geometryIndex +/// }); +/// ``` +void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, + [bool excludeWrapCoord = false]) { + _IndexCounter indexCounter = _IndexCounter(); + try { + geomEach( + geoJSON, + ( + GeometryType? currentGeometry, + int? featureIndex, + featureProperties, + featureBBox, + featureId, + ) { + if (currentGeometry == null) return; + + indexCounter.featureIndex = featureIndex ?? 0; + + _forEachCoordInGeometryObject( + currentGeometry, callback, excludeWrapCoord, indexCounter); + }, + ); + } on ShortCircuit { + return; + } +} + +void _forEachCoordInGeometryObject( + GeometryType geometry, + CoordEachCallback callback, + bool excludeWrapCoord, + _IndexCounter indexCounter) { + GeoJSONObjectType geomType = geometry.type; + int wrapShrink = excludeWrapCoord && + (geomType == GeoJSONObjectType.polygon || + geomType == GeoJSONObjectType.multiLineString) + ? 1 + : 0; + indexCounter.multiFeatureIndex = 0; + + var coords = geometry.coordinates; + if (geomType == GeoJSONObjectType.point) { + _forEachCoordInPoint(coords, callback, indexCounter); + } else if (geomType == GeoJSONObjectType.lineString || + geomType == GeoJSONObjectType.multiPoint) { + _forEachCoordInCollection(coords, geomType, callback, indexCounter); + } else if (geomType == GeoJSONObjectType.polygon || + geomType == GeoJSONObjectType.multiLineString) { + _forEachCoordInNestedCollection( + coords, geomType, wrapShrink, callback, indexCounter); + } else if (geomType == GeoJSONObjectType.multiPolygon) { + _forEachCoordInMultiNestedCollection( + coords, geomType, wrapShrink, callback, indexCounter); + } else { + throw Exception('Unknown Geometry Type'); + } +} + +void _forEachCoordInMultiNestedCollection(coords, GeoJSONObjectType geomType, + int wrapShrink, CoordEachCallback callback, _IndexCounter indexCounter) { + for (var j = 0; j < coords.length; j++) { + int geometryIndex = 0; + for (var k = 0; k < coords[j].length; k++) { + for (var l = 0; l < coords[j][k].length - wrapShrink; l++) { + if (callback( + coords[j][k][l], + indexCounter.coordIndex, + indexCounter.featureIndex, + indexCounter.multiFeatureIndex, + geometryIndex) == + false) { + throw ShortCircuit(); + } + indexCounter.coordIndex++; + } + geometryIndex++; + } + indexCounter.multiFeatureIndex++; + } +} + +void _forEachCoordInNestedCollection(coords, GeoJSONObjectType geomType, + int wrapShrink, CoordEachCallback callback, _IndexCounter indexCounter) { + for (var j = 0; j < coords.length; j++) { + for (var k = 0; k < coords[j].length - wrapShrink; k++) { + if (callback( + coords[j][k], + indexCounter.coordIndex, + indexCounter.featureIndex, + indexCounter.multiFeatureIndex, + indexCounter.geometryIndex) == + false) { + throw ShortCircuit(); + } + indexCounter.coordIndex++; + } + if (geomType == GeoJSONObjectType.multiLineString) { + indexCounter.multiFeatureIndex++; + } + if (geomType == GeoJSONObjectType.polygon) { + indexCounter.geometryIndex++; + } + } + if (geomType == GeoJSONObjectType.polygon) { + indexCounter.multiFeatureIndex++; + } +} + +void _forEachCoordInCollection(coords, GeoJSONObjectType geomType, + CoordEachCallback callback, _IndexCounter indexCounter) { + for (var j = 0; j < coords.length; j++) { + if (callback(coords[j], indexCounter.coordIndex, indexCounter.featureIndex, + indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == + false) { + throw ShortCircuit(); + } + indexCounter.coordIndex++; + if (geomType == GeoJSONObjectType.multiPoint) { + indexCounter.multiFeatureIndex++; + } + } + if (geomType == GeoJSONObjectType.lineString) { + indexCounter.multiFeatureIndex++; + } +} + +void _forEachCoordInPoint( + Position coords, CoordEachCallback callback, _IndexCounter indexCounter) { + if (callback(coords, indexCounter.coordIndex, indexCounter.featureIndex, + indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == + false) { + throw ShortCircuit(); + } + indexCounter.coordIndex++; + indexCounter.multiFeatureIndex++; +} + +/// A simple class to manage counters from CoordinateEach functions +class _IndexCounter { + int coordIndex = 0; + int geometryIndex = 0; + int multiFeatureIndex = 0; + int featureIndex = 0; +} + +/// Callback for coordReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an initialValue argument. +/// +/// If an [initialValue] is provided to the reduce method: +/// - The [previousValue] argument is initialValue. +/// - The [currentValue] argument is the value of the first element present in the [List]. +/// +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in the [List]. +/// - The [currentValue] argument is the value of the second element present in the [List]. +/// +/// Takes [previousValue], the accumulated value previously returned in the last invocation +/// of the callback, or [initialValue], if supplied, +/// [Position][currentCoord] The current coordinate being processed, [coordIndex] +/// The current index of the coordinate being processed. Starts at index 0, if an +/// initialValue is provided, and at index 1 otherwise, [featureIndex] The current +/// index of the Feature being processed, [multiFeatureIndex], the current index +/// of the Multi-Feature being processed., and [geometryIndex], the current index of the Geometry being processed. +typedef CoordReduceCallback = T? Function( + T? previousValue, // todo: change to CoordType + Position? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, +); + +/// Reduces coordinates in any [GeoJSONObject], similar to [Iterable.reduce] +/// +/// Takes [FeatureCollection], [GeometryObject], or a [Feature], +/// a [CoordReduceCallback] method that takes (previousValue, currentCoord, coordIndex), an +/// [initialValue] Value to use as the first argument to the first call of the callback, +/// and a boolean [excludeWrapCoord=false] for whether or not to include the final coordinate +/// of LinearRings that wraps the ring in its iteration. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// coordReduce(features, (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) { +/// //=previousValue +/// //=currentCoord +/// //=coordIndex +/// //=featureIndex +/// //=multiFeatureIndex +/// //=geometryIndex +/// return currentCoord; +/// }); + +T? coordReduce( + GeoJSONObject geojson, + CoordReduceCallback callback, + T? initialValue, [ + bool excludeWrapCoord = false, +]) { + var previousValue = initialValue; + coordEach(geojson, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, + geometryIndex) { + if (coordIndex == 0 && initialValue == null && currentCoord is T) { + previousValue = currentCoord?.clone() as T; + } else { + previousValue = callback(previousValue, currentCoord, coordIndex, + featureIndex, multiFeatureIndex, geometryIndex); + } + }, excludeWrapCoord); + return previousValue; +} + +/// Gets all coordinates from any [GeoJSONObject]. +/// Receives any [GeoJSONObject] +/// Returns [List] +/// For example: +/// +/// ```dart +/// var featureColl = FeatureCollection(features: +/// [Feature(geometry: Point(coordinates: Position(13,15))) +/// ,Feature(geometry: LineString(coordinates: [Position(1, 2), +/// Position(67, 50)]))]); +/// +/// var coords = coordAll(features); +/// //= [Position(13,15), Position(1, 2), Position(67, 50)] +List coordAll(GeoJSONObject geojson) { + List coords = []; + coordEach(geojson, ( + Position? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, + ) { + coords.add(currentCoord); + }); + return coords; +} diff --git a/lib/src/meta/feature.dart b/lib/src/meta/feature.dart new file mode 100644 index 00000000..46aa79b5 --- /dev/null +++ b/lib/src/meta/feature.dart @@ -0,0 +1,99 @@ +import 'package:turf/helpers.dart'; + +/// Callback for featureEach +typedef FeatureEachCallback = dynamic Function( + Feature currentFeature, + int featureIndex, +); + +/// Iterates over features in any [geoJSONObject], calling [callback] on each +/// iteration. Similar to [Iterable.forEach]. +/// +/// For example: +/// +/// ```dart +/// FeatureCollection featureCollection = FeatureCollection( +/// features: [ +/// point1, +/// point2, +/// point3, +/// ], +/// ); +/// featureEach(featureCollection, (currentFeature, featureIndex) { +/// someOperationOnEachFeature(currentFeature); +/// }); +/// ``` +void featureEach(GeoJSONObject geoJSON, FeatureEachCallback callback) { + if (geoJSON is Feature) { + callback(geoJSON, 0); + } else if (geoJSON is FeatureCollection) { + for (var i = 0; i < geoJSON.features.length; i++) { + if (callback(geoJSON.features[i], i) == false) break; + } + } else { + throw Exception('Unknown Feature/FeatureCollection Type'); + } +} + +/// Callback for featureReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an initialValue argument. +/// +/// If an initialValue is provided to the reduce method: +/// - The previousValue argument is initialValue. +/// - The currentValue argument is the value of the first element present in the List. +/// +/// If an initialValue is not provided: +/// - The previousValue argument is the value of the first element present in the List. +/// - The currentValue argument is the value of the second element present in the List. +/// +/// FeatureReduceCallback +/// [previousValue] is the accumulated value previously returned in the last invocation +/// of the callback, or [initialValue], if supplied. +/// currentFeature is the current [Feature] being processed. +/// [featureIndex] is the current index of the [Feature] being processed. + +typedef FeatureReduceCallback = T? Function( + T? previousValue, // todo or Feature ? + Feature currentFeature, + int featureIndex, +); + +/// Reduces features in any GeoJSONObject, similar to [Iterable.reduce]. +/// +/// Takes [FeatureCollection], [Feature], or [GeometryObject], +/// a [FeatureReduceCallback] method that takes (previousValue, currentFeature, featureIndex), and +/// an [initialValue] Value to use as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// featureReduce(features, (previousValue, currentFeature, featureIndex) { +/// //=previousValue +/// //=currentFeature +/// //=featureIndex +/// return currentFeature +/// }); +/// ``` + +T? featureReduce( + GeoJSONObject geojson, + FeatureReduceCallback callback, + T? initialValue, +) { + T? previousValue = initialValue; + featureEach(geojson, (currentFeature, featureIndex) { + if (featureIndex == 0 && initialValue == null && currentFeature is T) { + previousValue = currentFeature.clone() as T; + } else { + previousValue = callback(previousValue, currentFeature, featureIndex); + } + }); + return previousValue; +} diff --git a/lib/src/meta/flatten.dart b/lib/src/meta/flatten.dart new file mode 100644 index 00000000..fedd9aff --- /dev/null +++ b/lib/src/meta/flatten.dart @@ -0,0 +1,148 @@ +import 'package:turf/helpers.dart'; +import 'package:turf/src/meta/geom.dart'; +import 'package:turf/src/meta/short_circuit.dart'; + +/// Callback for flattenEach +typedef FlattenEachCallback = dynamic Function( + Feature currentFeature, + int featureIndex, + int multiFeatureIndex, +); + +/// Iterates over flattened features in any [geoJSONObject], similar to +/// [Iterate.forEach], calling [callback] on each flattened feature +///```dart +/// flattenEach(featureCollection, (currentFeature, featureIndex, multiFeatureIndex) { +/// someOperationOnEachFeature(currentFeature); +/// }); +/// ``` +void flattenEach(GeoJSONObject geoJSON, FlattenEachCallback callback) { + try { + geomEach(geoJSON, (GeometryType? currentGeomObject, featureIndex, + featureProperties, featureBBox, featureId) { + if (currentGeomObject == null || + currentGeomObject is Point || + currentGeomObject is LineString || + currentGeomObject is Polygon) { + _callFlattenEachCallback(callback, currentGeomObject as GeometryType, + featureProperties, featureIndex, 0); + } else { + _forEachFeatureOfMultiFeature( + currentGeomObject, callback, featureProperties, featureIndex); + } + }); + } on ShortCircuit { + return; + } +} + +void _forEachFeatureOfMultiFeature( + GeoJSONObject currentGeomObject, + FlattenEachCallback callback, + Map? featureProperties, + int? featureIndex) { + if (currentGeomObject is GeometryType) { + for (int multiFeatureIndex = 0; + multiFeatureIndex < currentGeomObject.coordinates.length; + multiFeatureIndex++) { + GeometryType geom; + if (currentGeomObject is MultiPoint) { + geom = Point( + coordinates: currentGeomObject.coordinates[multiFeatureIndex]); + } else if (currentGeomObject is MultiLineString) { + geom = LineString( + coordinates: currentGeomObject.coordinates[multiFeatureIndex]); + } else if (currentGeomObject is MultiPolygon) { + geom = Polygon( + coordinates: currentGeomObject.coordinates[multiFeatureIndex]); + } else { + throw Exception('Unsupported Geometry type'); + } + _callFlattenEachCallback( + callback, geom, featureProperties, featureIndex, multiFeatureIndex); + } + } +} + +void _callFlattenEachCallback( + FlattenEachCallback callback, + GeometryType geom, + Map? featureProperties, + int? featureIndex, + int multiFeatureIndex) { + if (callback( + Feature( + geometry: geom, + properties: featureProperties, + ), + featureIndex ?? 0, + multiFeatureIndex) == + false) { + throw ShortCircuit(); + } +} + +/// Callback for flattenReduce +/// The first time the callback function is called, the values provided as +/// arguments depend on whether the reduce method has an [initialValue] argument. +/// If an [initialValue] is provided to the reduce method: +/// - The [previousValue] argument is initialValue. +/// - The [currentValue] argument is the value of the first element present in the +/// [List]. +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in +/// the [List]. +/// - The [currentValue] argument is the value of the second element present in +/// the [List]. +/// +/// flattenReduceCallback +/// [previousValue] is the accumulated value previously returned in the +/// last invocation of the callback, or [initialValue], if supplied. +/// [currentFeature] is the current Feature being processed. +/// [featureIndex] is the current index of the Feature being processed. +/// [multiFeatureIndex] is the current index of the Multi-Feature being +/// processed. +typedef FlattenReduceCallback = T? Function(T? previousValue, + Feature currentFeature, int featureIndex, int multiFeatureIndex); + +/// Reduces flattened features in any [GeoJSONObject], similar to [Iterable.reduce]. +/// Takes a [FeatureCollection], [Feature], or [Geometry] +/// a [FlattenReduceCallback] method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex), +/// an [initialValue] Value to use as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// flattenReduce(features, (previousValue, currentFeature, featureIndex, multiFeatureIndex) { +/// //=previousValue +/// //=currentFeature +/// //=featureIndex +/// //=multiFeatureIndex +/// return currentFeature +/// }); +/// ``` + +T? flattenReduce( + GeoJSONObject geojson, + FlattenReduceCallback callback, + T? initialValue, +) { + T? previousValue = initialValue; + flattenEach(geojson, (currentFeature, featureIndex, multiFeatureIndex) { + if (featureIndex == 0 && + multiFeatureIndex == 0 && + initialValue == null && + currentFeature is T) { + previousValue = currentFeature.clone() as T; + } else { + previousValue = callback( + previousValue, currentFeature, featureIndex, multiFeatureIndex); + } + }); + return previousValue; +} diff --git a/lib/src/meta/geom.dart b/lib/src/meta/geom.dart new file mode 100644 index 00000000..ab2c271e --- /dev/null +++ b/lib/src/meta/geom.dart @@ -0,0 +1,174 @@ +import 'package:turf/helpers.dart'; +import 'package:turf/src/meta/short_circuit.dart'; + +typedef GeomEachCallback = dynamic Function( + GeometryType? currentGeometry, + int? featureIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, +); + +/// Iterates over each geometry in [geoJSON], calling [callback] on each +/// iteration. Similar to [Iterable.forEach] +/// +/// For example: +/// +/// ```dart +/// FeatureCollection featureCollection = FeatureCollection( +/// features: [ +/// point1, +/// point2, +/// point3, +/// ], +/// ); +/// geomEach(featureCollection, (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) { +/// someOperationOnEachPoint(currentGeometry); +/// }); +/// ``` +void geomEach(GeoJSONObject geoJSON, GeomEachCallback callback) { + try { + if (geoJSON is FeatureCollection) { + _forEachGeomInFeatureCollection(geoJSON, callback); + } else if (geoJSON is Feature) { + _forEachGeomInFeature(geoJSON, callback, 0); + } else if (geoJSON is GeometryObject) { + _forEachGeomInGeometryObject(geoJSON, callback, {}, null, null, 0); + } else { + throw Exception('Unknown Geometry Type'); + } + } on ShortCircuit { + return; + } +} + +void _forEachGeomInFeatureCollection( + FeatureCollection featureCollection, GeomEachCallback callback) { + int featuresLength = featureCollection.features.length; + for (int featureIndex = 0; featureIndex < featuresLength; featureIndex++) { + _forEachGeomInFeature( + featureCollection.features[featureIndex], callback, featureIndex); + } +} + +void _forEachGeomInFeature(Feature feature, + GeomEachCallback callback, int featureIndex) { + _forEachGeomInGeometryObject(feature.geometry, callback, feature.properties, + feature.bbox, feature.id, featureIndex); +} + +void _forEachGeomInGeometryObject( + GeometryObject? geometryObject, + GeomEachCallback callback, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, + int featureIndex) { + if (geometryObject is GeometryType) { + if (callback( + geometryObject, + featureIndex, + featureProperties, + featureBBox, + featureId, + ) == + false) { + throw ShortCircuit(); + } + } else if (geometryObject is GeometryCollection) { + int geometryCollectionLength = geometryObject.geometries.length; + + for (int geometryIndex = 0; + geometryIndex < geometryCollectionLength; + geometryIndex++) { + _forEachGeomInGeometryObject( + geometryObject.geometries[geometryIndex], + callback, + featureProperties, + featureBBox, + featureId, + featureIndex, + ); + } + } else { + throw Exception('Unknown Geometry Type'); + } +} + +/// Callback for geomReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an [initialValue] argument. +/// +/// If an initialValue is provided to the reduce method: +/// - The [previousValue] argument is [initialValue]. +/// - The [currentValue] argument is the value of the first element present in the [List]. +/// +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in the [List]. +/// - The [currentGeometry] argument is the value of the second element present in the [List]. +typedef GeomReduceCallback = T? Function( + T? previousValue, + GeometryType? currentGeometry, + int? featureIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, +); + +/// Reduces geometry in any [GeoJSONObject], similar to [Iterable.reduce]. +/// +/// Takes [FeatureCollection], [Feature] or [GeometryObject], a [GeomReduceCallback] method +/// that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) and +/// an [initialValue] Value to use as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// geomReduce(features, (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) { +/// //=previousValue +/// //=currentGeometry +/// //=featureIndex +/// //=featureProperties +/// //=featureBBox +/// //=featureId +/// return currentGeometry +/// }); +/// ``` + +T? geomReduce( + GeoJSONObject geoJSON, + GeomReduceCallback callback, + T? initialValue, +) { + T? previousValue = initialValue; + geomEach( + geoJSON, + ( + currentGeometry, + featureIndex, + featureProperties, + featureBBox, + featureId, + ) { + if (previousValue == null && featureIndex == 0 && currentGeometry is T) { + previousValue = currentGeometry?.clone() as T; + } else { + previousValue = callback( + previousValue, + currentGeometry, + featureIndex, + featureProperties, + featureBBox, + featureId, + ); + } + }, + ); + return previousValue; +} diff --git a/lib/src/meta/prop.dart b/lib/src/meta/prop.dart new file mode 100644 index 00000000..431aabdb --- /dev/null +++ b/lib/src/meta/prop.dart @@ -0,0 +1,101 @@ +import 'package:turf/helpers.dart'; + +/// Callback for propEach +typedef PropEachCallback = dynamic Function( + Map? currentProperties, + int featureIndex, +); + +/// Iterates over properties in any [geoJSON] object, calling [callback] on each +/// iteration. Similar to [Iterable.forEach] +/// +/// For example: +/// +/// ```dart +/// FeatureCollection featureCollection = FeatureCollection( +/// features: [ +/// point1, +/// point2, +/// point3, +/// ], +/// ); +/// propEach(featureCollection, (currentProperties, featureIndex) { +/// someOperationOnEachProperty(currentProperties); +/// }); +/// ``` +void propEach(GeoJSONObject geoJSON, PropEachCallback callback) { + if (geoJSON is FeatureCollection) { + for (var i = 0; i < geoJSON.features.length; i++) { + if (callback(geoJSON.features[i].properties, i) == false) break; + } + } else if (geoJSON is Feature) { + callback(geoJSON.properties, 0); + } else { + throw Exception('Unknown Feature/FeatureCollection Type'); + } +} + +/// Callback for propReduce +/// +/// The first time the callback function is called, the values provided as arguments depend +/// on whether the reduce method has an [initialValue] argument. +/// +/// If an [initialValue] is provided to the reduce method: +/// - The [previousValue] argument is initialValue. +/// - The [currentValue] argument is the value of the first element present in the [List]. +/// +/// If an [initialValue] is not provided: +/// - The [previousValue] argument is the value of the first element present in the [List]. +/// - The [currentValue] argument is the value of the second element present in the [List]. +/// +/// propReduceCallback +/// [previousValue] The accumulated value previously returned in the last invocation +/// of the callback, or [initialValue], if supplied. +/// [currentProperties] The current Properties being processed. +/// [featureIndex] The current index of the Feature being processed. +typedef PropReduceCallback = T? Function( + T? previousValue, // todo: or 'Map?'? + Map? currentProperties, + int featureIndex, +); + +/// Reduces properties in any [GeoJSONObject] into a single value, +/// similar to how [Iterable.reduce] works. However, in this case we lazily run +/// the reduction, so List of all properties is unnecessary. +/// +/// Takes any [FeatureCollection] or [Feature], a [PropReduceCallback], an [initialValue] +/// to be used as the first argument to the first call of the callback. +/// Returns the value that results from the reduction. +/// For example: +/// +/// ```dart +/// var features = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), +/// Feature(geometry: Point(coordinates: Position.of([36, 53])), properties: {'foo': 'bar'}) +/// ]); +/// +/// propReduce(features, (previousValue, currentProperties, featureIndex) { +/// //=previousValue +/// //=currentProperties +/// //=featureIndex +/// return currentProperties +/// }); +/// ``` + +T? propReduce( + GeoJSONObject geojson, + PropReduceCallback callback, + T? initialValue, +) { + T? previousValue = initialValue; + propEach(geojson, (currentProperties, featureIndex) { + if (featureIndex == 0 && initialValue == null) { + previousValue = currentProperties != null + ? Map.of(currentProperties) as T + : null; + } else { + previousValue = callback(previousValue, currentProperties, featureIndex); + } + }); + return previousValue; +} diff --git a/lib/src/meta/short_circuit.dart b/lib/src/meta/short_circuit.dart new file mode 100644 index 00000000..f1626858 --- /dev/null +++ b/lib/src/meta/short_circuit.dart @@ -0,0 +1,5 @@ +/// A simple class to manage short circuiting from *Each functions while still +/// allowing an Exception to be thrown and raised +class ShortCircuit { + ShortCircuit(); +} diff --git a/test/components/cluster_test.dart b/test/components/cluster_test.dart index 05f82669..967e8fd5 100644 --- a/test/components/cluster_test.dart +++ b/test/components/cluster_test.dart @@ -1,8 +1,6 @@ -import 'dart:math'; - import 'package:turf/helpers.dart'; import 'package:test/test.dart'; -import 'package:turf/src/clusters.dart'; +import 'package:turf/src/meta/cluster.dart'; final properties = {"foo": "bar", "cluster": 0}; final geojson = FeatureCollection(features: [ diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 0f2b8905..2ad90a62 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -1,6 +1,10 @@ import 'package:test/test.dart'; import 'package:turf/helpers.dart'; -import 'package:turf/meta.dart'; +import 'package:turf/src/meta/coord.dart'; +import 'package:turf/src/meta/feature.dart'; +import 'package:turf/src/meta/flatten.dart'; +import 'package:turf/src/meta/geom.dart'; +import 'package:turf/src/meta/prop.dart'; Feature pt = Feature( geometry: Point.fromJson({ From 4fdcb58506e057a699ff32e4eaa57518c405e33e Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Mon, 4 Apr 2022 09:00:26 +0200 Subject: [PATCH 31/72] Meta functions extension methods (#73) * initial setup * fix export, add all *each functions * implement 'other' functions * implement *reduce functions * fix tests * rm geojson param for reducers --- benchmark/line_segment_benchmark.dart | 13 ++- lib/extensions.dart | 3 + lib/meta.dart | 2 +- lib/src/line_segment.dart | 2 +- lib/src/meta/extensions.dart | 125 +++++++++++++++++++++++++ test/components/line_segment_test.dart | 6 +- 6 files changed, 144 insertions(+), 7 deletions(-) create mode 100644 lib/extensions.dart create mode 100644 lib/src/meta/extensions.dart diff --git a/benchmark/line_segment_benchmark.dart b/benchmark/line_segment_benchmark.dart index e401dd2e..b15ed89d 100644 --- a/benchmark/line_segment_benchmark.dart +++ b/benchmark/line_segment_benchmark.dart @@ -79,9 +79,16 @@ void main() { lineSegment(collection); }); benchmark('segmentReduce', () { - segmentReduce(collection, (previousValue, currentSegment, initialValue, - featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) { - previousValue++; + segmentReduce(collection, (previousValue, + currentSegment, + initialValue, + featureIndex, + multiFeatureIndex, + geometryIndex, + segmentIndex) { + if (previousValue != null) { + previousValue++; + } return previousValue; }, 0, combineNestedGeometries: false); }); diff --git a/lib/extensions.dart b/lib/extensions.dart new file mode 100644 index 00000000..a0d28853 --- /dev/null +++ b/lib/extensions.dart @@ -0,0 +1,3 @@ +library turf_extensions; + +export 'src/meta/extensions.dart'; diff --git a/lib/meta.dart b/lib/meta.dart index 7152d8ad..4aaa43b7 100644 --- a/lib/meta.dart +++ b/lib/meta.dart @@ -5,5 +5,5 @@ export 'src/meta/coord.dart'; export 'src/meta/feature.dart'; export 'src/meta/flatten.dart'; export 'src/meta/geom.dart'; -export 'src/line_segment.dart' show segmentEach, segmentReduce; +export 'src/line_segment.dart' hide lineSegment; export 'src/meta/prop.dart'; diff --git a/lib/src/line_segment.dart b/lib/src/line_segment.dart index 3123a63e..75523238 100644 --- a/lib/src/line_segment.dart +++ b/lib/src/line_segment.dart @@ -249,7 +249,7 @@ typedef T? SegmentReduceCallback( T? segmentReduce( GeoJSONObject geojson, - SegmentReduceCallback callback, + SegmentReduceCallback callback, T? initialValue, { bool combineNestedGeometries = true, }) { diff --git a/lib/src/meta/extensions.dart b/lib/src/meta/extensions.dart new file mode 100644 index 00000000..4bda2783 --- /dev/null +++ b/lib/src/meta/extensions.dart @@ -0,0 +1,125 @@ +import 'package:turf/helpers.dart'; +import 'package:turf/meta.dart' as meta; + +extension GeoJSONObjectMetaExtension on GeoJSONObject { + void geomEach(meta.GeomEachCallback callback) { + meta.geomEach(this, callback); + } + + T? geomReduce(meta.GeomReduceCallback callback, T? initialValue) { + meta.geomReduce( + this, + callback, + initialValue, + ); + } + + void propEach(meta.PropEachCallback callback) { + meta.propEach(this, callback); + } + + T? propReduce( + meta.PropReduceCallback callback, + T? initialValue, + ) { + meta.propReduce( + this, + callback, + initialValue, + ); + } + + void featureEach(meta.FeatureEachCallback callback) { + meta.featureEach(this, callback); + } + + T? featureReduce( + meta.FeatureReduceCallback callback, + T? initialValue, + ) { + meta.featureReduce( + this, + callback, + initialValue, + ); + } + + void coordEach(meta.CoordEachCallback callback) { + meta.coordEach(this, callback); + } + + T? coordReduce( + meta.CoordReduceCallback callback, + T? initialValue, [ + bool excludeWrapCoord = false, + ]) { + meta.coordReduce( + this, + callback, + initialValue, + excludeWrapCoord, + ); + } + + List coordAll() { + return meta.coordAll(this); + } + + void flattenEach(meta.FlattenEachCallback callback) { + meta.flattenEach(this, callback); + } + + T? flattenReduce( + meta.FlattenReduceCallback callback, + T? initialValue, + ) { + meta.flattenReduce( + this, + callback, + initialValue, + ); + } + + void segmentEach(meta.SegmentEachCallback callback) { + meta.segmentEach(this, callback); + } + + T? segmentReduce( + meta.SegmentReduceCallback callback, + T? initialValue, { + bool combineNestedGeometries = true, + }) { + meta.segmentReduce( + this, + callback, + initialValue, + combineNestedGeometries: combineNestedGeometries, + ); + } +} + +extension FeatureCollectionMetaExtension on FeatureCollection { + void clusterEach( + dynamic property, + meta.ClusterEachCallback callback, + ) { + meta.clusterEach(this, property, callback); + } + + FeatureCollection getCluster(dynamic filter) { + return meta.getCluster(this, filter); + } + + T? clusterReduce( + dynamic property, + meta.ClusterReduceCallback callback, + dynamic initialValue, + ) { + meta.clusterReduce( + this, + property, + callback, + initialValue, + ); + } +} diff --git a/test/components/line_segment_test.dart b/test/components/line_segment_test.dart index 8dbf85ee..3de552e3 100644 --- a/test/components/line_segment_test.dart +++ b/test/components/line_segment_test.dart @@ -112,14 +112,16 @@ main() { }); test("segmentReduce", () { - var total = segmentReduce(poly1, (previousValue, + var total = segmentReduce(poly1, (previousValue, currentSegment, initialValue, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) { - previousValue++; + if (previousValue != null) { + previousValue++; + } return previousValue; }, 0, combineNestedGeometries: false); expect(total, 6); From a35adb140462e0f8e6ea486c3305903ff8c70072 Mon Sep 17 00:00:00 2001 From: arman Date: Tue, 12 Apr 2022 09:02:14 +0200 Subject: [PATCH 32/72] Update functions and packages in README.md (#67) * WIP - updating README.md * missing new functions & packages * helpers function aint needed anymore - constructor * Links added and unnecessary funtioncs deleted Co-authored-by: Lukas Himsel --- README.md | 66 +++++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index d12d5c19..b220c7ae 100644 --- a/README.md +++ b/README.md @@ -64,13 +64,14 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] bezierSpline - [ ] buffer - [ ] circle -- [ ] clone +- [x] clone - implemented as a member function of each [GeoJSONObject] - [ ] concave - [ ] convex - [ ] difference - [ ] dissolve - [ ] intersect - [ ] lineOffset +- [ ] polygonSmooth - [ ] simplify - [ ] tesselate - [ ] transformRotate @@ -88,12 +89,13 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] polygonToLine ### MISC +- [ ] ellipse - [ ] kinks - [ ] lineArc - [ ] lineChunk - [ ] lineIntersect - [ ] lineOverlap -- [x] lineSegment +- [x] [lineSegment](https://github.com/dartclub/turf_dart/blob/main/lib/src/line_segment.dart) - [ ] lineSlice - [ ] lineSliceAlong - [ ] lineSplit @@ -138,37 +140,33 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] clustersKmeans ### META -- [x] coordAll -- [x] coordEach -- [x] coordReduce -- [x] [featureEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L157) -- [x] featureReduce -- [x] [flattenEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L181) -- [x] flattenReduce -- [x] getCoord -- [x] getCoords -- [x] [geomEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L34) -- [x] geomReduce -- [x] [propEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta.dart#L124) -- [x] propReduce -- [x] segmentEach -- [x] segmentReduce -- [ ] getCluster -- [ ] clusterEach -- [ ] clusterReduce - -### Assertions -- [ ] collectionOf -- [ ] containsNumber -- [ ] geojsonType -- [ ] featureOf +- [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) +- [x] [featureEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/feature.dart) +- [x] [featureReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/feature.dart) +- [x] [flattenEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/flatten.dart) +- [x] [flattenReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/flatten.dart) +- [x] [getCoord](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/coord.dart) +- [x] [getCoords](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/coord.dart) +- [x] [geomEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/geom.dart) +- [x] [geomReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/geom.dart) +- [x] [propEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/prop.dart) +- [x] [propReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/prop.dart) +- [x] [segmentEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/line_segment.dart) +- [x] [segmentReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/line_segment.dart) +- [x] [getCluster](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/cluster.dart) +- [x] [clusterEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/cluster.dart) +- [x] [clusterReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/cluster.dart) ### Booleans - [ ] booleanClockwise +- [ ] booleanConcave - [ ] booleanContains - [ ] booleanCrosses - [ ] booleanDisjoint - [ ] booleanEqual +- [ ] booleanIntersects - [ ] booleanOverlap - [ ] booleanParallel - [ ] booleanPointInPolygon @@ -176,13 +174,13 @@ 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#L103) -- [x] [convertArea](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L132) -- [x] [convertLength](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L121) -- [x] [degreesToRadians](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L116) -- [x] [lengthToRadians](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L91) -- [x] [lengthToDegrees](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L99) -- [x] [radiansToLength](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L83) -- [x] [radiansToDegrees](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart#L111) +- [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) +- [x] [degreesToRadians](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) +- [x] [lengthToRadians](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) +- [x] [lengthToDegrees](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) +- [x] [radiansToLength](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) +- [x] [radiansToDegrees](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) - [ ] toMercator - [ ] toWgs84 From 6d6d7861de433c83c24cf81590c3afbc7794c693 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 12 Apr 2022 10:49:26 +0200 Subject: [PATCH 33/72] Raise version to 0.0.5 --- CHANGELOG.md | 6 ++++++ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1c510f1..254cb167 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.0.5 + +- Implements *all* meta functions and`lineSegment` +- Adds a lot of documentation +- Several bug and type fixes + ## 0.0.4 - Implements the `featureEach` and `propEach` meta function. [#24](https://github.com/dartclub/turf_dart/pull/24) diff --git a/pubspec.yaml b/pubspec.yaml index c0b5780c..873d9849 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.4 +version: 0.0.5 environment: sdk: '>=2.12.0 <3.0.0' homepage: https://github.com/dartclub/turf_dart From 2ecfc4f5d1fc61543fc434e8cd6773bc06159c22 Mon Sep 17 00:00:00 2001 From: arman Date: Fri, 15 Apr 2022 08:19:21 +0200 Subject: [PATCH 34/72] Documentation (#75) * in process - early analysis of the work * linked the meta functions in readme * CONTRIBUTING.md * links to the sources * edited typos * documentation work * closes #77, closes #16 * proofread * improves pub.dev score, closes #79, #78, #75 * Added deleted model, complemented contributing.md Co-authored-by: Lukas Himsel --- CONTRIBUTING.md | 94 +++++++++++++++ benchmark/cluster_benchmark.dart | 2 - lib/src/bearing.dart | 20 ++++ lib/src/destination.dart | 19 +++ lib/src/distance.dart | 14 +++ lib/src/helpers.dart | 19 +++ lib/src/invariant.dart | 3 +- lib/src/line_segment.dart | 4 +- lib/src/meta/extensions.dart | 14 +-- lib/src/meta/feature.dart | 1 - lib/src/midpoint.dart | 14 +++ lib/src/nearest_point.dart | 23 ++++ lib/turf.dart | 3 - test/components/geojson_test.dart | 190 +++++++++++++++--------------- test/components/meta_test.dart | 186 ++++++++++++++--------------- 15 files changed, 396 insertions(+), 210 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..251280ee --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,94 @@ +# Contributiung to Turf.dart + +Welcome and thank you for deciding to contribute to the project! + +Here is how cooperation works perfectly at [Turf Dart](https://github.com/dartclub/turf_dart) +#### Table of Contents + - [Code of Conduct](#code-of-conduct) + - [Get started](#get-started) + - [Structure of modules](#structure-of-modules) + - [Implementation Process](#implementation-process) + - [Documentation](#documentation) + - [GeoJSON object model](#GeoJSON-object-model) + +## Code of conduct +By participating, you are expected to uphold international human rights and fundamental freedoms! +To put it simply, be kind to each other. + +## Get started +- Get the [Dart tools](https://dart.dev/tools) +- Clone the repository: ```git clone git@github.com:dartclub/turf_dart.git``` +- Navigate to project's folder in terminal & get its dependencies: ```dart pub get``` +- Go through [Implementation Process](#implementation-process) +- Import the library in your code and use it. For example: +```dart +import 'package:turf/helpers.dart'; +import 'package:turf/src/line_segment.dart'; + + Feature poly = Feature( + geometry: Polygon(coordinates: [ + [ + Position(0, 0), + Position(2, 2), + Position(0, 1), + Position(0, 0), + ], + [ + Position(0, 0), + Position(1, 1), + Position(0, 1), + Position(0, 0), + ], + ]), + ); + +var total = segmentReduce(poly, (previousValue, + currentSegment, + initialValue, + featureIndex, + multiFeatureIndex, + geometryIndex, + segmentIndex) { + if (previousValue != null) { + previousValue++; + } + return previousValue; + }, 0, combineNestedGeometries: false); +// total.length == 6 +``` +## Structure of modules +``` +TURF_DART/lib/.dart // public facing API, exports the implementation + │ │ + │ └───src/.dart // the implementation + │ + └───benchmark/_benchmark.dart + │ + └───test/components/_test.dart // all the related tests +``` +## Implementation process +- Check the Backlog/Issues for similar issues +- Create a new branch _feature-_ from _main_ +- Create a _draft Pull request_, mention in it the associated issues +- **Implement** + - Document everything [properly](#documentation) + - If you are importing tests, comments etc. from [Turfjs](https://github.com/Turfjs/turf), please make sure you refactor it so it conforms with Dart syntax. + - **Write [tests](https://dart.dev/guides/testing)**―Keep an eye on [Turfjs'](https://github.com/Turfjs/turf) implementation + - run the the test: ```dart test test/components/XXX.dart``` + - **Write [benchmarks](https://pub.dev/packages/benchmark)**―have a look at our [implementation](https://github.com/dartclub/turf_dart/tree/main/benchmark) + - run the benchmark: ```dart pub run benchmark``` +- Commit +- Convert to real Pull request _ready for review_ +- Code review / mention a reviewer from [contributors list](https://github.com/dartclub/turf_dart/graphs/contributors) + + +## Documentation +We follow [Effective Dart](https://dart.dev/guides/language/effective-dart/documentation) guidelines for documentation. + +After going through the [Implementation Process](#implementation-process), please mention the made changes in [README.md](https://github.com/dartclub/turf_dart/blob/main/README.md) + +In order to add to this very documentation, please develop CONTRIBUTING.md in [documentation branch](https://github.com/dartclub/turf_dart/tree/documentation) + +## GeoJSON Object Model +If you have not read our [README.md](https://github.com/dartclub/turf_dart/blob/main/README.md) this diagram will give you a lot of information. Please consider looking our [notable design decisions](https://github.com/dartclub/turf_dart/blob/main/README.md#notable-design-decisions). +![polymorphism](https://user-images.githubusercontent.com/10634693/159876354-f9da2f37-02b3-4546-b32a-c0f82c372272.png) \ No newline at end of file diff --git a/benchmark/cluster_benchmark.dart b/benchmark/cluster_benchmark.dart index e2966a53..b3d0ca57 100644 --- a/benchmark/cluster_benchmark.dart +++ b/benchmark/cluster_benchmark.dart @@ -27,10 +27,8 @@ void main() { benchmark('clusterEach', () { List clusters = []; - int total = 0; clusterEach(featureCollection, "cluster", (cluster, clusterValue, currentIndex) { - total += cluster!.features.length; clusters.add(cluster); }); }); diff --git a/lib/src/bearing.dart b/lib/src/bearing.dart index 615a260e..f979375b 100644 --- a/lib/src/bearing.dart +++ b/lib/src/bearing.dart @@ -3,6 +3,9 @@ import 'dart:math'; import 'geojson.dart'; import 'helpers.dart'; +// http://en.wikipedia.org/wiki/Haversine_formula +// http://www.movable-type.co.uk/scripts/latlong.html + num bearingRaw(Position start, Position end, {bool calcFinal = false}) { // Reverse calculation if (calcFinal == true) { @@ -19,6 +22,22 @@ num bearingRaw(Position start, Position end, {bool calcFinal = false}) { return radiansToDegrees(atan2(a, b)); } +/// Takes two [Point]s and finds the geographic bearing between them, +/// i.e. the angle measured in degrees from the north line (0 degrees) +/// For example: +/// +/// ```dart +/// var point1 = Point(coordinates: Position(-75.343, 39.984)); +/// var point2 = Point(coordinates: Position((-75.543, 39.123)); +/// +/// var bearing = bearing(point1, point2); +/// //addToMap +/// var addToMap = [point1, point2] +/// point1.properties['marker-color'] = '#f00' +/// point2.properties['marker-color'] = '#0f0' +/// point1.properties.bearing = bearing +/// ``` + num bearing(Point start, Point end, {bool calcFinal = false}) => bearingRaw(start.coordinates, end.coordinates, calcFinal: calcFinal); @@ -28,5 +47,6 @@ num calculateFinalBearingRaw(Position start, Position end) { return reverseBearing.remainder(360); } +/// Calculates Final Bearing num calculateFinalBearing(Point start, Point end) => calculateFinalBearingRaw(start.coordinates, end.coordinates); diff --git a/lib/src/destination.dart b/lib/src/destination.dart index 78c805cc..48461b98 100644 --- a/lib/src/destination.dart +++ b/lib/src/destination.dart @@ -22,6 +22,25 @@ Position destinationRaw(Position origin, num distance, num bearing, ); } +/// Takes a [Point] and calculates the location of a destination point given a distance in +/// degrees, radians, miles, or kilometers; and bearing in degrees. +/// This uses the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula) to account for global curvature. +/// For example: +/// +/// ```dart +/// var point = Point(coordinates: Position(-75.343, 39.984)); +/// var distance = 50; +/// var bearing = 90; +/// var options = Unit.miles; +/// +/// var destination = destination(point, distance, bearing, options); +/// +/// //addToMap +/// var addToMap = [point, destination] +/// destination.properties['marker-color'] = '#f00'; +/// point.properties['marker-color'] = '#0f0'; +/// ``` + Point destination(Point origin, num distance, num bearing, [Unit unit = Unit.kilometers]) => Point( diff --git a/lib/src/distance.dart b/lib/src/distance.dart index bfe11820..f8bd5267 100644 --- a/lib/src/distance.dart +++ b/lib/src/distance.dart @@ -3,6 +3,9 @@ import 'dart:math'; import 'geojson.dart'; import 'helpers.dart'; +//http://en.wikipedia.org/wiki/Haversine_formula +//http://www.movable-type.co.uk/scripts/latlong.html + num distanceRaw(Position from, Position to, [Unit unit = Unit.kilometers]) { var dLat = degreesToRadians((to.lat - from.lat)); var dLon = degreesToRadians((to.lng - from.lng)); @@ -14,5 +17,16 @@ num distanceRaw(Position from, Position to, [Unit unit = Unit.kilometers]) { return radiansToLength(2 * atan2(sqrt(a), sqrt(1 - a)), unit); } +/// Calculates the distance between two [Point]s in degrees, radians, miles, or kilometers. +/// This uses the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula) to account for global curvature. +/// For example: +/// +/// ```dart +/// var from = Point(coordinates: Position(-75.343, 39.984)); +/// var to = Point(coordinates: Position(-75.443, 39.984)); +/// var options = Unit.miles; +/// +/// var distance = distance(from, to, options); +/// ``` num distance(Point from, Point to, [Unit unit = Unit.kilometers]) => distanceRaw(from.coordinates, to.coordinates, unit); diff --git a/lib/src/helpers.dart b/lib/src/helpers.dart index a2f6115d..f83f7212 100644 --- a/lib/src/helpers.dart +++ b/lib/src/helpers.dart @@ -30,8 +30,11 @@ enum Corner { centroid, } +/// Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth. const earthRadius = 6371008.8; +/// Unit of measurement factors using a spherical (non-ellipsoid) earth radius. +/// Keys are the name of the unit, values are the number of that unit in a single radian const factors = { Unit.centimeters: earthRadius * 100, Unit.degrees: earthRadius / 111325, @@ -60,6 +63,7 @@ const unitsFactors = { Unit.yards: 1 / 1.0936, }; +/// Area of measurement factors based on 1 square meter. const areaFactors = { Unit.acres: 0.000247105, Unit.centimeters: 10000, @@ -72,6 +76,7 @@ const areaFactors = { Unit.yards: 1.195990046, }; +/// Round number to precision num round(num value, [num precision = 0]) { if (!(precision >= 0)) { throw Exception("precision must be a positive number"); @@ -81,6 +86,8 @@ num round(num value, [num precision = 0]) { return result.round() / multiplier; } +/// Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit. +/// Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet num radiansToLength(num radians, [Unit unit = Unit.kilometers]) { var factor = factors[unit]; if (factor == null) { @@ -89,6 +96,8 @@ num radiansToLength(num radians, [Unit unit = Unit.kilometers]) { return radians * factor; } +/// Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians +/// Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet num lengthToRadians(num distance, [Unit unit = Unit.kilometers]) { num? factor = factors[unit]; if (factor == null) { @@ -97,10 +106,14 @@ num lengthToRadians(num distance, [Unit unit = Unit.kilometers]) { return distance / factor; } +/// Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees +/// Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet num lengthToDegrees(num distance, [Unit unit = Unit.kilometers]) { return radiansToDegrees(lengthToRadians(distance, unit)); } +/// Converts any bearing angle from the north line direction (positive clockwise) +/// and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line num bearingToAzimuth(num bearing) { num angle = bearing.remainder(360); if (angle < 0) { @@ -109,16 +122,20 @@ num bearingToAzimuth(num bearing) { return angle; } +/// Converts an angle in radians to degrees num radiansToDegrees(num radians) { num degrees = radians.remainder(2 * pi); return degrees * 180 / pi; } +/// Converts an angle in degrees to radians num degreesToRadians(num degrees) { num radians = degrees.remainder(360); return radians * pi / 180; } +/// Converts a length to the requested unit. +/// Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet num convertLength( num length, [ Unit originalUnit = Unit.kilometers, @@ -130,6 +147,8 @@ num convertLength( return radiansToLength(lengthToRadians(length, originalUnit), finalUnit); } +/// Converts a area to the requested unit. +/// Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches, hectares num convertArea(num area, [originalUnit = Unit.meters, finalUnit = Unit.kilometers]) { if (area < 0) { diff --git a/lib/src/invariant.dart b/lib/src/invariant.dart index 2cf0859e..3303e25d 100644 --- a/lib/src/invariant.dart +++ b/lib/src/invariant.dart @@ -26,11 +26,12 @@ Position getCoord(dynamic coord) { throw Exception("coord must be GeoJSON Point or Position"); } -/// Unwrap coordinates from a [Feature], [GeometryObject] or a [List] +/// Unwraps coordinates from a [Feature], [GeometryObject] or a [List] /// /// Gets a [List], [GeometryObject] or a [Feature] or a [List] and /// returns [List]. /// For example: +/// /// ```dart /// var polygon = Polygon(coordinates: [ /// [ diff --git a/lib/src/line_segment.dart b/lib/src/line_segment.dart index 75523238..c9db26a3 100644 --- a/lib/src/line_segment.dart +++ b/lib/src/line_segment.dart @@ -3,8 +3,6 @@ import 'package:turf/src/meta/flatten.dart'; import 'geojson.dart'; -// export default lineSegment; - /// Creates a [FeatureCollection] of 2-vertex [LineString] segments from a /// [LineString] or [MultiLineString] or [Polygon] and [MultiPolygon] /// Returns [FeatureCollection] 2-vertex line segments @@ -210,7 +208,7 @@ typedef T? SegmentReduceCallback( int segmentIndex, ); -/// Reduce 2-vertex line segment in any GeoJSON object, similar to [Iterable.reduce]() +/// Reduces 2-vertex line segment in any GeoJSON object, similar to [Iterable.reduce]() /// (Multi)Point geometries do not contain segments therefore they are ignored during this operation. /// /// Takes [FeatureCollection], [Feature], [GeoJSONObject], a diff --git a/lib/src/meta/extensions.dart b/lib/src/meta/extensions.dart index 4bda2783..af809c4e 100644 --- a/lib/src/meta/extensions.dart +++ b/lib/src/meta/extensions.dart @@ -7,7 +7,7 @@ extension GeoJSONObjectMetaExtension on GeoJSONObject { } T? geomReduce(meta.GeomReduceCallback callback, T? initialValue) { - meta.geomReduce( + return meta.geomReduce( this, callback, initialValue, @@ -22,7 +22,7 @@ extension GeoJSONObjectMetaExtension on GeoJSONObject { meta.PropReduceCallback callback, T? initialValue, ) { - meta.propReduce( + return meta.propReduce( this, callback, initialValue, @@ -37,7 +37,7 @@ extension GeoJSONObjectMetaExtension on GeoJSONObject { meta.FeatureReduceCallback callback, T? initialValue, ) { - meta.featureReduce( + return meta.featureReduce( this, callback, initialValue, @@ -53,7 +53,7 @@ extension GeoJSONObjectMetaExtension on GeoJSONObject { T? initialValue, [ bool excludeWrapCoord = false, ]) { - meta.coordReduce( + return meta.coordReduce( this, callback, initialValue, @@ -73,7 +73,7 @@ extension GeoJSONObjectMetaExtension on GeoJSONObject { meta.FlattenReduceCallback callback, T? initialValue, ) { - meta.flattenReduce( + return meta.flattenReduce( this, callback, initialValue, @@ -89,7 +89,7 @@ extension GeoJSONObjectMetaExtension on GeoJSONObject { T? initialValue, { bool combineNestedGeometries = true, }) { - meta.segmentReduce( + return meta.segmentReduce( this, callback, initialValue, @@ -115,7 +115,7 @@ extension FeatureCollectionMetaExtension on FeatureCollection { meta.ClusterReduceCallback callback, dynamic initialValue, ) { - meta.clusterReduce( + return meta.clusterReduce( this, property, callback, diff --git a/lib/src/meta/feature.dart b/lib/src/meta/feature.dart index 46aa79b5..c1b033c0 100644 --- a/lib/src/meta/feature.dart +++ b/lib/src/meta/feature.dart @@ -8,7 +8,6 @@ typedef FeatureEachCallback = dynamic Function( /// Iterates over features in any [geoJSONObject], calling [callback] on each /// iteration. Similar to [Iterable.forEach]. -/// /// For example: /// /// ```dart diff --git a/lib/src/midpoint.dart b/lib/src/midpoint.dart index ec6aef1f..71764572 100644 --- a/lib/src/midpoint.dart +++ b/lib/src/midpoint.dart @@ -11,6 +11,20 @@ Position midpointRaw(Position point1, Position point2) { return midpoint; } +/// Takes two [Point]s and returns a point midway between them. +/// The midpoint is calculated geodesically, meaning the curvature of the earth is taken into account. +/// For example: +/// +/// ``` +/// var point1 = Point(coordinates: Position(-75.343, 39.984)); +/// var point2 = Point(coordinates: Position((-75.543, 39.123)); +/// +/// var midpoint = midpoint(point1, point2); +/// +/// //addToMap +/// var addToMap = [point1, point2, midpoint]; +/// midpoint.properties['marker-color'] = '#f00'; +/// ``` Point midpoint(Point point1, Point point2) => Point( coordinates: midpointRaw(point1.coordinates, point2.coordinates), ); diff --git a/lib/src/nearest_point.dart b/lib/src/nearest_point.dart index 00e94288..afd1b94b 100644 --- a/lib/src/nearest_point.dart +++ b/lib/src/nearest_point.dart @@ -1,6 +1,29 @@ import 'distance.dart'; import 'geojson.dart'; +/// Takes a reference [Point] and a FeatureCollection of Features +/// with Point geometries and returns the +/// point from the FeatureCollection closest to the reference. This calculation +/// is geodesic. For example: +/// +/// ```dart +/// var targetPoint = Point(coordinates: Position(-75.943, 39.984)); +/// Feature feature = +/// Feature(geometry: targetPoint, properties: {"marker-color": "#0F0"}); +/// FeatureCollection points = FeatureCollection(features: [ +/// Feature(geometry: Point(coordinates: Position(-75.343, 39.984))), +/// Feature(geometry: Point(coordinates: Position(-75.443, 39.984))), +/// Feature(geometry: Point(coordinates: Position(-75.543, 39.984))), +/// Feature(geometry: Point(coordinates: Position(-75.643, 39.984))), +/// ]); +/// +/// var nearest = nearestPoint(targetPoint, points); +/// +/// //addToMap +/// var addToMap = [targetPoint, points, nearest]; +/// nearest.properties['marker-color'] = '#F00'; +/// ``` + Feature nearestPoint( Feature targetPoint, FeatureCollection points) { Feature nearest; diff --git a/lib/turf.dart b/lib/turf.dart index 03e8c952..380b60ec 100644 --- a/lib/turf.dart +++ b/lib/turf.dart @@ -1,6 +1,3 @@ -/// Support for doing something awesome. -/// -/// More dartdocs go here. library turf; export 'src/bearing.dart'; diff --git a/test/components/geojson_test.dart b/test/components/geojson_test.dart index 0485e4aa..957c730e 100644 --- a/test/components/geojson_test.dart +++ b/test/components/geojson_test.dart @@ -309,107 +309,111 @@ main() { expect(() => GeometryType.deserialize(geoJSON3), throwsA(isA())); }); - test('.clone()', () { - final coll = FeatureCollection( - bbox: BBox(100, 0, 101, 1), - features: [ - Feature( - bbox: BBox(100, 0, 101, 1), - geometry: GeometryCollection( + test( + '.clone()', + () { + final coll = FeatureCollection( + bbox: BBox(100, 0, 101, 1), + features: [ + Feature( bbox: BBox(100, 0, 101, 1), - geometries: [ - LineString( - bbox: BBox(100, 0, 101, 1), - coordinates: [Position(100, 0), Position(101, 1)], - ), - MultiLineString.fromLineStrings( - bbox: BBox(100, 0, 101, 1), - lineStrings: [ - LineString( - bbox: BBox(100, 0, 101, 1), - coordinates: [Position(100, 0), Position(101, 1)], - ), - LineString( - bbox: BBox(100, 0, 101, 1), - coordinates: [Position(100, 1), Position(101, 0)], - ), - ], - ), - MultiPoint.fromPoints( - bbox: BBox(100, 0, 101, 1), - points: [ - Point(coordinates: Position(100, 0)), - Point(coordinates: Position(100.5, 0.5)), - Point(coordinates: Position(101, 1)), - ], - ), - Polygon( - bbox: BBox(100, 0, 101, 1), - coordinates: [ - [ - Position(100, 0), - Position(100, 1), - Position(101, 0), - ] - ], - ), - MultiPolygon.fromPolygons( - bbox: BBox(100, 0, 101, 1), - polygons: [ - Polygon(coordinates: [ + geometry: GeometryCollection( + bbox: BBox(100, 0, 101, 1), + geometries: [ + LineString( + bbox: BBox(100, 0, 101, 1), + coordinates: [Position(100, 0), Position(101, 1)], + ), + MultiLineString.fromLineStrings( + bbox: BBox(100, 0, 101, 1), + lineStrings: [ + LineString( + bbox: BBox(100, 0, 101, 1), + coordinates: [Position(100, 0), Position(101, 1)], + ), + LineString( + bbox: BBox(100, 0, 101, 1), + coordinates: [Position(100, 1), Position(101, 0)], + ), + ], + ), + MultiPoint.fromPoints( + bbox: BBox(100, 0, 101, 1), + points: [ + Point(coordinates: Position(100, 0)), + Point(coordinates: Position(100.5, 0.5)), + Point(coordinates: Position(101, 1)), + ], + ), + Polygon( + bbox: BBox(100, 0, 101, 1), + coordinates: [ [ Position(100, 0), Position(100, 1), Position(101, 0), ] - ]), - Polygon(coordinates: [ - [ - Position(100, 0), - Position(100, 1), - Position(101, 0), - ] - ]) - ], - ), - ], - ), - id: 1, - properties: {"key": "val"}), - ], - ); - final cloned = coll.clone(); - final feat = cloned.features.first; - final bbox = BBox(100, 0, 101, 1); - expect(cloned.bbox, bbox); - expect(feat.id, 1); - expect(feat.bbox, bbox); - expect(feat.properties!.keys.first, "key"); - expect(feat.properties!.values.first, "val"); - expect(feat.geometry!, isA()); - final geomColl = feat.geometry!; - expect(geomColl.geometries.length, - coll.features.first.geometry!.geometries.length); - for (var geom in geomColl.geometries) { - expect(geom.bbox, isNotNull); - expect(geom.coordinates, isNotEmpty); - - _expandRecursively(List inner) { - if (inner is List) { - return inner; - } else { - return inner.expand((el) => el is List ? _expandRecursively(el) : el); + ], + ), + MultiPolygon.fromPolygons( + bbox: BBox(100, 0, 101, 1), + polygons: [ + Polygon(coordinates: [ + [ + Position(100, 0), + Position(100, 1), + Position(101, 0), + ] + ]), + Polygon(coordinates: [ + [ + Position(100, 0), + Position(100, 1), + Position(101, 0), + ] + ]) + ], + ), + ], + ), + id: 1, + properties: {"key": "val"}), + ], + ); + final cloned = coll.clone(); + final feat = cloned.features.first; + final bbox = BBox(100, 0, 101, 1); + expect(cloned.bbox, bbox); + expect(feat.id, 1); + expect(feat.bbox, bbox); + expect(feat.properties!.keys.first, "key"); + expect(feat.properties!.values.first, "val"); + expect(feat.geometry!, isA()); + final geomColl = feat.geometry!; + expect(geomColl.geometries.length, + coll.features.first.geometry!.geometries.length); + for (var geom in geomColl.geometries) { + expect(geom.bbox, isNotNull); + expect(geom.coordinates, isNotEmpty); + + _expandRecursively(List inner) { + if (inner is List) { + return inner; + } else { + return inner + .expand((el) => el is List ? _expandRecursively(el) : el); + } } - } - var expanded = _expandRecursively(geom.coordinates); - expect( - expanded.first, - Position(100, 0), - ); - } - // TODO refine tests - }); + var expanded = _expandRecursively(geom.coordinates); + expect( + expanded.first, + Position(100, 0), + ); + } + // TODO refine tests + }, + ); final points = [ Point(coordinates: Position(1, 2, 3)), diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 2ad90a62..102bdbab 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -7,107 +7,96 @@ import 'package:turf/src/meta/geom.dart'; import 'package:turf/src/meta/prop.dart'; Feature pt = Feature( - geometry: Point.fromJson({ - 'coordinates': [0, 0], - }), + geometry: Point(coordinates: Position(0, 0)), properties: { 'a': 1, }, ); Feature pt2 = Feature( - geometry: Point.fromJson({ - 'coordinates': [1, 1], - }), + geometry: Point(coordinates: Position(1, 1)), ); Feature line = Feature( - geometry: LineString.fromJson({ - 'coordinates': [ - [0, 0], - [1, 1], - ] - }), + geometry: LineString(coordinates: [ + Position(0, 0), + Position(1, 1), + ]), ); Feature poly = Feature( - geometry: Polygon.fromJson({ - 'coordinates': [ - [ - [0, 0], - [1, 1], - [0, 1], - [0, 0], - ], - ] - }), + geometry: Polygon(coordinates: [ + [ + Position(0, 0), + Position(1, 1), + Position(0, 1), + Position(0, 0), + ], + ]), ); Feature polyWithHole = Feature( - geometry: Polygon.fromJson({ - '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], - ], - ] - }), + geometry: Polygon(coordinates: [ + [ + Position(100.0, 0.0), + Position(101.0, 0.0), + Position(101.0, 1.0), + Position(100.0, 1.0), + Position(100.0, 0.0), + ], + [ + Position(100.2, 0.2), + Position(100.8, 0.2), + Position(100.8, 0.8), + Position(100.2, 0.8), + Position(100.2, 0.2), + ], + ]), ); Feature multiline = Feature( - geometry: MultiLineString.fromJson({ - 'coordinates': [ + geometry: MultiLineString( + coordinates: [ [ - [0, 0], - [1, 1], + Position(0, 0), + Position(1, 1), ], [ - [3, 3], - [4, 4], + Position(3, 3), + Position(4, 4), ], ], - }), + ), ); Feature multiPoint = Feature( - geometry: MultiPoint.fromJson({ - 'coordinates': [ - [0, 0], - [1, 1], - ], -})); + geometry: MultiPoint( + coordinates: [ + Position(0, 0), + Position(1, 1), + ], + ), +); Feature multiPoly = Feature( - geometry: MultiPolygon.fromJson({ - 'coordinates': [ + geometry: MultiPolygon(coordinates: [ + [ [ - [ - [0, 0], - [1, 1], - [0, 1], - [0, 0], - ], + Position(0, 0), + Position(1, 1), + Position(0, 1), + Position(0, 0), ], + ], + [ [ - [ - [3, 3], - [2, 2], - [1, 2], - [3, 3], - ], + Position(3, 3), + Position(2, 2), + Position(1, 2), + Position(3, 3), ], - ] - }), + ], + ]), ); Feature geomCollection = Feature( @@ -120,38 +109,36 @@ Feature geomCollection = Feature( ), ); -FeatureCollection fcMixed = FeatureCollection(features: [ - Feature( - geometry: Point.fromJson( - { - 'coordinates': [0, 0], - }, +FeatureCollection fcMixed = FeatureCollection( + features: [ + Feature( + geometry: Point( + coordinates: Position(0, 0), + ), + properties: {'foo': 'bar'}, ), - properties: {'foo': 'bar'}, - ), - Feature( - geometry: LineString.fromJson({ - 'coordinates': [ - [1, 1], - [2, 2], - ] - }), - properties: {'foo': 'buz'}), - Feature( - geometry: MultiLineString.fromJson({ - 'coordinates': [ - [ - [1, 1], - [0, 0], - ], - [ - [4, 4], - [5, 5], + Feature( + geometry: LineString(coordinates: [ + Position(1, 1), + Position(2, 2), + ]), + properties: {'foo': 'buz'}), + Feature( + geometry: MultiLineString( + coordinates: [ + [ + Position(0, 0), + Position(1, 1), + ], + [ + Position(4, 4), + Position(5, 5), + ], ], - ], - }), - properties: {'foo': 'qux'}), -]); + ), + properties: {'foo': 'qux'}), + ], +); List collection(Feature feature) { FeatureCollection featureCollection = FeatureCollection( @@ -665,7 +652,6 @@ main() { // Each Iterators // meta.segmentEach has been purposely excluded from this list - // TODO fill out this list will all 'each' iterators test('geomEach', () { runBreakingIterationTest(geomEach, (geom, i, props, bbox, id) { iterationCount += 1; From 4cb1ca774bb06e1a857addce69fd4aac3b996442 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 19 Apr 2022 08:15:15 +0200 Subject: [PATCH 35/72] raise to version 0.0.6 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 254cb167..bda40ef9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.0.6 + +- This is solely a quality release, without new functionality: +- Documentation: improves pub.dev scores, raised documentation coverage, fixed typos +- Return type fixes for the the meta extensions + + ## 0.0.5 - Implements *all* meta functions and`lineSegment` diff --git a/pubspec.yaml b/pubspec.yaml index 873d9849..629e4d0a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.5 +version: 0.0.6 environment: sdk: '>=2.12.0 <3.0.0' homepage: https://github.com/dartclub/turf_dart From 9135395f68fc43220b8de8c612127afd5ff1257c Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 19 Apr 2022 08:57:14 +0200 Subject: [PATCH 36/72] Improve pub score & raise to version 0.0.6+2 (#82) * add examples, fix segment * callbacks * raise version to 0.0.6+2 --- CHANGELOG.md | 4 ++++ CONTRIBUTING.md | 35 ---------------------------- README.md | 42 ++++++++++++++++++++++++++++++++++ analysis_options.yaml | 4 ++++ example/turf_dart_example.dart | 35 ++++++++++++++++++++++++++++ lib/src/line_segment.dart | 4 ++-- pubspec.yaml | 2 +- 7 files changed, 88 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bda40ef9..eb5bcf30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6+2 +- Added code examples +- Fixed segment * callbacks + ## 0.0.6 - This is solely a quality release, without new functionality: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 251280ee..4c566dc8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,42 +20,7 @@ To put it simply, be kind to each other. - Clone the repository: ```git clone git@github.com:dartclub/turf_dart.git``` - Navigate to project's folder in terminal & get its dependencies: ```dart pub get``` - Go through [Implementation Process](#implementation-process) -- Import the library in your code and use it. For example: -```dart -import 'package:turf/helpers.dart'; -import 'package:turf/src/line_segment.dart'; - Feature poly = Feature( - geometry: Polygon(coordinates: [ - [ - Position(0, 0), - Position(2, 2), - Position(0, 1), - Position(0, 0), - ], - [ - Position(0, 0), - Position(1, 1), - Position(0, 1), - Position(0, 0), - ], - ]), - ); - -var total = segmentReduce(poly, (previousValue, - currentSegment, - initialValue, - featureIndex, - multiFeatureIndex, - geometryIndex, - segmentIndex) { - if (previousValue != null) { - previousValue++; - } - return previousValue; - }, 0, combineNestedGeometries: false); -// total.length == 6 -``` ## Structure of modules ``` TURF_DART/lib/.dart // public facing API, exports the implementation diff --git a/README.md b/README.md index b220c7ae..9c065ca1 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,48 @@ 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: +```dart +import 'package:turf/helpers.dart'; +import 'package:turf/src/line_segment.dart'; + +Feature poly = Feature( + geometry: Polygon(coordinates: [ + [ + Position(0, 0), + Position(2, 2), + Position(0, 1), + Position(0, 0), + ], + [ + Position(0, 0), + Position(1, 1), + Position(0, 1), + Position(0, 0), + ], + ]), +); + +main() { + var total = segmentReduce( + poly, + (previousValue, currentSegment, initialValue, featureIndex, + multiFeatureIndex, geometryIndex, segmentIndex) { + if (previousValue != null) { + previousValue++; + } + return previousValue; + }, + 0, + combineNestedGeometries: false, + ); +} +// total.length == 6 +``` + ## GeoJSON Object Model ![polymorphism](https://user-images.githubusercontent.com/10634693/159876354-f9da2f37-02b3-4546-b32a-c0f82c372272.png) diff --git a/analysis_options.yaml b/analysis_options.yaml index d4211ab2..0b4c885d 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1 +1,5 @@ include: package:dartclub_lint/dart.yaml + +analyzer: + errors: + prefer_generic_function_type_aliases: error \ No newline at end of file diff --git a/example/turf_dart_example.dart b/example/turf_dart_example.dart index 8b137891..498079ef 100644 --- a/example/turf_dart_example.dart +++ b/example/turf_dart_example.dart @@ -1 +1,36 @@ +import 'package:turf/helpers.dart'; +import 'package:turf/src/line_segment.dart'; +Feature poly = Feature( + geometry: Polygon(coordinates: [ + [ + Position(0, 0), + Position(2, 2), + Position(0, 1), + Position(0, 0), + ], + [ + Position(0, 0), + Position(1, 1), + Position(0, 1), + Position(0, 0), + ], + ]), +); + +main() { + var total = segmentReduce( + poly, + (previousValue, currentSegment, initialValue, featureIndex, + multiFeatureIndex, geometryIndex, segmentIndex) { + if (previousValue != null) { + previousValue++; + } + return previousValue; + }, + 0, + combineNestedGeometries: false, + ); + print(total); + // total == 6 +} diff --git a/lib/src/line_segment.dart b/lib/src/line_segment.dart index c9db26a3..c8218d6a 100644 --- a/lib/src/line_segment.dart +++ b/lib/src/line_segment.dart @@ -37,7 +37,7 @@ FeatureCollection lineSegment(GeoJSONObject geoJson, } /// SegmentEachCallback -typedef dynamic SegmentEachCallback( +typedef SegmentEachCallback = dynamic Function( Feature currentSegment, int featureIndex, int? multiFeatureIndex, @@ -198,7 +198,7 @@ int _segmentEachforEachUnit( /// [multiFeatureIndex] The current index of the Multi-Feature being processed. /// [geometryIndex] The current index of the Geometry being processed. /// [segmentIndex] The current index of the Segment being processed. -typedef T? SegmentReduceCallback( +typedef SegmentReduceCallback = T? Function( T? previousValue, Feature currentSegment, T? initialValue, diff --git a/pubspec.yaml b/pubspec.yaml index 629e4d0a..057f735b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.6 +version: 0.0.6+2 environment: sdk: '>=2.12.0 <3.0.0' homepage: https://github.com/dartclub/turf_dart From a940904136e94ab68803b2804e76279eb549e5bb Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 19 Apr 2022 09:25:12 +0200 Subject: [PATCH 37/72] Improve pub score (rename example file, raise to 0.0.6+3) (#84) * add examples, fix segment * callbacks * raise version to 0.0.6+2 * Rename example file, raise to 0.0.6+3 --- CHANGELOG.md | 4 ++++ README.md | 3 ++- example/{turf_dart_example.dart => main.dart} | 0 pubspec.yaml | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) rename example/{turf_dart_example.dart => main.dart} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb5bcf30..37ae4adb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ +## 0.0.6+3 + +- Rename examples file ## 0.0.6+2 + - Added code examples - Fixed segment * callbacks diff --git a/README.md b/README.md index 9c065ca1..ad34295a 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,9 @@ main() { 0, combineNestedGeometries: false, ); + print(total); + // total == 6 } -// total.length == 6 ``` ## GeoJSON Object Model diff --git a/example/turf_dart_example.dart b/example/main.dart similarity index 100% rename from example/turf_dart_example.dart rename to example/main.dart diff --git a/pubspec.yaml b/pubspec.yaml index 057f735b..3809d44e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.6+2 +version: 0.0.6+3 environment: sdk: '>=2.12.0 <3.0.0' homepage: https://github.com/dartclub/turf_dart From 57c3616353788646e9da4c458a72325a22ffd679 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Wed, 20 Apr 2022 08:26:32 +0200 Subject: [PATCH 38/72] Implement `nearestPointOn(Multi)Line` and `internal` intersects helper (Attempt 2) (#87) * Implement `nearestPointOn(Multi)Line` (#86) Co-authored-by: Levente Morva * localIndex and index * add documentation * Fix `globalIndex` behaviour Co-authored-by: Levente Morva * fix test, according to new globalIndex behaviour * add intersection test Co-authored-by: Levente Morva --- README.md | 2 +- lib/nearest_point_on_line.dart | 3 + lib/src/intersection.dart | 41 +++ lib/src/nearest_point_on_line.dart | 216 +++++++++++++ lib/turf.dart | 1 + test/components/intersection_test.dart | 31 ++ .../nearest_point_on_line_test.dart | 302 ++++++++++++++++++ 7 files changed, 595 insertions(+), 1 deletion(-) create mode 100644 lib/nearest_point_on_line.dart create mode 100644 lib/src/intersection.dart create mode 100644 lib/src/nearest_point_on_line.dart create mode 100644 test/components/intersection_test.dart create mode 100644 test/components/nearest_point_on_line_test.dart diff --git a/README.md b/README.md index ad34295a..3e406250 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] lineSliceAlong - [ ] lineSplit - [ ] mask -- [ ] nearestPointOnLine +- [x] [nearestPointOnLine](https://github.com/dartclub/turf_dart/blob/master/lib/nearest_point_on_line.dart) - [ ] sector - [ ] shortestPath - [ ] unkinkPolygon diff --git a/lib/nearest_point_on_line.dart b/lib/nearest_point_on_line.dart new file mode 100644 index 00000000..71d7ebc5 --- /dev/null +++ b/lib/nearest_point_on_line.dart @@ -0,0 +1,3 @@ +library turf_nearest_point_on_line; + +export 'src/nearest_point_on_line.dart'; diff --git a/lib/src/intersection.dart b/lib/src/intersection.dart new file mode 100644 index 00000000..72ecf35a --- /dev/null +++ b/lib/src/intersection.dart @@ -0,0 +1,41 @@ +import 'geojson.dart'; + +Point? intersects(LineString line1, LineString line2) { + if (line1.coordinates.length != 2) { + throw Exception('line1 must only contain 2 coordinates'); + } + + if (line2.coordinates.length != 2) { + throw Exception('line2 must only contain 2 coordinates'); + } + + final x1 = line1.coordinates[0][0]!; + final y1 = line1.coordinates[0][1]!; + final x2 = line1.coordinates[1][0]!; + final y2 = line1.coordinates[1][1]!; + final x3 = line2.coordinates[0][0]!; + final y3 = line2.coordinates[0][1]!; + final x4 = line2.coordinates[1][0]!; + final y4 = line2.coordinates[1][1]!; + + final denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1); + + if (denom == 0) { + return null; + } + + final numeA = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3); + final numeB = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3); + + final uA = numeA / denom; + final uB = numeB / denom; + + if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1) { + final x = x1 + uA * (x2 - x1); + final y = y1 + uA * (y2 - y1); + + return Point(coordinates: Position.named(lng: x, lat: y)); + } + + return null; +} diff --git a/lib/src/nearest_point_on_line.dart b/lib/src/nearest_point_on_line.dart new file mode 100644 index 00000000..72e924af --- /dev/null +++ b/lib/src/nearest_point_on_line.dart @@ -0,0 +1,216 @@ +import 'dart:math'; + +import 'bearing.dart'; +import 'destination.dart'; +import 'distance.dart'; +import 'geojson.dart'; +import 'helpers.dart'; +import 'intersection.dart'; + +class _Nearest { + final Point point; + final num distance; + final int index; + final num location; + + _Nearest({ + required this.point, + required this.distance, + required this.index, + required this.location, + }); + + Feature toFeature() { + return Feature( + geometry: point, + properties: { + 'dist': distance, + 'index': index, + 'location': location, + }, + ); + } +} + +class _NearestMulti extends _Nearest { + final int line; + final int localIndex; + + _NearestMulti({ + required Point point, + required num distance, + required int index, + required this.localIndex, + required num location, + required this.line, + }) : super( + point: point, + distance: distance, + index: index, + location: location, + ); + + @override + Feature toFeature() { + return Feature( + geometry: point, + properties: { + 'dist': super.distance, + 'line': line, + 'index': super.index, + 'localIndex': localIndex, + 'location': super.location, + }, + ); + } +} + +_Nearest _nearestPointOnLine( + LineString line, + Point point, [ + Unit unit = Unit.kilometers, +]) { + _Nearest? nearest; + + num length = 0; + + for (var i = 0; i < line.coordinates.length - 1; ++i) { + final startCoordinates = line.coordinates[i]; + final stopCoordinates = line.coordinates[i + 1]; + + final startPoint = Point(coordinates: startCoordinates); + final stopPoint = Point(coordinates: stopCoordinates); + + final sectionLength = distance(startPoint, stopPoint, unit); + + final start = _Nearest( + point: startPoint, + distance: distance(point, startPoint, unit), + index: i, + location: length, + ); + + final stop = _Nearest( + point: stopPoint, + distance: distance(point, stopPoint, unit), + index: i + 1, + location: length + sectionLength, + ); + + final heightDistance = max(start.distance, stop.distance); + final direction = bearing(startPoint, stopPoint); + + final perpendicular1 = destination( + point, + heightDistance, + direction + 90, + unit, + ); + + final perpendicular2 = destination( + point, + heightDistance, + direction - 90, + unit, + ); + + final intersectionPoint = intersects( + LineString.fromPoints(points: [perpendicular1, perpendicular2]), + LineString.fromPoints(points: [startPoint, stopPoint]), + ); + + _Nearest? intersection; + + if (intersectionPoint != null) { + intersection = _Nearest( + point: intersectionPoint, + distance: distance(point, intersectionPoint, unit), + index: i, + location: length + distance(startPoint, intersectionPoint, unit), + ); + } + + if (nearest == null || start.distance < nearest.distance) { + nearest = start; + } + + if (stop.distance < nearest.distance) { + nearest = stop; + } + + if (intersection != null && intersection.distance < nearest.distance) { + nearest = intersection; + } + + length += sectionLength; + } + + /// A `LineString` is guaranteed to have at least two points and thus a + /// nearest point has to exist. + + return nearest!; +} + +_NearestMulti? _nearestPointOnMultiLine( + MultiLineString lines, + Point point, [ + Unit unit = Unit.kilometers, +]) { + _NearestMulti? nearest; + + var globalIndex = 0; + + for (var i = 0; i < lines.coordinates.length; ++i) { + final line = LineString(coordinates: lines.coordinates[i]); + + final candidate = _nearestPointOnLine(line, point); + + if (nearest == null || candidate.distance < nearest.distance) { + nearest = _NearestMulti( + point: candidate.point, + distance: candidate.distance, + index: globalIndex + candidate.index, + localIndex: candidate.index, + location: candidate.location, + line: i, + ); + } + + globalIndex += line.coordinates.length; + } + + return nearest; +} + +/// Takes a [Point] and a [LineString] and calculates the closest Point on the [LineString]. +/// ```dart +/// var line = LineString( +/// coordinates: [ +/// Position.of([-77.031669, 38.878605]), +/// Position.of([-77.029609, 38.881946]), +/// Position.of([-77.020339, 38.884084]), +/// Position.of([-77.025661, 38.885821]), +/// Position.of([-77.021884, 38.889563]), +/// Position.of([-77.019824, 38.892368)] +/// ]); +/// var pt = Point(coordinates: Position(lat: -77.037076, lng: 38.884017)); +/// +/// var snapped = nearestPointOnLine(line, pt, Unit.miles); +/// ``` +/// +Feature nearestPointOnLine( + LineString line, + Point point, [ + Unit unit = Unit.kilometers, +]) { + return _nearestPointOnLine(line, point, unit).toFeature(); +} + +/// Takes a [Point] and a [MultiLineString] and calculates the closest Point on the [MultiLineString]. +Feature? nearestPointOnMultiLine( + MultiLineString lines, + Point point, [ + Unit unit = Unit.kilometers, +]) { + return _nearestPointOnMultiLine(lines, point, unit)?.toFeature(); +} diff --git a/lib/turf.dart b/lib/turf.dart index 380b60ec..9500298d 100644 --- a/lib/turf.dart +++ b/lib/turf.dart @@ -7,3 +7,4 @@ export 'src/geojson.dart'; export 'src/midpoint.dart'; export 'src/helpers.dart'; export 'src/nearest_point.dart'; +export 'src/nearest_point_on_line.dart'; diff --git a/test/components/intersection_test.dart b/test/components/intersection_test.dart new file mode 100644 index 00000000..13bc630f --- /dev/null +++ b/test/components/intersection_test.dart @@ -0,0 +1,31 @@ +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/intersection.dart'; + +final l1 = LineString(coordinates: [ + Position(0, 0), + Position(2, 2), +]); + +final l2 = LineString(coordinates: [ + Position(2, 0), + Position(0, 2), +]); + +final l3 = LineString(coordinates: [ + Position(2, 2), + Position(2, 0), +]); + +final l4 = LineString(coordinates: [ + Position(0, 0), + Position(0, 2), +]); + +main() { + test('test intersects()', () { + expect(intersects(l1, l2)?.coordinates, Position(1, 1)); + expect(intersects(l1, l3)?.coordinates, Position(2, 2)); + expect(intersects(l3, l4), null); + }); +} diff --git a/test/components/nearest_point_on_line_test.dart b/test/components/nearest_point_on_line_test.dart new file mode 100644 index 00000000..84079e2f --- /dev/null +++ b/test/components/nearest_point_on_line_test.dart @@ -0,0 +1,302 @@ +import 'package:test/test.dart'; +import 'package:turf/distance.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/nearest_point_on_line.dart'; + +main() { + test('nearest_point_on_line -- start point', () { + final start = Point(coordinates: Position.of([-122.457175, 37.720033])); + final end = Point(coordinates: Position.of([-122.457175, 37.718242])); + + final line = LineString.fromPoints(points: [start, end]); + + final snapped = nearestPointOnLine(line, start); + + expect(snapped.geometry, start); + expect(snapped.properties!['dist'], 0); + }); + + test('nearest_point_on_line -- end point', () { + final start = Point(coordinates: Position.of([-122.457175, 37.720033])); + final end = Point(coordinates: Position.of([-122.457175, 37.718242])); + + final line = LineString.fromPoints(points: [start, end]); + + final snapped = nearestPointOnLine(line, end); + + expect(snapped.geometry, end); + expect(snapped.properties!['dist'], 0); + }); + + test('nearest_point_on_line -- behind start point', () { + final start = Point(coordinates: Position.of([-122.457175, 37.720033])); + final end = Point(coordinates: Position.of([-122.457175, 37.718242])); + + final line = LineString.fromPoints(points: [start, end]); + + final points = [ + Point(coordinates: Position.of([-122.457175, 37.720093])), + Point(coordinates: Position.of([-122.457175, 37.820093])), + Point(coordinates: Position.of([-122.457165, 37.720093])), + Point(coordinates: Position.of([-122.455165, 37.720093])), + ]; + + for (final point in points) { + expect(nearestPointOnLine(line, point).geometry, start); + } + }); + + test('nearest_point_on_line -- in front of last point', () { + final start = Point(coordinates: Position.of([-122.456161, 37.721259])); + final middle = Point(coordinates: Position.of([-122.457175, 37.720033])); + final end = Point(coordinates: Position.of([-122.457175, 37.718242])); + + final line = LineString.fromPoints(points: [start, middle, end]); + + final points = [ + Point(coordinates: Position.of([-122.45696, 37.71814])), + Point(coordinates: Position.of([-122.457363, 37.718132])), + Point(coordinates: Position.of([-122.457309, 37.717979])), + Point(coordinates: Position.of([-122.45718, 37.717045])), + ]; + + for (final point in points) { + expect(nearestPointOnLine(line, point).geometry, end); + } + }); + + test('nearest_point_on_line -- on joints', () { + final lines = [ + LineString.fromPoints( + points: [ + Point(coordinates: Position.of([-122.456161, 37.721259])), + Point(coordinates: Position.of([-122.457175, 37.720033])), + Point(coordinates: Position.of([-122.457175, 37.718242])), + ], + ), + LineString.fromPoints( + points: [ + Point(coordinates: Position.of([26.279296, 31.728167])), + Point(coordinates: Position.of([21.796875, 32.694865])), + Point(coordinates: Position.of([18.808593, 29.993002])), + Point(coordinates: Position.of([12.919921, 33.137551])), + Point(coordinates: Position.of([10.195312, 35.603718])), + Point(coordinates: Position.of([4.921875, 36.527294])), + Point(coordinates: Position.of([-1.669921, 36.527294])), + Point(coordinates: Position.of([-5.449218, 34.741612])), + Point(coordinates: Position.of([-8.789062, 32.990235])), + ], + ), + LineString.fromPoints( + points: [ + Point(coordinates: Position.of([-0.109198, 51.522042])), + Point(coordinates: Position.of([-0.10923, 51.521942])), + Point(coordinates: Position.of([-0.109165, 51.521862])), + Point(coordinates: Position.of([-0.109047, 51.521775])), + Point(coordinates: Position.of([-0.108865, 51.521601])), + Point(coordinates: Position.of([-0.108747, 51.521381])), + Point(coordinates: Position.of([-0.108554, 51.520687])), + Point(coordinates: Position.of([-0.108436, 51.520279])), + Point(coordinates: Position.of([-0.108393, 51.519952])), + Point(coordinates: Position.of([-0.108178, 51.519578])), + Point(coordinates: Position.of([-0.108146, 51.519285])), + Point(coordinates: Position.of([-0.107899, 51.518624])), + Point(coordinates: Position.of([-0.107599, 51.517782])), + ], + ), + ]; + + for (final line in lines) { + for (final position in line.coordinates) { + final point = Point(coordinates: position); + + expect(nearestPointOnLine(line, point).geometry, point); + } + } + }); + + test('nearest_point_on_line -- along the line', () { + final line = LineString.fromPoints( + points: [ + Point(coordinates: Position.of([-0.109198, 51.522042])), + Point(coordinates: Position.of([-0.10923, 51.521942])), + Point(coordinates: Position.of([-0.109165, 51.521862])), + Point(coordinates: Position.of([-0.109047, 51.521775])), + Point(coordinates: Position.of([-0.108865, 51.521601])), + Point(coordinates: Position.of([-0.108747, 51.521381])), + Point(coordinates: Position.of([-0.108554, 51.520687])), + Point(coordinates: Position.of([-0.108436, 51.520279])), + Point(coordinates: Position.of([-0.108393, 51.519952])), + Point(coordinates: Position.of([-0.108178, 51.519578])), + Point(coordinates: Position.of([-0.108146, 51.519285])), + Point(coordinates: Position.of([-0.107899, 51.518624])), + Point(coordinates: Position.of([-0.107599, 51.517782])), + ], + ); + + final points = [ + Point( + coordinates: Position.of([-0.109198, 51.522042]), + ), + Point( + coordinates: Position.of([-0.10892694586958439, 51.52166022315509]), + ), + Point( + coordinates: Position.of([-0.10870869056086806, 51.52124324652249]), + ), + Point( + coordinates: Position.of([-0.10858746428471407, 51.520807334251415]), + ), + Point( + coordinates: Position.of([-0.10846283773612979, 51.52037179553692]), + ), + Point( + coordinates: Position.of([-0.10838216818271691, 51.51993315783233]), + ), + Point( + coordinates: Position.of([-0.1081708961571415, 51.51951295576514]), + ), + Point( + coordinates: Position.of([-0.10806814357223703, 51.5190766495002]), + ), + Point( + coordinates: Position.of([-0.10790712893372725, 51.51864575426176]), + ), + Point( + coordinates: Position.of([-0.10775288313545159, 51.518213902651325]), + ), + ]; + + for (final point in points) { + final snapped = nearestPointOnLine(line, point); + final shift = distance(point, snapped.geometry!, Unit.centimeters); + + expect(shift < 1, isTrue); + } + }); + + test('nearest_point_on_line -- on sides of line', () { + final start = Point(coordinates: Position.of([-122.456161, 37.721259])); + final end = Point(coordinates: Position.of([-122.457175, 37.718242])); + + final line = LineString.fromPoints(points: [start, end]); + + final points = [ + Point(coordinates: Position.of([-122.457025, 37.71881])), + Point(coordinates: Position.of([-122.457336, 37.719235])), + Point(coordinates: Position.of([-122.456864, 37.72027])), + Point(coordinates: Position.of([-122.45652, 37.720635])), + ]; + + for (final point in points) { + final snapped = nearestPointOnLine(line, point); + + expect(snapped.geometry, isNot(start)); + expect(snapped.geometry, isNot(end)); + } + }); + + test('nearest_point_on_line -- distance and index', () { + final line = LineString.fromPoints( + points: [ + Point(coordinates: Position.of([-92.090492, 41.102897])), + Point(coordinates: Position.of([-92.191085, 41.079868])), + Point(coordinates: Position.of([-92.228507, 41.056055])), + Point(coordinates: Position.of([-92.237091, 41.008143])), + Point(coordinates: Position.of([-92.225761, 40.966937])), + Point(coordinates: Position.of([-92.15023, 40.936858])), + Point(coordinates: Position.of([-92.112464, 40.977565])), + Point(coordinates: Position.of([-92.062683, 41.034564])), + Point(coordinates: Position.of([-92.100791, 41.040002])), + ], + ); + + final point = Point(coordinates: Position.of([-92.110576, 41.040649])); + final target = Point(coordinates: Position.of([-92.100791, 41.040002])); + + final snapped = nearestPointOnLine(line, point); + + expect(snapped.geometry, target); + + final index = snapped.properties!['index'] as int; + final distance = snapped.properties!['dist'] as num; + + expect(index, 8); + expect(distance.toStringAsFixed(6), '0.823802'); + }); + + test('nearest_point_on_line -- empty multi-line', () { + final multiLine = MultiLineString(coordinates: []); + + final point = Point(coordinates: Position.of([-92.110576, 41.040649])); + + final snapped = nearestPointOnMultiLine(multiLine, point); + + expect(snapped, isNull); + }); + + test('nearest_point_on_line -- distance, line, and index', () { + final multiLine = MultiLineString.fromLineStrings( + lineStrings: [ + LineString.fromPoints( + points: [ + Point(coordinates: Position.of([-92.090492, 41.102897])), + Point(coordinates: Position.of([-92.191085, 41.079868])), + Point(coordinates: Position.of([-92.228507, 41.056055])), + Point(coordinates: Position.of([-92.237091, 41.008143])), + Point(coordinates: Position.of([-92.225761, 40.966937])), + Point(coordinates: Position.of([-92.15023, 40.936858])), + Point(coordinates: Position.of([-92.112464, 40.977565])), + Point(coordinates: Position.of([-92.062683, 41.034564])), + Point(coordinates: Position.of([-92.100791, 41.040002])), + ], + ), + LineString.fromPoints( + points: [ + Point(coordinates: Position.of([-92.141304, 41.124107])), + Point(coordinates: Position.of([-92.020797, 41.108329])), + Point(coordinates: Position.of([-91.973762, 41.019023])), + Point(coordinates: Position.of([-92.041740, 40.944120])), + Point(coordinates: Position.of([-92.151260, 40.928299])), + Point(coordinates: Position.of([-92.198295, 40.941008])), + Point(coordinates: Position.of([-92.199668, 41.012547])), + Point(coordinates: Position.of([-92.115413, 41.041633])), + Point(coordinates: Position.of([-92.143020, 41.076504])), + ], + ), + LineString.fromPoints( + points: [ + Point(coordinates: Position.of([-92.066116, 41.079092])), + Point(coordinates: Position.of([-92.028007, 41.045957])), + Point(coordinates: Position.of([-92.040023, 40.981453])), + Point(coordinates: Position.of([-92.114181, 40.951640])), + Point(coordinates: Position.of([-92.176666, 40.968752])), + Point(coordinates: Position.of([-92.210655, 40.997002])), + Point(coordinates: Position.of([-92.209968, 41.048547])), + Point(coordinates: Position.of([-92.158126, 41.071327])), + Point(coordinates: Position.of([-92.102508, 41.082197])), + ], + ), + ], + ); + + final point = Point(coordinates: Position.of([-92.110576, 41.040649])); + final target = Point(coordinates: Position.of([-92.115413, 41.041633])); + + final snapped = nearestPointOnMultiLine(multiLine, point); + + expect(snapped, isNotNull); + + expect(snapped!.geometry, target); + + final line = snapped.properties!['line'] as int; + final localIndex = snapped.properties!['localIndex'] as int; + final globalIndex = snapped.properties!['index'] as int; + final distance = snapped.properties!['dist'] as num; + + expect(line, 1); + expect(localIndex, 7); + expect(globalIndex, 16); + expect(distance.toStringAsFixed(6), '0.420164'); + }); +} From 560d2a855de917c3dc3a27651e66ef5c7c088f49 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Wed, 15 Jun 2022 14:33:52 +0200 Subject: [PATCH 39/72] Port explode function and test (#93) * initial version without tests * closes #93 * updated readme for explode * fixed formatting Co-authored-by: armantorkzaban --- README.md | 2 +- benchmark/explode_benchmark.dart | 21 +++ lib/explode.dart | 3 + lib/src/explode.dart | 50 +++++++ lib/src/helpers.dart | 1 + test/components/explode_test.dart | 46 +++++++ .../explode/in/geometrycollection-0-0.geojson | 16 +++ .../in/geometrycollection-xyz-0-6.geojson | 16 +++ .../explode/in/multilinestring-0-5.geojson | 13 ++ .../in/multilinestring-xyz-0-11.geojson | 13 ++ .../explode/in/multipoint-0-3.geojson | 7 + .../explode/in/multipoint-xyz-0-9.geojson | 7 + .../explode/in/multipolygon-0-4.geojson | 30 +++++ .../explode/in/multipolygon-xyz-0-10.geojson | 30 +++++ test/examples/explode/in/one-1-0.geojson | 52 ++++++++ test/examples/explode/in/one-2-0.geojson | 21 +++ test/examples/explode/in/point-0-2.geojson | 4 + .../examples/explode/in/point-xyz-0-8.geojson | 4 + test/examples/explode/in/polygon-0-1.geojson | 12 ++ .../in/polygon-with-properties.geojson | 23 ++++ .../explode/in/polygon-xyz-0-7.geojson | 12 ++ .../out/geometrycollection-0-0.geojson | 29 ++++ .../out/geometrycollection-xyz-0-6.geojson | 29 ++++ .../explode/out/multilinestring-0-5.geojson | 37 ++++++ .../out/multilinestring-xyz-0-11.geojson | 37 ++++++ .../explode/out/multipoint-0-3.geojson | 21 +++ .../explode/out/multipoint-xyz-0-9.geojson | 21 +++ .../explode/out/multipolygon-0-4.geojson | 125 ++++++++++++++++++ .../explode/out/multipolygon-xyz-0-10.geojson | 125 ++++++++++++++++++ test/examples/explode/out/one-1-0.geojson | 124 +++++++++++++++++ test/examples/explode/out/one-2-0.geojson | 70 ++++++++++ test/examples/explode/out/point-0-2.geojson | 13 ++ .../explode/out/point-xyz-0-8.geojson | 13 ++ test/examples/explode/out/polygon-0-1.geojson | 45 +++++++ .../out/polygon-with-properties.geojson | 55 ++++++++ .../explode/out/polygon-xyz-0-7.geojson | 45 +++++++ 36 files changed, 1171 insertions(+), 1 deletion(-) create mode 100644 benchmark/explode_benchmark.dart create mode 100644 lib/explode.dart create mode 100644 lib/src/explode.dart create mode 100644 test/components/explode_test.dart create mode 100644 test/examples/explode/in/geometrycollection-0-0.geojson create mode 100644 test/examples/explode/in/geometrycollection-xyz-0-6.geojson create mode 100644 test/examples/explode/in/multilinestring-0-5.geojson create mode 100644 test/examples/explode/in/multilinestring-xyz-0-11.geojson create mode 100644 test/examples/explode/in/multipoint-0-3.geojson create mode 100644 test/examples/explode/in/multipoint-xyz-0-9.geojson create mode 100644 test/examples/explode/in/multipolygon-0-4.geojson create mode 100644 test/examples/explode/in/multipolygon-xyz-0-10.geojson create mode 100644 test/examples/explode/in/one-1-0.geojson create mode 100644 test/examples/explode/in/one-2-0.geojson create mode 100644 test/examples/explode/in/point-0-2.geojson create mode 100644 test/examples/explode/in/point-xyz-0-8.geojson create mode 100644 test/examples/explode/in/polygon-0-1.geojson create mode 100644 test/examples/explode/in/polygon-with-properties.geojson create mode 100644 test/examples/explode/in/polygon-xyz-0-7.geojson create mode 100644 test/examples/explode/out/geometrycollection-0-0.geojson create mode 100644 test/examples/explode/out/geometrycollection-xyz-0-6.geojson create mode 100644 test/examples/explode/out/multilinestring-0-5.geojson create mode 100644 test/examples/explode/out/multilinestring-xyz-0-11.geojson create mode 100644 test/examples/explode/out/multipoint-0-3.geojson create mode 100644 test/examples/explode/out/multipoint-xyz-0-9.geojson create mode 100644 test/examples/explode/out/multipolygon-0-4.geojson create mode 100644 test/examples/explode/out/multipolygon-xyz-0-10.geojson create mode 100644 test/examples/explode/out/one-1-0.geojson create mode 100644 test/examples/explode/out/one-2-0.geojson create mode 100644 test/examples/explode/out/point-0-2.geojson create mode 100644 test/examples/explode/out/point-xyz-0-8.geojson create mode 100644 test/examples/explode/out/polygon-0-1.geojson create mode 100644 test/examples/explode/out/polygon-with-properties.geojson create mode 100644 test/examples/explode/out/polygon-xyz-0-7.geojson diff --git a/README.md b/README.md index 3e406250..b7161b18 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the ### Feature Conversion - [ ] combine -- [ ] explode +- [x] [explode](https://github.com/dartclub/turf_dart/blob/main/lib/src/explode.dart) - [ ] flatten - [ ] lineToPolygon - [ ] polygonize diff --git a/benchmark/explode_benchmark.dart b/benchmark/explode_benchmark.dart new file mode 100644 index 00000000..782e0ff6 --- /dev/null +++ b/benchmark/explode_benchmark.dart @@ -0,0 +1,21 @@ +import 'package:benchmark/benchmark.dart'; +import 'package:turf/src/explode.dart'; +import 'package:turf/turf.dart'; + +var poly = Polygon(coordinates: [ + [ + Position.of([0, 0]), + Position.of([0, 10]), + Position.of([10, 10]), + Position.of([10, 0]), + Position.of([0, 0]), + ], +]); + +main() { + group('explode', () { + benchmark('simple', () { + explode(poly); + }); + }); +} diff --git a/lib/explode.dart b/lib/explode.dart new file mode 100644 index 00000000..babaf584 --- /dev/null +++ b/lib/explode.dart @@ -0,0 +1,3 @@ +library explode; + +export 'src/explode.dart'; diff --git a/lib/src/explode.dart b/lib/src/explode.dart new file mode 100644 index 00000000..b2e0811f --- /dev/null +++ b/lib/src/explode.dart @@ -0,0 +1,50 @@ +import 'package:turf/helpers.dart'; +import 'package:turf/meta.dart'; + +/// Takes a feature or set of features and returns all positions as [Point]s. +/// Takes [GeoJSONObhect] input. +/// Returns [FeatureCollection] representing the exploded input features +/// Throws [Exception] if it encounters an unknown geometry type +/// ```dart +/// var polygon = Polygon(coordinates: +/// [[ +/// Position.of([-81, 41]), +/// Position.of([-88, 36]), +/// Position.of([-84, 31]), +/// Position.of([-80, 33]), +/// Position.of([-77, 39]), +/// Position.of([-81, 41]), +/// ]]); +/// +/// FeatureCollection explode = explode(polygon); +/// +/// //addToMap +/// var addToMap = [polygon, explode] + +FeatureCollection explode(GeoJSONObject geojson) { + var points = >[]; + if (geojson is FeatureCollection) { + featureEach(geojson, (feature, id) { + coordEach(feature, (Position? currentCoord, int? coordIndex, + int? featureIndex, int? multiFeatureIndex, int? geometryIndex) { + points.add( + Feature( + geometry: Point(coordinates: currentCoord!), + properties: Map.of(feature.properties ?? {}), + ), + ); + }); + }); + } else if (geojson is Feature) { + coordEach(geojson, (Position? currentCoord, int? coordIndex, + int? featureIndex, int? multiFeatureIndex, int? geometryIndex) { + points.add( + Feature( + geometry: Point(coordinates: currentCoord!), + properties: Map.of(geojson.properties ?? {}), + ), + ); + }); + } + return FeatureCollection(features: points); +} diff --git a/lib/src/helpers.dart b/lib/src/helpers.dart index f83f7212..0e15b96e 100644 --- a/lib/src/helpers.dart +++ b/lib/src/helpers.dart @@ -14,6 +14,7 @@ enum Unit { radians, degrees, } + enum Grid { point, square, diff --git a/test/components/explode_test.dart b/test/components/explode_test.dart new file mode 100644 index 00000000..a2752403 --- /dev/null +++ b/test/components/explode_test.dart @@ -0,0 +1,46 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/src/explode.dart'; +import 'package:turf/turf.dart'; + +main() { + group( + 'explode in == out', + () { + var inDir = Directory('./test/examples/explode/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 inExploded = explode(inGeom); + + 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 = + FeatureCollection.fromJson(jsonDecode(outSource)); + + for (var i = 0; i < inExploded.features.length; i++) { + var input = inExploded.features[i]; + var output = outGeom.features[i]; + expect(input.id, output.id); + expect(input.properties, equals(output.properties)); + expect(input.geometry, output.geometry); + } + }, + ); + } + } + }, + ); +} diff --git a/test/examples/explode/in/geometrycollection-0-0.geojson b/test/examples/explode/in/geometrycollection-0-0.geojson new file mode 100644 index 00000000..9b0d3a4d --- /dev/null +++ b/test/examples/explode/in/geometrycollection-0-0.geojson @@ -0,0 +1,16 @@ +{ + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "coordinates": [100, 0] + }, + { + "type": "LineString", + "coordinates": [ + [101, 0], + [102, 1] + ] + } + ] +} diff --git a/test/examples/explode/in/geometrycollection-xyz-0-6.geojson b/test/examples/explode/in/geometrycollection-xyz-0-6.geojson new file mode 100644 index 00000000..33802361 --- /dev/null +++ b/test/examples/explode/in/geometrycollection-xyz-0-6.geojson @@ -0,0 +1,16 @@ +{ + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "coordinates": [100, 0, 3] + }, + { + "type": "LineString", + "coordinates": [ + [101, 0, 5], + [102, 1, 8] + ] + } + ] +} diff --git a/test/examples/explode/in/multilinestring-0-5.geojson b/test/examples/explode/in/multilinestring-0-5.geojson new file mode 100644 index 00000000..bb09e175 --- /dev/null +++ b/test/examples/explode/in/multilinestring-0-5.geojson @@ -0,0 +1,13 @@ +{ + "type": "MultiLineString", + "coordinates": [ + [ + [100, 0], + [101, 1] + ], + [ + [102, 2], + [103, 3] + ] + ] +} diff --git a/test/examples/explode/in/multilinestring-xyz-0-11.geojson b/test/examples/explode/in/multilinestring-xyz-0-11.geojson new file mode 100644 index 00000000..54778fb7 --- /dev/null +++ b/test/examples/explode/in/multilinestring-xyz-0-11.geojson @@ -0,0 +1,13 @@ +{ + "type": "MultiLineString", + "coordinates": [ + [ + [100, 0, 5.2], + [101, 1, 8.1] + ], + [ + [102, 2, 2.3], + [103, 3, 7.4] + ] + ] +} diff --git a/test/examples/explode/in/multipoint-0-3.geojson b/test/examples/explode/in/multipoint-0-3.geojson new file mode 100644 index 00000000..965fec44 --- /dev/null +++ b/test/examples/explode/in/multipoint-0-3.geojson @@ -0,0 +1,7 @@ +{ + "type": "MultiPoint", + "coordinates": [ + [100, 0], + [101, 1] + ] +} diff --git a/test/examples/explode/in/multipoint-xyz-0-9.geojson b/test/examples/explode/in/multipoint-xyz-0-9.geojson new file mode 100644 index 00000000..35613706 --- /dev/null +++ b/test/examples/explode/in/multipoint-xyz-0-9.geojson @@ -0,0 +1,7 @@ +{ + "type": "MultiPoint", + "coordinates": [ + [100, 0, 1], + [101, 1, 2] + ] +} diff --git a/test/examples/explode/in/multipolygon-0-4.geojson b/test/examples/explode/in/multipolygon-0-4.geojson new file mode 100644 index 00000000..ced6b8ef --- /dev/null +++ b/test/examples/explode/in/multipolygon-0-4.geojson @@ -0,0 +1,30 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ] + ], + [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ], + [ + [100.2, 0.2], + [100.8, 0.2], + [100.8, 0.8], + [100.2, 0.8], + [100.2, 0.2] + ] + ] + ] +} diff --git a/test/examples/explode/in/multipolygon-xyz-0-10.geojson b/test/examples/explode/in/multipolygon-xyz-0-10.geojson new file mode 100644 index 00000000..f6c58aae --- /dev/null +++ b/test/examples/explode/in/multipolygon-xyz-0-10.geojson @@ -0,0 +1,30 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [102, 2, 1], + [103, 2, 1], + [103, 3, 1], + [102, 3, 1], + [102, 2, 1] + ] + ], + [ + [ + [100, 0, 2], + [101, 0, 2], + [101, 1, 2], + [100, 1, 2], + [100, 0, 2] + ], + [ + [100.2, 0.2, 3], + [100.8, 0.2, 3], + [100.8, 0.8, 3], + [100.2, 0.8, 3], + [100.2, 0.2, 3] + ] + ] + ] +} diff --git a/test/examples/explode/in/one-1-0.geojson b/test/examples/explode/in/one-1-0.geojson new file mode 100644 index 00000000..8eb92046 --- /dev/null +++ b/test/examples/explode/in/one-1-0.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [102, 0.5] + }, + "properties": { + "prop0": "value0" + } + }, + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [102, 0], + [103, 1], + [104, 0], + [105, 1] + ] + }, + "properties": { + "prop0": "value0", + "prop1": 0 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + } + } + ] + } \ No newline at end of file diff --git a/test/examples/explode/in/one-2-0.geojson b/test/examples/explode/in/one-2-0.geojson new file mode 100644 index 00000000..46b6609c --- /dev/null +++ b/test/examples/explode/in/one-2-0.geojson @@ -0,0 +1,21 @@ +{ + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + } +} diff --git a/test/examples/explode/in/point-0-2.geojson b/test/examples/explode/in/point-0-2.geojson new file mode 100644 index 00000000..e84975ac --- /dev/null +++ b/test/examples/explode/in/point-0-2.geojson @@ -0,0 +1,4 @@ +{ + "type": "Point", + "coordinates": [100, 0] +} diff --git a/test/examples/explode/in/point-xyz-0-8.geojson b/test/examples/explode/in/point-xyz-0-8.geojson new file mode 100644 index 00000000..114f479e --- /dev/null +++ b/test/examples/explode/in/point-xyz-0-8.geojson @@ -0,0 +1,4 @@ +{ + "type": "Point", + "coordinates": [100, 0, 1] +} diff --git a/test/examples/explode/in/polygon-0-1.geojson b/test/examples/explode/in/polygon-0-1.geojson new file mode 100644 index 00000000..f90b2416 --- /dev/null +++ b/test/examples/explode/in/polygon-0-1.geojson @@ -0,0 +1,12 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ] + ] +} diff --git a/test/examples/explode/in/polygon-with-properties.geojson b/test/examples/explode/in/polygon-with-properties.geojson new file mode 100644 index 00000000..fd910b37 --- /dev/null +++ b/test/examples/explode/in/polygon-with-properties.geojson @@ -0,0 +1,23 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "foo": "bar" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-88.24218749999999, 37.996162679728116], + [-88.24218749999999, 53.330872983017066], + [-64.3359375, 53.330872983017066], + [-64.3359375, 37.996162679728116], + [-88.24218749999999, 37.996162679728116] + ] + ] + } + } + ] +} diff --git a/test/examples/explode/in/polygon-xyz-0-7.geojson b/test/examples/explode/in/polygon-xyz-0-7.geojson new file mode 100644 index 00000000..0a368dbd --- /dev/null +++ b/test/examples/explode/in/polygon-xyz-0-7.geojson @@ -0,0 +1,12 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [100, 0, 1], + [101, 0], + [101, 1, 1], + [100, 1, 1], + [100, 0, 1] + ] + ] +} diff --git a/test/examples/explode/out/geometrycollection-0-0.geojson b/test/examples/explode/out/geometrycollection-0-0.geojson new file mode 100644 index 00000000..95fb8f3a --- /dev/null +++ b/test/examples/explode/out/geometrycollection-0-0.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 1] + } + } + ] +} diff --git a/test/examples/explode/out/geometrycollection-xyz-0-6.geojson b/test/examples/explode/out/geometrycollection-xyz-0-6.geojson new file mode 100644 index 00000000..25ead20a --- /dev/null +++ b/test/examples/explode/out/geometrycollection-xyz-0-6.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 0, 5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 1, 8] + } + } + ] +} diff --git a/test/examples/explode/out/multilinestring-0-5.geojson b/test/examples/explode/out/multilinestring-0-5.geojson new file mode 100644 index 00000000..9afd5472 --- /dev/null +++ b/test/examples/explode/out/multilinestring-0-5.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [103, 3] + } + } + ] +} diff --git a/test/examples/explode/out/multilinestring-xyz-0-11.geojson b/test/examples/explode/out/multilinestring-xyz-0-11.geojson new file mode 100644 index 00000000..848b674f --- /dev/null +++ b/test/examples/explode/out/multilinestring-xyz-0-11.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0, 5.2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 1, 8.1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 2, 2.3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [103, 3, 7.4] + } + } + ] +} diff --git a/test/examples/explode/out/multipoint-0-3.geojson b/test/examples/explode/out/multipoint-0-3.geojson new file mode 100644 index 00000000..a51ad036 --- /dev/null +++ b/test/examples/explode/out/multipoint-0-3.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 1] + } + } + ] +} diff --git a/test/examples/explode/out/multipoint-xyz-0-9.geojson b/test/examples/explode/out/multipoint-xyz-0-9.geojson new file mode 100644 index 00000000..5430cccb --- /dev/null +++ b/test/examples/explode/out/multipoint-xyz-0-9.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 1, 2] + } + } + ] +} diff --git a/test/examples/explode/out/multipolygon-0-4.geojson b/test/examples/explode/out/multipolygon-0-4.geojson new file mode 100644 index 00000000..eb000078 --- /dev/null +++ b/test/examples/explode/out/multipolygon-0-4.geojson @@ -0,0 +1,125 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [103, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [103, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.2, 0.2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.8, 0.2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.8, 0.8] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.2, 0.8] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.2, 0.2] + } + } + ] +} diff --git a/test/examples/explode/out/multipolygon-xyz-0-10.geojson b/test/examples/explode/out/multipolygon-xyz-0-10.geojson new file mode 100644 index 00000000..09ee470e --- /dev/null +++ b/test/examples/explode/out/multipolygon-xyz-0-10.geojson @@ -0,0 +1,125 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 2, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [103, 2, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [103, 3, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 3, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [102, 2, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 0, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 1, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 1, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.2, 0.2, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.8, 0.2, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.8, 0.8, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.2, 0.8, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100.2, 0.2, 3] + } + } + ] +} diff --git a/test/examples/explode/out/one-1-0.geojson b/test/examples/explode/out/one-1-0.geojson new file mode 100644 index 00000000..03e49113 --- /dev/null +++ b/test/examples/explode/out/one-1-0.geojson @@ -0,0 +1,124 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "prop0": "value0" + }, + "geometry": { + "type": "Point", + "coordinates": [102, 0.5] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": 0 + }, + "geometry": { + "type": "Point", + "coordinates": [102, 0] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": 0 + }, + "geometry": { + "type": "Point", + "coordinates": [103, 1] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": 0 + }, + "geometry": { + "type": "Point", + "coordinates": [104, 0] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": 0 + }, + "geometry": { + "type": "Point", + "coordinates": [105, 1] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [101, 0] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [101, 1] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [100, 1] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + } + ] + } \ No newline at end of file diff --git a/test/examples/explode/out/one-2-0.geojson b/test/examples/explode/out/one-2-0.geojson new file mode 100644 index 00000000..cb44d2d1 --- /dev/null +++ b/test/examples/explode/out/one-2-0.geojson @@ -0,0 +1,70 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [101, 0] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [101, 1] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [100, 1] + } + }, + { + "type": "Feature", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + } + ] +} diff --git a/test/examples/explode/out/point-0-2.geojson b/test/examples/explode/out/point-0-2.geojson new file mode 100644 index 00000000..e02ae61b --- /dev/null +++ b/test/examples/explode/out/point-0-2.geojson @@ -0,0 +1,13 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + } + ] +} diff --git a/test/examples/explode/out/point-xyz-0-8.geojson b/test/examples/explode/out/point-xyz-0-8.geojson new file mode 100644 index 00000000..368d5e7c --- /dev/null +++ b/test/examples/explode/out/point-xyz-0-8.geojson @@ -0,0 +1,13 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0, 1] + } + } + ] +} diff --git a/test/examples/explode/out/polygon-0-1.geojson b/test/examples/explode/out/polygon-0-1.geojson new file mode 100644 index 00000000..d9636337 --- /dev/null +++ b/test/examples/explode/out/polygon-0-1.geojson @@ -0,0 +1,45 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0] + } + } + ] +} diff --git a/test/examples/explode/out/polygon-with-properties.geojson b/test/examples/explode/out/polygon-with-properties.geojson new file mode 100644 index 00000000..7591a53f --- /dev/null +++ b/test/examples/explode/out/polygon-with-properties.geojson @@ -0,0 +1,55 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "foo": "bar" + }, + "geometry": { + "type": "Point", + "coordinates": [-88.24218749999999, 37.996162679728116] + } + }, + { + "type": "Feature", + "properties": { + "foo": "bar" + }, + "geometry": { + "type": "Point", + "coordinates": [-88.24218749999999, 53.330872983017066] + } + }, + { + "type": "Feature", + "properties": { + "foo": "bar" + }, + "geometry": { + "type": "Point", + "coordinates": [-64.3359375, 53.330872983017066] + } + }, + { + "type": "Feature", + "properties": { + "foo": "bar" + }, + "geometry": { + "type": "Point", + "coordinates": [-64.3359375, 37.996162679728116] + } + }, + { + "type": "Feature", + "properties": { + "foo": "bar" + }, + "geometry": { + "type": "Point", + "coordinates": [-88.24218749999999, 37.996162679728116] + } + } + ] +} diff --git a/test/examples/explode/out/polygon-xyz-0-7.geojson b/test/examples/explode/out/polygon-xyz-0-7.geojson new file mode 100644 index 00000000..ac01076d --- /dev/null +++ b/test/examples/explode/out/polygon-xyz-0-7.geojson @@ -0,0 +1,45 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [101, 1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [100, 0, 1] + } + } + ] +} From 25c99d28659ad2735b9e4a8607b62adac0ddbd92 Mon Sep 17 00:00:00 2001 From: arman Date: Sun, 19 Jun 2022 20:50:51 +0200 Subject: [PATCH 40/72] Merge bbox-polygon and bbox, center, polyline decode (#99) * Added coordEach translation * Added bBox translation * Added center translation * Added decode points from polyline * Update read me * Remove and exclude .idea from git indexing * Convert double to Position * Use existing coord each implementation * Return bBox points in the correct order * Add bbox unit test * Change libraries namespaces * Code refactor * Add doc blocs and some more missing functions * Add encode polyline feature * Add tests for both encode and decode polylines * Add bbox tests * Add helper functions * Convert array to Bbox * Remove redundant helper functions * Add documentation * implementation * tests init, documentation, addition of types and debug * implemented, docs * test initiation * added it to /lib, updated readme, can close 97 * renamed the test file * comments resolved * typo * unused lib removed * merge bbox-polygon * missing center_test.dart * imported bbox_polygon to center_test * test error fixes Co-authored-by: Dennis Mwea Co-authored-by: Lukas Himsel --- .gitignore | 4 +- README.md | 5 +- lib/bbox.dart | 3 + lib/bbox_polygon.dart | 3 + lib/center.dart | 3 + lib/polyline.dart | 3 + lib/src/bbox.dart | 39 +++++ lib/src/bbox_polygon.dart | 42 +++++ lib/src/center.dart | 21 +++ lib/src/geojson.dart | 22 +++ lib/src/polyline.dart | 100 ++++++++++++ lib/turf.dart | 5 +- test/components/bbox_polygon_test.dart | 58 +++++++ test/components/bbox_test.dart | 102 ++++++++++++ test/components/center_test.dart | 83 ++++++++++ test/components/explode_test.dart | 1 - test/components/polyline.dart | 116 ++++++++++++++ .../center/in/feature-collection.geojson | 37 +++++ .../center/in/imbalanced-polygon.geojson | 31 ++++ test/examples/center/in/linestring.geojson | 11 ++ test/examples/center/in/point.geojson | 8 + .../center/in/points-with-weights.geojson | 48 ++++++ .../center/in/polygon-without-weights.geojson | 37 +++++ test/examples/center/in/polygon.geojson | 19 +++ .../center/out/feature-collection.geojson | 144 +++++++++++++++++ .../center/out/imbalanced-polygon.geojson | 143 +++++++++++++++++ test/examples/center/out/linestring.geojson | 123 +++++++++++++++ test/examples/center/out/point.geojson | 120 ++++++++++++++ .../center/out/points-with-weights.geojson | 147 ++++++++++++++++++ .../out/polygon-without-weights.geojson | 144 +++++++++++++++++ test/examples/center/out/polygon.geojson | 131 ++++++++++++++++ 31 files changed, 1748 insertions(+), 5 deletions(-) create mode 100644 lib/bbox.dart create mode 100644 lib/bbox_polygon.dart create mode 100644 lib/center.dart create mode 100644 lib/polyline.dart create mode 100644 lib/src/bbox.dart create mode 100644 lib/src/bbox_polygon.dart create mode 100644 lib/src/center.dart create mode 100644 lib/src/polyline.dart create mode 100644 test/components/bbox_polygon_test.dart create mode 100644 test/components/bbox_test.dart create mode 100644 test/components/center_test.dart create mode 100644 test/components/polyline.dart create mode 100644 test/examples/center/in/feature-collection.geojson create mode 100644 test/examples/center/in/imbalanced-polygon.geojson create mode 100644 test/examples/center/in/linestring.geojson create mode 100644 test/examples/center/in/point.geojson create mode 100644 test/examples/center/in/points-with-weights.geojson create mode 100644 test/examples/center/in/polygon-without-weights.geojson create mode 100644 test/examples/center/in/polygon.geojson create mode 100644 test/examples/center/out/feature-collection.geojson create mode 100644 test/examples/center/out/imbalanced-polygon.geojson create mode 100644 test/examples/center/out/linestring.geojson create mode 100644 test/examples/center/out/point.geojson create mode 100644 test/examples/center/out/points-with-weights.geojson create mode 100644 test/examples/center/out/polygon-without-weights.geojson create mode 100644 test/examples/center/out/polygon.geojson diff --git a/.gitignore b/.gitignore index 81cc7efd..c519fe49 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ build/ # Directory created by dartdoc doc/api/ -coverage/ \ No newline at end of file +coverage/ + +.idea/ \ No newline at end of file diff --git a/README.md b/README.md index b7161b18..256190f0 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,9 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] along - [ ] area - [ ] bbox -- [ ] bboxPolygon +- [x] [bboxPolygon] (https://github.com/dartclub/turf_dart/blob/main/lib/bbox_polygon.dart) - [x] [bearing](https://github.com/dartclub/turf_dart/blob/main/lib/bearing.dart) -- [ ] center +- [ ] [center](https://github.com/Dennis-Mwea/turf_dart/blob/main/lib/src/center.dart) - [ ] centerOfMass - [ ] centroid - [x] [destination](https://github.com/dartclub/turf_dart/blob/main/lib/destination.dart) @@ -122,6 +122,7 @@ 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) ### Feature Conversion - [ ] combine diff --git a/lib/bbox.dart b/lib/bbox.dart new file mode 100644 index 00000000..22703d24 --- /dev/null +++ b/lib/bbox.dart @@ -0,0 +1,3 @@ +library turf_bbox; + +export "src/bbox.dart"; diff --git a/lib/bbox_polygon.dart b/lib/bbox_polygon.dart new file mode 100644 index 00000000..3c5c8462 --- /dev/null +++ b/lib/bbox_polygon.dart @@ -0,0 +1,3 @@ +library turf_bbox_polygon.dart; + +export 'src/bbox_polygon.dart'; diff --git a/lib/center.dart b/lib/center.dart new file mode 100644 index 00000000..898d82d7 --- /dev/null +++ b/lib/center.dart @@ -0,0 +1,3 @@ +library turf_center; + +export 'src/center.dart'; diff --git a/lib/polyline.dart b/lib/polyline.dart new file mode 100644 index 00000000..8ef7e96f --- /dev/null +++ b/lib/polyline.dart @@ -0,0 +1,3 @@ +library turf_polyline; + +export 'src/polyline.dart'; diff --git a/lib/src/bbox.dart b/lib/src/bbox.dart new file mode 100644 index 00000000..a7d37ab5 --- /dev/null +++ b/lib/src/bbox.dart @@ -0,0 +1,39 @@ +import 'package:turf/helpers.dart'; +import 'package:turf/meta.dart'; + +/// Calculates the bounding box for any [geoJson] object, including [FeatureCollection]. +/// If [recompute] is not set and the [bbox] is not null, the function uses the [bbox] of the given [GeoJSONObject]. +BBox bbox(GeoJSONObject geoJson, {bool recompute = false}) { + if (geoJson.bbox != null && !recompute) { + return geoJson.bbox!; + } + + var result = BBox.named( + lat1: double.infinity, + lng1: double.infinity, + lat2: double.negativeInfinity, + lng2: double.negativeInfinity, + ); + + coordEach( + geoJson, + (Position? currentCoord, _, __, ___, ____) { + if (currentCoord != null) { + if (result.lng1 > currentCoord.lng) { + result = result.copyWith(lng1: currentCoord.lng); + } + if (result.lat1 > currentCoord.lat) { + result = result.copyWith(lat1: currentCoord.lat); + } + if (result.lng2 < currentCoord.lng) { + result = result.copyWith(lng2: currentCoord.lng); + } + if (result.lat2 < currentCoord.lat) { + result = result.copyWith(lat2: currentCoord.lat); + } + } + }, + ); + + return result; +} diff --git a/lib/src/bbox_polygon.dart b/lib/src/bbox_polygon.dart new file mode 100644 index 00000000..70c72d7e --- /dev/null +++ b/lib/src/bbox_polygon.dart @@ -0,0 +1,42 @@ +import 'package:turf/helpers.dart'; + +/// Takes a [Bbox] and returns an equivalent [Feature]. +/// ```dart +/// var bbox = Bbox(0, 0, 10, 10); +/// var poly = bboxPolygon(bbox); +/// //addToMap +/// var addToMap = [poly] +/// ``` +Feature bboxPolygon(BBox bbox, + {Map properties = const {}, dynamic id}) { + var west = bbox[0]!; + var south = bbox[1]!; + var east = bbox[2]!; + var north = bbox[3]!; + + if (bbox.length == 6) { + throw Exception("turf/bbox-polygon does not support BBox with 6 positions"); + } + + var lowLeft = [west, south]; + var topLeft = [west, north]; + var topRight = [east, north]; + var lowRight = [east, south]; + + return Feature( + bbox: bbox.clone(), + properties: properties, + id: id, + geometry: Polygon( + coordinates: [ + [ + Position.of(lowLeft), + Position.of(lowRight), + Position.of(topRight), + Position.of(topLeft), + Position.of(lowLeft) + ] + ], + ), + ); +} diff --git a/lib/src/center.dart b/lib/src/center.dart new file mode 100644 index 00000000..4eb4cdfb --- /dev/null +++ b/lib/src/center.dart @@ -0,0 +1,21 @@ +import 'package:turf/bbox.dart' as t; +import 'package:turf/helpers.dart'; + +/// Takes a [Feature] or a [FeatureCollection] and returns the absolute center point of all feature(s). +Feature center( + GeoJSONObject geoJSON, { + dynamic id, + BBox? bbox, + Map? properties, +}) { + final BBox ext = t.bbox(geoJSON); + final num x = (ext[0]! + ext[2]!) / 2; + final num y = (ext[1]! + ext[3]!) / 2; + + return Feature( + id: id, + bbox: bbox, + properties: properties, + geometry: Point(coordinates: Position.named(lat: y, lng: x)), + ); +} diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index 6e811578..caf02ccd 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; + part 'geojson.g.dart'; @JsonEnum(alwaysCreate: true) @@ -180,6 +181,7 @@ abstract class CoordinateType implements Iterable { CoordinateType toSigned(); bool get isSigned; + _untilSigned(val, limit) { if (val > limit) { return _untilSigned(val - 360, limit); @@ -245,7 +247,9 @@ class Position extends CoordinateType { Position operator *(Position p) => crossProduct(p); num get lng => _items[0]; + num get lat => _items[1]; + num? get alt => length == 3 ? _items[2] : null; @override @@ -317,12 +321,30 @@ class BBox extends CoordinateType { bool get _is3D => length == 6; num get lng1 => _items[0]; + num get lat1 => _items[1]; + num? get alt1 => _is3D ? _items[2] : null; + num get lng2 => _items[_is3D ? 3 : 2]; + num get lat2 => _items[_is3D ? 4 : 3]; + num? get alt2 => _is3D ? _items[5] : null; + BBox copyWith({ + num? lng1, + num? lat1, + num? lng2, + num? lat2, + }) => + BBox( + lng1 ?? this.lng1, + lat1 ?? this.lat1, + lng2 ?? this.lng2, + lat2 ?? this.lat2, + ); + @override BBox clone() => BBox.of(_items); diff --git a/lib/src/polyline.dart b/lib/src/polyline.dart new file mode 100644 index 00000000..861c9add --- /dev/null +++ b/lib/src/polyline.dart @@ -0,0 +1,100 @@ +import 'dart:math' as math; + +import 'package:turf/helpers.dart'; + +/// Based off of [the offical Google document](https://developers.google.com/maps/documentation/utilities/polylinealgorithm) +/// Some parts from [this implementation](http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEncoder.js) +/// by [Mark McClure](http://facstaff.unca.edu/mcmcclur/) +class Polyline { + static String _encode(num current, num previous, num factor) { + current = _py2Round(current * factor); + previous = _py2Round(previous * factor); + var coordinate = (current - previous).toInt(); + coordinate <<= 1; + if (current - previous < 0) { + coordinate = ~coordinate; + } + var output = ''; + while (coordinate >= 0x20) { + output += String.fromCharCode((0x20 | (coordinate & 0x1f)) + 63); + coordinate >>= 5; + } + output += String.fromCharCode(coordinate + 63); + + return output; + } + + static int _py2Round(num value) { + // Google's polyline algorithm uses the same rounding strategy as Python 2, which is different from JS for negative values + return (value.abs() + 0.5).floor() * (value >= 0 ? 1 : -1); + } + + /// Decodes a Polyline to a [List]. + /// This is adapted from the implementation in Project-OSRM. + /// See https://github.com/Project-OSRM/osrm-frontend/blob/master/WebContent/routing/OSRM.RoutingGeometry.js + static List decode(String polyline, {int precision = 5}) { + var index = 0, + lat = 0, + lng = 0, + shift = 0, + result = 0, + factor = math.pow(10, precision); + int? byte; + late int latitudeChange; + late int longitudeChange; + List coordinates = []; + + // Coordinates have variable length when encoded, so just keep + // track of whether we've hit the end of the string. In each + // loop iteration, a single coordinate is decoded. + while (index < polyline.length) { + byte = null; + shift = 0; + result = 0; + + do { + byte = polyline.codeUnitAt(index++) - 63; + result |= (byte & 0x1f) << shift; + shift += 5; + } while (byte >= 0x20); + latitudeChange = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + shift = result = 0; + + do { + byte = polyline.codeUnitAt(index++) - 63; + result |= (byte & 0x1f) << shift; + shift += 5; + } while (byte >= 0x20); + longitudeChange = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + + lat += latitudeChange; + lng += longitudeChange; + + coordinates.add( + Position.named( + lng: (lng / factor).toDouble(), lat: (lat / factor).toDouble()), + ); + } + + return coordinates; + } + + /// Encodes the given [List] to a polyline, a [String]. + static String encode(List coordinates, {int? precision}) { + if (coordinates.isEmpty) { + return ''; + } + + var factor = math.pow(10, precision ?? 5), + output = _encode(coordinates[0].lat, 0, factor) + + _encode(coordinates[0].lng, 0, factor); + + for (var i = 1; i < coordinates.length; i++) { + var a = coordinates[i], b = coordinates[i - 1]; + output += _encode(a.lat, b.lat, factor); + output += _encode(a.lng, b.lng, factor); + } + + return output; + } +} diff --git a/lib/turf.dart b/lib/turf.dart index 9500298d..bccc157a 100644 --- a/lib/turf.dart +++ b/lib/turf.dart @@ -1,10 +1,13 @@ library turf; +export 'src/bbox.dart'; export 'src/bearing.dart'; +export 'src/center.dart'; export 'src/destination.dart'; export 'src/distance.dart'; export 'src/geojson.dart'; -export 'src/midpoint.dart'; export 'src/helpers.dart'; +export 'src/midpoint.dart'; export 'src/nearest_point.dart'; +export 'src/polyline.dart'; export 'src/nearest_point_on_line.dart'; diff --git a/test/components/bbox_polygon_test.dart b/test/components/bbox_polygon_test.dart new file mode 100644 index 00000000..199341d6 --- /dev/null +++ b/test/components/bbox_polygon_test.dart @@ -0,0 +1,58 @@ +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/bbox_polygon.dart'; + +main() { + test( + "bbox-polygon", + () { + var poly = bboxPolygon(BBox(0, 0, 10, 10)); + expect(poly.geometry is Polygon, true); + }, + ); + + test( + "bbox-polygon -- valid geojson", + () { + var poly = bboxPolygon(BBox(0, 0, 10, 10)); + var coordinates = poly.geometry!.coordinates; + + expect(coordinates[0].length == 5, true); + expect(coordinates[0][0][0] == coordinates[0][coordinates.length - 1][0], + true); + expect(coordinates[0][0][1] == coordinates[0][coordinates.length - 1][1], + true); + }, + ); + + test( + "bbox-polygon -- Error handling", + () { + expect(() => bboxPolygon(BBox(-110, 70, 5000, 50, 60, 3000)), + throwsA(isA())); + }, + ); + + test( + "bbox-polygon -- Translate BBox (Issue #1179)", + () { + var id = 123; + var properties = {"foo": "bar"}; + var bbox = BBox(0, 0, 10, 10); + var poly = bboxPolygon(bbox, properties: properties, id: id); + + expect(poly.properties, equals(properties)); + expect(poly.bbox, equals(bbox)); + expect(poly.id, equals(id)); + }, + ); + + test( + "bbox-polygon -- assert bbox", + () { + var bbox = BBox(0, 0, 10, 10); + var poly = bboxPolygon(bbox); + expect(poly.bbox, equals(bbox)); + }, + ); +} diff --git a/test/components/bbox_test.dart b/test/components/bbox_test.dart new file mode 100644 index 00000000..75740b74 --- /dev/null +++ b/test/components/bbox_test.dart @@ -0,0 +1,102 @@ +import 'package:test/test.dart'; +import 'package:turf/bbox.dart'; +import 'package:turf/helpers.dart'; + +main() { + final pt = Feature( + geometry: Point(coordinates: Position.named(lat: 102.0, lng: 0.5))); + final line = Feature( + geometry: LineString(coordinates: [ + Position.named(lat: 102.0, lng: -10.0), + Position.named(lat: 103.0, lng: 1.0), + Position.named(lat: 104.0, lng: 0.0), + Position.named(lat: 130.0, lng: 4.0), + ])); + final poly = Feature( + geometry: Polygon(coordinates: [ + [ + Position.named(lat: 101.0, lng: 0.0), + Position.named(lat: 101.0, lng: 1.0), + Position.named(lat: 100.0, lng: 1.0), + Position.named(lat: 100.0, lng: 0.0), + Position.named(lat: 101.0, lng: 0.0), + ], + ])); + final multiLine = Feature( + geometry: MultiLineString(coordinates: [ + [ + Position.named(lat: 100.0, lng: 0.0), + Position.named(lat: 101.0, lng: 1.0), + ], + [ + Position.named(lat: 102.0, lng: 2.0), + Position.named(lat: 103.0, lng: 3.0), + ], + ])); + final multiPoly = Feature( + geometry: MultiPolygon(coordinates: [ + [ + [ + Position.named(lat: 102.0, lng: 2.0), + Position.named(lat: 103.0, lng: 2.0), + Position.named(lat: 103.0, lng: 3.0), + Position.named(lat: 102.0, lng: 3.0), + Position.named(lat: 102.0, lng: 2.0), + ], + ], + [ + [ + Position.named(lat: 100.0, lng: 0.0), + Position.named(lat: 101.0, lng: 0.0), + Position.named(lat: 101.0, lng: 1.0), + Position.named(lat: 100.0, lng: 1.0), + Position.named(lat: 100.0, lng: 0.0), + ], + [ + Position.named(lat: 100.2, lng: 0.2), + Position.named(lat: 100.8, lng: 0.2), + Position.named(lat: 100.8, lng: 0.8), + Position.named(lat: 100.2, lng: 0.8), + Position.named(lat: 100.2, lng: 0.2), + ], + ], + ])); + final fc = + FeatureCollection(features: [pt, line, poly, multiLine, multiPoly]); + + test("bbox", () { + // FeatureCollection + final fcBBox = bbox(fc); + expect(fcBBox, equals([-10, 100, 4, 130]), reason: "featureCollection"); + + // Point + final ptBBox = bbox(pt); + expect(ptBBox, equals([0.5, 102, 0.5, 102]), reason: "point"); + + // // Line + final lineBBox = bbox(line); + expect(lineBBox, equals([-10, 102, 4, 130]), reason: "lineString"); + + // // Polygon + final polyExtent = bbox(poly); + expect(polyExtent, equals([0, 100, 1, 101]), reason: "polygon"); + + // // MultiLineString + final multiLineBBox = bbox(multiLine); + expect(multiLineBBox, equals([0, 100, 3, 103]), reason: "multiLineString"); + + // // MultiPolygon + final multiPolyBBox = bbox(multiPoly); + expect(multiPolyBBox, equals([0, 100, 3, 103]), reason: "multiPolygon"); + + final pt2 = Feature( + geometry: Point(coordinates: Position.named(lat: 102.0, lng: 0.5)), + bbox: bbox(Feature( + geometry: Point(coordinates: Position.named(lat: 0, lng: 0)))), + ); + expect(bbox(pt2), equals([0, 0, 0, 0]), + reason: "uses built-in bbox by default"); + expect(bbox(pt2, recompute: true), [0.5, 102, 0.5, 102], + reason: "recomputes bbox with recompute option"); + }); +} diff --git a/test/components/center_test.dart b/test/components/center_test.dart new file mode 100644 index 00000000..2ad5fac5 --- /dev/null +++ b/test/components/center_test.dart @@ -0,0 +1,83 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/meta.dart'; +import 'package:turf/src/bbox_polygon.dart'; +import 'package:turf/turf.dart'; + +main() { + group( + 'center in == out', + () { + var inDir = Directory('./test/examples/center/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)); + Map properties = { + "marker-symbol": "star", + "marker-color": "#F00" + }; + Feature inCenter = center(inGeom, properties: properties); + FeatureCollection featureCollection = + FeatureCollection(features: [])..features.add(inCenter); + featureEach(inGeom, (feature, index) { + featureCollection.features.add(feature); + }); + var extent = bboxPolygon(bbox(inGeom)); + extent.properties = { + "stroke": "#00F", + "stroke-width": 1, + "fill-opacity": 0, + }; + coordEach( + extent, + ( + currentCoord, + coordIndex, + featureIndex, + multiFeatureIndex, + geometryIndex, + ) => + featureCollection.features.add( + Feature( + geometry: LineString(coordinates: [ + currentCoord!, + inCenter.geometry!.coordinates + ]), + properties: { + 'stroke': "#00F", + "stroke-width": 1, + }, + ), + ), + ); + featureCollection.features.add(extent); + + 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 = FeatureCollection.fromJson(jsonDecode(outSource)); + for (var i = 0; i < featureCollection.features.length; i++) { + var input = featureCollection.features[i]; + var output = outGeom.features[i]; + expect(input.id, output.id); + expect(input.properties, equals(output.properties)); + expect(input.geometry!.type, output.geometry!.type); + } + }, + ); + } + } + }, + ); +} diff --git a/test/components/explode_test.dart b/test/components/explode_test.dart index a2752403..a068ad4b 100644 --- a/test/components/explode_test.dart +++ b/test/components/explode_test.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:developer'; import 'dart:io'; import 'package:test/test.dart'; diff --git a/test/components/polyline.dart b/test/components/polyline.dart new file mode 100644 index 00000000..6f9b030e --- /dev/null +++ b/test/components/polyline.dart @@ -0,0 +1,116 @@ +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/polyline.dart'; + +main() { + group('Polyline:', () { + var example = [ + Position.named(lat: 38.5, lng: -120.2), + Position.named(lat: 40.7, lng: -120.95), + Position.named(lat: 43.252, lng: -126.453), + ], + exampleWithZ = [ + Position.named(lat: 38.5, lng: -120.2, alt: 0), + Position.named(lat: 40.7, lng: -120.95, alt: 0), + Position.named(lat: 43.252, lng: -126.453, alt: 0) + ], + exampleZero = [ + Position.named(lat: 39, lng: -120), + Position.named(lat: 41, lng: -121), + Position.named(lat: 43, lng: -126), + ], + exampleSlashes = [ + Position.named(lat: 35.6, lng: -82.55), + Position.named(lat: 35.59985, lng: -82.55015), + Position.named(lat: 35.6, lng: -82.55) + ], + exampleRounding = [ + Position.named(lat: 0, lng: 0.000006), + Position.named(lat: 0, lng: 0.000002) + ], + exampleRoundingNegative = [ + Position.named(lat: 36.05322, lng: -112.084004), + Position.named(lat: 36.053573, lng: -112.083914), + Position.named(lat: 36.053845, lng: -112.083965) + ]; + + group('#decode():', () { + test('decodes an empty Array', () { + expect(Polyline.decode(''), equals([])); + }); + test('decodes a String into an Array of lat/lon pairs', () { + expect(Polyline.decode('_p~iF~ps|U_ulLnnqC_mqNvxq`@'), equals(example)); + }); + test('decodes with a custom precision', () { + expect( + Polyline.decode('_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI', precision: 6), + equals(example)); + }); + test('decodes with precision 0', () { + expect(Polyline.decode('mAnFC@CH', precision: 0), equals(exampleZero)); + }); + }); + + group('#identity', () { + test( + 'feed encode into decode and check if the result is the same as the input', + () { + expect( + Polyline.decode(Polyline.encode(exampleSlashes)), exampleSlashes); + }); + + test( + 'feed decode into encode and check if the result is the same as the input', + () { + expect(Polyline.encode(Polyline.decode('_chxEn`zvN\\\\]]')), + equals('_chxEn`zvN\\\\]]')); + // t.end(); + }); + }); + + group('#encode()', () { + test('encodes an empty Array', () { + expect(Polyline.encode([]), equals('')); + }); + + test('encodes an Array of lat/lon pairs into a String', () { + expect(Polyline.encode(example), equals('_p~iF~ps|U_ulLnnqC_mqNvxq`@')); + }); + + test('encodes an Array of lat/lon/z into the same string as lat/lon', () { + expect(Polyline.encode(exampleWithZ), + equals('_p~iF~ps|U_ulLnnqC_mqNvxq`@')); + }); + + test('encodes with proper rounding', () { + expect(Polyline.encode(exampleRounding), equals('?A?@')); + }); + + test('encodes with proper negative rounding', () { + expect(Polyline.encode(exampleRoundingNegative), + equals('ss`{E~kbkTeAQw@J')); + }); + + test('encodes with a custom precision', () { + expect(Polyline.encode(example, precision: 6), + equals('_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI')); + }); + + test('encodes with precision 0', () { + expect(Polyline.encode(example, precision: 0), equals('mAnFC@CH')); + }); + + test('encodes negative values correctly', () { + expect( + Polyline.decode( + Polyline.encode( + [Position.named(lat: -107.3741825, lng: 0)], + precision: 7), + precision: 7)[0] + .lat < + 0, + isTrue); + }); + }); + }); +} diff --git a/test/examples/center/in/feature-collection.geojson b/test/examples/center/in/feature-collection.geojson new file mode 100644 index 00000000..79fa4a7b --- /dev/null +++ b/test/examples/center/in/feature-collection.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.833351373672485, 45.760809294695534] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.8331475257873535, 45.760296567821456] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.833984374999999, 45.76073818687033] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.834005832672119, 45.76022171678877] + } + } + ] +} diff --git a/test/examples/center/in/imbalanced-polygon.geojson b/test/examples/center/in/imbalanced-polygon.geojson new file mode 100644 index 00000000..27ddbfd8 --- /dev/null +++ b/test/examples/center/in/imbalanced-polygon.geojson @@ -0,0 +1,31 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.854240417480469, 45.77258200374433], + [4.8445844650268555, 45.777431068484894], + [4.845442771911621, 45.778658234059755], + [4.845914840698242, 45.779376562352425], + [4.846644401550292, 45.78021460033108], + [4.847245216369629, 45.78078326178593], + [4.848060607910156, 45.78138184652523], + [4.8487043380737305, 45.78186070968964], + [4.849562644958495, 45.78248921135124], + [4.850893020629883, 45.78302792142197], + [4.852008819580077, 45.78374619341895], + [4.852995872497559, 45.784075398324866], + [4.853854179382324, 45.78443452873236], + [4.8549699783325195, 45.78470387501975], + [4.85569953918457, 45.784793656826345], + [4.857330322265624, 45.784853511283764], + [4.858231544494629, 45.78494329284938], + [4.859304428100585, 45.784883438488365], + [4.858360290527344, 45.77294120818474], + [4.854240417480469, 45.77258200374433] + ] + ] + } +} diff --git a/test/examples/center/in/linestring.geojson b/test/examples/center/in/linestring.geojson new file mode 100644 index 00000000..6b885f50 --- /dev/null +++ b/test/examples/center/in/linestring.geojson @@ -0,0 +1,11 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.86020565032959, 45.76884015325622], + [4.85994815826416, 45.749558161214516] + ] + } +} diff --git a/test/examples/center/in/point.geojson b/test/examples/center/in/point.geojson new file mode 100644 index 00000000..e49e07dc --- /dev/null +++ b/test/examples/center/in/point.geojson @@ -0,0 +1,8 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.831961989402771, 45.75764678012361] + } +} diff --git a/test/examples/center/in/points-with-weights.geojson b/test/examples/center/in/points-with-weights.geojson new file mode 100644 index 00000000..df330d8c --- /dev/null +++ b/test/examples/center/in/points-with-weights.geojson @@ -0,0 +1,48 @@ +{ + "type": "FeatureCollection", + "options": { + "weight": "weight" + }, + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [0, 0] + }, + "properties": { + "weight": 10 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [0, 5] + }, + "properties": { + "weight": 1 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [5, 5] + }, + "properties": { + "weight": 2 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [5, 0] + }, + "properties": { + "weight": 3 + } + } + ] +} diff --git a/test/examples/center/in/polygon-without-weights.geojson b/test/examples/center/in/polygon-without-weights.geojson new file mode 100644 index 00000000..9802b043 --- /dev/null +++ b/test/examples/center/in/polygon-without-weights.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [122.51953124999999, -22.024545601240337], + [126.91406249999999, -22.024545601240337], + [126.91406249999999, -18.312810846425442], + [122.51953124999999, -18.312810846425442], + [122.51953124999999, -22.024545601240337] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [140.888671875, -36.10237644873643], + [145.283203125, -36.10237644873643], + [145.283203125, -32.76880048488168], + [140.888671875, -32.76880048488168], + [140.888671875, -36.10237644873643] + ] + ] + } + } + ] +} diff --git a/test/examples/center/in/polygon.geojson b/test/examples/center/in/polygon.geojson new file mode 100644 index 00000000..5ef4bca6 --- /dev/null +++ b/test/examples/center/in/polygon.geojson @@ -0,0 +1,19 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.8250579833984375, 45.79398056386735], + [4.882392883300781, 45.79254427435898], + [4.910373687744141, 45.76081677972451], + [4.894924163818359, 45.7271539426975], + [4.824199676513671, 45.71337148333104], + [4.773387908935547, 45.74021417890731], + [4.778022766113281, 45.778418789239055], + [4.8250579833984375, 45.79398056386735] + ] + ] + } +} diff --git a/test/examples/center/out/feature-collection.geojson b/test/examples/center/out/feature-collection.geojson new file mode 100644 index 00000000..aef084c0 --- /dev/null +++ b/test/examples/center/out/feature-collection.geojson @@ -0,0 +1,144 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "star", + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [4.833576679229736, 45.76051550574215] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.833351373672485, 45.760809294695534] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.8331475257873535, 45.760296567821456] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.833984374999999, 45.76073818687033] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.834005832672119, 45.76022171678877] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.8331475257873535, 45.76022171678877], + [4.833576679229736, 45.76051550574215] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.834005832672119, 45.76022171678877], + [4.833576679229736, 45.76051550574215] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.834005832672119, 45.760809294695534], + [4.833576679229736, 45.76051550574215] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.8331475257873535, 45.760809294695534], + [4.833576679229736, 45.76051550574215] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.8331475257873535, 45.76022171678877], + [4.833576679229736, 45.76051550574215] + ] + } + }, + { + "type": "Feature", + "bbox": [ + 4.8331475257873535, + 45.76022171678877, + 4.834005832672119, + 45.760809294695534 + ], + "properties": { + "stroke": "#00F", + "stroke-width": 1, + "fill-opacity": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.8331475257873535, 45.76022171678877], + [4.834005832672119, 45.76022171678877], + [4.834005832672119, 45.760809294695534], + [4.8331475257873535, 45.760809294695534], + [4.8331475257873535, 45.76022171678877] + ] + ] + } + } + ] +} diff --git a/test/examples/center/out/imbalanced-polygon.geojson b/test/examples/center/out/imbalanced-polygon.geojson new file mode 100644 index 00000000..44367492 --- /dev/null +++ b/test/examples/center/out/imbalanced-polygon.geojson @@ -0,0 +1,143 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "star", + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [4.851944446563721, 45.778762648296855] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.854240417480469, 45.77258200374433], + [4.8445844650268555, 45.777431068484894], + [4.845442771911621, 45.778658234059755], + [4.845914840698242, 45.779376562352425], + [4.846644401550292, 45.78021460033108], + [4.847245216369629, 45.78078326178593], + [4.848060607910156, 45.78138184652523], + [4.8487043380737305, 45.78186070968964], + [4.849562644958495, 45.78248921135124], + [4.850893020629883, 45.78302792142197], + [4.852008819580077, 45.78374619341895], + [4.852995872497559, 45.784075398324866], + [4.853854179382324, 45.78443452873236], + [4.8549699783325195, 45.78470387501975], + [4.85569953918457, 45.784793656826345], + [4.857330322265624, 45.784853511283764], + [4.858231544494629, 45.78494329284938], + [4.859304428100585, 45.784883438488365], + [4.858360290527344, 45.77294120818474], + [4.854240417480469, 45.77258200374433] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.8445844650268555, 45.77258200374433], + [4.851944446563721, 45.778762648296855] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.859304428100585, 45.77258200374433], + [4.851944446563721, 45.778762648296855] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.859304428100585, 45.78494329284938], + [4.851944446563721, 45.778762648296855] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.8445844650268555, 45.78494329284938], + [4.851944446563721, 45.778762648296855] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.8445844650268555, 45.77258200374433], + [4.851944446563721, 45.778762648296855] + ] + } + }, + { + "type": "Feature", + "bbox": [ + 4.8445844650268555, + 45.77258200374433, + 4.859304428100585, + 45.78494329284938 + ], + "properties": { + "stroke": "#00F", + "stroke-width": 1, + "fill-opacity": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.8445844650268555, 45.77258200374433], + [4.859304428100585, 45.77258200374433], + [4.859304428100585, 45.78494329284938], + [4.8445844650268555, 45.78494329284938], + [4.8445844650268555, 45.77258200374433] + ] + ] + } + } + ] +} diff --git a/test/examples/center/out/linestring.geojson b/test/examples/center/out/linestring.geojson new file mode 100644 index 00000000..3f345e00 --- /dev/null +++ b/test/examples/center/out/linestring.geojson @@ -0,0 +1,123 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "star", + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [4.860076904296875, 45.75919915723537] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.86020565032959, 45.76884015325622], + [4.85994815826416, 45.749558161214516] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.85994815826416, 45.749558161214516], + [4.860076904296875, 45.75919915723537] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.86020565032959, 45.749558161214516], + [4.860076904296875, 45.75919915723537] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.86020565032959, 45.76884015325622], + [4.860076904296875, 45.75919915723537] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.85994815826416, 45.76884015325622], + [4.860076904296875, 45.75919915723537] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.85994815826416, 45.749558161214516], + [4.860076904296875, 45.75919915723537] + ] + } + }, + { + "type": "Feature", + "bbox": [ + 4.85994815826416, + 45.749558161214516, + 4.86020565032959, + 45.76884015325622 + ], + "properties": { + "stroke": "#00F", + "stroke-width": 1, + "fill-opacity": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.85994815826416, 45.749558161214516], + [4.86020565032959, 45.749558161214516], + [4.86020565032959, 45.76884015325622], + [4.85994815826416, 45.76884015325622], + [4.85994815826416, 45.749558161214516] + ] + ] + } + } + ] +} diff --git a/test/examples/center/out/point.geojson b/test/examples/center/out/point.geojson new file mode 100644 index 00000000..6d080951 --- /dev/null +++ b/test/examples/center/out/point.geojson @@ -0,0 +1,120 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "star", + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [4.831961989402771, 45.75764678012361] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.831961989402771, 45.75764678012361] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361] + ] + } + }, + { + "type": "Feature", + "bbox": [ + 4.831961989402771, + 45.75764678012361, + 4.831961989402771, + 45.75764678012361 + ], + "properties": { + "stroke": "#00F", + "stroke-width": 1, + "fill-opacity": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361], + [4.831961989402771, 45.75764678012361] + ] + ] + } + } + ] +} diff --git a/test/examples/center/out/points-with-weights.geojson b/test/examples/center/out/points-with-weights.geojson new file mode 100644 index 00000000..ec912ff1 --- /dev/null +++ b/test/examples/center/out/points-with-weights.geojson @@ -0,0 +1,147 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "star", + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [2.5, 2.5] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [0, 0] + }, + "properties": { + "weight": 10 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [0, 5] + }, + "properties": { + "weight": 1 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [5, 5] + }, + "properties": { + "weight": 2 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [5, 0] + }, + "properties": { + "weight": 3 + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [2.5, 2.5] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [5, 0], + [2.5, 2.5] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [5, 5], + [2.5, 2.5] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 5], + [2.5, 2.5] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [2.5, 2.5] + ] + } + }, + { + "type": "Feature", + "bbox": [0, 0, 5, 5], + "properties": { + "stroke": "#00F", + "stroke-width": 1, + "fill-opacity": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0, 0], + [5, 0], + [5, 5], + [0, 5], + [0, 0] + ] + ] + } + } + ] +} diff --git a/test/examples/center/out/polygon-without-weights.geojson b/test/examples/center/out/polygon-without-weights.geojson new file mode 100644 index 00000000..013b04d0 --- /dev/null +++ b/test/examples/center/out/polygon-without-weights.geojson @@ -0,0 +1,144 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "star", + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [133.9013671875, -27.207593647580936] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [122.51953124999999, -22.024545601240337], + [126.91406249999999, -22.024545601240337], + [126.91406249999999, -18.312810846425442], + [122.51953124999999, -18.312810846425442], + [122.51953124999999, -22.024545601240337] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [140.888671875, -36.10237644873643], + [145.283203125, -36.10237644873643], + [145.283203125, -32.76880048488168], + [140.888671875, -32.76880048488168], + [140.888671875, -36.10237644873643] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [122.51953124999999, -36.10237644873643], + [133.9013671875, -27.207593647580936] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [145.283203125, -36.10237644873643], + [133.9013671875, -27.207593647580936] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [145.283203125, -18.312810846425442], + [133.9013671875, -27.207593647580936] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [122.51953124999999, -18.312810846425442], + [133.9013671875, -27.207593647580936] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [122.51953124999999, -36.10237644873643], + [133.9013671875, -27.207593647580936] + ] + } + }, + { + "type": "Feature", + "bbox": [ + 122.51953124999999, + -36.10237644873643, + 145.283203125, + -18.312810846425442 + ], + "properties": { + "stroke": "#00F", + "stroke-width": 1, + "fill-opacity": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [122.51953124999999, -36.10237644873643], + [145.283203125, -36.10237644873643], + [145.283203125, -18.312810846425442], + [122.51953124999999, -18.312810846425442], + [122.51953124999999, -36.10237644873643] + ] + ] + } + } + ] +} diff --git a/test/examples/center/out/polygon.geojson b/test/examples/center/out/polygon.geojson new file mode 100644 index 00000000..6409a8c6 --- /dev/null +++ b/test/examples/center/out/polygon.geojson @@ -0,0 +1,131 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "star", + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [4.841880798339844, 45.7536760235992] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.8250579833984375, 45.79398056386735], + [4.882392883300781, 45.79254427435898], + [4.910373687744141, 45.76081677972451], + [4.894924163818359, 45.7271539426975], + [4.824199676513671, 45.71337148333104], + [4.773387908935547, 45.74021417890731], + [4.778022766113281, 45.778418789239055], + [4.8250579833984375, 45.79398056386735] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.773387908935547, 45.71337148333104], + [4.841880798339844, 45.7536760235992] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.910373687744141, 45.71337148333104], + [4.841880798339844, 45.7536760235992] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.910373687744141, 45.79398056386735], + [4.841880798339844, 45.7536760235992] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.773387908935547, 45.79398056386735], + [4.841880798339844, 45.7536760235992] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.773387908935547, 45.71337148333104], + [4.841880798339844, 45.7536760235992] + ] + } + }, + { + "type": "Feature", + "bbox": [ + 4.773387908935547, + 45.71337148333104, + 4.910373687744141, + 45.79398056386735 + ], + "properties": { + "stroke": "#00F", + "stroke-width": 1, + "fill-opacity": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.773387908935547, 45.71337148333104], + [4.910373687744141, 45.71337148333104], + [4.910373687744141, 45.79398056386735], + [4.773387908935547, 45.79398056386735], + [4.773387908935547, 45.71337148333104] + ] + ] + } + } + ] +} From 1e8329739cab41417a51b58f079d00d002982d06 Mon Sep 17 00:00:00 2001 From: arman Date: Mon, 20 Jun 2022 09:04:39 +0200 Subject: [PATCH 41/72] Added missing alt1, alt2 in BBox constructor, BBox put in README (#100) * Added coordEach translation * Added bBox translation * Added center translation * Added decode points from polyline * Update read me * Remove and exclude .idea from git indexing * Convert double to Position * Use existing coord each implementation * Return bBox points in the correct order * Add bbox unit test * Change libraries namespaces * Code refactor * Add doc blocs and some more missing functions * Add encode polyline feature * Add tests for both encode and decode polylines * Add bbox tests * Add helper functions * Convert array to Bbox * Remove redundant helper functions * Add documentation * implementation * tests init, documentation, addition of types and debug * implemented, docs * test initiation * added it to /lib, updated readme, can close 97 * renamed the test file * comments resolved * typo * unused lib removed * merge bbox-polygon * missing center_test.dart * imported bbox_polygon to center_test * test error fixes * added alt 1,2 to Bbox * added bbox to readme * Fix typos * bbox constructure changed to standard * bbox optional positional param. set accordingly * Documentation on limitation of optional prms. Bbox * Update geojson.dart * fix order of BBox default constructor in test * update doc comment * fix previously missed null exceptions Co-authored-by: Dennis Mwea Co-authored-by: Lukas Himsel --- README.md | 6 +++--- lib/src/geojson.dart | 29 +++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 256190f0..86badeeb 100644 --- a/README.md +++ b/README.md @@ -75,10 +75,10 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the ### Measurement - [ ] along - [ ] area -- [ ] bbox -- [x] [bboxPolygon] (https://github.com/dartclub/turf_dart/blob/main/lib/bbox_polygon.dart) +- [x] [bbox](https://github.com/dartclub/turf_dart/blob/main/lib/bbox.dart) +- [x] [bboxPolygon](https://github.com/dartclub/turf_dart/blob/main/lib/bbox_polygon.dart) - [x] [bearing](https://github.com/dartclub/turf_dart/blob/main/lib/bearing.dart) -- [ ] [center](https://github.com/Dennis-Mwea/turf_dart/blob/main/lib/src/center.dart) +- [x] [center](https://github.com/Dennis-Mwea/turf_dart/blob/main/lib/src/center.dart) - [ ] centerOfMass - [ ] centroid - [x] [destination](https://github.com/dartclub/turf_dart/blob/main/lib/destination.dart) diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index caf02ccd..75f2e3b6 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -278,13 +278,26 @@ class Position extends CoordinateType { /// Please make sure, you arrange your parameters like this: /// Longitude 1, Latitude 1, Altitude 1 (optional), Longitude 2, Latitude 2, Altitude 2 (optional) /// You can either specify 4 or 6 parameters +/// If you are using the default constructor with two dimensional positions (lng + lat only), please use the constructor like this: +/// `BBox(lng1, lat1, lng2, lat2);` class BBox extends CoordinateType { BBox( + /// longitude 1 num lng1, + + /// latitude 1 num lat1, + + /// longitude 2 for 2 dim. positions; altitude 1 for 3 dim. positions num alt1, + + /// latitude 2 for 2 dim. positions; longitude 2 for 3 dim. positions num lng2, [ + + /// latitude 2 for 3 dim. positions num? lat2, + + /// altitude 2 for 3 dim. positions num? alt2, ]) : super([ lng1, @@ -335,14 +348,18 @@ class BBox extends CoordinateType { BBox copyWith({ num? lng1, num? lat1, - num? lng2, + num? alt1, num? lat2, + num? lng2, + num? alt2, }) => - BBox( - lng1 ?? this.lng1, - lat1 ?? this.lat1, - lng2 ?? this.lng2, - lat2 ?? this.lat2, + BBox.named( + lng1: lng1 ?? this.lng1, + lat1: lat1 ?? this.lat1, + alt1: alt1 ?? this.alt1, + lng2: lng2 ?? this.lng2, + lat2: lat2 ?? this.lat2, + alt2: alt2 ?? this.alt2, ); @override From ea56d8963cca8cddd7d44127c4aebae6d0f3376d Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Mon, 4 Jul 2022 08:14:50 +0200 Subject: [PATCH 42/72] Implement rhumbBearing function and test (#109) * initial commit, stolen from @armantorkzaban * fix formatting * cleanup comments --- README.md | 2 +- lib/bearing.dart | 1 + lib/src/rhumb_bearing.dart | 64 +++++++++++++++++ test/components/rhumb_bearing_test.dart | 46 ++++++++++++ test/examples/rhumb_bearing/in/pair1.geojson | 31 ++++++++ test/examples/rhumb_bearing/out/pair1.geojson | 71 +++++++++++++++++++ test/examples/rhumb_bearing/out/pair1.json | 4 ++ 7 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 lib/src/rhumb_bearing.dart create mode 100644 test/components/rhumb_bearing_test.dart create mode 100644 test/examples/rhumb_bearing/in/pair1.geojson create mode 100644 test/examples/rhumb_bearing/out/pair1.geojson create mode 100644 test/examples/rhumb_bearing/out/pair1.json diff --git a/README.md b/README.md index 86badeeb..d2546b1d 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] pointOnFeature - [ ] polygonTangents - [ ] pointToLineDistance -- [ ] rhumbBearing +- [x] [rhumbBearing](https://github.com/dartclub/turf_dart/blob/main/lib/src/rhumb_bearing.dart) - [ ] rhumbDestination - [ ] rhumbDistance - [ ] square diff --git a/lib/bearing.dart b/lib/bearing.dart index 9b3eeee4..64c1d498 100644 --- a/lib/bearing.dart +++ b/lib/bearing.dart @@ -1,3 +1,4 @@ library turf_bearing; export 'src/bearing.dart'; +export 'src/rhumb_bearing.dart'; diff --git a/lib/src/rhumb_bearing.dart b/lib/src/rhumb_bearing.dart new file mode 100644 index 00000000..b3fc67d3 --- /dev/null +++ b/lib/src/rhumb_bearing.dart @@ -0,0 +1,64 @@ +// https://en.wikipedia.org/wiki/Rhumb_line +import 'package:turf/src/invariant.dart'; +import 'dart:math' as math; +import '../helpers.dart'; + +/// Takes two [Point] and finds the bearing angle between them along a Rhumb line +/// i.e. the angle measured in degrees start the north line (0 degrees) +/// [kFinal] calculates the final bearing if true. +/// Returns bearing from north in decimal degrees, between -180 and 180 degrees (positive clockwise) +/// example: +/// ```dart +/// var point1 = Feature(geometry: Point(coordinates: Position.of([-75.343, 39.984])), properties: {"marker-color": "#F00"}); +/// var point2 = Feature(geometry: Point(coordinates: Position.of([-75.534, 39.123])), properties: {"marker-color": "#00F"}); +/// var bearing = rhumbBearing(point1.geometry, point2.geometry); +/// //addToMap +/// var addToMap = [point1, point2]; +/// point1.properties['bearing'] = bearing; +/// point2.properties['bearing'] = bearing; +/// ``` +num rhumbBearing(Point start, Point end, {bool kFinal = false}) { + num bear360; + if (kFinal) { + bear360 = calculateRhumbBearing(getCoord(end), getCoord(start)); + } else { + bear360 = calculateRhumbBearing(getCoord(start), getCoord(end)); + } + + var bear180 = bear360 > 180 ? -(360 - bear360) : bear360; + + return bear180; +} + +/// Returns the bearing from ‘this’ [Point] to destination [Point] along a rhumb line. +/// Adapted from Geodesy: https://github.com/chrisveness/geodesy/blob/master/latlon-spherical.js +/// Returns Bearing in degrees from north. +/// example +/// ```dart +/// var p1 = Position.named(lng: 51.127, lat: 1.338); +/// var p2 = Position.named(lng: 50.964, lat: 1.853); +/// var d = p1.rhumbBearingTo(p2); // 116.7 m +/// ``` +num calculateRhumbBearing(Position from, Position to) { + // φ => phi + // Δλ => deltaLambda + // Δψ => deltaPsi + // θ => theta + num phi1 = degreesToRadians(from.lat); + num phi2 = degreesToRadians(to.lat); + num deltaLambda = degreesToRadians(to.lng - from.lng); + // if deltaLambda over 180° take shorter rhumb line across the anti-meridian: + if (deltaLambda > math.pi) { + deltaLambda -= 2 * math.pi; + } + if (deltaLambda < -math.pi) { + deltaLambda += 2 * math.pi; + } + + double deltaPsi = math + .log(math.tan(phi2 / 2 + math.pi / 4) / math.tan(phi1 / 2 + math.pi / 4)); + + double theta = math.atan2(deltaLambda, deltaPsi); + + return (radiansToDegrees(theta) + 360) % 360; +} diff --git a/test/components/rhumb_bearing_test.dart b/test/components/rhumb_bearing_test.dart new file mode 100644 index 00000000..61893e10 --- /dev/null +++ b/test/components/rhumb_bearing_test.dart @@ -0,0 +1,46 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/rhumb_bearing.dart'; + +main() { + group( + '', + () { + Directory inDir = Directory('./test/examples/rhumb_bearing/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 start = (inGeom as FeatureCollection).features[0]; + var end = inGeom.features[1]; + var initialBearing = + rhumbBearing(start.geometry as Point, end.geometry as Point); + var finalBearing = rhumbBearing( + start.geometry as Point, end.geometry as Point, + kFinal: true); + var result = { + 'initialBearing': initialBearing, + 'finalBearing': finalBearing, + }; + + Directory outDir = Directory('./test/examples/rhumb_bearing/out'); + for (var file in outDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.json')) { + var outSource = jsonDecode(file.readAsStringSync()); + expect(result, outSource); + } + } + }, + ); + } + } + }, + ); +} diff --git a/test/examples/rhumb_bearing/in/pair1.geojson b/test/examples/rhumb_bearing/in/pair1.geojson new file mode 100644 index 00000000..b48344e8 --- /dev/null +++ b/test/examples/rhumb_bearing/in/pair1.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -75, + 45 + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-color": "#00F" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 20, + 60 + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/rhumb_bearing/out/pair1.geojson b/test/examples/rhumb_bearing/out/pair1.geojson new file mode 100644 index 00000000..b5ab5e26 --- /dev/null +++ b/test/examples/rhumb_bearing/out/pair1.geojson @@ -0,0 +1,71 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -75, + 45 + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-color": "#00F" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 20, + 60 + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -75, + 45 + ], + [ + -66.10068737769872, + 51.79325008492101 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 20, + 60 + ], + [ + 2.3844816279733956, + 63.440396381483744 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/rhumb_bearing/out/pair1.json b/test/examples/rhumb_bearing/out/pair1.json new file mode 100644 index 00000000..171e525a --- /dev/null +++ b/test/examples/rhumb_bearing/out/pair1.json @@ -0,0 +1,4 @@ +{ + "initialBearing": 75.28061364784332, + "finalBearing": -104.7193863521567 +} \ No newline at end of file From b17d3fdfc3fdc1b52b1a9635a517536c1d110dba Mon Sep 17 00:00:00 2001 From: arman Date: Mon, 4 Jul 2022 13:47:47 +0200 Subject: [PATCH 43/72] Ports lineToPolygon, polygonToLine, and their tests (#104) * line_to_polygon ported * test init of lineToPolygon * debugging the test on line to polygon * line_to_polygon_test done * polygonToLine init * check for features' tyope in FeatureCollections * file name change * test and impl. done for polygonToLine * refactor autocomplete, lineStringToPolygon * comments resolved * type added * implementation and test and type setting Co-authored-by: Lukas Himsel --- lib/line_to_polygon.dart | 3 + lib/polygon_to_line.dart | 3 + lib/src/line_to_polygon.dart | 186 ++++++++++++++++++ lib/src/polygon_to_line.dart | 65 ++++++ test/components/line_to_polygon_test.dart | 127 ++++++++++++ test/components/polygon_to_line_test.dart | 72 +++++++ .../in/collection_linestring.geojson | 39 ++++ .../in/geometry_linestring.geojson | 10 + .../lineToPolygon/in/linestring.geojson | 17 ++ .../in/linestring_incomplete.geojson | 20 ++ .../in/linestrings_to_multipolygons.geojson | 113 +++++++++++ .../in/multi_linestring_incomplete.geojson | 29 +++ .../in/multi_linestring_nested.geojson | 49 +++++ .../in/multi_linestring_nested2.geojson | 71 +++++++ ...estring_outer_ring_middle_position.geojson | 34 ++++ .../in/multi_linestring_with_hole.geojson | 26 +++ .../in/multi_linestrings_nested.geojson | 71 +++++++ .../multi_linestrings_outer_doughnut.geojson | 57 ++++++ .../in/multi_linestrings_with_holes.geojson | 74 +++++++ .../out/collection_linestring.geojson | 30 +++ .../out/geometry_linestring.geojson | 19 ++ .../lineToPolygon/out/linestring.geojson | 19 ++ .../out/linestring_incomplete.geojson | 23 +++ .../out/linestrings_to_multipolygons.geojson | 80 ++++++++ .../out/multi_linestring_incomplete.geojson | 31 +++ .../out/multi_linestring_nested.geojson | 49 +++++ .../out/multi_linestring_nested2.geojson | 58 ++++++ ...estring_outer_ring_middle_position.geojson | 37 ++++ .../out/multi_linestring_with_hole.geojson | 26 +++ .../out/multi_linestrings_nested.geojson | 58 ++++++ .../multi_linestrings_outer_doughnut.geojson | 44 +++++ .../out/multi_linestrings_with_holes.geojson | 53 +++++ .../polygonToLine/in/geometry_polygon.geojson | 12 ++ .../polygonToLine/in/multi_polygon.geojson | 30 +++ .../in/multi_polygon_outer_doughnut.geojson | 44 +++++ .../in/multi_polygon_with_holes.geojson | 53 +++++ .../examples/polygonToLine/in/polygon.geojson | 19 ++ .../in/polygon_with_hole.geojson | 26 +++ .../out/geometry_polygon.geojson | 14 ++ .../polygonToLine/out/multi_polygon.geojson | 39 ++++ .../out/multi_polygon_outer_doughnut.geojson | 57 ++++++ .../out/multi_polygon_with_holes.geojson | 74 +++++++ .../polygonToLine/out/polygon.geojson | 17 ++ .../out/polygon_with_hole.geojson | 26 +++ 44 files changed, 2004 insertions(+) create mode 100644 lib/line_to_polygon.dart create mode 100644 lib/polygon_to_line.dart create mode 100644 lib/src/line_to_polygon.dart create mode 100644 lib/src/polygon_to_line.dart create mode 100644 test/components/line_to_polygon_test.dart create mode 100644 test/components/polygon_to_line_test.dart create mode 100644 test/examples/lineToPolygon/in/collection_linestring.geojson create mode 100644 test/examples/lineToPolygon/in/geometry_linestring.geojson create mode 100644 test/examples/lineToPolygon/in/linestring.geojson create mode 100644 test/examples/lineToPolygon/in/linestring_incomplete.geojson create mode 100644 test/examples/lineToPolygon/in/linestrings_to_multipolygons.geojson create mode 100644 test/examples/lineToPolygon/in/multi_linestring_incomplete.geojson create mode 100644 test/examples/lineToPolygon/in/multi_linestring_nested.geojson create mode 100644 test/examples/lineToPolygon/in/multi_linestring_nested2.geojson create mode 100644 test/examples/lineToPolygon/in/multi_linestring_outer_ring_middle_position.geojson create mode 100644 test/examples/lineToPolygon/in/multi_linestring_with_hole.geojson create mode 100644 test/examples/lineToPolygon/in/multi_linestrings_nested.geojson create mode 100644 test/examples/lineToPolygon/in/multi_linestrings_outer_doughnut.geojson create mode 100644 test/examples/lineToPolygon/in/multi_linestrings_with_holes.geojson create mode 100644 test/examples/lineToPolygon/out/collection_linestring.geojson create mode 100644 test/examples/lineToPolygon/out/geometry_linestring.geojson create mode 100644 test/examples/lineToPolygon/out/linestring.geojson create mode 100644 test/examples/lineToPolygon/out/linestring_incomplete.geojson create mode 100644 test/examples/lineToPolygon/out/linestrings_to_multipolygons.geojson create mode 100644 test/examples/lineToPolygon/out/multi_linestring_incomplete.geojson create mode 100644 test/examples/lineToPolygon/out/multi_linestring_nested.geojson create mode 100644 test/examples/lineToPolygon/out/multi_linestring_nested2.geojson create mode 100644 test/examples/lineToPolygon/out/multi_linestring_outer_ring_middle_position.geojson create mode 100644 test/examples/lineToPolygon/out/multi_linestring_with_hole.geojson create mode 100644 test/examples/lineToPolygon/out/multi_linestrings_nested.geojson create mode 100644 test/examples/lineToPolygon/out/multi_linestrings_outer_doughnut.geojson create mode 100644 test/examples/lineToPolygon/out/multi_linestrings_with_holes.geojson create mode 100644 test/examples/polygonToLine/in/geometry_polygon.geojson create mode 100644 test/examples/polygonToLine/in/multi_polygon.geojson create mode 100644 test/examples/polygonToLine/in/multi_polygon_outer_doughnut.geojson create mode 100644 test/examples/polygonToLine/in/multi_polygon_with_holes.geojson create mode 100644 test/examples/polygonToLine/in/polygon.geojson create mode 100644 test/examples/polygonToLine/in/polygon_with_hole.geojson create mode 100644 test/examples/polygonToLine/out/geometry_polygon.geojson create mode 100644 test/examples/polygonToLine/out/multi_polygon.geojson create mode 100644 test/examples/polygonToLine/out/multi_polygon_outer_doughnut.geojson create mode 100644 test/examples/polygonToLine/out/multi_polygon_with_holes.geojson create mode 100644 test/examples/polygonToLine/out/polygon.geojson create mode 100644 test/examples/polygonToLine/out/polygon_with_hole.geojson diff --git a/lib/line_to_polygon.dart b/lib/line_to_polygon.dart new file mode 100644 index 00000000..1dfc8be7 --- /dev/null +++ b/lib/line_to_polygon.dart @@ -0,0 +1,3 @@ +library turf_line_to_polygon.dart; + +export 'src/line_to_polygon.dart'; diff --git a/lib/polygon_to_line.dart b/lib/polygon_to_line.dart new file mode 100644 index 00000000..0b38e83f --- /dev/null +++ b/lib/polygon_to_line.dart @@ -0,0 +1,3 @@ +library turf_polygon_to_line; + +export 'src/polygon_to_line.dart'; diff --git a/lib/src/line_to_polygon.dart b/lib/src/line_to_polygon.dart new file mode 100644 index 00000000..6870ba5d --- /dev/null +++ b/lib/src/line_to_polygon.dart @@ -0,0 +1,186 @@ +import 'package:turf/bbox.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/meta.dart'; +import 'package:turf/src/invariant.dart'; + +/// Converts [LineString]s & [MultiLineString](s) to [Polygon] or [MultiPolygon]. +/// Takes an optional bool autoComplete=true that auto complete [Linestring]s (matches first & last coordinates) +/// Takes an optional orderCoords=true that sorts [Linestring]s to place outer ring at the first position of the coordinates +/// Takes an optional mutate=false that mutates the original [Linestring] using autoComplete (matches first & last coordinates) +/// Returns [Feature] or [Feature] converted to Polygons. +/// example: +/// ```dart +/// var line = LineString(coordinates: [ +/// Position.of([125, -30]), +/// Position.of([145, -30]), +/// Position.of([145, -20]), +/// Position.of([125, -20]), +/// Position.of([125, -30])]); +/// var polygon = lineToPolygon(line); +/// //addToMap +/// var addToMap = [polygon]; +/// ``` +Feature lineToPolygon( + GeoJSONObject lines, { + Map? properties, + bool autoComplete = true, + bool orderCoords = true, + bool mutate = false, +}) { + Exception exc = Exception( + """allowed types are Feature, LineString, + MultiLineString, FeatureCollection"""); + if (lines is FeatureCollection) { + featureEach( + lines, + (currentFeature, index) { + if (currentFeature.geometry is! LineString && + currentFeature.geometry is! MultiLineString) { + throw exc; + } + }, + ); + List> list = []; + geomEach( + lines, + ( + GeometryType? currentGeometry, + int? featureIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, + ) { + if (currentGeometry is LineString) { + list.add(currentGeometry.coordinates.map((e) => e.clone()).toList()); + } else if (currentGeometry is MultiLineString) { + list = [ + ...list, + ...currentGeometry.coordinates + .map((e) => e.map((p) => p.clone()).toList()) + .toList() + ]; + } else { + throw Exception("$currentGeometry type is not supperted"); + } + }, + ); + + lines = FeatureCollection(features: []) + ..features.add(Feature(geometry: MultiLineString(coordinates: list))); + } else if (lines is Feature) { + if (lines.geometry is LineString) { + lines = Feature( + geometry: lines.geometry as LineString, + properties: lines.properties, + id: lines.id, + ); + } else if (lines.geometry is MultiLineString) { + lines = Feature( + geometry: lines.geometry as MultiLineString, + properties: lines.properties, + id: lines.id, + ); + } else { + throw exc; + } + } else if (lines is LineString) { + lines = Feature(geometry: lines); + } else if (lines is MultiLineString) { + lines = Feature(geometry: lines); + } else { + throw exc; + } + if (!mutate) { + lines = lines.clone(); + } + + if (lines is FeatureCollection) { + List>> coords = []; + featureEach( + lines, + ((line, featureIndex) => coords.add(getCoords(lineStringToPolygon( + line, autoComplete, orderCoords, properties: {})) + as List>)), + ); + return Feature( + geometry: MultiPolygon(coordinates: coords), properties: properties); + } else { + return lineStringToPolygon(lines, autoComplete, orderCoords, + properties: properties); + } +} + +/// Converts LineString to Polygon +/// Takes a optional bool autoComplete=true that auto completes linestrings +/// Takes an optional orderCoords=true that sorts linestrings to place outer +/// ring at the first position of the coordinates. +Feature lineStringToPolygon( + GeoJSONObject line, + bool autoComplete, + bool orderCoords, { + Map? properties, +}) { + properties = properties ?? (line is Feature ? line.properties ?? {} : {}); + + if (line is Feature && line.geometry != null) { + return lineStringToPolygon(line.geometry!, autoComplete, orderCoords); + } + + if (line is GeometryType && line.coordinates.isEmpty) { + throw Exception("line must contain coordinates"); + } + + if (line is LineString) { + var coords = + autoComplete ? _autoCompleteCoords(line.coordinates) : line.coordinates; + + return Feature( + geometry: Polygon(coordinates: [coords]), properties: properties); + } else if (line is MultiLineString) { + List> multiCoords = []; + num largestArea = 0; + + line.coordinates.forEach( + (coord) { + 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); + } + } else { + multiCoords.add(coord); + } + }, + ); + return Feature( + geometry: Polygon(coordinates: multiCoords), properties: properties); + } else { + throw Exception("Geometry type ${line.type} is not supported"); + } +} + +/// Auto Completes Coords - matches first & last coordinates +List _autoCompleteCoords(List coords) { + var newCoords = coords.map((c) => c.clone()).toList(); + if (newCoords.first != newCoords.last) { + newCoords.add(newCoords.first.clone()); + } + return newCoords; +} + +/// Quick calculates approximate area (used to sort) +num _calculateArea(BBox bbox) { + var west = bbox[0]; + var south = bbox[1]; + var east = bbox[2]; + var north = bbox[3]; + return (west! - east!).abs() * (south! - north!).abs(); +} diff --git a/lib/src/polygon_to_line.dart b/lib/src/polygon_to_line.dart new file mode 100644 index 00000000..6f25a442 --- /dev/null +++ b/lib/src/polygon_to_line.dart @@ -0,0 +1,65 @@ +import '../helpers.dart'; + +/// Converts a [Polygon] to [LineString] or [MultiLineString] or a [MultiPolygon] to a +/// [FeatureCollection] of [LineString] or [MultiLineString]. +/// Returns [FeatureCollection] or [Feature] or [Feature] +/// example: +/// ```dart +/// var poly = Polygon(coordinates: +/// [ +/// [ +/// Position.of([125, -30]), +/// Position.of([145, -30]), +/// Position.of([145, -20]), +/// Position.of([125, -20]), +/// Position.of([125, -30]) +/// ] +/// ]); +/// var line = polygonToLine(poly); +/// //addToMap +/// var addToMap = [line]; +/// ``` +GeoJSONObject polygonToLine(GeoJSONObject poly, + {Map? properties}) { + var geom = poly is Feature ? poly.geometry : poly; + + properties = + properties ?? ((poly is Feature) ? poly.properties : {}); + + if (geom is Polygon) { + return _polygonToLine(geom, properties: properties); + } else if (geom is MultiPolygon) { + return _multiPolygonToLine(geom, properties: properties); + } else { + throw Exception("invalid poly"); + } +} + +Feature _polygonToLine(Polygon geom, {Map? properties}) { + var coords = geom.coordinates; + properties = properties ?? {}; + + return _coordsToLine(coords, properties); +} + +FeatureCollection _multiPolygonToLine(MultiPolygon geom, + {Map? properties}) { + var coords = geom.coordinates; + properties = properties ?? {}; + + var lines = []; + coords.forEach((coord) => {lines.add(_coordsToLine(coord, properties))}); + return FeatureCollection(features: lines); +} + +Feature _coordsToLine( + List> coords, Map? properties) { + if (coords.isEmpty) { + throw RangeError("coordinates is empty"); + } else if (coords.length > 1) { + return Feature( + geometry: MultiLineString(coordinates: coords), properties: properties); + } + return Feature( + geometry: LineString(coordinates: coords[0]), properties: properties); +} diff --git a/test/components/line_to_polygon_test.dart b/test/components/line_to_polygon_test.dart new file mode 100644 index 00000000..8220ef95 --- /dev/null +++ b/test/components/line_to_polygon_test.dart @@ -0,0 +1,127 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/line_to_polygon.dart'; + +void main() { + group( + 'line_to_polygon:', + () { + var inDir = Directory('./test/examples/lineToPolygon/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 properties = (inGeom is Feature) + ? inGeom.properties ?? {"stroke": "#F0F", "stroke-width": 6} + : {"stroke": "#F0F", "stroke-width": 6}; + //print(inGeom); + var results = lineToPolygon( + inGeom, + properties: properties, + ); + + 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)); + + if (outGeom is Feature) { + if (outGeom.geometry is Polygon) { + outGeom = + Feature(geometry: outGeom.geometry as Polygon); + } else { + outGeom = Feature( + geometry: outGeom.geometry as MultiPolygon); + } + } + expect(results, equals(outGeom)); + }); + } + test( + 'Handles Errors', + () { + expect( + () => lineToPolygon(Point(coordinates: Position.of([10, 5]))), + throwsA(isA())); + expect(() => lineToPolygon(LineString(coordinates: [])), + throwsA(isA())); + expect( + lineToPolygon( + LineString(coordinates: [ + Position.of([10, 5]), + Position.of([20, 10]), + Position.of([30, 20]), + ]), + autoComplete: false) is Feature, + true); + }, + ); + } + }, + ); +} + +/* +const fs = require("fs"); +const test = require("tape"); +const path = require("path"); +const load = require("load-json-file"); +const write = require("write-json-file"); +const { point, lineString } = require("@turf/helpers"); +const clone = require("@turf/clone").default; +const lineToPolygon = require("./index").default; + +const directories = { + in: path.join(__dirname, "test", "in") + path.sep, + out: path.join(__dirname, "test", "out") + path.sep, +}; + +let fixtures = fs.readdirSync(directories.in).map((filename) => { + return { + filename, + name: path.parse(filename).name, + geojson: load.sync(directories.in + filename), + }; +}); +// fixtures = fixtures.filter(fixture => fixture.name === 'multi-outGeomtrings-with-holes'); + +test("turf-outGeomtring-to-polygon", (t) => { + for (const { name, filename, geojson } of fixtures) { + const originalInput = clone(geojson); + let { autoComplete, properties, orderCoords } = geojson.properties || {}; + properties = properties || { stroke: "#F0F", "stroke-width": 6 }; + const results = lineToPolygon(geojson, { + properties: properties, + autoComplete: autoComplete, + orderCoords: orderCoords, + }); + + if (process.env.REGEN) write.sync(directories.out + filename, results); + t.deepEqual(load.sync(directories.out + filename), results, name); + t.deepEqual(originalInput, geojson); + } + // Handle Errors + t.throws(() => lineToPolygon(point([10, 5])), "throws - invalid geometry"); + t.throws(() => lineToPolygon(lineString([])), "throws - empty coordinates"); + t.assert( + lineToPolygon( + lineString([ + [10, 5], + [20, 10], + [30, 20], + ]), + { autocomplete: false } + ), + "is valid - autoComplete=false" + ); + t.end(); +}); +*/ diff --git a/test/components/polygon_to_line_test.dart b/test/components/polygon_to_line_test.dart new file mode 100644 index 00000000..80846538 --- /dev/null +++ b/test/components/polygon_to_line_test.dart @@ -0,0 +1,72 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/expect.dart'; +import 'package:test/scaffolding.dart'; +import 'package:turf/polygon_to_line.dart'; +import 'package:turf/turf.dart'; + +main() { + group( + 'polygonToLine', + () { + var inDir = Directory('./test/examples/polygonToLine/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 = polygonToLine(inGeom); + + 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)); + if (results is FeatureCollection) { + expect(outGeom is FeatureCollection, true); + for (var i = 0; i < results.features.length; i++) { + expect(results.features[i], + equals((outGeom as FeatureCollection).features[i])); + expect( + (results.features[i].geometry as GeometryType).coordinates, + equals((outGeom.features[i].geometry as GeometryType) + .coordinates), + ); + expect( + results.features[i].properties, + equals(outGeom.features[i].properties), + ); + } + } else if (results is Feature) { + expect(outGeom is Feature, true); + expect((outGeom as Feature).properties, + equals(results.properties)); + expect((results.geometry as GeometryType).type, + equals((outGeom.geometry)?.type)); + expect((results.geometry as GeometryType).coordinates, + equals((outGeom.geometry as GeometryType).coordinates)); + } + }, + ); + test( + "handles error", + () { + // Handle Errors + expect( + () => polygonToLine(Point(coordinates: Position.of([10, 5]))), + throwsA(isA())); + expect(() => polygonToLine(Polygon(coordinates: [])), + throwsA(isA())); + }, + ); + } + } + }, + ); +} diff --git a/test/examples/lineToPolygon/in/collection_linestring.geojson b/test/examples/lineToPolygon/in/collection_linestring.geojson new file mode 100644 index 00000000..40586ab0 --- /dev/null +++ b/test/examples/lineToPolygon/in/collection_linestring.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ] + } + } + ] +} diff --git a/test/examples/lineToPolygon/in/geometry_linestring.geojson b/test/examples/lineToPolygon/in/geometry_linestring.geojson new file mode 100644 index 00000000..61e6ffa4 --- /dev/null +++ b/test/examples/lineToPolygon/in/geometry_linestring.geojson @@ -0,0 +1,10 @@ +{ + "type": "LineString", + "coordinates": [ + [-2.275543, 53.464547], + [-2.275543, 53.489271], + [-2.215118, 53.489271], + [-2.215118, 53.464547], + [-2.275543, 53.464547] + ] +} diff --git a/test/examples/lineToPolygon/in/linestring.geojson b/test/examples/lineToPolygon/in/linestring.geojson new file mode 100644 index 00000000..b453fedd --- /dev/null +++ b/test/examples/lineToPolygon/in/linestring.geojson @@ -0,0 +1,17 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-2.275543, 53.464547], + [-2.275543, 53.489271], + [-2.215118, 53.489271], + [-2.215118, 53.464547], + [-2.275543, 53.464547] + ] + } +} diff --git a/test/examples/lineToPolygon/in/linestring_incomplete.geojson b/test/examples/lineToPolygon/in/linestring_incomplete.geojson new file mode 100644 index 00000000..4f045fbb --- /dev/null +++ b/test/examples/lineToPolygon/in/linestring_incomplete.geojson @@ -0,0 +1,20 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [131.0009765625, -30.939924331023455], + [125.46386718749999, -29.878755346037963], + [121.77246093750001, -26.07652055985696], + [121.5087890625, -21.902277966668624], + [127.79296875, -16.1724728083975], + [133.154296875, -14.944784875088372], + [137.4169921875, -20.097206227083888], + [138.515625, -26.82407078047018] + ] + } +} diff --git a/test/examples/lineToPolygon/in/linestrings_to_multipolygons.geojson b/test/examples/lineToPolygon/in/linestrings_to_multipolygons.geojson new file mode 100644 index 00000000..82df2271 --- /dev/null +++ b/test/examples/lineToPolygon/in/linestrings_to_multipolygons.geojson @@ -0,0 +1,113 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#008000", + "stroke-width": 6, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [33.4149169921875, 48.28684818710906], + [32.816162109375, 48.42191010942875], + [32.783203125, 48.09642606004488], + [33.3270263671875, 47.931066347509784], + [33.4149169921875, 48.28684818710906] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#ff8000", + "stroke-width": 6, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [35.244140625, 47.15984001304432], + [35.17822265625, 46.37725420510028], + [36.40869140625, 46.240651955001695], + [37.02392578125, 46.9502622421856], + [35.244140625, 47.15984001304432] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#ff0000", + "stroke-width": 6, + "stroke-opacity": 1 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [33.398, 46.867], + [34.057, 46.867], + [34.057, 47.197], + [33.398, 47.197], + [33.398, 46.867] + ], + [ + [33.42041015625, 46.164614496897094], + [34.12353515625, 46.58906908309182], + [34.73876953125, 46.73233101286786], + [35.013427734375, 47.34626718205302], + [34.07958984374999, 47.73193447949174], + [32.947998046875, 47.338822694822], + [32.354736328125, 46.73986059969267], + [32.54150390625, 46.240651955001695], + [33.42041015625, 46.164614496897094] + ], + [ + [32.969, 46.46], + [33.321, 46.46], + [33.321, 46.672], + [32.969, 46.672], + [32.969, 46.46] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#0080ff", + "stroke-width": 6, + "stroke-opacity": 1 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [34.178466796875, 48.436489955944154], + [35.101318359375, 47.57652571374621], + [37.3974609375, 47.48008846346322], + [38.133544921875, 48.777912755501845], + [35.92529296875, 49.930008124606886], + [34.178466796875, 48.436489955944154] + ], + [ + [34.80468749999999, 48.29050321714062], + [35.04638671874999, 47.938426929481054], + [35.760498046875, 47.95314495015594], + [35.343017578125, 48.32703913063476], + [34.80468749999999, 48.29050321714062] + ], + [ + [35.99395751953125, 47.83528342275264], + [35.93902587890624, 47.73193447949174], + [36.15325927734375, 47.65428791076272], + [35.99395751953125, 47.83528342275264] + ] + ] + } + } + ] +} diff --git a/test/examples/lineToPolygon/in/multi_linestring_incomplete.geojson b/test/examples/lineToPolygon/in/multi_linestring_incomplete.geojson new file mode 100644 index 00000000..30b9ea46 --- /dev/null +++ b/test/examples/lineToPolygon/in/multi_linestring_incomplete.geojson @@ -0,0 +1,29 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [129.28710937499997, -31.57853542647337], + [120.05859375, -26.35249785815401], + [120.05859375, -19.72534224805787], + [124.62890625, -17.056784609942543], + [131.572265625, -17.224758206624628], + [133.330078125, -23.644524198573677] + ], + [ + [126.2548828125, -20.427012814257385], + [123.662109375, -22.512556954051437], + [124.1455078125, -25.36388227274024], + [126.9580078125, -25.799891182088306], + [128.5400390625, -24.166802085303225], + [127.83691406249999, -21.207458730482642], + [127.265625, -20.756113874762068] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/in/multi_linestring_nested.geojson b/test/examples/lineToPolygon/in/multi_linestring_nested.geojson new file mode 100644 index 00000000..3bc27513 --- /dev/null +++ b/test/examples/lineToPolygon/in/multi_linestring_nested.geojson @@ -0,0 +1,49 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [102.359619140625, 33.916013113401696], + [103.65600585937499, 33.916013113401696], + [103.65600585937499, 34.97600151317588], + [102.359619140625, 34.97600151317588], + [102.359619140625, 33.916013113401696] + ], + [ + [101.18408203124999, 32.95336814579932], + [101.18408203124999, 35.93354064249312], + [104.952392578125, 35.93354064249312], + [104.952392578125, 32.95336814579932], + [101.18408203124999, 32.95336814579932] + ], + [ + [101.612548828125, 33.330528249028085], + [104.556884765625, 33.330528249028085], + [104.556884765625, 35.46961797120201], + [101.612548828125, 35.46961797120201], + [101.612548828125, 33.330528249028085] + ], + [ + [106.4794921875, 32.7872745269555], + [110.687255859375, 32.7872745269555], + [110.687255859375, 36.83566824724438], + [106.4794921875, 36.83566824724438], + [106.4794921875, 32.7872745269555] + ], + [ + [106.06201171875, 32.47269502206151], + [111.86279296875, 32.47269502206151], + [111.86279296875, 37.33522435930639], + [106.06201171875, 37.33522435930639], + [106.06201171875, 32.47269502206151] + ] + ] + } + } + ] +} diff --git a/test/examples/lineToPolygon/in/multi_linestring_nested2.geojson b/test/examples/lineToPolygon/in/multi_linestring_nested2.geojson new file mode 100644 index 00000000..19589965 --- /dev/null +++ b/test/examples/lineToPolygon/in/multi_linestring_nested2.geojson @@ -0,0 +1,71 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [115.927734375, -34.016241889667015], + [134.560546875, -34.016241889667015], + [134.560546875, -16.8886597873816], + [115.927734375, -16.8886597873816], + [115.927734375, -34.016241889667015] + ], + [ + [118.65234374999999, -30.90222470517144], + [131.484375, -30.90222470517144], + [131.484375, -19.808054128088575], + [118.65234374999999, -19.808054128088575], + [118.65234374999999, -30.90222470517144] + ], + [ + [120.9375, -28.998531814051795], + [129.7265625, -28.998531814051795], + [129.7265625, -22.105998799750566], + [120.9375, -22.105998799750566], + [120.9375, -28.998531814051795] + ], + [ + [123.48632812499999, -27.137368359795584], + [127.44140625, -27.137368359795584], + [127.44140625, -24.126701958681668], + [123.48632812499999, -24.126701958681668], + [123.48632812499999, -27.137368359795584] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [139.21874999999997, -36.10237644873643], + [158.73046875, -36.10237644873643], + [158.73046875, -17.476432197195518], + [139.21874999999997, -17.476432197195518], + [139.21874999999997, -36.10237644873643] + ], + [ + [142.3828125, -34.016241889667015], + [155.91796874999997, -34.016241889667015], + [155.91796874999997, -20.13847031245114], + [142.3828125, -20.13847031245114], + [142.3828125, -34.016241889667015] + ] + ] + } + } + ] +} diff --git a/test/examples/lineToPolygon/in/multi_linestring_outer_ring_middle_position.geojson b/test/examples/lineToPolygon/in/multi_linestring_outer_ring_middle_position.geojson new file mode 100644 index 00000000..a6f77a86 --- /dev/null +++ b/test/examples/lineToPolygon/in/multi_linestring_outer_ring_middle_position.geojson @@ -0,0 +1,34 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [33.398, 46.867], + [34.057, 46.867], + [34.057, 47.197], + [33.398, 47.197], + [33.398, 46.867] + ], + [ + [33.42041015625, 46.164614496897094], + [34.12353515625, 46.58906908309182], + [34.73876953125, 46.73233101286786], + [35.013427734375, 47.34626718205302], + [34.07958984374999, 47.73193447949174], + [32.947998046875, 47.338822694822], + [32.354736328125, 46.73986059969267], + [32.54150390625, 46.240651955001695], + [33.42041015625, 46.164614496897094] + ], + [ + [32.969, 46.46], + [33.321, 46.46], + [33.321, 46.672], + [32.969, 46.672], + [32.969, 46.46] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/in/multi_linestring_with_hole.geojson b/test/examples/lineToPolygon/in/multi_linestring_with_hole.geojson new file mode 100644 index 00000000..660dcbd8 --- /dev/null +++ b/test/examples/lineToPolygon/in/multi_linestring_with_hole.geojson @@ -0,0 +1,26 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ], + [ + [100.2, 0.2], + [100.8, 0.2], + [100.8, 0.8], + [100.2, 0.8], + [100.2, 0.2] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/in/multi_linestrings_nested.geojson b/test/examples/lineToPolygon/in/multi_linestrings_nested.geojson new file mode 100644 index 00000000..19589965 --- /dev/null +++ b/test/examples/lineToPolygon/in/multi_linestrings_nested.geojson @@ -0,0 +1,71 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [115.927734375, -34.016241889667015], + [134.560546875, -34.016241889667015], + [134.560546875, -16.8886597873816], + [115.927734375, -16.8886597873816], + [115.927734375, -34.016241889667015] + ], + [ + [118.65234374999999, -30.90222470517144], + [131.484375, -30.90222470517144], + [131.484375, -19.808054128088575], + [118.65234374999999, -19.808054128088575], + [118.65234374999999, -30.90222470517144] + ], + [ + [120.9375, -28.998531814051795], + [129.7265625, -28.998531814051795], + [129.7265625, -22.105998799750566], + [120.9375, -22.105998799750566], + [120.9375, -28.998531814051795] + ], + [ + [123.48632812499999, -27.137368359795584], + [127.44140625, -27.137368359795584], + [127.44140625, -24.126701958681668], + [123.48632812499999, -24.126701958681668], + [123.48632812499999, -27.137368359795584] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [139.21874999999997, -36.10237644873643], + [158.73046875, -36.10237644873643], + [158.73046875, -17.476432197195518], + [139.21874999999997, -17.476432197195518], + [139.21874999999997, -36.10237644873643] + ], + [ + [142.3828125, -34.016241889667015], + [155.91796874999997, -34.016241889667015], + [155.91796874999997, -20.13847031245114], + [142.3828125, -20.13847031245114], + [142.3828125, -34.016241889667015] + ] + ] + } + } + ] +} diff --git a/test/examples/lineToPolygon/in/multi_linestrings_outer_doughnut.geojson b/test/examples/lineToPolygon/in/multi_linestrings_outer_doughnut.geojson new file mode 100644 index 00000000..3d3d9947 --- /dev/null +++ b/test/examples/lineToPolygon/in/multi_linestrings_outer_doughnut.geojson @@ -0,0 +1,57 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [115.927734375, -34.016241889667015], + [134.560546875, -34.016241889667015], + [134.560546875, -16.8886597873816], + [115.927734375, -16.8886597873816], + [115.927734375, -34.016241889667015] + ], + [ + [118.65234374999999, -30.90222470517144], + [131.484375, -30.90222470517144], + [131.484375, -19.808054128088575], + [118.65234374999999, -19.808054128088575], + [118.65234374999999, -30.90222470517144] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [120.9375, -28.998531814051795], + [129.7265625, -28.998531814051795], + [129.7265625, -22.105998799750566], + [120.9375, -22.105998799750566], + [120.9375, -28.998531814051795] + ], + [ + [123.48632812499999, -27.137368359795584], + [127.44140625, -27.137368359795584], + [127.44140625, -24.126701958681668], + [123.48632812499999, -24.126701958681668], + [123.48632812499999, -27.137368359795584] + ] + ] + } + } + ] +} diff --git a/test/examples/lineToPolygon/in/multi_linestrings_with_holes.geojson b/test/examples/lineToPolygon/in/multi_linestrings_with_holes.geojson new file mode 100644 index 00000000..804a27c9 --- /dev/null +++ b/test/examples/lineToPolygon/in/multi_linestrings_with_holes.geojson @@ -0,0 +1,74 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ], + [ + [102.227783203125, 2.191238104506552], + [102.227783203125, 2.8223442468940902], + [102.843017578125, 2.8223442468940902], + [102.843017578125, 2.191238104506552], + [102.227783203125, 2.191238104506552] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F80", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ], + [ + [100.206298828125, 0.2526847277643438], + [100.206298828125, 0.7909904981540058], + [100.8050537109375, 0.7909904981540058], + [100.8050537109375, 0.2526847277643438], + [100.206298828125, 0.2526847277643438] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#080", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [101.700439453125, 0.5273363048115169], + [102.645263671875, 0.5273363048115169], + [102.645263671875, 1.3511930983018892], + [101.700439453125, 1.3511930983018892], + [101.700439453125, 0.5273363048115169] + ] + } + } + ] +} diff --git a/test/examples/lineToPolygon/out/collection_linestring.geojson b/test/examples/lineToPolygon/out/collection_linestring.geojson new file mode 100644 index 00000000..bc0a389a --- /dev/null +++ b/test/examples/lineToPolygon/out/collection_linestring.geojson @@ -0,0 +1,30 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ] + ], + [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/geometry_linestring.geojson b/test/examples/lineToPolygon/out/geometry_linestring.geojson new file mode 100644 index 00000000..50437484 --- /dev/null +++ b/test/examples/lineToPolygon/out/geometry_linestring.geojson @@ -0,0 +1,19 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-2.275543, 53.464547], + [-2.275543, 53.489271], + [-2.215118, 53.489271], + [-2.215118, 53.464547], + [-2.275543, 53.464547] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/linestring.geojson b/test/examples/lineToPolygon/out/linestring.geojson new file mode 100644 index 00000000..50437484 --- /dev/null +++ b/test/examples/lineToPolygon/out/linestring.geojson @@ -0,0 +1,19 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-2.275543, 53.464547], + [-2.275543, 53.489271], + [-2.215118, 53.489271], + [-2.215118, 53.464547], + [-2.275543, 53.464547] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/linestring_incomplete.geojson b/test/examples/lineToPolygon/out/linestring_incomplete.geojson new file mode 100644 index 00000000..19d65589 --- /dev/null +++ b/test/examples/lineToPolygon/out/linestring_incomplete.geojson @@ -0,0 +1,23 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [131.0009765625, -30.939924331023455], + [125.46386718749999, -29.878755346037963], + [121.77246093750001, -26.07652055985696], + [121.5087890625, -21.902277966668624], + [127.79296875, -16.1724728083975], + [133.154296875, -14.944784875088372], + [137.4169921875, -20.097206227083888], + [138.515625, -26.82407078047018], + [131.0009765625, -30.939924331023455] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/linestrings_to_multipolygons.geojson b/test/examples/lineToPolygon/out/linestrings_to_multipolygons.geojson new file mode 100644 index 00000000..3c8f176e --- /dev/null +++ b/test/examples/lineToPolygon/out/linestrings_to_multipolygons.geojson @@ -0,0 +1,80 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [33.4149169921875, 48.28684818710906], + [32.816162109375, 48.42191010942875], + [32.783203125, 48.09642606004488], + [33.3270263671875, 47.931066347509784], + [33.4149169921875, 48.28684818710906] + ] + ], + [ + [ + [35.244140625, 47.15984001304432], + [35.17822265625, 46.37725420510028], + [36.40869140625, 46.240651955001695], + [37.02392578125, 46.9502622421856], + [35.244140625, 47.15984001304432] + ] + ], + [ + [ + [33.42041015625, 46.164614496897094], + [34.12353515625, 46.58906908309182], + [34.73876953125, 46.73233101286786], + [35.013427734375, 47.34626718205302], + [34.07958984374999, 47.73193447949174], + [32.947998046875, 47.338822694822], + [32.354736328125, 46.73986059969267], + [32.54150390625, 46.240651955001695], + [33.42041015625, 46.164614496897094] + ], + [ + [33.398, 46.867], + [34.057, 46.867], + [34.057, 47.197], + [33.398, 47.197], + [33.398, 46.867] + ], + [ + [32.969, 46.46], + [33.321, 46.46], + [33.321, 46.672], + [32.969, 46.672], + [32.969, 46.46] + ] + ], + [ + [ + [34.178466796875, 48.436489955944154], + [35.101318359375, 47.57652571374621], + [37.3974609375, 47.48008846346322], + [38.133544921875, 48.777912755501845], + [35.92529296875, 49.930008124606886], + [34.178466796875, 48.436489955944154] + ], + [ + [34.80468749999999, 48.29050321714062], + [35.04638671874999, 47.938426929481054], + [35.760498046875, 47.95314495015594], + [35.343017578125, 48.32703913063476], + [34.80468749999999, 48.29050321714062] + ], + [ + [35.99395751953125, 47.83528342275264], + [35.93902587890624, 47.73193447949174], + [36.15325927734375, 47.65428791076272], + [35.99395751953125, 47.83528342275264] + ] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/multi_linestring_incomplete.geojson b/test/examples/lineToPolygon/out/multi_linestring_incomplete.geojson new file mode 100644 index 00000000..16dfc893 --- /dev/null +++ b/test/examples/lineToPolygon/out/multi_linestring_incomplete.geojson @@ -0,0 +1,31 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [129.28710937499997, -31.57853542647337], + [120.05859375, -26.35249785815401], + [120.05859375, -19.72534224805787], + [124.62890625, -17.056784609942543], + [131.572265625, -17.224758206624628], + [133.330078125, -23.644524198573677], + [129.28710937499997, -31.57853542647337] + ], + [ + [126.2548828125, -20.427012814257385], + [123.662109375, -22.512556954051437], + [124.1455078125, -25.36388227274024], + [126.9580078125, -25.799891182088306], + [128.5400390625, -24.166802085303225], + [127.83691406249999, -21.207458730482642], + [127.265625, -20.756113874762068], + [126.2548828125, -20.427012814257385] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/multi_linestring_nested.geojson b/test/examples/lineToPolygon/out/multi_linestring_nested.geojson new file mode 100644 index 00000000..fce548b6 --- /dev/null +++ b/test/examples/lineToPolygon/out/multi_linestring_nested.geojson @@ -0,0 +1,49 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [106.06201171875, 32.47269502206151], + [111.86279296875, 32.47269502206151], + [111.86279296875, 37.33522435930639], + [106.06201171875, 37.33522435930639], + [106.06201171875, 32.47269502206151] + ], + [ + [106.4794921875, 32.7872745269555], + [110.687255859375, 32.7872745269555], + [110.687255859375, 36.83566824724438], + [106.4794921875, 36.83566824724438], + [106.4794921875, 32.7872745269555] + ], + [ + [101.18408203124999, 32.95336814579932], + [101.18408203124999, 35.93354064249312], + [104.952392578125, 35.93354064249312], + [104.952392578125, 32.95336814579932], + [101.18408203124999, 32.95336814579932] + ], + [ + [102.359619140625, 33.916013113401696], + [103.65600585937499, 33.916013113401696], + [103.65600585937499, 34.97600151317588], + [102.359619140625, 34.97600151317588], + [102.359619140625, 33.916013113401696] + ], + [ + [101.612548828125, 33.330528249028085], + [104.556884765625, 33.330528249028085], + [104.556884765625, 35.46961797120201], + [101.612548828125, 35.46961797120201], + [101.612548828125, 33.330528249028085] + ] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/multi_linestring_nested2.geojson b/test/examples/lineToPolygon/out/multi_linestring_nested2.geojson new file mode 100644 index 00000000..4a3384c0 --- /dev/null +++ b/test/examples/lineToPolygon/out/multi_linestring_nested2.geojson @@ -0,0 +1,58 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [115.927734375, -34.016241889667015], + [134.560546875, -34.016241889667015], + [134.560546875, -16.8886597873816], + [115.927734375, -16.8886597873816], + [115.927734375, -34.016241889667015] + ], + [ + [118.65234374999999, -30.90222470517144], + [131.484375, -30.90222470517144], + [131.484375, -19.808054128088575], + [118.65234374999999, -19.808054128088575], + [118.65234374999999, -30.90222470517144] + ], + [ + [120.9375, -28.998531814051795], + [129.7265625, -28.998531814051795], + [129.7265625, -22.105998799750566], + [120.9375, -22.105998799750566], + [120.9375, -28.998531814051795] + ], + [ + [123.48632812499999, -27.137368359795584], + [127.44140625, -27.137368359795584], + [127.44140625, -24.126701958681668], + [123.48632812499999, -24.126701958681668], + [123.48632812499999, -27.137368359795584] + ] + ], + [ + [ + [139.21874999999997, -36.10237644873643], + [158.73046875, -36.10237644873643], + [158.73046875, -17.476432197195518], + [139.21874999999997, -17.476432197195518], + [139.21874999999997, -36.10237644873643] + ], + [ + [142.3828125, -34.016241889667015], + [155.91796874999997, -34.016241889667015], + [155.91796874999997, -20.13847031245114], + [142.3828125, -20.13847031245114], + [142.3828125, -34.016241889667015] + ] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/multi_linestring_outer_ring_middle_position.geojson b/test/examples/lineToPolygon/out/multi_linestring_outer_ring_middle_position.geojson new file mode 100644 index 00000000..98e54583 --- /dev/null +++ b/test/examples/lineToPolygon/out/multi_linestring_outer_ring_middle_position.geojson @@ -0,0 +1,37 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [33.42041015625, 46.164614496897094], + [34.12353515625, 46.58906908309182], + [34.73876953125, 46.73233101286786], + [35.013427734375, 47.34626718205302], + [34.07958984374999, 47.73193447949174], + [32.947998046875, 47.338822694822], + [32.354736328125, 46.73986059969267], + [32.54150390625, 46.240651955001695], + [33.42041015625, 46.164614496897094] + ], + [ + [33.398, 46.867], + [34.057, 46.867], + [34.057, 47.197], + [33.398, 47.197], + [33.398, 46.867] + ], + [ + [32.969, 46.46], + [33.321, 46.46], + [33.321, 46.672], + [32.969, 46.672], + [32.969, 46.46] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/multi_linestring_with_hole.geojson b/test/examples/lineToPolygon/out/multi_linestring_with_hole.geojson new file mode 100644 index 00000000..342f08f3 --- /dev/null +++ b/test/examples/lineToPolygon/out/multi_linestring_with_hole.geojson @@ -0,0 +1,26 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ], + [ + [100.2, 0.2], + [100.8, 0.2], + [100.8, 0.8], + [100.2, 0.8], + [100.2, 0.2] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/multi_linestrings_nested.geojson b/test/examples/lineToPolygon/out/multi_linestrings_nested.geojson new file mode 100644 index 00000000..4a3384c0 --- /dev/null +++ b/test/examples/lineToPolygon/out/multi_linestrings_nested.geojson @@ -0,0 +1,58 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [115.927734375, -34.016241889667015], + [134.560546875, -34.016241889667015], + [134.560546875, -16.8886597873816], + [115.927734375, -16.8886597873816], + [115.927734375, -34.016241889667015] + ], + [ + [118.65234374999999, -30.90222470517144], + [131.484375, -30.90222470517144], + [131.484375, -19.808054128088575], + [118.65234374999999, -19.808054128088575], + [118.65234374999999, -30.90222470517144] + ], + [ + [120.9375, -28.998531814051795], + [129.7265625, -28.998531814051795], + [129.7265625, -22.105998799750566], + [120.9375, -22.105998799750566], + [120.9375, -28.998531814051795] + ], + [ + [123.48632812499999, -27.137368359795584], + [127.44140625, -27.137368359795584], + [127.44140625, -24.126701958681668], + [123.48632812499999, -24.126701958681668], + [123.48632812499999, -27.137368359795584] + ] + ], + [ + [ + [139.21874999999997, -36.10237644873643], + [158.73046875, -36.10237644873643], + [158.73046875, -17.476432197195518], + [139.21874999999997, -17.476432197195518], + [139.21874999999997, -36.10237644873643] + ], + [ + [142.3828125, -34.016241889667015], + [155.91796874999997, -34.016241889667015], + [155.91796874999997, -20.13847031245114], + [142.3828125, -20.13847031245114], + [142.3828125, -34.016241889667015] + ] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/multi_linestrings_outer_doughnut.geojson b/test/examples/lineToPolygon/out/multi_linestrings_outer_doughnut.geojson new file mode 100644 index 00000000..037a064b --- /dev/null +++ b/test/examples/lineToPolygon/out/multi_linestrings_outer_doughnut.geojson @@ -0,0 +1,44 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [115.927734375, -34.016241889667015], + [134.560546875, -34.016241889667015], + [134.560546875, -16.8886597873816], + [115.927734375, -16.8886597873816], + [115.927734375, -34.016241889667015] + ], + [ + [118.65234374999999, -30.90222470517144], + [131.484375, -30.90222470517144], + [131.484375, -19.808054128088575], + [118.65234374999999, -19.808054128088575], + [118.65234374999999, -30.90222470517144] + ] + ], + [ + [ + [120.9375, -28.998531814051795], + [129.7265625, -28.998531814051795], + [129.7265625, -22.105998799750566], + [120.9375, -22.105998799750566], + [120.9375, -28.998531814051795] + ], + [ + [123.48632812499999, -27.137368359795584], + [127.44140625, -27.137368359795584], + [127.44140625, -24.126701958681668], + [123.48632812499999, -24.126701958681668], + [123.48632812499999, -27.137368359795584] + ] + ] + ] + } +} diff --git a/test/examples/lineToPolygon/out/multi_linestrings_with_holes.geojson b/test/examples/lineToPolygon/out/multi_linestrings_with_holes.geojson new file mode 100644 index 00000000..11bc7f70 --- /dev/null +++ b/test/examples/lineToPolygon/out/multi_linestrings_with_holes.geojson @@ -0,0 +1,53 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ], + [ + [102.227783203125, 2.191238104506552], + [102.227783203125, 2.8223442468940902], + [102.843017578125, 2.8223442468940902], + [102.843017578125, 2.191238104506552], + [102.227783203125, 2.191238104506552] + ] + ], + [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ], + [ + [100.206298828125, 0.2526847277643438], + [100.206298828125, 0.7909904981540058], + [100.8050537109375, 0.7909904981540058], + [100.8050537109375, 0.2526847277643438], + [100.206298828125, 0.2526847277643438] + ] + ], + [ + [ + [101.700439453125, 0.5273363048115169], + [102.645263671875, 0.5273363048115169], + [102.645263671875, 1.3511930983018892], + [101.700439453125, 1.3511930983018892], + [101.700439453125, 0.5273363048115169] + ] + ] + ] + } +} diff --git a/test/examples/polygonToLine/in/geometry_polygon.geojson b/test/examples/polygonToLine/in/geometry_polygon.geojson new file mode 100644 index 00000000..401ebe2c --- /dev/null +++ b/test/examples/polygonToLine/in/geometry_polygon.geojson @@ -0,0 +1,12 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [-2.275543, 53.464547], + [-2.275543, 53.489271], + [-2.215118, 53.489271], + [-2.215118, 53.464547], + [-2.275543, 53.464547] + ] + ] +} diff --git a/test/examples/polygonToLine/in/multi_polygon.geojson b/test/examples/polygonToLine/in/multi_polygon.geojson new file mode 100644 index 00000000..d8731f84 --- /dev/null +++ b/test/examples/polygonToLine/in/multi_polygon.geojson @@ -0,0 +1,30 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ] + ], + [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ] + ] + ] + } +} diff --git a/test/examples/polygonToLine/in/multi_polygon_outer_doughnut.geojson b/test/examples/polygonToLine/in/multi_polygon_outer_doughnut.geojson new file mode 100644 index 00000000..037a064b --- /dev/null +++ b/test/examples/polygonToLine/in/multi_polygon_outer_doughnut.geojson @@ -0,0 +1,44 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [115.927734375, -34.016241889667015], + [134.560546875, -34.016241889667015], + [134.560546875, -16.8886597873816], + [115.927734375, -16.8886597873816], + [115.927734375, -34.016241889667015] + ], + [ + [118.65234374999999, -30.90222470517144], + [131.484375, -30.90222470517144], + [131.484375, -19.808054128088575], + [118.65234374999999, -19.808054128088575], + [118.65234374999999, -30.90222470517144] + ] + ], + [ + [ + [120.9375, -28.998531814051795], + [129.7265625, -28.998531814051795], + [129.7265625, -22.105998799750566], + [120.9375, -22.105998799750566], + [120.9375, -28.998531814051795] + ], + [ + [123.48632812499999, -27.137368359795584], + [127.44140625, -27.137368359795584], + [127.44140625, -24.126701958681668], + [123.48632812499999, -24.126701958681668], + [123.48632812499999, -27.137368359795584] + ] + ] + ] + } +} diff --git a/test/examples/polygonToLine/in/multi_polygon_with_holes.geojson b/test/examples/polygonToLine/in/multi_polygon_with_holes.geojson new file mode 100644 index 00000000..dd14d7c7 --- /dev/null +++ b/test/examples/polygonToLine/in/multi_polygon_with_holes.geojson @@ -0,0 +1,53 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ], + [ + [102.227783203125, 2.191238104506552], + [102.227783203125, 2.8223442468940902], + [102.843017578125, 2.8223442468940902], + [102.843017578125, 2.191238104506552], + [102.227783203125, 2.191238104506552] + ] + ], + [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ], + [ + [100.206298828125, 0.2526847277643438], + [100.206298828125, 0.7909904981540058], + [100.8050537109375, 0.7909904981540058], + [100.8050537109375, 0.2526847277643438], + [100.206298828125, 0.2526847277643438] + ] + ], + [ + [ + [101.700439453125, 0.5273363048115169], + [102.645263671875, 0.5273363048115169], + [102.645263671875, 1.3511930983018892], + [101.700439453125, 1.3511930983018892], + [101.700439453125, 0.5273363048115169] + ] + ] + ] + } +} diff --git a/test/examples/polygonToLine/in/polygon.geojson b/test/examples/polygonToLine/in/polygon.geojson new file mode 100644 index 00000000..a518e3d2 --- /dev/null +++ b/test/examples/polygonToLine/in/polygon.geojson @@ -0,0 +1,19 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-2.275543, 53.464547], + [-2.275543, 53.489271], + [-2.215118, 53.489271], + [-2.215118, 53.464547], + [-2.275543, 53.464547] + ] + ] + } +} diff --git a/test/examples/polygonToLine/in/polygon_with_hole.geojson b/test/examples/polygonToLine/in/polygon_with_hole.geojson new file mode 100644 index 00000000..20bb8986 --- /dev/null +++ b/test/examples/polygonToLine/in/polygon_with_hole.geojson @@ -0,0 +1,26 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-2.275543, 53.464547], + [-2.215118, 53.464547], + [-2.215118, 53.489271], + [-2.275543, 53.489271], + [-2.275543, 53.464547] + ], + [ + [-2.261037826538086, 53.47062762161877], + [-2.2293663024902344, 53.47062762161877], + [-2.2293663024902344, 53.48196795587917], + [-2.261037826538086, 53.48196795587917], + [-2.261037826538086, 53.47062762161877] + ] + ] + } +} diff --git a/test/examples/polygonToLine/out/geometry_polygon.geojson b/test/examples/polygonToLine/out/geometry_polygon.geojson new file mode 100644 index 00000000..c8c6b041 --- /dev/null +++ b/test/examples/polygonToLine/out/geometry_polygon.geojson @@ -0,0 +1,14 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-2.275543, 53.464547], + [-2.275543, 53.489271], + [-2.215118, 53.489271], + [-2.215118, 53.464547], + [-2.275543, 53.464547] + ] + } +} diff --git a/test/examples/polygonToLine/out/multi_polygon.geojson b/test/examples/polygonToLine/out/multi_polygon.geojson new file mode 100644 index 00000000..fa82c4de --- /dev/null +++ b/test/examples/polygonToLine/out/multi_polygon.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ] + } + } + ] +} diff --git a/test/examples/polygonToLine/out/multi_polygon_outer_doughnut.geojson b/test/examples/polygonToLine/out/multi_polygon_outer_doughnut.geojson new file mode 100644 index 00000000..3d3d9947 --- /dev/null +++ b/test/examples/polygonToLine/out/multi_polygon_outer_doughnut.geojson @@ -0,0 +1,57 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [115.927734375, -34.016241889667015], + [134.560546875, -34.016241889667015], + [134.560546875, -16.8886597873816], + [115.927734375, -16.8886597873816], + [115.927734375, -34.016241889667015] + ], + [ + [118.65234374999999, -30.90222470517144], + [131.484375, -30.90222470517144], + [131.484375, -19.808054128088575], + [118.65234374999999, -19.808054128088575], + [118.65234374999999, -30.90222470517144] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F0F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [120.9375, -28.998531814051795], + [129.7265625, -28.998531814051795], + [129.7265625, -22.105998799750566], + [120.9375, -22.105998799750566], + [120.9375, -28.998531814051795] + ], + [ + [123.48632812499999, -27.137368359795584], + [127.44140625, -27.137368359795584], + [127.44140625, -24.126701958681668], + [123.48632812499999, -24.126701958681668], + [123.48632812499999, -27.137368359795584] + ] + ] + } + } + ] +} diff --git a/test/examples/polygonToLine/out/multi_polygon_with_holes.geojson b/test/examples/polygonToLine/out/multi_polygon_with_holes.geojson new file mode 100644 index 00000000..4af234d5 --- /dev/null +++ b/test/examples/polygonToLine/out/multi_polygon_with_holes.geojson @@ -0,0 +1,74 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [102, 2], + [103, 2], + [103, 3], + [102, 3], + [102, 2] + ], + [ + [102.227783203125, 2.191238104506552], + [102.227783203125, 2.8223442468940902], + [102.843017578125, 2.8223442468940902], + [102.843017578125, 2.191238104506552], + [102.227783203125, 2.191238104506552] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [100, 0], + [101, 0], + [101, 1], + [100, 1], + [100, 0] + ], + [ + [100.206298828125, 0.2526847277643438], + [100.206298828125, 0.7909904981540058], + [100.8050537109375, 0.7909904981540058], + [100.8050537109375, 0.2526847277643438], + [100.206298828125, 0.2526847277643438] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [101.700439453125, 0.5273363048115169], + [102.645263671875, 0.5273363048115169], + [102.645263671875, 1.3511930983018892], + [101.700439453125, 1.3511930983018892], + [101.700439453125, 0.5273363048115169] + ] + } + } + ] +} diff --git a/test/examples/polygonToLine/out/polygon.geojson b/test/examples/polygonToLine/out/polygon.geojson new file mode 100644 index 00000000..b453fedd --- /dev/null +++ b/test/examples/polygonToLine/out/polygon.geojson @@ -0,0 +1,17 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-2.275543, 53.464547], + [-2.275543, 53.489271], + [-2.215118, 53.489271], + [-2.215118, 53.464547], + [-2.275543, 53.464547] + ] + } +} diff --git a/test/examples/polygonToLine/out/polygon_with_hole.geojson b/test/examples/polygonToLine/out/polygon_with_hole.geojson new file mode 100644 index 00000000..a5dea976 --- /dev/null +++ b/test/examples/polygonToLine/out/polygon_with_hole.geojson @@ -0,0 +1,26 @@ +{ + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [-2.275543, 53.464547], + [-2.215118, 53.464547], + [-2.215118, 53.489271], + [-2.275543, 53.489271], + [-2.275543, 53.464547] + ], + [ + [-2.261037826538086, 53.47062762161877], + [-2.2293663024902344, 53.47062762161877], + [-2.2293663024902344, 53.48196795587917], + [-2.261037826538086, 53.48196795587917], + [-2.261037826538086, 53.47062762161877] + ] + ] + } +} From 358a43e14f614786c22ab64902450653202c551e Mon Sep 17 00:00:00 2001 From: arman Date: Thu, 7 Jul 2022 07:19:18 +0200 Subject: [PATCH 44/72] Adds proper documentation to feature-conversion Part I (#115) * line_to_polygon ported * test init of lineToPolygon * debugging the test on line to polygon * line_to_polygon_test done * polygonToLine init * check for features' tyope in FeatureCollections * file name change * test and impl. done for polygonToLine * refactor autocomplete, lineStringToPolygon * comments resolved * type added * implementation and test and type setting * corrected documentation Co-authored-by: Lukas Himsel --- lib/src/line_to_polygon.dart | 19 ++-- lib/src/polygon_to_line.dart | 4 +- test/components/line_to_polygon_test.dart | 117 ++++++---------------- 3 files changed, 44 insertions(+), 96 deletions(-) diff --git a/lib/src/line_to_polygon.dart b/lib/src/line_to_polygon.dart index 6870ba5d..c26028f5 100644 --- a/lib/src/line_to_polygon.dart +++ b/lib/src/line_to_polygon.dart @@ -4,10 +4,13 @@ import 'package:turf/meta.dart'; import 'package:turf/src/invariant.dart'; /// Converts [LineString]s & [MultiLineString](s) to [Polygon] or [MultiPolygon]. -/// Takes an optional bool autoComplete=true that auto complete [Linestring]s (matches first & last coordinates) -/// Takes an optional orderCoords=true that sorts [Linestring]s to place outer ring at the first position of the coordinates -/// Takes an optional mutate=false that mutates the original [Linestring] using autoComplete (matches first & last coordinates) -/// Returns [Feature] or [Feature] converted to Polygons. +/// Takes an optional boolean [autoComplete] that auto completes [LineString]s +/// (matches first & last coordinates). +/// Takes an optional [orderCoords] that sorts [LineString]s to place outer ring +/// at the first [Position] of the coordinates. +/// Takes an optional [mutate] that mutates the original [LineString] using +/// [autoComplete] (matches first & last coordinates. +/// Returns [Feature] or [Feature] converted to [Polygon]s. /// example: /// ```dart /// var line = LineString(coordinates: [ @@ -110,10 +113,10 @@ Feature lineToPolygon( } } -/// Converts LineString to Polygon -/// Takes a optional bool autoComplete=true that auto completes linestrings -/// Takes an optional orderCoords=true that sorts linestrings to place outer -/// ring at the first position of the coordinates. +/// Converts [LineString] to [Polygon] +/// Takes a optional boolean [autoComplete] that auto completes [LineString]s +/// Takes an optional [orderCoords] that sorts [LineString]s to place outer +/// ring at the first [Position] of the coordinates. Feature lineStringToPolygon( GeoJSONObject line, bool autoComplete, diff --git a/lib/src/polygon_to_line.dart b/lib/src/polygon_to_line.dart index 6f25a442..aee62570 100644 --- a/lib/src/polygon_to_line.dart +++ b/lib/src/polygon_to_line.dart @@ -1,7 +1,7 @@ import '../helpers.dart'; -/// Converts a [Polygon] to [LineString] or [MultiLineString] or a [MultiPolygon] to a -/// [FeatureCollection] of [LineString] or [MultiLineString]. +/// Converts a [Polygon] to [LineString] or [MultiLineString] or a [MultiPolygon] +/// to a [FeatureCollection] of [LineString] or [MultiLineString]. /// Returns [FeatureCollection] or [Feature] or [Feature] /// example: /// ```dart diff --git a/test/components/line_to_polygon_test.dart b/test/components/line_to_polygon_test.dart index 8220ef95..05ee4378 100644 --- a/test/components/line_to_polygon_test.dart +++ b/test/components/line_to_polygon_test.dart @@ -7,43 +7,45 @@ import 'package:turf/src/line_to_polygon.dart'; void main() { group( - 'line_to_polygon:', + 'lineToPolygon:', () { var inDir = Directory('./test/examples/lineToPolygon/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 properties = (inGeom is Feature) - ? inGeom.properties ?? {"stroke": "#F0F", "stroke-width": 6} - : {"stroke": "#F0F", "stroke-width": 6}; - //print(inGeom); - var results = lineToPolygon( - inGeom, - properties: properties, - ); + test( + file.path, + () { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + var properties = (inGeom is Feature) + ? inGeom.properties ?? {"stroke": "#F0F", "stroke-width": 6} + : {"stroke": "#F0F", "stroke-width": 6}; + var results = lineToPolygon( + inGeom, + properties: properties, + ); - var outPath = './' + - file.uri.pathSegments - .sublist(0, file.uri.pathSegments.length - 2) - .join('/') + - '/out/${file.uri.pathSegments.last}'; + 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)); + var outSource = File(outPath).readAsStringSync(); + var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); - if (outGeom is Feature) { - if (outGeom.geometry is Polygon) { - outGeom = - Feature(geometry: outGeom.geometry as Polygon); - } else { - outGeom = Feature( - geometry: outGeom.geometry as MultiPolygon); + if (outGeom is Feature) { + if (outGeom.geometry is Polygon) { + outGeom = + Feature(geometry: outGeom.geometry as Polygon); + } else { + outGeom = Feature( + geometry: outGeom.geometry as MultiPolygon); + } } - } - expect(results, equals(outGeom)); - }); + expect(results, equals(outGeom)); + }, + ); } test( 'Handles Errors', @@ -68,60 +70,3 @@ void main() { }, ); } - -/* -const fs = require("fs"); -const test = require("tape"); -const path = require("path"); -const load = require("load-json-file"); -const write = require("write-json-file"); -const { point, lineString } = require("@turf/helpers"); -const clone = require("@turf/clone").default; -const lineToPolygon = require("./index").default; - -const directories = { - in: path.join(__dirname, "test", "in") + path.sep, - out: path.join(__dirname, "test", "out") + path.sep, -}; - -let fixtures = fs.readdirSync(directories.in).map((filename) => { - return { - filename, - name: path.parse(filename).name, - geojson: load.sync(directories.in + filename), - }; -}); -// fixtures = fixtures.filter(fixture => fixture.name === 'multi-outGeomtrings-with-holes'); - -test("turf-outGeomtring-to-polygon", (t) => { - for (const { name, filename, geojson } of fixtures) { - const originalInput = clone(geojson); - let { autoComplete, properties, orderCoords } = geojson.properties || {}; - properties = properties || { stroke: "#F0F", "stroke-width": 6 }; - const results = lineToPolygon(geojson, { - properties: properties, - autoComplete: autoComplete, - orderCoords: orderCoords, - }); - - if (process.env.REGEN) write.sync(directories.out + filename, results); - t.deepEqual(load.sync(directories.out + filename), results, name); - t.deepEqual(originalInput, geojson); - } - // Handle Errors - t.throws(() => lineToPolygon(point([10, 5])), "throws - invalid geometry"); - t.throws(() => lineToPolygon(lineString([])), "throws - empty coordinates"); - t.assert( - lineToPolygon( - lineString([ - [10, 5], - [20, 10], - [30, 20], - ]), - { autocomplete: false } - ), - "is valid - autoComplete=false" - ); - t.end(); -}); -*/ From 885bd6d4ac717107f000dffdf06d7ea16a38b671 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Thu, 7 Jul 2022 07:35:02 +0200 Subject: [PATCH 45/72] Update impl status of feature conversion package --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d2546b1d..0916f306 100644 --- a/README.md +++ b/README.md @@ -128,9 +128,9 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] combine - [x] [explode](https://github.com/dartclub/turf_dart/blob/main/lib/src/explode.dart) - [ ] flatten -- [ ] lineToPolygon +- [x] [lineToPolygon](https://github.com/dartclub/turf_dart/blob/main/lib/src/line_to_polygon.dart) - [ ] polygonize -- [ ] polygonToLine +- [x] [polygonToLine](https://github.com/dartclub/turf_dart/blob/main/lib/src/polygon_to_line.dart) ### MISC - [ ] ellipse From f2cfcc696b55c7c2d9699e38d72047dc6ec91ee1 Mon Sep 17 00:00:00 2001 From: arman Date: Thu, 7 Jul 2022 09:26:43 +0200 Subject: [PATCH 46/72] Ports truncate package and its test (#111) * implemented * test init * moving on with the test * test finished. * comments resolved --- lib/src/meta/coord.dart | 6 +- lib/src/truncate.dart | 105 ++++++++++++ lib/truncate.dart | 3 + test/components/truncate_test.dart | 157 ++++++++++++++++++ test/examples/.DS_Store | Bin 0 -> 10244 bytes .../truncate/in/geometry-collection.geojson | 13 ++ .../truncate/in/linestring-geometry.geojson | 8 + .../truncate/in/point-elevation.geojson | 11 ++ .../truncate/in/point-geometry.geojson | 4 + test/examples/truncate/in/point.geojson | 12 ++ test/examples/truncate/in/points.geojson | 22 +++ test/examples/truncate/in/polygon.geojson | 16 ++ test/examples/truncate/in/polygons.geojson | 37 +++++ .../truncate/out/geometry-collection.geojson | 13 ++ .../truncate/out/linestring-geometry.geojson | 8 + .../truncate/out/point-elevation.geojson | 11 ++ .../truncate/out/point-geometry.geojson | 4 + test/examples/truncate/out/point.geojson | 12 ++ test/examples/truncate/out/points.geojson | 22 +++ test/examples/truncate/out/polygon.geojson | 16 ++ test/examples/truncate/out/polygons.geojson | 37 +++++ 21 files changed, 513 insertions(+), 4 deletions(-) create mode 100644 lib/src/truncate.dart create mode 100644 lib/truncate.dart create mode 100644 test/components/truncate_test.dart create mode 100644 test/examples/.DS_Store create mode 100644 test/examples/truncate/in/geometry-collection.geojson create mode 100644 test/examples/truncate/in/linestring-geometry.geojson create mode 100644 test/examples/truncate/in/point-elevation.geojson create mode 100644 test/examples/truncate/in/point-geometry.geojson create mode 100644 test/examples/truncate/in/point.geojson create mode 100644 test/examples/truncate/in/points.geojson create mode 100644 test/examples/truncate/in/polygon.geojson create mode 100644 test/examples/truncate/in/polygons.geojson create mode 100644 test/examples/truncate/out/geometry-collection.geojson create mode 100644 test/examples/truncate/out/linestring-geometry.geojson create mode 100644 test/examples/truncate/out/point-elevation.geojson create mode 100644 test/examples/truncate/out/point-geometry.geojson create mode 100644 test/examples/truncate/out/point.geojson create mode 100644 test/examples/truncate/out/points.geojson create mode 100644 test/examples/truncate/out/polygon.geojson create mode 100644 test/examples/truncate/out/polygons.geojson diff --git a/lib/src/meta/coord.dart b/lib/src/meta/coord.dart index f9712d1e..9e47bc17 100644 --- a/lib/src/meta/coord.dart +++ b/lib/src/meta/coord.dart @@ -10,10 +10,8 @@ typedef CoordEachCallback = dynamic Function( int? geometryIndex, ); -/// Iterates over coordinates in any [geoJSON] object, similar to [Iterable.forEach] -/// -/// For example: -/// +/// Iterates over coordinates in any [geoJSONObject], similar to [Iterable.forEach] +/// example: /// ```dart /// var features = FeatureCollection(features: [ /// Feature(geometry: Point(coordinates: Position.of([26, 37])), properties: {'foo': 'bar'}), diff --git a/lib/src/truncate.dart b/lib/src/truncate.dart new file mode 100644 index 00000000..5a5b1d10 --- /dev/null +++ b/lib/src/truncate.dart @@ -0,0 +1,105 @@ +import 'package:turf/helpers.dart'; +import '../meta.dart'; + +/// Takes a [Feature] or [FeatureCollection] and truncates the precision of the geometry. +/// [precision] sets the coordinate decimal precision +/// [coordinates] sets the maximum number of coordinates (primarly used to remove z coordinates) +/// [mutate] allows [GeoJSONObject] input to be mutated (significant performance increase if true) +/// Returns [GeoJSONObject] layer with truncated geometry +/// example: +/// var point = Point(coordinates: Position.of([ +/// 70.46923055566859, +/// 58.11088890802906, +/// 1508 +/// ])); +/// var truncated = truncate(point, precision: 3, coordinates: 2); +/// //=truncated.geometry.coordinates => [70.469, 58.111] +/// //addToMap +/// var addToMap = [truncated]; +GeoJSONObject truncate( + GeoJSONObject geojson, { + int precision = 6, + int coordinates = 3, + bool mutate = false, +}) { + GeoJSONObject newGeojson = mutate ? geojson : geojson.clone(); + + // Truncate Coordinates + if (coordAll(newGeojson).isNotEmpty) { + _replaceCoords(precision, coordinates, newGeojson); + return newGeojson; + } else { + return newGeojson; + } +} + +void _replaceCoords(int precision, int coordinates, GeoJSONObject geojson) { + geomEach( + geojson, + ( + GeometryType? currentGeometry, + int? featureIndex, + Map? featureProperties, + BBox? featureBBox, + dynamic featureId, + ) { + coordEach( + currentGeometry!, + ( + Position? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, + ) { + if (currentGeometry is Point) { + currentGeometry.coordinates = + _truncateCoords(currentCoord!, precision, coordinates); + } else if (currentGeometry is LineString) { + currentGeometry.coordinates[coordIndex!] = + _truncateCoords(currentCoord!, precision, coordinates); + } else if (currentGeometry is Polygon) { + currentGeometry.coordinates[geometryIndex!][coordIndex!] = + _truncateCoords(currentCoord!, precision, coordinates); + } else if (currentGeometry is MultiLineString) { + currentGeometry.coordinates[multiFeatureIndex!][coordIndex!] = + _truncateCoords(currentCoord!, precision, coordinates); + } else if (currentGeometry is MultiPolygon) { + currentGeometry.coordinates[multiFeatureIndex!][geometryIndex!] + [coordIndex!] = + _truncateCoords(currentCoord!, precision, coordinates); + } else { + (currentGeometry as GeometryCollection).geometries.forEach( + (element) { + _replaceCoords(precision, coordinates, geojson); + }, + ); + } + }, + ); + }, + ); +} + +/// Truncate Coordinates - Mutates coordinates in place +/// [factor] is the rounding factor for coordinate decimal precision +/// [coordinates] sets maximum number of coordinates (primarly used to remove z coordinates) +/// Returns mutated coordinates +Position _truncateCoords(Position coord, num factor, int coordinates) { + // Remove extra coordinates (usually elevation coordinates and more) + List list = []; + list.addAll([coord.lng, coord.lat]); + if (coord.alt != null) { + list.add(coord.alt!); + } + + if (list.length > coordinates) { + list = list.sublist(0, coordinates); + } + + // Truncate coordinate decimals + for (var i = 0; i < list.length; i++) { + list[i] = round(list[i], factor); + } + return Position.of(list); +} diff --git a/lib/truncate.dart b/lib/truncate.dart new file mode 100644 index 00000000..d50cd333 --- /dev/null +++ b/lib/truncate.dart @@ -0,0 +1,3 @@ +library truncate.dart; + +export 'src/truncate.dart'; diff --git a/test/components/truncate_test.dart b/test/components/truncate_test.dart new file mode 100644 index 00000000..1232f5dc --- /dev/null +++ b/test/components/truncate_test.dart @@ -0,0 +1,157 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/truncate.dart'; + +_testIt(GeoJSONObject inGeom, int coordinates, int precision, File file1, + File file2) { + if (inGeom is FeatureCollection) { + inGeom.features.forEach((element) { + _testIt(element, coordinates, precision, file1, file2); + }); + } + inGeom = inGeom is Feature ? inGeom.geometry! : inGeom; + test( + file2.path, + () { + var outSource = file2.readAsStringSync(); + var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); + if (outGeom is GeometryCollection) { + for (var i = 0; i < outGeom.geometries.length; i++) { + expect( + ((truncate(inGeom, + coordinates: coordinates, + precision: precision)) as GeometryCollection) + .geometries[i] + .coordinates, + equals((outGeom).geometries[i].coordinates)); + } + } else if (outGeom is Point) { + expect( + ((truncate(inGeom, coordinates: coordinates, precision: precision)) + as Point) + .coordinates, + equals((outGeom).coordinates)); + } else if (outGeom is LineString) { + for (var i = 0; i < outGeom.coordinates.length; i++) { + expect( + ((truncate(inGeom, + coordinates: coordinates, + precision: precision)) as LineString) + .coordinates[i], + equals((outGeom).coordinates[i])); + } + } else if (outGeom is Polygon || outGeom is MultiLineString) { + for (var i = 0; i < (outGeom as GeometryType).coordinates.length; i++) { + for (var j = 0; j < outGeom.coordinates.length; j++) { + expect( + ((truncate(inGeom, + coordinates: coordinates, + precision: precision)) as GeometryType) + .coordinates[i][j], + equals((outGeom).coordinates[i][j])); + } + } + } else if (outGeom is MultiPolygon) { + for (var i = 0; i < outGeom.coordinates.length; i++) { + for (var j = 0; j < outGeom.coordinates.length; j++) { + for (var k = 0; k < outGeom.coordinates.length; k++) { + expect( + ((truncate(inGeom, + coordinates: coordinates, + precision: precision)) as Polygon) + .coordinates[i][j][k], + equals((outGeom).coordinates[i][j][k])); + } + } + } + } + }, + ); +} + +main() { + group( + 'truncate', + () { + var inDir = Directory('./test/examples/truncate/in'); + for (var file in inDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + Map json = jsonDecode(inSource); + var coordinates = json['properties']?['coordinates']; + var precision = json['properties']?['precision']; + + var outDir = Directory('./test/examples/truncate/out'); + for (var file2 in outDir.listSync(recursive: true)) { + if (file2 is File && + file2.path.endsWith('.geojson') && + file2.uri.pathSegments.last == file.uri.pathSegments.last) { + _testIt(inGeom, coordinates ?? 3, precision ?? 6, file, file2); + } + } + } + } + + test( + "turf-truncate - precision & coordinates", + () { + // "precision 3" + expect( + (truncate(Point(coordinates: Position.of([50.1234567, 40.1234567])), + precision: 3) as Point) + .coordinates, + equals(Position.of([50.123, 40.123])), + ); + // "precision 0" + + expect( + (truncate(Point(coordinates: Position.of([50.1234567, 40.1234567])), + precision: 0) as Point) + .coordinates, + equals( + Position.of([50, 40]), + ), + ); + // "coordinates default to 3" + expect( + (truncate(Point(coordinates: Position.of([50, 40, 1100])), + precision: 6) as Point) + .coordinates, + equals(Position.of([50, 40, 1100])), + ); + // "coordinates 2" + expect( + (truncate(Point(coordinates: Position.of([50, 40, 1100])), + precision: 6, coordinates: 2) as Point) + .coordinates, + Position.of([50, 40]), + ); + }, + ); + + test( + "turf-truncate - prevent input mutation", + () { + var pt = Point(coordinates: Position.of([120.123, 40.123, 3000])); + Point ptBefore = pt.clone(); + Point afterPoint = truncate(pt, precision: 0) as Point; + // "does not mutate input" + expect( + (ptBefore.coordinates.lat == afterPoint.coordinates.lat && + ptBefore.coordinates.lng == afterPoint.coordinates.lng && + ptBefore.coordinates.alt == afterPoint.coordinates.alt), + false); + + // "does mutate input" + truncate(pt, precision: 0, coordinates: 2, mutate: true); + expect(pt.coordinates, + equals(Point(coordinates: Position.of([120, 40])).coordinates)); + }, + ); + }, + ); +} diff --git a/test/examples/.DS_Store b/test/examples/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0c63b13f2fe9cae5a682169f7d851bde0585b08c GIT binary patch literal 10244 zcmeHM&u$Vy82^T1SyCH0*u+bdO^k_$s`QU-h!>=IF!5ld(SsUf%L;^Lhb&NPnkJm} z4LtY?UVQ+cz(n7|2k@l7Z)PE|3!z$LO*_-fd^@w>Z)fK>znSef5RoYKs_R5H5n0G= zGnY|JNqnDkEG5F0RagN$J@n+h<4FhgOw8Lf7zPXjh5^HXVZbo(KQMrAHYaOITT>ba z3E3XFMnDS%eXa2m=pcD|ZrkZB1zyFbu>Q;MhG$4*nz^M&kGTxOe-f zN(y*Ic}eofr3(2}rhTA%lodK4H-dhT#kqQNwA1gj!?S}=PTOmAy4mbEkyuDxT1;6f zYsq?9s>^<(DK#PkIa9 zpCg~~qR#yr${~Bu8p&V_|cBG#lv3>%oO)&i Date: Thu, 7 Jul 2022 09:44:15 +0200 Subject: [PATCH 47/72] add truncate reference --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0916f306..218f5b1c 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] flip - [ ] rewind - [ ] round -- [ ] truncate +- [x] [truncate](https://github.com/dartclub/turf_dart/blob/main/lib/src/truncate.dart) ### Transformation - [ ] bboxClip From 037b03ce83743e0cd57463e701b172e39f1a35e2 Mon Sep 17 00:00:00 2001 From: arman Date: Thu, 7 Jul 2022 21:37:44 +0200 Subject: [PATCH 48/72] Ports clean_coords and its test (#112) * init * implemented * test init - imported * test, moving on * implemented points in comments * resolving comments * test done * readme updated, js removed * fix turf_equality dep, replace forEach with for * update types * trying to fix mutation * refactor, fix tests * another variance * simplified, cleaned comments * seems like it works! Co-authored-by: Lukas Himsel --- README.md | 2 +- lib/clean_coords.dart | 3 + lib/src/clean_coords.dart | 146 ++++++++++++++++ pubspec.yaml | 1 + test/components/clean_coords_test.dart | 156 ++++++++++++++++++ test/examples/.DS_Store | Bin 10244 -> 0 bytes .../cleanCoords/in/clean-segment.geojson | 11 ++ .../cleanCoords/in/closed-linestring.geojson | 12 ++ test/examples/cleanCoords/in/geometry.geojson | 24 +++ .../examples/cleanCoords/in/multiline.geojson | 25 +++ .../cleanCoords/in/multipoint.geojson | 12 ++ .../cleanCoords/in/multipolygon.geojson | 41 +++++ test/examples/cleanCoords/in/point.geojson | 8 + .../cleanCoords/in/polygon-with-hole.geojson | 28 ++++ test/examples/cleanCoords/in/polygon.geojson | 19 +++ test/examples/cleanCoords/in/segment.geojson | 12 ++ .../cleanCoords/in/simple-line.geojson | 15 ++ test/examples/cleanCoords/in/triangle.geojson | 22 +++ .../in/triplicate-issue1255.geojson | 14 ++ .../cleanCoords/out/clean-segment.geojson | 11 ++ .../cleanCoords/out/closed-linestring.geojson | 12 ++ .../examples/cleanCoords/out/geometry.geojson | 52 ++++++ .../cleanCoords/out/multiline.geojson | 17 ++ .../cleanCoords/out/multipoint.geojson | 12 ++ .../cleanCoords/out/multipolygon.geojson | 33 ++++ test/examples/cleanCoords/out/point.geojson | 8 + .../cleanCoords/out/polygon-with-hole.geojson | 23 +++ test/examples/cleanCoords/out/polygon.geojson | 16 ++ test/examples/cleanCoords/out/segment.geojson | 11 ++ .../cleanCoords/out/simple-line.geojson | 11 ++ .../examples/cleanCoords/out/triangle.geojson | 15 ++ .../out/triplicate-issue1255.geojson | 30 ++++ 32 files changed, 801 insertions(+), 1 deletion(-) create mode 100644 lib/clean_coords.dart create mode 100644 lib/src/clean_coords.dart create mode 100644 test/components/clean_coords_test.dart delete mode 100644 test/examples/.DS_Store create mode 100644 test/examples/cleanCoords/in/clean-segment.geojson create mode 100644 test/examples/cleanCoords/in/closed-linestring.geojson create mode 100644 test/examples/cleanCoords/in/geometry.geojson create mode 100644 test/examples/cleanCoords/in/multiline.geojson create mode 100644 test/examples/cleanCoords/in/multipoint.geojson create mode 100644 test/examples/cleanCoords/in/multipolygon.geojson create mode 100644 test/examples/cleanCoords/in/point.geojson create mode 100644 test/examples/cleanCoords/in/polygon-with-hole.geojson create mode 100644 test/examples/cleanCoords/in/polygon.geojson create mode 100644 test/examples/cleanCoords/in/segment.geojson create mode 100644 test/examples/cleanCoords/in/simple-line.geojson create mode 100644 test/examples/cleanCoords/in/triangle.geojson create mode 100644 test/examples/cleanCoords/in/triplicate-issue1255.geojson create mode 100644 test/examples/cleanCoords/out/clean-segment.geojson create mode 100644 test/examples/cleanCoords/out/closed-linestring.geojson create mode 100644 test/examples/cleanCoords/out/geometry.geojson create mode 100644 test/examples/cleanCoords/out/multiline.geojson create mode 100644 test/examples/cleanCoords/out/multipoint.geojson create mode 100644 test/examples/cleanCoords/out/multipolygon.geojson create mode 100644 test/examples/cleanCoords/out/point.geojson create mode 100644 test/examples/cleanCoords/out/polygon-with-hole.geojson create mode 100644 test/examples/cleanCoords/out/polygon.geojson create mode 100644 test/examples/cleanCoords/out/segment.geojson create mode 100644 test/examples/cleanCoords/out/simple-line.geojson create mode 100644 test/examples/cleanCoords/out/triangle.geojson create mode 100644 test/examples/cleanCoords/out/triplicate-issue1255.geojson diff --git a/README.md b/README.md index 218f5b1c..858f5441 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] greatCircle ### Coordinate Mutation -- [ ] cleanCoords +- [x] [cleanCoords](https://github.com/dartclub/turf_dart/blob/main/lib/src/clean_coords.dart) - [ ] flip - [ ] rewind - [ ] round diff --git a/lib/clean_coords.dart b/lib/clean_coords.dart new file mode 100644 index 00000000..7c61dea5 --- /dev/null +++ b/lib/clean_coords.dart @@ -0,0 +1,3 @@ +library clean_coords.dart; + +export 'src/clean_coords.dart'; diff --git a/lib/src/clean_coords.dart b/lib/src/clean_coords.dart new file mode 100644 index 00000000..5ee1b37e --- /dev/null +++ b/lib/src/clean_coords.dart @@ -0,0 +1,146 @@ +import '../helpers.dart'; +import 'invariant.dart'; + +/// Removes redundant coordinates from any [GeometryType]. +/// Takes a [Feature] or [GeometryType] +/// [mutate] allows GeoJSON input to be mutated +/// Returns the cleaned input [Feature] +/// example: +/// ```dart +/// var line = LineString(coordinates:[Position.of([0, 0]), Position.of([0, 2]), Position.of([0, 5]), Position.of([0, 8]), Position.of([0, 8]), Position.of([0, 10])]); +/// var multiPoint = MultiPoint(coordinates:[Position.of([0, 0]), Position.of([0, 0]), Position.of([2, 2])]); +/// cleanCoords(line).geometry.coordinates; +/// //= [Position.of([0, 0]), Position.of([0, 10])] +/// cleanCoords(multiPoint).geometry.coordinates; +/// //= [Position.of([0, 0]), Position.of([2, 2])] +/// ``` +Feature cleanCoords( + GeoJSONObject geojson, { + bool mutate = false, +}) { + if (geojson is Feature && geojson.geometry == null) { + throw Exception("Geometry of the Feature is null"); + } + GeometryObject geom = + geojson is Feature ? geojson.geometry! : geojson as GeometryObject; + geom = mutate ? geom : geom.clone() as GeometryObject; + + if (geojson is GeometryCollection || geojson is FeatureCollection) { + throw Exception("${geojson.type} is not supported"); + } else if (geom is LineString) { + var newCoords = _cleanLine(geom.coordinates, geojson); + geom.coordinates = newCoords; + } else if (geom is MultiLineString || geom is Polygon) { + var newCoords = >[]; + for (var coord in (getCoords(geom) as List>)) { + newCoords.add(_cleanLine(coord, geom)); + } + (geom as GeometryType).coordinates = newCoords; + } else if (geom is MultiPolygon) { + var newCoords = >>[]; + for (var polyList in (getCoords(geom) as List>>)) { + var listPoly = >[]; + for (var poly in polyList) { + listPoly.add(_cleanLine(poly, geom)); + } + newCoords.add(listPoly); + } + geom.coordinates = newCoords; + } else if (geom is MultiPoint) { + var newCoords = []; + Set set = {}; + var list = getCoords(geom) as List; + for (var element in list) { + if (!set.contains([element.alt, element.lat, element.lng].join('-'))) { + newCoords.add(element); + } + set.add([element.alt, element.lat, element.lng].join('-')); + } + geom.coordinates = newCoords; + } + + if (geojson is GeometryType) { + return Feature(geometry: geom); + } else if (geojson is Feature) { + if (mutate) { + return geojson; + } else { + return Feature( + geometry: geom, + properties: Map.of(geojson.properties ?? {}), + bbox: geojson.bbox?.clone(), + id: geojson.id, + ); + } + } else { + throw Exception('${geojson.type} is not a supported type'); + } +} + +List _cleanLine(List coords, GeoJSONObject geojson) { + // handle "clean" segment + if (coords.length == 2 && coords[0] != coords[1]) { + return coords; + } + + var newPoints = []; + int secondToLast = coords.length - 1; + int newPointsLength = newPoints.length; + + newPoints.add(coords[0]); + for (int i = 1; i < secondToLast; i++) { + var prevAddedPoint = newPoints[newPoints.length - 1]; + if (coords[i] == prevAddedPoint) { + continue; + } else { + newPoints.add(coords[i]); + newPointsLength = newPoints.length; + if (newPointsLength > 2) { + if (isPointOnLineSegment(newPoints[newPointsLength - 3], + newPoints[newPointsLength - 1], newPoints[newPointsLength - 2])) { + newPoints.removeAt(newPoints.length - 2); + } + } + } + } + newPoints.add(coords[coords.length - 1]); + newPointsLength = newPoints.length; + + // (Multi)Polygons must have at least 4 points, but a closed LineString with only 3 points is acceptable + if ((geojson is Polygon || geojson is MultiPolygon) && + coords[0] == coords[coords.length - 1] && + newPointsLength < 4) { + throw Exception("invalid polygon"); + } + + if (isPointOnLineSegment(newPoints[newPointsLength - 3], + newPoints[newPointsLength - 1], newPoints[newPointsLength - 2])) { + newPoints.removeAt(newPoints.length - 2); + } + return newPoints; +} + +/// Returns if [point] is on the segment between [start] and [end]. +/// Borrowed from `booleanPointOnLine` to speed up the evaluation (instead of +/// using the module as dependency). +/// [start] is the coord pair of start of line, [end] is the coord pair of end +/// of line, and [point] is the coord pair of point to check. +bool isPointOnLineSegment(Position start, Position end, Position point) { + var x = point.lat, y = point.lng; + var startX = start.lat, startY = start.lng; + var endX = end.lat, endY = end.lng; + + var dxc = x - startX; + var dyc = y - startY; + var dxl = endX - startX; + var dyl = endY - startY; + var cross = dxc * dyl - dyc * dxl; + + if (cross != 0) { + return false; + } else if ((dxl).abs() >= (dyl).abs()) { + return dxl > 0 ? startX <= x && x <= endX : endX <= x && x <= startX; + } else { + return dyl > 0 ? startY <= y && y <= endY : endY <= y && y <= startY; + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 3809d44e..366837ef 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,6 +8,7 @@ repository: https://github.com/dartclub/turf_dart dependencies: json_annotation: ^4.4.0 + turf_equality: ^0.0.1 dev_dependencies: dartclub_lint: ^0.4.2 diff --git a/test/components/clean_coords_test.dart b/test/components/clean_coords_test.dart new file mode 100644 index 00000000..f631059b --- /dev/null +++ b/test/components/clean_coords_test.dart @@ -0,0 +1,156 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/clean_coords.dart'; +import 'package:turf/src/truncate.dart'; +import 'package:turf_equality/turf_equality.dart'; + +main() { + group( + 'cleanCoords', + () { + var inDir = Directory('./test/examples/cleanCoords/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)); + Feature results = cleanCoords(inGeom); + 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-clean-coords -- extras", + () { + expect( + ((cleanCoords(Point(coordinates: Position.of([0, 0])))).geometry! + as GeometryType) + .coordinates + .length, + 2); + expect( + (cleanCoords(LineString( + coordinates: [ + Position.of([0, 0]), + Position.of([1, 1]), + Position.of([2, 2]), + ], + )).geometry! as GeometryType) + .coordinates + .length, + 2); + expect( + ((cleanCoords(Polygon( + coordinates: [ + [ + Position.of([0, 0]), + Position.of([1, 1]), + Position.of([2, 2]), + Position.of([0, 2]), + Position.of([0, 0]), + ], + ], + ))).geometry! as GeometryType) + .coordinates[0] + .length, + 4); + expect( + ((cleanCoords(MultiPoint( + coordinates: [ + Position.of([0, 0]), + Position.of([0, 0]), + Position.of([2, 2]), + ], + ))).geometry! as GeometryType) + .coordinates + .length, + 2, + ); + }, + ); + + test( + "turf-clean-coords -- truncate", + () { + expect( + (cleanCoords(truncate( + LineString( + coordinates: [ + Position.of([0, 0]), + Position.of([1.1, 1.123]), + Position.of([2.12, 2.32]), + Position.of([3, 3]), + ], + ), + precision: 0)) + .geometry! as GeometryType) + .coordinates + .length, + 2, + ); + }, + ); + + test( + "turf-clean-coords -- prevent input mutation", + () { + var line = LineString( + coordinates: [ + Position.of([0, 0]), + Position.of([1, 1]), + Position.of([2, 2]), + ], + ); + var lineBefore = line.clone(); + cleanCoords(line); + Equality eq = Equality(); + expect(eq.compare(line, lineBefore), true); + + var multiPoly = MultiPolygon( + coordinates: [ + [ + [ + Position.of([0, 0]), + Position.of([1, 1]), + Position.of([2, 2]), + Position.of([2, 0]), + Position.of([0, 0]), + ], + ], + [ + [ + Position.of([0, 0]), + Position.of([0, 5]), + Position.of([5, 5]), + Position.of([5, 5]), + Position.of([5, 0]), + Position.of([0, 0]), + ], + ], + ], + ); + var multiPolyBefore = multiPoly.clone(); + cleanCoords(multiPoly); + Equality eq1 = Equality(); + + expect(eq1.compare(multiPolyBefore, multiPoly), true); + }, + ); + }, + ); +} diff --git a/test/examples/.DS_Store b/test/examples/.DS_Store deleted file mode 100644 index 0c63b13f2fe9cae5a682169f7d851bde0585b08c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHM&u$Vy82^T1SyCH0*u+bdO^k_$s`QU-h!>=IF!5ld(SsUf%L;^Lhb&NPnkJm} z4LtY?UVQ+cz(n7|2k@l7Z)PE|3!z$LO*_-fd^@w>Z)fK>znSef5RoYKs_R5H5n0G= zGnY|JNqnDkEG5F0RagN$J@n+h<4FhgOw8Lf7zPXjh5^HXVZbo(KQMrAHYaOITT>ba z3E3XFMnDS%eXa2m=pcD|ZrkZB1zyFbu>Q;MhG$4*nz^M&kGTxOe-f zN(y*Ic}eofr3(2}rhTA%lodK4H-dhT#kqQNwA1gj!?S}=PTOmAy4mbEkyuDxT1;6f zYsq?9s>^<(DK#PkIa9 zpCg~~qR#yr${~Bu8p&V_|cBG#lv3>%oO)&i Date: Thu, 7 Jul 2022 23:07:24 +0200 Subject: [PATCH 49/72] Debugs GeometryCollection condition in truncate (#121) * implemented * test init * moving on with the test * test finished. * comments resolved * updated readme.md * changed from forEach to for and used the element * changed forEach to a for loop * variable name changed - resolving a comment * rid of redundant case for GeometryCollection, test Co-authored-by: Lukas Himsel --- lib/src/truncate.dart | 16 +- test/components/truncate_test.dart | 137 ++++++------------ test/examples/.DS_Store | Bin 0 -> 10244 bytes .../in/geometry-collection-in-feature.geojson | 24 +++ .../geometry-collection-in-feature.geojson | 24 +++ 5 files changed, 97 insertions(+), 104 deletions(-) create mode 100644 test/examples/.DS_Store create mode 100644 test/examples/truncate/in/geometry-collection-in-feature.geojson create mode 100644 test/examples/truncate/out/geometry-collection-in-feature.geojson diff --git a/lib/src/truncate.dart b/lib/src/truncate.dart index 5a5b1d10..1d1b6f66 100644 --- a/lib/src/truncate.dart +++ b/lib/src/truncate.dart @@ -22,14 +22,14 @@ GeoJSONObject truncate( int coordinates = 3, bool mutate = false, }) { - GeoJSONObject newGeojson = mutate ? geojson : geojson.clone(); + GeoJSONObject geom = mutate ? geojson : geojson.clone(); // Truncate Coordinates - if (coordAll(newGeojson).isNotEmpty) { - _replaceCoords(precision, coordinates, newGeojson); - return newGeojson; + if (coordAll(geom).isNotEmpty) { + _replaceCoords(precision, coordinates, geom); + return geom; } else { - return newGeojson; + return geom; } } @@ -68,12 +68,6 @@ void _replaceCoords(int precision, int coordinates, GeoJSONObject geojson) { currentGeometry.coordinates[multiFeatureIndex!][geometryIndex!] [coordIndex!] = _truncateCoords(currentCoord!, precision, coordinates); - } else { - (currentGeometry as GeometryCollection).geometries.forEach( - (element) { - _replaceCoords(precision, coordinates, geojson); - }, - ); } }, ); diff --git a/test/components/truncate_test.dart b/test/components/truncate_test.dart index 1232f5dc..10d2958d 100644 --- a/test/components/truncate_test.dart +++ b/test/components/truncate_test.dart @@ -4,73 +4,7 @@ import 'dart:io'; import 'package:test/test.dart'; import 'package:turf/helpers.dart'; import 'package:turf/truncate.dart'; - -_testIt(GeoJSONObject inGeom, int coordinates, int precision, File file1, - File file2) { - if (inGeom is FeatureCollection) { - inGeom.features.forEach((element) { - _testIt(element, coordinates, precision, file1, file2); - }); - } - inGeom = inGeom is Feature ? inGeom.geometry! : inGeom; - test( - file2.path, - () { - var outSource = file2.readAsStringSync(); - var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); - if (outGeom is GeometryCollection) { - for (var i = 0; i < outGeom.geometries.length; i++) { - expect( - ((truncate(inGeom, - coordinates: coordinates, - precision: precision)) as GeometryCollection) - .geometries[i] - .coordinates, - equals((outGeom).geometries[i].coordinates)); - } - } else if (outGeom is Point) { - expect( - ((truncate(inGeom, coordinates: coordinates, precision: precision)) - as Point) - .coordinates, - equals((outGeom).coordinates)); - } else if (outGeom is LineString) { - for (var i = 0; i < outGeom.coordinates.length; i++) { - expect( - ((truncate(inGeom, - coordinates: coordinates, - precision: precision)) as LineString) - .coordinates[i], - equals((outGeom).coordinates[i])); - } - } else if (outGeom is Polygon || outGeom is MultiLineString) { - for (var i = 0; i < (outGeom as GeometryType).coordinates.length; i++) { - for (var j = 0; j < outGeom.coordinates.length; j++) { - expect( - ((truncate(inGeom, - coordinates: coordinates, - precision: precision)) as GeometryType) - .coordinates[i][j], - equals((outGeom).coordinates[i][j])); - } - } - } else if (outGeom is MultiPolygon) { - for (var i = 0; i < outGeom.coordinates.length; i++) { - for (var j = 0; j < outGeom.coordinates.length; j++) { - for (var k = 0; k < outGeom.coordinates.length; k++) { - expect( - ((truncate(inGeom, - coordinates: coordinates, - precision: precision)) as Polygon) - .coordinates[i][j][k], - equals((outGeom).coordinates[i][j][k])); - } - } - } - } - }, - ); -} +import 'package:turf_equality/turf_equality.dart'; main() { group( @@ -90,7 +24,21 @@ main() { if (file2 is File && file2.path.endsWith('.geojson') && file2.uri.pathSegments.last == file.uri.pathSegments.last) { - _testIt(inGeom, coordinates ?? 3, precision ?? 6, file, file2); + test( + file2.path, + () { + var outSource = file2.readAsStringSync(); + var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); + Equality eq = Equality(); + expect( + eq.compare( + truncate(inGeom, + coordinates: coordinates ?? 3, + precision: precision ?? 6), + outGeom), + true); + }, + ); } } } @@ -99,37 +47,39 @@ main() { test( "turf-truncate - precision & coordinates", () { + Equality eq = Equality(); // "precision 3" expect( - (truncate(Point(coordinates: Position.of([50.1234567, 40.1234567])), - precision: 3) as Point) - .coordinates, - equals(Position.of([50.123, 40.123])), - ); + eq.compare( + truncate( + Point(coordinates: Position.of([50.1234567, 40.1234567])), + precision: 3), + Point(coordinates: Position.of([50.123, 40.123])), + ), + true); // "precision 0" - expect( - (truncate(Point(coordinates: Position.of([50.1234567, 40.1234567])), - precision: 0) as Point) - .coordinates, - equals( - Position.of([50, 40]), - ), - ); + eq.compare( + truncate( + Point(coordinates: Position.of([50.1234567, 40.1234567])), + precision: 0), + Point(coordinates: Position.of([50, 40]))), + true); // "coordinates default to 3" expect( - (truncate(Point(coordinates: Position.of([50, 40, 1100])), - precision: 6) as Point) - .coordinates, - equals(Position.of([50, 40, 1100])), - ); + eq.compare( + truncate(Point(coordinates: Position.of([50, 40, 1100])), + precision: 6), + Point(coordinates: Position.of([50, 40, 1100]))), + true); // "coordinates 2" expect( - (truncate(Point(coordinates: Position.of([50, 40, 1100])), - precision: 6, coordinates: 2) as Point) - .coordinates, - Position.of([50, 40]), - ); + eq.compare( + truncate(Point(coordinates: Position.of([50, 40, 1100])), + precision: 6, coordinates: 2), + Point(coordinates: Position.of([50, 40])), + ), + true); }, ); @@ -148,8 +98,9 @@ main() { // "does mutate input" truncate(pt, precision: 0, coordinates: 2, mutate: true); - expect(pt.coordinates, - equals(Point(coordinates: Position.of([120, 40])).coordinates)); + Equality eq = Equality(); + expect( + eq.compare(pt, Point(coordinates: Position.of([120, 40]))), true); }, ); }, diff --git a/test/examples/.DS_Store b/test/examples/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0c63b13f2fe9cae5a682169f7d851bde0585b08c GIT binary patch literal 10244 zcmeHM&u$Vy82^T1SyCH0*u+bdO^k_$s`QU-h!>=IF!5ld(SsUf%L;^Lhb&NPnkJm} z4LtY?UVQ+cz(n7|2k@l7Z)PE|3!z$LO*_-fd^@w>Z)fK>znSef5RoYKs_R5H5n0G= zGnY|JNqnDkEG5F0RagN$J@n+h<4FhgOw8Lf7zPXjh5^HXVZbo(KQMrAHYaOITT>ba z3E3XFMnDS%eXa2m=pcD|ZrkZB1zyFbu>Q;MhG$4*nz^M&kGTxOe-f zN(y*Ic}eofr3(2}rhTA%lodK4H-dhT#kqQNwA1gj!?S}=PTOmAy4mbEkyuDxT1;6f zYsq?9s>^<(DK#PkIa9 zpCg~~qR#yr${~Bu8p&V_|cBG#lv3>%oO)&i Date: Thu, 7 Jul 2022 23:13:07 +0200 Subject: [PATCH 50/72] close #116 - add src path to README --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 858f5441..18c4b08b 100644 --- a/README.md +++ b/README.md @@ -75,17 +75,17 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the ### Measurement - [ ] along - [ ] area -- [x] [bbox](https://github.com/dartclub/turf_dart/blob/main/lib/bbox.dart) -- [x] [bboxPolygon](https://github.com/dartclub/turf_dart/blob/main/lib/bbox_polygon.dart) -- [x] [bearing](https://github.com/dartclub/turf_dart/blob/main/lib/bearing.dart) +- [x] [bbox](https://github.com/dartclub/turf_dart/blob/main/lib/src/bbox.dart) +- [x] [bboxPolygon](https://github.com/dartclub/turf_dart/blob/main/lib/src/bbox_polygon.dart) +- [x] [bearing](https://github.com/dartclub/turf_dart/blob/main/lib/src/bearing.dart) - [x] [center](https://github.com/Dennis-Mwea/turf_dart/blob/main/lib/src/center.dart) - [ ] centerOfMass - [ ] centroid -- [x] [destination](https://github.com/dartclub/turf_dart/blob/main/lib/destination.dart) -- [x] [distance](https://github.com/dartclub/turf_dart/blob/main/lib/distance.dart) +- [x] [destination](https://github.com/dartclub/turf_dart/blob/main/lib/src/destination.dart) +- [x] [distance](https://github.com/dartclub/turf_dart/blob/main/lib/src/distance.dart) - [ ] envelope - [ ] length -- [x] [midpoint](https://github.com/dartclub/turf_dart/blob/main/lib/midpoint.dart) +- [x] [midpoint](https://github.com/dartclub/turf_dart/blob/main/lib/src/midpoint.dart) - [ ] pointOnFeature - [ ] polygonTangents - [ ] pointToLineDistance @@ -144,7 +144,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] lineSliceAlong - [ ] lineSplit - [ ] mask -- [x] [nearestPointOnLine](https://github.com/dartclub/turf_dart/blob/master/lib/nearest_point_on_line.dart) +- [x] [nearestPointOnLine](https://github.com/dartclub/turf_dart/blob/main/lib/src/nearest_point_on_line.dart) - [ ] sector - [ ] shortestPath - [ ] unkinkPolygon @@ -176,7 +176,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] triangleGrid ### Classification -- [x] [nearestPoint](https://github.com/dartclub/turf_dart/blob/main/lib/nearest_point.dart) +- [x] [nearestPoint](https://github.com/dartclub/turf_dart/blob/main/lib/src/nearest_point.dart) ### Aggregation - [ ] collect From 78f68e98c2f392cc3db71311a4825fb60c553085 Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Thu, 7 Jul 2022 23:22:43 +0200 Subject: [PATCH 51/72] update changelog, bump version for release --- CHANGELOG.md | 13 +++++++++++++ pubspec.yaml | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37ae4adb..383fc3c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,19 @@ +## 0.0.7 + +- Implements `nearestPointOn(Multi)Line` [#87](https://github.com/dartclub/turf_dart/pull/87) +- Implements `explode` function [#93](https://github.com/dartclub/turf_dart/pull/93) +- Implements `bbox-polygon` and `bbox`, `center`, polyline functions [#99](https://github.com/dartclub/turf_dart/pull/99) +- Updates the `BBox`-class constructor [#100](https://github.com/dartclub/turf_dart/pull/100) +- Implements `rhumbBearing` function [#109](https://github.com/dartclub/turf_dart/pull/109) +- Implements `lineToPolygon` and `polygonToLine` functions [#104](https://github.com/dartclub/turf_dart/pull/104) +- Implements `truncate` function [#111](https://github.com/dartclub/turf_dart/pull/111) +- Implements `cleanCoord` function [#112](https://github.com/dartclub/turf_dart/pull/112) +- Some documentation & README improvements + ## 0.0.6+3 - Rename examples file + ## 0.0.6+2 - Added code examples diff --git a/pubspec.yaml b/pubspec.yaml index 366837ef..7fe12315 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.6+3 +version: 0.0.7 environment: sdk: '>=2.12.0 <3.0.0' homepage: https://github.com/dartclub/turf_dart From 5770e4cc04640ad13a83ad99533539aece7fe750 Mon Sep 17 00:00:00 2001 From: yardenfi Date: Thu, 28 Jul 2022 21:27:35 +0300 Subject: [PATCH 52/72] Added support for the area function (#123) * Added the area function * made the geometry to be of type GeometryType * fixed the test and added a benchmark test * fixed the area docs * added some more tests * Marked functions as private and fixed documentation * fixed documentation * added exception in case of unsupported geometry type, formatted the code and removed some redundant code Co-authored-by: yarden --- README.md | 2 +- benchmark/area_benchmark.dart | 25 +++++++ lib/area.dart | 3 + lib/src/area.dart | 116 +++++++++++++++++++++++++++++++++ lib/turf.dart | 1 + test/components/area_test.dart | 74 +++++++++++++++++++++ 6 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 benchmark/area_benchmark.dart create mode 100644 lib/area.dart create mode 100644 lib/src/area.dart create mode 100644 test/components/area_test.dart diff --git a/README.md b/README.md index 18c4b08b..e4ab3746 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the ### Measurement - [ ] along -- [ ] area +- [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) - [x] [bboxPolygon](https://github.com/dartclub/turf_dart/blob/main/lib/src/bbox_polygon.dart) - [x] [bearing](https://github.com/dartclub/turf_dart/blob/main/lib/src/bearing.dart) diff --git a/benchmark/area_benchmark.dart b/benchmark/area_benchmark.dart new file mode 100644 index 00000000..60c0fc6c --- /dev/null +++ b/benchmark/area_benchmark.dart @@ -0,0 +1,25 @@ +import 'package:benchmark/benchmark.dart'; +import 'package:turf/turf.dart'; + +Feature poly = Feature( + geometry: Polygon(coordinates: [ + [ + Position(125, -15), + Position(113, -22), + Position(117, -37), + Position(130, -33), + Position(148, -39), + Position(154, -27), + Position(144, -15), + Position(125, -15) + ] + ]), +); + +main() { + group('area', () { + benchmark('simple', () { + area(poly); + }); + }); +} diff --git a/lib/area.dart b/lib/area.dart new file mode 100644 index 00000000..ebd1ae10 --- /dev/null +++ b/lib/area.dart @@ -0,0 +1,3 @@ +library turf_area; + +export "src/area.dart"; diff --git a/lib/src/area.dart b/lib/src/area.dart new file mode 100644 index 00000000..1036873d --- /dev/null +++ b/lib/src/area.dart @@ -0,0 +1,116 @@ +import 'dart:math'; + +import '../helpers.dart'; +import '../meta.dart'; + +/// Takes a [GeoJSONObject] and returns their area in square meters. +/// +/// ```dart +/// Feature poly = Feature( +/// geometry: Polygon(coordinates: [ +/// [ +/// Position(125, -15), +/// Position(113, -22), +/// Position(117, -37), +/// Position(130, -33), +/// Position(148, -39), +/// Position(154, -27), +/// Position(144, -15), +/// Position(125, -15) +/// ] +/// ]), +/// ); +/// +/// var area = turf.area(polygon); +/// ``` +num? area(GeoJSONObject geojson) { + return geomReduce(geojson, (value, geom, _, __, ___, ____) { + return value! + _calculateArea(geom!); + }, 0); +} + +/// Calculate Area +num _calculateArea(GeometryType geom) { + num total = 0; + switch (geom.type) { + case GeoJSONObjectType.polygon: + return _polygonArea((geom as Polygon).coordinates); + case GeoJSONObjectType.multiPolygon: + geom as MultiPolygon; + for (var i = 0; i < geom.coordinates.length; i++) { + total += _polygonArea(geom.coordinates[i]); + } + return total; + case GeoJSONObjectType.point: + case GeoJSONObjectType.multiPoint: + case GeoJSONObjectType.lineString: + case GeoJSONObjectType.multiLineString: + return 0; + default: + throw Exception('unsupported type ${geom.type}'); + } +} + +num _polygonArea(List> coords) { + num total = 0; + if (coords.isNotEmpty) { + total += _ringArea(coords[0]).abs(); + for (var i = 1; i < coords.length; i++) { + total -= _ringArea(coords[i]).abs(); + } + } + return total; +} + +/// +/// Calculate the approximate area of the [Polygon] were it projected onto the earth in square meters. +/// +/// Note that the area will be positive if ring is oriented clockwise, otherwise it will be negative. +/// +/// Reference: +/// Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for Polygons on a Sphere", +/// JPL Publication 07-03, Jet Propulsion +/// Laboratory, Pasadena, CA, June 2007 https://trs.jpl.nasa.gov/handle/2014/40409 +num _ringArea(List coords) { + Position p1; + Position p2; + Position p3; + int lowerIndex; + int middleIndex; + int upperIndex; + int i; + num total = 0; + final coordsLength = coords.length; + + if (coordsLength > 2) { + for (i = 0; i < coordsLength; i++) { + if (i == coordsLength - 2) { + // i = N-2 + lowerIndex = coordsLength - 2; + middleIndex = coordsLength - 1; + upperIndex = 0; + } else if (i == coordsLength - 1) { + // i = N-1 + lowerIndex = coordsLength - 1; + middleIndex = 0; + upperIndex = 1; + } else { + // i = 0 to N-3 + lowerIndex = i; + middleIndex = i + 1; + upperIndex = i + 2; + } + p1 = coords[lowerIndex]; + p2 = coords[middleIndex]; + p3 = coords[upperIndex]; + total += (_rad(p3[0]!) - _rad(p1[0]!)) * sin(_rad(p2[1]!)); + } + + total = (total * earthRadius * earthRadius) / 2; + } + return total; +} + +num _rad(num number) { + return (number * pi) / 180; +} diff --git a/lib/turf.dart b/lib/turf.dart index bccc157a..f709df2c 100644 --- a/lib/turf.dart +++ b/lib/turf.dart @@ -1,5 +1,6 @@ library turf; +export 'src/area.dart'; export 'src/bbox.dart'; export 'src/bearing.dart'; export 'src/center.dart'; diff --git a/test/components/area_test.dart b/test/components/area_test.dart new file mode 100644 index 00000000..d15a2932 --- /dev/null +++ b/test/components/area_test.dart @@ -0,0 +1,74 @@ +import 'package:test/test.dart'; +import 'package:turf/turf.dart'; + +main() { + group('area', () { + final position1 = Position(0, 0); + final position2 = Position(0, 1); + final positions = [position1, position2]; + final point = Point(coordinates: position1); + final multiPoint = MultiPoint(coordinates: positions); + final lineString = LineString(coordinates: positions); + final multiLineString = LineString(coordinates: positions); + List zeroAreaGeometries = [ + point, + multiPoint, + lineString, + multiLineString + ]; + + final geometryCollection = + GeometryCollection(geometries: zeroAreaGeometries); + + Polygon polygon = Polygon(coordinates: [ + [ + Position(125, -15), + Position(113, -22), + Position(117, -37), + Position(130, -33), + Position(148, -39), + Position(154, -27), + Position(144, -15), + Position(125, -15) + ] + ]); + + test('test area of polygon', () { + var areaResult = area(polygon); + expect(areaResult, isNot(equals(null))); + final roundedResult = round(areaResult!); + expect(roundedResult, equals(7748891609977)); + }); + + test( + 'test area of polygon equals to the area of a feature and a feature collection that includes it', + () { + var polygonAreaResult = round(area(polygon)!); + var featureAreaResult = round(area(Feature(geometry: polygon))!); + var featureCollectionAreaResult = round( + area(FeatureCollection(features: [Feature(geometry: polygon)]))!); + expect(polygonAreaResult, equals(featureAreaResult)); + expect(featureCollectionAreaResult, equals(featureAreaResult)); + }); + + test('test area of polygon feature', () { + var areaResult = area(polygon); + expect(areaResult, isNot(equals(null))); + final roundedResult = round(areaResult!); + expect(roundedResult, equals(7748891609977)); + }); + + test('area of point, multiPoint, lineString and multiLineString are 0', () { + expect(area(point), equals(0)); + expect(area(multiPoint), equals(0)); + expect(area(lineString), equals(0)); + expect(area(multiLineString), equals(0)); + }); + + test( + 'area of geometry collection of (point, multiPoint, lineString and multiLineString) is 0', + () { + expect(area(geometryCollection), equals(0)); + }); + }); +} From f503b90ed1d15be49bce44145e5e164af8fdaf3c Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Mon, 22 Aug 2022 10:05:46 +0200 Subject: [PATCH 53/72] Implement polygon-smooth and its tests (#127) * initial implementation, and refactor * finished test and benchmark impl * reference in README --- README.md | 22 +- benchmark/polygon_smooth_benchmark.dart | 21 + lib/polygon_smooth.dart | 3 + lib/src/line_to_polygon.dart | 30 +- lib/src/polygon_smooth.dart | 152 +++++++ lib/src/polygon_to_line.dart | 4 +- test/components/polygon_smooth_test.dart | 49 ++ test/examples/polygonSmooth/in/close.geojson | 59 +++ .../polygonSmooth/in/geometry.geojson | 47 ++ .../polygonSmooth/in/multipolygon.geojson | 53 +++ .../in/multipolygonWithHole.geojson | 30 ++ .../examples/polygonSmooth/in/polygon.geojson | 21 + .../polygonSmooth/in/withHole.geojson | 49 ++ test/examples/polygonSmooth/out/close.geojson | 372 ++++++++++++++++ .../polygonSmooth/out/geometry.geojson | 308 +++++++++++++ .../polygonSmooth/out/multipolygon.geojson | 286 ++++++++++++ .../out/multipolygonWithHole.geojson | 420 ++++++++++++++++++ .../polygonSmooth/out/polygon.geojson | 308 +++++++++++++ .../polygonSmooth/out/withHole.geojson | 282 ++++++++++++ 19 files changed, 2497 insertions(+), 19 deletions(-) create mode 100644 benchmark/polygon_smooth_benchmark.dart create mode 100644 lib/polygon_smooth.dart create mode 100644 lib/src/polygon_smooth.dart create mode 100644 test/components/polygon_smooth_test.dart create mode 100644 test/examples/polygonSmooth/in/close.geojson create mode 100644 test/examples/polygonSmooth/in/geometry.geojson create mode 100644 test/examples/polygonSmooth/in/multipolygon.geojson create mode 100644 test/examples/polygonSmooth/in/multipolygonWithHole.geojson create mode 100644 test/examples/polygonSmooth/in/polygon.geojson create mode 100644 test/examples/polygonSmooth/in/withHole.geojson create mode 100644 test/examples/polygonSmooth/out/close.geojson create mode 100644 test/examples/polygonSmooth/out/geometry.geojson create mode 100644 test/examples/polygonSmooth/out/multipolygon.geojson create mode 100644 test/examples/polygonSmooth/out/multipolygonWithHole.geojson create mode 100644 test/examples/polygonSmooth/out/polygon.geojson create mode 100644 test/examples/polygonSmooth/out/withHole.geojson diff --git a/README.md b/README.md index e4ab3746..e63bbfeb 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 00000000..a3b5dcbb --- /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 00000000..7d38df1f --- /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 c26028f5..bf537dad 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 00000000..d55930f1 --- /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 aee62570..a1b6d65b 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 00000000..73379b9e --- /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 00000000..fef3e9d4 --- /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 00000000..55b48a97 --- /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 00000000..e16da199 --- /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 00000000..1f437348 --- /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 00000000..fd05344e --- /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 00000000..03fab4b8 --- /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 00000000..40f153a9 --- /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 00000000..04c6ae7b --- /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 00000000..222700c7 --- /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 00000000..b93542c3 --- /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 00000000..04c6ae7b --- /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 00000000..bf763d15 --- /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 From b17c9bf1960d9b6b34906508420e95918bd8565b Mon Sep 17 00:00:00 2001 From: arman Date: Sun, 11 Sep 2022 18:31:45 +0200 Subject: [PATCH 54/72] Port boolean functions and tests (#91) * in process - early analysis of the work * linked the meta functions in readme * CONTRIBUTING.md * links to the sources * edited typos * documentation work * closes #77, closes #16 * proofread * improves pub.dev score, closes #79, #78, #75 * Added deleted model, complemented contributing.md * booleans init * initial import * boolean_touches * valid - wip * within - init * rewiring the translated code * contains etc. * touches * valid * dependencies imported * Update CONTRIBUTING.md * clockwise test * concave test * intersect test * pointOnLine test * contains * crosses_test - blocked by findIntersections * boolean_contain * boolean_within * rhumb_bearing * rhumb_bearing\'s test - incomplete * rhumb_bearing's test - done, added to lib/bearing * boolean_contains, boolean_parallel, IP * working on contain - removed usages of runtimeType * rewriting pointInLine * tests reverted to false/true folder style * restructuring, clean-up * clockwise and its test, documentation * concave finalized * PointInPolygon plus test, dart format * removed the commented JS lines * return type added * disjoint and test - not done, depends on sweepline * equal implement, test, has dependencies * moving on * clean coords init * cleanCoord implemented, going to new branch * moving on with equal * update turf_equality dep * moving forward * refactors boolean_equal * #88 crosses, disjoint, equal, intersects, pip @lukas-h * cleanup on #88 * progress on overlap * bool: overlap,parallel,valid,touches & lineOverlap * issue with test is worked on * still at porting the overlap test * done: parallel * working on valid * touches done * valid - got stuck * progress on within * moved on with valid, refactored * valid test * lineIntersection testet - contains sweepline * package publishabe, rm git deps, fix equality dep * update params in equality * mod. on valid to cover the std. - MutiPs' 'finite' * RFCs resolved - readied for merge * return type of getGeom * linter effect! * reolved requests * more requests resolved * more requests resolved * test name, touching lineOverlap * fix conversations in booleanContains * fixes conversations in crosses and disjoint * resolves allllllllll outdated conversations, refactor * use getGeom in booleanTouches * use getGeom more frequently * rm linter rule, which is already inherited from dartclub_lint * cleanup, ready for merge Co-authored-by: Lukas Himsel --- CONTRIBUTING.md | 38 +- README.md | 33 +- analysis_options.yaml | 2 +- benchmark/area_benchmark.dart | 2 +- benchmark/explode_benchmark.dart | 2 +- benchmark/polygon_smooth_benchmark.dart | 2 +- example/main.dart | 2 +- lib/src/booleans/boolean_clockwise.dart | 47 ++ lib/src/booleans/boolean_concave.dart | 42 ++ lib/src/booleans/boolean_contains.dart | 185 ++++++ lib/src/booleans/boolean_crosses.dart | 180 ++++++ lib/src/booleans/boolean_disjoint.dart | 125 ++++ lib/src/booleans/boolean_equal.dart | 41 ++ lib/src/booleans/boolean_intersects.dart | 32 + lib/src/booleans/boolean_parallel.dart | 46 ++ .../booleans/boolean_point_in_polygon.dart | 69 ++ lib/src/booleans/boolean_point_on_line.dart | 92 +++ lib/src/booleans/boolean_touches.dart | 592 ++++++++++++++++++ lib/src/booleans/boolean_valid.dart | 149 +++++ lib/src/clean_coords.dart | 3 +- lib/src/geojson.dart | 4 +- lib/src/invariant.dart | 25 +- lib/src/line_intersect.dart | 69 ++ lib/src/line_segment.dart | 8 - lib/src/polygon_smooth.dart | 10 +- lib/src/polygon_to_line.dart | 4 +- pubspec.yaml | 9 +- test/.DS_Store | Bin 0 -> 6148 bytes test/booleans/clockwise_test.dart | 58 ++ test/booleans/concave_test.dart | 48 ++ test/booleans/contains_test.dart | 61 ++ test/booleans/crosses_test.dart | 48 ++ test/booleans/disjoint_test.dart | 49 ++ test/booleans/equal_test.dart | 134 ++++ test/booleans/intersects_test.dart | 129 ++++ test/booleans/parallel_test.dart | 51 ++ test/booleans/point_in_polygon_test.dart | 419 +++++++++++++ test/booleans/point_on_line_test.dart | 59 ++ test/booleans/touches_test.dart | 49 ++ test/booleans/valid_test.dart | 67 ++ test/components/area_test.dart | 2 +- test/components/bbox_polygon_test.dart | 2 +- test/components/bbox_test.dart | 2 +- test/components/bearing_test.dart | 23 +- test/components/center_test.dart | 3 +- test/components/clean_coords_test.dart | 3 +- test/components/cluster_test.dart | 2 +- test/components/destination_test.dart | 2 +- test/components/explode_test.dart | 3 +- test/components/geojson_test.dart | 15 +- test/components/helpers_test.dart | 2 +- test/components/intersection_test.dart | 2 +- test/components/invariant_test.dart | 2 +- test/components/line_intersect_test.dart | 165 +++++ test/components/line_segment_test.dart | 2 +- test/components/line_to_polygon_test.dart | 1 + test/components/meta_test.dart | 2 +- test/components/midpoint_test.dart | 6 +- .../nearest_point_on_line_test.dart | 2 +- test/components/polygon_smooth_test.dart | 3 +- test/components/polygon_to_line_test.dart | 3 +- test/components/polyline.dart | 2 +- test/components/rhumb_bearing_test.dart | 4 +- test/components/truncate_test.dart | 2 +- test/examples/{ => booleans}/.DS_Store | Bin 10244 -> 8196 bytes .../false/counter-clockwise-line.geojson | 18 + .../clockwise/true/clockwise-line.geojson | 18 + .../booleans/concave/false/3vertices.geojson | 20 + .../booleans/concave/false/diamond.geojson | 22 + .../booleans/concave/false/square.geojson | 21 + .../booleans/concave/true/polygon.geojson | 22 + .../booleans/concave/true/polygon2.geojson | 28 + .../contains/diagrams/esri-contains.gif | Bin 0 -> 34103 bytes .../LineIsNotContainedByLine.geojson | 30 + .../LineIsNotContainedByPolygon.geojson | 33 + ...ineIsNotContainedByPolygonBoundary.geojson | 33 + .../MultiPointsIsNotContainedByLine.geojson | 30 + ...intsOnLineEndsIsNotContainedByLine.geojson | 29 + ...ltiPointIsNotContainedByMultiPoint.geojson | 28 + ...lOnBoundaryIsNotContainedByPolygon.geojson | 32 + .../MultiPointIsNotContainedByPolygon.geojson | 33 + .../PointIsNotContainedByLine.geojson | 26 + ...ntIsNotContainedByLineBecauseOnEnd.geojson | 26 + .../PointOnEndIsContainedByLinestring.geojson | 26 + .../PointIsNotContainedBYMultiPoint.geojson | 24 + .../PointIsNotContainedByPolygon.geojson | 29 + .../Polygon/PointOnPolygonBoundary.geojson | 29 + .../LineString/issue-#1201-false.geojson | 40 ++ .../Polygon/Polygon/Polygon-Polygon.geojson | 37 ++ .../Polygon/Polygon/Polygon-Polygon2.geojson | 47 ++ .../LineString/LineIsContainedByLine.geojson | 30 + .../LineString/LinesExactlySame.geojson | 31 + .../Polygon/LineIsContainedByPolygon.geojson | 33 + ...nedByPolygonWithNoInternalVertices.geojson | 32 + .../MultipointsIsContainedByLine.geojson | 29 + .../MultiPointsContainedByMultiPoints.geojson | 28 + .../MultiPoint/MultiPointsEqual.geojson | 29 + ...iPointIsContainedByPolygonBoundary.geojson | 32 + .../LineString/PointIsContainedByLine.geojson | 26 + .../PointIsContainedByMultiPoint.geojson | 24 + .../PointInsidePolygonBoundary.geojson | 29 + .../LineString/issue-#1201-true.geojson | 40 ++ .../Polygon/PolygonExactSameShape.geojson | 41 ++ .../PolygonIsContainedByPolygon.geojson | 36 ++ .../LineDoesNotCrossButTouches.geojson | 29 + .../LineString/LineDoesNotCrossLine.geojson | 29 + .../Polygon/LineDoesNotCrossPolygon.geojson | 32 + .../LineString/MultiPointNotCrossLine.geojson | 29 + .../MultiPointNotCrossLineEnd.geojson | 29 + .../Polygon/MultiPointNotCrossPolygon.geojson | 32 + .../LineString/LineCrossesLine.geojson | 29 + .../Polygon/LineCrossesPolygon.geojson | 34 + .../Polygon/LineCrossesPolygonPartial.geojson | 32 + .../LineString/MultiPointsCrossLine.geojson | 29 + .../Polygon/MultiPointsCrossPolygon.geojson | 32 + test/examples/booleans/disjoint/.DS_Store | Bin 0 -> 6148 bytes .../disjoint/diagrams/esri-disjoint.gif | Bin 0 -> 31587 bytes .../LineString/LineString-LineString.geojson | 31 + .../Point/LineString-Point-1.geojson | 26 + .../Point/LineString-Point-2.geojson | 26 + .../Polygon/LineString-In-Polygon.geojson | 32 + .../Polygon/LineString-Polygon.geojson | 34 + .../LineString/MultiPoint-LineString.geojson | 29 + .../MultiPoint/MultiPoint-MultiPoint.geojson | 27 + .../Polygon/MultiPoint-Polygon.geojson | 32 + .../Polygon/MultiPolygon-Polygon.geojson | 52 ++ .../LineString/Point-LineString-1.geojson | 26 + .../LineString/Point-LineString-2.geojson | 26 + .../LineString/Point-LineString-3.geojson | 26 + .../LineString/Point-LineString-4.geojson | 26 + .../Point/MultiPoint/Point-MultiPoint.geojson | 24 + .../false/Point/Point/Point-Point.geojson | 21 + .../Point/Polygon/Point-Polygon-1.geojson | 29 + .../Point/Polygon/Point-Polygon-2.geojson | 29 + .../Polygon-Containing-Linestring.geojson | 32 + .../LineString/Polygon-LineString.geojson | 34 + .../MultiPolygon/Polygon-MultiPolygon.geojson | 52 ++ .../false/Polygon/Point/Polygon-Point.geojson | 29 + .../Polygon/Large-Inside-Small.geojson | 39 ++ .../Polygon/Polygon/Polygon-Polygon.geojson | 37 ++ .../Polygon/Small-Inside-Large.geojson | 39 ++ .../false/Polygon/Polygon/issue-1216.geojson | 49 ++ .../LineString/LineString-LineString.geojson | 31 + .../LineString/Point/LineString-Point.geojson | 26 + .../Polygon/LineString-Polygon.geojson | 34 + .../LineString/MultiPoint-LineString.geojson | 29 + .../MultiPoint/MultiPoint-MultiPoint.geojson | 27 + .../MultiPoint/Point/MultiPoint-Point.geojson | 24 + .../Polygon/MultiPoint-Polygon.geojson | 32 + .../Polygon/MultiPolygon-Polygon.geojson | 52 ++ .../Point/LineString/Point-LineString.geojson | 26 + .../Point/MultiPoint/Point-Multipoint.geojson | 24 + .../test/true/Point/Point/Point-Point.geojson | 21 + .../true/Point/Polygon/Point-Polygon.geojson | 29 + .../LineString/Polygon-LineString.geojson | 34 + .../MultiPolygon/Polygon-MultiPolygon.geojson | 52 ++ .../true/Polygon/Point/Polygon-Point.geojson | 29 + .../Polygon/Polygon/Polygon-Polygon.geojson | 37 ++ .../booleans/equal/diagrams/esri-equals.gif | Bin 0 -> 22932 bytes .../equal/test/false/linear-rings.geojson | 31 + .../booleans/equal/test/false/lines.geojson | 31 + .../equal/test/false/multipoints.geojson | 33 + .../booleans/equal/test/false/points.geojson | 21 + .../equal/test/false/polygons.geojson | 35 ++ .../test/false/precision-default.geojson | 21 + .../test/false/precision-options.geojson | 24 + .../test/true/different-initials-poly.geojson | 63 ++ .../equal/test/true/linear-rings.geojson | 31 + .../test/true/lines-extra-vertices.geojson | 28 + .../equal/test/true/lines-reverse.geojson | 29 + .../booleans/equal/test/true/lines.geojson | 31 + .../equal/test/true/multipoints.geojson | 33 + .../booleans/equal/test/true/points.geojson | 21 + .../booleans/equal/test/true/polygons.geojson | 35 ++ .../equal/test/true/precision-default.geojson | 21 + .../equal/test/true/precision-options.geojson | 24 + .../equal/test/true/reverse-lines.geojson | 31 + .../equal/test/true/reverse-polygons.geojson | 64 ++ .../LineString/LineString-LineString.geojson | 31 + .../LineString/Point/LineString-Point.geojson | 26 + .../Polygon/LineString-Polygon.geojson | 34 + .../LineString/MultiPoint-LineString.geojson | 29 + .../MultiPoint/MultiPoint-MultiPoint.geojson | 27 + .../MultiPoint/Point/MultiPoint-Point.geojson | 24 + .../Polygon/MultiPoint-Polygon.geojson | 32 + .../Polygon/MultiPolygon-Polygon.geojson | 52 ++ .../Point/LineString/Point-LineString.geojson | 26 + .../Point/MultiPoint/Point-Multipoint.geojson | 24 + .../false/Point/Point/Point-Point.geojson | 21 + .../false/Point/Polygon/Point-Polygon.geojson | 29 + .../LineString/Polygon-LineString.geojson | 34 + .../MultiPolygon/Polygon-MultiPolygon.geojson | 52 ++ .../false/Polygon/Point/Polygon-Point.geojson | 29 + .../Polygon/Polygon/Polygon-Polygon.geojson | 37 ++ .../LineString/LineString-LineString.geojson | 31 + .../Point/LineString-Point-1.geojson | 26 + .../Point/LineString-Point-2.geojson | 26 + .../Polygon/LineString-In-Polygon.geojson | 32 + .../Polygon/LineString-Polygon.geojson | 34 + .../LineString/MultiPoint-LineString.geojson | 29 + .../MultiPoint/MultiPoint-MultiPoint.geojson | 27 + .../Polygon/MultiPoint-Polygon.geojson | 32 + .../Polygon/MultiPolygon-Polygon.geojson | 52 ++ .../LineString/Point-LineString-1.geojson | 26 + .../LineString/Point-LineString-2.geojson | 26 + .../LineString/Point-LineString-3.geojson | 26 + .../LineString/Point-LineString-4.geojson | 26 + .../Point/MultiPoint/Point-MultiPoint.geojson | 24 + .../true/Point/Point/Point-Point.geojson | 21 + .../Point/Polygon/Point-Polygon-1.geojson | 29 + .../Point/Polygon/Point-Polygon-2.geojson | 29 + .../Polygon-Containing-Linestring.geojson | 32 + .../LineString/Polygon-LineString.geojson | 34 + .../MultiPolygon/Polygon-MultiPolygon.geojson | 52 ++ .../true/Polygon/Point/Polygon-Point.geojson | 29 + .../Polygon/Large-Inside-Small.geojson | 39 ++ .../Polygon/Polygon/Polygon-Polygon.geojson | 37 ++ .../Polygon/Small-Inside-Large.geojson | 39 ++ .../true/Polygon/Polygon/issue-1216.geojson | 49 ++ .../overlap/false/equal-linear-rings.geojson | 31 + .../overlap/false/equal-lines.geojson | 31 + .../overlap/false/equal-multipoints.geojson | 33 + .../overlap/false/equal-polygons.geojson | 35 ++ .../overlap/false/linear-rings.geojson | 33 + .../booleans/overlap/false/lines.geojson | 32 + .../overlap/false/multipoints.geojson | 36 ++ .../false/polygon-with-hole-polygon.geojson | 45 ++ .../booleans/overlap/false/polygons.geojson | 37 ++ .../overlap/true/linear-rings.geojson | 33 + .../booleans/overlap/true/lines.geojson | 32 + .../booleans/overlap/true/multipoints.geojson | 36 ++ .../true/polygon-with-hole-polygon.geojson | 44 ++ .../booleans/overlap/true/polygons.geojson | 37 ++ .../overlap/true/simple-lines.geojson | 30 + .../overlap/true/single-multipoints.geojson | 36 ++ .../booleans/parallel/false/line1.geojson | 31 + .../booleans/parallel/false/line2.geojson | 31 + .../booleans/parallel/true/city-line.geojson | 29 + .../booleans/parallel/true/fiji.geojson | 31 + .../booleans/parallel/true/line1.geojson | 31 + .../parallel/true/line3-reverse.geojson | 31 + .../booleans/parallel/true/line3.geojson | 31 + .../booleans/parallel/true/resolute.geojson | 29 + .../booleans/parallel/true/segment1.geojson | 27 + .../booleans/parallel/true/segment2.geojson | 27 + .../booleans/parallel/true/segment3.geojson | 27 + .../in/multipoly-with-hole.geojson | 43 ++ .../in/poly-with-hole.geojson | 32 + ...LineWithOnly1SegmentIgnoreBoundary.geojson | 27 + ...eWithOnly1SegmentIgnoreBoundaryEnd.geojson | 27 + ...nLineButFailsWithSmallEpsilonValue.geojson | 27 + ...utEpsilonForBackwardsCompatibility.geojson | 24 + ...PointOnEndFailsWhenIgnoreEndpoints.geojson | 28 + ...intOnStartFailsWhenIgnoreEndpoints.geojson | 28 + .../point_on_line/false/notOnLine.geojson | 28 + .../true/LineWithOnly1Segment.geojson | 27 + .../true/LineWithOnly1SegmentOnStart.geojson | 24 + .../true/PointOnFirstSegment.geojson | 28 + .../true/PointOnLastSegment.geojson | 28 + .../point_on_line/true/PointOnLineEnd.geojson | 25 + .../true/PointOnLineMidVertice.geojson | 28 + .../true/PointOnLineMidpoint.geojson | 25 + .../true/PointOnLineStart.geojson | 25 + .../true/PointOnLineWithEpsilon.geojson | 27 + .../LineString/LinesExactSame.geojson | 31 + .../LineString/LivesOverlap.geojson | 30 + .../LineStringOverlapsMultiLinestring.geojson | 37 ++ .../LineStringSameAsMultiLinestring.geojson | 39 ++ .../LineStringDoesNotTouchMP.geojson | 29 + ...StringTouchesMultiPointButInternal.geojson | 29 + .../LineDoesNotTouchMultiPoly.geojson | 43 ++ .../Polygon/LineCrossesPolygon.geojson | 32 + .../Polygon/LineDoesNotTouch.geojson | 32 + .../Polygon/LineWIthinPolygon.geojson | 33 + .../MultiLineStringOverlapsLine.geojson | 37 ++ .../MultiLineStringSameAsLine.geojson | 39 ++ .../MultiLineStringsOverlap.geojson | 39 ++ .../MultiLineStringsSame.geojson | 41 ++ .../MpTouchesInternalMultiline.geojson | 37 ++ .../MultiPointNotTouchMultiline.geojson | 37 ++ .../MultiLineInsideMultipoly.geojson | 53 ++ .../PointNotTouchMultiLinestring.geojson | 34 + .../Point/PointTouchesMidLineString.geojson | 34 + .../Polygon/MultiLineInsidePoly.geojson | 42 ++ .../Polygon/MultiLineNotTouchPoly.geojson | 42 ++ .../MultiPointTouchesInsideLine.geojson | 29 + .../MultipointDoesNotTouchLine.geojson | 29 + .../MpDoesNotTouchMultiLine.geojson | 37 ++ .../MpTouchesInternalMultiLine.geojson | 37 ++ .../MultiPointDoesNotTouchMultipolygon | 24 + .../multipoint-inside-multipolygon.geojson | 43 ++ .../Polygon/MultiPointInsidePolygon.geojson | 33 + .../Polygon/MultiPointNoTouchPolygon.geojson | 32 + .../MultiPolyNotTouchLineString.geojson | 43 ++ .../MultiPolyOverlapsMultiLine.geojson | 53 ++ .../MultiPolyNotTouchMultiPoint.geojson | 43 ++ .../MultiPolygon/MultiPolysDoNotTouch.geojson | 50 ++ .../MultiPolygon/MultiPolysOverlap.geojson | 50 ++ .../Point/MultiPolyNotTouchPoint.geojson | 40 ++ .../LineString/PointIsNotTouchLine.geojson | 26 + .../LineString/PointOnMidLinestring.geojson | 26 + .../MpNotTouchMidLineString.geojson | 34 + .../MultiLineString/MpOnMidLineString.geojson | 34 + .../PointNotTouchMultipolygon.geojson | 40 ++ .../Polygon/PointDoesNotTouchPolygon.geojson | 29 + .../Point/Polygon/PointInsidePolygon.geojson | 29 + .../LineString/PolyDoesNotTouchLine.geojson | 32 + .../PolyNotTouchMultiLine.geojson | 42 ++ .../PolyOverlapMultiLine.geojson | 42 ++ .../PolygonNoTouchMultiPoint.geojson | 32 + .../PolygonOverlapsMultiPoint.geojson | 33 + .../PolyNotTouchMultipoly.geojson | 48 ++ .../Point/PolygonDoesNotTouchPoint.geojson | 29 + .../Point/PolygonOverlapsPoint.geojson | 29 + .../Polygon/Polygon/PolygonsDontTouch.geojson | 37 ++ .../Polygon/Polygon/PolygonsOverlap.geojson | 37 ++ .../LineString/LineTouchesEndpoint.geojson | 28 + .../LineStringTouchesEnd.geojson | 37 ++ .../LineStringTouchesStart.geojson | 37 ++ .../MultiPoint/MultipointTouchesLine.geojson | 30 + .../MultiPolygon/LineTouchesMultiPoly.geojson | 43 ++ .../LineTouchesSecondMultiPoly.geojson | 43 ++ .../Polygon/LineTouchesPolygon.geojson | 33 + .../LineString/MultiLineTouchesLine.geojson | 37 ++ .../MultiLineTouchesMultiLine.geojson | 43 ++ .../MultiLineTouchesMultiPoint.geojson | 37 ++ .../Point/MultiLineTouchesPoint.geojson | 34 + .../Polygon/MultiLineTouchesPolygon.geojson | 42 ++ .../LineString/MultipointTouchesLine.geojson | 30 + .../MpTouchesEndMultiLine.geojson | 37 ++ .../MpTouchesSecondMultiLine.geojson | 37 ++ .../multipoint-touches-multipolygon.geojson | 43 ++ .../Polygon/MultiPointIsWithinPolygon.geojson | 32 + .../MultiLineTouchesMultiPoly.geojson | 53 ++ .../MultiPolyTouchesMultiPoint.geojson | 34 + .../MultiPolyTouchesMultiPoly.geojson | 50 ++ .../MultiPolygon/Point/MpTouchesPoint.geojson | 31 + .../Polygon/MultiPolyTouchesPoly.geojson | 48 ++ .../Point/LineString/PointOnEndLine.geojson | 26 + .../Point/LineString/PointOnStartLine.geojson | 26 + .../Point/MultiLineString/MpOnEndLine.geojson | 34 + .../MultiLineString/MpOnStartLine.geojson | 34 + .../PointTouchesMultipolygon.geojson | 40 ++ .../PointTouchesMultipolygonHole.geojson | 46 ++ .../Point/Polygon/PointOnEdgePolygon.geojson | 29 + .../true/Point/Polygon/PointOnHole.geojson | 35 ++ .../Polygon/PointOnVerticePolygon.geojson | 29 + .../LineString/PolygonTouchesLines.geojson | 33 + .../PolygonTouchesMultiline.geojson | 42 ++ .../PolygonTouchesMultiPoint.geojson | 32 + .../MultiPolygon/PolyTouchMultiPolys.geojson | 48 ++ .../Polygon/Point/PolygonTouchesPoint.geojson | 29 + .../Point/PolygonTouchesPointVertice.geojson | 29 + .../Polygon/PolygonTouchesEdges.geojson | 37 ++ .../Polygon/PolygonsTouchVertices.geojson | 37 ++ .../assertion/MultiPoint/multipoint.geojson | 16 + .../valid/assertion/Point/point.geojson | 13 + ...multipoly-with-2-vertices-touching.geojson | 30 + .../multipolygons-overlap.geojson | 39 ++ .../MultiPolygon/not-enough-coords.geojson | 21 + .../false/Polygon/not-enough-coords.geojson | 19 + ...ygon-with-hole-2-vertices-touching.geojson | 28 + .../Polygon/polygon-with-puncture.geojson | 24 + .../false/Polygon/polygon-with-spike.geojson | 22 + .../valid/true/LineString/linestring.geojson | 17 + .../MultiLineString/multilinestring.geojson | 23 + .../true/MultiPoint/multipoint-with-z.geojson | 16 + .../valid/true/MultiPoint/multipoint.geojson | 16 + .../MultiPolygon/multipolygon-touch.geojson | 39 ++ .../multipolygon-with-hole.geojson | 39 ++ .../true/MultiPolygon/multipolygon.geojson | 32 + .../valid/true/Point/point-with-z.geojson | 13 + .../booleans/valid/true/Point/point.geojson | 13 + .../Polygon/polygon-internal-hole.geojson | 28 + ...lygon-with-hole-1-vertice-touching.geojson | 28 + .../valid/true/Polygon/polygon.geojson | 21 + .../LineString/LineIsNotWithinLine.geojson | 30 + .../Polygon/LineIsNotWIthinPolygon.geojson | 33 + .../LineIsNotWIthinPolygonBoundary.geojson | 33 + ...linestring-not-within-multipolygon.geojson | 49 ++ .../MultiPointsIsNotWIthinLine.geojson | 30 + ...ltiPointsOnLineEndsIsNotWIthinLine.geojson | 29 + .../MultiPointIsNotWithinMultiPoint.geojson | 28 + ...multipoint-not-within-multipolygon.geojson | 43 ++ ...intAllOnBoundaryIsNotWithinPolygon.geojson | 32 + .../MultiPointIsNotWithinPolygon.geojson | 33 + .../LineString/PointIsNotWithinLine.geojson | 26 + .../PointIsNotWithinLineBecauseOnEnd.geojson | 26 + .../PointOnEndIsWithinLinestring.geojson | 26 + .../PointIsNotWithinMultiPoint.geojson | 24 + .../point-not-within-multipolygon.geojson | 40 ++ .../Polygon/PointIsNotWithinPolygon.geojson | 29 + .../Polygon/PointOnPolygonBoundary.geojson | 29 + .../polygon-not-within-multipolygon.geojson | 48 ++ .../Polygon/Polygon/Polygon-Polygon.geojson | 37 ++ .../LineString/LineIsWithinLine.geojson | 30 + .../LineString/LinesExactSame.geojson | 31 + .../Polygon/LineIsContainedByPolygon.geojson | 33 + ...nedByPolygonWithNoInternalVertices.geojson | 32 + ...ultilinestring-within-multipolygon.geojson | 49 ++ .../MultipointsIsWithinLine.geojson | 29 + .../MultiPointsWithinMultiPoints.geojson | 29 + .../multipoint-within-multipolygon.geojson | 43 ++ .../Polygon/MultiPointIsWithinPolygon.geojson | 32 + .../MultiPointSingleIsWithinPolygon.geojson | 29 + ...p-multipolygon-within-multipolygon.geojson | 59 ++ .../LineString/PointIsWithinLine.geojson | 26 + .../PointIsWithinMultiPoint.geojson | 24 + .../point-within-multipolygon.geojson | 40 ++ .../Polygon/PointIsWithinPolygon.geojson | 29 + .../polygon-within-multipolygon.geojson | 48 ++ .../Polygon/PolygonIsWIthinPolygon.geojson | 36 ++ .../Polygon/PolygonsExactSameShape.geojson | 41 ++ .../in/2-vertex-segment.geojson | 33 + .../in/double-intersect.geojson | 44 ++ .../in/multi-linestring.geojson | 74 +++ .../in/polygons-with-holes.geojson | 107 ++++ .../in/same-coordinates.geojson | 39 ++ .../out/2-vertex-segment.geojson | 41 ++ .../out/double-intersect.geojson | 60 ++ .../out/multi-linestring.geojson | 154 +++++ .../out/polygons-with-holes.geojson | 251 ++++++++ .../out/same-coordinates.geojson | 55 ++ .../in/boolean-line-overlap.geojson | 32 + .../in/issue-#901-simplified.geojson | 35 ++ .../line_overlap/in/issue-#901.geojson | 77 +++ .../examples/line_overlap/in/polygons.geojson | 65 ++ test/examples/line_overlap/in/simple1.geojson | 40 ++ test/examples/line_overlap/in/simple2.geojson | 39 ++ test/examples/line_overlap/in/simple3.geojson | 38 ++ .../out/boolean-line-overlap.geojson | 32 + .../out/issue-#901-simplified.geojson | 52 ++ .../line_overlap/out/issue-#901.geojson | 170 +++++ .../line_overlap/out/polygons.geojson | 99 +++ .../examples/line_overlap/out/simple1.geojson | 56 ++ .../examples/line_overlap/out/simple2.geojson | 55 ++ .../examples/line_overlap/out/simple3.geojson | 54 ++ test/examples/rhumb_bearing/in/pair1.geojson | 58 +- test/examples/rhumb_bearing/out/pair1.geojson | 138 ++-- test/examples/rhumb_bearing/out/pair1.json | 4 +- 440 files changed, 16117 insertions(+), 183 deletions(-) create mode 100644 lib/src/booleans/boolean_clockwise.dart create mode 100644 lib/src/booleans/boolean_concave.dart create mode 100644 lib/src/booleans/boolean_contains.dart create mode 100644 lib/src/booleans/boolean_crosses.dart create mode 100644 lib/src/booleans/boolean_disjoint.dart create mode 100644 lib/src/booleans/boolean_equal.dart create mode 100644 lib/src/booleans/boolean_intersects.dart create mode 100644 lib/src/booleans/boolean_parallel.dart create mode 100644 lib/src/booleans/boolean_point_in_polygon.dart create mode 100644 lib/src/booleans/boolean_point_on_line.dart create mode 100644 lib/src/booleans/boolean_touches.dart create mode 100644 lib/src/booleans/boolean_valid.dart create mode 100644 lib/src/line_intersect.dart create mode 100644 test/.DS_Store create mode 100644 test/booleans/clockwise_test.dart create mode 100644 test/booleans/concave_test.dart create mode 100644 test/booleans/contains_test.dart create mode 100644 test/booleans/crosses_test.dart create mode 100644 test/booleans/disjoint_test.dart create mode 100644 test/booleans/equal_test.dart create mode 100644 test/booleans/intersects_test.dart create mode 100644 test/booleans/parallel_test.dart create mode 100644 test/booleans/point_in_polygon_test.dart create mode 100644 test/booleans/point_on_line_test.dart create mode 100644 test/booleans/touches_test.dart create mode 100644 test/booleans/valid_test.dart create mode 100644 test/components/line_intersect_test.dart rename test/examples/{ => booleans}/.DS_Store (56%) create mode 100644 test/examples/booleans/clockwise/false/counter-clockwise-line.geojson create mode 100644 test/examples/booleans/clockwise/true/clockwise-line.geojson create mode 100644 test/examples/booleans/concave/false/3vertices.geojson create mode 100644 test/examples/booleans/concave/false/diamond.geojson create mode 100644 test/examples/booleans/concave/false/square.geojson create mode 100644 test/examples/booleans/concave/true/polygon.geojson create mode 100644 test/examples/booleans/concave/true/polygon2.geojson create mode 100644 test/examples/booleans/contains/diagrams/esri-contains.gif create mode 100644 test/examples/booleans/contains/test/false/LineString/LineString/LineIsNotContainedByLine.geojson create mode 100644 test/examples/booleans/contains/test/false/LineString/Polygon/LineIsNotContainedByPolygon.geojson create mode 100644 test/examples/booleans/contains/test/false/LineString/Polygon/LineIsNotContainedByPolygonBoundary.geojson create mode 100644 test/examples/booleans/contains/test/false/MultiPoint/LineString/MultiPointsIsNotContainedByLine.geojson create mode 100644 test/examples/booleans/contains/test/false/MultiPoint/LineString/MultiPointsOnLineEndsIsNotContainedByLine.geojson create mode 100644 test/examples/booleans/contains/test/false/MultiPoint/MultiPoint/MultiPointIsNotContainedByMultiPoint.geojson create mode 100644 test/examples/booleans/contains/test/false/MultiPoint/Polygon/MultiPointAllOnBoundaryIsNotContainedByPolygon.geojson create mode 100644 test/examples/booleans/contains/test/false/MultiPoint/Polygon/MultiPointIsNotContainedByPolygon.geojson create mode 100644 test/examples/booleans/contains/test/false/Point/LineString/PointIsNotContainedByLine.geojson create mode 100644 test/examples/booleans/contains/test/false/Point/LineString/PointIsNotContainedByLineBecauseOnEnd.geojson create mode 100644 test/examples/booleans/contains/test/false/Point/LineString/PointOnEndIsContainedByLinestring.geojson create mode 100644 test/examples/booleans/contains/test/false/Point/MultiPoint/PointIsNotContainedBYMultiPoint.geojson create mode 100644 test/examples/booleans/contains/test/false/Point/Polygon/PointIsNotContainedByPolygon.geojson create mode 100644 test/examples/booleans/contains/test/false/Point/Polygon/PointOnPolygonBoundary.geojson create mode 100644 test/examples/booleans/contains/test/false/Polygon/LineString/issue-#1201-false.geojson create mode 100644 test/examples/booleans/contains/test/false/Polygon/Polygon/Polygon-Polygon.geojson create mode 100644 test/examples/booleans/contains/test/false/Polygon/Polygon/Polygon-Polygon2.geojson create mode 100644 test/examples/booleans/contains/test/true/LineString/LineString/LineIsContainedByLine.geojson create mode 100644 test/examples/booleans/contains/test/true/LineString/LineString/LinesExactlySame.geojson create mode 100644 test/examples/booleans/contains/test/true/LineString/Polygon/LineIsContainedByPolygon.geojson create mode 100644 test/examples/booleans/contains/test/true/LineString/Polygon/LineIsContainedByPolygonWithNoInternalVertices.geojson create mode 100644 test/examples/booleans/contains/test/true/MultiPoint/LineString/MultipointsIsContainedByLine.geojson create mode 100644 test/examples/booleans/contains/test/true/MultiPoint/MultiPoint/MultiPointsContainedByMultiPoints.geojson create mode 100644 test/examples/booleans/contains/test/true/MultiPoint/MultiPoint/MultiPointsEqual.geojson create mode 100644 test/examples/booleans/contains/test/true/MultiPoint/Polygon/MultiPointIsContainedByPolygonBoundary.geojson create mode 100644 test/examples/booleans/contains/test/true/Point/LineString/PointIsContainedByLine.geojson create mode 100644 test/examples/booleans/contains/test/true/Point/MultiPoint/PointIsContainedByMultiPoint.geojson create mode 100644 test/examples/booleans/contains/test/true/Point/Polygon/PointInsidePolygonBoundary.geojson create mode 100644 test/examples/booleans/contains/test/true/Polygon/LineString/issue-#1201-true.geojson create mode 100644 test/examples/booleans/contains/test/true/Polygon/Polygon/PolygonExactSameShape.geojson create mode 100644 test/examples/booleans/contains/test/true/Polygon/Polygon/PolygonIsContainedByPolygon.geojson create mode 100644 test/examples/booleans/crosses/false/LineString/LineString/LineDoesNotCrossButTouches.geojson create mode 100644 test/examples/booleans/crosses/false/LineString/LineString/LineDoesNotCrossLine.geojson create mode 100644 test/examples/booleans/crosses/false/LineString/Polygon/LineDoesNotCrossPolygon.geojson create mode 100644 test/examples/booleans/crosses/false/MultiPoint/LineString/MultiPointNotCrossLine.geojson create mode 100644 test/examples/booleans/crosses/false/MultiPoint/LineString/MultiPointNotCrossLineEnd.geojson create mode 100644 test/examples/booleans/crosses/false/MultiPoint/Polygon/MultiPointNotCrossPolygon.geojson create mode 100644 test/examples/booleans/crosses/true/LineString/LineString/LineCrossesLine.geojson create mode 100644 test/examples/booleans/crosses/true/LineString/Polygon/LineCrossesPolygon.geojson create mode 100644 test/examples/booleans/crosses/true/LineString/Polygon/LineCrossesPolygonPartial.geojson create mode 100644 test/examples/booleans/crosses/true/MultiPoint/LineString/MultiPointsCrossLine.geojson create mode 100644 test/examples/booleans/crosses/true/MultiPoint/Polygon/MultiPointsCrossPolygon.geojson create mode 100644 test/examples/booleans/disjoint/.DS_Store create mode 100644 test/examples/booleans/disjoint/diagrams/esri-disjoint.gif create mode 100644 test/examples/booleans/disjoint/test/false/LineString/LineString/LineString-LineString.geojson create mode 100644 test/examples/booleans/disjoint/test/false/LineString/Point/LineString-Point-1.geojson create mode 100644 test/examples/booleans/disjoint/test/false/LineString/Point/LineString-Point-2.geojson create mode 100644 test/examples/booleans/disjoint/test/false/LineString/Polygon/LineString-In-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/false/LineString/Polygon/LineString-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/false/MultiPoint/LineString/MultiPoint-LineString.geojson create mode 100644 test/examples/booleans/disjoint/test/false/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson create mode 100644 test/examples/booleans/disjoint/test/false/MultiPoint/Polygon/MultiPoint-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/false/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-1.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-2.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-3.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-4.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Point/MultiPoint/Point-MultiPoint.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Point/Point/Point-Point.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Point/Polygon/Point-Polygon-1.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Point/Polygon/Point-Polygon-2.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Polygon/LineString/Polygon-Containing-Linestring.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Polygon/LineString/Polygon-LineString.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Polygon/Point/Polygon-Point.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Polygon/Polygon/Large-Inside-Small.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Polygon/Polygon/Polygon-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Polygon/Polygon/Small-Inside-Large.geojson create mode 100644 test/examples/booleans/disjoint/test/false/Polygon/Polygon/issue-1216.geojson create mode 100644 test/examples/booleans/disjoint/test/true/LineString/LineString/LineString-LineString.geojson create mode 100644 test/examples/booleans/disjoint/test/true/LineString/Point/LineString-Point.geojson create mode 100644 test/examples/booleans/disjoint/test/true/LineString/Polygon/LineString-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/true/MultiPoint/LineString/MultiPoint-LineString.geojson create mode 100644 test/examples/booleans/disjoint/test/true/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson create mode 100644 test/examples/booleans/disjoint/test/true/MultiPoint/Point/MultiPoint-Point.geojson create mode 100644 test/examples/booleans/disjoint/test/true/MultiPoint/Polygon/MultiPoint-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/true/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/true/Point/LineString/Point-LineString.geojson create mode 100644 test/examples/booleans/disjoint/test/true/Point/MultiPoint/Point-Multipoint.geojson create mode 100644 test/examples/booleans/disjoint/test/true/Point/Point/Point-Point.geojson create mode 100644 test/examples/booleans/disjoint/test/true/Point/Polygon/Point-Polygon.geojson create mode 100644 test/examples/booleans/disjoint/test/true/Polygon/LineString/Polygon-LineString.geojson create mode 100644 test/examples/booleans/disjoint/test/true/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson create mode 100644 test/examples/booleans/disjoint/test/true/Polygon/Point/Polygon-Point.geojson create mode 100644 test/examples/booleans/disjoint/test/true/Polygon/Polygon/Polygon-Polygon.geojson create mode 100644 test/examples/booleans/equal/diagrams/esri-equals.gif create mode 100644 test/examples/booleans/equal/test/false/linear-rings.geojson create mode 100644 test/examples/booleans/equal/test/false/lines.geojson create mode 100644 test/examples/booleans/equal/test/false/multipoints.geojson create mode 100644 test/examples/booleans/equal/test/false/points.geojson create mode 100644 test/examples/booleans/equal/test/false/polygons.geojson create mode 100644 test/examples/booleans/equal/test/false/precision-default.geojson create mode 100644 test/examples/booleans/equal/test/false/precision-options.geojson create mode 100644 test/examples/booleans/equal/test/true/different-initials-poly.geojson create mode 100644 test/examples/booleans/equal/test/true/linear-rings.geojson create mode 100644 test/examples/booleans/equal/test/true/lines-extra-vertices.geojson create mode 100644 test/examples/booleans/equal/test/true/lines-reverse.geojson create mode 100644 test/examples/booleans/equal/test/true/lines.geojson create mode 100644 test/examples/booleans/equal/test/true/multipoints.geojson create mode 100644 test/examples/booleans/equal/test/true/points.geojson create mode 100644 test/examples/booleans/equal/test/true/polygons.geojson create mode 100644 test/examples/booleans/equal/test/true/precision-default.geojson create mode 100644 test/examples/booleans/equal/test/true/precision-options.geojson create mode 100644 test/examples/booleans/equal/test/true/reverse-lines.geojson create mode 100644 test/examples/booleans/equal/test/true/reverse-polygons.geojson create mode 100644 test/examples/booleans/intersects/false/LineString/LineString/LineString-LineString.geojson create mode 100644 test/examples/booleans/intersects/false/LineString/Point/LineString-Point.geojson create mode 100644 test/examples/booleans/intersects/false/LineString/Polygon/LineString-Polygon.geojson create mode 100644 test/examples/booleans/intersects/false/MultiPoint/LineString/MultiPoint-LineString.geojson create mode 100644 test/examples/booleans/intersects/false/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson create mode 100644 test/examples/booleans/intersects/false/MultiPoint/Point/MultiPoint-Point.geojson create mode 100644 test/examples/booleans/intersects/false/MultiPoint/Polygon/MultiPoint-Polygon.geojson create mode 100644 test/examples/booleans/intersects/false/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson create mode 100644 test/examples/booleans/intersects/false/Point/LineString/Point-LineString.geojson create mode 100644 test/examples/booleans/intersects/false/Point/MultiPoint/Point-Multipoint.geojson create mode 100644 test/examples/booleans/intersects/false/Point/Point/Point-Point.geojson create mode 100644 test/examples/booleans/intersects/false/Point/Polygon/Point-Polygon.geojson create mode 100644 test/examples/booleans/intersects/false/Polygon/LineString/Polygon-LineString.geojson create mode 100644 test/examples/booleans/intersects/false/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson create mode 100644 test/examples/booleans/intersects/false/Polygon/Point/Polygon-Point.geojson create mode 100644 test/examples/booleans/intersects/false/Polygon/Polygon/Polygon-Polygon.geojson create mode 100644 test/examples/booleans/intersects/true/LineString/LineString/LineString-LineString.geojson create mode 100644 test/examples/booleans/intersects/true/LineString/Point/LineString-Point-1.geojson create mode 100644 test/examples/booleans/intersects/true/LineString/Point/LineString-Point-2.geojson create mode 100644 test/examples/booleans/intersects/true/LineString/Polygon/LineString-In-Polygon.geojson create mode 100644 test/examples/booleans/intersects/true/LineString/Polygon/LineString-Polygon.geojson create mode 100644 test/examples/booleans/intersects/true/MultiPoint/LineString/MultiPoint-LineString.geojson create mode 100644 test/examples/booleans/intersects/true/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson create mode 100644 test/examples/booleans/intersects/true/MultiPoint/Polygon/MultiPoint-Polygon.geojson create mode 100644 test/examples/booleans/intersects/true/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson create mode 100644 test/examples/booleans/intersects/true/Point/LineString/Point-LineString-1.geojson create mode 100644 test/examples/booleans/intersects/true/Point/LineString/Point-LineString-2.geojson create mode 100644 test/examples/booleans/intersects/true/Point/LineString/Point-LineString-3.geojson create mode 100644 test/examples/booleans/intersects/true/Point/LineString/Point-LineString-4.geojson create mode 100644 test/examples/booleans/intersects/true/Point/MultiPoint/Point-MultiPoint.geojson create mode 100644 test/examples/booleans/intersects/true/Point/Point/Point-Point.geojson create mode 100644 test/examples/booleans/intersects/true/Point/Polygon/Point-Polygon-1.geojson create mode 100644 test/examples/booleans/intersects/true/Point/Polygon/Point-Polygon-2.geojson create mode 100644 test/examples/booleans/intersects/true/Polygon/LineString/Polygon-Containing-Linestring.geojson create mode 100644 test/examples/booleans/intersects/true/Polygon/LineString/Polygon-LineString.geojson create mode 100644 test/examples/booleans/intersects/true/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson create mode 100644 test/examples/booleans/intersects/true/Polygon/Point/Polygon-Point.geojson create mode 100644 test/examples/booleans/intersects/true/Polygon/Polygon/Large-Inside-Small.geojson create mode 100644 test/examples/booleans/intersects/true/Polygon/Polygon/Polygon-Polygon.geojson create mode 100644 test/examples/booleans/intersects/true/Polygon/Polygon/Small-Inside-Large.geojson create mode 100644 test/examples/booleans/intersects/true/Polygon/Polygon/issue-1216.geojson create mode 100644 test/examples/booleans/overlap/false/equal-linear-rings.geojson create mode 100644 test/examples/booleans/overlap/false/equal-lines.geojson create mode 100644 test/examples/booleans/overlap/false/equal-multipoints.geojson create mode 100644 test/examples/booleans/overlap/false/equal-polygons.geojson create mode 100644 test/examples/booleans/overlap/false/linear-rings.geojson create mode 100644 test/examples/booleans/overlap/false/lines.geojson create mode 100644 test/examples/booleans/overlap/false/multipoints.geojson create mode 100644 test/examples/booleans/overlap/false/polygon-with-hole-polygon.geojson create mode 100644 test/examples/booleans/overlap/false/polygons.geojson create mode 100644 test/examples/booleans/overlap/true/linear-rings.geojson create mode 100644 test/examples/booleans/overlap/true/lines.geojson create mode 100644 test/examples/booleans/overlap/true/multipoints.geojson create mode 100644 test/examples/booleans/overlap/true/polygon-with-hole-polygon.geojson create mode 100644 test/examples/booleans/overlap/true/polygons.geojson create mode 100644 test/examples/booleans/overlap/true/simple-lines.geojson create mode 100644 test/examples/booleans/overlap/true/single-multipoints.geojson create mode 100644 test/examples/booleans/parallel/false/line1.geojson create mode 100644 test/examples/booleans/parallel/false/line2.geojson create mode 100644 test/examples/booleans/parallel/true/city-line.geojson create mode 100644 test/examples/booleans/parallel/true/fiji.geojson create mode 100644 test/examples/booleans/parallel/true/line1.geojson create mode 100644 test/examples/booleans/parallel/true/line3-reverse.geojson create mode 100644 test/examples/booleans/parallel/true/line3.geojson create mode 100644 test/examples/booleans/parallel/true/resolute.geojson create mode 100644 test/examples/booleans/parallel/true/segment1.geojson create mode 100644 test/examples/booleans/parallel/true/segment2.geojson create mode 100644 test/examples/booleans/parallel/true/segment3.geojson create mode 100644 test/examples/booleans/point_in_polygon/in/multipoly-with-hole.geojson create mode 100644 test/examples/booleans/point_in_polygon/in/poly-with-hole.geojson create mode 100644 test/examples/booleans/point_on_line/false/LineWithOnly1SegmentIgnoreBoundary.geojson create mode 100644 test/examples/booleans/point_on_line/false/LineWithOnly1SegmentIgnoreBoundaryEnd.geojson create mode 100644 test/examples/booleans/point_on_line/false/PointIsOnLineButFailsWithSmallEpsilonValue.geojson create mode 100644 test/examples/booleans/point_on_line/false/PointIsOnLineButFailsWithoutEpsilonForBackwardsCompatibility.geojson create mode 100644 test/examples/booleans/point_on_line/false/PointOnEndFailsWhenIgnoreEndpoints.geojson create mode 100644 test/examples/booleans/point_on_line/false/PointOnStartFailsWhenIgnoreEndpoints.geojson create mode 100644 test/examples/booleans/point_on_line/false/notOnLine.geojson create mode 100644 test/examples/booleans/point_on_line/true/LineWithOnly1Segment.geojson create mode 100644 test/examples/booleans/point_on_line/true/LineWithOnly1SegmentOnStart.geojson create mode 100644 test/examples/booleans/point_on_line/true/PointOnFirstSegment.geojson create mode 100644 test/examples/booleans/point_on_line/true/PointOnLastSegment.geojson create mode 100644 test/examples/booleans/point_on_line/true/PointOnLineEnd.geojson create mode 100644 test/examples/booleans/point_on_line/true/PointOnLineMidVertice.geojson create mode 100644 test/examples/booleans/point_on_line/true/PointOnLineMidpoint.geojson create mode 100644 test/examples/booleans/point_on_line/true/PointOnLineStart.geojson create mode 100644 test/examples/booleans/point_on_line/true/PointOnLineWithEpsilon.geojson create mode 100644 test/examples/booleans/touches/false/LineString/LineString/LinesExactSame.geojson create mode 100644 test/examples/booleans/touches/false/LineString/LineString/LivesOverlap.geojson create mode 100644 test/examples/booleans/touches/false/LineString/MultiLineString/LineStringOverlapsMultiLinestring.geojson create mode 100644 test/examples/booleans/touches/false/LineString/MultiLineString/LineStringSameAsMultiLinestring.geojson create mode 100644 test/examples/booleans/touches/false/LineString/MultiPoint/LineStringDoesNotTouchMP.geojson create mode 100644 test/examples/booleans/touches/false/LineString/MultiPoint/LineStringTouchesMultiPointButInternal.geojson create mode 100644 test/examples/booleans/touches/false/LineString/MultiPolygon/LineDoesNotTouchMultiPoly.geojson create mode 100644 test/examples/booleans/touches/false/LineString/Polygon/LineCrossesPolygon.geojson create mode 100644 test/examples/booleans/touches/false/LineString/Polygon/LineDoesNotTouch.geojson create mode 100644 test/examples/booleans/touches/false/LineString/Polygon/LineWIthinPolygon.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/LineString/MultiLineStringOverlapsLine.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/LineString/MultiLineStringSameAsLine.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/MultiLineString/MultiLineStringsOverlap.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/MultiLineString/MultiLineStringsSame.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/MultiPoint/MpTouchesInternalMultiline.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/MultiPoint/MultiPointNotTouchMultiline.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/MultiPolygon/MultiLineInsideMultipoly.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/Point/PointNotTouchMultiLinestring.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/Point/PointTouchesMidLineString.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/Polygon/MultiLineInsidePoly.geojson create mode 100644 test/examples/booleans/touches/false/MultiLineString/Polygon/MultiLineNotTouchPoly.geojson create mode 100644 test/examples/booleans/touches/false/MultiPoint/LineString/MultiPointTouchesInsideLine.geojson create mode 100644 test/examples/booleans/touches/false/MultiPoint/LineString/MultipointDoesNotTouchLine.geojson create mode 100644 test/examples/booleans/touches/false/MultiPoint/MultiLineString/MpDoesNotTouchMultiLine.geojson create mode 100644 test/examples/booleans/touches/false/MultiPoint/MultiLineString/MpTouchesInternalMultiLine.geojson create mode 100644 test/examples/booleans/touches/false/MultiPoint/MultiPolygon/MultiPointDoesNotTouchMultipolygon create mode 100644 test/examples/booleans/touches/false/MultiPoint/MultiPolygon/multipoint-inside-multipolygon.geojson create mode 100644 test/examples/booleans/touches/false/MultiPoint/Polygon/MultiPointInsidePolygon.geojson create mode 100644 test/examples/booleans/touches/false/MultiPoint/Polygon/MultiPointNoTouchPolygon.geojson create mode 100644 test/examples/booleans/touches/false/MultiPolygon/LineString/MultiPolyNotTouchLineString.geojson create mode 100644 test/examples/booleans/touches/false/MultiPolygon/MultiLineString/MultiPolyOverlapsMultiLine.geojson create mode 100644 test/examples/booleans/touches/false/MultiPolygon/MultiPoint/MultiPolyNotTouchMultiPoint.geojson create mode 100644 test/examples/booleans/touches/false/MultiPolygon/MultiPolygon/MultiPolysDoNotTouch.geojson create mode 100644 test/examples/booleans/touches/false/MultiPolygon/MultiPolygon/MultiPolysOverlap.geojson create mode 100644 test/examples/booleans/touches/false/MultiPolygon/Point/MultiPolyNotTouchPoint.geojson create mode 100644 test/examples/booleans/touches/false/Point/LineString/PointIsNotTouchLine.geojson create mode 100644 test/examples/booleans/touches/false/Point/LineString/PointOnMidLinestring.geojson create mode 100644 test/examples/booleans/touches/false/Point/MultiLineString/MpNotTouchMidLineString.geojson create mode 100644 test/examples/booleans/touches/false/Point/MultiLineString/MpOnMidLineString.geojson create mode 100644 test/examples/booleans/touches/false/Point/MultiPolygon/PointNotTouchMultipolygon.geojson create mode 100644 test/examples/booleans/touches/false/Point/Polygon/PointDoesNotTouchPolygon.geojson create mode 100644 test/examples/booleans/touches/false/Point/Polygon/PointInsidePolygon.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/LineString/PolyDoesNotTouchLine.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/MultiLineString/PolyNotTouchMultiLine.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/MultiLineString/PolyOverlapMultiLine.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/MultiPoint/PolygonNoTouchMultiPoint.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/MultiPoint/PolygonOverlapsMultiPoint.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/MultiPolygon/PolyNotTouchMultipoly.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/Point/PolygonDoesNotTouchPoint.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/Point/PolygonOverlapsPoint.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/Polygon/PolygonsDontTouch.geojson create mode 100644 test/examples/booleans/touches/false/Polygon/Polygon/PolygonsOverlap.geojson create mode 100644 test/examples/booleans/touches/true/LineString/LineString/LineTouchesEndpoint.geojson create mode 100644 test/examples/booleans/touches/true/LineString/MultiLineString/LineStringTouchesEnd.geojson create mode 100644 test/examples/booleans/touches/true/LineString/MultiLineString/LineStringTouchesStart.geojson create mode 100644 test/examples/booleans/touches/true/LineString/MultiPoint/MultipointTouchesLine.geojson create mode 100644 test/examples/booleans/touches/true/LineString/MultiPolygon/LineTouchesMultiPoly.geojson create mode 100644 test/examples/booleans/touches/true/LineString/MultiPolygon/LineTouchesSecondMultiPoly.geojson create mode 100644 test/examples/booleans/touches/true/LineString/Polygon/LineTouchesPolygon.geojson create mode 100644 test/examples/booleans/touches/true/MultiLineString/LineString/MultiLineTouchesLine.geojson create mode 100644 test/examples/booleans/touches/true/MultiLineString/MultiLineString/MultiLineTouchesMultiLine.geojson create mode 100644 test/examples/booleans/touches/true/MultiLineString/MultiPoint/MultiLineTouchesMultiPoint.geojson create mode 100644 test/examples/booleans/touches/true/MultiLineString/Point/MultiLineTouchesPoint.geojson create mode 100644 test/examples/booleans/touches/true/MultiLineString/Polygon/MultiLineTouchesPolygon.geojson create mode 100644 test/examples/booleans/touches/true/MultiPoint/LineString/MultipointTouchesLine.geojson create mode 100644 test/examples/booleans/touches/true/MultiPoint/MultiLineString/MpTouchesEndMultiLine.geojson create mode 100644 test/examples/booleans/touches/true/MultiPoint/MultiLineString/MpTouchesSecondMultiLine.geojson create mode 100644 test/examples/booleans/touches/true/MultiPoint/MultiPolygon/multipoint-touches-multipolygon.geojson create mode 100644 test/examples/booleans/touches/true/MultiPoint/Polygon/MultiPointIsWithinPolygon.geojson create mode 100644 test/examples/booleans/touches/true/MultiPolygon/MultiLineString/MultiLineTouchesMultiPoly.geojson create mode 100644 test/examples/booleans/touches/true/MultiPolygon/MultiPoint/MultiPolyTouchesMultiPoint.geojson create mode 100644 test/examples/booleans/touches/true/MultiPolygon/MultiPolygon/MultiPolyTouchesMultiPoly.geojson create mode 100644 test/examples/booleans/touches/true/MultiPolygon/Point/MpTouchesPoint.geojson create mode 100644 test/examples/booleans/touches/true/MultiPolygon/Polygon/MultiPolyTouchesPoly.geojson create mode 100644 test/examples/booleans/touches/true/Point/LineString/PointOnEndLine.geojson create mode 100644 test/examples/booleans/touches/true/Point/LineString/PointOnStartLine.geojson create mode 100644 test/examples/booleans/touches/true/Point/MultiLineString/MpOnEndLine.geojson create mode 100644 test/examples/booleans/touches/true/Point/MultiLineString/MpOnStartLine.geojson create mode 100644 test/examples/booleans/touches/true/Point/MultiPolygon/PointTouchesMultipolygon.geojson create mode 100644 test/examples/booleans/touches/true/Point/MultiPolygon/PointTouchesMultipolygonHole.geojson create mode 100644 test/examples/booleans/touches/true/Point/Polygon/PointOnEdgePolygon.geojson create mode 100644 test/examples/booleans/touches/true/Point/Polygon/PointOnHole.geojson create mode 100644 test/examples/booleans/touches/true/Point/Polygon/PointOnVerticePolygon.geojson create mode 100644 test/examples/booleans/touches/true/Polygon/LineString/PolygonTouchesLines.geojson create mode 100644 test/examples/booleans/touches/true/Polygon/MultiLineString/PolygonTouchesMultiline.geojson create mode 100644 test/examples/booleans/touches/true/Polygon/MultiPoint/PolygonTouchesMultiPoint.geojson create mode 100644 test/examples/booleans/touches/true/Polygon/MultiPolygon/PolyTouchMultiPolys.geojson create mode 100644 test/examples/booleans/touches/true/Polygon/Point/PolygonTouchesPoint.geojson create mode 100644 test/examples/booleans/touches/true/Polygon/Point/PolygonTouchesPointVertice.geojson create mode 100644 test/examples/booleans/touches/true/Polygon/Polygon/PolygonTouchesEdges.geojson create mode 100644 test/examples/booleans/touches/true/Polygon/Polygon/PolygonsTouchVertices.geojson create mode 100644 test/examples/booleans/valid/assertion/MultiPoint/multipoint.geojson create mode 100644 test/examples/booleans/valid/assertion/Point/point.geojson create mode 100644 test/examples/booleans/valid/false/MultiPolygon/multipoly-with-2-vertices-touching.geojson create mode 100644 test/examples/booleans/valid/false/MultiPolygon/multipolygons-overlap.geojson create mode 100644 test/examples/booleans/valid/false/MultiPolygon/not-enough-coords.geojson create mode 100644 test/examples/booleans/valid/false/Polygon/not-enough-coords.geojson create mode 100644 test/examples/booleans/valid/false/Polygon/polygon-with-hole-2-vertices-touching.geojson create mode 100644 test/examples/booleans/valid/false/Polygon/polygon-with-puncture.geojson create mode 100644 test/examples/booleans/valid/false/Polygon/polygon-with-spike.geojson create mode 100644 test/examples/booleans/valid/true/LineString/linestring.geojson create mode 100644 test/examples/booleans/valid/true/MultiLineString/multilinestring.geojson create mode 100644 test/examples/booleans/valid/true/MultiPoint/multipoint-with-z.geojson create mode 100644 test/examples/booleans/valid/true/MultiPoint/multipoint.geojson create mode 100644 test/examples/booleans/valid/true/MultiPolygon/multipolygon-touch.geojson create mode 100644 test/examples/booleans/valid/true/MultiPolygon/multipolygon-with-hole.geojson create mode 100644 test/examples/booleans/valid/true/MultiPolygon/multipolygon.geojson create mode 100644 test/examples/booleans/valid/true/Point/point-with-z.geojson create mode 100644 test/examples/booleans/valid/true/Point/point.geojson create mode 100644 test/examples/booleans/valid/true/Polygon/polygon-internal-hole.geojson create mode 100644 test/examples/booleans/valid/true/Polygon/polygon-with-hole-1-vertice-touching.geojson create mode 100644 test/examples/booleans/valid/true/Polygon/polygon.geojson create mode 100644 test/examples/booleans/within/false/LineString/LineString/LineIsNotWithinLine.geojson create mode 100644 test/examples/booleans/within/false/LineString/Polygon/LineIsNotWIthinPolygon.geojson create mode 100644 test/examples/booleans/within/false/LineString/Polygon/LineIsNotWIthinPolygonBoundary.geojson create mode 100644 test/examples/booleans/within/false/MultiLineString/MultiPolygon/skip-multilinestring-not-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/false/MultiPoint/LineString/MultiPointsIsNotWIthinLine.geojson create mode 100644 test/examples/booleans/within/false/MultiPoint/LineString/MultiPointsOnLineEndsIsNotWIthinLine.geojson create mode 100644 test/examples/booleans/within/false/MultiPoint/MultiPoint/MultiPointIsNotWithinMultiPoint.geojson create mode 100644 test/examples/booleans/within/false/MultiPoint/MultiPolygon/multipoint-not-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/false/MultiPoint/Polygon/MultiPointAllOnBoundaryIsNotWithinPolygon.geojson create mode 100644 test/examples/booleans/within/false/MultiPoint/Polygon/MultiPointIsNotWithinPolygon.geojson create mode 100644 test/examples/booleans/within/false/Point/LineString/PointIsNotWithinLine.geojson create mode 100644 test/examples/booleans/within/false/Point/LineString/PointIsNotWithinLineBecauseOnEnd.geojson create mode 100644 test/examples/booleans/within/false/Point/LineString/PointOnEndIsWithinLinestring.geojson create mode 100644 test/examples/booleans/within/false/Point/MultiPoint/PointIsNotWithinMultiPoint.geojson create mode 100644 test/examples/booleans/within/false/Point/MultiPolygon/point-not-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/false/Point/Polygon/PointIsNotWithinPolygon.geojson create mode 100644 test/examples/booleans/within/false/Point/Polygon/PointOnPolygonBoundary.geojson create mode 100644 test/examples/booleans/within/false/Polygon/MultiPolygon/polygon-not-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/false/Polygon/Polygon/Polygon-Polygon.geojson create mode 100644 test/examples/booleans/within/true/LineString/LineString/LineIsWithinLine.geojson create mode 100644 test/examples/booleans/within/true/LineString/LineString/LinesExactSame.geojson create mode 100644 test/examples/booleans/within/true/LineString/Polygon/LineIsContainedByPolygon.geojson create mode 100644 test/examples/booleans/within/true/LineString/Polygon/LineIsContainedByPolygonWithNoInternalVertices.geojson create mode 100644 test/examples/booleans/within/true/MultiLineString/MultiPolygon/skip-multilinestring-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/true/MultiPoint/LineString/MultipointsIsWithinLine.geojson create mode 100644 test/examples/booleans/within/true/MultiPoint/MultiPoint/MultiPointsWithinMultiPoints.geojson create mode 100644 test/examples/booleans/within/true/MultiPoint/MultiPolygon/multipoint-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/true/MultiPoint/Polygon/MultiPointIsWithinPolygon.geojson create mode 100644 test/examples/booleans/within/true/MultiPoint/Polygon/MultiPointSingleIsWithinPolygon.geojson create mode 100644 test/examples/booleans/within/true/MultiPolygon/MultiPolygon/skip-multipolygon-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/true/Point/LineString/PointIsWithinLine.geojson create mode 100644 test/examples/booleans/within/true/Point/MultiPoint/PointIsWithinMultiPoint.geojson create mode 100644 test/examples/booleans/within/true/Point/MultiPolygon/point-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/true/Point/Polygon/PointIsWithinPolygon.geojson create mode 100644 test/examples/booleans/within/true/Polygon/MultiPolygon/polygon-within-multipolygon.geojson create mode 100644 test/examples/booleans/within/true/Polygon/Polygon/PolygonIsWIthinPolygon.geojson create mode 100644 test/examples/booleans/within/true/Polygon/Polygon/PolygonsExactSameShape.geojson create mode 100644 test/examples/line_intersect/in/2-vertex-segment.geojson create mode 100644 test/examples/line_intersect/in/double-intersect.geojson create mode 100644 test/examples/line_intersect/in/multi-linestring.geojson create mode 100644 test/examples/line_intersect/in/polygons-with-holes.geojson create mode 100644 test/examples/line_intersect/in/same-coordinates.geojson create mode 100644 test/examples/line_intersect/out/2-vertex-segment.geojson create mode 100644 test/examples/line_intersect/out/double-intersect.geojson create mode 100644 test/examples/line_intersect/out/multi-linestring.geojson create mode 100644 test/examples/line_intersect/out/polygons-with-holes.geojson create mode 100644 test/examples/line_intersect/out/same-coordinates.geojson create mode 100644 test/examples/line_overlap/in/boolean-line-overlap.geojson create mode 100644 test/examples/line_overlap/in/issue-#901-simplified.geojson create mode 100644 test/examples/line_overlap/in/issue-#901.geojson create mode 100644 test/examples/line_overlap/in/polygons.geojson create mode 100644 test/examples/line_overlap/in/simple1.geojson create mode 100644 test/examples/line_overlap/in/simple2.geojson create mode 100644 test/examples/line_overlap/in/simple3.geojson create mode 100644 test/examples/line_overlap/out/boolean-line-overlap.geojson create mode 100644 test/examples/line_overlap/out/issue-#901-simplified.geojson create mode 100644 test/examples/line_overlap/out/issue-#901.geojson create mode 100644 test/examples/line_overlap/out/polygons.geojson create mode 100644 test/examples/line_overlap/out/simple1.geojson create mode 100644 test/examples/line_overlap/out/simple2.geojson create mode 100644 test/examples/line_overlap/out/simple3.geojson diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4c566dc8..a78adf91 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,6 +20,42 @@ To put it simply, be kind to each other. - Clone the repository: ```git clone git@github.com:dartclub/turf_dart.git``` - Navigate to project's folder in terminal & get its dependencies: ```dart pub get``` - Go through [Implementation Process](#implementation-process) +- Import the library in your code and use it. For example: +```dart +import 'package:turf/helpers.dart'; +import 'package:turf/src/line_segment.dart'; + + Feature poly = Feature( + geometry: Polygon(coordinates: [ + [ + Position(0, 0), + Position(2, 2), + Position(0, 1), + Position(0, 0), + ], + [ + Position(0, 0), + Position(1, 1), + Position(0, 1), + Position(0, 0), + ], + ]), + ); + +var total = segmentReduce(poly, (previousValue, + currentSegment, + initialValue, + featureIndex, + multiFeatureIndex, + geometryIndex, + segmentIndex) { + if (previousValue != null) { + previousValue++; + } + return previousValue; + }, 0, combineNestedGeometries: false); +// total.length == 6 +``` ## Structure of modules ``` @@ -56,4 +92,4 @@ In order to add to this very documentation, please develop CONTRIBUTING.md in [d ## GeoJSON Object Model If you have not read our [README.md](https://github.com/dartclub/turf_dart/blob/main/README.md) this diagram will give you a lot of information. Please consider looking our [notable design decisions](https://github.com/dartclub/turf_dart/blob/main/README.md#notable-design-decisions). -![polymorphism](https://user-images.githubusercontent.com/10634693/159876354-f9da2f37-02b3-4546-b32a-c0f82c372272.png) \ No newline at end of file +![polymorphism](https://user-images.githubusercontent.com/10634693/159876354-f9da2f37-02b3-4546-b32a-c0f82c372272.png) diff --git a/README.md b/README.md index e63bbfeb..bd066e46 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ Most of the implementation is a direct translation from [turf.js](https://github - 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: + ```dart import 'package:turf/helpers.dart'; import 'package:turf/src/line_segment.dart'; @@ -36,7 +37,7 @@ Feature poly = Feature( ]), ); -main() { +void main() { var total = segmentReduce( poly, (previousValue, currentSegment, initialValue, featureIndex, @@ -145,7 +146,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] kinks - [ ] lineArc - [ ] lineChunk -- [ ] lineIntersect +- [ ] [lineIntersect](https://github.com/dartclub/turf_dart/blob/main/lib/src/line_intersect.dart) - [ ] lineOverlap - [x] [lineSegment](https://github.com/dartclub/turf_dart/blob/main/lib/src/line_segment.dart) - [ ] lineSlice @@ -207,8 +208,6 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [featureReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/feature.dart) - [x] [flattenEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/flatten.dart) - [x] [flattenReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/flatten.dart) -- [x] [getCoord](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/coord.dart) -- [x] [getCoords](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/coord.dart) - [x] [geomEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/geom.dart) - [x] [geomReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/geom.dart) - [x] [propEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/prop.dart) @@ -219,19 +218,25 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [clusterEach](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/cluster.dart) - [x] [clusterReduce](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/cluster.dart) +### Invariants + +- [x] [getCoord](https://github.com/dartclub/turf_dart/blob/main/lib/src/meta/coord.dart) +- [x] [getCoords](https://github.com/dartclub/turf_dart/blob/main/lib/src/invariant.dart) +- [x] [getGeom](https://github.com/dartclub/turf_dart/blob/main/lib/src/invariant.dart) + ### Booleans -- [ ] booleanClockwise -- [ ] booleanConcave -- [ ] booleanContains -- [ ] booleanCrosses -- [ ] booleanDisjoint -- [ ] booleanEqual -- [ ] booleanIntersects +- [x] [booleanClockwise](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_clockwise.dart) +- [x] [booleanConcave](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_concave.dart) +- [x] [booleanContains](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_contains.dart) +- [x] [booleanCrosses](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_crosses.dart) +- [x] [booleanDisjoint](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_disjoint.dart) +- [x] [booleanEqual](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_equal.dart) +- [x] [booleanIntersects](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_intersect.dart) - [ ] booleanOverlap -- [ ] booleanParallel -- [ ] booleanPointInPolygon -- [ ] booleanPointOnLine +- [x] [booleanParallel](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_parallel.dart) +- [x] [booleanPointInPolygon](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_point_in_polygon.dart) +- [x] [booleanPointOnLine](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_point_on_line.dart) - [ ] booleanWithin ### Unit Conversion diff --git a/analysis_options.yaml b/analysis_options.yaml index 0b4c885d..f6555aff 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,4 +2,4 @@ include: package:dartclub_lint/dart.yaml analyzer: errors: - prefer_generic_function_type_aliases: error \ No newline at end of file + prefer_generic_function_type_aliases: error diff --git a/benchmark/area_benchmark.dart b/benchmark/area_benchmark.dart index 60c0fc6c..178624a6 100644 --- a/benchmark/area_benchmark.dart +++ b/benchmark/area_benchmark.dart @@ -16,7 +16,7 @@ Feature poly = Feature( ]), ); -main() { +void main() { group('area', () { benchmark('simple', () { area(poly); diff --git a/benchmark/explode_benchmark.dart b/benchmark/explode_benchmark.dart index 782e0ff6..52f18084 100644 --- a/benchmark/explode_benchmark.dart +++ b/benchmark/explode_benchmark.dart @@ -12,7 +12,7 @@ var poly = Polygon(coordinates: [ ], ]); -main() { +void main() { group('explode', () { benchmark('simple', () { explode(poly); diff --git a/benchmark/polygon_smooth_benchmark.dart b/benchmark/polygon_smooth_benchmark.dart index a3b5dcbb..9e4d5feb 100644 --- a/benchmark/polygon_smooth_benchmark.dart +++ b/benchmark/polygon_smooth_benchmark.dart @@ -5,7 +5,7 @@ import 'package:benchmark/benchmark.dart'; import 'package:turf/polygon_smooth.dart'; import 'package:turf/turf.dart'; -main() { +void main() { group("turf-polygon-smooth", () { var inDir = Directory('./test/examples/polygonSmooth/in'); for (var file in inDir.listSync(recursive: true)) { diff --git a/example/main.dart b/example/main.dart index 498079ef..0ee0b2be 100644 --- a/example/main.dart +++ b/example/main.dart @@ -18,7 +18,7 @@ Feature poly = Feature( ]), ); -main() { +void main() { var total = segmentReduce( poly, (previousValue, currentSegment, initialValue, featureIndex, diff --git a/lib/src/booleans/boolean_clockwise.dart b/lib/src/booleans/boolean_clockwise.dart new file mode 100644 index 00000000..9333c241 --- /dev/null +++ b/lib/src/booleans/boolean_clockwise.dart @@ -0,0 +1,47 @@ +import 'package:turf/src/invariant.dart'; + +import '../../helpers.dart'; + +/// Takes a ring and return [true] or [false] whether or not the ring is clockwise +/// or counter-clockwise. +/// Takes a [Feature] or[LineString] or a [List] to be +/// evaluated. +/// example: +/// ```dart +/// var clockwiseRing = LineString( +/// coordinates: [ +/// Position.of([0, 0]), +/// Position.of([1, 1]), +/// Position.of([1, 0]), +/// Position.of([0, 0]) +/// ], +/// ); +/// var counterClockwiseRing = LineString( +/// coordinates: [ +/// Position.of([0, 0]), +/// Position.of([1, 0]), +/// Position.of([1, 1]), +/// Position.of([0, 0]) +/// ], +/// ); +/// +/// booleanClockwise(clockwiseRing); +/// //=true +/// booleanClockwise(counterClockwiseRing); +/// //=false +/// ``` +bool booleanClockwise(LineString line) { + var ring = getCoords(line) as List; + num sum = 0; + int i = 1; + Position prev; + Position? cur; + + while (i < ring.length) { + prev = cur ?? ring[0]; + cur = ring[i]; + sum += (cur[0]! - prev[0]!) * (cur[1]! + prev[1]!); + i++; + } + return sum > 0; +} diff --git a/lib/src/booleans/boolean_concave.dart b/lib/src/booleans/boolean_concave.dart new file mode 100644 index 00000000..1e13e193 --- /dev/null +++ b/lib/src/booleans/boolean_concave.dart @@ -0,0 +1,42 @@ +import 'package:turf/helpers.dart'; + +/// Takes a [Polygon] and returns [true] or [false] as to whether it is concave +/// or not. +/// example: +/// ```dart +/// var convexPolygon = Polygon(coordinates: [ +/// [ +/// Position.of([0, 0]), +/// Position.of([0, 1]), +/// Position.of([1, 1]), +/// Position.of([1, 0]), +/// Position.of([0, 0]) +/// ] +/// ]); +/// booleanConcave(convexPolygon); +/// //=false +/// ``` +bool booleanConcave(Polygon polygon) { + // Taken from https://stackoverflow.com/a/1881201 & https://stackoverflow.com/a/25304159 + List> coords = polygon.coordinates; + + if (coords[0].length <= 4) { + return false; + } + + var sign = false; + var n = coords[0].length - 1; + for (var i = 0; i < n; i++) { + var dx1 = coords[0][(i + 2) % n][0]! - coords[0][(i + 1) % n][0]!; + var dy1 = coords[0][(i + 2) % n][1]! - coords[0][(i + 1) % n][1]!; + var dx2 = coords[0][i][0]! - coords[0][(i + 1) % n][0]!; + var dy2 = coords[0][i][1]! - coords[0][(i + 1) % n][1]!; + var zcrossproduct = dx1 * dy2 - dy1 * dx2; + if (i == 0) { + sign = zcrossproduct > 0; + } else if (sign != zcrossproduct > 0) { + return true; + } + } + return false; +} diff --git a/lib/src/booleans/boolean_contains.dart b/lib/src/booleans/boolean_contains.dart new file mode 100644 index 00000000..eeeb7260 --- /dev/null +++ b/lib/src/booleans/boolean_contains.dart @@ -0,0 +1,185 @@ +import 'package:turf/src/invariant.dart'; +import 'package:turf/turf.dart'; + +import 'boolean_point_in_polygon.dart'; +import 'boolean_point_on_line.dart'; + +/// [booleanContains] returns [true] if the second geometry is completely contained +/// by the first geometry. +/// The interiors of both geometries must intersect and, the interior and +/// boundary of the secondary must not intersect the exterior of the primary. +/// [booleanContains] returns the exact opposite result of the [booleanWithin]. +/// example: +/// ```dart +/// var line = LineString(coordinates: [ +/// Position.of([1, 1]), +/// Position.of([1, 2]), +/// Position.of([1, 3]), +/// Position.of([1, 4]) +/// ]); +/// var point = Point(coordinates: Position.of([1, 2])); +/// booleanContains(line, point); +/// //=true +/// ``` +bool booleanContains(GeoJSONObject feature1, GeoJSONObject feature2) { + var geom1 = getGeom(feature1); + var geom2 = getGeom(feature2); + + var coords1 = (geom1 as GeometryType).coordinates; + var coords2 = (geom2 as GeometryType).coordinates; + final exception = Exception("{feature2 $geom2 geometry not supported}"); + if (geom1 is Point) { + if (geom2 is Point) { + return coords1 == coords2; + } else { + throw exception; + } + } else if (geom1 is MultiPoint) { + if (geom2 is Point) { + return _isPointInMultiPoint(geom1, geom2); + } else if (geom2 is MultiPoint) { + return _isMultiPointInMultiPoint(geom1, geom2); + } else { + throw exception; + } + } else if (geom1 is LineString) { + if (geom2 is Point) { + return booleanPointOnLine(geom2, geom1, ignoreEndVertices: true); + } else if (geom2 is LineString) { + return _isLineOnLine(geom1, geom2); + } else if (geom2 is MultiPoint) { + return _isMultiPointOnLine(geom1, geom2); + } else { + throw exception; + } + } else if (geom1 is Polygon) { + if (geom2 is Point) { + return booleanPointInPolygon((geom2).coordinates, geom1, + ignoreBoundary: true); + } else if (geom2 is LineString) { + return _isLineInPoly(geom1, geom2); + } else if (geom2 is Polygon) { + return _isPolyInPoly(geom1, geom2); + } else if (geom2 is MultiPoint) { + return _isMultiPointInPoly(geom1, geom2); + } else { + throw exception; + } + } else { + throw exception; + } +} + +bool _isPointInMultiPoint(MultiPoint multiPoint, Point pt) { + for (int i = 0; i < multiPoint.coordinates.length; i++) { + if ((multiPoint.coordinates[i] == pt.coordinates)) { + return true; + } + } + return false; +} + +bool _isMultiPointInMultiPoint(MultiPoint multiPoint1, MultiPoint multiPoint2) { + for (Position coord2 in multiPoint2.coordinates) { + bool match = false; + for (Position coord1 in multiPoint1.coordinates) { + if (coord2 == coord1) { + match = true; + } + } + if (!match) return false; + } + return true; +} + +bool _isMultiPointOnLine(LineString lineString, MultiPoint multiPoint) { + var haveFoundInteriorPoint = false; + for (var coord in multiPoint.coordinates) { + if (booleanPointOnLine(Point(coordinates: coord), lineString, + ignoreEndVertices: true)) { + haveFoundInteriorPoint = true; + } + if (!booleanPointOnLine(Point(coordinates: coord), lineString)) { + return false; + } + } + return haveFoundInteriorPoint; +} + +bool _isMultiPointInPoly(Polygon polygon, MultiPoint multiPoint) { + for (var coord in multiPoint.coordinates) { + if (!booleanPointInPolygon(coord, polygon, ignoreBoundary: true)) { + return false; + } + } + return true; +} + +bool _isLineOnLine(LineString lineString1, LineString lineString2) { + var haveFoundInteriorPoint = false; + for (Position coord in lineString2.coordinates) { + if (booleanPointOnLine( + Point(coordinates: coord), + lineString1, + ignoreEndVertices: true, + )) { + haveFoundInteriorPoint = true; + } + if (!booleanPointOnLine( + Point(coordinates: coord), + lineString1, + ignoreEndVertices: false, + )) { + return false; + } + } + return haveFoundInteriorPoint; +} + +bool _isLineInPoly(Polygon polygon, LineString linestring) { + var polyBbox = bbox(polygon); + var lineBbox = bbox(linestring); + if (!_doBBoxesOverlap(polyBbox, lineBbox)) { + return false; + } + for (var i = 0; i < linestring.coordinates.length - 1; i++) { + var midPoint = + midpointRaw(linestring.coordinates[i], linestring.coordinates[i + 1]); + if (booleanPointInPolygon( + midPoint, + polygon, + ignoreBoundary: true, + )) { + return true; + } + } + return false; +} + +/// Is Polygon2 in Polygon1 +/// Only takes into account outer rings +bool _isPolyInPoly(GeoJSONObject geom1, GeoJSONObject geom2) { + var poly1Bbox = bbox(geom1); + var poly2Bbox = bbox(geom2); + if (!_doBBoxesOverlap(poly1Bbox, poly2Bbox)) { + return false; + } + + for (var ring in (geom2 as GeometryType).coordinates) { + for (var coord in ring) { + if (!booleanPointInPolygon(coord, geom1)) { + return false; + } + } + } + return true; +} + +bool _doBBoxesOverlap(BBox bbox1, BBox bbox2) { + if (bbox1[0]! > bbox2[0]! || + bbox1[2]! < bbox2[2]! || + bbox1[1]! > bbox2[1]! || + bbox1[3]! < bbox2[3]!) return false; + + return true; +} diff --git a/lib/src/booleans/boolean_crosses.dart b/lib/src/booleans/boolean_crosses.dart new file mode 100644 index 00000000..54ccdc54 --- /dev/null +++ b/lib/src/booleans/boolean_crosses.dart @@ -0,0 +1,180 @@ +import 'package:turf/src/invariant.dart'; + +import '../../helpers.dart'; +import '../line_intersect.dart'; +import '../polygon_to_line.dart'; +import 'boolean_point_in_polygon.dart'; + +/// [booleanCrosses] returns [true] if the intersection results in a geometry whose +/// dimension is one less than the maximum dimension of the two source geometries +/// and the intersection set is interior to both source geometries. +/// [booleanCsses] returns [true] for only [MultiPoint]/[Polygon], [MultiPoint]/[LineString], +/// [LineString]/[LineString], [LineString]/[Polygon], and [LineString]/[MultiPolygon] comparisons. +/// Other comparisons are not supported as they are outside the OpenGIS Simple +/// [Feature]s spec and may give unexpected results. +/// example: +/// ```dart +/// var line1 = LineString(coordinates: [ +/// Position.of([-2, 2]), +/// Position.of([4, 2]) +/// ]); +/// var line2 = LineString(coordinates: [ +/// Position.of([1, 1]), +/// Position.of([1, 2]), +/// Position.of([1, 3]), +/// Position.of([1, 4]) +/// ]); +/// var cross = booleanCrosses(line1, line2); +/// //=true +/// ``` +bool booleanCrosses(GeoJSONObject feature1, GeoJSONObject feature2) { + var geom1 = getGeom(feature1); + var geom2 = getGeom(feature2); + + var exception = Exception("$geom2 is not supperted"); + if (geom1 is MultiPoint) { + if (geom2 is LineString) { + return _doMultiPointAndLineStringCross(geom1, geom2); + } else if (geom2 is Polygon) { + return _doesMultiPointCrossPoly(geom1, geom2); + } else { + throw exception; + } + } else if (geom1 is LineString) { + if (geom2 is MultiPoint) { + // An inverse operation + return _doMultiPointAndLineStringCross(geom2, geom1); + } else if (geom2 is LineString) { + return _doLineStringsCross(geom1, geom2); + } else if (geom2 is Polygon) { + return _doLineStringAndPolygonCross(geom1, geom2); + } else { + throw exception; + } + } else if (geom1 is Polygon) { + if (geom2 is MultiPoint) { + // An inverse operation + return _doesMultiPointCrossPoly(geom2, geom1); + } else if (geom2 is LineString) { + // An inverse operation + return _doLineStringAndPolygonCross(geom2, geom1); + } else { + throw exception; + } + } else { + throw exception; + } +} + +bool _doMultiPointAndLineStringCross( + MultiPoint multiPoint, LineString lineString) { + var foundIntPoint = false; + var foundExtPoint = false; + var pointLength = multiPoint.coordinates.length; + var i = 0; + while (i < pointLength && !foundIntPoint && !foundExtPoint) { + for (var i2 = 0; i2 < lineString.coordinates.length - 1; i2++) { + var incEndVertices = true; + if (i2 == 0 || i2 == lineString.coordinates.length - 2) { + incEndVertices = false; + } + if (isPointOnLineSegment( + lineString.coordinates[i2], + lineString.coordinates[i2 + 1], + multiPoint.coordinates[i], + incEndVertices)) { + foundIntPoint = true; + } else { + foundExtPoint = true; + } + } + i++; + } + return foundIntPoint && foundExtPoint; +} + +bool _doLineStringsCross(LineString lineString1, LineString lineString2) { + var doLinesIntersect = lineIntersect(lineString1, lineString2); + if (doLinesIntersect.features.isNotEmpty) { + for (var i = 0; i < lineString1.coordinates.length - 1; i++) { + for (var i2 = 0; i2 < lineString2.coordinates.length - 1; i2++) { + var incEndVertices = true; + if (i2 == 0 || i2 == lineString2.coordinates.length - 2) { + incEndVertices = false; + } + if (isPointOnLineSegment( + lineString1.coordinates[i], + lineString1.coordinates[i + 1], + lineString2.coordinates[i2], + incEndVertices)) { + return true; + } + } + } + } + return false; +} + +bool _doLineStringAndPolygonCross(LineString lineString, Polygon polygon) { + Feature line = polygonToLine(polygon) as Feature; + var doLinesIntersect = lineIntersect(lineString, line); + if (doLinesIntersect.features.isNotEmpty) return true; + + return false; +} + +bool _doesMultiPointCrossPoly(MultiPoint multiPoint, Polygon polygon) { + var foundIntPoint = false; + var foundExtPoint = false; + var pointLength = multiPoint.coordinates.length; + for (var i = 0; i < pointLength && (!foundIntPoint || !foundExtPoint); i++) { + if (booleanPointInPolygon(multiPoint.coordinates[i], polygon)) { + foundIntPoint = true; + } else { + foundExtPoint = true; + } + } + + return foundExtPoint && foundIntPoint; +} + +/// Only takes into account outer rings +/// See http://stackoverflow.com/a/4833823/1979085 +/// lineSegmentStart [Position] of start of line +/// lineSegmentEnd [Position] of end of line +/// pt [Position] of point to check +/// [incEnd] controls whether the [Point] is allowed to fall on the line ends +bool isPointOnLineSegment( + Position lineSegmentStart, + Position lineSegmentEnd, + Position pt, + bool incEnd, +) { + var dxc = pt[0]! - lineSegmentStart[0]!; + var dyc = pt[1]! - lineSegmentStart[1]!; + var dxl = lineSegmentEnd[0]! - lineSegmentStart[0]!; + var dyl = lineSegmentEnd[1]! - lineSegmentStart[1]!; + var cross = dxc * dyl - dyc * dxl; + if (cross != 0) { + return false; + } + if (incEnd) { + if ((dxl).abs() >= (dyl).abs()) { + return dxl > 0 + ? lineSegmentStart[0]! <= pt[0]! && pt[0]! <= lineSegmentEnd[0]! + : lineSegmentEnd[0]! <= pt[0]! && pt[0]! <= lineSegmentStart[0]!; + } + return dyl > 0 + ? lineSegmentStart[1]! <= pt[1]! && pt[1]! <= lineSegmentEnd[1]! + : lineSegmentEnd[1]! <= pt[1]! && pt[1]! <= lineSegmentStart[1]!; + } else { + if ((dxl).abs() >= (dyl).abs()) { + return dxl > 0 + ? lineSegmentStart[0]! < pt[0]! && pt[0]! < lineSegmentEnd[0]! + : lineSegmentEnd[0]! < pt[0]! && pt[0]! < lineSegmentStart[0]!; + } + return dyl > 0 + ? lineSegmentStart[1]! < pt[1]! && pt[1]! < lineSegmentEnd[1]! + : lineSegmentEnd[1]! < pt[1]! && pt[1]! < lineSegmentStart[1]!; + } +} diff --git a/lib/src/booleans/boolean_disjoint.dart b/lib/src/booleans/boolean_disjoint.dart new file mode 100644 index 00000000..ff104ca4 --- /dev/null +++ b/lib/src/booleans/boolean_disjoint.dart @@ -0,0 +1,125 @@ +import 'package:turf/src/booleans/boolean_crosses.dart'; + +import '../../helpers.dart'; +import '../../meta.dart'; +import '../line_intersect.dart'; +import '../polygon_to_line.dart'; +import 'boolean_point_in_polygon.dart'; + +/// Returns [true] if the intersection of the two geometries is an empty set. +/// example: +/// ```dart +/// var point = Point(coordinates: Position.of([2, 2])); +/// var line = LineString( +/// coordinates: [ +/// Position.of([1, 1]), +/// Position.of([1, 2]), +/// Position.of([1, 3]), +/// Position.of([1, 4]) +/// ], +/// ); +/// booleanDisjoint(line, point); +/// //=true +/// ``` +bool booleanDisjoint(GeoJSONObject feature1, GeoJSONObject feature2) { + var bool = true; + flattenEach( + feature1, + (flatten1, featureIndex, multiFeatureIndex) { + flattenEach( + feature2, + (flatten2, featureIndex, multiFeatureIndex) { + if (!bool) { + return bool; + } + bool = _disjoint(flatten1.geometry!, flatten2.geometry!); + }, + ); + }, + ); + return bool; +} + +/// Disjoint operation for simple Geometries ([Point]/[LineString]/[Polygon]) +bool _disjoint(GeometryType geom1, GeometryType geom2) { + if (geom1 is Point) { + if (geom2 is Point) { + return geom1.coordinates != geom2.coordinates; + } else if (geom2 is LineString) { + return !_isPointOnLine(geom2, geom1); + } else if (geom2 is Polygon) { + return !booleanPointInPolygon((geom1).coordinates, geom2); + } + } else if (geom1 is LineString) { + if (geom2 is Point) { + return !_isPointOnLine(geom1, geom2); + } else if (geom2 is LineString) { + return !_isLineOnLine(geom1, geom2); + } else if (geom2 is Polygon) { + return !_isLineInPoly(geom2, geom1); + } + } else if (geom1 is Polygon) { + if (geom2 is Point) { + return !booleanPointInPolygon((geom2).coordinates, geom1); + } else if (geom2 is LineString) { + return !_isLineInPoly(geom1, geom2); + } else if (geom2 is Polygon) { + return !_isPolyInPoly(geom2, geom1); + } + } + return false; +} + +// http://stackoverflow.com/a/11908158/1979085 +bool _isPointOnLine(LineString lineString, Point pt) { + for (var i = 0; i < lineString.coordinates.length - 1; i++) { + if (isPointOnLineSegment(lineString.coordinates[i], + lineString.coordinates[i + 1], pt.coordinates, true)) { + return true; + } + } + return false; +} + +bool _isLineOnLine(LineString lineString1, LineString lineString2) { + var doLinesIntersect = lineIntersect(lineString1, lineString2); + if (doLinesIntersect.features.isNotEmpty) { + return true; + } + return false; +} + +bool _isLineInPoly(Polygon polygon, LineString lineString) { + for (var coord in lineString.coordinates) { + if (booleanPointInPolygon(coord, polygon)) { + return true; + } + } + var doLinesIntersect = lineIntersect(lineString, polygonToLine(polygon)); + if (doLinesIntersect.features.isNotEmpty) { + return true; + } + return false; +} + +/// Is [Polygon] (geom1) in [Polygon] (geom2) +/// Only takes into account outer rings +/// See http://stackoverflow.com/a/4833823/1979085 +bool _isPolyInPoly(Polygon feature1, Polygon feature2) { + for (var coord1 in feature1.coordinates[0]) { + if (booleanPointInPolygon(coord1, feature2)) { + return true; + } + } + for (var coord2 in feature2.coordinates[0]) { + if (booleanPointInPolygon(coord2, feature1)) { + return true; + } + } + var doLinesIntersect = + lineIntersect(polygonToLine(feature1), polygonToLine(feature2)); + if (doLinesIntersect.features.isNotEmpty) { + return true; + } + return false; +} diff --git a/lib/src/booleans/boolean_equal.dart b/lib/src/booleans/boolean_equal.dart new file mode 100644 index 00000000..6fadc741 --- /dev/null +++ b/lib/src/booleans/boolean_equal.dart @@ -0,0 +1,41 @@ +import 'package:turf_equality/turf_equality.dart'; + +import '../../helpers.dart'; +import '../clean_coords.dart'; + +/// Determine whether two geometries of the same type have identical X,Y coordinate values. +/// See http://edndoc.esri.com/arcsde/9.0/general_topics/understand_spatial_relations.htm +/// [precision]=6 sets decimal precision to use when comparing coordinates. +/// With [direction] set to [true], even if the [LineString]s are reverse versions +/// of each other but they have similar [Position]s, they will be considered the +/// same. If [shiftedPolygon] is [true], two [Polygon]s with shifted [Position]s +/// are considered the same. +/// Returns [true] if the objects are equal, [false] otherwise +/// example: +/// ```dart +/// var pt1 = Point(coordinates: Position.of([0, 0])); +/// var pt2 = Point(coordinates: Position.of([0, 0])); +/// var pt3 = Point(coordinates: Position.of([1, 1])); +/// booleanEqual(pt1, pt2); +/// //= true +/// booleanEqual(pt2, pt3); +/// //= false +/// ``` +bool booleanEqual( + GeoJSONObject feature1, + GeoJSONObject feature2, { + int precision = 6, + bool direction = false, + bool shiftedPolygon = false, +}) { + if (precision < 0 || precision > 17) { + throw Exception("precision must be a positive number and smaller than 15"); + } + + var equality = Equality( + precision: precision, + shiftedPolygons: shiftedPolygon, + reversedGeometries: direction, + ); + return equality.compare(cleanCoords(feature1), cleanCoords(feature2)); +} diff --git a/lib/src/booleans/boolean_intersects.dart b/lib/src/booleans/boolean_intersects.dart new file mode 100644 index 00000000..2c978701 --- /dev/null +++ b/lib/src/booleans/boolean_intersects.dart @@ -0,0 +1,32 @@ +import '../../helpers.dart'; +import '../../meta.dart'; +import 'boolean_disjoint.dart'; + +/// Returns [true] when two geometries intersect. +/// Takes [feature1] & [feature2] parameters of type [GeoJSONObject] which can be +/// a [Feature] or [GeometryType]. +/// example +/// ```dart +/// var point = Point(coordinates:Position.of([2, 2])); +/// var line = LineString(coordinates:[Position.of([1, 1]), Position.of([1, 2]), Position.of([1, 3]), Position.of([1, 4]])); +/// booleanIntersects(line, point); +/// //=true +/// ``` +bool booleanIntersects(GeoJSONObject feature1, GeoJSONObject feature2) { + var result = false; + flattenEach( + feature1, + (flatten1, featureIndex, multiFeatureIndex) { + flattenEach( + feature2, + (flatten2, featureIndex, multiFeatureIndex) { + if (result) { + return true; + } + result = !booleanDisjoint(flatten1, flatten2); + }, + ); + }, + ); + return result; +} diff --git a/lib/src/booleans/boolean_parallel.dart b/lib/src/booleans/boolean_parallel.dart new file mode 100644 index 00000000..8f446f57 --- /dev/null +++ b/lib/src/booleans/boolean_parallel.dart @@ -0,0 +1,46 @@ +import 'package:turf/src/rhumb_bearing.dart'; + +import '../../helpers.dart'; +import '../../line_segment.dart'; +import '../clean_coords.dart'; + +/// Returns [true] if each segment of [line1] is parallel to the correspondent +/// segment of [line2] +/// example: +/// ```dart +/// var line1 = LineString( +/// coordinates: [ +/// Position.of([0, 0]), +/// Position.of([0, 1]) +/// ], +/// ); +/// var line2 = LineString( +/// coordinates: [ +/// Position.of([1, 0]), +/// Position.of([1, 1]) +/// ], +/// ); +/// booleanParallel(line1, line2); +/// //=true +/// ``` +bool booleanParallel(LineString line1, LineString line2) { + FeatureCollection segments1 = lineSegment(cleanCoords(line1)); + FeatureCollection segments2 = lineSegment(cleanCoords(line2)); + for (int i = 0; i < segments1.features.length; i++) { + var segment1 = segments1.features[i].geometry!.coordinates; + var seg2i = segments2.features.asMap().containsKey(i); + if (!seg2i) break; + var segment2 = segments2.features[i].geometry!.coordinates; + if (!_isParallel(segment1, segment2)) return false; + } + return true; +} + +/// Compares slopes and returns result +bool _isParallel(List segment1, List segment2) { + var slope1 = bearingToAzimuth(rhumbBearing( + Point(coordinates: segment1[0]), Point(coordinates: segment1[1]))); + var slope2 = bearingToAzimuth(rhumbBearing( + Point(coordinates: segment2[0]), Point(coordinates: segment2[1]))); + return slope1 == slope2; +} diff --git a/lib/src/booleans/boolean_point_in_polygon.dart b/lib/src/booleans/boolean_point_in_polygon.dart new file mode 100644 index 00000000..1f297e06 --- /dev/null +++ b/lib/src/booleans/boolean_point_in_polygon.dart @@ -0,0 +1,69 @@ +// http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule +// modified from: https://github.com/substack/point-in-polygon/blob/master/index.js +// which was modified from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html + +import 'package:turf_pip/turf_pip.dart'; + +import '../../helpers.dart'; +import '../invariant.dart'; + +/// Takes a [Point], and a [Polygon] or [MultiPolygon]and determines if the +/// [Point] resides within the [Polygon]. The [Polygon] can be convex or concave. +/// The function accounts for holes. By taking a [Feature] or a +/// [Feature]<[MultiPolygon]>. [ignoreBoundary=false] should be set to [true] if +/// [Polygon]'s boundary should be ignored when determining if the [Point] is +/// inside the [Polygon], otherwise, false. +/// example: +/// ```dart +/// var pt = Point(coordinates: Position([-77, 44])); +/// var poly = Polygon(coordinates:[[ +/// Position.of([-81, 41]), +/// Position.of([-81, 47]), +/// Position.of([-72, 47]), +/// Position.of([-72, 41]), +/// Position.of([-81, 41]) +/// ]]); +/// turf.booleanPointInPolygon(pt, poly); +/// //= true +/// ``` +bool booleanPointInPolygon( + Position point, + GeoJSONObject polygon, { + bool ignoreBoundary = false, +}) { + List>>? polys; + BBox? bbox = polygon.bbox; + + var theGeom = getGeom(polygon); + if (theGeom is Polygon) { + polys = [theGeom.coordinates]; + } else if (theGeom is MultiPolygon) { + polys = theGeom.coordinates; + } else { + throw Exception('${polygon.type} is not supported'); + } + + // Quick elimination if point is not inside bbox + if (bbox != null && !_inBBox(point, bbox)) { + return false; + } + + for (var i = 0; i < polys.length; ++i) { + var polyResult = pointInPolygon( + Point(coordinates: point), Polygon(coordinates: polys[i])); + if (polyResult == PointInPolygonResult.isOnEdge) { + return ignoreBoundary ? false : true; + } else if (polyResult == PointInPolygonResult.isInside) { + return true; + } + } + + return false; +} + +bool _inBBox(Position pt, BBox bbox) { + return (bbox[0]! <= pt[0]! && + bbox[1]! <= pt[1]! && + bbox[2]! >= pt[0]! && + bbox[3]! >= pt[1]!); +} diff --git a/lib/src/booleans/boolean_point_on_line.dart b/lib/src/booleans/boolean_point_on_line.dart new file mode 100644 index 00000000..ffc0dd5b --- /dev/null +++ b/lib/src/booleans/boolean_point_on_line.dart @@ -0,0 +1,92 @@ +import 'package:turf/helpers.dart'; + +/// Returns [true] if a point is on a line. Accepts an optional parameter to ignore the +/// start and end vertices of the [LineString]. +/// The [ignoreEndVertices=false] controls whether to ignore the start and end vertices. +/// [epsilon] is the Fractional number to compare with the cross product result. +/// It's useful for dealing with floating points in lng/lat +/// example: +/// ```dart +/// var pt = Point(coordinates:Position.of([0, 0])); +/// var line = LineString(coordinates: [ +/// Position.of([-1, -1]), +/// Position.of([1, 1]), +/// Position.of([1.5, 2.2]), +/// ]); +/// var isPointOnLine = booleanPointOnLine(pt, line); +/// //=true +/// ``` +enum BoundaryType { none, start, end, both } + +bool booleanPointOnLine(Point pt, LineString line, + {bool ignoreEndVertices = false, num? epsilon}) { + for (var i = 0; i < line.coordinates.length - 1; i++) { + BoundaryType ignoreBoundary = BoundaryType.none; + if (ignoreEndVertices) { + if (i == 0) { + ignoreBoundary = BoundaryType.start; + } + if (i == line.coordinates.length - 2) { + ignoreBoundary = BoundaryType.end; + } + if (i == 0 && i + 1 == line.coordinates.length - 1) { + ignoreBoundary = BoundaryType.both; + } + } + if (_isPointOnLineSegment(line.coordinates[i], line.coordinates[i + 1], + pt.coordinates, ignoreBoundary, epsilon)) { + return true; + } + } + return false; +} + +// See http://stackoverflow.com/a/4833823/1979085 +// See https://stackoverflow.com/a/328122/1048847 +/// [pt] is the coord pair of the [Point] to check. +/// [excludeBoundary] controls whether the point is allowed to fall on the line ends. +/// [epsilon] is the Fractional number to compare with the cross product result. +/// Useful for dealing with floating points such as lng/lat points. +bool _isPointOnLineSegment(Position lineSegmentStart, Position lineSegmentEnd, + Position pt, BoundaryType excludeBoundary, num? epsilon) { + var x = pt[0]!; + var y = pt[1]!; + var x1 = lineSegmentStart[0]; + var y1 = lineSegmentStart[1]; + var x2 = lineSegmentEnd[0]; + var y2 = lineSegmentEnd[1]; + var dxc = pt[0]! - x1!; + var dyc = pt[1]! - y1!; + var dxl = x2! - x1; + var dyl = y2! - y1; + var cross = dxc * dyl - dyc * dxl; + if (epsilon != null) { + if ((cross).abs() > epsilon) { + return false; + } + } else if (cross != 0) { + return false; + } + if (excludeBoundary == BoundaryType.none) { + if ((dxl).abs() >= (dyl).abs()) { + return dxl > 0 ? x1 <= x && x <= x2 : x2 <= x && x <= x1; + } + return dyl > 0 ? y1 <= y && y <= y2 : y2 <= y && y <= y1; + } else if (excludeBoundary == BoundaryType.start) { + if ((dxl).abs() >= (dyl).abs()) { + return dxl > 0 ? x1 < x && x <= x2 : x2 <= x && x < x1; + } + return dyl > 0 ? y1 < y && y <= y2 : y2 <= y && y < y1; + } else if (excludeBoundary == BoundaryType.end) { + if ((dxl).abs() >= (dyl).abs()) { + return dxl > 0 ? x1 <= x && x < x2 : x2 < x && x <= x1; + } + return dyl > 0 ? y1 <= y && y < y2 : y2 < y && y <= y1; + } else if (excludeBoundary == BoundaryType.both) { + if ((dxl).abs() >= (dyl).abs()) { + return dxl > 0 ? x1 < x && x < x2 : x2 < x && x < x1; + } + return dyl > 0 ? y1 < y && y < y2 : y2 < y && y < y1; + } + return false; +} diff --git a/lib/src/booleans/boolean_touches.dart b/lib/src/booleans/boolean_touches.dart new file mode 100644 index 00000000..79109e90 --- /dev/null +++ b/lib/src/booleans/boolean_touches.dart @@ -0,0 +1,592 @@ +import 'package:turf/src/invariant.dart'; + +import '../../helpers.dart'; +import 'boolean_point_in_polygon.dart'; +import 'boolean_point_on_line.dart'; + +/// Boolean-touches [true] if none of the [Point]s common to both geometries +/// intersect the interiors of both geometries. +/// example +/// ```dart +/// var line = LineString(coordinates;[Positin.of([1, 1]), Positin.of([1, 2]), Positin.of([1, 3]), Positin.of([1, 4])]); +/// var point = Point(coordinates: Positon.of([1, 1])); +/// booleanTouches(point, line); +/// //=true +/// ``` +bool booleanTouches(GeoJSONObject feature1, GeoJSONObject feature2) { + var geom1 = getGeom(feature1); + var geom2 = getGeom(feature2); + + if (geom1 is Point) { + if (geom2 is LineString) { + return isPointOnLineEnd(geom1, geom2); + } else if (geom2 is MultiLineString) { + var foundTouchingPoint = false; + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (isPointOnLineEnd( + geom1, + LineString( + coordinates: geom2.coordinates[ii], + ), + )) { + foundTouchingPoint = true; + } + } + return foundTouchingPoint; + } else if (geom2 is Polygon) { + for (var i = 0; i < geom2.coordinates.length; i++) { + if (booleanPointOnLine( + geom1, + LineString( + coordinates: geom2.coordinates[i], + ), + )) { + return true; + } + } + return false; + } else if (geom2 is MultiPolygon) { + for (var i = 0; i < geom2.coordinates.length; i++) { + for (var ii = 0; ii < geom2.coordinates[i].length; ii++) { + if (booleanPointOnLine( + geom1, + LineString( + coordinates: geom2.coordinates[i][ii], + ), + )) { + return true; + } + } + } + return false; + } else { + throw Exception("feature2 $geom2 geometry not supported"); + } + } else if (geom1 is MultiPoint) { + if (geom2 is LineString) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + if (!foundTouchingPoint) { + if (isPointOnLineEnd( + Point(coordinates: geom1.coordinates[i]), geom2)) { + foundTouchingPoint = true; + } + } + if (booleanPointOnLine(Point(coordinates: geom1.coordinates[i]), geom2, + ignoreEndVertices: true)) return false; + } + return foundTouchingPoint; + } else if (geom2 is MultiLineString) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (!foundTouchingPoint) { + if (isPointOnLineEnd(Point(coordinates: geom1.coordinates[i]), + LineString(coordinates: geom2.coordinates[ii]))) { + foundTouchingPoint = true; + } + } + if (booleanPointOnLine(Point(coordinates: geom1.coordinates[i]), + LineString(coordinates: geom2.coordinates[ii]), + ignoreEndVertices: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else if (geom2 is Polygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine( + Point(coordinates: geom1.coordinates[i]), + LineString(coordinates: geom2.coordinates[0]), + )) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom1.coordinates[i], geom2, + ignoreBoundary: true)) { + return false; + } + } + return foundTouchingPoint; + } else if (geom2 is MultiPolygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine( + Point(coordinates: geom1.coordinates[i]), + LineString( + coordinates: geom2.coordinates[ii][0], + ), + )) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon( + geom1.coordinates[i], Polygon(coordinates: geom2.coordinates[ii]), + ignoreBoundary: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else { + throw Exception("feature2 $geom2 geometry not supported"); + } + } else if (geom1 is LineString) { + if (geom2 is Point) { + return isPointOnLineEnd(geom2, geom1); + } else if (geom2 is MultiPoint) { + var foundTouchingPoint = false; + for (var i = 0; i < geom2.coordinates.length; i++) { + if (!foundTouchingPoint) { + if (isPointOnLineEnd( + Point(coordinates: geom2.coordinates[i]), geom1)) { + foundTouchingPoint = true; + } + } + if (booleanPointOnLine(Point(coordinates: geom2.coordinates[i]), geom1, + ignoreEndVertices: true)) { + return false; + } + } + return foundTouchingPoint; + } else if (geom2 is LineString) { + var endMatch = false; + if (isPointOnLineEnd(Point(coordinates: geom1.coordinates[0]), geom2)) { + endMatch = true; + } + if (isPointOnLineEnd( + Point( + coordinates: geom1.coordinates[geom1.coordinates.length - 1], + ), + geom2)) endMatch = true; + if (endMatch == false) return false; + for (var i = 0; i < geom1.coordinates.length; i++) { + if (booleanPointOnLine(Point(coordinates: geom1.coordinates[i]), geom2, + ignoreEndVertices: true)) { + return false; + } + } + return endMatch; + } else if (geom2 is MultiLineString) { + var endMatch = false; + for (var i = 0; i < geom2.coordinates.length; i++) { + if (isPointOnLineEnd(Point(coordinates: geom1.coordinates[0]), + LineString(coordinates: geom2.coordinates[i]))) { + endMatch = true; + } + if (isPointOnLineEnd( + Point( + coordinates: geom1.coordinates[geom1.coordinates.length - 1], + ), + LineString(coordinates: geom2.coordinates[i]))) { + endMatch = true; + } + for (var ii = 0; ii < geom1.coordinates[i].length; ii++) { + if (booleanPointOnLine(Point(coordinates: geom1.coordinates[ii]), + LineString(coordinates: geom2.coordinates[i]), + ignoreEndVertices: true)) { + return false; + } + } + } + return endMatch; + } else if (geom2 is Polygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine(Point(coordinates: geom1.coordinates[i]), + LineString(coordinates: geom2.coordinates[0]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom1.coordinates[i], geom2, + ignoreBoundary: true)) { + return false; + } + } + return foundTouchingPoint; + } else if (geom2 is MultiPolygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine( + Point(coordinates: geom1.coordinates[i]), + LineString( + coordinates: geom2.coordinates[ii][0], + ), + )) { + foundTouchingPoint = true; + } + } + } + if (booleanPointInPolygon(geom1.coordinates[i], geom2, + ignoreBoundary: true)) { + return false; + } + } + return foundTouchingPoint; + } else { + throw Exception("feature2 $geom2 geometry not supported"); + } + } else if (geom1 is MultiLineString) { + if (geom2 is Point) { + for (var i = 0; i < geom1.coordinates.length; i++) { + if (isPointOnLineEnd( + geom2, + LineString( + coordinates: geom1.coordinates[i], + ))) { + return true; + } + } + return false; + } else if (geom2 is MultiPoint) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (!foundTouchingPoint) { + if (isPointOnLineEnd(Point(coordinates: geom2.coordinates[ii]), + LineString(coordinates: geom1.coordinates[ii]))) { + foundTouchingPoint = true; + } + } + if (booleanPointOnLine(Point(coordinates: geom2.coordinates[ii]), + LineString(coordinates: geom1.coordinates[ii]), + ignoreEndVertices: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else if (geom2 is LineString) { + var endMatch = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + if (isPointOnLineEnd( + Point(coordinates: geom1.coordinates[i][0]), geom2)) { + endMatch = true; + } + if (isPointOnLineEnd( + Point( + coordinates: geom1.coordinates[i] + [geom1.coordinates[i].length - 1], + ), + geom2)) { + endMatch = true; + } + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (booleanPointOnLine(Point(coordinates: geom2.coordinates[ii]), + LineString(coordinates: geom1.coordinates[i]), + ignoreEndVertices: true)) { + return false; + } + } + } + return endMatch; + } else if (geom2 is MultiLineString) { + var endMatch = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (isPointOnLineEnd(Point(coordinates: geom1.coordinates[i][0]), + LineString(coordinates: geom2.coordinates[ii]))) { + endMatch = true; + } + if (isPointOnLineEnd( + Point( + coordinates: geom1.coordinates[i] + [geom1.coordinates[i].length - 1], + ), + LineString(coordinates: geom2.coordinates[ii]))) { + endMatch = true; + } + for (var iii = 0; iii < geom1.coordinates[i].length; iii++) { + if (booleanPointOnLine( + Point(coordinates: geom1.coordinates[i][iii]), + LineString(coordinates: geom2.coordinates[ii]), + ignoreEndVertices: true)) { + return false; + } + } + } + } + return endMatch; + } else if (geom2 is Polygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + for (var ii = 0; ii < geom1.coordinates.length; ii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine(Point(coordinates: geom1.coordinates[i][ii]), + LineString(coordinates: geom2.coordinates[0]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom1.coordinates[i][ii], geom2, + ignoreBoundary: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else if (geom2 is MultiPolygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom2.coordinates[0].length; i++) { + for (var ii = 0; ii < geom1.coordinates.length; ii++) { + for (var iii = 0; iii < geom1.coordinates[ii].length; iii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine( + Point( + coordinates: geom1.coordinates[ii][iii], + ), + LineString( + coordinates: geom2.coordinates[0][i], + ))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom1.coordinates[ii][iii], + Polygon(coordinates: [geom2.coordinates[0][i]]), + ignoreBoundary: true)) { + return false; + } + } + } + } + return foundTouchingPoint; + } else { + throw Exception("feature2 $geom2 geometry not supported"); + } + } else if (geom1 is Polygon) { + if (geom2 is Point) { + for (var i = 0; i < geom1.coordinates.length; i++) { + if (booleanPointOnLine( + geom2, + LineString( + coordinates: geom1.coordinates[i], + ))) { + return true; + } + } + return false; + } else if (geom2 is MultiPoint) { + var foundTouchingPoint = false; + for (var i = 0; i < geom2.coordinates.length; i++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine(Point(coordinates: geom2.coordinates[i]), + LineString(coordinates: geom1.coordinates[0]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom2.coordinates[i], geom1, + ignoreBoundary: true)) return false; + } + return foundTouchingPoint; + } else if (geom2 is LineString) { + var foundTouchingPoint = false; + for (var i = 0; i < geom2.coordinates.length; i++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine(Point(coordinates: geom2.coordinates[i]), + LineString(coordinates: geom1.coordinates[0]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom2.coordinates[i], geom1, + ignoreBoundary: true)) { + return false; + } + } + return foundTouchingPoint; + } else if (geom2 is MultiLineString) { + var foundTouchingPoint = false; + for (var i = 0; i < geom2.coordinates.length; i++) { + for (var ii = 0; ii < geom2.coordinates[i].length; ii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine(Point(coordinates: geom2.coordinates[i][ii]), + LineString(coordinates: geom1.coordinates[0]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom2.coordinates[i][ii], geom1, + ignoreBoundary: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else if (geom2 is Polygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates[0].length; i++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine( + Point(coordinates: geom1.coordinates[0][i]), + LineString(coordinates: geom2.coordinates[0]), + )) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom1.coordinates[0][i], geom2, + ignoreBoundary: true)) { + return false; + } + } + return foundTouchingPoint; + } else if (geom2 is MultiPolygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom2.coordinates[0].length; i++) { + for (var ii = 0; ii < geom1.coordinates[0].length; ii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine(Point(coordinates: geom1.coordinates[0][ii]), + LineString(coordinates: geom2.coordinates[0][i]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom1.coordinates[0][ii], + Polygon(coordinates: [geom2.coordinates[0][i]]), + ignoreBoundary: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else { + throw Exception("feature2 $geom2 geometry not supported"); + } + } else if (geom1 is MultiPolygon) { + if (geom2 is Point) { + for (var i = 0; i < geom1.coordinates[0].length; i++) { + if (booleanPointOnLine( + geom2, + LineString( + coordinates: geom1.coordinates[0][i], + ), + )) { + return true; + } + } + return false; + } else if (geom2 is MultiPoint) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates[0].length; i++) { + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine(Point(coordinates: geom2.coordinates[ii]), + LineString(coordinates: geom1.coordinates[0][i]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom2.coordinates[ii], + Polygon(coordinates: [geom1.coordinates[0][i]]), + ignoreBoundary: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else if (geom2 is LineString) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates[0].length; i++) { + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine(Point(coordinates: geom2.coordinates[ii]), + LineString(coordinates: geom1.coordinates[0][i]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom2.coordinates[ii], + Polygon(coordinates: [geom1.coordinates[0][i]]), + ignoreBoundary: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else if (geom2 is MultiLineString) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates.length; i++) { + for (var ii = 0; ii < geom2.coordinates.length; ii++) { + for (var iii = 0; iii < geom2.coordinates[ii].length; iii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine( + Point( + coordinates: geom2.coordinates[ii][iii], + ), + LineString( + coordinates: geom1.coordinates[i][0], + ), + )) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom2.coordinates[ii][iii], + Polygon(coordinates: [geom1.coordinates[i][0]]), + ignoreBoundary: true)) { + return false; + } + } + } + } + + return foundTouchingPoint; + } else if (geom2 is Polygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates[0].length; i++) { + for (var ii = 0; ii < geom1.coordinates[0][i].length; ii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine( + Point(coordinates: geom1.coordinates[0][i][ii]), + LineString(coordinates: geom2.coordinates[0]))) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom1.coordinates[0][i][ii], geom2, + ignoreBoundary: true)) { + return false; + } + } + } + return foundTouchingPoint; + } else if (geom2 is MultiPolygon) { + var foundTouchingPoint = false; + for (var i = 0; i < geom1.coordinates[0].length; i++) { + for (var ii = 0; ii < geom2.coordinates[0].length; ii++) { + for (var iii = 0; iii < geom1.coordinates[0].length; iii++) { + if (!foundTouchingPoint) { + if (booleanPointOnLine( + Point( + coordinates: geom1.coordinates[0][i][iii], + ), + LineString( + coordinates: geom2.coordinates[0][ii], + ), + )) { + foundTouchingPoint = true; + } + } + if (booleanPointInPolygon(geom1.coordinates[0][i][iii], + Polygon(coordinates: [geom2.coordinates[0][ii]]), + ignoreBoundary: true)) { + return false; + } + } + } + } + return foundTouchingPoint; + } else { + throw Exception("feature2 $geom2 geometry not supported"); + } + } else { + throw Exception("feature1 $geom1 geometry not supported"); + } +} + +bool isPointOnLineEnd(Point point, LineString line) { + if (line.coordinates[0] == point.coordinates) return true; + if (line.coordinates[line.coordinates.length - 1] == point.coordinates) { + return true; + } + return false; +} diff --git a/lib/src/booleans/boolean_valid.dart b/lib/src/booleans/boolean_valid.dart new file mode 100644 index 00000000..5a06e741 --- /dev/null +++ b/lib/src/booleans/boolean_valid.dart @@ -0,0 +1,149 @@ +import 'package:turf/polygon_to_line.dart'; +import 'package:turf/src/booleans/boolean_disjoint.dart'; +import 'package:turf/src/booleans/boolean_point_on_line.dart'; +import 'package:turf/src/invariant.dart'; +import 'package:turf/src/meta/extensions.dart'; + +import '../../helpers.dart'; +import '../line_intersect.dart'; +import 'boolean_crosses.dart'; + +bool _checkRingsClose(List geom) { + return (geom[0].lng == geom[geom.length - 1].lng || + geom[0].lat == geom[geom.length - 1].lat); +} + +bool _checkRingsForSpikesPunctures(List geom) { + for (var i = 0; i < geom.length - 1; i++) { + var point = Point(coordinates: geom[i]); + for (var ii = i + 1; ii < geom.length - 2; ii++) { + var seg = [geom[ii], geom[ii + 1]]; + if (booleanPointOnLine(point, LineString(coordinates: seg))) return true; + } + } + return false; +} + +bool _checkPolygonAgainstOthers(Polygon poly, MultiPolygon geom, int index) { + for (var i = index + 1; i < geom.coordinates.length; i++) { + if (!booleanDisjoint(poly, Polygon(coordinates: geom.coordinates[i]))) { + LineString lineS = LineString(coordinates: geom.coordinates[i][0]); + if (booleanCrosses(poly, lineS)) { + Feature line = polygonToLine(poly) as Feature; + var doLinesIntersect = lineIntersect(lineS, line); + + /// http://portal.opengeospatial.org/files/?artifact_id=829 p.22 - 2 : + /// 1 intersection Point is 'finite', therefore passes the test + if (doLinesIntersect.features.length == 1) return true; + return false; + } + } + } + return true; +} + +/// booleanValid checks if the geometry is a valid according to the OGC Simple +/// Feature Specification. +/// Take a [Feature] or a [GeometryType] +/// example +/// ```dart +/// var line = LineString(coordinates:[Position.of([1, 1]), Position.of([1, 2]), +/// Position.of([1, 3]), Position.of([1, 4])]); +/// booleanValid(line); // => true +/// booleanValid({foo: "bar"}); // => false +/// ``` +bool booleanValid(GeoJSONObject feature) { + // Parse GeoJSON + if (feature is FeatureCollection) { + for (Feature f in feature.features) { + if (!booleanValid(f)) { + return false; + } + } + } else if (feature is GeometryCollection) { + for (GeometryObject g in feature.geometries) { + if (!booleanValid(g)) { + return false; + } + } + } else { + var geom = getGeom(feature); + + if (geom is Point) { + if (!(geom.coordinates.length >= 2 && geom.coordinates.length <= 3)) { + return false; + } + } else if (geom is MultiPoint) { + if (geom.coordinates.length < 2) { + return false; + } + for (Position p in geom.coordinates) { + if (!booleanValid(Point(coordinates: p))) return false; + } + } else if (geom is LineString) { + if (geom.coordinates.length < 2) return false; + for (Position p in geom.coordinates) { + if (!booleanValid(Point(coordinates: p))) return false; + } + } else if (geom is MultiLineString) { + if (geom.coordinates.length < 2) return false; + for (var i = 0; i < geom.coordinates.length; i++) { + if (!booleanValid(LineString(coordinates: geom.coordinates[i]))) { + return false; + } + } + } else if (geom is Polygon) { + var valid = true; + geom.coordEach((Position? cCoord, _, __, ___, ____) { + valid = booleanValid(Point(coordinates: cCoord!)); + }); + if (!valid) return false; + for (var i = 0; i < geom.coordinates.length; i++) { + if (geom.coordinates[i].length < 4) return false; + if (!_checkRingsClose(geom.coordinates[i])) return false; + if (_checkRingsForSpikesPunctures(geom.coordinates[i])) return false; + if (i > 0) { + if (lineIntersect( + Polygon(coordinates: [geom.coordinates[0]]), + Polygon(coordinates: [geom.coordinates[i]]), + ).features.length > + 1) { + return false; + } + } + } + } else if (geom is MultiPolygon) { + for (var i = 0; i < geom.coordinates.length; i++) { + var poly = geom.coordinates[i]; + + for (var ii = 0; ii < poly.length; ii++) { + if (poly[ii].length < 4) { + return false; + } + if (!_checkRingsClose(poly[ii])) { + return false; + } + if (_checkRingsForSpikesPunctures(poly[ii])) { + return false; + } + if (ii == 0) { + if (!_checkPolygonAgainstOthers( + Polygon(coordinates: poly), geom, i)) { + return false; + } + } + if (ii > 0) { + if (lineIntersect(Polygon(coordinates: [poly[0]]), + Polygon(coordinates: [poly[ii]])).features.length > + 1) { + return false; + } + } + } + } + } else { + throw Exception('the type ${geom.type} is not supported'); + } + } + return true; +} diff --git a/lib/src/clean_coords.dart b/lib/src/clean_coords.dart index 5ee1b37e..41989a66 100644 --- a/lib/src/clean_coords.dart +++ b/lib/src/clean_coords.dart @@ -21,8 +21,7 @@ Feature cleanCoords( if (geojson is Feature && geojson.geometry == null) { throw Exception("Geometry of the Feature is null"); } - GeometryObject geom = - geojson is Feature ? geojson.geometry! : geojson as GeometryObject; + GeometryObject geom = getGeom(geojson); geom = mutate ? geom : geom.clone() as GeometryObject; if (geojson is GeometryCollection || geojson is FeatureCollection) { diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index 75f2e3b6..eacf22d5 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -61,7 +61,7 @@ abstract class GeoJSONObject { } } - toJson(); + Map toJson(); GeoJSONObject clone(); } @@ -182,7 +182,7 @@ abstract class CoordinateType implements Iterable { bool get isSigned; - _untilSigned(val, limit) { + num _untilSigned(num val, limit) { if (val > limit) { return _untilSigned(val - 360, limit); } else { diff --git a/lib/src/invariant.dart b/lib/src/invariant.dart index 3303e25d..89fd3c74 100644 --- a/lib/src/invariant.dart +++ b/lib/src/invariant.dart @@ -27,7 +27,6 @@ Position getCoord(dynamic coord) { } /// Unwraps coordinates from a [Feature], [GeometryObject] or a [List] -/// /// Gets a [List], [GeometryObject] or a [Feature] or a [List] and /// returns [List]. /// For example: @@ -69,10 +68,32 @@ List getCoords(dynamic coords) { "Parameter must be a List, Geometry, Feature. coords Feature, Geometry Object or a List"); } -_getCoordsForGeometry(GeometryObject geom) { +List _getCoordsForGeometry(GeometryObject geom) { if (geom is Point || geom is GeometryCollection) { throw Exception("Type must contain a list of Positions e.g Polygon"); } return (geom as GeometryType).coordinates; } + +/// Get Geometry or Geometries from [Feature] or [GeometryCollection] +/// Returns [List] in case geojson is a [GeometryCollection] and a +/// [GeometryType] if geojson is a simple [GeometryType]. +/// example: +/// ```dart +/// var feature = Feature( +/// geometry: Point( +/// coordinates: Position.of([110, 40]) +/// )); +/// var geom = getGeom(feature) +/// //= Point(coordinates: Position.of([110, 40])) +GeometryObject getGeom(GeoJSONObject geojson) { + if (geojson is Feature) { + return geojson.geometry!; + } else if (geojson is FeatureCollection) { + throw Exception( + 'Cannot retrieve single Geometry from FeatureCollection in getGeom', + ); + } + return geojson as GeometryObject; +} diff --git a/lib/src/line_intersect.dart b/lib/src/line_intersect.dart new file mode 100644 index 00000000..d1be8ec3 --- /dev/null +++ b/lib/src/line_intersect.dart @@ -0,0 +1,69 @@ +import 'package:sweepline_intersections/sweepline_intersections.dart'; + +import '../helpers.dart'; + +/// Takes any [LineString] or [Polygon] and returns the intersecting [Point](s). +/// [removeDuplicates=true] removes duplicate intersections, +/// [ignoreSelfIntersections=false] ignores self-intersections on input features +/// Returns a [FeatureCollection] containing point(s) that intersect both +/// example: +/// ```dart +/// var line1 = LineString(coordinates:[ +/// Position.of([126, -11]), +/// Position.of([129, -21]), +/// ]); +/// var line2 = LineString(coordinates:[ +/// Position.of([123, -18]), +/// Position.of([131, -14]), +/// ]); +/// var intersects = lineIntersect(line1, line2); +/// //addToMap +/// var addToMap = [line1, line2, intersects] +/// ``` +FeatureCollection lineIntersect( + GeoJSONObject line1, + GeoJSONObject line2, { + bool removeDuplicates = true, + bool ignoreSelfIntersections = false, +}) { + var features = []; + if (line1 is FeatureCollection) { + features.addAll(line1.features); + } else if (line1 is Feature) { + features.add(line1); + } else if (line1 is LineString || + line1 is Polygon || + line1 is MultiLineString || + line1 is MultiPolygon) { + features.add(Feature(geometry: line1 as GeometryType)); + } + + if (line2 is FeatureCollection) { + features.addAll(line2.features); + } else if (line2 is Feature) { + features.add(line2); + } else if (line2 is LineString || + line2 is Polygon || + line2 is MultiLineString || + line2 is MultiPolygon) { + features.add(Feature(geometry: line2 as GeometryType)); + } + + var intersections = sweeplineIntersections( + FeatureCollection(features: features), ignoreSelfIntersections); + Set unique = {}; + if (removeDuplicates) { + for (var intersection in intersections) { + unique.add(intersection); + } + } + return FeatureCollection( + features: (removeDuplicates ? unique.toList() : intersections) + .map( + (r) => Feature( + geometry: Point(coordinates: r), + ), + ) + .toList(), + ); +} diff --git a/lib/src/line_segment.dart b/lib/src/line_segment.dart index c8218d6a..ba7dd164 100644 --- a/lib/src/line_segment.dart +++ b/lib/src/line_segment.dart @@ -7,7 +7,6 @@ import 'geojson.dart'; /// [LineString] or [MultiLineString] or [Polygon] and [MultiPolygon] /// Returns [FeatureCollection] 2-vertex line segments /// For example: -/// /// ```dart /// var polygon = Polygon.fromJson({ /// 'coordinates': [ @@ -21,7 +20,6 @@ import 'geojson.dart'; /// var segments = lineSegment(polygon); /// //addToMap /// var addToMap = [polygon, segments] - FeatureCollection lineSegment(GeoJSONObject geoJson, {bool combineGeometries = false}) { List> features = []; @@ -77,11 +75,6 @@ typedef SegmentEachCallback = dynamic Function( /// turf.segmentEach(polygon, function () { /// total++; /// }); -/// -/// -/// -/// - void segmentEach( GeoJSONObject geojson, SegmentEachCallback callback, { @@ -244,7 +237,6 @@ typedef SegmentReduceCallback = T? Function( /// return previousValue; /// }, 0); /// ``` - T? segmentReduce( GeoJSONObject geojson, SegmentReduceCallback callback, diff --git a/lib/src/polygon_smooth.dart b/lib/src/polygon_smooth.dart index d55930f1..cb30c98e 100644 --- a/lib/src/polygon_smooth.dart +++ b/lib/src/polygon_smooth.dart @@ -33,9 +33,9 @@ FeatureCollection polygonSmooth(GeoJSONObject inputPolys, BBox? featureBBox, dynamic featureId, ) { - var outCoords; - var poly; - var tempOutput; + dynamic outCoords; + dynamic poly; + dynamic tempOutput; switch (geom?.type) { case GeoJSONObjectType.polygon: @@ -75,7 +75,7 @@ FeatureCollection polygonSmooth(GeoJSONObject inputPolys, return FeatureCollection(features: outPolys); } -_processPolygon(Polygon poly, List> tempOutput) { +void _processPolygon(Polygon poly, List> tempOutput) { var prevGeomIndex = 0; var subtractCoordIndex = 0; @@ -106,7 +106,7 @@ _processPolygon(Polygon poly, List> tempOutput) { } } -_processMultiPolygon(poly, List>> tempOutput) { +void _processMultiPolygon(poly, List>> tempOutput) { var prevGeomIndex = 0; var subtractCoordIndex = 0; var prevMultiIndex = 0; diff --git a/lib/src/polygon_to_line.dart b/lib/src/polygon_to_line.dart index a1b6d65b..609fe151 100644 --- a/lib/src/polygon_to_line.dart +++ b/lib/src/polygon_to_line.dart @@ -1,3 +1,5 @@ +import 'package:turf/src/invariant.dart'; + import '../helpers.dart'; /// Converts a [Polygon] to [LineString] or [MultiLineString] or a [MultiPolygon] @@ -21,7 +23,7 @@ import '../helpers.dart'; /// ``` GeoJSONObject polygonToLine(GeoJSONObject poly, {Map? properties}) { - var geom = poly is Feature ? poly.geometry : poly; + var geom = getGeom(poly); properties = properties ?? ((poly is Feature) ? poly.properties : {}); diff --git a/pubspec.yaml b/pubspec.yaml index 7fe12315..c1f54c7a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,16 +2,19 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. version: 0.0.7 environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.12.0 <3.0.0" homepage: https://github.com/dartclub/turf_dart repository: https://github.com/dartclub/turf_dart dependencies: json_annotation: ^4.4.0 - turf_equality: ^0.0.1 + turf_equality: ^0.0.2 + turf_pip: ^0.0.1+1 + rbush: ^1.1.0 + sweepline_intersections: ^0.0.3+1 dev_dependencies: - dartclub_lint: ^0.4.2 + dartclub_lint: ^1.0.0 test: ^1.19.3 json_serializable: ^6.1.1 build_runner: ^2.1.5 diff --git a/test/.DS_Store b/test/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8dca1b0c6041d6f51c12453d5fe1b56c21e4e4b4 GIT binary patch literal 6148 zcmeH~O=}ZD7{{M!qn)$}IVkiZ40sJSZSWAhtg#-vc1t~|#NFl5p16K8oKMkF#&sj_=_? zVXu)>LYk_VrMcXQ4jq9&An?BtaFaVFgI`HY^EWL`iihQe;Tinsr#1WdlGftWSvB_Y z-_vnfRCTZSL+tFf?%dszd-6cOjX#)KTqpIk8YYw1+&VX=OmFH*dQs%FQRn`1qwA#5 z`NSp^S&oo5uL_-++0aaNR@vOx4al}^k2;6*dB6XptBy|wi>{gvPI_H6=noc)wtVpD z@zb->$MQ;>FZRhvV4bpd&+CnRMP=i?KE)GV8vPz)oVQPxpmarJlp3rw)o!g@V)YGi ztE_VRj8&1dn6F(Mf5nT3e~aH5wrd>L*tS6^p#n^gC_`;RHSZ!zr1&3NCW~gUTM_Vc zK_1-dDj_)#2n4o~0Iv@U&Kh}boZ6)Wg*^g5Tj;iiI)5^7j`A9LZJc5RCR{4ir3!z< z5H214%Ev`s8>cRvgg<-;e`n!OD8k+y*H<>2MC3G-fj}UzN?_MDJG}qD`1ARHH7T?L zfk0rZ2#D5cd^*G{`Mq`H<#?}E@ON-Fj%%FS6cm0twiVur58>7@rnmx)yf#kJ0}CGl M7DFfkfqzQi8kGOR@Bjb+ literal 0 HcmV?d00001 diff --git a/test/booleans/clockwise_test.dart b/test/booleans/clockwise_test.dart new file mode 100644 index 00000000..599ecc4f --- /dev/null +++ b/test/booleans/clockwise_test.dart @@ -0,0 +1,58 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_clockwise.dart'; + +void main() { + group( + 'clockwise', + () { + test( + 'simple LineString', + () { + var list = [ + Position.of([10, 10]), + Position.of([11, 10]), + Position.of([12, 10]), + Position.of([13, 10]), + ]; + expect(booleanClockwise(LineString(coordinates: list)), true); + }, + ); + + var inDir = Directory('./test/examples/booleans/clockwise/true'); + for (var file in inDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test(file.path, () { + // True Fixtures + var inSource = file.readAsStringSync(); + dynamic json = jsonDecode(inSource); + var inGeom = GeoJSONObject.fromJson(json); + var feature0 = (inGeom as FeatureCollection).features[0]; + + expect(booleanClockwise(feature0.geometry as LineString), true); + }); + } + } + + var inDir1 = Directory('./test/examples/booleans/clockwise/false'); + for (var file in inDir1.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + // True Fixtures + var inSource = file.readAsStringSync(); + dynamic json = jsonDecode(inSource); + var inGeom = GeoJSONObject.fromJson(json); + var feature0 = (inGeom as FeatureCollection).features[0]; + expect(booleanClockwise(feature0.geometry as LineString), false); + }, + ); + } + } + }, + ); +} diff --git a/test/booleans/concave_test.dart b/test/booleans/concave_test.dart new file mode 100644 index 00000000..33f2df28 --- /dev/null +++ b/test/booleans/concave_test.dart @@ -0,0 +1,48 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_concave.dart'; + +void main() { + group( + 'concave', + () { + var inDir = Directory('./test/examples/booleans/concave/true'); + + for (var file in inDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + // True Fixtures + var inSource = file.readAsStringSync(); + var json = jsonDecode(inSource); + var inGeom = GeoJSONObject.fromJson(json); + var feature = (inGeom as FeatureCollection).features[0]; + expect(booleanConcave(feature.geometry as Polygon), true); + }, + ); + } + } + + var inDir1 = Directory('./test/examples/booleans/concave/false'); + for (var file in inDir1.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + // False Fixtures + var inSource = file.readAsStringSync(); + var json = jsonDecode(inSource); + var inGeom = GeoJSONObject.fromJson(json); + var feature = (inGeom as FeatureCollection).features[0]; + expect(booleanConcave(feature.geometry as Polygon), false); + }, + ); + } + } + }, + ); +} diff --git a/test/booleans/contains_test.dart b/test/booleans/contains_test.dart new file mode 100644 index 00000000..7e89cfce --- /dev/null +++ b/test/booleans/contains_test.dart @@ -0,0 +1,61 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_contains.dart'; + +void main() { + group( + 'contains', + () { + var inDir = Directory('./test/examples/booleans/contains/test/true'); + for (var file in inDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + // True Fixtures + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + expect(booleanContains(feature1, feature2), true); + }, + ); + } + } + + var inDir1 = Directory('./test/examples/booleans/contains/test/false'); + for (var file in inDir1.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + // False Fixtures + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + expect(booleanContains(feature1, feature2), false); + }, + ); + + test( + "turf-boolean-contains -- Geometry Objects", + () { + var pt1 = + Feature(geometry: Point(coordinates: Position.of([0, 0]))); + var pt2 = + Feature(geometry: Point(coordinates: Position.of([0, 0]))); + + expect(booleanContains(pt1.geometry!, pt2.geometry!), true); + }, + ); + } + } + }, + ); +} diff --git a/test/booleans/crosses_test.dart b/test/booleans/crosses_test.dart new file mode 100644 index 00000000..f2faaf4d --- /dev/null +++ b/test/booleans/crosses_test.dart @@ -0,0 +1,48 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_crosses.dart'; + +void main() { + group( + 'boolean_crosses', + () { + // True Fixtures + var inDir = Directory('./test/examples/booleans/crosses/true'); + 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 feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + expect( + booleanCrosses(feature1.geometry!, feature2.geometry!), true); + }, + ); + } + } + // False Fixtures + var inDir1 = Directory('./test/examples/booleans/crosses/false'); + for (var file in inDir1.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 feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + expect(booleanCrosses(feature1.geometry!, feature2.geometry!), + isFalse); + }, + ); + } + } + }, + ); +} diff --git a/test/booleans/disjoint_test.dart b/test/booleans/disjoint_test.dart new file mode 100644 index 00000000..6a547138 --- /dev/null +++ b/test/booleans/disjoint_test.dart @@ -0,0 +1,49 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_disjoint.dart'; + +void main() { + group('boolean_disjoint', () { + // True Fixtures + var inDir = Directory('./test/examples/booleans/disjoint/test/true'); + 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 feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanDisjoint(feature1, feature2); + expect(result, true); + }, + ); + } + } + // False Fixtures + var inDir1 = Directory('./test/examples/booleans/disjoint/test/false'); + for (var file in inDir1.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + // True Fixtures + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanDisjoint(feature1, feature2); + + expect(result, false); + }, + ); + } + } + }); +} diff --git a/test/booleans/equal_test.dart b/test/booleans/equal_test.dart new file mode 100644 index 00000000..0a6479c3 --- /dev/null +++ b/test/booleans/equal_test.dart @@ -0,0 +1,134 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_equal.dart'; + +void main() { + group( + 'boolean_equal', + () { + // True Fixtures + var inDir = Directory('./test/examples/booleans/equal/test/true'); + 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 feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + Map json = jsonDecode(inSource); + var options = json['properties']; + var result = booleanEqual(feature1, feature2, + precision: options?['precision'] ?? 6, + shiftedPolygon: options?['shiftedPolygon'] ?? false, + direction: options?['direction'] ?? false); + expect(result, true); + }, + ); + } + } + // False Fixtures + var inDir1 = Directory('./test/examples/booleans/equal/test/false'); + for (var file in inDir1.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + // True Fixtures + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + + Map json = jsonDecode(inSource); + var options = json['properties']; + var result = booleanEqual(feature1, feature2, + precision: options?['precision'] ?? 6); + + expect(result, false); + }, + ); + } + } + var pt = Point(coordinates: Position.of([9, 50])); + var line1 = Feature( + geometry: LineString(coordinates: [ + Position.of([7, 50]), + Position.of([8, 50]), + Position.of([9, 50]), + ]), + ); + var line2 = Feature( + geometry: LineString(coordinates: [ + Position.of([7, 50]), + Position.of([8, 50]), + Position.of([9, 50]), + ]), + ); + var poly1 = Feature( + geometry: Polygon(coordinates: [ + [ + Position.of([8.5, 50]), + Position.of([9.5, 50]), + Position.of([9.5, 49]), + Position.of([8.5, 49]), + Position.of([8.5, 50]), + ], + ]), + ); + var poly2 = Feature( + geometry: Polygon(coordinates: [ + [ + Position.of([8.5, 50]), + Position.of([9.5, 50]), + Position.of([9.5, 49]), + Position.of([8.5, 49]), + Position.of([8.5, 50]), + ], + ]), + ); + var poly3 = Feature( + geometry: Polygon(coordinates: [ + [ + Position.of([10, 50]), + Position.of([10.5, 50]), + Position.of([10.5, 49]), + Position.of([10, 49]), + Position.of([10, 50]), + ], + ]), + ); + + test("turf-boolean-equal -- geometries", () { + // "[true] LineString geometry" + expect(booleanEqual(line1.geometry!, line2.geometry!), true); + + // "[true] Polygon geometry" + expect(booleanEqual(poly1.geometry!, poly2.geometry!), true); + + // "[false] Polygon geometry" + expect(booleanEqual(poly1.geometry!, poly3.geometry!), false); + + // "[false] different types" + expect(booleanEqual(pt, line1), false); + }); + + test( + "turf-boolean-equal -- throws", + () { + // "precision must be positive" + expect( + () => + booleanEqual(line1.geometry!, line2.geometry!, precision: -1), + throwsA(isA())); + }, + ); + }, + ); +} diff --git a/test/booleans/intersects_test.dart b/test/booleans/intersects_test.dart new file mode 100644 index 00000000..886cfe07 --- /dev/null +++ b/test/booleans/intersects_test.dart @@ -0,0 +1,129 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_intersects.dart'; + +void main() { + var featureCollection = FeatureCollection(features: [ + Feature( + properties: {"fill": "#ff0000"}, + geometry: MultiPolygon(coordinates: [ + [ + [ + Position.of([122.6953125, -19.186677697957833]), + Position.of([128.759765625, -19.186677697957833]), + Position.of([128.759765625, -15.28418511407642]), + Position.of([122.6953125, -15.28418511407642]), + Position.of([122.6953125, -19.186677697957833]) + ] + ], + [ + [ + Position.of([123.74999999999999, -25.918526162075153]), + Position.of([130.25390625, -25.918526162075153]), + Position.of([130.25390625, -20.715015145512087]), + Position.of([123.74999999999999, -20.715015145512087]), + Position.of([123.74999999999999, -25.918526162075153]), + ] + ] + ])), + Feature( + properties: {"fill": "#0000ff"}, + geometry: Polygon(coordinates: [ + [ + Position.of([119.20166015624999, -22.776181505086495]), + Position.of([125.09033203124999, -22.776181505086495]), + Position.of([125.09033203124999, -18.417078658661257]), + Position.of([119.20166015624999, -18.417078658661257]), + Position.of([119.20166015624999, -22.776181505086495]) + ] + ])) + ]); + + var featureCollection1 = FeatureCollection(features: [ + Feature( + properties: {"fill": "#ff0000"}, + geometry: MultiPolygon(coordinates: [ + [ + [ + Position.of([122.6953125, -19.186677697957833]), + Position.of([128.759765625, -19.186677697957833]), + Position.of([128.759765625, -15.28418511407642]), + Position.of([122.6953125, -15.28418511407642]), + Position.of([122.6953125, -19.186677697957833]) + ] + ], + [ + [ + Position.of([123.74999999999999, -25.918526162075153]), + Position.of([130.25390625, -25.918526162075153]), + Position.of([130.25390625, -20.715015145512087]), + Position.of([123.74999999999999, -20.715015145512087]), + Position.of([123.74999999999999, -25.918526162075153]) + ] + ] + ])), + Feature( + properties: {"fill": "#0000ff"}, + geometry: Polygon(coordinates: [ + [ + Position.of([116.98242187499999, -24.647017162630352]), + Position.of([122.87109375, -24.647017162630352]), + Position.of([122.87109375, -20.34462694382967]), + Position.of([116.98242187499999, -20.34462694382967]), + Position.of([116.98242187499999, -24.647017162630352]) + ] + ])) + ]); + test( + "turf-boolean-intersects", + () { + // True Fixtures + + var feature1 = featureCollection.features[0]; + var feature2 = featureCollection.features[1]; + + expect(booleanIntersects(feature1, feature2), equals(true)); + + // False Fixtures + var feature3 = featureCollection1.features[0]; + var feature4 = featureCollection1.features[1]; + expect(booleanIntersects(feature3, feature4), equals(false)); + }, + ); + test( + "turf-boolean-intersects", + () { + // True Fixtures + var inDir = Directory('./test/examples/booleans/intersects/true'); + for (var file in inDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanIntersects(feature1, feature2); + + expect(result, isTrue); + } + } + // False Fixtures + var inDir1 = Directory('./test/examples/booleans/intersects/false'); + for (var file in inDir1.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanIntersects(feature1, feature2); + + expect(result, isFalse); + } + } + }, + ); +} diff --git a/test/booleans/parallel_test.dart b/test/booleans/parallel_test.dart new file mode 100644 index 00000000..02c569c1 --- /dev/null +++ b/test/booleans/parallel_test.dart @@ -0,0 +1,51 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/src/booleans/boolean_parallel.dart'; +import 'package:turf/turf.dart'; + +void main() { + group( + 'boolean-overlap', + () { + test( + "turf-boolean-overlap-trues", + () { + // True Fixtures + Directory dir = Directory('./test/examples/booleans/parallel/true'); + for (var file in dir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanParallel(feature1.geometry as LineString, + feature2.geometry as LineString); + expect(result, true); + } + } + }, + ); + + test( + "turf-boolean-overlap-falses", + () { + // True Fixtures + Directory dir = Directory('./test/examples/booleans/parallel/false'); + for (var file in dir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanParallel(feature1.geometry as LineString, + feature2.geometry as LineString); + expect(result, false); + } + } + }, + ); + }, + ); +} diff --git a/test/booleans/point_in_polygon_test.dart b/test/booleans/point_in_polygon_test.dart new file mode 100644 index 00000000..9cc9a12e --- /dev/null +++ b/test/booleans/point_in_polygon_test.dart @@ -0,0 +1,419 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_point_in_polygon.dart'; + +void main() { + group( + 'pip', + () { + test( + "boolean-point-in-polygon -- featureCollection", + () { + // test for a simple polygon + var poly = Polygon(coordinates: [ + [ + Position.of([0, 0]), + Position.of([0, 100]), + Position.of([100, 100]), + Position.of([100, 0]), + Position.of([0, 0]), + ], + ]); + var ptIn = Point(coordinates: (Position.of([50, 50]))); + var ptOut = Point(coordinates: (Position.of([140, 150]))); + // "point inside simple polygon" + expect(booleanPointInPolygon(ptIn.coordinates, poly), true); + // "point outside simple polygon" + expect(booleanPointInPolygon(ptOut.coordinates, poly), false); + + // test for a concave polygon + var concavePoly = Polygon(coordinates: [ + [ + Position.of([0, 0]), + Position.of([50, 50]), + Position.of([0, 100]), + Position.of([100, 100]), + Position.of([100, 0]), + Position.of([0, 0]), + ], + ]); + var ptConcaveIn = Point(coordinates: (Position.of([75, 75]))); + var ptConcaveOut = Point(coordinates: (Position.of([25, 50]))); + + // "point inside concave polygon" + expect(booleanPointInPolygon(ptConcaveIn.coordinates, concavePoly), + true); + // "point outside concave polygon" + expect(booleanPointInPolygon(ptConcaveOut.coordinates, concavePoly), + false); + }, + ); + + test( + "boolean-point-in-polygon -- poly with hole", + () { + var ptInHole = Point( + coordinates: + (Position.of([-86.69208526611328, 36.20373274711739]))); + var ptInPoly = Point( + coordinates: + (Position.of([-86.72229766845702, 36.20258997094334]))); + var ptOutsidePoly = Point( + coordinates: + (Position.of([-86.75079345703125, 36.18527313913089]))); + + var inFile = File( + './test/examples/booleans/point_in_polygon/in/poly-with-hole.geojson'); + + var polyHole = + GeoJSONObject.fromJson(jsonDecode(inFile.readAsStringSync())); + + expect(booleanPointInPolygon(ptInHole.coordinates, polyHole), false); + expect(booleanPointInPolygon(ptInPoly.coordinates, polyHole), true); + expect(booleanPointInPolygon(ptOutsidePoly.coordinates, polyHole), + false); + }, + ); + + test( + "boolean-point-in-polygon -- multipolygon with hole", + () { + var ptInHole = Point( + coordinates: + (Position.of([-86.69208526611328, 36.20373274711739]))); + var ptInPoly = Point( + coordinates: + (Position.of([-86.72229766845702, 36.20258997094334]))); + var ptInPoly2 = Point( + coordinates: + (Position.of([-86.75079345703125, 36.18527313913089]))); + var ptOutsidePoly = Point( + coordinates: + (Position.of([-86.75302505493164, 36.23015046460186]))); + + var inFile = File( + './test/examples/booleans/point_in_polygon/in/multipoly-with-hole.geojson'); + + var multiPolyHole = + GeoJSONObject.fromJson(jsonDecode(inFile.readAsStringSync())); + + expect(booleanPointInPolygon(ptInHole.coordinates, multiPolyHole), + false); + expect( + booleanPointInPolygon(ptInPoly.coordinates, multiPolyHole), true); + expect(booleanPointInPolygon(ptInPoly2.coordinates, multiPolyHole), + true); + expect( + booleanPointInPolygon(ptInPoly.coordinates, multiPolyHole), true); + expect( + booleanPointInPolygon(ptOutsidePoly.coordinates, multiPolyHole), + false); + }, + ); + + test( + 'boolean-point-in-polygon -- Boundary test', + () { + var poly1 = Polygon( + coordinates: [ + [ + Position.of([10, 10]), + Position.of([30, 20]), + Position.of([50, 10]), + Position.of([30, 0]), + Position.of([10, 10]), + ], + ], + ); + var poly2 = Polygon( + coordinates: [ + [ + Position.of([10, 0]), + Position.of([30, 20]), + Position.of([50, 0]), + Position.of([30, 10]), + Position.of([10, 0]), + ], + ], + ); + var poly3 = Polygon( + coordinates: [ + [ + Position.of([10, 0]), + Position.of([30, 20]), + Position.of([50, 0]), + Position.of([30, -20]), + Position.of([10, 0]), + ], + ], + ); + var poly4 = Polygon( + coordinates: [ + [ + Position.of([0, 0]), + Position.of([0, 20]), + Position.of([50, 20]), + Position.of([50, 0]), + Position.of([40, 0]), + Position.of([30, 10]), + Position.of([30, 0]), + Position.of([20, 10]), + Position.of([10, 10]), + Position.of([10, 0]), + Position.of([0, 0]), + ], + ], + ); + var poly5 = Polygon( + coordinates: [ + [ + Position.of([0, 20]), + Position.of([20, 40]), + Position.of([40, 20]), + Position.of([20, 0]), + Position.of([0, 20]), + ], + [ + Position.of([10, 20]), + Position.of([20, 30]), + Position.of([30, 20]), + Position.of([20, 10]), + Position.of([10, 20]), + ], + ], + ); + + void runTest(bool ignoreBoundary) { + var isBoundaryIncluded = ignoreBoundary == false; + var tests = [ + [ + poly1, + Point(coordinates: (Position.of([10, 10]))), + isBoundaryIncluded + ], //0 + [ + poly1, + Point(coordinates: (Position.of([30, 20]))), + isBoundaryIncluded + ], + [ + poly1, + Point(coordinates: (Position.of([50, 10]))), + isBoundaryIncluded + ], + [ + poly1, + Point(coordinates: (Position.of([30, 10]))), + true + ], + [ + poly1, + Point(coordinates: (Position.of([0, 10]))), + false + ], + [ + poly1, + Point(coordinates: (Position.of([60, 10]))), + false + ], + [ + poly1, + Point(coordinates: (Position.of([30, -10]))), + false + ], + [ + poly1, + Point(coordinates: (Position.of([30, 30]))), + false + ], + [ + poly2, + Point(coordinates: (Position.of([30, 0]))), + false + ], + [ + poly2, + Point(coordinates: (Position.of([0, 0]))), + false + ], + [ + poly2, + Point(coordinates: (Position.of([60, 0]))), + false + ], //10 + [ + poly3, + Point(coordinates: (Position.of([30, 0]))), + true + ], + [ + poly3, + Point(coordinates: (Position.of([0, 0]))), + false + ], + [ + poly3, + Point(coordinates: (Position.of([60, 0]))), + false + ], + [ + poly4, + Point(coordinates: (Position.of([0, 20]))), + isBoundaryIncluded + ], + [ + poly4, + Point(coordinates: (Position.of([10, 20]))), + isBoundaryIncluded + ], + [ + poly4, + Point(coordinates: (Position.of([50, 20]))), + isBoundaryIncluded + ], + [ + poly4, + Point(coordinates: (Position.of([0, 10]))), + isBoundaryIncluded + ], + [ + poly4, + Point(coordinates: (Position.of([5, 10]))), + true + ], + [ + poly4, + Point(coordinates: (Position.of([25, 10]))), + true + ], + [ + poly4, + Point(coordinates: (Position.of([35, 10]))), + true + ], //20 + [ + poly4, + Point(coordinates: (Position.of([0, 0]))), + isBoundaryIncluded + ], + [ + poly4, + Point(coordinates: (Position.of([20, 0]))), + false + ], + [ + poly4, + Point(coordinates: (Position.of([35, 0]))), + false + ], + [ + poly4, + Point(coordinates: (Position.of([50, 0]))), + isBoundaryIncluded + ], + [ + poly4, + Point(coordinates: (Position.of([50, 10]))), + isBoundaryIncluded + ], + [ + poly4, + Point(coordinates: (Position.of([5, 0]))), + isBoundaryIncluded + ], + [ + poly4, + Point(coordinates: (Position.of([10, 0]))), + isBoundaryIncluded + ], + [ + poly5, + Point(coordinates: (Position.of([20, 30]))), + isBoundaryIncluded + ], + [ + poly5, + Point(coordinates: (Position.of([25, 25]))), + isBoundaryIncluded + ], + [ + poly5, + Point(coordinates: (Position.of([30, 20]))), + isBoundaryIncluded + ], //30 + [ + poly5, + Point(coordinates: (Position.of([25, 15]))), + isBoundaryIncluded + ], + [ + poly5, + Point(coordinates: (Position.of([20, 10]))), + isBoundaryIncluded + ], + [ + poly5, + Point(coordinates: (Position.of([15, 15]))), + isBoundaryIncluded + ], + [ + poly5, + Point(coordinates: (Position.of([10, 20]))), + isBoundaryIncluded + ], + [ + poly5, + Point(coordinates: (Position.of([15, 25]))), + isBoundaryIncluded + ], + [ + poly5, + Point(coordinates: (Position.of([20, 20]))), + false + ], + ]; + + for (int i = 0; i < tests.length; i++) { + var item = tests[i]; + expect( + booleanPointInPolygon( + (item[1] as Point).coordinates, + item[0] as Polygon, + ignoreBoundary: ignoreBoundary, + ) == + item[2], + isTrue); + } + } + + runTest(false); + runTest(true); + }, + ); + +// https://github.com/Turfjs/turf-inside/issues/15 + test( + "boolean-point-in-polygon -- issue #15", + () { + var pt1 = Point(coordinates: (Position.of([-9.9964077, 53.8040989]))); + var poly = Polygon( + coordinates: [ + [ + Position.of([5.080336744095521, 67.89398938540765]), + Position.of([0.35070899909145403, 69.32470003971179]), + Position.of([-24.453622256504122, 41.146696777884564]), + Position.of([-21.6445524714804, 40.43225902006474]), + Position.of([5.080336744095521, 67.89398938540765]), + ], + ], + ); + + expect(booleanPointInPolygon(pt1.coordinates, poly), true); + }, + ); + }, + ); +} diff --git a/test/booleans/point_on_line_test.dart b/test/booleans/point_on_line_test.dart new file mode 100644 index 00000000..84d0e3bc --- /dev/null +++ b/test/booleans/point_on_line_test.dart @@ -0,0 +1,59 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/booleans/boolean_point_on_line.dart'; + +void main() { + group( + 'pointOnLine', + () { + var inDir = Directory('./test/examples/booleans/point_on_line/true'); + for (var file in inDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + // True Fixtures + var inSource = file.readAsStringSync(); + dynamic json = jsonDecode(inSource); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + Map? properties = json['properties']; + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanPointOnLine( + feature1.geometry as Point, feature2.geometry as LineString, + epsilon: properties?['epsilon'], + ignoreEndVertices: properties?['ignoreEndVertices'] ?? false); + expect(result, true); + }, + ); + } + } + // False Fixtures + var inDir1 = Directory('./test/examples/booleans/point_on_line/false'); + for (var file in inDir1.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + test( + file.path, + () { + var inSource = file.readAsStringSync(); + dynamic json = jsonDecode(inSource); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + Map? properties = json['properties']; + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanPointOnLine( + feature1.geometry as Point, feature2.geometry as LineString, + epsilon: properties?['epsilon'], + ignoreEndVertices: properties?['ignoreEndVertices'] ?? false); + + expect(result, false); + }, + ); + } + } + }, + ); +} diff --git a/test/booleans/touches_test.dart b/test/booleans/touches_test.dart new file mode 100644 index 00000000..f3983435 --- /dev/null +++ b/test/booleans/touches_test.dart @@ -0,0 +1,49 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/src/booleans/boolean_touches.dart'; +import 'package:turf/turf.dart'; + +void main() { + group( + 'boolean-overlap', + () { + test( + "turf-boolean-overlap-trues", + () { + // True Fixtures + Directory dir = Directory('./test/examples/booleans/touches/true'); + for (var file in dir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanTouches(feature1, feature2); + expect(result, true); + } + } + }, + ); + + test( + "turf-boolean-overlap-falses", + () { + // True Fixtures + Directory dir = Directory('./test/examples/booleans/touches/false'); + for (var file in dir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + var feature1 = (inGeom as FeatureCollection).features[0]; + var feature2 = inGeom.features[1]; + var result = booleanTouches(feature1, feature2); + expect(result, false); + } + } + }, + ); + }, + ); +} diff --git a/test/booleans/valid_test.dart b/test/booleans/valid_test.dart new file mode 100644 index 00000000..6720eafb --- /dev/null +++ b/test/booleans/valid_test.dart @@ -0,0 +1,67 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/src/booleans/boolean_valid.dart'; +import 'package:turf/turf.dart'; + +void main() { + group( + 'boolean-valid', + () { + /// Assertion error is caught in the fromJSON factory contructor of [GeometryType]s + Directory dir = Directory('./test/examples/booleans/valid/assertion'); + for (var file in dir.listSync(recursive: true)) { + test( + file.path, + () { + // Assertion Error Fixtures + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + expect( + () => booleanValid( + GeoJSONObject.fromJson( + jsonDecode(inSource), + ), + ), + throwsA(isA()), + ); + } + }, + ); + } + Directory dirFale = Directory('./test/examples/booleans/valid/false'); + for (var file in dirFale.listSync(recursive: true)) { + test( + file.path, + () { + // False Fixtures + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + expect( + booleanValid( + GeoJSONObject.fromJson( + jsonDecode(inSource), + ), + ), + isFalse); + } + }, + ); + } + Directory dir1 = Directory('./test/examples/booleans/valid/true'); + for (var file in dir1.listSync(recursive: true)) { + test( + file.path, + () { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); + expect(booleanValid(inGeom), isTrue); + } + }, + ); + } + }, + ); +} diff --git a/test/components/area_test.dart b/test/components/area_test.dart index d15a2932..d6b73c9b 100644 --- a/test/components/area_test.dart +++ b/test/components/area_test.dart @@ -1,7 +1,7 @@ import 'package:test/test.dart'; import 'package:turf/turf.dart'; -main() { +void main() { group('area', () { final position1 = Position(0, 0); final position2 = Position(0, 1); diff --git a/test/components/bbox_polygon_test.dart b/test/components/bbox_polygon_test.dart index 199341d6..d5824750 100644 --- a/test/components/bbox_polygon_test.dart +++ b/test/components/bbox_polygon_test.dart @@ -2,7 +2,7 @@ import 'package:test/test.dart'; import 'package:turf/helpers.dart'; import 'package:turf/src/bbox_polygon.dart'; -main() { +void main() { test( "bbox-polygon", () { diff --git a/test/components/bbox_test.dart b/test/components/bbox_test.dart index 75740b74..e9efefcf 100644 --- a/test/components/bbox_test.dart +++ b/test/components/bbox_test.dart @@ -2,7 +2,7 @@ import 'package:test/test.dart'; import 'package:turf/bbox.dart'; import 'package:turf/helpers.dart'; -main() { +void main() { final pt = Feature( geometry: Point(coordinates: Position.named(lat: 102.0, lng: 0.5))); final line = Feature( diff --git a/test/components/bearing_test.dart b/test/components/bearing_test.dart index 9f2ac72e..42949459 100644 --- a/test/components/bearing_test.dart +++ b/test/components/bearing_test.dart @@ -2,16 +2,19 @@ import 'package:test/test.dart'; import 'package:turf/bearing.dart'; import 'package:turf/helpers.dart'; -main() { - test('bearing', () { - var start = Point(coordinates: Position.of([-75, 45])); - var end = Point(coordinates: Position.of([20, 60])); +void main() { + test( + 'bearing', + () { + var start = Point(coordinates: Position.of([-75, 45])); + var end = Point(coordinates: Position.of([20, 60])); - var initialBearing = bearing(start, end); - expect(initialBearing.toStringAsFixed(2), '37.75'); + var initialBearing = bearing(start, end); + expect(initialBearing.toStringAsFixed(2), '37.75'); - var finalBearing = bearing(start, end, calcFinal: true); - expect(finalBearing.toStringAsFixed(2), '120.01'); - expect(finalBearing, calculateFinalBearing(start, end)); - }); + var finalBearing = bearing(start, end, calcFinal: true); + expect(finalBearing.toStringAsFixed(2), '120.01'); + expect(finalBearing, calculateFinalBearing(start, end)); + }, + ); } diff --git a/test/components/center_test.dart b/test/components/center_test.dart index 2ad5fac5..c642d22e 100644 --- a/test/components/center_test.dart +++ b/test/components/center_test.dart @@ -6,7 +6,7 @@ import 'package:turf/meta.dart'; import 'package:turf/src/bbox_polygon.dart'; import 'package:turf/turf.dart'; -main() { +void main() { group( 'center in == out', () { @@ -58,6 +58,7 @@ main() { ); featureCollection.features.add(extent); + // ignore: prefer_interpolation_to_compose_strings var outPath = './' + file.uri.pathSegments .sublist(0, file.uri.pathSegments.length - 2) diff --git a/test/components/clean_coords_test.dart b/test/components/clean_coords_test.dart index f631059b..4edd3b39 100644 --- a/test/components/clean_coords_test.dart +++ b/test/components/clean_coords_test.dart @@ -6,7 +6,7 @@ import 'package:turf/src/clean_coords.dart'; import 'package:turf/src/truncate.dart'; import 'package:turf_equality/turf_equality.dart'; -main() { +void main() { group( 'cleanCoords', () { @@ -19,6 +19,7 @@ main() { var inSource = file.readAsStringSync(); var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); Feature results = cleanCoords(inGeom); + // ignore: prefer_interpolation_to_compose_strings var outPath = './' + file.uri.pathSegments .sublist(0, file.uri.pathSegments.length - 2) diff --git a/test/components/cluster_test.dart b/test/components/cluster_test.dart index 967e8fd5..8b6d0738 100644 --- a/test/components/cluster_test.dart +++ b/test/components/cluster_test.dart @@ -23,7 +23,7 @@ final geojson = FeatureCollection(features: [ Feature(geometry: Point(coordinates: Position.of([4, 3])), properties: null), ]); -main() { +void main() { test("clusters -- getCluster", () { expect(getCluster(geojson, '0').features.length, 1); expect(() => getCluster(geojson, 1), throwsA(isA())); diff --git a/test/components/destination_test.dart b/test/components/destination_test.dart index 257aef65..341570e2 100644 --- a/test/components/destination_test.dart +++ b/test/components/destination_test.dart @@ -4,7 +4,7 @@ import 'package:turf/destination.dart'; import 'package:turf/distance.dart'; import 'package:turf/helpers.dart'; -main() { +void main() { num defaultBearing = 180; num defaultDistance = 100; diff --git a/test/components/explode_test.dart b/test/components/explode_test.dart index a068ad4b..d5c55984 100644 --- a/test/components/explode_test.dart +++ b/test/components/explode_test.dart @@ -5,7 +5,7 @@ import 'package:test/test.dart'; import 'package:turf/src/explode.dart'; import 'package:turf/turf.dart'; -main() { +void main() { group( 'explode in == out', () { @@ -19,6 +19,7 @@ main() { var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); var inExploded = explode(inGeom); + // ignore: prefer_interpolation_to_compose_strings var outPath = './' + file.uri.pathSegments .sublist(0, file.uri.pathSegments.length - 2) diff --git a/test/components/geojson_test.dart b/test/components/geojson_test.dart index 957c730e..87a29c67 100644 --- a/test/components/geojson_test.dart +++ b/test/components/geojson_test.dart @@ -6,10 +6,10 @@ import 'package:test/test.dart'; import 'package:turf/distance.dart'; import 'package:turf/helpers.dart'; -main() { +void main() { group('Coordinate Types:', () { test('Position', () { - _expectArgs(Position pos) { + void _expectArgs(Position pos) { expect(pos.lng, 1); expect(pos.lat, 2); expect(pos.alt, 3); @@ -55,7 +55,7 @@ main() { }); test('BBox', () { - _expectArgs(BBox bbox) { + void _expectArgs(BBox bbox) { expect(bbox.lng1, 1); expect(bbox.lat1, 2); expect(bbox.alt1, 3); @@ -110,7 +110,7 @@ main() { }); group('Longitude normalization:', () { var rand = Random(); - _rand() => rand.nextDouble() * (360 * 2) - 360; + double _rand() => rand.nextDouble() * (360 * 2) - 360; test('Position.toSigned', () { for (var i = 0; i < 10; i++) { var coord = Position.named(lat: _rand(), lng: _rand(), alt: 0); @@ -396,7 +396,7 @@ main() { expect(geom.bbox, isNotNull); expect(geom.coordinates, isNotEmpty); - _expandRecursively(List inner) { + Iterable _expandRecursively(List inner) { if (inner is List) { return inner; } else { @@ -411,7 +411,6 @@ main() { Position(100, 0), ); } - // TODO refine tests }, ); @@ -463,7 +462,9 @@ main() { group('Example file', () { var dir = Directory('./test/examples'); for (var file in dir.listSync(recursive: true)) { - if (file is File && file.path.endsWith('.geojson')) { + if (file is File && + file.path.endsWith('.geojson') && + !file.path.contains('assertion')) { test(file.path, () { var source = (file).readAsStringSync(); var json = jsonDecode(source); diff --git a/test/components/helpers_test.dart b/test/components/helpers_test.dart index aa76ac32..3ad0cb6d 100644 --- a/test/components/helpers_test.dart +++ b/test/components/helpers_test.dart @@ -2,7 +2,7 @@ import 'dart:math'; import 'package:test/test.dart'; import 'package:turf/helpers.dart'; -main() { +void main() { test('radiansToLength', () { expect(radiansToLength(1, Unit.radians), equals(1)); expect(radiansToLength(1, Unit.kilometers), equals(earthRadius / 1000)); diff --git a/test/components/intersection_test.dart b/test/components/intersection_test.dart index 13bc630f..8ca01927 100644 --- a/test/components/intersection_test.dart +++ b/test/components/intersection_test.dart @@ -22,7 +22,7 @@ final l4 = LineString(coordinates: [ Position(0, 2), ]); -main() { +void main() { test('test intersects()', () { expect(intersects(l1, l2)?.coordinates, Position(1, 1)); expect(intersects(l1, l3)?.coordinates, Position(2, 2)); diff --git a/test/components/invariant_test.dart b/test/components/invariant_test.dart index 3e19cc6c..3fd3539e 100644 --- a/test/components/invariant_test.dart +++ b/test/components/invariant_test.dart @@ -2,7 +2,7 @@ import 'package:test/test.dart'; import 'package:turf/helpers.dart'; import 'package:turf/src/invariant.dart'; -main() { +void main() { LineString line1 = LineString(coordinates: [Position(1, 2), Position(3, 4)]); var feature1 = Feature(geometry: Point(coordinates: Position(1, 2, 3))); diff --git a/test/components/line_intersect_test.dart b/test/components/line_intersect_test.dart new file mode 100644 index 00000000..cfa50260 --- /dev/null +++ b/test/components/line_intersect_test.dart @@ -0,0 +1,165 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/line_intersect.dart'; +import 'package:turf/src/truncate.dart'; +import 'package:turf_equality/turf_equality.dart'; + +void main() { + group( + 'line_intersect', + () { + Directory dir = Directory('./test/examples/line_intersect/in'); + for (var file in dir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.geojson')) { + var inSource = file.readAsStringSync(); + var inGeom = + GeoJSONObject.fromJson(jsonDecode(inSource)) as FeatureCollection; + + // ignore: prefer_interpolation_to_compose_strings + 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)) + as FeatureCollection; + + test( + "turf-line-intersect", + () { + var results = truncate( + lineIntersect(inGeom.features.first, inGeom.features.last)); + var coll = FeatureCollection() + ..features = [...(results as FeatureCollection).features]; + + coll.features.add(inGeom.features.first); + coll.features.add(inGeom.features.last); + + Equality eq = Equality(); + expect(eq.compare(outGeom, coll), isTrue); + }, + ); + } + } + + test( + "turf-line-intersect - prevent input mutation", + () { + var line1 = LineString(coordinates: [ + Position.of([7, 50]), + Position.of([8, 50]), + Position.of([9, 50]), + ]); + var line2 = LineString(coordinates: [ + Position.of([8, 49]), + Position.of([8, 50]), + Position.of([8, 51]), + ]); + var before1 = line1.toJson(); + var before2 = line2.toJson(); + + lineIntersect(line1, line2); + Equality eq = Equality(); + expect(eq.compare(line1, LineString.fromJson(before1)), true); + expect(eq.compare(line2, LineString.fromJson(before2)), isTrue); + }, + ); + + test( + "turf-line-intersect - Geometry Objects", + () { + var line1 = LineString( + coordinates: [ + Position.of([7, 50]), + Position.of([9, 50]), + ], + ); + var line2 = LineString( + coordinates: [ + Position.of([8, 49]), + Position.of([8, 51]), + ], + ); + // "support Geometry Objects" + expect(lineIntersect(line1, line2).features, isNotEmpty); + // "support Feature Collection" + expect( + lineIntersect( + FeatureCollection( + features: [Feature(geometry: line1)]), + FeatureCollection( + features: [Feature(geometry: line2)])).features, + isNotEmpty); + // expect( + // lineIntersect(GeometryCollection(geometries: [line1]), + // GeometryCollection(geometries: [line2])).features, + // isNotEmpty); + }, + ); + + test( + "turf-line-intersect - same point #688", + () { + var line1 = LineString( + coordinates: [ + Position.of([7, 50]), + Position.of([8, 50]), + Position.of([9, 50]), + ], + ); + var line2 = LineString( + coordinates: [ + Position.of([8, 49]), + Position.of([8, 50]), + Position.of([8, 51]), + ], + ); + + var results = lineIntersect(line1, line2); + expect(results.features.length == 1, true); + + var results2 = lineIntersect( + line1, + line2, + removeDuplicates: false, + ); + expect(results2.features.length == 3, true); + }, + ); + + test( + "turf-line-intersect - polygon support #586", + () { + var poly1 = Polygon( + coordinates: [ + [ + Position.of([7, 50]), + Position.of([8, 50]), + Position.of([9, 50]), + Position.of([7, 50]), + ], + ], + ); + var poly2 = Polygon( + coordinates: [ + [ + Position.of([8, 49]), + Position.of([8, 50]), + Position.of([8, 51]), + Position.of([8, 49]), + ], + ], + ); + + var results = lineIntersect(poly1, poly2); + expect(results.features.length == 1, true); + }, + ); + }, + ); +} diff --git a/test/components/line_segment_test.dart b/test/components/line_segment_test.dart index 3de552e3..8f88c90d 100644 --- a/test/components/line_segment_test.dart +++ b/test/components/line_segment_test.dart @@ -2,7 +2,7 @@ import 'package:turf/src/line_segment.dart'; import 'package:test/test.dart'; import 'package:turf/helpers.dart'; -main() { +void main() { Feature multiLine = Feature( geometry: MultiLineString( coordinates: [ diff --git a/test/components/line_to_polygon_test.dart b/test/components/line_to_polygon_test.dart index 05ee4378..75591f3f 100644 --- a/test/components/line_to_polygon_test.dart +++ b/test/components/line_to_polygon_test.dart @@ -25,6 +25,7 @@ void main() { properties: properties, ); + // ignore: prefer_interpolation_to_compose_strings var outPath = './' + file.uri.pathSegments .sublist(0, file.uri.pathSegments.length - 2) diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index 102bdbab..b178cb18 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -193,7 +193,7 @@ FeatureCollection getAsMixedFeatCollection( ); } -main() { +void main() { test('coordEach -- Point', () { featureAndCollection(pt.geometry!).forEach((input) { coordEach(input, (currentCoord, coordIndex, featureIndex, diff --git a/test/components/midpoint_test.dart b/test/components/midpoint_test.dart index 6f512498..118403d1 100644 --- a/test/components/midpoint_test.dart +++ b/test/components/midpoint_test.dart @@ -4,8 +4,8 @@ import 'package:turf/helpers.dart'; import 'package:turf/midpoint.dart'; void checkLatLngInRange(Point result) { - _lngRange(num lng) => lng >= -180 && lng <= 180; - _latRange(num lat) => lat >= -90 && lat <= 90; + bool _lngRange(num lng) => lng >= -180 && lng <= 180; + bool _latRange(num lat) => lat >= -90 && lat <= 90; expect(_lngRange(result.coordinates.lng), true, reason: 'Longitude of ${result.coordinates.lng} out of range'); @@ -13,7 +13,7 @@ void checkLatLngInRange(Point result) { reason: 'Latitude of ${result.coordinates.lat} out of range'); } -main() { +void main() { test('simple midpoint', () { Position result = midpointRaw( Position.named( diff --git a/test/components/nearest_point_on_line_test.dart b/test/components/nearest_point_on_line_test.dart index 84079e2f..059c688b 100644 --- a/test/components/nearest_point_on_line_test.dart +++ b/test/components/nearest_point_on_line_test.dart @@ -3,7 +3,7 @@ import 'package:turf/distance.dart'; import 'package:turf/helpers.dart'; import 'package:turf/nearest_point_on_line.dart'; -main() { +void main() { test('nearest_point_on_line -- start point', () { final start = Point(coordinates: Position.of([-122.457175, 37.720033])); final end = Point(coordinates: Position.of([-122.457175, 37.718242])); diff --git a/test/components/polygon_smooth_test.dart b/test/components/polygon_smooth_test.dart index 73379b9e..2b92dab5 100644 --- a/test/components/polygon_smooth_test.dart +++ b/test/components/polygon_smooth_test.dart @@ -6,7 +6,7 @@ import 'package:turf/polygon_smooth.dart'; import 'package:turf/turf.dart'; import 'package:turf_equality/turf_equality.dart'; -main() { +void main() { group("turf-polygon-smooth", () { var inDir = Directory('./test/examples/polygonSmooth/in'); for (var file in inDir.listSync(recursive: true)) { @@ -15,6 +15,7 @@ main() { var inSource = file.readAsStringSync(); var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); var results = polygonSmooth(inGeom, iterations: 3); + // ignore: prefer_interpolation_to_compose_strings var outPath = './' + file.uri.pathSegments .sublist(0, file.uri.pathSegments.length - 2) diff --git a/test/components/polygon_to_line_test.dart b/test/components/polygon_to_line_test.dart index 80846538..a4b761f1 100644 --- a/test/components/polygon_to_line_test.dart +++ b/test/components/polygon_to_line_test.dart @@ -6,7 +6,7 @@ import 'package:test/scaffolding.dart'; import 'package:turf/polygon_to_line.dart'; import 'package:turf/turf.dart'; -main() { +void main() { group( 'polygonToLine', () { @@ -20,6 +20,7 @@ main() { var inGeom = GeoJSONObject.fromJson(jsonDecode(inSource)); var results = polygonToLine(inGeom); + // ignore: prefer_interpolation_to_compose_strings var outPath = './' + file.uri.pathSegments .sublist(0, file.uri.pathSegments.length - 2) diff --git a/test/components/polyline.dart b/test/components/polyline.dart index 6f9b030e..1083e688 100644 --- a/test/components/polyline.dart +++ b/test/components/polyline.dart @@ -2,7 +2,7 @@ import 'package:test/test.dart'; import 'package:turf/helpers.dart'; import 'package:turf/polyline.dart'; -main() { +void main() { group('Polyline:', () { var example = [ Position.named(lat: 38.5, lng: -120.2), diff --git a/test/components/rhumb_bearing_test.dart b/test/components/rhumb_bearing_test.dart index 61893e10..2dd01b17 100644 --- a/test/components/rhumb_bearing_test.dart +++ b/test/components/rhumb_bearing_test.dart @@ -5,9 +5,9 @@ import 'package:test/test.dart'; import 'package:turf/helpers.dart'; import 'package:turf/src/rhumb_bearing.dart'; -main() { +void main() { group( - '', + 'Rhumb Bearing test', () { Directory inDir = Directory('./test/examples/rhumb_bearing/in'); for (var file in inDir.listSync(recursive: true)) { diff --git a/test/components/truncate_test.dart b/test/components/truncate_test.dart index 10d2958d..aff618d0 100644 --- a/test/components/truncate_test.dart +++ b/test/components/truncate_test.dart @@ -6,7 +6,7 @@ import 'package:turf/helpers.dart'; import 'package:turf/truncate.dart'; import 'package:turf_equality/turf_equality.dart'; -main() { +void main() { group( 'truncate', () { diff --git a/test/examples/.DS_Store b/test/examples/booleans/.DS_Store similarity index 56% rename from test/examples/.DS_Store rename to test/examples/booleans/.DS_Store index 0c63b13f2fe9cae5a682169f7d851bde0585b08c..f22ab7845a312896a98a008477a7717105e622ec 100644 GIT binary patch literal 8196 zcmeHM&5ja55Uyrf8M4`g!y37mOybFeC@k!ni5EmXcy){()Qk)ecHCi_WnhURB%Jjf zd;l+Ay?FB(d=@>eRoxAlAC-0e0b_U4^$p$i%}jq3)l&liu*SGk0Vo21ft|3hgXSBJ z=BcMzMvd$tGUNjs!vs7Cp?lv?dFuhKfL1^&pcT*xXazPw0o=2x8Q3nJO`uq~p9v?ud1T zbBU4;Owxg=D>GH0FmZL{nZg}dU81&H0j)q<0jk~e&;}nk+DQG*+pf=DoTVSs9qc#G zM8hM19Qtwy(6-=|s{NSvyM(u)yhrHmAuEjgv#SYzI{OgMAJUtIl=tf&d%Kfxpzi#= zJMg`5R4#vFnXT;hrJRv7c8q8C5uezj)@U3yTEi#w=^^L7yEtySkG$^0DeT?l!Kmd0 z-Ju|Ooi4gOee4AtK56iA&$a$UBANbXv8lCG+4`ZB{a;)_%EU)~biIS>CvO z?dI(V&avMQ_$yoiHl|V;?8?teODjxhaB2?&p9ejnVK<;7-m|1Ejws4; q#N{7`cx<98aq0@^5^)6EUw;vB{%7!&d$QjD<4=lu{}&=IF!5ld(SsUf%L;^Lhb&NPnkJm} z4LtY?UVQ+cz(n7|2k@l7Z)PE|3!z$LO*_-fd^@w>Z)fK>znSef5RoYKs_R5H5n0G= zGnY|JNqnDkEG5F0RagN$J@n+h<4FhgOw8Lf7zPXjh5^HXVZbo(KQMrAHYaOITT>ba z3E3XFMnDS%eXa2m=pcD|ZrkZB1zyFbu>Q;MhG$4*nz^M&kGTxOe-f zN(y*Ic}eofr3(2}rhTA%lodK4H-dhT#kqQNwA1gj!?S}=PTOmAy4mbEkyuDxT1;6f zYsq?9s>^<(DK#PkIa9 zpCg~~qR#yr${~Bu8p&V_|cBG#lv3>%oO)&i#fdZr0Tng$B5F`TM9PF3dgx6wR6#(46lrQG z(nJLtAeLa^2Z9c<;&;KpHH=?zkT~wS68<+ z449protc?=^5hAbOip$MN=r*0J$fW~Gx;VH`dX|1up#to0o2`)`>`uvg$>_{1{#ZF zmgfc*i)4S5fOkuFeXo?&lLwyGxPKT(({TJKYy;R zt^N4%JK6`TS!Gi}A6BCy&U;e)OrMI`Yt*x!8sp;d#m71FB zyEiX?`64(M9`xeHi}f;K<62)|SN)0l-xHw!fA@_!0kG>xLSj;KN@^M_JtH$KJ13W& zmtRm=R9sS8R$g(T^5P{T#w$(DEmyB`Td%jZcXZz9>h9_7yLsz2uYX{0 z=+5xS=-Bw(iF@}SOin#~^!Uls>6zJQbI)JAe8r!C{pRhvh5r_p-Y>6w`1nci`ODYU zZ{L5c{rvU&&)7Wj&LpM9@Ayq!N%>MF_P zE)IxoU$n8qm^O5Uh;+q&NE;S;lyz;p@-3mjvhfn*Q-MqRADwXuZnZN4zBYKJU)I#Y zFX+Z1L3z8N<;aKsuNW34Otgrp4hl3 zpMGjmT%#i^6g7#+O6oT7P)DtQnWvf%TV$9y%k$Jk$blcJ_Qb28?a7lPJ#oqWq^7~wbp7jkfuX$2fsZ7fNc64QvFkE#t;zxU z>iKIn;ZDT57z-e#xjhA8fw$f(vEQzD4QGX8K&ewzw!#Jt+&f2vXZSDsQ?i)D_}(X+ z&ArR1lPO1(6lvxC6S&<}9`s+&@oN|Kj|V=8e@o{*(3Z3h#786o4f0h+i8^g@3zIJg zCGz{99ntmXT)84^AMS~w(1CVUeD%!V+wq{`tbjE~YC*UqCqqIs=} z&>Owfb5Uk}zXZs!b619dzk%kKCa1ztAsO;cRO6D$eSv2`1AlVo!^hQv&+cgu^`(0m1#V;x(`E zJ1;|zTJ;X-a_>UQd^xkI?JLGud`U)>0KC4tNh-ci^Kt6KptBvx9>l|Lc zD+z8_Q+=}E`e-;;Tx_gREo~`HluS5<`T1JoF9+W9j8G6z#RS)=wjagSPN;eL`Baey{?bb*Xwv9-XH#6@5*70cXK#Z@Vx{Z~2)3!cZT@^fOr+YIe8*X0ipLg;K%FeM za3(&U4_0IyGkF5Y_qrP;sPY0&iO`c+F=vP&>NeuLAA=a)Ly>xSo?_5h^qy2+N=z(o z_ld7}NY**~BpYBTMq?`C;~4l_zu{_DS+jyPxgkQ{2D3=pw=e#&$|e72(l2H=KhNd^ zTI>4<_pbx{h&VkgQTsoOyA5e_&sQ^+ejgJ3WdYXT`b?DH&l7>j2PDdP1ksri$gQyM ztxy{Ww?w;$j!PnoKM z+Zjnym74gFjKs4t^t7PuZpEQ|K;<>Dc{+>?6Iph-oCPlrekxdxZjMQfF>}zr%S~PZ zZ~_6%Dt);W_*pF~FunP{#R;q7$203~WR*Xa-r0Od*JP{&Bf>*Kn-5e_N_fYqL`N~T zE)a^MJbY;m+{oN3aV!p`%)frmIeX=D&1kZ>dK4Lw4?g)W`nR=-BOl#iAiOR~eVQ2m z%Lj^W_TH4e+%JtI7girUrFhcJ>&S$Qm9*98h`AgxDAvG9#ApKi$W_C8SZJ$O`Uf%#4VzW$UFdRj(|iWqR`BTFUgy3 zj_CAt8f<_?gRh;)mtDT?Gk=Td6;{)sbkCSW!eRtQr)WHHSZbL)oT7xK18Ep9PP&pK z6T9NQQlR8#CCFw1^0YK1glb9FMleRSG#E$5{JQh)Vu~Xmq_2Q6!*z?&86QLq$4A9& zV4-~PNrJw_-YYjV>$0ER*>=1fco*d>BsdPcF!8=Np^6yqI7G6dMaD;H)+37gMIT-PV` zkpWCJRY)I6e0Z3SmFG~auZ4A%EBsivI08OX;Q@FW0*VDAAOyhONtL(fQ~_)t5mw}Z z;OH(ukwHv)l@;{$S$d}PLk`B2KCE`Zu=QBcM50n59sAU+>X%#HRN2<=V$8-1vSpewFps2SLRmFeC_jqyiV<6h)y@-;DV zKl!Aiqvj}pB?3S4R3aPn#X%X*uCs?6ffH5Cqf_EWpH<4h^x3VVgHzJa`HJS;cyuya zh7X#Ouurw1q3MGcSg!K#u*GKnF%;0TPQ5NVqcJ!+yVd^l6szemjONYuGJUy6<7Duom zlaXc=|B*y-uH>;VUFf4<%^LG9Q^Xk)k3m1LfM%>IbS{6VoT$7ys2gJcVpl-#^!eGH z5_zjoIA7^72bLwGwojt3yg5N#D&%N|I-D!?pA~tR5s^+ zvWmB4jSwP$CM)R>LCoaYu_e9xp8@qESeYwZ+9=G|IJGZ1W`z~*fQ#U!!>j3)H>cP~ zrj^_Bl3wl>yDxq!#RirGF2%|jo_~0v&ptW3OxTZd=w73`I<>+BlNW!P^+X7c;$NEe z&k_Z&TOHHTc;Z&0O?@CFaV6Vjr`F$}@}iRL7iH^0>^q={rheN(z9rTuZKYAd`v<{#nbf8?!1kWfpG#gf zYKIw4Aquop>SJ~O7OLtzO>H`W1UIP+tgC6#PI}Qm602niW%UZJJ~SSvYYg{>yDldk zi2}jO{k~e_p2j>_|BA9UBfWRJJS@ZU@Y8^Q2d=99G+7KSybq@KO@Wf!dQnRQe_!am z4IECF-y0*Ws}7B4$cizp<(#$+D?ojV-qj@u-Z>rLiRgsVk1GA-hFXN#EKtfa9JAFA ztKz-9Xu!U7xN2u% zw0*6QulEGPIQE(1O<3t0!CUYhZxekncb&KCVVCMl;N_CJaM-a3wENyrt)_BDNB;Y~ zmVX`FG7&PCHdJ<}e+kW%Pg#d>G~V$}Az8qFm+`^sXwBtYZqts;vyiNfmo2oR8j@yx`KxasNVcY6!F zZVPD6RtJq4@aitCn4nJ#0DEKs8_PG+bfg3-n19+HN{-bz})EL%FS`rDDC9WDQ^;GQc1L6K7AjrdLdb z?%!z-KRX!q+@d||%GG0<+p{0G{&a(S1A1F&w@C>0=XJ0wvhO^mZ^d8siGOZ!fQ%LY z_VWR?7z9+Iu0wi^K|KmA8?1Tz+|2-KV8C$`G0XGgR*uvkvE6b*ufl;3bxI*^@J}PC zWFh7zFc8&iLHVPqY;P}JtNUa>O1>MgeA2rs%ldOTCfQ5UtP0rw`R3~e)6r+wo*jn5 zqpL6HRVT4)o&?K?P}cDERhN6_hadT(fnRf!A@xV7B7klk=NN401);}0<1ti;RQ zdH2G>L#87B_@MXCK~0XAwWh;)kIkPQu!~muXwH!@iKjkIO4Sribh)*xch&vKde9_t zn_>(5+}Sb{)cRuo!X5;SEqfWBFl^*H|xP%>WdLPT+s}mq~iciiF)u zp})dp71&%e{Jj*xZk^|w(0oS`rCkym=X_kN-}BM-{6|)z(DoBhz5Zhg#_AL%MvMz; zbAix%(A~Q7OBtqLk*U#VK#g~qZF+!896M+X8@GHziafc0uNT)20tKys^MKE{^&Mdz zcl`gJ!_cr~9^^%tZ9N19p3k5FT~dcPD{`Uh(?EL=R*oLr{Uhpo*yw#=TmE54oed5B ze5OUrzar~zvpkH(Tk2{)cvZi#?eEsC#W7ZRmidrD=XLjqWBw0kFCD>F8(?dWU?X_l zE_XxUeMvCn!QsFOQSu2K56-G@ZFr$*VQ@Zz5?oygE}jTp+XNVPmz+D1?;i+@ahkF9 zM}{l=H@=Fv6SDfijn41)wjX$*!Fcf?3J~R-fBZC-Z(w>Q598zrZK1@=|=K zJpVz6`4%w-PD|#%>S^9EXA})NGAyPp}I;cR)lBZ+EkXdb`;<+k7gARxD z7*@!V0w;32Ol61CyDi{iwC-YZPTT=q(?d3xu8+)h#^sW{%TIq~_bk50f@%XJVGtd- ze;7MX0I@{uiS%)NQJ5Mz62p!fKZ@*N?~E||v=v3F%*y!DN|f1f_m&YD=m;$BQ+LE80(`H0IQp?oA} z4U#6MSpRtm9Q(}pENxtcbzn-itxbjdq|gkd4zrXxPJY(9R*@Br$z2;8E%>7QsbW6< zi_z_}q4^J{JHDD<`f7RmtM#j|+tVUtQs0(~8zi+wkw;WPx_&aGolGmfPRAOa6gV4qE(g1*a_A$BG}|^eABKDR8R* ztHFi)U2s>|!CXE-W&mU=tj!1fc|iR*)VgCLl^XL%1*|!RBhXdS*kJQDQ9T-1w-wZ& zmFgoKL;RJbwwD^)yoa0+ARKSO z#l)|RCwNIu>Lgg)j`zCOq@bk7wRoHm9|MhN+%bu<|@*d?Epqn{Y)vT3iA-NLmw!R zYgN1kxUSY zSVS(`_8Q9*OroRd{fSs*wM7fvmn*6EqJ_Y$il#j!6_jHmSeNj%cK94upF5!=~t7h<=UbYR**#WK*KzMS2sc2JVdxOp1p+$r5|PG&Zpvo_<4znS_tDg zUZ#`=;Rt`k0U7oFJQiBN!R=l$mxDN{p(tg_IBj>@Bta*Z@g{5hz$7T6U|F|N9=2KY zU_R<0?S+b89BL0r>V&zC5rIlc6iry6*vbo^BT6f)lh%1MN35*v>3Fhx8YW*ai_Ju< zTT>HVOccpG3F;rdr@J6{C-SSEgck!Wn{420%wA- z28Mz>M`PQTf#L%se?V7Q?j+8}$#Bh;DKz8G1!8V$CW7a;WYzA;C$HJq61@Ht*mNs} zIS%3^o*E9S7*2i}k@Mov_83#kToLDAPHR}qfN9bQs^`xW=8o0LWh^c*OCXH%FP-dH zNjvCw0#qW`?=rYm%BR9;P20oecIUcAZOzwglU#-sixXYYbmkq5CW?Z=N>uQYTn37o zhHZtN?UNwMDt4Bk_*)J^RFXn-S1Xxa_pQUlOq2}7&b{;)_S(XDUx1FD$#SU(zMO5Q zcy6PPm&?eyV`mVZ!}&!25y5ioj?woYu_s3~fGYCUHo$;L)}2Jt=qy#m6PH{5`|kv( zIBAn+;Y{rp&eHsH;EL~0@sTDAePqztSy{Jt9QaEZ{3@ow9x1g9TMtCJ8)Dm0eC)lnuIYWZ< z-@;9A`mLVV+dX-X(Olo1_c`Erj#P!}IY`Ak(sc}Gh4<#2jE|-g)Tr>76vy?NT&C>34ms3BT9!U(zxw`smPltFY4;^$Zz(r)V>B-f0oD7~W zf|CSxo*`rW8B(>2e-}OVX$M|!9}{!;MqlL9i=-wO>M+{|?E{?>@44sb4IM@u-bqXS zqx9kOeO8W2s-;}#b9$sSIb|EYeV11jdULwhXqv~3q~@H?_V1htw~uM1qCk$}r^Od) zEOGE^x(1fSEkifACW$Oz4KcyWJ(eXbLK$7(gkslyKSgRA7b`D3BLc4vu}vhC+*(Iv#?2k=6d|m=ePY6uEt+r7Zqv6#F>OS^ut%0VXufK`r5*(5y29n_d~I>< zEc0N2yJIu*LV`WNeX;=bylw)|KkFx%v6Ju|{tgLdh1w8zJ?SNa$mIS-9HjI-mJvMq z3Y&_K**|VfPe-daH~_)qG{y-WdKiZsxM~WTPjd9oqu}rA)%ypiJY6kh0<+lfc51>~ zL?rs)flUVyA$#PxS_3u8$L68J3r7Icz{3iNV5ZduVPGvbFVR3nAy_m=nnzHi%3HYe zMBGOlF>1|e67GEPK_>4Sg~4qQigkZ{)FDUz7E9WkdM2wesigDPEUp0sN(TS9g8d|A zOrt|G+6YC$C+)}+2$ET&D(aIFF)xl~(+U?oNy7>=sGvBP`WnRpg=29Nm6s6eeF{^8 z#sA_|-FI7`&PD8WM=TFpcxHG+$ewy9lbXx9>z$!zN|sb*nssr z;yhZ?NA|pJc1w2oyX3NW?~JGKTIFf;XBD@9B&Vgc?I%WFGz-8kJc#@CpUZl^BKe<8 z1J!r=!O(%>9S8rENQKg{A~XcO76-D-?rtDlukAuOH(xSHqA)k2RN@zeQ5*bs=UHbP zK*F3U!4DysCnjCSREH<3aN;x^<2Px`D^lY1NJ&QKNhV!VC~ksjX_94ElJ!i|_O&D` zDcROM+1@L8XLPb-X|hvSvhz&xzQrV8Vu~Ln#gCXmSxfdRO*zz+;>|LvaKHpGFu`n$ ze>5hLia8LSa-=IYY-T<6WN@;pBPNiIi6o1Yv7iJ8i(+E}X_%0;RD{GzG-s)I9SmS& z6mAftd~~F{(t>E1U{Xr5d3vE&dhw`KDhm@sHq3|?RYD*uBB0uU31*}wM5i~DW(aAg z_yMT_Kzd$7>XlKg@L)_R7haf5uPn8&M!*=aj8^l^0rM>709Ftivr)R4bJ9?>jCk$z zq3E~@(==<2VNY~+4;Ls)1o3><1MSQyQqJo&?6GJJib3R2AQ3WDv&QN-&mrffqj>2v zUb%p(`idh^JChb%n##xJ0y?aY=*)Evt7#t4W2fB<&X^>z-_B$#n1kKHxl)b7O|I)8 z$jg3OhY8{5h%T|oa;!3KK+-19f_7ehHt!WK*Udalik>~=WhvdANfp35_z*x$3>IXm z&K8{T%0baVnn}S78?vH8A8_fHwX@1bvA5{CJ3C-B1R2{DI@4gGN$jCn>}E1Vn#^+g znYZ1d*vXu2MPu79rPn0`c%iI4A?Z||yzkmOG&x`t9f{(DllV5wL!DmWH? za(V{Z2ruK>WwS34axNaAWb$H$p9b*e7hf%Tmv-(kRbv)o&|_BY!nUp^VCp@ z55Hb2SDl0^NqeNI7g%z|U9%T8dhFezSs+j_?FbWSP&9d?Fw@hg0TsAfx?rf~l z>~XAklHpIQ54242SiIOAyj~xWQ9n|a^kuDLy3|UU%ppz!q5wE&5#<41=wT>}1J%P8 z)jJkTef;t_(t9bO5+uSJf+DMfDJ`Vb5GsI2z zJ(S|3Ti+LgaSA=c?a5ObW0TfWuJ+Wn_T=V`CQ+Aw?V;?QYS_q0U}_9DCjzrV;Bz_g z*n^i$Xdni;6x(%?FlprdW%78Y}&~!c+&Ctsz zE{>+a5^PL>Rfqdr2a0A#)9FMpJikqM96OvVOotT(U5$GZ!z~KE@#`EY1_-BfEYDwK zJ8sxqSCyNtj`cK8z3H_N3Ej%PWVOT<6K?HG$EeXZ|FZxi$6FZumTrZsdCO8MO@Imy zTO?V9_S#5z0hD>vmECz-bXbkpJH1?xa}L;aJ{y+~hH`tGWYU89VxH$=6;AKZyY}!{ z*>_yVrQKNb-_TE7x5rxBJKc5-K`q&;E`nCq6{H#OB(B4`j_>0wnX+#=<(cR;i&FaZ zXnoe11L?e;jZ|(c@j3Sq<>{ful3(E6WlpWd^~8tm zb-$o)z21*yH%XM>iKUxSlbzY2rSx;-q5Ct7elexBK?%njVb3FjScAJ3TC30kgmD1XkiK5q;0Yw|6v4Vs+tEA8vLaMhaEIDTbh zmIY9dq5Tu3TNDb3H^tW^#8CT7S0ERyCT?E7_ z@-%;?JZl4m39<92+{spo1Sm8=xzHe!rW2uIAV^2`rD5=0U9-J z>uSOz7(6E!lq8)1Q}%K&@;8)1Qq{(LkC9SQ2&l({jrPFd0_eTST+z(K=gxD>)ajDS z7yqm=J@@8r?!}rjZucL_%9#aDzevyMZIGMm^3xlIV_$|eKTex?tYSUBOam>m=Vs2c zM35&t6CX&1)pC0<87*H_M$?A_G+4ie%aeH^|SNM@!_`PthX_Da}DYu_%&Me+0T0u`pPgfzPbC< zA8(M}s+Nuak#)=tZjqY+KE&xL_HGK`V2$bX(=-6QI`6ks+6BDrVZD0a{3^d<{9pDX z+wE`+lB6}>qh~#1VBJj7AH4e)@jG$E)(SSG=8GG=QKY`vwigpjm+3qXzM5-!)|%!Q zjdG)0bYr0WmM7F5F(?7pSjE!jynF3jY+!IX_7=e^=fCM)qsGXaWMv>VXYs-FcWHBF zhwcHS-y_VG_Z|58P`;cQdwQ9UJ^OEg*f4kD1Y3vJHYoqvD)Z$Yc3qqR=I(i-XTEXx zfj1?lFl@OC%J~cfXyDfJtk*PhRQQM$?6s}Hi~RQLiIrN>JQDJjnmysC_)O>Hbw36s zW`qCu*R#lid-Kh&xx9}g#wQ^{rS)Xj(d<-zHf9(7V;mbrqxbB#PV%K=@D#O5ZERul zhxx@)O=NQIhAX|t^u?Cdh(MF~XFU$~hBCXu5y0hss$Bdp%Ao$@ zK4{0WJbfyNAwD|!cj6-9jdbsdgmW!3Yl;zykpRACcwtX$;}87(_Nbb*vk}bM*EepE zZg36jbLxu`4~Ac@9{;jxD0oz7^zFCuTnh_hEO-=gEz{Dap)C4I!~;kk06(>?KXe*; zrHD-K`#PIFE}$tVzjFXKO{J48e$nr(;o1m02j1RS{_<|_iv$m|oBq*W01SQnUMm(K zL!@EyK?`*%>a}Jky|Bct$_--H~BxswkX>_2t|JSe~K+f+)M@K|Dw>>FCfI~ zy|aOV?&0T+#`Da6P+3o-wrbPIJW>dHrcAqvX#=Co*N?`sIm041V?^z?OP<*|ARO_O zOJen_-XrCen5FabPmaJSGka}Ezf{+4$6_2&RJV!JO4!^!3>NyTAZMx)HrYOGOC8w1 zw=GoqY_3Q-$pn?5boZnUB8|V_*B5aut32+h<)S08`XpP%|F4&JG?^#t-D{g)h&()$ zgHzU~QizC{karL1MCC+h)lcKJTLX2IM?nUdl>NP&FK00M_Wy=ow*(rwisxBGE2^suyY#cnsqg&RYvgG zq6_kLdGKJkwx6y3f~9nNSeP5mLaLvrDP+&CKe+AsWd|pYVRxpg7Qh~wSpCjcE|VJu zpziMEi(0{s6qtaa5>plBv;%pf8nqoy9kUC~RZXZZlN{3u9fubQl!Z+gxj-Vf|BQM5 z9a|&3MsRK<3RjYYe=hxG7vzldXJR5rh}}8Vg&(sfs6^-$yf3ttx=W?sexF=WZB?p# z$OYG(B_n@RK^6VlHXxbAF?{Wj^dk5kj;J{ECS9zN*^l2ksu~|_(%>Pd68)1rcgWrhgm%fIg@|po7X2|CH z(=OQ(EJ32EIiEf#tj5r&>ssTqrb^lY902tGC7T~ZLf&azI31%)$#~j0Z&Os4qve4u zbt}4O^dd_^!|IIO?5^e&`aGi8p>|~_{pdd<8%qls;?9~3eBvR$S*j>mSY@SsG~8H% zYzw?c*jdUM`#Q&jaX}2Kb?C%cab(CMvmdL*5`de3I9PpD+##i&BFPTXYmt*^CNeu_ z?i&kcO4)vdCZTJ_wjC=GleXg9y*YMN?u_g6Oyi3$a++lPnh7$V@s76D-S{XBM#ujb z0wh#11NR%(&nMqmk29|-cr%q)bMg2kFJmViuf3hi3@H+C*M*%bd;R25?N>4K%F@aO zhY$3M@USuT&7~%4)|~q&s~^ta1>;3b4D_MyCP7Aeg$509D6aN6A$Ju>T$eX6Ft~l; zukDRx;_TV{!4DMSeM!4+o{(3J_-N3z=V$D&tQ&2g!#>ygtEYEw%EmAw94aQ-Z!L7+ zIih(cL3@fc%A@+KQcmx4MD8>Y;d86@8Wns*^!X;dTPegGs+s6|Ok}3&Y*8|qVPY)( z!N>@Dj6uUkU@- zTSesl1gxu?6kvp6O9)s#Rbe2>d-qOujwqEJO%{;@LxT+UeCeto7l!CZ>6^SF=)pbb zd~xf3W{}3mgw};BsHhrZzRJ?)yN4DKGLw~h=joL$_kGV z!Lk#vXZMcS?30fq-A~$=mTDgOS`}5QC>_9n>ypFuT*Qe3&h#R&lL2SaSM5;zkqYMD zozS-$Z^=-(+o}4&7!leol=+#v+rAhc#W*UHeX3eBOvnUl9ut_s2;Y)RFL>IZicK!U zY^PpR`YRX_@nI%P%v6C;14lWvZcEErB1PMTgEFtXerz=VwC#+XO@feOJ2TPTV13HZ zoZ1Fy8o62y8)|LJ4{6o95a6OFL<6E`@1`7*v`~*ggl-7oWeTZ83?CE;- z`29kR((_d^X-KC@REVf>L<=RBdQ~;_b&}m*U@GgPiG_r^`W_!uNBm@!%sW?V_ettL z8tZ{$e3AnujFPm%b#IUn0z{ssKYkhZ8pbsNh7N0)(g5=`%+MVQ_RxWwrKA+h?*^-m zbjTcn(HPVc?@$5uiu{-;6sPBDd3c6K;Wq`})a#pI-@BRW3liuL*FiqTDJQw{ILN1C zV|k7}_FzglnQyj>CwrSF(|icr3+$T%Eldn^)!r%*F4E_GP*r#>KP~sR>lO(I-|P(( zCA~dlI4v}(s&G$gW?^j-r7o^2JW9>pecRPooXl^Jcl?0&(DN40R~3yExg+Dw7ei3r z>bzd}3lqiVLhS2qxRRl7IriHQ283Rlm&-l-Rra~(Auad{$}4;1vlKy~N}!rE6`nI7 zbtFIhl)l!zHP2Go^SofEVe+QLg9w~#Fn&?qZnp;!(dtqa+D#r1;!V~@qe}I_9-E4f znaCff_JRA&uBm@HiNe7~DB01AXDlbDZ_7infBHs>Yu1m8I{)H`?QZCg%>Heqbw|qS z)1m9Ag%zwkE~1|@bzRw>4x=Wk2vJ-+rOk;uI`{`N8=ZHd0qbLziF~(kog?8dFE~K4 zWK1|GiI~g>ZP>e@o;Tyr1MU(OEGZ+xP`lvZl`pczEpdpGd2uAs`<>B^BPxeQ^ z_hQnrlIBugeJ(3 zO~Vgv5Q}xdlgAZSzrTC$MFq{Z%m-YzNpcK%!PbnIz(f6`DE7u`5r72i%mtHWeeY&h zh`(@I`gkh({-CKfO`IO0L1yCgubm}kD2bvtR6Myar`@GXMYIt#Wqs9CPt$Ll*vj!7 zJA3TzF8hp0msod+gxYN-QPDmlDu0>GHx%_@I{*Tp$pZMq&bVFnKwrLu2;H)wZP%|> zY5*~bU=qGug3;guRl8(#lBGHe6Ml_s-&?$!bpSpALuavG$Z%Xf!hNE9b5EZALT z;)F*m6j?$QXQC7k5qd<*raRiwKR`)Fm_}Pfl%_%PJgDuCJ^3!B@=FYg2ekdCC@fHJ zBVxN-6}Fd#ELVYALnvJj5mh4U_Ss|oTa~95Hq&K=xc)jKGsw3H|6l$okR+M709b3A zooA`}j##33PFZDOvS!jzT=>%>L6{A-A^yKK2@h$ax?YJb?P)D6Sdy5T zFbK6bfKoKajhNJ&hc)Jk<7NuBHwNGts?ih~9f4csXN~36_?MF`!q3x*{zT){LMSjN zVD%V1xhShEo{I&~l*)SXAeN!9imj8x(_f)FZ&>KvY2S zY=*FQ;pQPol9F2;CEm%_?st$NQ9PyDn>_m~wl6WuETEGXiblH&%+l8jK<;J@UJTbb z>84JY>FMJ*B0JSE+GrSS=^Ei(byVz}?dzu+owj~MZR9B|{#{Y_`-XBKTR?Sp8kq*& z^teQtC-p;RFWD(e^o=P^TXxsVdrgfkW74ZJVdru_PJ%CYi_eE>pDiotchl+>R5vz; z6rT6g{h2${ye42<8QSg{!W!lJ2(B1w*&ct9kV^fi3_f^v9tMmMMSIv`DrezQAv^9(*H z2=X+IY+k&G+VFOGl{Mit^5oDT+CaxolWq(BM~!%n4dnWZCJaC_lYk+A|5_r3T`ix0 zx48ZcP^UHP7+wmo#C?l`x3DigkgyUKYP>vjMuP}jleNF@JQa3D6Zc;8uH4>n$&~+K z{STJb6;!DIvHMDASj(bmr@U;+Az&3(ZB12aI=kh!T+2LJRFB@Gv7s)|fLJnke!M#0 zP0d?8VG9jh58c&OUeh;@wM!H3`C0S&SG30nXuJ`z0}(bqAUj$8y-u6nKPmdQtJFN4 z^Bkyc1mw4H2=e5}bf{(CDf^H`{R8GYT8jplG}dQL)xQi?;b$;Kmbo7`I$Y?WI06{H zi8ts`aX2ovt0KwIwIQt>{3f&y({wpUzH`&E3wx6ni3dhxf?;49s*SFha6s?N?a5GQK-XImLP)ptGE=gN@mpZ%m7~|WSq)boQ1wUrGx@5Qu zM9wz;osw2iXIThqQ=)~Y8lL^=KwoGzbp*tz@cT@(I~QEn%*X1=q`EA zogZ1(!arp35Ok`55BuvIrW zha3k)b3tu39DJeOf(>oZp@eXtVz-Piv3EA~(({ag{k=o%EVXSia9o8fYQB_KcEc?l ztZ!Vm_M)Zj{dOxmRHb3L%XiQ1FS`=%+rZix*dEJ@j_xi;{o$n|jAuzChyWOdqZngE zj*Qi$gX(N}>A3eH>u&AxreAZze|x*z6~`v~lJ|P|Nox~J{uGK|9(z2xgSK+Rf(xP% zpkY3K4%>-GX@&4jUnoYa|Ebc7z0@&RlWT3JcP2)S3+bPSH^kaY{YhhXlZ*HFly-%Ci$~B4+o@=~yzgUg&1fu@LYydHnHm zbMAoUX*#5u1sRvMq(Imc<29$62TslO<0&^(sL+}sd`K2p{PmzDVVbsPlSV+}LLgwphO`jq(9I`@PBbLj*F7AY644S>1YiaO5ZmYh;sY`WWP+eg zvqoPjg0`DL2?PkrnlRU`D7CtNJ4WllpVY5&+Hy`nqUpIGf1p@oGe`#hI%98Ujhv(;8Q6B)DXie-r)}$}`ta~faTen{ad*vi3g-cX zto=^}EXjCwd>g34m~~m(Dy`pp9N*!R-79N(+aJ&ho*c{@d9=Oq!C_f!kMm=wa)dwu zZ{4GKT4myomWXVAK*)Ki8*efl9;r8XeJkCh98fzKFstwV*!K7 z)4Ufl3+6rN?%n{L=CfD=tVTKi4nncrn*# zAI5!M@q9t)9_{7xZ6YroX8&i#do`o<_Wx1!9!^blZ`khMJIUUGBoKO+fOHUoB7~xZ z-Yk)3RM60ihyejkvpaZ4Loki;`V2X-kbGWx9Q#OoSz#nDP6yCPvhzF!wd9h zv&Rm+bNUQiD-kqn-_*f3eRw}+xaP5$@eKqABaiH%Qc%}w^Y z_Ybd^nzgghUBg4q3}zqMaPETB*PxV!h1*iXzCcKU3|Y`7KeI3%4QCR@Cwt#bHvZQ# zx$gDZL$m(pX5U^&1o?@U04n3amq!^Q>l9|5;Q}^7_%W+s^+0`gR0iyh!e- zf}j7;nNpB3&0fU+3eWtt%kbOXP2ZKIX7(TmL;^rQ%8K@~ckasX(qE}Jeq&dEJm2;@ zf2)r%c}a)+td)HK}fT> z${30)4rQ7}=R<{6^$@xF|5u98rEQqeXJD?-cRfS8nQ$XRE~H&MW9{WL$SvzW4Y^FU z;S6lEYF~1ujz$Kl1CxPRnG9N6Kf7Tl+3~JZ?e^r4NlCTm83vXwhgF-Qzw};<$w6bZ zNz*QB_J}ju+xG8F!DW=!QB0rWSYOaO^$v+X;a_vkZBl2nx-vJJ?YfJ)Z)%wPf@`8s zBd_rO-Te5)w(WGqzs`}wL1~;a(I9~ff)L_;mukUf-8{y2Av5cjkBj*?3H9jzi2Sb! zxh3XS&L&gYA-9^Ot%iq{e?~x+E%^7EqzYhQ{fF6yWB)QkQ+YCh-jBE!_HJt6gJk%;>#GRfXG++2vsj1`(G{6)2JB9H1I9=F9hAXE54JAks>kEzRPZsIN!^B zl*7B}#_jhscVFJfOdsAe44)*QodJfW9f>50~(znDfV zSO5@i?bugD%CB-yi$`&_`OSWlX3^?)BgJZ>qG3cRj}#-H-_Mf3Sxs`gn~HwT);M$burWGQnWEv2qcfj_I`_GQd$Ga`*=I8&1r9)KF!-5JoKTr` z_Vg4JCOCZZoYTZF$#iL&vvl&%LVja0Vp~1oMw9tl?S$Xx@RGVijn6SpImci`pCI21 z%1Uu%7fD(?4}P_3YIslPh8#@Su`qX)8K9kOH{o($=tk!MIomEz>LMFORd;Af*s>VW zQqe(OaYlESF0hc0$m?U2c=~Qhp7`Ffg)5c88>;y$1P%y-WaNxJ#djS9a%O<*t*Myg zgnoPMowe=cNvR~KY*~}7VFPKkAl{;>vw-T`M;2<*SVu#Y$3O%32f$i~Z1qV&Ui1eE z2}v>(`HCtNSEptKyAbV#cckN%hB7NRWXa@rGS%cCI5wkYH@S=eI?H&5h;=lDzZRn^ z=LB1_3^D%=9_j=cB{Xw1e=yJXy*;(j)0QKdbQX;kEXWj40NhY*qQ6d49LF z%~$mdK_5jK`MWJIVv4FAMtZ&3@}X}^H1dbAYrJy_uR;++5&=6Y%0r4tn4b%LtewCk zmb=Z0K6^~Xn~@drcfoqQ!_iC7(N-oEK=bTe(Uwfe5?(*s=2)4d~dHs^LQxqD2tc(Mzzp$MLyY|pS^WIy zF%st_CWe{)ui{IFj8+Kc1zMM7BdZ8{1i-;UBhNo@SKlKl=Cv{$2 zZUkJ$2M7215a=0r-1Yn6M!8=(UI`$Z2El& zaWBu-7;D_{Qmr$co>xQ|I|u9tW~ceTnL!%~k2z{#azAiT$IaK5?bw~$y#7a_&G1Gg zy`=z}UUgv(!@*aBNOcxOaV60%(l7I!LdjJq3nKTHEa!>84GJv%$Ckp&JGD)a!N{e{ zew?%WjRZi6=1LIA6xS*k&D1FH-=X5wP+#0PTFe^oA#x~aYo65P%W1w`%n3846Z2G3 znpJadqFg)I6Ktuc-CPQeO%*TRfqieCSL4w)`|MbY)d`1kua~vMbkLTAf|Yl8BzX*m z?RZVyC#S)6_Q8}>TdGw4V=tUhl3Cs7%YCOr!oELZXaLDX8Y6Ho`wAtgHph2b8hfQM zD{eS1=TbH1_wHeA2nF=NUX~d5V@R^_1vsbDysel16qyb0+B$x>_F#$(K}v8vjNhx5 zruD#>%(29ixJrMX#qI89fH+@Lp+i)0Q`R@|rax(C1Z`K!qRpi^AxMFZsMKUWa(RHN zn<0z~9Syi3K_@|0wCoz~ES8K3a96*44j$nJ%(|0cW6rqt2p`!k!HQ$p0n))#L+?qJ z^r(Roetp6zgLtviKw@v$eI{3Vtmt{&5`gy?s=0QNVDa5`YLx|Y)mU-b`5;(f3ige8 zp<@e(;LLxB)N1Km)VT1! z<+A~K->_Kz&IvBSi`-moIc6*ML)QyflntD+^UOKqU=O@SvwjqfpsgQ%vtm;f z6MiQGLy5Z%TAFv78(COM=Z|7_iDI>x{ZStGfCZh?hO9#%IuAJaRW+T%R(=Zv?ObJ> zB=69rfht(Wx>@U~GU7BE2Lsv4bWn;Yv0)6K%2QgK9B$`N(Ech#r}-C=KtGUR!3Pig zLdq79ZdsMJ20JrpYn_zAajMb76R2q#BKw`7M)OaLOD+<~DqhC!UfQ=|2HeqPuBiiS z2tcc)?8`Jjj;f?71PX_c)&Oj8!PiE3C6$Y5Dq^2PBDrSYM z34ux$qDWHhd~Ga8LbQ7&u#EUY?!LEZlp+g}BN}J&#UMI}BuLnb3gXb@Vj?2P1LeLV zDlUK=SNqRT=~9YzQFZY|Z}H@8@!c^wgvOl09z0K8jXmY!VITtV3~ig=a-a1}6#3rw zD5bCHrHjd>Z+o$5TFl2KuzE>Sg`u58qr_b{;w`DF^Gk189(y-??7yXBfC?uo8CEliyXQm{O)(Q>NNirao7;X1R={Qm$=XuG7H@7L@4L zlpFPxtEH5OP~k8d98NwSMukJkuzo?gN#Ak1x#Np(%R?FPHbvyPJ|M|O&Q^)xVlkV1 zoRU($S>=Sc^$7)Rg_vAM3q8pdGU7Z=jf#LIP?A&OHCJI(bKJM4GP%lTxkwt`bc{{B^2I4XgSWh--LI ziU;7C0&h&I%&n;o7L_~Jz|n%#vu$t`x58_@Vynt=OT+4%UDf%^wbJj(*B6{9?mKZT zrLJ@i{G9_y@leXNnyM%`YpzOTuEybAD4qlP`D`?ys@~lN-7u_lGps%BQQKNj+fh?v zHCKC1qV8Eo@r4xl(p+`#u7*VwLix=)FbNQMh0TUS=T zYpCrw4!x_aTnJN1U2XWiEAPR#bp{;h|GtM26##@f5%g{@Qp?>?Q+uZGq?Biqj7@VD z>6ALHahcQDU)F5c+4TFB2cB3-Qmy}D*!()OK1>+8d#*Vky21Wei^t9Fe=XL3+JV5# z(=#3b99{`D!1t==4h$Pit zm{={2^=PbW?V7DU8$S+dQh`Vs?5|qhm3m?`rc_7=)VWAB@yx>e;tMq}fe-0!IInvg zg>cV>lh4`*orq+dNv}O)!aH+qLX0%;6FagHwIV`a`EkBlJfjPB5xCNE_Ky?l#KPGy z?)e;pQwd~fi)S~f?yNK)L^I(p?&X|ltlWOW?wg<_7hZmR?l!hVOmdmMsK!wtWh!9) zMDDMRq9SL*RwF~G4n*IkFj**b0AYJ8?kP6Vd1 z;84=Vp2bQXhJ}jfr5o8DuA4w7OXsZT`9w?jJ7gax; zGaK)b5nLYTZ#|4VXY=)<9r4l)E@VUQTSvrf5mon3oN>j0?nS6{v4Kw204Gw^MW8n8 zu$U3=*S{RG^D?36ax!h}!+51xBS4#YC40|_5yJ}c9L0c$;ivU2)}Tl{)EW|!L-W zzzM{v*990*%=WV2z7vsIleM?*}|q`m~vx%7WSm7EJd5QmOr| zMg5&>mm%`yb9<1x#)v9W>{mm#7p}dj33(d53ctLn)m7VqrXuwhFfIZFm`7Z=kdC^; zs23Y!jMn!eF9`HL`e(Q-1Y+Rt_*B2y7u4$m`VX@cHl%`{n~-1+}+U6Gk}3f zxy61|b$OE-Q7f9$owEmyBBENe8pTlX(}~`0(ZwGHO(toe*a%2cht?6@!83hsMSM?O zKfWHG+FgBexqQ80L!^ ziBMAds1_5n;bF+#qpA#q76CxKWUm#744~4*QAPeP$7-R8}?PGVdCdNSZslluDs~7d~K{3=!v3`AUoUZfhDMa`%itd zo6={kdY_x0^0C_J)THh)BDUD$G{*xOk+fZj0!K76;Hdf(bo9xT5t) z@Ae#Tp?v2YQ1!IsY8Dv9ydaLM!ueqSO7#{drezbL0wfL|7T0Ia0(az~BV+#_rxuie zMNelf`L~%|9wL~3V_WsG3wU`}tFS;<=kJY{lMC8g(c1;+^#F!Uh15wP;p1vWoMiQx zKJF&ZCzmy9X9}M5U3=0}H*K>Cb>rW3hwZ%6o!bz@;2~LDsPzcV=~3QwJ+G*49TBay zX=*cf;voQNCN#)YhBhzA2>PeyNJqVeiY2mWx2sbhrN z7e?Cz((^A&O>28M^>4WIL_r;;6GXt!q%^tk=fE;U9O~V=svR`+ld}t2H1xCmVDQHg zlioWwv(73I0b|zvU9oT~^K5U_y=&IM_kanM_y>-UXp$@M|9RfOXSGxM;|t8*{^A2D zkO_QS!Hqc9EO|X^CY^$K;9NtU3+-ce#%Jwy7%w5TO@P`>0^R%kOCHx=rj8v|ueP*) zXR@~zew->xf?OQ%bOr)b6F!|Rdr~aj(}%I4PQ6(Jp-ie0fx909u6*7PN7I0p86C)P zNR|n&w}qp4(3|w|;-mLAq(Utk=mSh3?kv*uzE$XP22B|J??2Ft2n781YT@dGNp7_a z=Y3BHiv0|6U_zT&pT*Nj4<6cHhz3NTzc#>I`c9_2m*Z@%4r83T_YG%FL*j&AN!zan zo`i|KuftquGwsK@hEWr>#HhfpF()rzfseB`>VM2vf1M%0VS=m23Wm-GAViX~JMUW% zO{6Y(_H6G5s!9c#roklr=mWs_lXLXu%%)2IcU#)f3{}6-6r}R z(&rzw###Gd=0gs2|JsMmnx|eB!(qu8O|FP! zE3Pp_lv(g6BN!d^o1zE~yq`#50)t9oduK^o1C1BgINVsu8vBiA9Jby5SFz-N%U#K| zGq4Wnv!@NzylyI%28`maxdK>yha)-vx5d`O+ujt|lo}l#Dn@Pp-xgajXKO~!Xl_v? zP_)sZ4gXJzZRUy4aJ1Cw>6WW4>pZjyj%axlXu0$c7?`W0!$T@B-oG4y#%K(PYiu9O z!RE@5f|DUp8y*c<*e1&p5iDqBW^A_CH!n63GL{X0aeoyEE3rP!fRD*PmNfBk@~Esf z51*3f#>J|gm$ERDr<4IZWY?;`7g!4bDBDtho+vSLAxz8AiA>WB%xoiZWA8OSx3$>5sV3URnG@16ck$`8vzLgv8;mS?GuW%B$mb z`7I+-IFpu}nC-gSeo9+D%3@?rE68R^&M~wAiB#I64t4TQ#9+vWTjMqGA9A0bwazO4 z9fC_zXAMcNZ!{mLg4*i=qfQ?5x~VEOe-IZJ>FsyYM`YQR7!8XgcDh@Xb zO(&VbGrnAXvvmP7=d>hr_^&P31+1II__T=;m$3FdGhtD~gEzhRToPXC`C4AS4JML! z#YdO#?tE^lF;>RB70hL`ak;8gE!sBwWumHV7l5?Q+VTAO`}bzaNj+wi-OP(8QydkU(2?Aa{wm1>ys}(@|?7dAZ>%ojdb3nI6NY^&N(LY$l5$l|w@&%GfX1G1I0#Z7T zkG~&>P|j*~64sjPG48~mu~XkFcdqG4=fi6RFz(~)V*g7ntI{gUchQ^WI$`m3n<5;N zbQZ0@sT&NmzZk@4<#c!!v+>4GPO9`4K;okddPDv$d@SvvQr{w4XXyF*A8iz&bG{Oe z3qVVNCba%b&RugaT&oZML(GE79zp4^f#W5p{5-qvNIB4i)N#-{%;IU84`R94-9O7h z%f6ie)Ltw0GD09?yZm)BSSbBhNOWNEiA9mlukCV3##sKdSJZeWm&SJ z!b5iXgRnUl*yIiXgB137K89@KeLKg%Vn~G^;qhqD)F0$HkWEQ>l+RA?g>vf4NeyPD7j`834En%yUEbLUMC33-wkW7DQd4+WHj4l=V@Qx+1 z`4$T%QSCKpRMm;aX6GqHO+&zc{+E4Rn!Z4EcAqM*ZI+O0;NX{r-|*v?3x`egV7PjB zsB3#`95(jAz%20ex&%s=NrlkvLz$OIN1cgUxTWtN{THwk^5=Md$|N=`70E63f14)R zuWU)BaaE{i;{Q$tF9}HQKLdo-o4LXDe1#J~YK&n8&p`X3Dp)<>wzdY1Ej{osZ+~YV zEJH`oG&z(ky0E@McR$XJ^3#*b;yf#j2ORTFR+M?*&O=x-yW_xVBRX#Ip-EQOu5XUWUL0Gx^$MuW`P4llsku=xs>~qrO;rvS zw7ipbl#nbe3l9L1ADrA7tqUc8<8|$?zfiRFP3Sri{n_9FzjF=1$C%Qy)DPaxP1SE?E@pF@)l_l_;7d zj`)~+*)&H3YeWucVv9%WMh7XG7(doeiyGSI~T;<#yHfN@d2(HL85j&L|0$^&Iqw2;t~pBrUL zj<0I;QtC9w2MonTtsR-GaV3pEQ`onzBcWHG?tb)?+Qw8vOR4M$0oSlJ2na$hn%fH9JH%YMj+;MV?!d$e9# zn8wZ{=!|ISRT41VfUYc5c^<)t7&mhWM5+kZoVYJee*UjD>AD2UePE6To^w|II%xko zBEvQwyOnI&ghZCmo??) z*kX6-hr+AfFu*Jl%QP|%LP~n}fDbB=J)o>{r4BO*-N zBGSXnI(iI3NR;wXC{#D+@KT5@3rVXcyrUg?glv-(9RBlwVkZD@AI`rnudrcECBWja z-}j_F-bv5nLacvnT`6-d?qSW1fzL<%_FlG+60L$R*zL|#H53D_E0(88h$^)#mM^;= zFbG@-sgd0!Ze}Y)}-v^F(6T#0%^>^91hxn33gBb(jurT z&h~`XL;+AJ0UqENA2CElT2vTY7F}KnOn)ci#53|A&(4~T`7#S)c{<-ud*{r^jXUi> zS%V}$L_6s*q}T}s!dw<+HE&wn0wn}mJIGtc6}L&8$Pj=%hY$DXg>{b|j~!HofN3CLCQ-jW^)NTXO&+z2qfonFETEbbk#mE9ys)7l z1%QdG2vbb&h^roW&;}Bu4H#3HrtCzZ>e7z3w*8{vsi^T&JqxA(plFjvTQhr?WG{Jf_%x0g{>5SY)fy{V8j>~( zCgugG_o&%W_GdODQa<_5wOn>K=Ff3`%d2+_A`}g1z+(Q9?$);c9J#$qt`7NLKXuY% zsgOAlh+_d0Hm3rVP~WJKCLdHLf&T`Lv=UJ;uf2fZdRxa})dScsMB6iK7I$JXk3-+L zhyBscRHBDJ9HUHlNX|!A-At80H3FqW#qKnH-Z1Ns(Eh+uuEe6n_=OVoj#dBpIXCtd zXsxo@>)EZ(FCBg{Q;;x1*}y_2h)PxTlJ388xoBj10dpqo;btpk!0%_Jgqq^BaVues z!E3Y(@D2RVN76~sVYN!K+#;FRXO|M>v-8h-@@2OZQM^_p6#$$_9j{gK_Iy}#XT2|- z2r_+VY3`Gp6TW*Ss$sJJk^r z6sp4jep?=XXzh2P<_K8hLN5T>XfV()Nr@QM!bjT(({FLmCwd79Z`>1tlqPNk$fqgK zy*)AuWEgu!n4AVu&Ckww0x_7Q-eYB#Xc4l^ZkTv!P=G#2TIIefOy0~nWoC}%Ri67d zv&~XeQ#haCB?=8b3D|rS5Jg( zi>09aJy_qHcepOOGc#QNI0iM|K`4>szPu(SQ)H=?QZKDYa!5eC8Qs>xrf?< z74X(7?iqT$=bKu=OgQig=;AgdY?pjEln@4qSlu341o;pJ2dOFG_{`_+@l5g~U<2mir z)R?*pQ#A7DT%Ej$4m*?hXI`K~A!aS9521A$tTb-w>-_90d2T{u9k7RwIee_n+`Awk zliv44VtkVch4#3wIP1E)2x3x^(13H9DI+oxMw-*W=@+U7acW)wW|E(LC3EfQ z#()pwYM~GnfiKf|X`Mhk)e(mZR6-B{bQRq$1b|7BZ=>Fwh%$(2iPB--vFJsOy3z+8 z8+=tlJ&wk973f)%IYx64H&WP;UY*yQ+D@yR1EO7<-R>!8ohW9D|GY|Ck?Q#?XI6@o zhi!UIVbe4C$`R77k^D0cAF<>9-fL(F=Bk*x0X+B;<7F+C}Lf~;N*rx-olp@Adaiqhr9p!KIxkhBD{^$ZQr!p=f?41u+$f+HMp&P zE|qH&DQ3PY!l*kg+h(>#_$g<>0`%%3u=DMsU6M@YP}Dc>DDjs6alyrcNzj;qf|x)e z7d@%GiuNHn5?ugsW!w`UP~v-pKmw?`ptscGV-9MK@VUQ-fiY{~niHnv&RP#9barND z)3fadnmRLfONRd{uH3RPlXXHIev)~r5D|$Z0sB;?wTTl$Ay27$pSR&JxCpwRn=h`^ z-^fh6AIqMe6R6akEsCPipY*&@`0t{_IkX=Q^E9x!A;cjLkXCITRTgNr?X_Id(KXGU zg#pl!KZWA#TG;{RQr@eb24j|^`{`X2A-K*x`@nw!=%u36>6;Sg;@1#9979JG^*oM| zo!c7=nTA8N{^xU^*`@M9vW4_Fah!9lNJ9O7qGf(mbp96NvEXu_PS;x#C$sMySnUWW zflX3<213AG@G7hP{jckMrBdMB;DV^;l^IKE+Owaq@5|4C2=nw8L}V?hj{#_7o* zJt%N|%TA}yhk3}7f7)FA>b!axHvrl3fsiAc-<;lZdE4+(nT#?Xq|ASwsc#`j6inJaHPGaf6rzT7gX6!@40uw`N3zgWQx#PZ_#rTc=$JHea#cG%63ZYB<{?>dqPjrvW;_Rw(Fq=I zoN7Bgddy+IUKwabudz;2w&NZWM{4SpOI^f4P(}5yNPDZQ)5sQ8NX2po`X~g|E6Cn8 zm>9p*G2M1?WabY8lCaCwy11~gp|-dRuRv0v@Hi(+(Y)~+5ngg61{TAzEi1`&;;xbZGSm9h96Zf3^~PF z>-A!s+9;I+!vQxdJYF~jLebx@AL_ptaTBliZSd2~V9rUDl{3-6XSVD68^O*3twXM0 zff`K5k6vgTeu;{UC9V&3J@|t@z50NWEF+|z#4AQ(HUEnm%-1*`CvBOTRGzuI{gXHm zk)-pgHXXCW>1oq zCzK;*zd=&coA^{%rkQiPv>{*voA4posk-vq55LoFx^Ay{e22fu4x9)ze40=lrHG11 zq;rEd8q5UcsjEhk-1eWpRoO%^n;d2rkxRAK9()zx=!l7!>Y*N%e0X2%Go^FzM$9Yk zqc;RsG_FaLQ}6d$4H=}0{O~%(iN{Z!zw7Ags6I(VNr}7K0CeGJauzKzseA~VIG?*y zSd_+9Z?5lb9L>}Ycx98`) zr(Uljzj{}w8hD+CWDVnmz+a*MJ7dg+loW$yTj_Dv#C+u`l4UiJd}IVTnjZkwXt#Nh z_>i^W{yXZ(A9KCckJE&E&AO-PCKN~6Z_Qq^vs@8gv{72>7CKJ( z^k=yYme7px`h+kj7!*EpUTl=xlXkigAVO4WiXNQIDv-pyI zD-YFBLSx5LpK6H?C&^L|!cp_dAYRHi=}M1H4Cqr&(wNP3RrOB3L?Be%4!A>k)2CNx ziiwp_Riq19z$K3Z3B`F1ziY@De|>gB`7K2I-GcaL^JL~&i{sDxY>9w(JKN?JOJuW9 z>61RGGZ!0N*M%uHyIgK&5R8}phKzc>*nWK6hN`d6&kFpNP?6MES-j}Rk{!F)^z>`q zxq9p4jTsx$;Y~)4D!iF!#$ZQA%getre3bm%;~2TI_hg=%VaA>E_TW2R;V%zQt?f*} zcn;Ti;TU>_??YnatHJf{HFs1$3C~?q_Ot)*tHQWW3lnlGxReJ9s7B{E-VL)XR?%rv-^>;&*N*@*{J$P8ILdpV+IpIz14C|&c<~9 zCs?z_r0MG8JEov|P%f&sO2(MNLI;?`6mfpLsmQ$|AAc$g%&Y6Sk>%>l zmqsEnQkSMBWP4T_Rj?supr(Dp$GNz>``Jn9*szo5K{UK}Xg^N`I zRdM1{!3X-49q_8$5Ay0<@N)Pt@|Tn4s?30l1x~;ufC9|43E(dDyd5*vK2i;5&2qpq zIPhjska#T;6&Pb?E0eS4YSfZ>+iJb<4Dw;SrTGgZuULd(i`_TiogLU~`X(B+`C1PT zn1bu9Z~`<6GKjfpbfBkrRWeww=j;1X+q05swtMg@w4dew0Jb~OC!;quh%{9>s?G|f zF=K8BbumwN@)4}c1oRadEU9Jyr^s-q+QmVAG6A4q^2VxvT(H@KMK<*TsE#q_$7XsnpkU0*rMUbQEZ+?IQRdyfF9jeORN{ zclUrf>G%}>{69W$>SDi)0iBO1vM_e(eUKUNu=qZuOxOHLof z|L1rs{_3;DYIpcQu7Vx*6FZtdOqgF&&}(%Q%)s(dfB9NQYgr!<8q}u8%HWc9S+F(_ zun>X1t`=|Fz!ED+nkXvZ9nQKoDmj~!c&rCovNN3{I#kR_ciI`NBTAMRBD>o( zq^Pi{QA2}?+Bbs8Qe%sFz(QNZo=B)4V5m^jzvls&A_yZ;{A;!E`|qSmdf7oNg&`u~e8lbm9VPJ%JyRZFJBQ>d7H%_FDxw0X^m2wH z(iikHCakQ=ekbEe#dz`F4xaevB3tt^%{WJ+UEzQwB*02T@_QI4LPC}R86JRUfHHjS zG=q77p1E5&Z@DM)Ltdr|O})^^Knf_$5JBwf^e}2Z@huXb99lS*FZVOQ9IcF?E?X{qLWa8l4J-31Y85Y#)io)=Mm)mgiyw#k0$|b2Iaw(BOKr8ru6f*D# z6N~){qNo`6OeT`9K1BK=R)_i0<56+|_NAr(m zGR0m}vMQ8$D!ucZ(>*8$VooQu<3G@gdK&wFMvPzQaiTAJ> zFRD;>L3L81{l5Oj1QFt|r>@7`XDI+<-(r=yT4JMJg9s1>;JaCn$w2K1{adzli?01dcW{z|$@s5Npk#ur0t z>U2pGY*3q5-Bw+g8wN>HHbVy;)24`jv9{cu1C|GD=}q6+(Rlw!n1{{hyB z^NZaG2ZqWYa-^7%NRs3zC0 z%=zr6{_}tP8_B6~>s@p-8gUe|7qaB{aWG=zxTfMqk( znT8)2?Mf@%q$g>sG8YnmD2WTN#gzfibGGX|xnR0-A>Y%#wn^!XqPmgqfhqtF3yEtP$<4vPo26)k+jYdOXO#%2AKg zWEOK!gA;Rs1#T=L{0)apNJ9p!ietd`{5)>khyU%o(flYc!{0Ae33XeeT(%6G04b$B z(6KAg?l0EUOE~$)|-fdlyFA>BT97;dn*r}S}fDDp<& zqoim>;K0M=a7yvyyyVN`@=PjdK}*{84w1x5Fuw<;a*AYWdWyom$@>8{GFU_g4GaGL%dM_x_tC-Ub!oEwW3PA6QwaFp`Y{nU|qD!t}TNh)Gv6A}YG7holfBizBn8VSn zt2j$RvNf+3%~VKz2+sGcmChXrzH>foJm+8x)XsevlU`CR-Xp*Ro_t8!*)f;gb4Za7 z7^0E>aF9R^i(^67#925W6E4)**8%PfdI*i(FZ-Kpy$i@V8_xM8sHul2Jd`0LS|LLL zW@Wbb4i*s~N4r*Ffcu6#&*rCigqUr>eSSeh!uQIPlcJ3WT4Q2=hnbO!&n?^^90Wso z66)NDm9S`Ovc*T;$BjP_8Nj70>S+citdxAubJPOIZAiY2a{C4Th)m98K8qxdT9b=8 z`p|`*oYy1a57nQq7y-Wi;RP$m(zV;Q6Ig_ISe9HY=Hd;V5uMafZ}e(-Fd6iziU~j# zQt7e5yb?z_(5q}gW3>h+ z%Rq&aKu8o8|L7&@+I~eE81yTQDZINc3Dp}3D)N8`UVafX%ov!<{67IM1JV4TjCN(3 zG2jR2<_8V%0%x`YbwFi`j)-2~2=bxq6`*SV{0DaT0H&s5#Mc3C29tjfbd4A8Tn7W9 z9qV}huwT;1e?R~@kfLc22Lw;>2yg>9klBrJ27)lV+OP;|8F_So037gTno0sV;HWWh zbYf6&0S~=6@bJ?0@GF1-1y3a_5b`Ro2RLwMWfRyfZ>2oY$O;hh8`%F4B7g&w3T-$* zU}_NXB+vi{Fau+_!m&Vlc|i37(dVP{bX z=ile2Z2?F92nApP3jc1H7y(X3SOg{ppJupp000PICJXU$+M@=pFo2O9ZIyQ(W6L{DqWPyw5ijlP@_tnO0}xht5~yY z-O9DA*RNp1iXBU~tl6_@)2dy|wyoQ@aO29IOSi7wyLj{J-OIPH-@kwZ3m#0ku;Igq z6DwZKxUu8MkRwZ;Ou4e<%a}83-pskP=g*)+iylq7wCU5RQ>$Lhy0z=quw%=fO}n=3 g+qiS<-p#wW@87_K3m;Crxbfr2lPh1&99$p(JE0$U!vFvP literal 0 HcmV?d00001 diff --git a/test/examples/booleans/contains/test/false/LineString/LineString/LineIsNotContainedByLine.geojson b/test/examples/booleans/contains/test/false/LineString/LineString/LineIsNotContainedByLine.geojson new file mode 100644 index 00000000..9ad941da --- /dev/null +++ b/test/examples/booleans/contains/test/false/LineString/LineString/LineIsNotContainedByLine.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 15.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/LineString/Polygon/LineIsNotContainedByPolygon.geojson b/test/examples/booleans/contains/test/false/LineString/Polygon/LineIsNotContainedByPolygon.geojson new file mode 100644 index 00000000..8e2caf0e --- /dev/null +++ b/test/examples/booleans/contains/test/false/LineString/Polygon/LineIsNotContainedByPolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 15.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/LineString/Polygon/LineIsNotContainedByPolygonBoundary.geojson b/test/examples/booleans/contains/test/false/LineString/Polygon/LineIsNotContainedByPolygonBoundary.geojson new file mode 100644 index 00000000..b5a0114a --- /dev/null +++ b/test/examples/booleans/contains/test/false/LineString/Polygon/LineIsNotContainedByPolygonBoundary.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 3.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/MultiPoint/LineString/MultiPointsIsNotContainedByLine.geojson b/test/examples/booleans/contains/test/false/MultiPoint/LineString/MultiPointsIsNotContainedByLine.geojson new file mode 100644 index 00000000..496c3bf6 --- /dev/null +++ b/test/examples/booleans/contains/test/false/MultiPoint/LineString/MultiPointsIsNotContainedByLine.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/MultiPoint/LineString/MultiPointsOnLineEndsIsNotContainedByLine.geojson b/test/examples/booleans/contains/test/false/MultiPoint/LineString/MultiPointsOnLineEndsIsNotContainedByLine.geojson new file mode 100644 index 00000000..88a1d75e --- /dev/null +++ b/test/examples/booleans/contains/test/false/MultiPoint/LineString/MultiPointsOnLineEndsIsNotContainedByLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/MultiPoint/MultiPoint/MultiPointIsNotContainedByMultiPoint.geojson b/test/examples/booleans/contains/test/false/MultiPoint/MultiPoint/MultiPointIsNotContainedByMultiPoint.geojson new file mode 100644 index 00000000..abe3550d --- /dev/null +++ b/test/examples/booleans/contains/test/false/MultiPoint/MultiPoint/MultiPointIsNotContainedByMultiPoint.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 1.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/MultiPoint/Polygon/MultiPointAllOnBoundaryIsNotContainedByPolygon.geojson b/test/examples/booleans/contains/test/false/MultiPoint/Polygon/MultiPointAllOnBoundaryIsNotContainedByPolygon.geojson new file mode 100644 index 00000000..f9f55a6b --- /dev/null +++ b/test/examples/booleans/contains/test/false/MultiPoint/Polygon/MultiPointAllOnBoundaryIsNotContainedByPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 10] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/MultiPoint/Polygon/MultiPointIsNotContainedByPolygon.geojson b/test/examples/booleans/contains/test/false/MultiPoint/Polygon/MultiPointIsNotContainedByPolygon.geojson new file mode 100644 index 00000000..b6cbb2b0 --- /dev/null +++ b/test/examples/booleans/contains/test/false/MultiPoint/Polygon/MultiPointIsNotContainedByPolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Point/LineString/PointIsNotContainedByLine.geojson b/test/examples/booleans/contains/test/false/Point/LineString/PointIsNotContainedByLine.geojson new file mode 100644 index 00000000..9342e2ee --- /dev/null +++ b/test/examples/booleans/contains/test/false/Point/LineString/PointIsNotContainedByLine.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 2] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Point/LineString/PointIsNotContainedByLineBecauseOnEnd.geojson b/test/examples/booleans/contains/test/false/Point/LineString/PointIsNotContainedByLineBecauseOnEnd.geojson new file mode 100644 index 00000000..ae3cd8ad --- /dev/null +++ b/test/examples/booleans/contains/test/false/Point/LineString/PointIsNotContainedByLineBecauseOnEnd.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 4] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Point/LineString/PointOnEndIsContainedByLinestring.geojson b/test/examples/booleans/contains/test/false/Point/LineString/PointOnEndIsContainedByLinestring.geojson new file mode 100644 index 00000000..39e7953d --- /dev/null +++ b/test/examples/booleans/contains/test/false/Point/LineString/PointOnEndIsContainedByLinestring.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Point/MultiPoint/PointIsNotContainedBYMultiPoint.geojson b/test/examples/booleans/contains/test/false/Point/MultiPoint/PointIsNotContainedBYMultiPoint.geojson new file mode 100644 index 00000000..e67d5e0a --- /dev/null +++ b/test/examples/booleans/contains/test/false/Point/MultiPoint/PointIsNotContainedBYMultiPoint.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 4] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Point/Polygon/PointIsNotContainedByPolygon.geojson b/test/examples/booleans/contains/test/false/Point/Polygon/PointIsNotContainedByPolygon.geojson new file mode 100644 index 00000000..09bb41c7 --- /dev/null +++ b/test/examples/booleans/contains/test/false/Point/Polygon/PointIsNotContainedByPolygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [14, 14] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Point/Polygon/PointOnPolygonBoundary.geojson b/test/examples/booleans/contains/test/false/Point/Polygon/PointOnPolygonBoundary.geojson new file mode 100644 index 00000000..685a46d3 --- /dev/null +++ b/test/examples/booleans/contains/test/false/Point/Polygon/PointOnPolygonBoundary.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Polygon/LineString/issue-#1201-false.geojson b/test/examples/booleans/contains/test/false/Polygon/LineString/issue-#1201-false.geojson new file mode 100644 index 00000000..d0b6f5fc --- /dev/null +++ b/test/examples/booleans/contains/test/false/Polygon/LineString/issue-#1201-false.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#0000ff", + "stroke-width": 6, + "stroke-opacity": 1, + "fill": "#0000ff", + "fill-opacity": 0.3 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [98.8769531, 35.3173663], + [83.144531, 14.349547], + [111.621093, 14.8598504], + [98.8769531, 35.3173663] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [111.621093, 14.8598504], + [98.8769531, 35.3173663] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Polygon/Polygon/Polygon-Polygon.geojson b/test/examples/booleans/contains/test/false/Polygon/Polygon/Polygon-Polygon.geojson new file mode 100644 index 00000000..505f22ed --- /dev/null +++ b/test/examples/booleans/contains/test/false/Polygon/Polygon/Polygon-Polygon.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 20], + [1, 3], + [1, 4], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/false/Polygon/Polygon/Polygon-Polygon2.geojson b/test/examples/booleans/contains/test/false/Polygon/Polygon/Polygon-Polygon2.geojson new file mode 100644 index 00000000..88fbf6d5 --- /dev/null +++ b/test/examples/booleans/contains/test/false/Polygon/Polygon/Polygon-Polygon2.geojson @@ -0,0 +1,47 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#ffa200", + "stroke-width": 2, + "stroke-opacity": 1, + "fill": "#d4c63b", + "fill-opacity": 0.5, + "description": "shape which was intersected with a longer pipe to produce the pipe shown" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [3.1249679625034332, 50.90354450528237], + [3.1252093613147736, 50.90354957970863], + [3.1252361834049225, 50.90334491073787], + [3.125006854534149, 50.903344064996546], + [3.1248298287391663, 50.90339988389688], + [3.1249679625034332, 50.90354450528237] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "description": "output of an intersect call with a longer pipe and the other feature in this file" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [3.124910769300162, 50.90341155120744], + [3.12484701356319, 50.90343165437331], + [3.124918293470778, 50.903431917293965], + [3.124982049176972, 50.90341181412811], + [3.124910769300162, 50.90341155120744] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/LineString/LineString/LineIsContainedByLine.geojson b/test/examples/booleans/contains/test/true/LineString/LineString/LineIsContainedByLine.geojson new file mode 100644 index 00000000..0e96a0fe --- /dev/null +++ b/test/examples/booleans/contains/test/true/LineString/LineString/LineIsContainedByLine.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 3.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/LineString/LineString/LinesExactlySame.geojson b/test/examples/booleans/contains/test/true/LineString/LineString/LinesExactlySame.geojson new file mode 100644 index 00000000..034737ba --- /dev/null +++ b/test/examples/booleans/contains/test/true/LineString/LineString/LinesExactlySame.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/LineString/Polygon/LineIsContainedByPolygon.geojson b/test/examples/booleans/contains/test/true/LineString/Polygon/LineIsContainedByPolygon.geojson new file mode 100644 index 00000000..fdbf01a4 --- /dev/null +++ b/test/examples/booleans/contains/test/true/LineString/Polygon/LineIsContainedByPolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [2, 3], + [2, 3.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/LineString/Polygon/LineIsContainedByPolygonWithNoInternalVertices.geojson b/test/examples/booleans/contains/test/true/LineString/Polygon/LineIsContainedByPolygonWithNoInternalVertices.geojson new file mode 100644 index 00000000..458c29ba --- /dev/null +++ b/test/examples/booleans/contains/test/true/LineString/Polygon/LineIsContainedByPolygonWithNoInternalVertices.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [10, 10] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/MultiPoint/LineString/MultipointsIsContainedByLine.geojson b/test/examples/booleans/contains/test/true/MultiPoint/LineString/MultipointsIsContainedByLine.geojson new file mode 100644 index 00000000..867d63a7 --- /dev/null +++ b/test/examples/booleans/contains/test/true/MultiPoint/LineString/MultipointsIsContainedByLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 1.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/MultiPoint/MultiPoint/MultiPointsContainedByMultiPoints.geojson b/test/examples/booleans/contains/test/true/MultiPoint/MultiPoint/MultiPointsContainedByMultiPoints.geojson new file mode 100644 index 00000000..007ec9df --- /dev/null +++ b/test/examples/booleans/contains/test/true/MultiPoint/MultiPoint/MultiPointsContainedByMultiPoints.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [15, 15] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/MultiPoint/MultiPoint/MultiPointsEqual.geojson b/test/examples/booleans/contains/test/true/MultiPoint/MultiPoint/MultiPointsEqual.geojson new file mode 100644 index 00000000..8a0585fe --- /dev/null +++ b/test/examples/booleans/contains/test/true/MultiPoint/MultiPoint/MultiPointsEqual.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/MultiPoint/Polygon/MultiPointIsContainedByPolygonBoundary.geojson b/test/examples/booleans/contains/test/true/MultiPoint/Polygon/MultiPointIsContainedByPolygonBoundary.geojson new file mode 100644 index 00000000..321c7587 --- /dev/null +++ b/test/examples/booleans/contains/test/true/MultiPoint/Polygon/MultiPointIsContainedByPolygonBoundary.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2, 2], + [4, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/Point/LineString/PointIsContainedByLine.geojson b/test/examples/booleans/contains/test/true/Point/LineString/PointIsContainedByLine.geojson new file mode 100644 index 00000000..cd6c19d0 --- /dev/null +++ b/test/examples/booleans/contains/test/true/Point/LineString/PointIsContainedByLine.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 2] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/Point/MultiPoint/PointIsContainedByMultiPoint.geojson b/test/examples/booleans/contains/test/true/Point/MultiPoint/PointIsContainedByMultiPoint.geojson new file mode 100644 index 00000000..ad874c8a --- /dev/null +++ b/test/examples/booleans/contains/test/true/Point/MultiPoint/PointIsContainedByMultiPoint.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/Point/Polygon/PointInsidePolygonBoundary.geojson b/test/examples/booleans/contains/test/true/Point/Polygon/PointInsidePolygonBoundary.geojson new file mode 100644 index 00000000..7914f4a2 --- /dev/null +++ b/test/examples/booleans/contains/test/true/Point/Polygon/PointInsidePolygonBoundary.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4, 4] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/Polygon/LineString/issue-#1201-true.geojson b/test/examples/booleans/contains/test/true/Polygon/LineString/issue-#1201-true.geojson new file mode 100644 index 00000000..6c5dad23 --- /dev/null +++ b/test/examples/booleans/contains/test/true/Polygon/LineString/issue-#1201-true.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#0000ff", + "stroke-width": 6, + "stroke-opacity": 1, + "fill": "#0000ff", + "fill-opacity": 0.3 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [98.8769531, 35.3173663], + [83.144531, 14.349547], + [111.621093, 14.8598504], + [98.8769531, 35.3173663] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [111.621093, 14.8598504], + [98.8769531, 30.3173663] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/Polygon/Polygon/PolygonExactSameShape.geojson b/test/examples/booleans/contains/test/true/Polygon/Polygon/PolygonExactSameShape.geojson new file mode 100644 index 00000000..8bfd83da --- /dev/null +++ b/test/examples/booleans/contains/test/true/Polygon/Polygon/PolygonExactSameShape.geojson @@ -0,0 +1,41 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#F00" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-12.65625, 36.87962060502676], + [35.419921875, 36.38591277287651], + [37.79296875, 56.897003921272606], + [-12.12890625, 57.040729838360875], + [-12.65625, 36.87962060502676] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#F00" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-12.65625, 36.87962060502676], + [35.419921875, 36.38591277287651], + [37.79296875, 56.897003921272606], + [-12.12890625, 57.040729838360875], + [-12.65625, 36.87962060502676] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/contains/test/true/Polygon/Polygon/PolygonIsContainedByPolygon.geojson b/test/examples/booleans/contains/test/true/Polygon/Polygon/PolygonIsContainedByPolygon.geojson new file mode 100644 index 00000000..afc9190b --- /dev/null +++ b/test/examples/booleans/contains/test/true/Polygon/Polygon/PolygonIsContainedByPolygon.geojson @@ -0,0 +1,36 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [2, 2], + [3, 2], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/false/LineString/LineString/LineDoesNotCrossButTouches.geojson b/test/examples/booleans/crosses/false/LineString/LineString/LineDoesNotCrossButTouches.geojson new file mode 100644 index 00000000..71399ad5 --- /dev/null +++ b/test/examples/booleans/crosses/false/LineString/LineString/LineDoesNotCrossButTouches.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-2, 2], + [1, 1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/false/LineString/LineString/LineDoesNotCrossLine.geojson b/test/examples/booleans/crosses/false/LineString/LineString/LineDoesNotCrossLine.geojson new file mode 100644 index 00000000..9b16e576 --- /dev/null +++ b/test/examples/booleans/crosses/false/LineString/LineString/LineDoesNotCrossLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-2, 2], + [-4, 2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/false/LineString/Polygon/LineDoesNotCrossPolygon.geojson b/test/examples/booleans/crosses/false/LineString/Polygon/LineDoesNotCrossPolygon.geojson new file mode 100644 index 00000000..66682b0d --- /dev/null +++ b/test/examples/booleans/crosses/false/LineString/Polygon/LineDoesNotCrossPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-2, 2], + [-4, 2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/false/MultiPoint/LineString/MultiPointNotCrossLine.geojson b/test/examples/booleans/crosses/false/MultiPoint/LineString/MultiPointNotCrossLine.geojson new file mode 100644 index 00000000..63d1b79d --- /dev/null +++ b/test/examples/booleans/crosses/false/MultiPoint/LineString/MultiPointNotCrossLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2, 2], + [1, -1.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/false/MultiPoint/LineString/MultiPointNotCrossLineEnd.geojson b/test/examples/booleans/crosses/false/MultiPoint/LineString/MultiPointNotCrossLineEnd.geojson new file mode 100644 index 00000000..2ba9a67d --- /dev/null +++ b/test/examples/booleans/crosses/false/MultiPoint/LineString/MultiPointNotCrossLineEnd.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/false/MultiPoint/Polygon/MultiPointNotCrossPolygon.geojson b/test/examples/booleans/crosses/false/MultiPoint/Polygon/MultiPointNotCrossPolygon.geojson new file mode 100644 index 00000000..8a5f8ad9 --- /dev/null +++ b/test/examples/booleans/crosses/false/MultiPoint/Polygon/MultiPointNotCrossPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [3, 3], + [4, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0, 2], + [2, 2], + [2, 0], + [0, 0], + [0, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/true/LineString/LineString/LineCrossesLine.geojson b/test/examples/booleans/crosses/true/LineString/LineString/LineCrossesLine.geojson new file mode 100644 index 00000000..f6b91e23 --- /dev/null +++ b/test/examples/booleans/crosses/true/LineString/LineString/LineCrossesLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-2, 2], + [4, 2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/true/LineString/Polygon/LineCrossesPolygon.geojson b/test/examples/booleans/crosses/true/LineString/Polygon/LineCrossesPolygon.geojson new file mode 100644 index 00000000..356e33cc --- /dev/null +++ b/test/examples/booleans/crosses/true/LineString/Polygon/LineCrossesPolygon.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/true/LineString/Polygon/LineCrossesPolygonPartial.geojson b/test/examples/booleans/crosses/true/LineString/Polygon/LineCrossesPolygonPartial.geojson new file mode 100644 index 00000000..fcb8e161 --- /dev/null +++ b/test/examples/booleans/crosses/true/LineString/Polygon/LineCrossesPolygonPartial.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0.5, 2.5], + [1, 1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/true/MultiPoint/LineString/MultiPointsCrossLine.geojson b/test/examples/booleans/crosses/true/MultiPoint/LineString/MultiPointsCrossLine.geojson new file mode 100644 index 00000000..c5819920 --- /dev/null +++ b/test/examples/booleans/crosses/true/MultiPoint/LineString/MultiPointsCrossLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 2], + [12, 12] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/crosses/true/MultiPoint/Polygon/MultiPointsCrossPolygon.geojson b/test/examples/booleans/crosses/true/MultiPoint/Polygon/MultiPointsCrossPolygon.geojson new file mode 100644 index 00000000..8f13864e --- /dev/null +++ b/test/examples/booleans/crosses/true/MultiPoint/Polygon/MultiPointsCrossPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [3, 3], + [1, 1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0, 2], + [2, 2], + [2, 0], + [0, 0], + [0, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/.DS_Store b/test/examples/booleans/disjoint/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..78e31eefeed8c83fcf32505a6b971d4312727966 GIT binary patch literal 6148 zcmeHK!Ab)$5S`SjDI)Zs;4$E}Xp4viFKg9LZhaa-3!n@+bRdJA)_EfC?Wee~pFO#_ z_wXr+v%Fsa5T%9k;?lBQmMikwzt?>~5At5t3c8onJJUJ|M|KdN$DMw=x^}43Jc!dy z*CfPI2Sctd;xy9zmhPodW^#QyAS<%cu5Jtl&Ar{4+G`AJYS7%>si{W2-W(1qa(#1q z|Fr#(Jf`}^%nStn$3|8ij^GuI@w}h?Zkp)y4t=BeQ5+*Pzzi@0e}MtFcgdB%@Ui@j z%m6bmR|aT*P^g5S!@{E3I3Ds{XhQs{y&|>J!XIz_*V>w z@{xbk!YR4hIx{({wF>nHm4xC7i{lhDOew}#D#aV9M$oUwK=d3I7SV&k2LVF^H_X6X G8TbOms$y{f literal 0 HcmV?d00001 diff --git a/test/examples/booleans/disjoint/diagrams/esri-disjoint.gif b/test/examples/booleans/disjoint/diagrams/esri-disjoint.gif new file mode 100644 index 0000000000000000000000000000000000000000..fef0a5f7286f8788e59d9ff0c91b011583a58e14 GIT binary patch literal 31587 zcmZU)XH*kk+;BTHDU*Z%p?3(qLqMb{8j6638c`9%5;_WMK#(pW^d5Q@11KWRfT)0? zp-8jEPE!Lm?4gJV{LP!^xgXwp*Zq=}PnngKncvCTdmopb&ek@*03;550)Vkh-5)=G zEPi|*8yh=6Ki^t>YWcEBKtMoUUERlzAJ^8_9(88(c)aIX3JdLShYlTj`}XahKYu1C zCl|(YH!8pzd3#^Je7Ul+aP!{LmLjTIFY z-MxGFYF*jl;$lut&Wn~)a&mGDy}>tb+*m4xy1Tpie13a-`^P*?XJ_ZtrY7z{D}%v! zUa{@>1*N~G;6@#=FxCBwH@f`oEx$h=i^VR!YW-9!`;&?M{H*I;sc!gAk-wFgd)c;A zmpnd<*Dw8=fBUST=>;xuSuY>n<J@R@9SzxelIU@ zE+;%08)$62{ATLqn{2U_mF0)ScL#5?mluD2`}VD`z2errZC}XT-d=SUjOIW$@gz3rl+SX z3e#Udd%%4(HaIwV`}S=B00fnQKp;^6ixj>G0HgnX75*jwETAVbQc}~>GcvQXb8_?Y z3z&sP#U-U>!|M2nC=lL&RzkUDl^A~?% zacTMY%AeK0YwH{T{SyEPoU$vM)t`cqGB`5It{coCXu8$7cGTa`k>7N3X0)SWq=4v{ zt-Q1I(pa(H{^lcNotGb!lhoS12OIMk)z&gyzMD2R?oGEi<=o91PR(i1nK_clD*pWB z3Nm+9S+t<4T%2yemr;Tz#vbfv~UuOo_^ ziF70utVloDQvS5cQljig>4OPz3DpDcB<&-so|D&4akDQt?N1g#DtKHPC29f_7fKA3 zY?b@r!eREAOm$+^lR5b!yQ)v0?{ciCl8|#w@-8BCGPpp0X`q`HmrcGW)`pj^cMtz!E@TR8$ zp2>)F(G}2veXr%E4PML+oEX&im_ZXquhgIkbkLI#*HK5uimkk^AjD}=2hNqxpWBZl z4a7*Dd?V9IRPn5IEkEjOqfswn7gBKq=ij79&10}7k_BSdDktPcL;!hvrLu&KRPn7% zECyohDlmd}f9mxNP-#??4#+1W-^$GbQ&6w++nsax#EQ9tWL%$wo~z*@u)#a zmcZ^WEaLyZA46ZW2PM#a0zF_wUvCagLuHqW?!4svMI-D8;H*p=R%eu)bC7dR70VW5}dlwxiU5J4U}851aN-TwK_ULPYq*O zbNGt8$jwi5#K+1j3~>{>jlAyt9s;txs*{!m2d-A>`L&~PI|#KpK9!kU$c3Sv9uFz$ zA`)HEnMEcfu0x33GD#8AqLD~BqEWA^1mO2=C&^+T=YAW8YfkM8YWGQ<1ra7hH|2Z( zPM&nk$WX+;^gW`ta>i57l~*^;G2o#=$xLoP5T472)HG&%^`2m(hSPB0$5Fm#RYN^O z6`UJE-2Xd=Z~Z6*<3Z2**8x{GVbhIYW??l#fknN1R z;~2Gv&==~!U(-wzFEMeF08-?6a=m)WTt{pdg%VaT^`eHWwtec|y;LTw`5(bc!@Pfn zOF#n&Ofw^ZF6F!miZo@OEesh%e`ODR1!n2UZlIJZ4;Z_uNBVRRz^&zugG5)2zU#^$ zV#UE-S{I5CIV>_jN!AGS6%hrWrGzm?E!OLVZYcYbA*OOej_{TPYStOXE4dz3@O*9i z+Mb2yZF+4Z_jC*NVK!GV#ZXwGa}x7HDvlAL_swTh&{Q5uU4HPB&XmM1zvUoNVw3&T zmu;e9;`n!(fIP(QIJ=K=nDgMJD2{1t8|z{E7YiV)2@E|B9R>D*B2-GMgL7-x13^HL z$;;SH=X5rKFP5FWk0EP1aXQA|9%#d<)F(>P{rEx)zd+lw;N=LaxM8M)gd%?gEnNp; znEf~h4p@=+wK!9gjyl$S)!03`p%IU&C7os21yT+~uhI$7niddHhnkY~-@flzrKsLZ zNQ2mqJ4Q?~3b03;dVyFcDv16N+9mtt4ce^IP?m6`_!QnbxFjUm?gfCUxj!ySrGN%* ztZn@&4;Wvo0E`z8ug3pmHE5H*MT_TU=Yd@xrlfq>_N9$k{LM^9o^GD&EAHE5kDvmn zYXh8X2MI*>=aUSaWADo4fZbMI?ymW{OE7}83Q@qSxpkFm9*po^q;gmXjgMna}N z7RQ-22MQKL4%ksXcgM8gA#(b%)a+60;spUO)1qB1XD+ zcTV6N|5@ZrGGg+hqlhOL+LlU2zWG>fv))3L9-N1iVh++0R*Sktmk`F?4iW&DZjNAK zP@@A+ohT3V_u1^zJHIbCXvjmWQ63-Ior1FFfZ{YNUXsp9)<5|9x`N)O%B!t==bOjv z*o&oXWVpx*2fQp{)N;}5Aab5qduBHW)*+QwaLVjngqwnat~dVZL{&Lxei^#5O9f%X zOBRnjdwVWH<>fIW+}$HoNdA4n@Bz-ri;|zWNU*PB%LFQ4uZ#VCS!SNE)U8W}wn*2j zC~an*Dbbt=yKE9&c(DFlMR6lbW@=ssdA#Tc1K=&kZ~5`1XIFn!oJ|(ydib7F!t(dX zhWLZSV1C(!|AN?)sbcv74@L9IN>=OZv(wum>(g3s66*GG$wiE33HXKlLz>&AymWEn z&b|fJ%CZ|j|EOo54Tt`5vJKZ3#)8k|LLndQcRzcR|VT;EM1 z8a4b!)L?L`Eu6IWj%|pmPY1H7Y$&Gh)F(MFdu3H}ikTi2fUU{OVtl%o^qiPQ=6_%a zEyJ;u2Pj)3&oyW=KrNz3hZ@NBRLhv$P8G*)b^NYIql?jJ2`&Y6bra6h9QG%q&ua=k zckSFpi0#%CTqK#vL zM4BATgf7+76UmC=EO4wp$&^V};leBB>ftmHs4#%pbgKnebrsfNLgIwj=m=XC!uiDo z=rO`QgSF!T+uCXnlIIEb7{o+`l9MF)a6A*#+S|u%e4mVS$E3j3N_?rl@1Mus0t@vgiadpi2V~G;|UT z3J21>y%Gb-2*p)MHrY~=9lK~x->;jJPS_jG@u`YH$guW~XgWKLpvAecI0-6@jQQaL zWw2qf(cnsJv@RFMO&|;t#Xxu_Xh#D(Fv$q+d3`E6t-_0^t7b<=P@SSOKP&v$f9y^PYWcdr<6t>}0FvyO z;Ql7SSw8!?o?;>mKr-_sh~O_5gdNc$kqcrgAPG`Z5=r=lVOau0^eo`dO4kR#3?@nu z1Bos{rd-&)8RK!*vzyu{up7*fy@lY+HUx2D(GM{}u`Xr%+29m3FP z9j!z73=dzHjE$? z;KrEg{B#8pfFK~^C*VDQVPaNcz$zR_Nagg>T!b%A1Dh1 z`8fwAMFyehKoHGUmPC3Y6=@C>9>+l6^fLWUVAQy9I3YHSmv+1fY@EoxQjyM=11ha6 z!`Pq&KmSVzcya>KfhTl93`w|3F_SoGe>#BW!yrG{pM*|K2UG!fH4?P* z5A07(l;sLQ-6_bNe^E^l+PMg-kRWqfJ%bH-Q=ueowPA0)1|8V$ijm_&noN}LIBd=W z)QN~NDr8Pd3noE<-kFw#6zh+6RCeTr!H@|jtDEPn-YtVl*ey4^&d=*W7Bncv4RN9Z z7ev2uehtidW$ZLd_Gyf;EV6r^z8mq1B1wbU{&LhS=d!87JN9HCSvPVV6BBgRU{Tt{ zAvnD^V)M(>zgFzFM#&B9Ty1v4Z3MZ5TS|Mc7a}^LD$W+46i%ca%ZaL?pg~+ zv30<%*zm$7`+J!y56oK%BBBuNlJ9Z zJZPe`L(qQ}5sE-lIv>&m+A(~ata&LaNe9fC3pXq(Nc) zYe+6eu$GfX0Ey$*6eU2$D)8C05JP~aD?peI7=(a|nD}~ih`|BOZ$k<+v=Tpupq;`0 zT%y43AS%FTBoWRnS>d$Q!oNC-G!V&DR%8Lu^hu$HsydgbaVIAUmB1+VRS+cqxW+k`RQ;3jAXVq#gwV z0z=RW=Ku~Tl1xQF3!uZxusekeESEzd8LAKOQ6%SSGCPY6nG2bnN;HVPB|WYJRaXeI znr;!uiA!=Ym08NP>6W#>9$wUwK#Tbpi^*4FYqHbt|LMLI0V&8sQn5)Z89DlF2m?Uz zWCL~#pD_-*%zMqB#FJhr01%Qn>eq=tqPZCe8NCD-gOf$I*11FVJJKV z5?#HNMy%Yn1rp~8t}76r^;OtQ1oZkgpwB~(gg{qX2ESB5+rBcr={IEg=Os9xv;z3+ z4@cG)(q&i4k z%VH@Qtq9y{R$zw3^oq&@_PIA0^ny^#MPqh>8$Jg|LQCtXha26Oo*h`o1Q5)8SA)#d z5RB70kje%hW?q?@WWVOzR>>=yQagTz%U}3kH56IXE4B)W`4=eiKnZKQ$kiw$ zGfSPB<YQA$O@QF@0Fm&3!GjLyS1D2Q+P ze_o9RAmnuqPtkYPfV=VOIJ&Zq;UmdeG=a27po=+Q7egTKl01P_vymA)yCj(dK+WNg2VJzF}e(BrGf%GC(>Jw|=@#>OGhT(s%Nk&|^m zpEvrP0}#z>!?Mx8L)y<7UKbxZQ~KN4)eppQLFyauSUfI_(BNwa^#@}sgtIfW1qfC) zGY__|)4km+xwS;9nJ#bBpGlR1ROq+*rW9t)z|=>GG&>OD3Xn89(v^zZ6@Iq&Fi~36 z>SAzIhCTY>pu990q)>s+_7ix0^vku|lM9z0WI#E>%C8ur3@Lk{Og1l*;w&~k#)IEQuImTNDPN}l{kTy&N z#Gbfir`h=5jKEUkiN%|52i~B0z8}bBLPsXt_k0)QtqtM^Y_r2T3 zMC?>=v3l(&wP#kXPU`?|R^jekQ0J^jzN(rDpng{{V;wxFEMcJkc+U3jo&pFpl=s$v ziTJv&3ECr8UfAMV`ys?v*8S~=-L(-ElgU9v10-v1%lVIj&dK&uz%JsM9sfivt)#tV zTLSic3fwUje&Lh3$LX-gpWNC*PGr3I%>Nkq&(w(p(f)jV!!~f`AjEi+bk%vr&&k6c z^Xcd34|gK_I_7iV&O>zMPH?s(Zra`IY+Vs>_SomDpIXvf{cVk(r>JIIiEnD|PBxzZ z+VoFvpzmwz+pj*`=4lU{kB?%%ycZDe6zkFpQ!xk7u{@M79aOdq0@x@L_1Nlp-rL9f ztPlL6YyJ>PO3|ZaJ^6Q14noWI!3pfct)(a#H$Dmg0?-KTy-6wY87nGTB~5&#cCl_h z;;YNq*6`hvLtrowx+x2}-Gt2eP!RX9HyuE}bI}$Yu%aRK#Fqy4BeeKOcgNqFy=2jMi%aak z7u0M$h*6`1zjc#|L4^v|;enz7Yd_Q1+-}>pybI3ywYDpLCGW`!bMHEt#`oTN9tJ|qh_O7%E*4om5gA`Ddw!Y^XP=mw}K#8!V z{|~Uu4-Lb~8AzZ1e*s&Eqxh7x;{OY5vqHPW!cLvS-Ib7#Q#!3<0)kW|5*vsY5TYd| zW&M>^HPqs@jLr6mT3zPVO8a;xC)mX|2zGc3cVK)BO%91G?UR z-xZ3#LgV*br=8@v4F$nZ#JP{8vq#^G!3V!s0-W9(-(HE{9If45Z7EKKtM0k8x@8xR4mQ~A?Y`6*iNACj-{1->7;p1(jgo9%NLg7)P<@wy2BoNJ(~f?u z4mCj2mN@Eg?{4Cn{NlHF_wJF?1b`=Jz-2Ra_GREZ?IzxFz8-M^p%}uaqjbD1nP&@1 zHiP~@!=I7C!-Yf!5{sl(MvL6Mo(}0KlivmtXFzA#W$(ou@p&NEUe>gg17pc(eJwSo zo74}5uI;PBbi8-iLZS4gnL1p$e$ds+_MsuNF2NTslO2K6mkxQAp)n-gw2lLNm2?Cr&;%m&(QA}rpFBUIo)GwFI z<9PiF8b?xgV~m~peYQ!jI@6UfU$1^`?qn$pUbG_u=;m1SfSt&vH+ps=yes=NFw>9L zWXoD_4tz!=t$++nT$`U>eU$!M3lguzdU#{vSP8HxF!Ed5Eqtm-|E6a(v-jy6m}C?p zrQPHEZGKP_86ax4*au!6PSeo|yScO9zc7v0uY#S4^}W;P%o}J)QsuN71b9a@#b+0h zNFZ3jPIgj0d#9f?R6$%E)w)exG#k|dK-j?@78BX)3Z#>VG{UYomz98@a)>l0nPR1V zDA36A{iD%V(TyWE2YpJ9|flXmx=P*J9Z<(xz!)VsOWa((W3$OQj+|qjY?j+ zA`yP93wxZzCAYb3I$?;g(4xWUnh|pe>R$hUFOzW*d+FcjpP?|sWHtAzBE3s>vN@gg zkQ*795RAUT*%1(zlv0F-}y(uq#^r2&M4@$DXmJ2Lv3J zhkBke5(!?wU$M5hj3*;UUy9{g6^-Et~BGy7Kxp+B958hse~d>lAU# zN_C6PJ2b>|Ib20eSBGPiNczqTs@xmm>NWn9^nlBxLkuZ7p&@xn^i$42sgR$cVpPbA zfn}DhzT03`0adDM(_ab6wp2R8ZBUy!McIOV!P7J%r<8sTespfQ-sm(N1Fp=MHBP38 ztUedw)M#t$#+mSz$j_VO)#;~xB4XYmbZhU7gFU#h+OJvR895+mYZi62({*`Nv~pU4YED%$vf-&ik#ey zbbL{-c%!LtSM!%h@aCtI`>@duu65_L?bQFS73lsral*uxl1MyYUSd}0o-uHD3k$g7 z(0!P611E2xeZ`-a7dlen__}whv_0@a%drP#PBQq%cIsChIFTW2dgn`t=;!wTS{Gm1 zg}JnP+X*rq73hpihQ^hzsc(GO89H#x%5|2gamYbV%CoAKuBP3mP9(BYUiGfrVCNaD zAbIIiRYdsco1IF9vPL%TrEMP4M~*6nCJPp5Mq)B4@B`gcyV36uX{ObS)+vSa`qMk{ zsQp}<2ug`Odz&YEEoLMXfk-&l(Peamvz6&qCGXjb-$z%9;lI8>c-`%iCJKY%^Lt2^Z0c- zCP#ZW)s>wszEMZWo4=^M*-XpR$@kU5hr3FuId(I^T;j$bE2ywzpU15^jp>iO8IOE- z3JMHA;FGTnZ1n}xRdU{qGF<$`*x8xMN9J_I15=#EHtoF$)HkC=T9j4!ikvG)-guOb z+sNh|*>?D-MDfIfIp1B zrVgCndvERalk>}GKs3ML-p1#>NvnwdmDMNrPJcS}sik*jUBM5lL*5ZjiV9sm`sqI6 zp_PxKrc|6&;#XfRjh47ZIVsPUIjZjY3q`+1-a`dIRW>}$)zY$d-W#E&SHW1>2Wiv6 zgFFUlm0>QQV&Mhspq#g^ND=IVf|!mHuOpSc#8IATe>PB2P8|tGSn|Aa^Rcc#qSB5y z$KM3iLvriIA*8gk_VOapo9NLbbTA+E(@Qt)fGef7oQl#Cq zfr&0BIN@n(~=dpMs>8d(DE^iHCl`JA{oaDSFqW)S;%3aLdwT*o3NmnWd$rYK6Jm`lM&fA5P^-s z)1U-4Mu!7P2&pC)ROLY`Bml#MlITFPO@##!ktIa$d?=F$SrEZO09`!^BB>ZE6ZlyV z2qAi{P526lF3Cr_>6bT<1)vPA0I)w7lSK$*fo1+SK_sYjsYZcQmC35nr`QmwU^W}} z>%^EdA!RTd{VirO{K!r2_NRg0dD5U*_y*MT&Q%ZJ_(x90a>ydf(OMD5km57NU6k=peZXzha1o@Cjf}9XHkl{loDUt z$wZMUG0`}{jBAW%i)nCSn1dk#5S9k2^Xjmai*{U4L#RDSXd+YAjs==gOoeb#fdZ9odw9zfCsUFi6pE>bC=_Sac6<^^|F7x(YG9J z66wI$37fd*6$kXqkTlqf4Q%EDB(~D4gDhl5@;}+qC^wPQOoxy92<=x_l6o=Y3hK=U zP>lp6#|MZcNS_8tG9d*3EouOHa}h%CpfB7lFu|9T2nBL|691|pv6&o)x!4PjcEZuz zT4ml9NnW!i4ftCH{;_FL;x&g81<>D0;MNlKEe_c4kEXJ~L=JH5X7wFc$c%`<@Q^aJ z^P;pQ;U;`U?~KdR?n8&#;AA|=hIPp{@5b74Sv3kwP@Dki2!#|C!~b&eYwv{x1IX$t zc+-{+G66%5!k=f?68YD%NzIug_NJ52DPltc%Sa-ky<`ZspxT&_8cvfM#=<)g0EB0Q ziu4wJV&{I%PE8S~5nFV{3&@bCC1e2y`Dy?`$wcJ(3p8>M|EzaRx#ctt!Gug%_~VOU z5+6K|Ya$Y*bw~|rOh8PjVb^+{(1q=pMi>&ilBn(RfQ<8ls>bFU+nTSv*8oqG*sJ3% z=2dJ2K>(`K0R;duWa6*70h_Y#=yPS|svRWBrtIckJWn@nOXrw`Q#2KPNfT8k3m-hl zJ%VA}-Ps|GM3k-@AIu7-?P4nRw6bBMQqvD_zpClBY<^SE3CvU_G`x` zL4>O%>yQXuNWG`RYN0)hk)Z2<)WoM(d$=L1Fo7`+1(;Up<b(zg8$Rh)#{SkT zDyloLbZnK@0n)34kc2|9surtc+Vf04Z2TeA{>wQwBtH1K-NY-{A{HMvgog&waw>K767KJ#8I)`LOfH zYhVYRTbz7cX_TvXVQkU;=>TU;?gxJDPM_8HCxRM=IUkyo@H|}cZ0peo$x{#a6uLZM z0-IW&Vgu62_32uyo!<`zioAJF=`#owj!%V(J$Ttrr(lM~oK^ zZ?M4j;lV9qZ6c5vWh#_k5loe};0yg1AH1;%3a6qs2R5?wAxZDa@wOf17j7g`x)ceJ zMvbg4ttlkTrlc6Gegi9#0ShL0OY>q9tHxXOsyK1;f~I;Bt=E{>e6p}9v9rd42Cur= zJXn13;KIA1ezb}~U7TY@hX$yjj5u%-nrV9=R)rD@)g<7p)%d;NlCUhdR+82b&bwG& z4N(F0{c%8QO%raLaIiUOQoB^C%_{VFYkhOtFX|*0feRX_;pe4UvRIh3x(jap#!fyl2vh4wd=9>Qg>m%5X1Q|S@J91k3Q66yP zpr1x=&;DW*DqrwEi4P@mQxeIL3IGwfb>i6uNt7lFKAf`#{2K$tDrJ2q5Eg7SKMQ!Q zP^k;de|-aG^?p41c3%G}`brLvNq`F6Y{F@9aC>bKkEO+VLuA!ntU_f{+R+cK{+$3r zNt+cZ=rCrpp%CpnzGwZj>FZyE!$0S{RZT;MY=+*GrU3@cfJ#&-oQP;M_@c`FX2KqF z^!Y4KgtFM6CT+MCTh%dHcmBe(1p&_ZIYOWgYmzh5{=)t=K%Fz+Q~NV=5YSMre69qm z^VsUFpUbs0Gh1N&FTABiHty)Jf5%QpkRE1o(I)htg7bXLMLzBxAODUoCg2m)1PhYe z7o?9b$R;hwUtCbUw~)6~jDE5}eCI35C|V?ysHrXLJ;@Is!$M-ejlW1T1vC+9V%C=0 zzYgfD?cAv@@6^L8BLe5yM>+DjVkFSm6fmJer`cxgOVP&%mvk>I_5SqSy+D4n@5;Mk z1dnxe)MZ(Ug|Oiwg>Y7RQ=A9px9;A_E#kiqd&mZ{I8V-R%}pscTtpf0PENl3y{jp~ zdApDQljY5(iTg97#05Lg$fO;*N3=*cdf(p^Fn3JE%|AMcYMXrY?Tu6ec5LnIOby4C zWYffui!1w2=v7~kRp5hY&DWI@pvsztJ{P)ruIBruzqigEeS<=cyBuyu31FfBI8H?= zaZo|;igZlZd_u%Wcd6Qu0I?5`gf}i8=oHUYT9Y{cC& zsDWS0e}XnLb$9Gv((UxCdFP8=t}=RhHGE$Dc$Xupr!;=5;BT)u#>N)f;wmSBI~5k1 z^#4n2^TKeF#KcRNFDXcZa=6^u_UbSRf?{K%xRAiMUi;s~w&Ijr6y^N?O>DW+&ncGZ zUC`;woc{kwZ2LPB^lw}ys$qNEX76->DxVVdRh022w|@u|+p1GaQDII>!o=2|fo61j z-EX@nOl+-0mq>2M(#8J>G}u{9UoND=H{yn7Q$kfniuICigiG;R!p634vZ=wXf4Ic@ zY`PL!C;!eiT_-YzwePbQ#bi9U4%FCz6V>!gV3Ikzw>5ZOxAfq6P#<2S9(9u_=A=2F zJN&%)f`t)~fwy!29m5`Q9Iih3T5keCGcpK<$L@r51mh9)r?~A$H<+Oh*i6kWx0C0@ zDh_5Vgbph{Kq15sRgHkX=CG>B*Y>-I2dhM@E!i^0cGL0DW?>a1gedrPfM(%Dx56#uSKD~N* z4!s{eaA6Bx5-BgJ?e0zbFmCpFhE9D$NISZk`{y0w?L@lIIps|D2&~}+fbyRGuXo0N z#&S{+=m}~bLQ2>f8)WNYuo?3`1WpcEL9frozjDPMdLYsC{tz0sLpskA-J`Cz^isE9 zg)o0*cTz3;RXTLsn)=Y(X@X>*I}J=`7XRGA)7BU|p&!7^-`(@R60NY>ui`Yj`BQZt zyE{3DN|$(_>t{O`fZT-{#Y>2lbP&R8x;|BfwtmFwrU)pr9C0H6M501GZM~&KZ}!YL zwoJa#j;B8Ul%2ARU`9Y$mh3A|uelkwvz~1*Tr7L^Ncav=M!GH(ac6+=MYQZ^lTP)H zo|9oZf^^lY`I9UR^`yO+a{6S)i*~QK#XkcLzv@bK3rkgvR4#)WG)mfm)uvK7y*;x1 zp$H!~2V(aRTeLR5{4`x~%+;F472SkU1dG>tl2?g*Kuig3WaP~|GYGj6Y%7zlhBpg0)x$5DWh;Do3@WN+~ z=;%?`rYmyYfHQ=j(EXp@m4t>>Ym&oQHk1HRY^fY_3L^7H7eqQ74V4*ppI zU#VQ@aNkAMW@VAJMr|V$>;`A zii`&G^UrNs9T;j*)#j3}rS*SrZVv2C+)AD7ietR2qZYT#DTv4FSS#mp*xg8rpW#o7 zr{! zzpPc>zS9C%0Qb`}&GaY1bJVsXK47rQaX8o%DR2MFtq?5wpppI|b~pG2am%Z8WHZu; zRc=D<29UGfzOxN#pm(}>*fVL3)#FM=e|voiJWQjZE5egMfIR3I(-3wv{BQ#xmq0}& zu*vZrLl4~fAH*=${x~r{{R_7vB}CDNu$oNWQ>+D6~sJK zR%gF4X&Jj79a4veeL?irtBz6G&v4LavUmbBMJ0?{RVq00wAd9W-?mJ*z;e-btKM0U z^#aAcS^d}m0)p?_k~j+8M}=^2*JW`+zFZoro%!OVFj{O7sRhV{7DAF<Kj>2$0UgZ%v>T{>1eA{k0jlE#{Q%%ll*rm`9fxyaTHv2ofWV z0?z_Oe{270N>SeJ`a7Kb3ULRoYCB=NBj2tmAQ70o$9)uBM=U z&{!u-s1~LleoR$|K1AIa^ctwGQ%C7wzHgQT2IW=RI|(&(;L zZ5Wg+F!w^lEDykg)pyF$AsdSU%~%L|9L$Gdw`l7H1YQ*l-sX&L<~iB>6)GqY@ z;yitS$DOFZMZcdm^~34)5*qy%P896ooL7KOe?0T$uAAZ9mCfS@Vn=!Rea-G>M;$%C zlq5(=m*Q^(q*hC8VaCaL9IVjIjn;TAQT4$)p zfB_gO2j<@LeW}NFkNRFA#`!{6D!7@K{t!T-fMezRVzvxBpL&s1JCR9|7i8C4XWI|E zdr~uelQT>SkUuwV@1kt@Q-mTDwYe^fu`24XhhBS)HzJ^dW5Dc~kQ1-06=ihHU&<1Q zP_dq98D>XnSvoh(w`Eh_3$MK6MeY+7c~jkapJ&m+R{!cIL>6>#) zPi&+V>E=Zs(NOo~b5BL93d>?4WfSK@L1l4c3tnn8)ZGERGzSvpJ0-nHO0FsD%y1T zrad}PUP_vH@HxMfs!--Bg=mYH!xor3V8F|61q zAHApp8Np=)kw8NAB>-~F^ma+7gWRon-qyKb4YJO~K`ebG_M&k^(W$Y@LfUSmRSA&} zxc%M@8nA+1$|)0|GX&JnPLvN9==DJ9qgCaK)D7z6K%Ueh8L`by{{UD%y+# zt5M|*qZ^a>V*Wt!4JJ6`lv+hhF~OwIHpXE|^#`+c58VknHwKghU zk4CGKnpZ46L#D)B{h?ihz+S1dl1#1laOUWo@02|xOpb3kM_GJH`jOexb-3lR`Yw^4 zhM&R~KC7o=U}r(MYm5>av9^`?GIr`)>=O`S_gOHW>$IOp7z=Oi-vTjAU3lM&&A)076AYNkuZJh{Q51rQa8iLHr1y)J-$0r1R=w@ z`FHJRe)SH=Krn=4@=*g(7T;4*jjF0fVYofD>pd)`-g>28?ft!t@x4txfIP1vfpWuj zy_@Z0oR{V)OGB48m~~g*?tWl4@f^Clew(9oXJE@6PK%At_05dJJL9+SJh;7?i>y4Q zbo<%2ZQq>R3pH&fa{A1y(EB&pyd5Yg_sj zZwvGz<~k#y@2yUg#k%foOyB#resAO3)_jCLcRvT6z`@|bS@>d~%*~~BPW_73HYFG7 zBmGMBt@b5k#XJ4VGySS}`q3hq8e0dnj0PgR=xVrrgNI(!KUqyqi8Jzp=358NYc#~} z3|Mb)V-hv1)sb^e; zGn~&upZE_GFYNL6PhY-s1xp@#yaLS6z~RJNMfR~UWl)z1{*D|X|G-#yPcLt9wy6sc zd0g=Q2JC+HSrNx0B@qF#U-7o*9Gl->MAoK1Ro6fIIL7!N0U8eRZ{_e>Jp#rE!tyx0fx z?65{rpFmQiJ`=Sj52}(&WSNi!>GK8TTO{+9DQ%lR?TIdZn=(OM4Jd}$vwj9S6G$0O z8whj3dS&px-P8FbD5V{2Gnw=zK#8wQX$n?lc-U$woIi+(ukyWe)IX>-}5`? zzW)M;SNe$&y!}2p z_`<7F(g(-)b`F&vuKXFKh@sTg;B*EUMvxrcewz3b8d{cGyg2jw=J2k-1($S?fQyej zKkN4jV{Sfqk^*J_!-(yA^EZ1X6u6|!7}n;%*(zv#F3OlEjc2`e@>?EKMic13%_sbo zboPke$hsT$cj^B+>I}wS$30YFA&WA2sYY=0t!=B*stnGu?r^&3puYbnWaFbF{H@88b(xb zm_%a;;6m|B7`K}JRmzWxDmN5XAbj3wGq1^hmyY{{Q}P-SGCTQ?zqb3qkML5!#V|gT za3P?KJDLn>0T>$?kuI;A7A<ZkUPCg_Uho#dR}7b;S`jaWMolHJBoSFiSVhR6HY; z+0vS+oQ{!~S1`8mQ%euagbDfz;+bbav~Hp*^y~xgN1dQum2w@ z!gXO2Gb2TzxOBhF)GP^ZjE1hVI3dnV*Z3AF;nfdnMC_?S)X0&3odR-Do-HbCEXF%_ z(Sgk3O_o4VA1I28-~~!?9mPdkaBK1sPn?7!T1ST7C2D8o!5BSt#+aIzyHujyzz|`H z-Ct~@Nuv$ciI+&&SW<$$Td%&j=6mz-tKnPM_Y_-O9cEBVfe@^|GmR@30m64VV2X)MK~WHc&w#P|%6`6273$>d z!0YGsxd?k&B?Cg68wowgp8b@;R0fVPTBwkQvyT}}qMi2Q)V%dpoF<)hpeC4qUb@N2 zy9mhP-MElq%YFg~W+HIC!f6Il4)T&ZfHy)*P>E0!@_h`*3BQzJD}Zhsqwe*L=O_@b zNeI0sp$YV;uCz(=X-Fj;vmW~Hk0U9zutY#b#U*grRFg!0j=JeW`J(zs3qTY{$ilsA-b-bjdc{ zjlF9`A_0n$H2doagCp!$pvDnSk)q^fcb+mL!hJJn*fe7Q^qf8Ct945im+1J|;GXL= ze(gMa6l@%=8}Tp7YJ$R6Tq8%saunHB*kNV}Ml zf{x9J)&6wp+;Yhx%TAGmZYkr~1APOhCg$;+*D3gn-hcMOS=HLdmxi>jck4%)ef{(8 zz*aurdTm@pJAG9}iwNDcJyd4%Es8{iL`@nF{{6Yobp7A2r8{5${pLM1=KoonJi`CG zF@K%^@6V5~eExrLFSHvQQsB`r9!yAfh>f!1(Q(C0gtl9cus<(LZiI=l80ryA;bjxB zbr@H-Udgj8nPSV z>YIn~{Z?Kz(y&R0m?wedo?>D@XuEPDdp$NI-=r>kJ8Xc{ACcqG9W+RKW(+WWUae+xg`B@*JY7-^qp*{|pfFibAVT`F>4nOV(KY@N>B~HOMGw(R*@u;>0==8SF+AVx8T~AKMJs z(jea-!;=~RXoB~(J>s3bW7t6ed(`rzqpbUr+gAI|&*v=AEy;PE6}MV9E;h+jP@mpU znYgJlHGx`4>HT<14cf^Cfz#|6wT}M~+m@*3q}iF7_1hhdEzzOd^1=SM09&+`nlJKF zioor_EC68>TLC9c?$yeH=)VhvIn0dpu2h*U6*+F!o?c$7JBzMLCB6Q3_DA=^&g&^J zuH~(F{kXS`B!M^vQogDOYdmy4Mu@nCyPnM;9@_&B{d4L9xEW7yjD4)uS+gf@^2Y1@Fys^}0QCD>*s_8OG zw7U&kzF(Q9xWu*#OFqpF_uF~yy)t@sq7T*1+*YuNnPbnsFgUSQx;1sL8gCPl(4N%m^`w_${|5amZam3Y62)Q$ z?>xPno=?6hWwhOS)5UGG)POg%-pJoSkgf-hvRV~qg!u3t3ubx3VG0ucHFji+O8xT* zrFt~y`&oI>rF&jXP;@HmS>=R&A z;-vKmE#3*s4av*R)eqI{#aWA)`n8@ANGr-nWHJfdj^uAAOM=LYdba#Euw#dX| zoEJ#=5$+p&JNH4y)AZ$F9Q^Os!3RI?UB`wna^Ho6;NGb$RxUGT>{|JZEEjxaX#5sg zy!TsP`duq~94xWWHF(iDe$O;GhP`~Ak#s)e&>b>}=w>2QadfmboBnf_|L=#LW6`b= zzU0@pd^H?RKxJ*0f_Ia>tJl-ZU0p`wK^K?w^zXrEZY7Ka8~IM?`J2<9$Y$&}IaZ@7 zd*KJ*$3oKvBMFTeX}6G`3_j8X2dNN1y*(&X%WN~tY%Dc<4?fiDa(3wR?DXdrN(3kn zK=kf|*Y_P4@s1Tk(N)6Iw>BOg=C)3sRZXGcgaoo0mK45EF~rs>DJk-$WZ%0U!Zro%b^!Blc2IX~gjQ0&+mV zbIF=xnY5cC7dm+pD7EmmpdjjVb5;@QCF_1f0PdWkc3h$b^?Pek>8&~X8BN1P;^HgZ&S!c*Y$4fVRJ9{=beJlr($puc|;is35Vf!gm za&lS%oK%@8Lk9kBlnEGHpgO78hcTez?Xs~yK4IU=prPdhU?1dM;-vLiRQw9*?RZC7$uY4MH*$`E_JkPvR-d-;B3kveKXvpLPvWeg}i<1ZGhr`x9lJS5yBkw{2EXvB#XQ6|6Mm}deB<0nIs{juI zqOvl<{$u(0r9cXLpEL`(8jAAR9Q0SV^4}dam{fnBCqlp4)gBqK6!1Pl_8WpwfwPRDY^>`Q* zN`!B0_b%-?4#)dg;ZNO|uQ(E6N@3^EOy_6H6=Wr$RVWDO1Xx@)!ZjXry5jkRdfI2` zoR?F~ej=#T;X}lgsu9Zd6KWm>S4&b5)k0(;4DL&(9d}FZntZ7ysiuAbbsm4>fZ2)k zkP|o>(u+o$-CG(9`r({5EHF_1ph{4*3T%Ahe~*fGY44QwXY zbwwa($B)=L$800j|MWd$kW{O2C1#-p2EE^U{9(@Vkrxo@;|aAH`lwmd zWMkQ0PTmo@>Wf>LH{R3nK$+urIJf$Ab%MVb?i9cQ{e|;E))}K;7a|4#>0e2u3sA`O zWY1@?HaS<3+qkDl#x5at3WqgOfcaamiV_d0Z7-dfIPRZ>-o>iabOyH&`N0SPHDakS!Ygjkb8fnYP$_IC38TIu zqCN*#ClanYAQ3va#`Dv*o9A2V{E#|DXTCa=-(Ea(P8(&W=WRiTQyq=GI-10V;=XjX zgw3NO7Xxk2)_;B07?)yOq5#1AM3+mBUkc`O~}+M9Yy<(kxyN@@qrv! zr9e(}&BD?E#b25j9w-xb36NScSKdyW( zYjsoU+{R6<)HaTG?ZHhgYAnkyEKhOTu^IoH2W})=Zu92KwG|5A`ntKKVPUV!@ATb@ z?bw^`luc(1I?x-D*JHMc>F5V;VWW5E@z1q9+aH&E@!(yVXsT~us@K_HkWqp8@zmQ* zXKo)>M5-!)iK*9)e7?a)w8a$d5ew)%fl6okMsXqN4U4&)9Z{DA?Zi~RQ>3vvq;k*<8q<)jjMoIK_}pRwNJjvd@}uw>&rQsNneLy%uBy(i{bN@VjvVjRSrAFqb$iBaNH!})*i>*qwv3mdbBglszpwo`ySl18TIuS%gP|fmF z5N_saeU@0~eLXQYBR-xW2qOWQ#)&LgcQV&J23oY&z5w!1)&($P0WXnR7Ohu!6=-m^ZU+z0B!eaCzT6iGlbr^Y7CUC`n$92pW2cRK;}As+IS zl2cH#!>BZP!{D(pfuE-iD9BVIO;5ye0{SKAFaPHZ(?@-pt^XkW_)4*tC~h=3V((Bx z-}=Q|91ncG6p`nFC}sYPSl*b7!VL6(J5?jNNve@<7`h_JyvIG=h^?HH>05di{$%An z3#Tcb6dC25ivUG%S5m+GyiIf3x->jT2>bAImu$?Tktz_+js&|Yyg zGdDw%XHM<))Foz})E=)&D#voclt(^xRD|U~lnajtz(y$syzyt?lDC`Q z+=L1=$yutX^`NN94xO#q98N`MicX=0%YA+u1#}Fy_TDM0nhZ?$*CIYs#Z4b}6L=Kh z@6C|Fmk`f{xA6v|N}SGrnU;=pks^=(jel}=15{Ahtxbqm#@YqQY*lB@G>h&d(wf&4 zfcOYW8P{B;=-E3Z`$8#TD&dkc%ALJ)+M4)sBie(aG&p>|Z?9UI?&F80oke&C(s))+ zn{#6E@5E>bRQBc7o1NZoZLZs#+p|0S>g;^C)5uhoa5_jv1#^*mNRrwTwvC+H6nEbYHRSqvki;L%M+j_pG8&!4X>!g7OEmN!t|2EN)-lT+(R>M&OX; zqH|;SvSNK}tU|kQjD>4(n<850Y9G(xIFm$n&hCTn3JqRLkw=oG-LzOA)Rj_$Fn8lE zP5qdl*)v!W-RJgJcRluw*zzobJxdiM@14#o6yEiuU90}~)f1!hOYSj>MAIwxW}0o@ z>BhX%^^pqCI<{wzp5Ts3FaZTu#hCql6T9h-+?^pRdrt2REy+l;rX`)Zx)TW6mC)XNqGH9 z^8jp7wwgg%zHZZP;W)_Gs>lA*4pDG$tbVkfF4BL_vN$ zk@=%%-~Cp@6|vvKy~BX&{ENEE?^o-A3EXZ|MlF^9c9+UeFm&Dex_9BY)1RF#GR7A6 z8(@4Vmj5C(4EL*EHA#kyxODwTuqyd#=KY?hQ5{#)TiO&(-CdlC_O%~5;*hw5`V=HA z|8~B%`u^4GT1aVoLOQ>*3vKwH>)^)C|3_mxd`nTgYqB#A zkBIFN=oLVmN}656|7vVAh)9e{YB09tdeqMtVM%da8(kEUC;`^C3pBP`0jr`lic%mX z_-aD1mq+22-58WWELuDdryDdkR9tL;(ek?rkfa!%(m`z(Ss%Qw?)^cL36`q!5RbO8 z%9*-dS3=BnJEeDE*eue}Ldc8q_(gVq6@vXOeHI9N3E`z*7Am{%Gq6rhHJCcqcx?2( ztljm-h?A=k&+jJQTHeDX^yZ2vdQ?#*;(`WF$Xgu$BWF5R?@~4r^2qejqsEGWgGXn& zII45X1<}0og{!#s zX>-M7WtUDyN}4lQMc~`RA97k%4m%X|Gu<1LsnNo5!$#D1I*4edv3rye#0_DCg%`=1 za`*Y4j%HC`w(ESTrS15%4`FoLWKhL8o<@_`=k)DBxQv=!7NQU-bc`AgtloZVFTH0| zb;#gFZBoUKB8IBL(1F8RSZ0WMA}!9ofj(hXY>NvC%-gQL^J5f79iiW>rmB?XrmmSo z05bwph?j1pIt4Uilzahu2&|&g&%DI<`<&5gChir!zMY^SbNkY@*q8t$MfcL9BC@!g zLB0N`ld%W}fRIdzM^%@diT4t!#h(m@w|$FPEW2zp#XNx1+A4EuR{BnCOSTGc@rZ8x z(#k_Z6X1XnKOJrQNGF`xHjL&_dmn4`zw8+?n|ygfpo$}?naej*2Xn9QH&_#hxb9UQ zffW2$2Kui!DW7d+NpqVXjGE(#w9|o2DLJp=P+seLsw>L=+coBvN#tBfuZ3N?fD&*$;s601iwQ;cuZTZo6oT# z`UEO}F`+Cl+w^wLPisstWJ+ri!DuYish=PV#|9W04Wkq#1FASYq-9+pR`sMfKjmD|CCka{yVKwDG^Tr*=KV3SusRu1jBYcDF z&V%;)Y>}t22ym+Pw;-@>wa2P=+nxIZAZiXy+*GkTuWhrGtTd+{UiE0xDF0~i;?ql> zZCjO;qeW_0$E*&QBgZV8qaVt7*BS6YTT69Rnw;pqf3oaZ9s;}mxE33JxdG(SVc)m_ zk;I|CFlN5!Vqn>-IZ)f{-A~`EA*EsNTn$Bkp&UF>FCECreVXHv+py=g>V1h)Q-S{H z`8(Rx_$kLmo+c2tAV_R4yC`(6WZc^`*4*wpXf?Cj%WnU!)t6Fo3p){oN)o3q#Cg@x ztt*Uzel}gQq29nV`vgc}r!NC^)Bec4i5|kc_7k!y$0$G?CR9m<)#i2f*=Yq#wVvJJ z;J&V-CC6d<(?8+YJ!ZaD3~mJCer#C(G{c#U2V>b45to8mbrGt3IT(Q<;c!Opoh7K* zX_9y7`EMn4aphwwW(iuZPGLS=Y`A4=F71C3+XlMMrjgLk${no^u3o5a zmcr!@xf*VtD=X-E8bm#wmxUjPUv$CG3C^}*#1Pe2@7xuYa-L?V4IvQ%tB;6%b42pm zMS=}p$YnUc{OnqTRt#wJy#HB6%IdjyY4#%PZ2GPK>-Cl`myN#rZhC+lD_iRaO)f#^r{#NxYB~{BgW~e>^C+xY-*+i`4KPy}EC!S7)mr?+oS*xz>bo+A8+?4hUaq zw`Ssr@fRz0l|=2Y9^UmnQr9-Aq)e#vp={Cc_g$Q&VE(~QL|(7LI;+5@CP+5b^3(QR zmz_!scDJOU!y>P~4aurZ!A8t`%viHYbl zkR)c|h}oiPmiA}@qpaYxXhE`DxQqR%;0FB2BW*wXwRrNHRP^+z@>kY4>OjOB#7PzPXw9|45;b?Qb_kDR25B1O%CSD(RsCemaDLp=bi zIUIrx>K|@Jq`xKwuBLYhhIqIIL<+WxaY{@}?3Dk&gT` zmSri?htTB!uqKhl-*VlaZOk%)Dhy%q<{l&lXRlaXaz*aXTPQ6;Io}Znix8N|&b*t3 zn*eB{gc+R5h<#Y4KNn~@J0Xkd+4YX}j-qJ<6jhLZX;LH9e-OHkI+~RVae`3&Z;^7Z zND!NohiH(5GKaDhc8!CQp;uvrZ6q|-7AroK64rs~Q7|W?h|~>ax*T1kpoL}{BBy5} z48)kT0f;Jh(Gs5uWGdy`bo)XgU+LwEZJ+&?>crs%lB!i+qWR^Ys`8Xk(3T{DSqqz< zTlQ73qvY8#h9-n90a8PGu3ZFMm4HhG3<&Q;ln6+H|FU~CYcgH`@K+nln^?%k)S`-C zht?T6wrI>*$fWpxTl}0|wJGDV%+Ptua3%dbVMB#*X} zuQ@E=LDIXGnr~}O8#^FILzuA-;WjjoeyqG7GPwNGP+D~`vqwJU#xEJUY*^QlX5hQ3 zVAaG$2;<=9rc5dwz!KCxtpc$;@SiIzK?HO;5d>-|5CYYPhv~BeH3^A>q!3+3lqxRb zw+jrC(;|Yyn@s?mZ@4}iB@RGF%tV{jU{zW|90T}tF|6#8i6KtL5C@l8L{5A_)jkC4 z=QFG?fz%a1f*fVWj5a1D3-OZgFd#{8D!nN+6NgU6L9Ic2+6q3d+sE}gjFTt9lFS2I z7Zv9ydSFO7 zCjk?Ht}EbqSoCAASQSgGT2*2?CG%5X_{zRCG}G9Sopvk^APy-A9K473W!vDOXdL>~ z1boIP>M;_U#R1{Cg4^q8rz*(BGNQaAQt*xVzkVh67@BqDMkSI!1!S3_nE*s36Ncn+5>H@!>ee4jW2lR238>hns5x51Z%PP*D=J{1;8Yi|}Lu7bW@5 zcCC7>@dQ88BoqyvD$pgu-geWC8*HrX%8y7u4SMyZ4w1Q8L;n z8HUUfw00D(3XouexhRsL!>^B%XblpeZ|HlLAy>@2DY)Y1KeR7;TYZJUWV%N8sey+wUL{j^ZQpiz@PUn!rL7BvB4U zpWy?U6!7&Av;;H4kXG*VQM@xUO~emXpevHff#3Wk1x_%*SF-3Oxf8$qP(^u1JALD# zrrq6E`~ zKnPLT3|w^suB-{9VQ8ER1VTWVY3i>n(zFp`woWnQc?!hCi8yqaK)k>e@K%x5 z7LevD^v17Az^AECKmvR7?uZ;UDv(HFDsfN(tE&+k6u@%ji2(Fg9Yfj?$34(74aRZz z=f3l8X4lVb5m6+;l@^()JmB?<^QYI*Ag>W7M7>D{1ihSRNkIEnz>IiJ$KOShm$hOJ z1-tGb*GFED%lqX9$MUi&69EM6(zTv4O~+IPN=O?Us6|5;QUotSNdcP}a2XWlfCH7F z%Mi%93eM<>a4t0rFpu7|stOpi%EUoCHuz}YM8E|EpG-weH*HoI@M)a-W*!hnzHs|A zV3u;oOn1{?iet&8tD`spG7hQou)$1|t`5|pvpSm7%}2K!VN56s5z{1C=&oLUNdPor zqu?IY5j~MamLZmd(ytIdg9wfy-<+fSwNXLqD9AB2aPB)AM?~$>5)ni?6I(=L0nk|u z+Im+XAJi;`*KgyZ5^)+6+|nok|Hgt8Hvq{&)JJuZ@^(ui%IA0p6wceNO0EA8SS#at z^5Za8QgFYLfv{}9OkP7AAux&s4fvFi&^M`h)FLm>_efGS4mx)NP^OlSvW`607TN8W zc6{(oRjOhr6%}@kuZAF^MvBe_jdyiy^ARYG|LKUt;GlOhDV^K8`vbZMQ@e-G{m0mj z%yvKd-OW+F_iWp}@ql|1srRPN-J7|4@8#^h|7C2q-Jc7%|1tG{8QZ1V`^&%Y^AsO^ z+xEcrv`WnJ2VWBQ|GF!HYdh9{KNvgb{{#*|bQ>Zs`D1F>!uv^{NVb>~`wb3^XCd^+ zJ@~X9xwIZ@7UDm|_D>I?8(~WT1f^T8v|gQVL&;Eo@t3_1uZat@U@-uxpow?FNmLfIQwj=tbUx4H~#*Z(SA~aA(V-hr#TI4`Bu#Luaim$?t&!HA9EeU>%-S zNRF&{BM=O+r#+sN9V8)f8oGw6d)2i9JmVOpAG%f7xhSk zk{v9PFNMa*U203S-gorTotnqKBmK6tA$Ih`dIQ(S{X@oW;5H4%$I%%(nuOat9=|c& z{oG@8&D~Ou_h>r$p&eI5uD8omqQ{tNbp#>39Dd`^>PSTzWnkpVYY~3my+4mvl&lO` zz(-TponYUE%8}n57RruKOxa-SUYvz9=fmUvt+Y`g(P0O!2%GYh{6cnq>zLVT$c$;J zI6C$=RcRj)6mmkNVl$WD{=kJ;Be0~sX9=20>3vZleBWnCieE1J=q77nu86Mbz z3C_a!WN*Rnw!dhy-ESi^@>Ar5^3-?~N00h2fMpZFnrVJD)B1%!bGAqRoV}jlZL^tc zXKZ6BQDY^&6UOi$O#(Dg4wU3NozZanb8hvk`eEsE>|9b?I@OmyrzTF1Dg{YLd=fQ6_(CT0ztqYg*f{#xdo-y!sS@V@UY4$5_ zI@C*2=j6zXDbDzTSDaL({VW7Q*_=d1D6?Xs%Dwcqyp=xqR&TF|;dhLnk~SVV+cE0r z;n6v)gnn?|L6SwzTzUu>zZnaD`QjKxtKq485XuRhKpEXbeE~3kH3G=sru*n{fkZ=Q zUp9HpC1cLnb6=mSTN(~IZzves&|XLMMgE-jep`5%#NR`G_w3TGJqfo+_vbdrsewvt z+8+DD@A2;&ZFHU>OAG4#?txkRzzejjs5h}*-7Hr>ak#Y8qZ<(_Iw1NQGzA_XmeAHBKDx6> zPN1=E&G6}z+3pjC*mgloaI|h{w)XdkwY7l+{@X(~?5`Qx!)`d%-0 z+1ud=@4NTBUw_@5-3uRl$=yp{yvkdM1$0Yma9DdCED_GK#n5$*@*P@H7ckF*4I7w4L`i&lk@XYS`>u{8~rZgFG^n&oJ*EfLA8OI?+jPR+( zuWm~8U}+*|;?rRahnU8nd0+Vs5`aLSWRk|=nE%`8RQ!4Bh%$)`Dl>jvwAb|D4@r2S zYsG)<1{B+NTjyI?Fg8A`;Fk7#uBbTJy#b|_Nz!3QexnMNjx&CbkF7rtU8-#VDX!d; zb3i#&T(Pa~OHr%l;8v*49y6J-5v2X?jQQUcgMKHvHsbYKj#o-l>H0^(eHzvz7H4bE;cUx%ecDkrt^NukKcmT z2(eax>9j(Tislci6Jaoj5C}m#qzKTt!vBAGZ0L#5ulz+9Btrk=CMvk%^(cLtQdLlA zsl#cUF-flBOc2S)Rvm?+O4XI@JUuzJA8=IHDBLGIL;8=goxD!DdEWiu=Dnh}N^*$H zg-7PjnhPJT_;Llct60S`Jd*aKpikKcm%AN%t#D@!AQ?2a7}x6nS-ilwU-0N``w*=6 zV${Z|r$FVFq8{>CN~G^B^@t3H%95AKRR|NC`||uf0BtsO@@4d!z5C!Xy#M7GZwbsd z)l%mleA3;ynkMsDF5>*#d|(^*ZoN!S}&fzkg@Y}1rDRXL0 zMgPbogoLyL6B3u&;KIt=mUwCf?+RTNlIxwgaHvK6W2Rm}ax0=zN5(!y%KyfF{MKm&em?n)D zn3jCc=_--3MCzQ|-|S0pA%LRE3a1?~zLA?2_$?hDi$=F1+<1ukv$hMGr=>l&_FUY$ zc4|RgIq9r4BC+_!LpZuTg@n1h?`W`39a{!eg)z>DF?bx~OzVOGHx0-)VcW~GQP)1P z$V;bn0OhJ4w6PG)9)O?S=aGb8^d_-Y+#^%ZZhuu8G{}y5Qr>f6{%X|9KxR=JD2Gb| zu6GmAsqp<@DZEON*eU=8c8i~Vn-T&l+^{c$ZbKNg#7*AkzrlMZYwH3>EmUY(rMn6kY{I_T0K*oRG=mhWfW zzP&5?ITaBcLiiP}8$$jitX6YF@qKT5>)-X(CUghlhPdbN4gJ?*LW}pohrf|}eA~Ro zCf%=Y+S^31U1#W zg9r-o@-lpG~CMA!L2nM>Lu05=9|<2Cml^@F|juV>ZUltNvGGsx;w_v_m`tm zBkZvwg3T`iQy4iEAz>*D%hAjl*45Q#+t@txLtfif0lS4zKMf3;<@t{j#Jy&+W&;b<4d+{uwL8D}*dZcn2 zCB#^>MIp*>D+_JQlxd1OgT$~49v@XF<{lroc38Litf(M=4yDl$niRSTl?|(J&<^oI zecxV%i7Rpii{A2|cRvg|v)!dwNOEPNBE8^DGq!5~)I0P{8=b9VihI9H?W%cU>-ybj z>}Qn6Cu2yHiN#WA(UDOBFBjLZ)0LM*glD}Gh&zDdCL>(2;v0d9__ixbqJxd{`UuG)0PMdVBz$ftbVcHg`TswjOQ#Y@F}^R_oYPvpKqZ zCHwvP)79)gg8A3v7pdqOf52NO<4D?v-?Q9(go_cj$B;zEs{`%or+4J+C{>!|_ebPX zks5$zOi&K(**jkQ!dmMobc?6XAzy3n*DRq{C7QStyL%zGqOzwZXk)!%U^U$y8^nQX zO*K7VP`>S4+pyPZCDhrteUFe}9LPVrJ3rf7qb|I~-_c!uOn!n_Z?hEPb}ad});dt+ zOj-&$0puUuIi=b6jJSSYvdF|4xORy1{7aX5N!+Ddw|$~M2kh~iEMERzu^mf4T6qo( zT?nOk4@Y~gj=`!Jdbb@luj9#ISSYj?0Iwxd_>*exxUbmswjU z`nr^je#b_Ot#*ycePt;wp8aCSV49dEk(AtcXmL4fvA85QJjf~(_}`gaaZ3_jom(hX zO#4`+)~M^c6e?16;}AXU$Nl_eM_U>J>F8;X@0Ag0P-P>|VMqof!A=H|lwK!DVLdrJ zvDs+r1OCj#nunV&Gy+eP*j^~uZSbnO4N|#CyHV8 zKSH)tJQpyd_NcNMS-#zDQPm+f43SY{5hPfZM(W+NvaZrh05t`f`9BJntwE3)w(9}P zvuR+vJ*0E}-y-t3p?R@A97p~w3bjDpKqM{P$xfF7F7LDRV+e(@ z5>_ojywReeTKm{r!7`#ap%zll*hRoxVEcAB`&_*yo#)1$!ihfk|a3Uzq02PUl z<377@KLn9cst}j{Gd~`&nj(;VVM&I4C&6G2TJ*yq0;dXGeGE{jGEROHU_eGJEpQTaJ_%`U zpr0HQ91%f3UXJz0g4a`4@G2xsDz*U@b~lX><| zLKGFSAr(B6w(*yv6C+S<>m_=Rtkf9sh|N$HF~^LUIR+=Nd(enIsqW4>ehpu4+aZ+7h+lb#@}7r;NW`a=Ia_?QH3_i& z6$yXAG#E3%j}W0hUE!9^5EMr>xZv?0={qO6AX#a@?^L&3*CnU!UVQk0+f&p=6^t4*+`II2WvWnq5)7t@Xt+2 z6q}HKA_YioMQPyd(rM-4lw*l(6i9^Bxaryi&|$u!ztE_TmM9p(RiYi$v2X-gs&k-H zB?+Lq!pCLN1VZ{hU%3oP;S4_&1L^aZe@Y}0ff0E&+Ki)pfp8&{q!J*lQOyHMH#Za5 zN54dxnV+l~=&Thp6MkJ6C<`QolZ*H0g5snEn2`FDAjAKpOqY|zdMe~%4mS-6rj;;oenFh~a4P=EzFRMmx|HgeOjlO3a{kt0X X&omzV)ksme6l8TNWZ07q0NegQ|Gu+x literal 0 HcmV?d00001 diff --git a/test/examples/booleans/disjoint/test/false/LineString/LineString/LineString-LineString.geojson b/test/examples/booleans/disjoint/test/false/LineString/LineString/LineString-LineString.geojson new file mode 100644 index 00000000..5ad6f986 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/LineString/LineString/LineString-LineString.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 2], + [12, 2], + [12, 3], + [12, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/LineString/Point/LineString-Point-1.geojson b/test/examples/booleans/disjoint/test/false/LineString/Point/LineString-Point-1.geojson new file mode 100644 index 00000000..39e7953d --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/LineString/Point/LineString-Point-1.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/LineString/Point/LineString-Point-2.geojson b/test/examples/booleans/disjoint/test/false/LineString/Point/LineString-Point-2.geojson new file mode 100644 index 00000000..323ca4e1 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/LineString/Point/LineString-Point-2.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1.5] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/LineString/Polygon/LineString-In-Polygon.geojson b/test/examples/booleans/disjoint/test/false/LineString/Polygon/LineString-In-Polygon.geojson new file mode 100644 index 00000000..62d55b65 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/LineString/Polygon/LineString-In-Polygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2.5], + [2, 2.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/LineString/Polygon/LineString-Polygon.geojson b/test/examples/booleans/disjoint/test/false/LineString/Polygon/LineString-Polygon.geojson new file mode 100644 index 00000000..be2b9688 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/LineString/Polygon/LineString-Polygon.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 2], + [12, 2], + [12, 3], + [12, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/MultiPoint/LineString/MultiPoint-LineString.geojson b/test/examples/booleans/disjoint/test/false/MultiPoint/LineString/MultiPoint-LineString.geojson new file mode 100644 index 00000000..f7bc3dd8 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/MultiPoint/LineString/MultiPoint-LineString.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [0, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson b/test/examples/booleans/disjoint/test/false/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson new file mode 100644 index 00000000..85a8e2cd --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [0, 0], + [12, 12] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/MultiPoint/Polygon/MultiPoint-Polygon.geojson b/test/examples/booleans/disjoint/test/false/MultiPoint/Polygon/MultiPoint-Polygon.geojson new file mode 100644 index 00000000..da402f37 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/MultiPoint/Polygon/MultiPoint-Polygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-1, 2], + [-2, -2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson b/test/examples/booleans/disjoint/test/false/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson new file mode 100644 index 00000000..706074d3 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#ff0000" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.6953125, -19.186677697957833], + [128.759765625, -19.186677697957833], + [128.759765625, -15.28418511407642], + [122.6953125, -15.28418511407642], + [122.6953125, -19.186677697957833] + ] + ], + [ + [ + [123.74999999999999, -25.918526162075153], + [130.25390625, -25.918526162075153], + [130.25390625, -20.715015145512087], + [123.74999999999999, -20.715015145512087], + [123.74999999999999, -25.918526162075153] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#0000ff" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [119.20166015624999, -22.776181505086495], + [125.09033203124999, -22.776181505086495], + [125.09033203124999, -18.417078658661257], + [119.20166015624999, -18.417078658661257], + [119.20166015624999, -22.776181505086495] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-1.geojson b/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-1.geojson new file mode 100644 index 00000000..b84728a8 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-1.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-2.geojson b/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-2.geojson new file mode 100644 index 00000000..a937db0c --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-2.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-3.geojson b/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-3.geojson new file mode 100644 index 00000000..46d35691 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-3.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2.5, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [2, 1], + [3, 1], + [4, 1] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-4.geojson b/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-4.geojson new file mode 100644 index 00000000..cf348f68 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Point/LineString/Point-LineString-4.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2.5, 2.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [2, 2], + [3, 3], + [4, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Point/MultiPoint/Point-MultiPoint.geojson b/test/examples/booleans/disjoint/test/false/Point/MultiPoint/Point-MultiPoint.geojson new file mode 100644 index 00000000..f958a470 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Point/MultiPoint/Point-MultiPoint.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Point/Point/Point-Point.geojson b/test/examples/booleans/disjoint/test/false/Point/Point/Point-Point.geojson new file mode 100644 index 00000000..15b60d6f --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Point/Point/Point-Point.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Point/Polygon/Point-Polygon-1.geojson b/test/examples/booleans/disjoint/test/false/Point/Polygon/Point-Polygon-1.geojson new file mode 100644 index 00000000..5ef704e8 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Point/Polygon/Point-Polygon-1.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 2.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Point/Polygon/Point-Polygon-2.geojson b/test/examples/booleans/disjoint/test/false/Point/Polygon/Point-Polygon-2.geojson new file mode 100644 index 00000000..b3a139a5 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Point/Polygon/Point-Polygon-2.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-1, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Polygon/LineString/Polygon-Containing-Linestring.geojson b/test/examples/booleans/disjoint/test/false/Polygon/LineString/Polygon-Containing-Linestring.geojson new file mode 100644 index 00000000..a840dc09 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Polygon/LineString/Polygon-Containing-Linestring.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2.5], + [2, 2.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Polygon/LineString/Polygon-LineString.geojson b/test/examples/booleans/disjoint/test/false/Polygon/LineString/Polygon-LineString.geojson new file mode 100644 index 00000000..83323524 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Polygon/LineString/Polygon-LineString.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 2], + [12, 2], + [12, 3], + [12, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson b/test/examples/booleans/disjoint/test/false/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson new file mode 100644 index 00000000..59b2a579 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#0000ff" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [119.20166015624999, -22.776181505086495], + [125.09033203124999, -22.776181505086495], + [125.09033203124999, -18.417078658661257], + [119.20166015624999, -18.417078658661257], + [119.20166015624999, -22.776181505086495] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#ff0000" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.6953125, -19.186677697957833], + [128.759765625, -19.186677697957833], + [128.759765625, -15.28418511407642], + [122.6953125, -15.28418511407642], + [122.6953125, -19.186677697957833] + ] + ], + [ + [ + [123.74999999999999, -25.918526162075153], + [130.25390625, -25.918526162075153], + [130.25390625, -20.715015145512087], + [123.74999999999999, -20.715015145512087], + [123.74999999999999, -25.918526162075153] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Polygon/Point/Polygon-Point.geojson b/test/examples/booleans/disjoint/test/false/Polygon/Point/Polygon-Point.geojson new file mode 100644 index 00000000..c2131b4a --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Polygon/Point/Polygon-Point.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 2.5] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Large-Inside-Small.geojson b/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Large-Inside-Small.geojson new file mode 100644 index 00000000..9a52b0dd --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Large-Inside-Small.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.6875, 34.016241889667015], + [14.765625, 26.745610382199022], + [19.6875, 23.563987128451217], + [23.203125, 26.43122806450644], + [22.148437499999996, 30.44867367928756], + [19.6875, 34.016241889667015] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [18.984375, 40.44694705960048], + [7.03125, 25.48295117535531], + [19.335937499999996, 18.979025953255267], + [31.640625, 24.206889622398023], + [24.960937499999996, 34.88593094075317], + [18.984375, 40.44694705960048] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Polygon-Polygon.geojson b/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Polygon-Polygon.geojson new file mode 100644 index 00000000..70b69b88 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Polygon-Polygon.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [-13, -12], + [-13, -13], + [-11, -13], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Small-Inside-Large.geojson b/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Small-Inside-Large.geojson new file mode 100644 index 00000000..15e635f5 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Polygon/Polygon/Small-Inside-Large.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [18.984375, 40.44694705960048], + [7.03125, 25.48295117535531], + [19.335937499999996, 18.979025953255267], + [31.640625, 24.206889622398023], + [24.960937499999996, 34.88593094075317], + [18.984375, 40.44694705960048] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.6875, 34.016241889667015], + [14.765625, 26.745610382199022], + [19.6875, 23.563987128451217], + [23.203125, 26.43122806450644], + [22.148437499999996, 30.44867367928756], + [19.6875, 34.016241889667015] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/false/Polygon/Polygon/issue-1216.geojson b/test/examples/booleans/disjoint/test/false/Polygon/Polygon/issue-1216.geojson new file mode 100644 index 00000000..41157c99 --- /dev/null +++ b/test/examples/booleans/disjoint/test/false/Polygon/Polygon/issue-1216.geojson @@ -0,0 +1,49 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [6.638240782825051, 46.513552354874435], + [6.638240782825051, 46.52452567471025], + [6.632039186485088, 46.52452567471025], + [6.632039186485088, 46.513552354874435], + [6.638240782825051, 46.513552354874435] + ] + ] + }, + "bbox": [ + 6.632039186485088, + 46.513552354874435, + 6.638240782825051, + 46.52452567471025 + ] + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [6.645459572232596, 46.51709747623775], + [6.645459572232596, 46.52102619404951], + [6.626132904233913, 46.52102619404951], + [6.626132904233913, 46.51709747623775], + [6.645459572232596, 46.51709747623775] + ] + ] + }, + "bbox": [ + 6.626132904233913, + 46.51709747623775, + 6.645459572232596, + 46.52102619404951 + ] + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/LineString/LineString/LineString-LineString.geojson b/test/examples/booleans/disjoint/test/true/LineString/LineString/LineString-LineString.geojson new file mode 100644 index 00000000..6c774ab5 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/LineString/LineString/LineString-LineString.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [12, 2], + [12, 3], + [12, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/LineString/Point/LineString-Point.geojson b/test/examples/booleans/disjoint/test/true/LineString/Point/LineString-Point.geojson new file mode 100644 index 00000000..e327ba98 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/LineString/Point/LineString-Point.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/LineString/Polygon/LineString-Polygon.geojson b/test/examples/booleans/disjoint/test/true/LineString/Polygon/LineString-Polygon.geojson new file mode 100644 index 00000000..d34e7dce --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/LineString/Polygon/LineString-Polygon.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [12, 2], + [12, 3], + [12, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/MultiPoint/LineString/MultiPoint-LineString.geojson b/test/examples/booleans/disjoint/test/true/MultiPoint/LineString/MultiPoint-LineString.geojson new file mode 100644 index 00000000..77b1b718 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/MultiPoint/LineString/MultiPoint-LineString.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2, 2], + [0, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson b/test/examples/booleans/disjoint/test/true/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson new file mode 100644 index 00000000..7e3143af --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [0, 0], + [13, 13] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/MultiPoint/Point/MultiPoint-Point.geojson b/test/examples/booleans/disjoint/test/true/MultiPoint/Point/MultiPoint-Point.geojson new file mode 100644 index 00000000..eb6182a3 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/MultiPoint/Point/MultiPoint-Point.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/MultiPoint/Polygon/MultiPoint-Polygon.geojson b/test/examples/booleans/disjoint/test/true/MultiPoint/Polygon/MultiPoint-Polygon.geojson new file mode 100644 index 00000000..469de623 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/MultiPoint/Polygon/MultiPoint-Polygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-3, -3], + [-2, -2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson b/test/examples/booleans/disjoint/test/true/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson new file mode 100644 index 00000000..3b2ea41f --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#ff0000" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.6953125, -19.186677697957833], + [128.759765625, -19.186677697957833], + [128.759765625, -15.28418511407642], + [122.6953125, -15.28418511407642], + [122.6953125, -19.186677697957833] + ] + ], + [ + [ + [123.74999999999999, -25.918526162075153], + [130.25390625, -25.918526162075153], + [130.25390625, -20.715015145512087], + [123.74999999999999, -20.715015145512087], + [123.74999999999999, -25.918526162075153] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#0000ff" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [116.98242187499999, -24.647017162630352], + [122.87109375, -24.647017162630352], + [122.87109375, -20.34462694382967], + [116.98242187499999, -20.34462694382967], + [116.98242187499999, -24.647017162630352] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/Point/LineString/Point-LineString.geojson b/test/examples/booleans/disjoint/test/true/Point/LineString/Point-LineString.geojson new file mode 100644 index 00000000..be635169 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/Point/LineString/Point-LineString.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/Point/MultiPoint/Point-Multipoint.geojson b/test/examples/booleans/disjoint/test/true/Point/MultiPoint/Point-Multipoint.geojson new file mode 100644 index 00000000..542362e8 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/Point/MultiPoint/Point-Multipoint.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/Point/Point/Point-Point.geojson b/test/examples/booleans/disjoint/test/true/Point/Point/Point-Point.geojson new file mode 100644 index 00000000..6d022c5e --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/Point/Point/Point-Point.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 1] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/Point/Polygon/Point-Polygon.geojson b/test/examples/booleans/disjoint/test/true/Point/Polygon/Point-Polygon.geojson new file mode 100644 index 00000000..c3d4c6de --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/Point/Polygon/Point-Polygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/Polygon/LineString/Polygon-LineString.geojson b/test/examples/booleans/disjoint/test/true/Polygon/LineString/Polygon-LineString.geojson new file mode 100644 index 00000000..52b4a494 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/Polygon/LineString/Polygon-LineString.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [12, 2], + [12, 3], + [12, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson b/test/examples/booleans/disjoint/test/true/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson new file mode 100644 index 00000000..d165d17b --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#0000ff" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [116.98242187499999, -24.647017162630352], + [122.87109375, -24.647017162630352], + [122.87109375, -20.34462694382967], + [116.98242187499999, -20.34462694382967], + [116.98242187499999, -24.647017162630352] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#ff0000" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.6953125, -19.186677697957833], + [128.759765625, -19.186677697957833], + [128.759765625, -15.28418511407642], + [122.6953125, -15.28418511407642], + [122.6953125, -19.186677697957833] + ] + ], + [ + [ + [123.74999999999999, -25.918526162075153], + [130.25390625, -25.918526162075153], + [130.25390625, -20.715015145512087], + [123.74999999999999, -20.715015145512087], + [123.74999999999999, -25.918526162075153] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/Polygon/Point/Polygon-Point.geojson b/test/examples/booleans/disjoint/test/true/Polygon/Point/Polygon-Point.geojson new file mode 100644 index 00000000..557d45be --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/Polygon/Point/Polygon-Point.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + } + ] +} diff --git a/test/examples/booleans/disjoint/test/true/Polygon/Polygon/Polygon-Polygon.geojson b/test/examples/booleans/disjoint/test/true/Polygon/Polygon/Polygon-Polygon.geojson new file mode 100644 index 00000000..66d7ab57 --- /dev/null +++ b/test/examples/booleans/disjoint/test/true/Polygon/Polygon/Polygon-Polygon.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-11, -12], + [-13, -12], + [-13, -13], + [-11, -13], + [-11, -12] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/diagrams/esri-equals.gif b/test/examples/booleans/equal/diagrams/esri-equals.gif new file mode 100644 index 0000000000000000000000000000000000000000..79fa2f816ed0bc442a50f6a106056ffd6b10cb24 GIT binary patch literal 22932 zcmZ_Vc{EgyANc>f%-k9K*ms8Pl(DbXh!E0HDUk+ci5N?EHTJ#6n%!7K)Szr_W2dMo zC7~LWRI1UtP^tO$`ToxDpWivZ`^P=^-+S)5i_Tmb-_Am7^B+WTDa zdm;Gs`St7V?VX*Ssi~>8wYAst&qPH>sWUP;BEvw%+vd?$-vLgk6Q<< ztgQU{^{YG2d2w+u`v~y3yMWP9G!z9aqyy`HepOYKZfIf`fQeHUtizXuV2?+-J2P0`&g~5EDmrhfYl<&^|j?cr2uCj{!Z5J-&cU| zrNGZJ;Ac6X*$!Z#f%N_B>aSAt*AI(}Gb8u9>eq{Sr!w)qZ58uV{Wq%j$X;&%&= ze|-D;_U-b+kvrYp-GBf7eewM1^z_rmiNK#ff3~-`hiU@H?zFuduj0^v&nvIqFTHFi zjGdpK2LOOu25`AtrJtyO+W?^Rzt#Va34q~JFD9p?rln_OW@YE(=3Tl>%P%M_DlWNF zT2@|BSyf#_udSo@GhrRBHpR^G3E`1on<^Ovuj^>6>Rg@#5%ivRk( z{pTWxDR3N@dB}a2u=n-EU3bO$f>k<{3(JEZr%e+RCzH zT<Ub zPS-x?xAQ&fDa8?~YpC*4gPK>{U0tJf;)rYFtAN_{vd=xc{IEkbTyXcF%Y0zl?GkR#rEK)8gKT09D%s>U5`zkJk86I3 zv%-A#{_YhXF}x|`qotExn0)5l@G$!MQHJ8hyR7v$La)V}ePW0@Ne~jQ(u+?qGpij* z5mrz?mR8$%ljdgHPP38JpfkXOre$oHD{EFnkBrS`IDElv3Nk!pQFpdiwfXKkl0hA)&9lUaps&kgI?|mLT206ZG^j+=Fdm0#l zd!UJ$^O>d63|ob&B9?<$C)xGr` zk!$-UTW~p~);9CdgB^`Bp19vYk|6chQ(+exae$9yTai-)JPkPKWX0~V>YfkxV2iv- z*B0%2@`q`gxns1jRK^aM199(s`(^c&$H|TU^&Zyhj`Q(1Z(c68)G5qd^a%{ewU^S;eoHjt?OIxpxpq}QuMe!5-WW~PK6nGfC`S{ zjn%y`OKgnW@yLl#(Il#XBu8Ou*ly44XMx0vhZVm}`X+C7I9x1=nptFa_>+@fnN9Pm8)eP)pWZWAYLJIhjau>TW!f&q503QE-FIbA=1??~F-L zuhNWuvGU4v-k{A6j2&9Bv67wLak`&lCQ27c`+ocY4@n)8U^4|)3{oU{*@zs2h!UC> zB4jB|$Vp5W>_xp1NNt|{?=vV6P|Jh#i|cwmVFI>=KD@X3?()%y38u|f0u%x)LBpf2 zxx6>ef8y+LuP|@ja=`MwJAgGUG(I4u8lyl=>Astat(BEG{$N!uiK0T1?4eD2JhaD? z3V|_6c2A9-3}GV*h8Jp8??yuwSa7E(wJ>{6qfV960G}yM?p{KqxZyo=9v^r7ED%GV ze*3-o>f`1B63k3j=66)*{Rm;hVCseH{TS?)4;YayCU+uoUkRjbY+oQG&Y^>!pYj~s z6-5vv>Z;okso*2BZl!b+ehZfwey{adkO~83-F(QoK+AQ(5)e{LNkDxW<#j)n#i!FW++Cndg| zT=>HG;lu0`CXzf(PN;0z2Hi+EXVu*gfm}A|`LRIYXYAYaFLL;v<}wlcqi2&!<0LF+ zI{_mysMx&hvGL0!e((%2_{oX3Td$kiC+}tnGRWz#s)4$DtzWno)jcoYGp61i=7qd@ zZlZ>k9taU8lO-1ju!z%(Yu6eX*@fZalV>H=D~~>b5!{Krx!pI7dO>sRw-3dC9~W=< zFhH%Du$-IQ&Fy&E|Ld! z>T)u0c;H!66H#dkf7XBj2zNdjP?G6f-DjHdz`u+rvcYwq-Km&#XUDGfti-Z_a|=Wy z|G)s6NUad_JcOIQl*_+G#)<;~DuYhtf6Bp_kF#NsOnzXPr&?Z28R^X$P!eNdgyoiC zO^t4R=X|Q9Xb$`)Z!$M1H)D9|*w}|7x@JUxYT$_%NTe~LE$TWv`wXW^OTyYvL(y0W z{WZ7@Vx1883tfWCs%H@v+}snY;ZRsaCY5=p$g`DuGjE1?Y7Kl%PLG1769 z0PlDbmY+d=HCp~2X*N!KW%2giL{fL~Z-!z)+pMaI`_fx`E5$p+pmN?pAd&J@=`iMp~%a^2;r5{z!nq3 zNJJjTQw0=PhooQs!BoFt@+F!w(Z9&w#O&#)iLXO_eE3Y>as0P*jX2&t%+EqjiYQ6; zUC8o2kPu(_K9b(cIC$#0;W247rSlPa%fVjepR(pYaUfqBGI0gEJQja18hh3*T9X|v zrjGSzVKO$ssf>{6Xn+rw2(mB;2NQ~eyy(EJU+8Ph1)I&-H|n4z5WVmsL6aG~wGt|1 z9|oNfOhDsI1Gpjuw^A%;Q^dce5T#Oy$8oeY+Z|+z?xMd|GI$Ih@T3qhZ927`7PW%A z*l;X15g&}r#74gGO{OLEuYh4=3HsEK=xE^INf1az01|}7!;J2D+n(?@8QA?Vl2S^ioOI=!;<%)Wc zE(udEt(IQ;7;{O0g!(eBz>mB9&Ghp3aUf(Jb%+|Ad@ES16V(wT<-38{EsAG}RJIE~38yk0T_uP5h_RuN+k>bC2aMKA>FU z3tN$)R9BUIKP&b_JHiQ-!|s)%v6V2T{6TDaMN3&Y$A57k)p<(<0@Air(=u(9Z)#T5 zGpo|`E5QFOI-V*!lB!o?t5?ganLjHsG^GQ7y78}&uasm<>X$)Rq=M-cF|6vPmov zg$;OHRB(S&YiA|pgs7wW)yNZ9%Qd6;{IdW1Sr;Hvulk^gD$^V!(|pdnB-H_BM{CaR zZ?+>gPwn5KMnIz+XqdUHvxODZx#o=imdd#16q)9{2hDZnt(WFJtLBPKk+7G6EylyT z9_$7fcdb+AS{-j|`CLn?d8=#xH8o~)X52M8Z*x#!ROm$O>F-xaY}kbk?qan)(z3I~ zwLdj)e|DnXoYFp9-agmg{vsRmIvdj^!@a)raStqW?vj}wC9v%qSQ1QxOsMb;U*Mbh z4K(S77v;uQ`Hf$#H)>~Y{QY$UkUjg@oPn}n^qdAnv%R?f4Idw<5AJtMAXw=TI!q|A zF9C^=2K?C2rB7&LOQH zZ8LVXHN8p1g$aYCZol~MfcS3rTis%;?vUTz6xp6&z-qTgPt@(MVCvyEmzGoUT~R-T z$^){JEqYVuaYZq`nH9nokz8R3P*~PV>cd>mlg=s|jntC(K8r1(-KBkIvwd`>KKi^| zkwt&LY=2XHe{)5D>+Sv~$A11#NoB-}5<-6pyT6oN(^er6iHFp2z%g)-tM)BPoQya@ z%cd08Vc))CL7AUGOz6<9EUeGrpfCooK?Dyw-img|NpkL>*C7)k*fW7G@_+Uh??LKJoQ}p7>3V2I(~ADNdnh5VnuKd#Ro&xDctc5>Hr#yCS3^&E`?wn z_>xZ2`zT0H8nfV5P!kQT8y9Cyrt4GSo>lbO3?LK_>*3?Rx&bN!m@IyoO|=qtkbkOGjwBn>Tzyp2nTUmL+_Q(RKdYR zSHd=NkhD5Z#1g~1)BTqmEYuE&Gvh623B%2*vwn$QByg`h+~o;&wLw`<7+-wSn`26m zJx_IZ^NVpnKZ=kgBgf$6^v$ek8!R_Eg#K)I6%@S*e*1{_r9c?QWFiG#k9sCadzMIk ztb@DwX$FIu8b;He=;Fa&enOUZxD)3lq}QG&62S)pkcjC_By-dV5B`T(pgB*EeMU!L zL8R?xrq!RGZ_miM0>!mIeZKJGHVvLt1B>MoH`r4>WrH`z)8Ny$<@P!Uf)W}${j>6zL{$WUJJZ< zW{1h@fj=Gt@OV%n3$DI`AUnb6b|8|pph{V|n-Q_yv@rE~p`VE<*$HESyG{In3aP@9 z8IfNL7~o^-61c+>KM{3en8{UWn?LgOXYfq(yd(ir=L7~4-<)WB8p4d2P){!E0j{-8 z4VDa!Ru(_sxi{_oaG%CB8UR8lOv@`!8=TPFvzxg&u0MsC9D_zJF?yGP*`Azda!bmW zPDb9j8_IT7)*snAi&!wN{jRBlB=G24M~fr4yRNuMhRoh^>qtxS7_a?@JFJ6g2!aFl z`y-Y_>;X1&1A$RU+7~#9qLXlOj$#+^q0PmpXb&;gfka zdTTu~{EM$iuTVyt!1Z`YffA&^1`oa3A$n&`v~8%yB+hXYt3+DsaXSG$TAOw5-*THo zo#giC_f`43i3Fxzwg$3Np2)nuz<;9W4zBF;yCA@w0UMd}eDV6)5D&Rifdtm4+4WBW zsI{PP*q270!gN$(hlBtNE^@7X#r(QPxnJlg6U2hQ&cdGOzkv6#H^fUVo&drloQN+; zV1ibI9!da*jO<4_uz*5+DO$_=oQurv$eyHMI^fzO! z-lHb~|5M=b_*I2w|D-c#^pms|A-(QR8%|Yr+k#`k{2G zY|vLWy>ud0v@Ut?-k+Pcm&JE8PeM;MPawv4A7U0x_D2UKM=1^N(wWjXF4}97eM3oC z=@%OWAbh}1yqQlC)?vtBlq0{mZu6h3?xucz%b{-;_3omalPZy-K16HH6~#XVsr`Fh zrMvV-M7Mv{8UEn9u7!GV`qh78`>gCA$^JiL`zCTZGU9(?yHZs# z^G|G_4@CD`8IIp{w70r$BXj%i1+((Q%EU~?Ua!S4HgyPf;W`q~Y?VC7XTGj~HgZ$V zBTeLBT&CQC&W3S0Gp}aPiOxm`af0uIN}jINDUn63qW^AoTz#C2f@%55LFf$C2^1ls zv7T9q0~PPK(3X>he151o9nXGf4^p)Vf8`t{T-DC0N(H-wH?+_9Q0C`K9sfB&zlY4~ ztA{;by%06KJ+ZZrx_tE+QSBzf;;}Rdo?~sZY~mv~PaBb5ZHV!pdP0pJoz&kAHr{OyT1ursk|Kk5<{>nak)$W;Nc9SN0fT z(oFY>AnsviwSu~)TK70Q#m+oqIv-1IKcD4=U;`T+DaFM8KS2sdBeB*AJ=}#}VUq7(?QeWFe^Zd7X7xuZ^8{aXY(EQ#GQE8@?L!5!-w}Zafs3? zJypVCHLvFuw?LyV`_}*}BVTXFJ`k@(WjfWmFzqi=I0d6HXm~hb4m6V2#Mywa!W7Yi%&ZR{DJNnVWVy z4|QeYsP?|*7J5*Bx<^*9u2du>h%f%(G)`I#e9{%v}rM7baxL@qc!RX#z7r8KDF2q|Ss z4(koIqGP<%CDBr(At{x%KuXJ{@iJ@RpLXt(Qx`i3DN6F2=|0vxtnM%5aeTZAwm-@Z z{_*^{f8Gy~d2<;%!+hhN-OAcm9wLhB3zX4&rj=pVatSy~g_Py%ZG(^bNX*gKVkp)^ zgwy4AsT%^60WXG7K>OBG?je4vYcICL`$+P!d)JJkb#XVbDv`VPVNvfHh8ps}!{+}<-J)Nzq{#{28GW!Py#EUOty}x@QqWtw z`_pV59w~r1W6Y{jf4P1sMkiZNPEy~~ev$vqak`8NWbvb;A@QLo`q#=c>dw@~{MZR= z2f$?fMeJL&d@nmtWf_om&P`F6tkC?Y<@iX~wt z<|i~x+sF=8jq(W4PFJk1IMisg+1gYB7?F%yJJf`YJ}EUC))DYtKR)I`bx_%@OxBV8lzM28jat{uts%xIEud%SDLY7jm)LAW$EY5NTzEU7)bqSwm+x^mGmDGieW-O z2=9jFs0WWdQxa_3UUb-z-*9P34+_S%IQSMds1@DR(57qj(0v%~ZbKpC!>{%8GHq`4 zLjpV;W?2-gTYBrq4Jvv~dZzn^jMN4rbN8CyuXpLAGIT(O%5Bze)$9mTv%${2ZSr^= zsDK2!YX1&qqHUi)(4J}r=gO#nDK*1iOAD@7eeQR#L!a`ri*NJhi9Mf6X`qzV4P!nj z9vf!HlFVlBn0QjS#n{4%xrv~S_8iY~O3D?p7I9Gu)kgE|lQ(A~yNm2y1+TxzCZ7l4 zlG-XS6GTxszyzt5mxN04?T?U-&ah|!Tc zo{Wts+!g;*O+PHF)a6RQ9ES`l1;B2MhfXJs8;6@@wqMNOu9dT)OPws0;uX_LT@Q>B zdEWQmXW_$2# zc)||H`o1sPH?{Tfa!GY|a`3bkWBz3>7TKrfaqfuLaY-dbGcDfa z6QYVB`%S%J{4N2{gE{!XKBpZ@JH&uJlXAD)9%WpJRSznZk9~W@tS{^Ql-+f?B;Ki+ zvjm6AaKX235{|uLd)ok<)kirIs}HfU7ehYpBFh@Vv)yf@I812H(JNLB577FoQE@DL ztlka31?_xP+c?Y?jdY zMb|G?0!Yu3^(cE^?A41GHliL~*4vdl7TeM&es(|XN1}c%zF6@tkw*_S!l2afXYLiF zYr+i@F|I>mAt^gzQcXhTheC|cD0~uH=VQBc682!8qj-dKFjasJ!IWbR5=mR`} z;vK+p=Pb7QYTOMbrHg3C1IEYWPD@z=eP1AU!4%#NgAYyyG$1+j*uwyvlgLl80AH56Es#Eq@_EDIzf(%%y0qh(@ zTzqv5tZJ=N+j|r{1}CsD&W9z9b|+lZL*V~RT(^{Q$}(=p6WmwBJXh1KXMI7Iz9|un zBf_7;P=*AwU$UAykiFxFuq6{|>C}=Tqq#Q^dr{SNn3$vca;;|#k|h&w5chX6gFKUv z!=1{!$z0p%OcgYkG6LkkSq}TzojEY(@_AL?f&@Tiz(FbPt}B-{e`NbTIXWW@sS}WG z9{^$Nez1d-2r8!e`OlhFPGioC7CNXA(S_DpL}{Vt-r_+e88=BeQ>>Uzr7C^~KDx_@ z=?BD!f>2kTk6{8fz8P3qL(?OW4h6D&Y2tz{MKpV3r@TI;i zw^l{f)VOmk!J6o$ zR&p{^GXFsqAC6O_CQ4T-uit!9lpYh@Zi_l*15dT23w%2W8=opVs&}_1!MGJNZLKHu z+e%-h7LJsQeBiyWRwD`SkUNTcYUchc)<}bv=`>gC64zwgd6B~AUVLeEG}^4zqE$eb zoH|=v>t=m4>S(=Rc2h!}qOMe;V0o~*R%t_Dy|_&5J9NDpjEc#Y3BGzMQKsdYQjB$A zcC&p`0If<_+BU^k*IGpx)s#^K9$*mq*hK z&dC9h1~yHv7r~;;i{mG*@6ij!xbVvo^l-nlJ;|^K3*^TiSd4A2*>Ia9*M>AS%RXyv zUiYAXGvXB~SvkR&W)&5msGDGi9a=(pkR5k(P#P{$J>}eMlS6g8%EN234;eBU?F67& zIrm##9pce>yC`gke5t)8>8TA$FvxMz<;I42^^b4DC`yAi2YtVs-w@vh;lj3>4Hg4B zZ9I6Jqw^+Zirb6bT+{7r=%`p1)HAKFUWcx{nWJ9j=OAh@^MQxtQU*dnZt0s0yWdztn*zl>a_!( zd4j%TR{SznweH>g!#AtHBynoilL^A2XKPlD3 zG4(kA?h*GlgMb_|z_CCs{u91jAdds$IhZgC0J0H%5?n|D^(jCe8TdB{@6 z-PhkEB5d@p94^+29{@Q>kQ|Upg%jDJ5(|T&!HQ(084vQZuzD8ry@qGMi=uYxbE^Xi<4V_4Ub^h&=4$nVe)R@G2-vKvMz!`Z-ffX6>G9FB107pOZge2&h;>Ul) zgPN={bsB`GKv8!_^=J^522b-teA}3RM$EYenDaxKl@JDi7A*gjPOu~a-k8Tok_Hm* zXmct?v&cvy>;6SLp#Q(w&lw5yEO9*Kzufb;wV1}uy_5lY0t7dA98** zroh6e<0tYwhc2>_ZI9>qpJ#HJkKZOBd^#*;%8P(0h`o*3)`3D;7;4_&r-L(@IOh2T zpn!jHd>a|xeqwPa|MWN&!ef3%yi|R4_SZC8j`h;RrO!pD$?Kumrj*u)_;^nn(47Jv zaD~Tr&nM!b&A9+<96fwjCvQ|90)9oAVLc=_O) zwLh3~PiUNftkJ2(;Tczbg8_nRy?0?dc6 zFuW94N&sls#&F`_uH{WCQm5cQBP*Ym-{(yjk$|?Utk>2fW)L_k-h3c~kBTAiU^#^ulBLlaMldN@x*x2LSVt#NHa9;|qeRinA z4e}DUhZG;wlg30iqVB})p^NVt=%3=YqmDnl%w0wFe34yb@Gu>Q30D|3>S|1|_~dVk zQ%^B7?8E8reIJ^~S8Hcm2!NCUpXF5(R`SUaSPTcL;C}vwuptQA3mY$S*gVGOLf)m^ zOP8#)MT^xS!IMIc#Kixb*wzwdMXmDlZ56yMd{u%$E%C_Ei~oO#ZGUKlxRx0xCYhid zrek7YYLT3Z<&iKCfbDGlCAMp)tcpc#Vg#isfcl@cj)tNwmtu198l>fPEU%^CRL76D z+Mx{G4u?wnj-{>uac?*^pcg=WG~+2o#*WTS}}BlGsPJQ2W z+ar42G!~8QX3@S6s}Fj7Q>pC^4IDNaDF2Z^(|$_*KtXiqsVZ|5&z6cWSd?3cAMN-; zZ^^sm@j~rWubn>4TtBrtx&b%0mK9<;Bl46z2%+R54pZSx91uJgyRNpFsKWk7EuwqQ zjNiHU=l52j#bYkNypG*v-!l;sQAVlD=;+K<`W(P-yvk1DFThj)wn`&|t_P>Cyh)df zTJ=6sy58d+$#u!dGky_U|0>B%D&IaPW>{l6*I=J1RWQDE(bh+ja1@d!C2G8-*+>LB zWtPXjdlM;HDP@=avdSH>470#3Tgj=`=pSoDKviUbog0jrWXC1YlyTx>vLwwGQTAzF0mOSJyczyw0 z;=dNRk<9B1erW6aJ`>uh7K3M zfkJ}102A}q)roW8_Qh^3Szw%PCFAgdoGwkinnaYt-Pf~L#Fq|4D<%Y-2W3xqe;z?| z#R6^-u|1w7D?u~=N25D+JvkY65!wLpb-eaevMkn~m4U+cdUNFT0V)-P|1LbV@8F5o zV;Chy2kYI5jt(MPiM0^VQo6%QejGl(GchBS!RhCXAmLK5ClXnhDa7&aZ#m5OFa+Jl zeUt(wN^w9y`5`a}^*y8|^GA5n{>~wH63w4Q+FN~5Ati5*P*D-3@C-kV*;~64?I~=f zC`R9VD1oYZ9|nOKq6JoqE(EaH0$N+Qfw%Zn2RLbb)%dQ&uJ;1EkQMQRzIa+d^qMC&jB#88I+CO9Ds`sA*$oAa5=LXV!(B-5SVE#a@S-?#u%67 zWzSwajZZObP>S|rvBmasl3&E)vy@n`7Wc5h#zkVD&FSS2oosUmB;P_^=QfiA|G^GtftJw z$4~M#O`{4QqzVXrHntd*r?e*o##N{&>kWvw6~ZBWTCM>)8y$ z$yy}SV?o-+!L{}gSa-BgWB=7TM&pt-a{KnkZ-|*=8Z$)>W-npF*$5!T7O-U6J@R7r z|6aTd`KVrVe?tKP4I*L|GbDdQCdID|1nN|tsZF^t_$V%rSq!-AJ&rp4ZcSh>zqg_v za15vH)*(WuR4JAof0?!Jf226m&D=G~^DP;S*n;`)kf<|p-UuJN>CyE@ad90w)r|F4 zc7cW#=1_B|>ORW`dnB7w&Um0d*>l6H4kyq5T}0Z>e-=m$VxZe-f=*@DAy)V)9X1uC zcym#rc_yU`gj>xM)2`FQMM0`C?(UuKa zTthZ*=?e0%5k%O_ZK0gAuP+<}kq8M|D4Q3~W-ba!CV`gY;2pW4!Jp2<-dp7!fDho^ z&cGvqrdCNARwfYNvH)nGvR2szpoZzlR6%JL&!{+rZ4`D0pvv46*9{XWQ`WfGk!Ce7 zr?g|)`_M|7p%*S`hea}GIt{xnRVAVAkmfid(GeKSn9x~6_TL?0i|lAtZxQ4j@0T|--S6+2UnM@ZLfb|SqeysOyd@PbKK>)WkCCQaN_#xzx{=}Z zJXIl*4hpPN@4P?wRS-wVY(0v;mjT?^+~we9t@d4Bxg%M1)t5(*p4xjkI0fmIdFAY8 z5;1#Q8nIy_?>h2F6;DGugBO?aUzu3j%HURHCkB3VYaqTebr&jr)+=gX=~!icf#bHR zSWN_m@Ti=Nod59NPzF#)-4lrotc7!oodZ%vQ;JOL*t>tCa3p*NCFmC>&N=wboXBDgdxTHo7Fm09}t7C|*2Iu^Dnr?e^(Ikx( zXQn6ZW#=*&q49&QF_rJ=q>rtP6Z*19atQ>R-6VIi?9+?xK{he>eE4J-?oZrfl4PgLq3lAaB!A zqXFE%UcdD$ml}6}9`ucs^xlLd#?T*$l5eeK4M{>$3@ZOBAjhHNq>?7CCJ6dKu1rXh z3GdZUd>(zehya|VM7v-BAv~rvD&Pd?f&(C$F_YZFMhz<^elLjls2^_}kkWA_<Q%QD`?O<}*_v+Dd57F0K{;92u!jtBK2cfHaVp*AXu{6j`G#)~bf7&xmdsi{7=B zM&1%~rAzTxVGPC<50X%ln-_vtF9?%De?-OapdBACA&L_qVJ4RFMAlFbJcY;DWv1F^ zg2!;Oc1%qcj~ybUO-r25h<^1#h#;9>Ih*WCfYqnDQY*>AswC9< zi>!TC)HT}aI7WbUE!01QjhhwZ9g|en$ZY6Aogzy5P?Kcr(xE$=xt!j1-J^=7_H7S6@86}x0bOZ+UbAz{?%neKgFp6k#I*}$R?Mw4^L1NBDQc{;l7+)N8zq$A+C(o{%Mw1qrmdfMO@|5X26{S%K7%lm-(lqM+jR z%flH(QY`d>1aG=D4}nq~VdnC#Q8@Ylq(gv>h?){qq#!fxLUUT`&x&7+@}p&?Ajy-} zSv=DN$rADpzC;UhDp@>LvIGSVN63jTcDXkwoSIY3Q_g;mDP%xPX4TrnymdAv#Xatw zG|zv>FQW}lf#d%(Wn~H%@+INXG{Bq;S!o7a|BG-Bln%OM3~kZI6IoUqbPpC~$DkOJVD);)h^I!nTbc~Y#KaF7felD7qSE7tpIu?}uu2WIHN7qEy2m=yKAz^6DAiuI``8lj16;?{wJ-wV~j29DT!8asS z?j9336$g2LEDT`Qcu7>h&Eoz2pg3dY239K&3`!IwFn+Ton_HXYwR!t{xs-r^AJ}xp z1qS4(b>8Mg^I;mGK_ekb8MurHR0K8J>|*s0-mz9+d-b~bjlvpbB`V!_JZi;e%!~I!yz?E>#-lqlLsvOi+jXW+L z9nBO=x@yp1FYvznI>ABn^T(bGw^a?P7&ms#jaZGFK>+(VaX2)Aft{`ZlT%#l;L0R*FSpr!sqbo${g-h`jzraXBig&cvAcJlg=|I zH*UT&<5`SG?WH3d7%gIou$My(A-+PNuLy4jxa$w3o1-NX298z$GIs_Z^7dyYbr))B zJ*B}V-E^y*-e-L2qAYYB``TpyMu2pwJbr@}Zy5(t0ri-{z@SuN2C%sNGrGS4(2F;1M)_hz?vf+*YVkhKi;G z!*lo|Igl6|#!Yry-2O*3h(D!n^SGhaG#8~Vi#mW$b|jtOJ`3Nz9bjx?@|1jCjCQ?S zy7g@CXlLbU(86fDk*4@3q(8XBf~|Eg7dE9J{sef~685FQC$Ej~sf*0q7x1$CT3qE| zJ{|U|#L{s8;;!lgvOEE7bgIrRLnmC4kL3-um=k^;6g>KQPIUvJE}sm!P`h>M-4e@( zcQCOpua#dlVG7eR7`d=)=+3Er0RsxszVr|)Fgf5kIhru3!(p8a(itB#u>4Oif$~I& z_N4LmJ?YMgsXJ!TjEY!G-uP{y!!)EOe$gp!`)fJeraa(r*hHRf#JRI1|7#UOL>eVw4HY-4BXVX$(M4bE)pPN7 zJ;^DI%qx}Ce@y50fdQ{}@-b#+&hHG7_lZ0nu^pu7rjd2Q>FELH*kMjz$il0M$uF! zWr-mzvW+D|X^8C3Sdt|gifrXV+10d(Qcb0WPMy)|6k2?)^ZDMs-`n?gn?GQFnR(xC zuiO3kpj2Let{`CEo_;>aUKV5pZv@Hmg5W=H2Cq{r-&S`+W%Gn!d9TRoxIVihei{AL z#{-JnUY^-TNlD3$QD0#ye)dHDrqhj-oZ`6GMXZ8uRDrm@{d!m6O{MZ5N)0C7FOYBZH@xt#F1v4VeXr1h~cZ=yNf%=kF81x%F4#^;%T?fmsukM7u_UoW@Y zfmKhioZ%b$6hB@mHv4n!nPWK0Jo9!e`S?=t-74V6k=@ntH}$PYBSc9D9>+WKvApDG z?OoyetcTLP;n`sECLU_XM_lh|zWV*|_H|IyCzTmj{?PNkY4d-3-+5`z={giV|Ikq< z24Oxgydf($_@cpwZFrRXHv(0}5XIuC`=Z;P%U*X9LB5usHi{{maoO@dxf0EfEmNnx z`Tm>!JWi5tim;!n{VrAzIPmM*jV2|xPjPG4|CL+kw@W>(vq;I6*MF8p2^K#*w4SwE z3+99X7VAxpU%=QWmBYpKRs1K5emd#Qt5xelyVzexa)jALaY1dI_NTJ+z7M~Rf1T z#fUqL(neE)rE{eKXbR-)V&xVv8K1VkmfVw*V}4zQ&oNF$oADCYOwZp+XMtn<(l0}1 ze-5MH(*OQbEQd0vC;r#ihQy|%goGPy-yD;Xp|UjkLJm0LkXaaG7M62?y`&&!iTi4O zd!z8$a5Ztgk?rv!GnidcvQVWc2BA?%Yik;w`u{}{?uHyWYXJpCnI8;3dZgIJxb!Hsy%LAs%sJt-7BP97=$Z()@`pi*Tg=hy>lRuweFMqP~>!}%X$3`R8^B# zi93WeCGW4Dk{Xo-i~Rza18)27+^X@q8nE$elG{8*%~pLk9$J~`O@#4TVxFt*ltCxczj9)vS6DLaR!=x>T5o8-0T497drRFL^v=gtNqGHSQjWyEJlRYF%8f#2 ztq5IT=cApb;S)}8L!`)i9oL$~m z-to%ormUyt%Gs8Pq!kv9r(M9pU6-%9xf<5>&EJK-!!TtP9{0VC<0c9> z?W|NyDw5|p60KWOyB@lG{v?#W4%V(5IsUaik$+S4GA`9zTlxLnLw4`fy!K^?ma3f% zHU_shLjp)yg*elR_>=`&(-o;q&C#0#xJdt8vG)BR4EK_vO>SjkXu;(BIkS7qxZ~ur z!QT4MySLOj<3Cs4nl?7mF{?Y7Z9Jw4C{cxyvucNAZ||bfXr^eAkzV*7hbbH_ zS3dBnrgtVOmK$>-P?))6+x*NP75hEm%H6jm5nb)aUtktDbux&C;dKQkKfiai_CBkB zE^0$R!qo5hp@Mf_`1S&t7EF}?u#Pr%5_PKLLLjF~Yzq7M55q+3lYV|VTfSKt;B-MUQa zsWm6IC2l=QsCkqnyc%N5Eqjuy`mXZk$g`!#u5RdF@U^+uVziwur7KccUp~A{x2h%YdL7GbQZ%P&pU7wc@ z0y|cj0A+7pvAk36Ro8}8J`-ETc@tD9?`J*I+f<)*8?XpO@7oEAy$Daccq@-q#~!xm z3pr%xFw>gc=1@)!qoT6#1;q+MPg|U~p&gxz?f63@JQB?Gk z#OK=oA7TroLfC)AcH?_AN{yysDB5mdsb^>0dgfi!8*l5&kXkq|KK+;~%~RMtL~TmM zq(R`}mUt(-fnLbGA;XI;SZ&;r5dB;#XK3?|vQ#Xvx`FGOl~;N!Q31Ul13+Tl{JRR) z(&hDPL`vxUgEl&w9#wn)TdlBbc*l@5$=#fN%1t$ZRddv7ECNwLoCCcx1c`bO0BoRx zjSh^YR~)^Vw&Im8KD*T`^?YF{4(Tl?(Be5&T`_g5*X=cD-|Tg9h3Bx}-9+x!1#U52 zi=WZRb$FG*$E%C(V+NLAdu-6``h6=OdNMa!{Xqvx;#13%of^?C&Ux{_AC|fS%mfiDN zeaALOb^@b#GrTAGe#@Q4L*W(Y-AuQ{p)S*!=n0-G?idp?p|Lqwcc=sgDJq!FD!Eb!TQX=gh z4GPt}!iuxF71V9r*{yM*rFWIK=$b8oRx?|a)Z4TM0~P^=aP~o}*Gs`0*E{|tg-;qA zx63^mvy?}NZ5aekWPbUuuHR+caA8ir68-G?S^2W_69U*EH*Vo&0IkiOeelq}D<``l z&Ma3-HD4PKMh0EK-HBINCxlNfySz_BiI7`<@oL>!Vm{E<7%+%qogvv?V6}~<+#Vm} zi?0LEK1!uX_SNuksWn(n zSu*&tZC&7vbOjCP$R}fB>FWw^%OK_3sMDLz!ufiA^0(2c$;Xc<81m>>9@R=8nVuNk z7FV-hpy5?p4rjb^?tNI-G;zuIXw80~59ZQ28eFhrfnlzazH`Hqr@zwQ)J1*z-Tg4_ z?cNF<8L)UZ(to`z?BqkccZM}a(-c|V@tb$;p|xMHob#8x)_d)V?cVs$5})No8FBWC zl5^|6xJV-IB>8?xTxPyqgZK$f%>P>(`#oVIII>}vyL!E|?d;(8EBD&FHtDM{{{9xM zu0V)-Z{LlbuI0b|3J+Mupc@!$NX|=u_C>G#H(L7mq zy&~0?2CGwITQy+8G35SR)Eyu@c)RR!;!UXJ{fC8AEDoP_SiG`9MZqh7Z3Zs6$5*qEgGA!vRY$D}*noG6w=wD1iR3>HB{@0oQx!)Vu%q=? zhZVd#stS%(BqyKFJ?(HPiPwol^&Jbier)`L&b~{hFPum*&p9O)pLEiUDSm&rLL({H zCbir-@sn{Jd6ljwc3&J#t#e+crJ2@`r%42Hd)_B#Iv;1xq+Zob(;%Ok8I(NO21(R% z$&Gz47Wcbyh!83EgwKF@NSu};o{!Y1ROkf?_Bd<`w03+&O~J{y&v2BG_cj-qwZzCx zw!M&Qc?%sBBKjOSm5ueOE2v4$Ro|qQ-Am|brfR)Ug<3-Gap*7v^qAylB|{KL<%ThEi&mYT(<)I#0 zV1NnZQi_oP7|T#)($$Ew_6y;a{F6ZfAgiQ?3dy2|o=*uN85b3Y*tV!H$j7CSp9og; zr_os$mq)XdvXj}+?c5AV2m=D;ihvPI5Wcu^fn8nO@mY z*po-S^cg!fLl!##;0aBnkfqFHwE*bKJjnH?K7Rgi2He$LJlX77nkqo$ zz%u83eL{s4ChVA!+%_V^`}BR$)YECXSFWWwfoFjodqaLA$!$(V#z?7C1T^;ndRc3XK`zp?t)IogeT7ixOmnm?9dYf}J!FA{HuhicO?w*jz(2ANH4E2gOzC zW0R#jPv&rG>ovXf+QpG6-BR6EWJt%ZfU zOi+@7taizbCg6VZ@&JGp6LX}A8s=&!%zUmyT|?GVV%NI-CB&eWkad(1(|iLagMrtE zI@PjG5POjGY?3n2QWMRtNjzC;@Dx*JXL`~>tgKAqBrs$*`xUe*v-9b~LK9)@;S%!e zR)-B_qHHMSU-IwZXi;P(utWaIr;1!)mB?CB+#MKb1OSfZ!%l0mFye+i4Q!|a0fFG4 zRCzr;Q^`NuDL;cQt}+k{^_T@A8#B2;G&|T@?ou*WbL|ly`jvmxmf7f-lD6~dJmybI zI2@^OX`IZ<@U_E&O}qbKT$Y^9-~Anp;+K;I(ok4vAgc)%cI4Ax(O9Eh6j&RSNoej_y-o?+IECjGCd6?iQ91TZYA{+M-#-3ck5YRs~xZX+7s*u$X62<4u9wl z*1iFlV8ahc6am!fS&l6Tm5H@Q0yX}5eGWtnpo!nHP1?xX@jg*MtaPU6Pyo$J(!ez9 z7?f6=o1}0D8!v8dwPa;k%3!Cd4Bo8x?5XS|;7vw95w=V72^!0Xy4% zylH}*ugg$J`Ib%N7_{}y=E9plx3p{UQDuH}KqT;p%JkC7_cupSSyn8wMU~aEZcF{9u66EYRq-YFcDmmN39tW|0qEFUCNcls*N~Ek_&X} zY3HcGUGl%xwC^$CUVad9Pi2@CDzj1k+_*Gi5mg7Fe9vUpy!iGcz7DVRsR%z%!=D(5Uwi5LNCPYb96WMvNbnOjgfA}}5taKsBPaFUD zN8Qq(R;l^;ExW(A`Wl%Ei&8m|{4{340}DKFsxp;m7P4L!EN>20aM{;0x`3iE@ z#|@^vP*aB(N|UH-T3!zwJ}sL5;w)3;h;lA`?jxdUskdd^i3OhE_Eg>R5>b+iOqQo& z9_!zchXm{bb;iM7Ar=g1M+ve z0V*FlZJ+dWn{&flmAtN#$y~te*T2b|#A%zU2bFnyl zy#t^;RAsDlE(2K`^V6rU=tuLqC3N=%18`VzsKY*Afn# zoH}VO^H^b$s$(O(YtldmR61SRI3y`KDfa(WY*Vd)9%f}_dj71Pa(se+Az864#H}#B zXl_N_mDtlE^$khET+`{(87uwuQ(~|MrA_aD8QYN~ez-~E znDk}3fwBqCz4~e@wXs9k@PW+Oe);$7x0%_QkCPe6a{!_1IEzINf<{Ht-F;%x*vdb1 zAdPM5?KDm6fbqWivfgv}hSdL}2>s`m?x_ARiZGb-UlhURYQ->_v7H+4zk2EJpX>zs zqRrPT@0B^9H}x5~R`uW#=l>F0@?!gJpt0uh6<&AhBG;zNV^z=ip_-BfYB3yaVAwU?qTbji$yHBf_k)pT$b?^TY+c7sB*!>TTy9g)% literal 0 HcmV?d00001 diff --git a/test/examples/booleans/equal/test/false/linear-rings.geojson b/test/examples/booleans/equal/test/false/linear-rings.geojson new file mode 100644 index 00000000..a0809033 --- /dev/null +++ b/test/examples/booleans/equal/test/false/linear-rings.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.674866943359375, 28.30135788537988], + [-53.337249755859375, 28.47412369059679], + [-53.524017333984375, 28.17492820114568], + [-53.674866943359375, 28.30135788537988] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-55.674866943359375, 28.30135788537988], + [-55.337249755859375, 28.47412369059679], + [-55.524017333984375, 28.17492820114568], + [-55.674866943359375, 28.30135788537988] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/false/lines.geojson b/test/examples/booleans/equal/test/false/lines.geojson new file mode 100644 index 00000000..1ba5e7fb --- /dev/null +++ b/test/examples/booleans/equal/test/false/lines.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [0, 5], + [5, 5], + [5, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 0], + [1, 5], + [6, 5], + [6, 0] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/false/multipoints.geojson b/test/examples/booleans/equal/test/false/multipoints.geojson new file mode 100644 index 00000000..a3a50a8f --- /dev/null +++ b/test/examples/booleans/equal/test/false/multipoints.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.5638671875, 27.254629577800063], + [-35.6462646484375, 26.86328062676624], + [-35, 26], + [-35.1001953125, 26.12091815959972], + [-34.8969482421875, 26.455820238459893] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.5638671875, 27.254629577800063], + [-35.6462646484375, 26.86328062676624], + [-35.4924560546875, 26.504988828743404], + [-35.1001953125, 26.12091815959972], + [-34.8969482421875, 26.455820238459893] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/false/points.geojson b/test/examples/booleans/equal/test/false/points.geojson new file mode 100644 index 00000000..9bb831e0 --- /dev/null +++ b/test/examples/booleans/equal/test/false/points.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 0] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/false/polygons.geojson b/test/examples/booleans/equal/test/false/polygons.geojson new file mode 100644 index 00000000..55e49e19 --- /dev/null +++ b/test/examples/booleans/equal/test/false/polygons.geojson @@ -0,0 +1,35 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53, 28.287451910503744], + [-53.33038330078125, 28.29228897739706], + [-53.34136962890625, 28.430052892335723], + [-53, 28.287451910503744] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.57208251953125, 28.287451910503744], + [-53.33038330078125, 28.29228897739706], + [-53.34136962890625, 28.430052892335723], + [-53.57208251953125, 28.287451910503744] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/false/precision-default.geojson b/test/examples/booleans/equal/test/false/precision-default.geojson new file mode 100644 index 00000000..7f793b80 --- /dev/null +++ b/test/examples/booleans/equal/test/false/precision-default.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0.123456, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0.123451, 0] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/false/precision-options.geojson b/test/examples/booleans/equal/test/false/precision-options.geojson new file mode 100644 index 00000000..fcb8ee25 --- /dev/null +++ b/test/examples/booleans/equal/test/false/precision-options.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "properties": { + "precision": 17 + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0.12345678901234561, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0.12345678901234564, 0] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/different-initials-poly.geojson b/test/examples/booleans/equal/test/true/different-initials-poly.geojson new file mode 100644 index 00000000..929e7f6b --- /dev/null +++ b/test/examples/booleans/equal/test/true/different-initials-poly.geojson @@ -0,0 +1,63 @@ +{ + "type": "FeatureCollection", + "properties": { + "precision": 6, + "shiftedPolygon": true, + "direction": false + }, + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 1, + 1 + ], + [ + 1, + 0 + ], + [ + 0, + 0 + ], + [ + 1, + 1 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 0, + 0 + ], + [ + 1, + 1 + ], + [ + 1, + 0 + ], + [ + 0, + 0 + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/booleans/equal/test/true/linear-rings.geojson b/test/examples/booleans/equal/test/true/linear-rings.geojson new file mode 100644 index 00000000..67dfae71 --- /dev/null +++ b/test/examples/booleans/equal/test/true/linear-rings.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.674866943359375, 28.30135788537988], + [-53.337249755859375, 28.47412369059679], + [-53.524017333984375, 28.17492820114568], + [-53.674866943359375, 28.30135788537988] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.674866943359375, 28.30135788537988], + [-53.337249755859375, 28.47412369059679], + [-53.524017333984375, 28.17492820114568], + [-53.674866943359375, 28.30135788537988] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/lines-extra-vertices.geojson b/test/examples/booleans/equal/test/true/lines-extra-vertices.geojson new file mode 100644 index 00000000..51a06197 --- /dev/null +++ b/test/examples/booleans/equal/test/true/lines-extra-vertices.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [2, 2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [1, 1], + [2, 2] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/lines-reverse.geojson b/test/examples/booleans/equal/test/true/lines-reverse.geojson new file mode 100644 index 00000000..9aa67775 --- /dev/null +++ b/test/examples/booleans/equal/test/true/lines-reverse.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 2], + [1, 1], + [0, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [1, 1], + [2, 2] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/lines.geojson b/test/examples/booleans/equal/test/true/lines.geojson new file mode 100644 index 00000000..8bd4188d --- /dev/null +++ b/test/examples/booleans/equal/test/true/lines.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [0, 5], + [5, 5], + [5, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [0, 5], + [5, 5], + [5, 0] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/multipoints.geojson b/test/examples/booleans/equal/test/true/multipoints.geojson new file mode 100644 index 00000000..22aa40ad --- /dev/null +++ b/test/examples/booleans/equal/test/true/multipoints.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.5638671875, 27.254629577800063], + [-35.6462646484375, 26.86328062676624], + [-35.4924560546875, 26.504988828743404], + [-35.1001953125, 26.12091815959972], + [-34.8969482421875, 26.455820238459893] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.5638671875, 27.254629577800063], + [-35.6462646484375, 26.86328062676624], + [-35.4924560546875, 26.504988828743404], + [-35.1001953125, 26.12091815959972], + [-34.8969482421875, 26.455820238459893] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/points.geojson b/test/examples/booleans/equal/test/true/points.geojson new file mode 100644 index 00000000..15b60d6f --- /dev/null +++ b/test/examples/booleans/equal/test/true/points.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/polygons.geojson b/test/examples/booleans/equal/test/true/polygons.geojson new file mode 100644 index 00000000..b6077107 --- /dev/null +++ b/test/examples/booleans/equal/test/true/polygons.geojson @@ -0,0 +1,35 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.57208251953125, 28.287451910503744], + [-53.33038330078125, 28.29228897739706], + [-53.34136962890625, 28.430052892335723], + [-53.57208251953125, 28.287451910503744] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.57208251953125, 28.287451910503744], + [-53.33038330078125, 28.29228897739706], + [-53.34136962890625, 28.430052892335723], + [-53.57208251953125, 28.287451910503744] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/precision-default.geojson b/test/examples/booleans/equal/test/true/precision-default.geojson new file mode 100644 index 00000000..cca64ff4 --- /dev/null +++ b/test/examples/booleans/equal/test/true/precision-default.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0.1234567, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0.1234569, 0] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/precision-options.geojson b/test/examples/booleans/equal/test/true/precision-options.geojson new file mode 100644 index 00000000..5e5ab8dd --- /dev/null +++ b/test/examples/booleans/equal/test/true/precision-options.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "properties": { + "precision": 16 + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0.12345678901234567, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0.12345678901234569, 0] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/reverse-lines.geojson b/test/examples/booleans/equal/test/true/reverse-lines.geojson new file mode 100644 index 00000000..4c6e1810 --- /dev/null +++ b/test/examples/booleans/equal/test/true/reverse-lines.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [0, 5], + [5, 5], + [5, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [5, 0], + [5, 5], + [0, 5], + [0, 0] + ] + } + } + ] +} diff --git a/test/examples/booleans/equal/test/true/reverse-polygons.geojson b/test/examples/booleans/equal/test/true/reverse-polygons.geojson new file mode 100644 index 00000000..8c7530df --- /dev/null +++ b/test/examples/booleans/equal/test/true/reverse-polygons.geojson @@ -0,0 +1,64 @@ +{ + "type": "FeatureCollection", + "properties": { + "precision": 6, + "shiftedPolygon": true, + "direction": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -53.57, + 28.28 + ], + [ + -53.33, + 28.29 + ], + [ + -53.34, + 28.43 + ], + [ + -53.57, + 28.28 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -53.57, + 28.28 + ], + [ + -53.34, + 28.43 + ], + [ + -53.33, + 28.29 + ], + [ + -53.57, + 28.28 + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/test/examples/booleans/intersects/false/LineString/LineString/LineString-LineString.geojson b/test/examples/booleans/intersects/false/LineString/LineString/LineString-LineString.geojson new file mode 100644 index 00000000..6c774ab5 --- /dev/null +++ b/test/examples/booleans/intersects/false/LineString/LineString/LineString-LineString.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [12, 2], + [12, 3], + [12, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/LineString/Point/LineString-Point.geojson b/test/examples/booleans/intersects/false/LineString/Point/LineString-Point.geojson new file mode 100644 index 00000000..e327ba98 --- /dev/null +++ b/test/examples/booleans/intersects/false/LineString/Point/LineString-Point.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/LineString/Polygon/LineString-Polygon.geojson b/test/examples/booleans/intersects/false/LineString/Polygon/LineString-Polygon.geojson new file mode 100644 index 00000000..d34e7dce --- /dev/null +++ b/test/examples/booleans/intersects/false/LineString/Polygon/LineString-Polygon.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [12, 2], + [12, 3], + [12, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/MultiPoint/LineString/MultiPoint-LineString.geojson b/test/examples/booleans/intersects/false/MultiPoint/LineString/MultiPoint-LineString.geojson new file mode 100644 index 00000000..77b1b718 --- /dev/null +++ b/test/examples/booleans/intersects/false/MultiPoint/LineString/MultiPoint-LineString.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2, 2], + [0, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson b/test/examples/booleans/intersects/false/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson new file mode 100644 index 00000000..7e3143af --- /dev/null +++ b/test/examples/booleans/intersects/false/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [0, 0], + [13, 13] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/MultiPoint/Point/MultiPoint-Point.geojson b/test/examples/booleans/intersects/false/MultiPoint/Point/MultiPoint-Point.geojson new file mode 100644 index 00000000..eb6182a3 --- /dev/null +++ b/test/examples/booleans/intersects/false/MultiPoint/Point/MultiPoint-Point.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/MultiPoint/Polygon/MultiPoint-Polygon.geojson b/test/examples/booleans/intersects/false/MultiPoint/Polygon/MultiPoint-Polygon.geojson new file mode 100644 index 00000000..469de623 --- /dev/null +++ b/test/examples/booleans/intersects/false/MultiPoint/Polygon/MultiPoint-Polygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-3, -3], + [-2, -2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson b/test/examples/booleans/intersects/false/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson new file mode 100644 index 00000000..3b2ea41f --- /dev/null +++ b/test/examples/booleans/intersects/false/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#ff0000" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.6953125, -19.186677697957833], + [128.759765625, -19.186677697957833], + [128.759765625, -15.28418511407642], + [122.6953125, -15.28418511407642], + [122.6953125, -19.186677697957833] + ] + ], + [ + [ + [123.74999999999999, -25.918526162075153], + [130.25390625, -25.918526162075153], + [130.25390625, -20.715015145512087], + [123.74999999999999, -20.715015145512087], + [123.74999999999999, -25.918526162075153] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#0000ff" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [116.98242187499999, -24.647017162630352], + [122.87109375, -24.647017162630352], + [122.87109375, -20.34462694382967], + [116.98242187499999, -20.34462694382967], + [116.98242187499999, -24.647017162630352] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/Point/LineString/Point-LineString.geojson b/test/examples/booleans/intersects/false/Point/LineString/Point-LineString.geojson new file mode 100644 index 00000000..be635169 --- /dev/null +++ b/test/examples/booleans/intersects/false/Point/LineString/Point-LineString.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/Point/MultiPoint/Point-Multipoint.geojson b/test/examples/booleans/intersects/false/Point/MultiPoint/Point-Multipoint.geojson new file mode 100644 index 00000000..542362e8 --- /dev/null +++ b/test/examples/booleans/intersects/false/Point/MultiPoint/Point-Multipoint.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/Point/Point/Point-Point.geojson b/test/examples/booleans/intersects/false/Point/Point/Point-Point.geojson new file mode 100644 index 00000000..6d022c5e --- /dev/null +++ b/test/examples/booleans/intersects/false/Point/Point/Point-Point.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 1] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/Point/Polygon/Point-Polygon.geojson b/test/examples/booleans/intersects/false/Point/Polygon/Point-Polygon.geojson new file mode 100644 index 00000000..c3d4c6de --- /dev/null +++ b/test/examples/booleans/intersects/false/Point/Polygon/Point-Polygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/Polygon/LineString/Polygon-LineString.geojson b/test/examples/booleans/intersects/false/Polygon/LineString/Polygon-LineString.geojson new file mode 100644 index 00000000..52b4a494 --- /dev/null +++ b/test/examples/booleans/intersects/false/Polygon/LineString/Polygon-LineString.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [12, 2], + [12, 3], + [12, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson b/test/examples/booleans/intersects/false/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson new file mode 100644 index 00000000..d165d17b --- /dev/null +++ b/test/examples/booleans/intersects/false/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#0000ff" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [116.98242187499999, -24.647017162630352], + [122.87109375, -24.647017162630352], + [122.87109375, -20.34462694382967], + [116.98242187499999, -20.34462694382967], + [116.98242187499999, -24.647017162630352] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#ff0000" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.6953125, -19.186677697957833], + [128.759765625, -19.186677697957833], + [128.759765625, -15.28418511407642], + [122.6953125, -15.28418511407642], + [122.6953125, -19.186677697957833] + ] + ], + [ + [ + [123.74999999999999, -25.918526162075153], + [130.25390625, -25.918526162075153], + [130.25390625, -20.715015145512087], + [123.74999999999999, -20.715015145512087], + [123.74999999999999, -25.918526162075153] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/Polygon/Point/Polygon-Point.geojson b/test/examples/booleans/intersects/false/Polygon/Point/Polygon-Point.geojson new file mode 100644 index 00000000..557d45be --- /dev/null +++ b/test/examples/booleans/intersects/false/Polygon/Point/Polygon-Point.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + } + ] +} diff --git a/test/examples/booleans/intersects/false/Polygon/Polygon/Polygon-Polygon.geojson b/test/examples/booleans/intersects/false/Polygon/Polygon/Polygon-Polygon.geojson new file mode 100644 index 00000000..66d7ab57 --- /dev/null +++ b/test/examples/booleans/intersects/false/Polygon/Polygon/Polygon-Polygon.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-11, -12], + [-13, -12], + [-13, -13], + [-11, -13], + [-11, -12] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/LineString/LineString/LineString-LineString.geojson b/test/examples/booleans/intersects/true/LineString/LineString/LineString-LineString.geojson new file mode 100644 index 00000000..5ad6f986 --- /dev/null +++ b/test/examples/booleans/intersects/true/LineString/LineString/LineString-LineString.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 2], + [12, 2], + [12, 3], + [12, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/LineString/Point/LineString-Point-1.geojson b/test/examples/booleans/intersects/true/LineString/Point/LineString-Point-1.geojson new file mode 100644 index 00000000..39e7953d --- /dev/null +++ b/test/examples/booleans/intersects/true/LineString/Point/LineString-Point-1.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/LineString/Point/LineString-Point-2.geojson b/test/examples/booleans/intersects/true/LineString/Point/LineString-Point-2.geojson new file mode 100644 index 00000000..323ca4e1 --- /dev/null +++ b/test/examples/booleans/intersects/true/LineString/Point/LineString-Point-2.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1.5] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/LineString/Polygon/LineString-In-Polygon.geojson b/test/examples/booleans/intersects/true/LineString/Polygon/LineString-In-Polygon.geojson new file mode 100644 index 00000000..62d55b65 --- /dev/null +++ b/test/examples/booleans/intersects/true/LineString/Polygon/LineString-In-Polygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2.5], + [2, 2.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/LineString/Polygon/LineString-Polygon.geojson b/test/examples/booleans/intersects/true/LineString/Polygon/LineString-Polygon.geojson new file mode 100644 index 00000000..be2b9688 --- /dev/null +++ b/test/examples/booleans/intersects/true/LineString/Polygon/LineString-Polygon.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 2], + [12, 2], + [12, 3], + [12, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/MultiPoint/LineString/MultiPoint-LineString.geojson b/test/examples/booleans/intersects/true/MultiPoint/LineString/MultiPoint-LineString.geojson new file mode 100644 index 00000000..f7bc3dd8 --- /dev/null +++ b/test/examples/booleans/intersects/true/MultiPoint/LineString/MultiPoint-LineString.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [0, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson b/test/examples/booleans/intersects/true/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson new file mode 100644 index 00000000..85a8e2cd --- /dev/null +++ b/test/examples/booleans/intersects/true/MultiPoint/MultiPoint/MultiPoint-MultiPoint.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [0, 0], + [12, 12] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/MultiPoint/Polygon/MultiPoint-Polygon.geojson b/test/examples/booleans/intersects/true/MultiPoint/Polygon/MultiPoint-Polygon.geojson new file mode 100644 index 00000000..da402f37 --- /dev/null +++ b/test/examples/booleans/intersects/true/MultiPoint/Polygon/MultiPoint-Polygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-1, 2], + [-2, -2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson b/test/examples/booleans/intersects/true/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson new file mode 100644 index 00000000..706074d3 --- /dev/null +++ b/test/examples/booleans/intersects/true/MultiPolygon/Polygon/MultiPolygon-Polygon.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#ff0000" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.6953125, -19.186677697957833], + [128.759765625, -19.186677697957833], + [128.759765625, -15.28418511407642], + [122.6953125, -15.28418511407642], + [122.6953125, -19.186677697957833] + ] + ], + [ + [ + [123.74999999999999, -25.918526162075153], + [130.25390625, -25.918526162075153], + [130.25390625, -20.715015145512087], + [123.74999999999999, -20.715015145512087], + [123.74999999999999, -25.918526162075153] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#0000ff" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [119.20166015624999, -22.776181505086495], + [125.09033203124999, -22.776181505086495], + [125.09033203124999, -18.417078658661257], + [119.20166015624999, -18.417078658661257], + [119.20166015624999, -22.776181505086495] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-1.geojson b/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-1.geojson new file mode 100644 index 00000000..b84728a8 --- /dev/null +++ b/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-1.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-2.geojson b/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-2.geojson new file mode 100644 index 00000000..a937db0c --- /dev/null +++ b/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-2.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-3.geojson b/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-3.geojson new file mode 100644 index 00000000..46d35691 --- /dev/null +++ b/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-3.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2.5, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [2, 1], + [3, 1], + [4, 1] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-4.geojson b/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-4.geojson new file mode 100644 index 00000000..cf348f68 --- /dev/null +++ b/test/examples/booleans/intersects/true/Point/LineString/Point-LineString-4.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2.5, 2.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [2, 2], + [3, 3], + [4, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Point/MultiPoint/Point-MultiPoint.geojson b/test/examples/booleans/intersects/true/Point/MultiPoint/Point-MultiPoint.geojson new file mode 100644 index 00000000..f958a470 --- /dev/null +++ b/test/examples/booleans/intersects/true/Point/MultiPoint/Point-MultiPoint.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Point/Point/Point-Point.geojson b/test/examples/booleans/intersects/true/Point/Point/Point-Point.geojson new file mode 100644 index 00000000..15b60d6f --- /dev/null +++ b/test/examples/booleans/intersects/true/Point/Point/Point-Point.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Point/Polygon/Point-Polygon-1.geojson b/test/examples/booleans/intersects/true/Point/Polygon/Point-Polygon-1.geojson new file mode 100644 index 00000000..5ef704e8 --- /dev/null +++ b/test/examples/booleans/intersects/true/Point/Polygon/Point-Polygon-1.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 2.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Point/Polygon/Point-Polygon-2.geojson b/test/examples/booleans/intersects/true/Point/Polygon/Point-Polygon-2.geojson new file mode 100644 index 00000000..b3a139a5 --- /dev/null +++ b/test/examples/booleans/intersects/true/Point/Polygon/Point-Polygon-2.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-1, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Polygon/LineString/Polygon-Containing-Linestring.geojson b/test/examples/booleans/intersects/true/Polygon/LineString/Polygon-Containing-Linestring.geojson new file mode 100644 index 00000000..a840dc09 --- /dev/null +++ b/test/examples/booleans/intersects/true/Polygon/LineString/Polygon-Containing-Linestring.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2.5], + [2, 2.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Polygon/LineString/Polygon-LineString.geojson b/test/examples/booleans/intersects/true/Polygon/LineString/Polygon-LineString.geojson new file mode 100644 index 00000000..83323524 --- /dev/null +++ b/test/examples/booleans/intersects/true/Polygon/LineString/Polygon-LineString.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 2], + [12, 2], + [12, 3], + [12, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson b/test/examples/booleans/intersects/true/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson new file mode 100644 index 00000000..59b2a579 --- /dev/null +++ b/test/examples/booleans/intersects/true/Polygon/MultiPolygon/Polygon-MultiPolygon.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#0000ff" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [119.20166015624999, -22.776181505086495], + [125.09033203124999, -22.776181505086495], + [125.09033203124999, -18.417078658661257], + [119.20166015624999, -18.417078658661257], + [119.20166015624999, -22.776181505086495] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#ff0000" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.6953125, -19.186677697957833], + [128.759765625, -19.186677697957833], + [128.759765625, -15.28418511407642], + [122.6953125, -15.28418511407642], + [122.6953125, -19.186677697957833] + ] + ], + [ + [ + [123.74999999999999, -25.918526162075153], + [130.25390625, -25.918526162075153], + [130.25390625, -20.715015145512087], + [123.74999999999999, -20.715015145512087], + [123.74999999999999, -25.918526162075153] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Polygon/Point/Polygon-Point.geojson b/test/examples/booleans/intersects/true/Polygon/Point/Polygon-Point.geojson new file mode 100644 index 00000000..c2131b4a --- /dev/null +++ b/test/examples/booleans/intersects/true/Polygon/Point/Polygon-Point.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 2.5] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Polygon/Polygon/Large-Inside-Small.geojson b/test/examples/booleans/intersects/true/Polygon/Polygon/Large-Inside-Small.geojson new file mode 100644 index 00000000..9a52b0dd --- /dev/null +++ b/test/examples/booleans/intersects/true/Polygon/Polygon/Large-Inside-Small.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.6875, 34.016241889667015], + [14.765625, 26.745610382199022], + [19.6875, 23.563987128451217], + [23.203125, 26.43122806450644], + [22.148437499999996, 30.44867367928756], + [19.6875, 34.016241889667015] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [18.984375, 40.44694705960048], + [7.03125, 25.48295117535531], + [19.335937499999996, 18.979025953255267], + [31.640625, 24.206889622398023], + [24.960937499999996, 34.88593094075317], + [18.984375, 40.44694705960048] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Polygon/Polygon/Polygon-Polygon.geojson b/test/examples/booleans/intersects/true/Polygon/Polygon/Polygon-Polygon.geojson new file mode 100644 index 00000000..70b69b88 --- /dev/null +++ b/test/examples/booleans/intersects/true/Polygon/Polygon/Polygon-Polygon.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [-13, -12], + [-13, -13], + [-11, -13], + [-1, 2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-1, 2], + [3, 2], + [3, 3], + [-1, 3], + [-1, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Polygon/Polygon/Small-Inside-Large.geojson b/test/examples/booleans/intersects/true/Polygon/Polygon/Small-Inside-Large.geojson new file mode 100644 index 00000000..15e635f5 --- /dev/null +++ b/test/examples/booleans/intersects/true/Polygon/Polygon/Small-Inside-Large.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [18.984375, 40.44694705960048], + [7.03125, 25.48295117535531], + [19.335937499999996, 18.979025953255267], + [31.640625, 24.206889622398023], + [24.960937499999996, 34.88593094075317], + [18.984375, 40.44694705960048] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.6875, 34.016241889667015], + [14.765625, 26.745610382199022], + [19.6875, 23.563987128451217], + [23.203125, 26.43122806450644], + [22.148437499999996, 30.44867367928756], + [19.6875, 34.016241889667015] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/intersects/true/Polygon/Polygon/issue-1216.geojson b/test/examples/booleans/intersects/true/Polygon/Polygon/issue-1216.geojson new file mode 100644 index 00000000..41157c99 --- /dev/null +++ b/test/examples/booleans/intersects/true/Polygon/Polygon/issue-1216.geojson @@ -0,0 +1,49 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [6.638240782825051, 46.513552354874435], + [6.638240782825051, 46.52452567471025], + [6.632039186485088, 46.52452567471025], + [6.632039186485088, 46.513552354874435], + [6.638240782825051, 46.513552354874435] + ] + ] + }, + "bbox": [ + 6.632039186485088, + 46.513552354874435, + 6.638240782825051, + 46.52452567471025 + ] + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [6.645459572232596, 46.51709747623775], + [6.645459572232596, 46.52102619404951], + [6.626132904233913, 46.52102619404951], + [6.626132904233913, 46.51709747623775], + [6.645459572232596, 46.51709747623775] + ] + ] + }, + "bbox": [ + 6.626132904233913, + 46.51709747623775, + 6.645459572232596, + 46.52102619404951 + ] + } + ] +} diff --git a/test/examples/booleans/overlap/false/equal-linear-rings.geojson b/test/examples/booleans/overlap/false/equal-linear-rings.geojson new file mode 100644 index 00000000..67dfae71 --- /dev/null +++ b/test/examples/booleans/overlap/false/equal-linear-rings.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.674866943359375, 28.30135788537988], + [-53.337249755859375, 28.47412369059679], + [-53.524017333984375, 28.17492820114568], + [-53.674866943359375, 28.30135788537988] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.674866943359375, 28.30135788537988], + [-53.337249755859375, 28.47412369059679], + [-53.524017333984375, 28.17492820114568], + [-53.674866943359375, 28.30135788537988] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/false/equal-lines.geojson b/test/examples/booleans/overlap/false/equal-lines.geojson new file mode 100644 index 00000000..4c6e1810 --- /dev/null +++ b/test/examples/booleans/overlap/false/equal-lines.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [0, 5], + [5, 5], + [5, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [5, 0], + [5, 5], + [0, 5], + [0, 0] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/false/equal-multipoints.geojson b/test/examples/booleans/overlap/false/equal-multipoints.geojson new file mode 100644 index 00000000..22aa40ad --- /dev/null +++ b/test/examples/booleans/overlap/false/equal-multipoints.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.5638671875, 27.254629577800063], + [-35.6462646484375, 26.86328062676624], + [-35.4924560546875, 26.504988828743404], + [-35.1001953125, 26.12091815959972], + [-34.8969482421875, 26.455820238459893] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.5638671875, 27.254629577800063], + [-35.6462646484375, 26.86328062676624], + [-35.4924560546875, 26.504988828743404], + [-35.1001953125, 26.12091815959972], + [-34.8969482421875, 26.455820238459893] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/false/equal-polygons.geojson b/test/examples/booleans/overlap/false/equal-polygons.geojson new file mode 100644 index 00000000..9c89e6c9 --- /dev/null +++ b/test/examples/booleans/overlap/false/equal-polygons.geojson @@ -0,0 +1,35 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.57208251953125, 28.287451910503744], + [-53.33038330078125, 28.29228897739706], + [-53.34136962890625, 28.430052892335723], + [-53.57208251953125, 28.287451910503744] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.57208251953125, 28.287451910503744], + [-53.34136962890625, 28.430052892335723], + [-53.33038330078125, 28.29228897739706], + [-53.57208251953125, 28.287451910503744] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/false/linear-rings.geojson b/test/examples/booleans/overlap/false/linear-rings.geojson new file mode 100644 index 00000000..edbb4bb9 --- /dev/null +++ b/test/examples/booleans/overlap/false/linear-rings.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.317337036132805, 28.445147699510212], + [-53.61053466796875, 28.263868062633772], + [-53.3770751953125, 28.214869548073377], + [-53.38531494140625, 28.272939391283685], + [-53.22052001953125, 28.272939391283685], + [-53.317337036132805, 28.445147699510212] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.674866943359375, 28.30135788537988], + [-53.337249755859375, 28.47412369059679], + [-53.524017333984375, 28.17492820114568], + [-53.674866943359375, 28.30135788537988] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/false/lines.geojson b/test/examples/booleans/overlap/false/lines.geojson new file mode 100644 index 00000000..c3414c3c --- /dev/null +++ b/test/examples/booleans/overlap/false/lines.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-22.564544677734375, 46.25917013377904], + [-22.559051513671875, 46.32369743336783], + [-22.446441650390625, 46.352141192009334], + [-22.361297607421875, 46.32891323009468], + [-22.361297607421875, 46.30472670751783] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-22.570724487304688, 46.36398839132818], + [-22.444381713867188, 46.357354276167015], + [-22.391510009765625, 46.3291502999477], + [-22.29263305664062, 46.382464893261165] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/false/multipoints.geojson b/test/examples/booleans/overlap/false/multipoints.geojson new file mode 100644 index 00000000..c9c919be --- /dev/null +++ b/test/examples/booleans/overlap/false/multipoints.geojson @@ -0,0 +1,36 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-36.05712890625, 26.480407161007275], + [-35.7220458984375, 27.137368359795584], + [-35.13427734375, 26.83387451505858], + [-35.4638671875, 27.254629577800063], + [-35.5462646484375, 26.86328062676624], + [-35.3924560546875, 26.504988828743404] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-color": "#000" + }, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.5638671875, 27.254629577800063], + [-35.6462646484375, 26.86328062676624], + [-35.4924560546875, 26.504988828743404], + [-35.1001953125, 26.12091815959972], + [-34.8969482421875, 26.455820238459893] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/false/polygon-with-hole-polygon.geojson b/test/examples/booleans/overlap/false/polygon-with-hole-polygon.geojson new file mode 100644 index 00000000..81e21b7f --- /dev/null +++ b/test/examples/booleans/overlap/false/polygon-with-hole-polygon.geojson @@ -0,0 +1,45 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-37.81494140625, 30.050076521698735], + [-36.573486328125, 28.159189634046708], + [-34.20043945312499, 29.23847708592805], + [-34.44213867187499, 31.090574094954192], + [-36.507568359375, 32.045332838858506], + [-37.81494140625, 30.050076521698735] + ], + [ + [-36.661376953125, 29.516110386062277], + [-36.661376953125, 30.685163937659564], + [-35.233154296875, 30.685163937659564], + [-35.233154296875, 29.516110386062277], + [-36.661376953125, 29.516110386062277] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-34.903564453125, 31.99875937194732], + [-33.387451171875, 31.700129553985924], + [-33.310546875, 33.165145408240285], + [-35.39794921875, 32.89803818160521], + [-34.903564453125, 31.99875937194732] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/false/polygons.geojson b/test/examples/booleans/overlap/false/polygons.geojson new file mode 100644 index 00000000..15dda991 --- /dev/null +++ b/test/examples/booleans/overlap/false/polygons.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.51715087890625, 28.488005204159457], + [-53.47148895263672, 28.366933295392897], + [-53.3770751953125, 28.490419194161678], + [-53.24798583984375, 28.43246820620096], + [-53.33038330078125, 28.560400880492832], + [-53.51715087890625, 28.488005204159457] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.57208251953125, 28.287451910503744], + [-53.33038330078125, 28.29228897739706], + [-53.34136962890625, 28.430052892335723], + [-53.57208251953125, 28.287451910503744] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/true/linear-rings.geojson b/test/examples/booleans/overlap/true/linear-rings.geojson new file mode 100644 index 00000000..41593df0 --- /dev/null +++ b/test/examples/booleans/overlap/true/linear-rings.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.317337036132805, 28.445147699510212], + [-53.61053466796875, 28.263868062633772], + [-53.3770751953125, 28.214869548073377], + [-53.38531494140625, 28.272939391283685], + [-53.22052001953125, 28.272939391283685], + [-53.317337036132805, 28.445147699510212] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-53.61053466796875, 28.263868062633772], + [-53.317337036132805, 28.445147699510212], + [-53.524017333984375, 28.17492820114568], + [-53.61053466796875, 28.263868062633772] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/true/lines.geojson b/test/examples/booleans/overlap/true/lines.geojson new file mode 100644 index 00000000..30df9540 --- /dev/null +++ b/test/examples/booleans/overlap/true/lines.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-22.564544677734375, 46.25917013377904], + [-22.559051513671875, 46.32369743336783], + [-22.446441650390625, 46.352141192009334], + [-22.361297607421875, 46.32891323009468], + [-22.361297607421875, 46.30472670751783] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-22.570724487304688, 46.36398839132818], + [-22.446441650390625, 46.352141192009334], + [-22.361297607421875, 46.32891323009468], + [-22.29263305664062, 46.382464893261165] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/true/multipoints.geojson b/test/examples/booleans/overlap/true/multipoints.geojson new file mode 100644 index 00000000..0155fa84 --- /dev/null +++ b/test/examples/booleans/overlap/true/multipoints.geojson @@ -0,0 +1,36 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-36.05712890625, 26.480407161007275], + [-35.7220458984375, 27.137368359795584], + [-35.13427734375, 26.83387451505858], + [-35.4638671875, 27.254629577800063], + [-35.5462646484375, 26.86328062676624], + [-35.3924560546875, 26.504988828743404] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-color": "#000" + }, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.4638671875, 27.254629577800063], + [-35.5462646484375, 26.86328062676624], + [-35.3924560546875, 26.504988828743404], + [-35.2001953125, 26.12091815959972], + [-34.9969482421875, 26.455820238459893] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/true/polygon-with-hole-polygon.geojson b/test/examples/booleans/overlap/true/polygon-with-hole-polygon.geojson new file mode 100644 index 00000000..557f7310 --- /dev/null +++ b/test/examples/booleans/overlap/true/polygon-with-hole-polygon.geojson @@ -0,0 +1,44 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-37.81494140625, 30.050076521698735], + [-36.573486328125, 28.159189634046708], + [-34.20043945312499, 29.23847708592805], + [-34.44213867187499, 31.090574094954192], + [-36.507568359375, 32.045332838858506], + [-37.81494140625, 30.050076521698735] + ], + [ + [-36.661376953125, 29.516110386062277], + [-36.661376953125, 30.685163937659564], + [-35.233154296875, 30.685163937659564], + [-35.233154296875, 29.516110386062277], + [-36.661376953125, 29.516110386062277] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-35.980224609375, 30.315987718557867], + [-34.8486328125, 30.694611546632277], + [-35.782470703125, 31.16580958786196], + [-35.980224609375, 30.315987718557867] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/true/polygons.geojson b/test/examples/booleans/overlap/true/polygons.geojson new file mode 100644 index 00000000..e28e427b --- /dev/null +++ b/test/examples/booleans/overlap/true/polygons.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.51715087890625, 28.488005204159457], + [-53.33038330078125, 28.560400880492832], + [-53.24798583984375, 28.43246820620096], + [-53.3770751953125, 28.490419194161678], + [-53.4100341796875, 28.34789944257093], + [-53.51715087890625, 28.488005204159457] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-53.57208251953125, 28.287451910503744], + [-53.34136962890625, 28.430052892335723], + [-53.33038330078125, 28.29228897739706], + [-53.57208251953125, 28.287451910503744] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/true/simple-lines.geojson b/test/examples/booleans/overlap/true/simple-lines.geojson new file mode 100644 index 00000000..591d9494 --- /dev/null +++ b/test/examples/booleans/overlap/true/simple-lines.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [0, 5], + [5, 5], + [5, 0] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 5], + [5, 5], + [5, 10] + ] + } + } + ] +} diff --git a/test/examples/booleans/overlap/true/single-multipoints.geojson b/test/examples/booleans/overlap/true/single-multipoints.geojson new file mode 100644 index 00000000..c187d80f --- /dev/null +++ b/test/examples/booleans/overlap/true/single-multipoints.geojson @@ -0,0 +1,36 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-36.05712890625, 26.480407161007275], + [-35.7220458984375, 27.137368359795584], + [-35.13427734375, 26.83387451505858], + [-35.4638671875, 27.254629577800063], + [-35.5462646484375, 26.86328062676624], + [-35.3924560546875, 26.504988828743404] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-color": "#000" + }, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [-35.4638671875, 27.254629577800063], + [-35.6462646484375, 26.86328062676624], + [-35.4924560546875, 26.504988828743404], + [-35.1001953125, 26.12091815959972], + [-34.8969482421875, 26.455820238459893] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/false/line1.geojson b/test/examples/booleans/parallel/false/line1.geojson new file mode 100644 index 00000000..c1ba4219 --- /dev/null +++ b/test/examples/booleans/parallel/false/line1.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-111.544189453125, 24.186847428521244], + [-110.687255859375, 24.966140159912975], + [-110.4510498046875, 24.467150664739002], + [-109.9951171875, 25.180087808990645] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-111.4617919921875, 24.05148034322011], + [-110.8795166015625, 24.681961205014595], + [-110.841064453125, 24.14174098050432], + [-109.97863769531249, 24.617057340809524] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/false/line2.geojson b/test/examples/booleans/parallel/false/line2.geojson new file mode 100644 index 00000000..29de05c1 --- /dev/null +++ b/test/examples/booleans/parallel/false/line2.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-34.98046875, 29.38217507514529], + [30.937499999999996, 59.085738569819505], + [-10.01953125, 60.84491057364912], + [25.6640625, 67.60922060496382], + [-4.5703125, 34.59704151614417] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-27.24609375, 51.508742458803326], + [24.43359375, 48.22467264956519], + [49.92187499999999, 65.2198939361321] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/city-line.geojson b/test/examples/booleans/parallel/true/city-line.geojson new file mode 100644 index 00000000..92c2b642 --- /dev/null +++ b/test/examples/booleans/parallel/true/city-line.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [9.170356, 45.477985], + [9.164434, 45.482551], + [9.166644, 45.484003] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [9.169356, 45.477985], + [9.163434, 45.482551], + [9.165644, 45.484003] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/fiji.geojson b/test/examples/booleans/parallel/true/fiji.geojson new file mode 100644 index 00000000..0ac4ed6b --- /dev/null +++ b/test/examples/booleans/parallel/true/fiji.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-180.2911376953125, -17.07253857905758], + [-179.73358154296875, -17.203769821917533], + [-179.55780029296872, -17.463332719132794], + [-179.296875, -17.460712710429785] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-180.7911376953125, -17.07253857905758], + [-180.23358154296875, -17.203769821917533], + [-180.05780029296872, -17.463332719132794], + [-179.796875, -17.460712710429785] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/line1.geojson b/test/examples/booleans/parallel/true/line1.geojson new file mode 100644 index 00000000..66795584 --- /dev/null +++ b/test/examples/booleans/parallel/true/line1.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-68.3349609375, 18.203262019544418], + [-67.7142333984375, 18.94266018631978], + [-66.412353515625, 18.588982352118453], + [-66.181640625, 19.19186565046399] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-68.8349609375, 18.203262019544418], + [-68.2142333984375, 18.94266018631978], + [-66.912353515625, 18.588982352118453], + [-66.681640625, 19.19186565046399] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/line3-reverse.geojson b/test/examples/booleans/parallel/true/line3-reverse.geojson new file mode 100644 index 00000000..aad47272 --- /dev/null +++ b/test/examples/booleans/parallel/true/line3-reverse.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-74.4798388671875, 15.235164824060707], + [-74.01978637695312, 15.566159129772904], + [-73.95798828125, 15.425881893976563] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-74.4598388671875, 15.235164824060707], + [-73.99978637695312, 15.566159129772904], + [-73.93798828125, 15.425881893976563], + [-73.795166015625, 15.681220930466825], + [-73.71002197265624, 15.551606490799015] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/line3.geojson b/test/examples/booleans/parallel/true/line3.geojson new file mode 100644 index 00000000..5f85af9c --- /dev/null +++ b/test/examples/booleans/parallel/true/line3.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-74.4598388671875, 15.235164824060707], + [-73.99978637695312, 15.566159129772904], + [-73.93798828125, 15.425881893976563], + [-73.795166015625, 15.681220930466825], + [-73.71002197265624, 15.551606490799015] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-74.4798388671875, 15.235164824060707], + [-74.01978637695312, 15.566159129772904], + [-73.95798828125, 15.425881893976563] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/resolute.geojson b/test/examples/booleans/parallel/true/resolute.geojson new file mode 100644 index 00000000..6b271052 --- /dev/null +++ b/test/examples/booleans/parallel/true/resolute.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-89.82421875, 70.22974449563027], + [-83.056640625, 75.75894014501688], + [-64.3359375, 72.36910450725075] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-88.52421875, 70.22974449563027], + [-81.756640625, 75.75894014501688], + [-63.0359375, 72.36910450725075] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/segment1.geojson b/test/examples/booleans/parallel/true/segment1.geojson new file mode 100644 index 00000000..332d9b70 --- /dev/null +++ b/test/examples/booleans/parallel/true/segment1.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-2, -5], + [-2, 2] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, -4.5], + [-0, 1] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/segment2.geojson b/test/examples/booleans/parallel/true/segment2.geojson new file mode 100644 index 00000000..4450db2d --- /dev/null +++ b/test/examples/booleans/parallel/true/segment2.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-96.591796875, 34.161818161230386], + [-94.4384765625, 35.496456056584165] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-94.591796875, 34.161818161230386], + [-92.4384765625, 35.496456056584165] + ] + } + } + ] +} diff --git a/test/examples/booleans/parallel/true/segment3.geojson b/test/examples/booleans/parallel/true/segment3.geojson new file mode 100644 index 00000000..cef1bdcc --- /dev/null +++ b/test/examples/booleans/parallel/true/segment3.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-86, 11.4], + [-80, 11.4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-88, 11], + [-81, 11] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_in_polygon/in/multipoly-with-hole.geojson b/test/examples/booleans/point_in_polygon/in/multipoly-with-hole.geojson new file mode 100644 index 00000000..e1119a52 --- /dev/null +++ b/test/examples/booleans/point_in_polygon/in/multipoly-with-hole.geojson @@ -0,0 +1,43 @@ +{ + "type": "Feature", + "properties": {}, + "bbox": [ + -86.77362442016602, + 36.170862616662134, + -86.67303085327148, + 36.23084281427824 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-86.76624298095703, 36.171278341935434], + [-86.77362442016602, 36.2014818084173], + [-86.74100875854492, 36.19607929145354], + [-86.74238204956055, 36.170862616662134], + [-86.76624298095703, 36.171278341935434] + ] + ], + [ + [ + [-86.70478820800781, 36.23084281427824], + [-86.73980712890625, 36.21062368007896], + [-86.71371459960938, 36.173495506147], + [-86.67526245117186, 36.17709826419592], + [-86.67303085327148, 36.20910010895552], + [-86.68041229248047, 36.230427405208005], + [-86.70478820800781, 36.23084281427824] + ], + [ + [-86.6934585571289, 36.217271643303604], + [-86.71268463134766, 36.20771501855801], + [-86.70238494873047, 36.19067640168397], + [-86.68487548828125, 36.19691047217554], + [-86.68264389038086, 36.20993115142727], + [-86.6934585571289, 36.217271643303604] + ] + ] + ] + } +} diff --git a/test/examples/booleans/point_in_polygon/in/poly-with-hole.geojson b/test/examples/booleans/point_in_polygon/in/poly-with-hole.geojson new file mode 100644 index 00000000..1f730433 --- /dev/null +++ b/test/examples/booleans/point_in_polygon/in/poly-with-hole.geojson @@ -0,0 +1,32 @@ +{ + "type": "Feature", + "properties": {}, + "bbox": [ + -86.73980712890625, + 36.173495506147, + -86.67303085327148, + 36.23084281427824 + ], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-86.70478820800781, 36.23084281427824], + [-86.73980712890625, 36.21062368007896], + [-86.71371459960938, 36.173495506147], + [-86.67526245117186, 36.17709826419592], + [-86.67303085327148, 36.20910010895552], + [-86.68041229248047, 36.230427405208005], + [-86.70478820800781, 36.23084281427824] + ], + [ + [-86.6934585571289, 36.217271643303604], + [-86.71268463134766, 36.20771501855801], + [-86.70238494873047, 36.19067640168397], + [-86.68487548828125, 36.19691047217554], + [-86.68264389038086, 36.20993115142727], + [-86.6934585571289, 36.217271643303604] + ] + ] + } +} diff --git a/test/examples/booleans/point_on_line/false/LineWithOnly1SegmentIgnoreBoundary.geojson b/test/examples/booleans/point_on_line/false/LineWithOnly1SegmentIgnoreBoundary.geojson new file mode 100644 index 00000000..a251cc5c --- /dev/null +++ b/test/examples/booleans/point_on_line/false/LineWithOnly1SegmentIgnoreBoundary.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/false/LineWithOnly1SegmentIgnoreBoundaryEnd.geojson b/test/examples/booleans/point_on_line/false/LineWithOnly1SegmentIgnoreBoundaryEnd.geojson new file mode 100644 index 00000000..2965824b --- /dev/null +++ b/test/examples/booleans/point_on_line/false/LineWithOnly1SegmentIgnoreBoundaryEnd.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [3, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/false/PointIsOnLineButFailsWithSmallEpsilonValue.geojson b/test/examples/booleans/point_on_line/false/PointIsOnLineButFailsWithSmallEpsilonValue.geojson new file mode 100644 index 00000000..1fe3749b --- /dev/null +++ b/test/examples/booleans/point_on_line/false/PointIsOnLineButFailsWithSmallEpsilonValue.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "properties": { + "epsilon": 10e-18 + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-75.25737143565107, 39.99673377198139] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-75.2580499870244, 40.00180204907801], + [-75.25676601413157, 39.992211720827044] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/false/PointIsOnLineButFailsWithoutEpsilonForBackwardsCompatibility.geojson b/test/examples/booleans/point_on_line/false/PointIsOnLineButFailsWithoutEpsilonForBackwardsCompatibility.geojson new file mode 100644 index 00000000..5ce33ec9 --- /dev/null +++ b/test/examples/booleans/point_on_line/false/PointIsOnLineButFailsWithoutEpsilonForBackwardsCompatibility.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-75.25737143565107, 39.99673377198139] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-75.2580499870244, 40.00180204907801], + [-75.25676601413157, 39.992211720827044] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/false/PointOnEndFailsWhenIgnoreEndpoints.geojson b/test/examples/booleans/point_on_line/false/PointOnEndFailsWhenIgnoreEndpoints.geojson new file mode 100644 index 00000000..6b996e24 --- /dev/null +++ b/test/examples/booleans/point_on_line/false/PointOnEndFailsWhenIgnoreEndpoints.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [38.3203125, 5.965753671065536] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [38.3203125, 5.965753671065536] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/false/PointOnStartFailsWhenIgnoreEndpoints.geojson b/test/examples/booleans/point_on_line/false/PointOnStartFailsWhenIgnoreEndpoints.geojson new file mode 100644 index 00000000..740ac876 --- /dev/null +++ b/test/examples/booleans/point_on_line/false/PointOnStartFailsWhenIgnoreEndpoints.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [38.3203125, 5.965753671065536] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/false/notOnLine.geojson b/test/examples/booleans/point_on_line/false/notOnLine.geojson new file mode 100644 index 00000000..e2a8d61d --- /dev/null +++ b/test/examples/booleans/point_on_line/false/notOnLine.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [20, 20] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [38.3203125, 5.965753671065536] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/LineWithOnly1Segment.geojson b/test/examples/booleans/point_on_line/true/LineWithOnly1Segment.geojson new file mode 100644 index 00000000..770d4223 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/LineWithOnly1Segment.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/LineWithOnly1SegmentOnStart.geojson b/test/examples/booleans/point_on_line/true/LineWithOnly1SegmentOnStart.geojson new file mode 100644 index 00000000..71722f50 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/LineWithOnly1SegmentOnStart.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/PointOnFirstSegment.geojson b/test/examples/booleans/point_on_line/true/PointOnFirstSegment.geojson new file mode 100644 index 00000000..2a5e2ab5 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/PointOnFirstSegment.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [4, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/PointOnLastSegment.geojson b/test/examples/booleans/point_on_line/true/PointOnLastSegment.geojson new file mode 100644 index 00000000..813768e5 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/PointOnLastSegment.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [3.5, 3.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [4, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/PointOnLineEnd.geojson b/test/examples/booleans/point_on_line/true/PointOnLineEnd.geojson new file mode 100644 index 00000000..b7641931 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/PointOnLineEnd.geojson @@ -0,0 +1,25 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [38.3203125, 5.965753671065536] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [38.3203125, 5.965753671065536] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/PointOnLineMidVertice.geojson b/test/examples/booleans/point_on_line/true/PointOnLineMidVertice.geojson new file mode 100644 index 00000000..742ef612 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/PointOnLineMidVertice.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "properties": { + "ignoreEndVertices": true + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [3, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [38.3203125, 5.965753671065536] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/PointOnLineMidpoint.geojson b/test/examples/booleans/point_on_line/true/PointOnLineMidpoint.geojson new file mode 100644 index 00000000..7ff17253 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/PointOnLineMidpoint.geojson @@ -0,0 +1,25 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [38.3203125, 5.965753671065536] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/PointOnLineStart.geojson b/test/examples/booleans/point_on_line/true/PointOnLineStart.geojson new file mode 100644 index 00000000..23c60455 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/PointOnLineStart.geojson @@ -0,0 +1,25 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [3, 3], + [38.3203125, 5.965753671065536] + ] + } + } + ] +} diff --git a/test/examples/booleans/point_on_line/true/PointOnLineWithEpsilon.geojson b/test/examples/booleans/point_on_line/true/PointOnLineWithEpsilon.geojson new file mode 100644 index 00000000..0a32c869 --- /dev/null +++ b/test/examples/booleans/point_on_line/true/PointOnLineWithEpsilon.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "properties": { + "epsilon": 10e-17 + }, + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-75.25737143565107, 39.99673377198139] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-75.2580499870244, 40.00180204907801], + [-75.25676601413157, 39.992211720827044] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/LineString/LinesExactSame.geojson b/test/examples/booleans/touches/false/LineString/LineString/LinesExactSame.geojson new file mode 100644 index 00000000..034737ba --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/LineString/LinesExactSame.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/LineString/LivesOverlap.geojson b/test/examples/booleans/touches/false/LineString/LineString/LivesOverlap.geojson new file mode 100644 index 00000000..28c41a8c --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/LineString/LivesOverlap.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 15.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/MultiLineString/LineStringOverlapsMultiLinestring.geojson b/test/examples/booleans/touches/false/LineString/MultiLineString/LineStringOverlapsMultiLinestring.geojson new file mode 100644 index 00000000..84ce32e2 --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/MultiLineString/LineStringOverlapsMultiLinestring.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 2], + [2, 3] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/MultiLineString/LineStringSameAsMultiLinestring.geojson b/test/examples/booleans/touches/false/LineString/MultiLineString/LineStringSameAsMultiLinestring.geojson new file mode 100644 index 00000000..ff778d80 --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/MultiLineString/LineStringSameAsMultiLinestring.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/MultiPoint/LineStringDoesNotTouchMP.geojson b/test/examples/booleans/touches/false/LineString/MultiPoint/LineStringDoesNotTouchMP.geojson new file mode 100644 index 00000000..37944a21 --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/MultiPoint/LineStringDoesNotTouchMP.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [3, 1], + [3, 3] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/MultiPoint/LineStringTouchesMultiPointButInternal.geojson b/test/examples/booleans/touches/false/LineString/MultiPoint/LineStringTouchesMultiPointButInternal.geojson new file mode 100644 index 00000000..40b6b18e --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/MultiPoint/LineStringTouchesMultiPointButInternal.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 3] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/MultiPolygon/LineDoesNotTouchMultiPoly.geojson b/test/examples/booleans/touches/false/LineString/MultiPolygon/LineDoesNotTouchMultiPoly.geojson new file mode 100644 index 00000000..da9b4343 --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/MultiPolygon/LineDoesNotTouchMultiPoly.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-1, 1], + [-1, 0.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/Polygon/LineCrossesPolygon.geojson b/test/examples/booleans/touches/false/LineString/Polygon/LineCrossesPolygon.geojson new file mode 100644 index 00000000..309de922 --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/Polygon/LineCrossesPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 0], + [11, 11] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/Polygon/LineDoesNotTouch.geojson b/test/examples/booleans/touches/false/LineString/Polygon/LineDoesNotTouch.geojson new file mode 100644 index 00000000..61f427a4 --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/Polygon/LineDoesNotTouch.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-1, -2], + [-1, -3] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/LineString/Polygon/LineWIthinPolygon.geojson b/test/examples/booleans/touches/false/LineString/Polygon/LineWIthinPolygon.geojson new file mode 100644 index 00000000..a3016cea --- /dev/null +++ b/test/examples/booleans/touches/false/LineString/Polygon/LineWIthinPolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [3, 3] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/LineString/MultiLineStringOverlapsLine.geojson b/test/examples/booleans/touches/false/MultiLineString/LineString/MultiLineStringOverlapsLine.geojson new file mode 100644 index 00000000..4762791f --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/LineString/MultiLineStringOverlapsLine.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 2], + [2, 3] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/LineString/MultiLineStringSameAsLine.geojson b/test/examples/booleans/touches/false/MultiLineString/LineString/MultiLineStringSameAsLine.geojson new file mode 100644 index 00000000..33a233eb --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/LineString/MultiLineStringSameAsLine.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/MultiLineString/MultiLineStringsOverlap.geojson b/test/examples/booleans/touches/false/MultiLineString/MultiLineString/MultiLineStringsOverlap.geojson new file mode 100644 index 00000000..467852d0 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/MultiLineString/MultiLineStringsOverlap.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [2, 2], + [2, 3] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/MultiLineString/MultiLineStringsSame.geojson b/test/examples/booleans/touches/false/MultiLineString/MultiLineString/MultiLineStringsSame.geojson new file mode 100644 index 00000000..eafdeba7 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/MultiLineString/MultiLineStringsSame.geojson @@ -0,0 +1,41 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/MultiPoint/MpTouchesInternalMultiline.geojson b/test/examples/booleans/touches/false/MultiLineString/MultiPoint/MpTouchesInternalMultiline.geojson new file mode 100644 index 00000000..ee8fd090 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/MultiPoint/MpTouchesInternalMultiline.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 2], + [10, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/MultiPoint/MultiPointNotTouchMultiline.geojson b/test/examples/booleans/touches/false/MultiLineString/MultiPoint/MultiPointNotTouchMultiline.geojson new file mode 100644 index 00000000..d87e3d98 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/MultiPoint/MultiPointNotTouchMultiline.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [12, 4], + [10, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/MultiPolygon/MultiLineInsideMultipoly.geojson b/test/examples/booleans/touches/false/MultiLineString/MultiPolygon/MultiLineInsideMultipoly.geojson new file mode 100644 index 00000000..4055d523 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/MultiPolygon/MultiLineInsideMultipoly.geojson @@ -0,0 +1,53 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/Point/PointNotTouchMultiLinestring.geojson b/test/examples/booleans/touches/false/MultiLineString/Point/PointNotTouchMultiLinestring.geojson new file mode 100644 index 00000000..04206d7d --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/Point/PointNotTouchMultiLinestring.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 3] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/Point/PointTouchesMidLineString.geojson b/test/examples/booleans/touches/false/MultiLineString/Point/PointTouchesMidLineString.geojson new file mode 100644 index 00000000..66298cf0 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/Point/PointTouchesMidLineString.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [10, 4] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/Polygon/MultiLineInsidePoly.geojson b/test/examples/booleans/touches/false/MultiLineString/Polygon/MultiLineInsidePoly.geojson new file mode 100644 index 00000000..a1ccee6d --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/Polygon/MultiLineInsidePoly.geojson @@ -0,0 +1,42 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiLineString/Polygon/MultiLineNotTouchPoly.geojson b/test/examples/booleans/touches/false/MultiLineString/Polygon/MultiLineNotTouchPoly.geojson new file mode 100644 index 00000000..a9cefb6a --- /dev/null +++ b/test/examples/booleans/touches/false/MultiLineString/Polygon/MultiLineNotTouchPoly.geojson @@ -0,0 +1,42 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [10, 10], + [10, 100], + [100, 100], + [100, 10], + [10, 10] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPoint/LineString/MultiPointTouchesInsideLine.geojson b/test/examples/booleans/touches/false/MultiPoint/LineString/MultiPointTouchesInsideLine.geojson new file mode 100644 index 00000000..d9d3b811 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPoint/LineString/MultiPointTouchesInsideLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 3] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPoint/LineString/MultipointDoesNotTouchLine.geojson b/test/examples/booleans/touches/false/MultiPoint/LineString/MultipointDoesNotTouchLine.geojson new file mode 100644 index 00000000..18791af1 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPoint/LineString/MultipointDoesNotTouchLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [3, 1], + [3, 3] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPoint/MultiLineString/MpDoesNotTouchMultiLine.geojson b/test/examples/booleans/touches/false/MultiPoint/MultiLineString/MpDoesNotTouchMultiLine.geojson new file mode 100644 index 00000000..fdd34da3 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPoint/MultiLineString/MpDoesNotTouchMultiLine.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [12, 4], + [10, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPoint/MultiLineString/MpTouchesInternalMultiLine.geojson b/test/examples/booleans/touches/false/MultiPoint/MultiLineString/MpTouchesInternalMultiLine.geojson new file mode 100644 index 00000000..0fc73013 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPoint/MultiLineString/MpTouchesInternalMultiLine.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 2], + [10, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPoint/MultiPolygon/MultiPointDoesNotTouchMultipolygon b/test/examples/booleans/touches/false/MultiPoint/MultiPolygon/MultiPointDoesNotTouchMultipolygon new file mode 100644 index 00000000..5b136d62 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPoint/MultiPolygon/MultiPointDoesNotTouchMultipolygon @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [[10, 14], [-14, -14]] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [[[1, 1], [1, 10], [10, 10], [10, 1], [1, 1]]], + [[[-1, -1], [-1, -10], [-10, -10], [-10, -1], [-1, -1]]] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPoint/MultiPolygon/multipoint-inside-multipolygon.geojson b/test/examples/booleans/touches/false/MultiPoint/MultiPolygon/multipoint-inside-multipolygon.geojson new file mode 100644 index 00000000..7cd0e752 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPoint/MultiPolygon/multipoint-inside-multipolygon.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [4, 4], + [-14, -14] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPoint/Polygon/MultiPointInsidePolygon.geojson b/test/examples/booleans/touches/false/MultiPoint/Polygon/MultiPointInsidePolygon.geojson new file mode 100644 index 00000000..372d60e6 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPoint/Polygon/MultiPointInsidePolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2, 2], + [12, 12], + [15, 15] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPoint/Polygon/MultiPointNoTouchPolygon.geojson b/test/examples/booleans/touches/false/MultiPoint/Polygon/MultiPointNoTouchPolygon.geojson new file mode 100644 index 00000000..f4f285fe --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPoint/Polygon/MultiPointNoTouchPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [0, 0], + [0, 10] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPolygon/LineString/MultiPolyNotTouchLineString.geojson b/test/examples/booleans/touches/false/MultiPolygon/LineString/MultiPolyNotTouchLineString.geojson new file mode 100644 index 00000000..e1f631c7 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPolygon/LineString/MultiPolyNotTouchLineString.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-1, 1], + [-1, 0.5] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPolygon/MultiLineString/MultiPolyOverlapsMultiLine.geojson b/test/examples/booleans/touches/false/MultiPolygon/MultiLineString/MultiPolyOverlapsMultiLine.geojson new file mode 100644 index 00000000..9ff6575e --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPolygon/MultiLineString/MultiPolyOverlapsMultiLine.geojson @@ -0,0 +1,53 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPolygon/MultiPoint/MultiPolyNotTouchMultiPoint.geojson b/test/examples/booleans/touches/false/MultiPolygon/MultiPoint/MultiPolyNotTouchMultiPoint.geojson new file mode 100644 index 00000000..98da507a --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPolygon/MultiPoint/MultiPolyNotTouchMultiPoint.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [10, 14], + [-14, -14] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPolygon/MultiPolygon/MultiPolysDoNotTouch.geojson b/test/examples/booleans/touches/false/MultiPolygon/MultiPolygon/MultiPolysDoNotTouch.geojson new file mode 100644 index 00000000..e5beeadc --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPolygon/MultiPolygon/MultiPolysDoNotTouch.geojson @@ -0,0 +1,50 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ], + [ + [ + [30, 30], + [30, 40], + [40, 40], + [40, 30], + [30, 30] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [9, 9], + [10, 1], + [1, 1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPolygon/MultiPolygon/MultiPolysOverlap.geojson b/test/examples/booleans/touches/false/MultiPolygon/MultiPolygon/MultiPolysOverlap.geojson new file mode 100644 index 00000000..6356e151 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPolygon/MultiPolygon/MultiPolysOverlap.geojson @@ -0,0 +1,50 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ], + [ + [ + [30, 30], + [30, 40], + [40, 40], + [40, 30], + [30, 30] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10.5, 10.5], + [10, 1], + [1, 1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/MultiPolygon/Point/MultiPolyNotTouchPoint.geojson b/test/examples/booleans/touches/false/MultiPolygon/Point/MultiPolyNotTouchPoint.geojson new file mode 100644 index 00000000..c75f0b05 --- /dev/null +++ b/test/examples/booleans/touches/false/MultiPolygon/Point/MultiPolyNotTouchPoint.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [14, 14] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Point/LineString/PointIsNotTouchLine.geojson b/test/examples/booleans/touches/false/Point/LineString/PointIsNotTouchLine.geojson new file mode 100644 index 00000000..e7595525 --- /dev/null +++ b/test/examples/booleans/touches/false/Point/LineString/PointIsNotTouchLine.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Point/LineString/PointOnMidLinestring.geojson b/test/examples/booleans/touches/false/Point/LineString/PointOnMidLinestring.geojson new file mode 100644 index 00000000..8cb3cc42 --- /dev/null +++ b/test/examples/booleans/touches/false/Point/LineString/PointOnMidLinestring.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Point/MultiLineString/MpNotTouchMidLineString.geojson b/test/examples/booleans/touches/false/Point/MultiLineString/MpNotTouchMidLineString.geojson new file mode 100644 index 00000000..9fbb963a --- /dev/null +++ b/test/examples/booleans/touches/false/Point/MultiLineString/MpNotTouchMidLineString.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [10, 4] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Point/MultiLineString/MpOnMidLineString.geojson b/test/examples/booleans/touches/false/Point/MultiLineString/MpOnMidLineString.geojson new file mode 100644 index 00000000..95061da0 --- /dev/null +++ b/test/examples/booleans/touches/false/Point/MultiLineString/MpOnMidLineString.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 3] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Point/MultiPolygon/PointNotTouchMultipolygon.geojson b/test/examples/booleans/touches/false/Point/MultiPolygon/PointNotTouchMultipolygon.geojson new file mode 100644 index 00000000..30c016b8 --- /dev/null +++ b/test/examples/booleans/touches/false/Point/MultiPolygon/PointNotTouchMultipolygon.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [14, 14] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Point/Polygon/PointDoesNotTouchPolygon.geojson b/test/examples/booleans/touches/false/Point/Polygon/PointDoesNotTouchPolygon.geojson new file mode 100644 index 00000000..3bc20282 --- /dev/null +++ b/test/examples/booleans/touches/false/Point/Polygon/PointDoesNotTouchPolygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [14, 14] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Point/Polygon/PointInsidePolygon.geojson b/test/examples/booleans/touches/false/Point/Polygon/PointInsidePolygon.geojson new file mode 100644 index 00000000..0c44d959 --- /dev/null +++ b/test/examples/booleans/touches/false/Point/Polygon/PointInsidePolygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/LineString/PolyDoesNotTouchLine.geojson b/test/examples/booleans/touches/false/Polygon/LineString/PolyDoesNotTouchLine.geojson new file mode 100644 index 00000000..61f427a4 --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/LineString/PolyDoesNotTouchLine.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-1, -2], + [-1, -3] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/MultiLineString/PolyNotTouchMultiLine.geojson b/test/examples/booleans/touches/false/Polygon/MultiLineString/PolyNotTouchMultiLine.geojson new file mode 100644 index 00000000..0b8f2663 --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/MultiLineString/PolyNotTouchMultiLine.geojson @@ -0,0 +1,42 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [10, 10], + [10, 100], + [100, 100], + [100, 10], + [10, 10] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/MultiLineString/PolyOverlapMultiLine.geojson b/test/examples/booleans/touches/false/Polygon/MultiLineString/PolyOverlapMultiLine.geojson new file mode 100644 index 00000000..ff74557d --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/MultiLineString/PolyOverlapMultiLine.geojson @@ -0,0 +1,42 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/MultiPoint/PolygonNoTouchMultiPoint.geojson b/test/examples/booleans/touches/false/Polygon/MultiPoint/PolygonNoTouchMultiPoint.geojson new file mode 100644 index 00000000..e379ce6d --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/MultiPoint/PolygonNoTouchMultiPoint.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [0, 0], + [0, 10] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/MultiPoint/PolygonOverlapsMultiPoint.geojson b/test/examples/booleans/touches/false/Polygon/MultiPoint/PolygonOverlapsMultiPoint.geojson new file mode 100644 index 00000000..5b7479c1 --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/MultiPoint/PolygonOverlapsMultiPoint.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2, 2], + [12, 12], + [15, 15] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/MultiPolygon/PolyNotTouchMultipoly.geojson b/test/examples/booleans/touches/false/Polygon/MultiPolygon/PolyNotTouchMultipoly.geojson new file mode 100644 index 00000000..4ed0783e --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/MultiPolygon/PolyNotTouchMultipoly.geojson @@ -0,0 +1,48 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [9, 9], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ], + [ + [ + [30, 30], + [30, 40], + [40, 40], + [40, 30], + [30, 30] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/Point/PolygonDoesNotTouchPoint.geojson b/test/examples/booleans/touches/false/Polygon/Point/PolygonDoesNotTouchPoint.geojson new file mode 100644 index 00000000..09bb41c7 --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/Point/PolygonDoesNotTouchPoint.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [14, 14] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/Point/PolygonOverlapsPoint.geojson b/test/examples/booleans/touches/false/Polygon/Point/PolygonOverlapsPoint.geojson new file mode 100644 index 00000000..b945b8e0 --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/Point/PolygonOverlapsPoint.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 2] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/Polygon/PolygonsDontTouch.geojson b/test/examples/booleans/touches/false/Polygon/Polygon/PolygonsDontTouch.geojson new file mode 100644 index 00000000..87fbbcaa --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/Polygon/PolygonsDontTouch.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [9, 9], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/false/Polygon/Polygon/PolygonsOverlap.geojson b/test/examples/booleans/touches/false/Polygon/Polygon/PolygonsOverlap.geojson new file mode 100644 index 00000000..8dc49f37 --- /dev/null +++ b/test/examples/booleans/touches/false/Polygon/Polygon/PolygonsOverlap.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [11, 11], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/LineString/LineString/LineTouchesEndpoint.geojson b/test/examples/booleans/touches/true/LineString/LineString/LineTouchesEndpoint.geojson new file mode 100644 index 00000000..45927008 --- /dev/null +++ b/test/examples/booleans/touches/true/LineString/LineString/LineTouchesEndpoint.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 3], + [1, 4], + [1, 5] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/LineString/MultiLineString/LineStringTouchesEnd.geojson b/test/examples/booleans/touches/true/LineString/MultiLineString/LineStringTouchesEnd.geojson new file mode 100644 index 00000000..78fcf8fa --- /dev/null +++ b/test/examples/booleans/touches/true/LineString/MultiLineString/LineStringTouchesEnd.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 5], + [2, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/LineString/MultiLineString/LineStringTouchesStart.geojson b/test/examples/booleans/touches/true/LineString/MultiLineString/LineStringTouchesStart.geojson new file mode 100644 index 00000000..8ef6dd51 --- /dev/null +++ b/test/examples/booleans/touches/true/LineString/MultiLineString/LineStringTouchesStart.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 1], + [1, 1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/LineString/MultiPoint/MultipointTouchesLine.geojson b/test/examples/booleans/touches/true/LineString/MultiPoint/MultipointTouchesLine.geojson new file mode 100644 index 00000000..496c3bf6 --- /dev/null +++ b/test/examples/booleans/touches/true/LineString/MultiPoint/MultipointTouchesLine.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/LineString/MultiPolygon/LineTouchesMultiPoly.geojson b/test/examples/booleans/touches/true/LineString/MultiPolygon/LineTouchesMultiPoly.geojson new file mode 100644 index 00000000..046fcafe --- /dev/null +++ b/test/examples/booleans/touches/true/LineString/MultiPolygon/LineTouchesMultiPoly.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 1], + [1, 1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/LineString/MultiPolygon/LineTouchesSecondMultiPoly.geojson b/test/examples/booleans/touches/true/LineString/MultiPolygon/LineTouchesSecondMultiPoly.geojson new file mode 100644 index 00000000..77d19417 --- /dev/null +++ b/test/examples/booleans/touches/true/LineString/MultiPolygon/LineTouchesSecondMultiPoly.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-1, 1], + [-1, -1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/LineString/Polygon/LineTouchesPolygon.geojson b/test/examples/booleans/touches/true/LineString/Polygon/LineTouchesPolygon.geojson new file mode 100644 index 00000000..8d3a846f --- /dev/null +++ b/test/examples/booleans/touches/true/LineString/Polygon/LineTouchesPolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [1, 1], + [1, 5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiLineString/LineString/MultiLineTouchesLine.geojson b/test/examples/booleans/touches/true/MultiLineString/LineString/MultiLineTouchesLine.geojson new file mode 100644 index 00000000..1f9b3972 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiLineString/LineString/MultiLineTouchesLine.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 0], + [2, 1] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiLineString/MultiLineString/MultiLineTouchesMultiLine.geojson b/test/examples/booleans/touches/true/MultiLineString/MultiLineString/MultiLineTouchesMultiLine.geojson new file mode 100644 index 00000000..a7c9aef8 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiLineString/MultiLineString/MultiLineTouchesMultiLine.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [12, 10], + [12, 11] + ], + [ + [2, 0], + [2, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiLineString/MultiPoint/MultiLineTouchesMultiPoint.geojson b/test/examples/booleans/touches/true/MultiLineString/MultiPoint/MultiLineTouchesMultiPoint.geojson new file mode 100644 index 00000000..8ad24fa8 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiLineString/MultiPoint/MultiLineTouchesMultiPoint.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [10, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiLineString/Point/MultiLineTouchesPoint.geojson b/test/examples/booleans/touches/true/MultiLineString/Point/MultiLineTouchesPoint.geojson new file mode 100644 index 00000000..2be13eb2 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiLineString/Point/MultiLineTouchesPoint.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 4] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiLineString/Polygon/MultiLineTouchesPolygon.geojson b/test/examples/booleans/touches/true/MultiLineString/Polygon/MultiLineTouchesPolygon.geojson new file mode 100644 index 00000000..58348118 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiLineString/Polygon/MultiLineTouchesPolygon.geojson @@ -0,0 +1,42 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, -1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, -1], + [1, -10], + [10, -10], + [10, -1], + [1, -1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPoint/LineString/MultipointTouchesLine.geojson b/test/examples/booleans/touches/true/MultiPoint/LineString/MultipointTouchesLine.geojson new file mode 100644 index 00000000..83c5eccf --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPoint/LineString/MultipointTouchesLine.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPoint/MultiLineString/MpTouchesEndMultiLine.geojson b/test/examples/booleans/touches/true/MultiPoint/MultiLineString/MpTouchesEndMultiLine.geojson new file mode 100644 index 00000000..faca8c6f --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPoint/MultiLineString/MpTouchesEndMultiLine.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 4], + [10, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPoint/MultiLineString/MpTouchesSecondMultiLine.geojson b/test/examples/booleans/touches/true/MultiPoint/MultiLineString/MpTouchesSecondMultiLine.geojson new file mode 100644 index 00000000..6e07deb3 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPoint/MultiLineString/MpTouchesSecondMultiLine.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2, 4], + [10, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPoint/MultiPolygon/multipoint-touches-multipolygon.geojson b/test/examples/booleans/touches/true/MultiPoint/MultiPolygon/multipoint-touches-multipolygon.geojson new file mode 100644 index 00000000..5192bd0f --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPoint/MultiPolygon/multipoint-touches-multipolygon.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [-1, -1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPoint/Polygon/MultiPointIsWithinPolygon.geojson b/test/examples/booleans/touches/true/MultiPoint/Polygon/MultiPointIsWithinPolygon.geojson new file mode 100644 index 00000000..b45ca953 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPoint/Polygon/MultiPointIsWithinPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [14, 14] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPolygon/MultiLineString/MultiLineTouchesMultiPoly.geojson b/test/examples/booleans/touches/true/MultiPolygon/MultiLineString/MultiLineTouchesMultiPoly.geojson new file mode 100644 index 00000000..b6864333 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPolygon/MultiLineString/MultiLineTouchesMultiPoly.geojson @@ -0,0 +1,53 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [20, -2], + [20, -20], + [40, -20], + [40, -2], + [20, -2] + ] + ], + [ + [ + [1, -1], + [1, -10], + [10, -10], + [10, -1], + [1, -1] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, -1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPolygon/MultiPoint/MultiPolyTouchesMultiPoint.geojson b/test/examples/booleans/touches/true/MultiPolygon/MultiPoint/MultiPolyTouchesMultiPoint.geojson new file mode 100644 index 00000000..d89beb30 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPolygon/MultiPoint/MultiPolyTouchesMultiPoint.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [14, 14] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPolygon/MultiPolygon/MultiPolyTouchesMultiPoly.geojson b/test/examples/booleans/touches/true/MultiPolygon/MultiPolygon/MultiPolyTouchesMultiPoly.geojson new file mode 100644 index 00000000..c6b54130 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPolygon/MultiPolygon/MultiPolyTouchesMultiPoly.geojson @@ -0,0 +1,50 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ], + [ + [ + [30, 30], + [30, 40], + [40, 40], + [40, 30], + [30, 30] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 11], + [10, 1], + [1, 1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPolygon/Point/MpTouchesPoint.geojson b/test/examples/booleans/touches/true/MultiPolygon/Point/MpTouchesPoint.geojson new file mode 100644 index 00000000..90c6f586 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPolygon/Point/MpTouchesPoint.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 5] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/MultiPolygon/Polygon/MultiPolyTouchesPoly.geojson b/test/examples/booleans/touches/true/MultiPolygon/Polygon/MultiPolyTouchesPoly.geojson new file mode 100644 index 00000000..3a18ef22 --- /dev/null +++ b/test/examples/booleans/touches/true/MultiPolygon/Polygon/MultiPolyTouchesPoly.geojson @@ -0,0 +1,48 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ], + [ + [ + [30, 30], + [30, 40], + [40, 40], + [40, 30], + [30, 30] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 11], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/LineString/PointOnEndLine.geojson b/test/examples/booleans/touches/true/Point/LineString/PointOnEndLine.geojson new file mode 100644 index 00000000..b30df470 --- /dev/null +++ b/test/examples/booleans/touches/true/Point/LineString/PointOnEndLine.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 4] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/LineString/PointOnStartLine.geojson b/test/examples/booleans/touches/true/Point/LineString/PointOnStartLine.geojson new file mode 100644 index 00000000..b84728a8 --- /dev/null +++ b/test/examples/booleans/touches/true/Point/LineString/PointOnStartLine.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/MultiLineString/MpOnEndLine.geojson b/test/examples/booleans/touches/true/Point/MultiLineString/MpOnEndLine.geojson new file mode 100644 index 00000000..58dbf02b --- /dev/null +++ b/test/examples/booleans/touches/true/Point/MultiLineString/MpOnEndLine.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 4] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/MultiLineString/MpOnStartLine.geojson b/test/examples/booleans/touches/true/Point/MultiLineString/MpOnStartLine.geojson new file mode 100644 index 00000000..34c52729 --- /dev/null +++ b/test/examples/booleans/touches/true/Point/MultiLineString/MpOnStartLine.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, 1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/MultiPolygon/PointTouchesMultipolygon.geojson b/test/examples/booleans/touches/true/Point/MultiPolygon/PointTouchesMultipolygon.geojson new file mode 100644 index 00000000..40153b61 --- /dev/null +++ b/test/examples/booleans/touches/true/Point/MultiPolygon/PointTouchesMultipolygon.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/MultiPolygon/PointTouchesMultipolygonHole.geojson b/test/examples/booleans/touches/true/Point/MultiPolygon/PointTouchesMultipolygonHole.geojson new file mode 100644 index 00000000..f60d3a63 --- /dev/null +++ b/test/examples/booleans/touches/true/Point/MultiPolygon/PointTouchesMultipolygonHole.geojson @@ -0,0 +1,46 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ], + [ + [2, 2], + [2, 4], + [4, 4], + [2, 2] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/Polygon/PointOnEdgePolygon.geojson b/test/examples/booleans/touches/true/Point/Polygon/PointOnEdgePolygon.geojson new file mode 100644 index 00000000..aacac561 --- /dev/null +++ b/test/examples/booleans/touches/true/Point/Polygon/PointOnEdgePolygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/Polygon/PointOnHole.geojson b/test/examples/booleans/touches/true/Point/Polygon/PointOnHole.geojson new file mode 100644 index 00000000..4c6d4107 --- /dev/null +++ b/test/examples/booleans/touches/true/Point/Polygon/PointOnHole.geojson @@ -0,0 +1,35 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ], + [ + [2, 2], + [2, 4], + [4, 4], + [2, 2] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Point/Polygon/PointOnVerticePolygon.geojson b/test/examples/booleans/touches/true/Point/Polygon/PointOnVerticePolygon.geojson new file mode 100644 index 00000000..d24f78bd --- /dev/null +++ b/test/examples/booleans/touches/true/Point/Polygon/PointOnVerticePolygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Polygon/LineString/PolygonTouchesLines.geojson b/test/examples/booleans/touches/true/Polygon/LineString/PolygonTouchesLines.geojson new file mode 100644 index 00000000..6d176969 --- /dev/null +++ b/test/examples/booleans/touches/true/Polygon/LineString/PolygonTouchesLines.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [1, 1], + [1, 5] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Polygon/MultiLineString/PolygonTouchesMultiline.geojson b/test/examples/booleans/touches/true/Polygon/MultiLineString/PolygonTouchesMultiline.geojson new file mode 100644 index 00000000..a63d41f4 --- /dev/null +++ b/test/examples/booleans/touches/true/Polygon/MultiLineString/PolygonTouchesMultiline.geojson @@ -0,0 +1,42 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, -1], + [1, -10], + [10, -10], + [10, -1], + [1, -1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ], + [ + [2, -1], + [2, 2], + [2, 3], + [2, 4] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Polygon/MultiPoint/PolygonTouchesMultiPoint.geojson b/test/examples/booleans/touches/true/Polygon/MultiPoint/PolygonTouchesMultiPoint.geojson new file mode 100644 index 00000000..1a7e7091 --- /dev/null +++ b/test/examples/booleans/touches/true/Polygon/MultiPoint/PolygonTouchesMultiPoint.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [14, 14] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Polygon/MultiPolygon/PolyTouchMultiPolys.geojson b/test/examples/booleans/touches/true/Polygon/MultiPolygon/PolyTouchMultiPolys.geojson new file mode 100644 index 00000000..2ea4111b --- /dev/null +++ b/test/examples/booleans/touches/true/Polygon/MultiPolygon/PolyTouchMultiPolys.geojson @@ -0,0 +1,48 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 11], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ], + [ + [ + [30, 30], + [30, 40], + [40, 40], + [40, 30], + [30, 30] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Polygon/Point/PolygonTouchesPoint.geojson b/test/examples/booleans/touches/true/Polygon/Point/PolygonTouchesPoint.geojson new file mode 100644 index 00000000..8cba1bf9 --- /dev/null +++ b/test/examples/booleans/touches/true/Polygon/Point/PolygonTouchesPoint.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 5] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Polygon/Point/PolygonTouchesPointVertice.geojson b/test/examples/booleans/touches/true/Polygon/Point/PolygonTouchesPointVertice.geojson new file mode 100644 index 00000000..685a46d3 --- /dev/null +++ b/test/examples/booleans/touches/true/Polygon/Point/PolygonTouchesPointVertice.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Polygon/Polygon/PolygonTouchesEdges.geojson b/test/examples/booleans/touches/true/Polygon/Polygon/PolygonTouchesEdges.geojson new file mode 100644 index 00000000..ac9b8b79 --- /dev/null +++ b/test/examples/booleans/touches/true/Polygon/Polygon/PolygonTouchesEdges.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 11], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/touches/true/Polygon/Polygon/PolygonsTouchVertices.geojson b/test/examples/booleans/touches/true/Polygon/Polygon/PolygonsTouchVertices.geojson new file mode 100644 index 00000000..e66806a7 --- /dev/null +++ b/test/examples/booleans/touches/true/Polygon/Polygon/PolygonsTouchVertices.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [10, 10], + [10, 11], + [11, 11], + [11, 10], + [10, 10] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/assertion/MultiPoint/multipoint.geojson b/test/examples/booleans/valid/assertion/MultiPoint/multipoint.geojson new file mode 100644 index 00000000..ed827478 --- /dev/null +++ b/test/examples/booleans/valid/assertion/MultiPoint/multipoint.geojson @@ -0,0 +1,16 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2.7575683593749996], + [2.5575683593749996, 2.8113711933311403] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/assertion/Point/point.geojson b/test/examples/booleans/valid/assertion/Point/point.geojson new file mode 100644 index 00000000..7e46c4f8 --- /dev/null +++ b/test/examples/booleans/valid/assertion/Point/point.geojson @@ -0,0 +1,13 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2.7575683593749996] + } + } + ] +} diff --git a/test/examples/booleans/valid/false/MultiPolygon/multipoly-with-2-vertices-touching.geojson b/test/examples/booleans/valid/false/MultiPolygon/multipoly-with-2-vertices-touching.geojson new file mode 100644 index 00000000..ad3cb34d --- /dev/null +++ b/test/examples/booleans/valid/false/MultiPolygon/multipoly-with-2-vertices-touching.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ], + [ + [3.076171875, 27.254629577800063], + [6.8115234375, 27.254629577800063], + [6.8115234375, 31.353636941500987], + [-0.703125, 29.916852233070173], + [3.076171875, 27.254629577800063] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/false/MultiPolygon/multipolygons-overlap.geojson b/test/examples/booleans/valid/false/MultiPolygon/multipolygons-overlap.geojson new file mode 100644 index 00000000..196b1f9a --- /dev/null +++ b/test/examples/booleans/valid/false/MultiPolygon/multipolygons-overlap.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ], + [ + [3.076171875, 27.254629577800063], + [6.8115234375, 27.254629577800063], + [6.8115234375, 29.916852233070173], + [3.076171875, 29.916852233070173], + [3.076171875, 27.254629577800063] + ] + ], + [ + [ + [5.80078125, 33.100745405144245], + [8.4814453125, 30.100745405144245], + [8.4814453125, 34.397844946449865], + [5.80078125, 34.397844946449865], + [5.80078125, 33.100745405144245] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/false/MultiPolygon/not-enough-coords.geojson b/test/examples/booleans/valid/false/MultiPolygon/not-enough-coords.geojson new file mode 100644 index 00000000..e2e15631 --- /dev/null +++ b/test/examples/booleans/valid/false/MultiPolygon/not-enough-coords.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [-0.703125, 24.84656534821976] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/false/Polygon/not-enough-coords.geojson b/test/examples/booleans/valid/false/Polygon/not-enough-coords.geojson new file mode 100644 index 00000000..ba0568d2 --- /dev/null +++ b/test/examples/booleans/valid/false/Polygon/not-enough-coords.geojson @@ -0,0 +1,19 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [-0.703125, 24.84656534821976] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/false/Polygon/polygon-with-hole-2-vertices-touching.geojson b/test/examples/booleans/valid/false/Polygon/polygon-with-hole-2-vertices-touching.geojson new file mode 100644 index 00000000..38eff311 --- /dev/null +++ b/test/examples/booleans/valid/false/Polygon/polygon-with-hole-2-vertices-touching.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ], + [ + [3.076171875, 27.254629577800063], + [6.8115234375, 27.254629577800063], + [6.8115234375, 31.353636941500987], + [-0.703125, 29.916852233070173], + [3.076171875, 27.254629577800063] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/false/Polygon/polygon-with-puncture.geojson b/test/examples/booleans/valid/false/Polygon/polygon-with-puncture.geojson new file mode 100644 index 00000000..9266a1fb --- /dev/null +++ b/test/examples/booleans/valid/false/Polygon/polygon-with-puncture.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-0.703125, 24.84656534821976], + [10, 24.84656534821976], + [10, 26.84656534821976], + [10, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/false/Polygon/polygon-with-spike.geojson b/test/examples/booleans/valid/false/Polygon/polygon-with-spike.geojson new file mode 100644 index 00000000..101fac28 --- /dev/null +++ b/test/examples/booleans/valid/false/Polygon/polygon-with-spike.geojson @@ -0,0 +1,22 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 22], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/LineString/linestring.geojson b/test/examples/booleans/valid/true/LineString/linestring.geojson new file mode 100644 index 00000000..75a1b7a1 --- /dev/null +++ b/test/examples/booleans/valid/true/LineString/linestring.geojson @@ -0,0 +1,17 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1.285400390625, 4.214943141390651], + [0.472412109375, 2.9649843693339677], + [1.900634765625, 2.1857489471296665] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/MultiLineString/multilinestring.geojson b/test/examples/booleans/valid/true/MultiLineString/multilinestring.geojson new file mode 100644 index 00000000..4af98e8e --- /dev/null +++ b/test/examples/booleans/valid/true/MultiLineString/multilinestring.geojson @@ -0,0 +1,23 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [1.285400390625, 4.214943141390651], + [0.472412109375, 2.9649843693339677], + [1.900634765625, 2.1857489471296665] + ], + [ + [2.076416015625, 4.07249425916745], + [3.2080078125, 2.5370123584000273] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/MultiPoint/multipoint-with-z.geojson b/test/examples/booleans/valid/true/MultiPoint/multipoint-with-z.geojson new file mode 100644 index 00000000..12c5a939 --- /dev/null +++ b/test/examples/booleans/valid/true/MultiPoint/multipoint-with-z.geojson @@ -0,0 +1,16 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2.7575683593749996, 2.8113711933311403, 1], + [2.5575683593749996, 2.8113711933311403] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/MultiPoint/multipoint.geojson b/test/examples/booleans/valid/true/MultiPoint/multipoint.geojson new file mode 100644 index 00000000..785542e0 --- /dev/null +++ b/test/examples/booleans/valid/true/MultiPoint/multipoint.geojson @@ -0,0 +1,16 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [2.7575683593749996, 2.8113711933311403], + [2.5575683593749996, 2.8113711933311403] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/MultiPolygon/multipolygon-touch.geojson b/test/examples/booleans/valid/true/MultiPolygon/multipolygon-touch.geojson new file mode 100644 index 00000000..ff290c16 --- /dev/null +++ b/test/examples/booleans/valid/true/MultiPolygon/multipolygon-touch.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-0.703, 24.846], + [11.25, 24.846], + [11.25, 31.353], + [-0.703, 31.353], + [-0.703, 24.846] + ], + [ + [3.076, 27.254], + [6.811, 27.254], + [6.811, 29.916], + [3.076, 29.916], + [3.076, 27.254] + ] + ], + [ + [ + [5.8, 33.1], + [8.481, 31.353], + [8.481, 34.397], + [5.8, 34.397], + [5.8, 33.1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/MultiPolygon/multipolygon-with-hole.geojson b/test/examples/booleans/valid/true/MultiPolygon/multipolygon-with-hole.geojson new file mode 100644 index 00000000..72f4ce17 --- /dev/null +++ b/test/examples/booleans/valid/true/MultiPolygon/multipolygon-with-hole.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ], + [ + [3.076171875, 27.254629577800063], + [6.8115234375, 27.254629577800063], + [6.8115234375, 29.916852233070173], + [3.076171875, 29.916852233070173], + [3.076171875, 27.254629577800063] + ] + ], + [ + [ + [5.80078125, 33.100745405144245], + [8.4814453125, 33.100745405144245], + [8.4814453125, 34.397844946449865], + [5.80078125, 34.397844946449865], + [5.80078125, 33.100745405144245] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/MultiPolygon/multipolygon.geojson b/test/examples/booleans/valid/true/MultiPolygon/multipolygon.geojson new file mode 100644 index 00000000..e4ce0e33 --- /dev/null +++ b/test/examples/booleans/valid/true/MultiPolygon/multipolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ] + ], + [ + [ + [5.80078125, 33.100745405144245], + [8.4814453125, 33.100745405144245], + [8.4814453125, 34.397844946449865], + [5.80078125, 34.397844946449865], + [5.80078125, 33.100745405144245] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/Point/point-with-z.geojson b/test/examples/booleans/valid/true/Point/point-with-z.geojson new file mode 100644 index 00000000..3082c2e9 --- /dev/null +++ b/test/examples/booleans/valid/true/Point/point-with-z.geojson @@ -0,0 +1,13 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2.7575683593749996, 2.8113711933311403, 1] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/Point/point.geojson b/test/examples/booleans/valid/true/Point/point.geojson new file mode 100644 index 00000000..430ab19c --- /dev/null +++ b/test/examples/booleans/valid/true/Point/point.geojson @@ -0,0 +1,13 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2.7575683593749996, 2.8113711933311403] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/Polygon/polygon-internal-hole.geojson b/test/examples/booleans/valid/true/Polygon/polygon-internal-hole.geojson new file mode 100644 index 00000000..788c54a3 --- /dev/null +++ b/test/examples/booleans/valid/true/Polygon/polygon-internal-hole.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ], + [ + [3.076171875, 27.254629577800063], + [6.8115234375, 27.254629577800063], + [6.8115234375, 29.916852233070173], + [3.076171875, 29.916852233070173], + [3.076171875, 27.254629577800063] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/Polygon/polygon-with-hole-1-vertice-touching.geojson b/test/examples/booleans/valid/true/Polygon/polygon-with-hole-1-vertice-touching.geojson new file mode 100644 index 00000000..6bf8b239 --- /dev/null +++ b/test/examples/booleans/valid/true/Polygon/polygon-with-hole-1-vertice-touching.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ], + [ + [3.076171875, 27.254629577800063], + [6.8115234375, 27.254629577800063], + [6.8115234375, 29.916852233070173], + [-0.703125, 29.916852233070173], + [3.076171875, 27.254629577800063] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/valid/true/Polygon/polygon.geojson b/test/examples/booleans/valid/true/Polygon/polygon.geojson new file mode 100644 index 00000000..ea06e0a0 --- /dev/null +++ b/test/examples/booleans/valid/true/Polygon/polygon.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-0.703125, 24.84656534821976], + [11.25, 24.84656534821976], + [11.25, 31.353636941500987], + [-0.703125, 31.353636941500987], + [-0.703125, 24.84656534821976] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/LineString/LineString/LineIsNotWithinLine.geojson b/test/examples/booleans/within/false/LineString/LineString/LineIsNotWithinLine.geojson new file mode 100644 index 00000000..28c41a8c --- /dev/null +++ b/test/examples/booleans/within/false/LineString/LineString/LineIsNotWithinLine.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 15.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/LineString/Polygon/LineIsNotWIthinPolygon.geojson b/test/examples/booleans/within/false/LineString/Polygon/LineIsNotWIthinPolygon.geojson new file mode 100644 index 00000000..c70523db --- /dev/null +++ b/test/examples/booleans/within/false/LineString/Polygon/LineIsNotWIthinPolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 15.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/LineString/Polygon/LineIsNotWIthinPolygonBoundary.geojson b/test/examples/booleans/within/false/LineString/Polygon/LineIsNotWIthinPolygonBoundary.geojson new file mode 100644 index 00000000..d0125aa9 --- /dev/null +++ b/test/examples/booleans/within/false/LineString/Polygon/LineIsNotWIthinPolygonBoundary.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 3.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/MultiLineString/MultiPolygon/skip-multilinestring-not-within-multipolygon.geojson b/test/examples/booleans/within/false/MultiLineString/MultiPolygon/skip-multilinestring-not-within-multipolygon.geojson new file mode 100644 index 00000000..f2aca1a0 --- /dev/null +++ b/test/examples/booleans/within/false/MultiLineString/MultiPolygon/skip-multilinestring-not-within-multipolygon.geojson @@ -0,0 +1,49 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [4, 4], + [1, 1] + ], + [ + [-14, -14], + [-11, -11] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/MultiPoint/LineString/MultiPointsIsNotWIthinLine.geojson b/test/examples/booleans/within/false/MultiPoint/LineString/MultiPointsIsNotWIthinLine.geojson new file mode 100644 index 00000000..83c5eccf --- /dev/null +++ b/test/examples/booleans/within/false/MultiPoint/LineString/MultiPointsIsNotWIthinLine.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/MultiPoint/LineString/MultiPointsOnLineEndsIsNotWIthinLine.geojson b/test/examples/booleans/within/false/MultiPoint/LineString/MultiPointsOnLineEndsIsNotWIthinLine.geojson new file mode 100644 index 00000000..a99fcbc1 --- /dev/null +++ b/test/examples/booleans/within/false/MultiPoint/LineString/MultiPointsOnLineEndsIsNotWIthinLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/MultiPoint/MultiPoint/MultiPointIsNotWithinMultiPoint.geojson b/test/examples/booleans/within/false/MultiPoint/MultiPoint/MultiPointIsNotWithinMultiPoint.geojson new file mode 100644 index 00000000..d00c24ab --- /dev/null +++ b/test/examples/booleans/within/false/MultiPoint/MultiPoint/MultiPointIsNotWithinMultiPoint.geojson @@ -0,0 +1,28 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 1.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/MultiPoint/MultiPolygon/multipoint-not-within-multipolygon.geojson b/test/examples/booleans/within/false/MultiPoint/MultiPolygon/multipoint-not-within-multipolygon.geojson new file mode 100644 index 00000000..7cd0e752 --- /dev/null +++ b/test/examples/booleans/within/false/MultiPoint/MultiPolygon/multipoint-not-within-multipolygon.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [4, 4], + [-14, -14] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/MultiPoint/Polygon/MultiPointAllOnBoundaryIsNotWithinPolygon.geojson b/test/examples/booleans/within/false/MultiPoint/Polygon/MultiPointAllOnBoundaryIsNotWithinPolygon.geojson new file mode 100644 index 00000000..d69eb204 --- /dev/null +++ b/test/examples/booleans/within/false/MultiPoint/Polygon/MultiPointAllOnBoundaryIsNotWithinPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 10] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/MultiPoint/Polygon/MultiPointIsNotWithinPolygon.geojson b/test/examples/booleans/within/false/MultiPoint/Polygon/MultiPointIsNotWithinPolygon.geojson new file mode 100644 index 00000000..81743c73 --- /dev/null +++ b/test/examples/booleans/within/false/MultiPoint/Polygon/MultiPointIsNotWithinPolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Point/LineString/PointIsNotWithinLine.geojson b/test/examples/booleans/within/false/Point/LineString/PointIsNotWithinLine.geojson new file mode 100644 index 00000000..e7595525 --- /dev/null +++ b/test/examples/booleans/within/false/Point/LineString/PointIsNotWithinLine.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [2, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Point/LineString/PointIsNotWithinLineBecauseOnEnd.geojson b/test/examples/booleans/within/false/Point/LineString/PointIsNotWithinLineBecauseOnEnd.geojson new file mode 100644 index 00000000..b30df470 --- /dev/null +++ b/test/examples/booleans/within/false/Point/LineString/PointIsNotWithinLineBecauseOnEnd.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 4] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Point/LineString/PointOnEndIsWithinLinestring.geojson b/test/examples/booleans/within/false/Point/LineString/PointOnEndIsWithinLinestring.geojson new file mode 100644 index 00000000..b84728a8 --- /dev/null +++ b/test/examples/booleans/within/false/Point/LineString/PointOnEndIsWithinLinestring.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Point/MultiPoint/PointIsNotWithinMultiPoint.geojson b/test/examples/booleans/within/false/Point/MultiPoint/PointIsNotWithinMultiPoint.geojson new file mode 100644 index 00000000..ad262c65 --- /dev/null +++ b/test/examples/booleans/within/false/Point/MultiPoint/PointIsNotWithinMultiPoint.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 4] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Point/MultiPolygon/point-not-within-multipolygon.geojson b/test/examples/booleans/within/false/Point/MultiPolygon/point-not-within-multipolygon.geojson new file mode 100644 index 00000000..30c016b8 --- /dev/null +++ b/test/examples/booleans/within/false/Point/MultiPolygon/point-not-within-multipolygon.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [14, 14] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Point/Polygon/PointIsNotWithinPolygon.geojson b/test/examples/booleans/within/false/Point/Polygon/PointIsNotWithinPolygon.geojson new file mode 100644 index 00000000..3bc20282 --- /dev/null +++ b/test/examples/booleans/within/false/Point/Polygon/PointIsNotWithinPolygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [14, 14] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Point/Polygon/PointOnPolygonBoundary.geojson b/test/examples/booleans/within/false/Point/Polygon/PointOnPolygonBoundary.geojson new file mode 100644 index 00000000..d24f78bd --- /dev/null +++ b/test/examples/booleans/within/false/Point/Polygon/PointOnPolygonBoundary.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Polygon/MultiPolygon/polygon-not-within-multipolygon.geojson b/test/examples/booleans/within/false/Polygon/MultiPolygon/polygon-not-within-multipolygon.geojson new file mode 100644 index 00000000..fb07e048 --- /dev/null +++ b/test/examples/booleans/within/false/Polygon/MultiPolygon/polygon-not-within-multipolygon.geojson @@ -0,0 +1,48 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-12, -12], + [-12, -19], + [-19, -19], + [-19, -12], + [-12, -12] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/false/Polygon/Polygon/Polygon-Polygon.geojson b/test/examples/booleans/within/false/Polygon/Polygon/Polygon-Polygon.geojson new file mode 100644 index 00000000..5a1b4256 --- /dev/null +++ b/test/examples/booleans/within/false/Polygon/Polygon/Polygon-Polygon.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 20], + [1, 3], + [1, 4], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/LineString/LineString/LineIsWithinLine.geojson b/test/examples/booleans/within/true/LineString/LineString/LineIsWithinLine.geojson new file mode 100644 index 00000000..dcf5cb15 --- /dev/null +++ b/test/examples/booleans/within/true/LineString/LineString/LineIsWithinLine.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 2], + [1, 3], + [1, 3.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/LineString/LineString/LinesExactSame.geojson b/test/examples/booleans/within/true/LineString/LineString/LinesExactSame.geojson new file mode 100644 index 00000000..034737ba --- /dev/null +++ b/test/examples/booleans/within/true/LineString/LineString/LinesExactSame.geojson @@ -0,0 +1,31 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/LineString/Polygon/LineIsContainedByPolygon.geojson b/test/examples/booleans/within/true/LineString/Polygon/LineIsContainedByPolygon.geojson new file mode 100644 index 00000000..eba012ac --- /dev/null +++ b/test/examples/booleans/within/true/LineString/Polygon/LineIsContainedByPolygon.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [2, 3], + [2, 3.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/LineString/Polygon/LineIsContainedByPolygonWithNoInternalVertices.geojson b/test/examples/booleans/within/true/LineString/Polygon/LineIsContainedByPolygonWithNoInternalVertices.geojson new file mode 100644 index 00000000..4d4f566f --- /dev/null +++ b/test/examples/booleans/within/true/LineString/Polygon/LineIsContainedByPolygonWithNoInternalVertices.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [10, 10] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/MultiLineString/MultiPolygon/skip-multilinestring-within-multipolygon.geojson b/test/examples/booleans/within/true/MultiLineString/MultiPolygon/skip-multilinestring-within-multipolygon.geojson new file mode 100644 index 00000000..1def29af --- /dev/null +++ b/test/examples/booleans/within/true/MultiLineString/MultiPolygon/skip-multilinestring-within-multipolygon.geojson @@ -0,0 +1,49 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [4, 4], + [1, 1] + ], + [ + [-4, -4], + [-1, -1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/MultiPoint/LineString/MultipointsIsWithinLine.geojson b/test/examples/booleans/within/true/MultiPoint/LineString/MultipointsIsWithinLine.geojson new file mode 100644 index 00000000..cdf0856c --- /dev/null +++ b/test/examples/booleans/within/true/MultiPoint/LineString/MultipointsIsWithinLine.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [1, 1.5] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/MultiPoint/MultiPoint/MultiPointsWithinMultiPoints.geojson b/test/examples/booleans/within/true/MultiPoint/MultiPoint/MultiPointsWithinMultiPoints.geojson new file mode 100644 index 00000000..8a0585fe --- /dev/null +++ b/test/examples/booleans/within/true/MultiPoint/MultiPoint/MultiPointsWithinMultiPoints.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12], + [15, 15] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/MultiPoint/MultiPolygon/multipoint-within-multipolygon.geojson b/test/examples/booleans/within/true/MultiPoint/MultiPolygon/multipoint-within-multipolygon.geojson new file mode 100644 index 00000000..9d78da41 --- /dev/null +++ b/test/examples/booleans/within/true/MultiPoint/MultiPolygon/multipoint-within-multipolygon.geojson @@ -0,0 +1,43 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [4, 4], + [-4, -4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/MultiPoint/Polygon/MultiPointIsWithinPolygon.geojson b/test/examples/booleans/within/true/MultiPoint/Polygon/MultiPointIsWithinPolygon.geojson new file mode 100644 index 00000000..81f544da --- /dev/null +++ b/test/examples/booleans/within/true/MultiPoint/Polygon/MultiPointIsWithinPolygon.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [4, 4] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/MultiPoint/Polygon/MultiPointSingleIsWithinPolygon.geojson b/test/examples/booleans/within/true/MultiPoint/Polygon/MultiPointSingleIsWithinPolygon.geojson new file mode 100644 index 00000000..f4645c5f --- /dev/null +++ b/test/examples/booleans/within/true/MultiPoint/Polygon/MultiPointSingleIsWithinPolygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [[2, 2]] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/MultiPolygon/MultiPolygon/skip-multipolygon-within-multipolygon.geojson b/test/examples/booleans/within/true/MultiPolygon/MultiPolygon/skip-multipolygon-within-multipolygon.geojson new file mode 100644 index 00000000..85aa17cf --- /dev/null +++ b/test/examples/booleans/within/true/MultiPolygon/MultiPolygon/skip-multipolygon-within-multipolygon.geojson @@ -0,0 +1,59 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [2, 2], + [2, 9], + [9, 9], + [9, 2], + [2, 2] + ] + ], + [ + [ + [-2, -2], + [-2, -9], + [-9, -9], + [-9, -2], + [-2, -2] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/Point/LineString/PointIsWithinLine.geojson b/test/examples/booleans/within/true/Point/LineString/PointIsWithinLine.geojson new file mode 100644 index 00000000..8cb3cc42 --- /dev/null +++ b/test/examples/booleans/within/true/Point/LineString/PointIsWithinLine.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 2] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [1, 1], + [1, 2], + [1, 3], + [1, 4] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/Point/MultiPoint/PointIsWithinMultiPoint.geojson b/test/examples/booleans/within/true/Point/MultiPoint/PointIsWithinMultiPoint.geojson new file mode 100644 index 00000000..f958a470 --- /dev/null +++ b/test/examples/booleans/within/true/Point/MultiPoint/PointIsWithinMultiPoint.geojson @@ -0,0 +1,24 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [1, 1] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [1, 1], + [12, 12] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/Point/MultiPolygon/point-within-multipolygon.geojson b/test/examples/booleans/within/true/Point/MultiPolygon/point-within-multipolygon.geojson new file mode 100644 index 00000000..84d378bc --- /dev/null +++ b/test/examples/booleans/within/true/Point/MultiPolygon/point-within-multipolygon.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-4, -4] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/Point/Polygon/PointIsWithinPolygon.geojson b/test/examples/booleans/within/true/Point/Polygon/PointIsWithinPolygon.geojson new file mode 100644 index 00000000..8e3ea36f --- /dev/null +++ b/test/examples/booleans/within/true/Point/Polygon/PointIsWithinPolygon.geojson @@ -0,0 +1,29 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4, 4] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/Polygon/MultiPolygon/polygon-within-multipolygon.geojson b/test/examples/booleans/within/true/Polygon/MultiPolygon/polygon-within-multipolygon.geojson new file mode 100644 index 00000000..2819e2ba --- /dev/null +++ b/test/examples/booleans/within/true/Polygon/MultiPolygon/polygon-within-multipolygon.geojson @@ -0,0 +1,48 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-2, -2], + [-2, -9], + [-9, -9], + [-9, -2], + [-2, -2] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ], + [ + [ + [-1, -1], + [-1, -10], + [-10, -10], + [-10, -1], + [-1, -1] + ] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/Polygon/Polygon/PolygonIsWIthinPolygon.geojson b/test/examples/booleans/within/true/Polygon/Polygon/PolygonIsWIthinPolygon.geojson new file mode 100644 index 00000000..65d65259 --- /dev/null +++ b/test/examples/booleans/within/true/Polygon/Polygon/PolygonIsWIthinPolygon.geojson @@ -0,0 +1,36 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [2, 2], + [3, 2], + [1, 1] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1, 1], + [1, 10], + [10, 10], + [10, 1], + [1, 1] + ] + ] + } + } + ] +} diff --git a/test/examples/booleans/within/true/Polygon/Polygon/PolygonsExactSameShape.geojson b/test/examples/booleans/within/true/Polygon/Polygon/PolygonsExactSameShape.geojson new file mode 100644 index 00000000..8bfd83da --- /dev/null +++ b/test/examples/booleans/within/true/Polygon/Polygon/PolygonsExactSameShape.geojson @@ -0,0 +1,41 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "fill": "#F00" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-12.65625, 36.87962060502676], + [35.419921875, 36.38591277287651], + [37.79296875, 56.897003921272606], + [-12.12890625, 57.040729838360875], + [-12.65625, 36.87962060502676] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "fill": "#F00" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-12.65625, 36.87962060502676], + [35.419921875, 36.38591277287651], + [37.79296875, 56.897003921272606], + [-12.12890625, 57.040729838360875], + [-12.65625, 36.87962060502676] + ] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/in/2-vertex-segment.geojson b/test/examples/line_intersect/in/2-vertex-segment.geojson new file mode 100644 index 00000000..f4ed4718 --- /dev/null +++ b/test/examples/line_intersect/in/2-vertex-segment.geojson @@ -0,0 +1,33 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [124.584961, -12.768946], + [126.738281, -17.224758] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [123.354492, -15.961329], + [127.22168, -14.008696] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/in/double-intersect.geojson b/test/examples/line_intersect/in/double-intersect.geojson new file mode 100644 index 00000000..f699b49e --- /dev/null +++ b/test/examples/line_intersect/in/double-intersect.geojson @@ -0,0 +1,44 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [142.03125, -11.695273], + [138.691406, -16.804541], + [136.40625, -14.604847], + [135.966797, -12.039321], + [131.308594, -11.436955], + [128.232422, -15.36895], + [125.947266, -13.581921], + [121.816406, -18.729502], + [117.421875, -20.632784], + [113.378906, -23.402765], + [114.169922, -26.667096] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [117.861328, -15.029686], + [122.124023, -24.886436], + [132.583008, -22.309426], + [132.890625, -7.754537] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/in/multi-linestring.geojson b/test/examples/line_intersect/in/multi-linestring.geojson new file mode 100644 index 00000000..4474df85 --- /dev/null +++ b/test/examples/line_intersect/in/multi-linestring.geojson @@ -0,0 +1,74 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [142.03125, -11.695273], + [138.691406, -16.804541], + [136.40625, -14.604847], + [135.966797, -12.039321], + [131.308594, -11.436955], + [128.232422, -15.36895], + [125.947266, -13.581921], + [121.816406, -18.729502], + [117.421875, -20.632784], + [113.378906, -23.402765], + [114.169922, -26.667096] + ], + [ + [117.290039, -27.994401], + [118.87207, -25.165173], + [121.508789, -24.407138], + [122.783203, -19.228177], + [125.683594, -18.771115], + [130.78125, -21.534847], + [133.417969, -17.602139], + [137.768555, -19.55979], + [139.658203, -18.39623] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [117.861328, -15.029686], + [122.124023, -24.886436], + [132.583008, -22.309426], + [132.890625, -7.754537] + ], + [ + [115.751953, -17.014768], + [118.652344, -26.037042], + [118.344727, -28.343065], + [125.068359, -28.652031], + [125.771484, -26.627818], + [131.572266, -26.509905], + [136.40625, -24.886436], + [136.186523, -22.105999], + [134.956055, -20.591652], + [135.439453, -16.214675], + [136.713867, -15.114553], + [134.912109, -11.738302], + [135, -10.141932] + ] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/in/polygons-with-holes.geojson b/test/examples/line_intersect/in/polygons-with-holes.geojson new file mode 100644 index 00000000..8b6163c8 --- /dev/null +++ b/test/examples/line_intersect/in/polygons-with-holes.geojson @@ -0,0 +1,107 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [127.397461, -14.221789], + [119.399414, -18.729502], + [114.741211, -21.289374], + [113.554688, -24.487149], + [114.213867, -28.304381], + [116.235352, -30.977609], + [115.532227, -33.468108], + [116.191406, -34.633208], + [120.629883, -33.541395], + [124.541016, -33.247876], + [128.62793, -32.10119], + [129.726563, -31.765537], + [129.726563, -28.806174], + [128.276367, -28.497661], + [125.727539, -28.459033], + [122.695313, -30.372875], + [120.410156, -30.562261], + [118.476562, -28.998532], + [118.608398, -27.527758], + [123.925781, -27.019984], + [126.5625, -26.549223], + [130.166016, -25.76032], + [130.166016, -23.644524], + [127.617187, -22.917923], + [123.837891, -24.567108], + [119.267578, -24.567108], + [118.564453, -23.281719], + [119.838867, -21.330315], + [123.706055, -21.493964], + [127.089844, -21.0845], + [128.232422, -19.103648], + [127.749023, -17.895114], + [130.297852, -17.182779], + [129.858398, -15.538376], + [129.023438, -14.179186], + [127.397461, -14.221789] + ], + [ + [122.958984, -19.890723], + [125.068359, -19.890723], + [125.068359, -18.187607], + [122.958984, -18.187607], + [122.958984, -19.890723] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [120.849609, -14.85985], + [117.070313, -15.496032], + [117.026367, -17.769612], + [119.663086, -20.468189], + [121.157227, -23.039298], + [120.058594, -24.647017], + [118.344727, -26.076521], + [120.410156, -28.343065], + [120.146484, -30.939924], + [118.256836, -33.027088], + [123.925781, -34.885931], + [126.123047, -33.687782], + [125.947266, -31.840233], + [124.057617, -28.536275], + [122.080078, -26.273714], + [123.442383, -23.885838], + [125.200195, -22.796439], + [124.277344, -19.47695], + [120.849609, -14.85985] + ], + [ + [121.157227, -27.371767], + [121.157227, -29.42046], + [121.025391, -31.952162], + [120.893555, -33.027088], + [123.662109, -33.870416], + [124.584961, -33.431441], + [124.541016, -31.128199], + [122.827148, -29.382175], + [122.124023, -27.916767], + [121.157227, -27.371767] + ] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/in/same-coordinates.geojson b/test/examples/line_intersect/in/same-coordinates.geojson new file mode 100644 index 00000000..efb0b995 --- /dev/null +++ b/test/examples/line_intersect/in/same-coordinates.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [120, -20], + [122.5, -16], + [125, -15], + [127.5, -16], + [130, -20] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [120, -20], + [122.5, -24], + [125, -25], + [127.5, -24], + [130, -20] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/out/2-vertex-segment.geojson b/test/examples/line_intersect/out/2-vertex-segment.geojson new file mode 100644 index 00000000..33f7eedf --- /dev/null +++ b/test/examples/line_intersect/out/2-vertex-segment.geojson @@ -0,0 +1,41 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [125.583754, -14.835723] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [124.584961, -12.768946], + [126.738281, -17.224758] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [123.354492, -15.961329], + [127.22168, -14.008696] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/out/double-intersect.geojson b/test/examples/line_intersect/out/double-intersect.geojson new file mode 100644 index 00000000..52acde8e --- /dev/null +++ b/test/examples/line_intersect/out/double-intersect.geojson @@ -0,0 +1,60 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [119.832884, -19.58857] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [132.808697, -11.630938] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [142.03125, -11.695273], + [138.691406, -16.804541], + [136.40625, -14.604847], + [135.966797, -12.039321], + [131.308594, -11.436955], + [128.232422, -15.36895], + [125.947266, -13.581921], + [121.816406, -18.729502], + [117.421875, -20.632784], + [113.378906, -23.402765], + [114.169922, -26.667096] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [117.861328, -15.029686], + [122.124023, -24.886436], + [132.583008, -22.309426], + [132.890625, -7.754537] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/out/multi-linestring.geojson b/test/examples/line_intersect/out/multi-linestring.geojson new file mode 100644 index 00000000..5a52196c --- /dev/null +++ b/test/examples/line_intersect/out/multi-linestring.geojson @@ -0,0 +1,154 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [117.006519, -20.917359] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [118.554586, -25.732946] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [119.832884, -19.58857] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [121.656735, -23.805914] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [132.658557, -18.734814] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [132.808697, -11.630938] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [135.006479, -11.91514] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [135.197772, -18.403004] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [136.389417, -14.506578] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [136.479474, -14.675333] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [142.03125, -11.695273], + [138.691406, -16.804541], + [136.40625, -14.604847], + [135.966797, -12.039321], + [131.308594, -11.436955], + [128.232422, -15.36895], + [125.947266, -13.581921], + [121.816406, -18.729502], + [117.421875, -20.632784], + [113.378906, -23.402765], + [114.169922, -26.667096] + ], + [ + [117.290039, -27.994401], + [118.87207, -25.165173], + [121.508789, -24.407138], + [122.783203, -19.228177], + [125.683594, -18.771115], + [130.78125, -21.534847], + [133.417969, -17.602139], + [137.768555, -19.55979], + [139.658203, -18.39623] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [117.861328, -15.029686], + [122.124023, -24.886436], + [132.583008, -22.309426], + [132.890625, -7.754537] + ], + [ + [115.751953, -17.014768], + [118.652344, -26.037042], + [118.344727, -28.343065], + [125.068359, -28.652031], + [125.771484, -26.627818], + [131.572266, -26.509905], + [136.40625, -24.886436], + [136.186523, -22.105999], + [134.956055, -20.591652], + [135.439453, -16.214675], + [136.713867, -15.114553], + [134.912109, -11.738302], + [135, -10.141932] + ] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/out/polygons-with-holes.geojson b/test/examples/line_intersect/out/polygons-with-holes.geojson new file mode 100644 index 00000000..a39d1b36 --- /dev/null +++ b/test/examples/line_intersect/out/polygons-with-holes.geojson @@ -0,0 +1,251 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [118.465639, -19.242649] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [120.170188, -33.654475] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [119.582432, -27.434744] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [120.17229, -21.344425] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [120.1132, -24.567108] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [120.201928, -30.393864] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [122.447193, -17.011768] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [122.196098, -33.423855] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [121.100749, -30.505027] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [122.824274, -27.12517] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [123.053712, -24.567108] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [123.377165, -29.942512] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [123.320136, -18.187607] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [124.468085, -29.253959] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [124.392377, -19.890723] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [124.80125, -21.361437] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [124.581243, -33.236589] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [126.041148, -32.826977] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [127.397461, -14.221789], + [119.399414, -18.729502], + [114.741211, -21.289374], + [113.554688, -24.487149], + [114.213867, -28.304381], + [116.235352, -30.977609], + [115.532227, -33.468108], + [116.191406, -34.633208], + [120.629883, -33.541395], + [124.541016, -33.247876], + [128.62793, -32.10119], + [129.726563, -31.765537], + [129.726563, -28.806174], + [128.276367, -28.497661], + [125.727539, -28.459033], + [122.695313, -30.372875], + [120.410156, -30.562261], + [118.476562, -28.998532], + [118.608398, -27.527758], + [123.925781, -27.019984], + [126.5625, -26.549223], + [130.166016, -25.76032], + [130.166016, -23.644524], + [127.617187, -22.917923], + [123.837891, -24.567108], + [119.267578, -24.567108], + [118.564453, -23.281719], + [119.838867, -21.330315], + [123.706055, -21.493964], + [127.089844, -21.0845], + [128.232422, -19.103648], + [127.749023, -17.895114], + [130.297852, -17.182779], + [129.858398, -15.538376], + [129.023438, -14.179186], + [127.397461, -14.221789] + ], + [ + [122.958984, -19.890723], + [125.068359, -19.890723], + [125.068359, -18.187607], + [122.958984, -18.187607], + [122.958984, -19.890723] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [120.849609, -14.85985], + [117.070313, -15.496032], + [117.026367, -17.769612], + [119.663086, -20.468189], + [121.157227, -23.039298], + [120.058594, -24.647017], + [118.344727, -26.076521], + [120.410156, -28.343065], + [120.146484, -30.939924], + [118.256836, -33.027088], + [123.925781, -34.885931], + [126.123047, -33.687782], + [125.947266, -31.840233], + [124.057617, -28.536275], + [122.080078, -26.273714], + [123.442383, -23.885838], + [125.200195, -22.796439], + [124.277344, -19.47695], + [120.849609, -14.85985] + ], + [ + [121.157227, -27.371767], + [121.157227, -29.42046], + [121.025391, -31.952162], + [120.893555, -33.027088], + [123.662109, -33.870416], + [124.584961, -33.431441], + [124.541016, -31.128199], + [122.827148, -29.382175], + [122.124023, -27.916767], + [121.157227, -27.371767] + ] + ] + } + } + ] +} diff --git a/test/examples/line_intersect/out/same-coordinates.geojson b/test/examples/line_intersect/out/same-coordinates.geojson new file mode 100644 index 00000000..1b69013f --- /dev/null +++ b/test/examples/line_intersect/out/same-coordinates.geojson @@ -0,0 +1,55 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [120, -20] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [130, -20] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [120, -20], + [122.5, -16], + [125, -15], + [127.5, -16], + [130, -20] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [120, -20], + [122.5, -24], + [125, -25], + [127.5, -24], + [130, -20] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/in/boolean-line-overlap.geojson b/test/examples/line_overlap/in/boolean-line-overlap.geojson new file mode 100644 index 00000000..c3414c3c --- /dev/null +++ b/test/examples/line_overlap/in/boolean-line-overlap.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-22.564544677734375, 46.25917013377904], + [-22.559051513671875, 46.32369743336783], + [-22.446441650390625, 46.352141192009334], + [-22.361297607421875, 46.32891323009468], + [-22.361297607421875, 46.30472670751783] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-22.570724487304688, 46.36398839132818], + [-22.444381713867188, 46.357354276167015], + [-22.391510009765625, 46.3291502999477], + [-22.29263305664062, 46.382464893261165] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/in/issue-#901-simplified.geojson b/test/examples/line_overlap/in/issue-#901-simplified.geojson new file mode 100644 index 00000000..435be36e --- /dev/null +++ b/test/examples/line_overlap/in/issue-#901-simplified.geojson @@ -0,0 +1,35 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 10, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 2], + [4, 4] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 3, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [6, 6] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/in/issue-#901.geojson b/test/examples/line_overlap/in/issue-#901.geojson new file mode 100644 index 00000000..b897d69b --- /dev/null +++ b/test/examples/line_overlap/in/issue-#901.geojson @@ -0,0 +1,77 @@ +{ + "type": "FeatureCollection", + "properties": { + "tolerance": 0.05 + }, + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "fill": "#F00", + "stroke-width": 10, + "stroke-opacity": 1, + "fill-opacity": 0.1, + "description": "output of an intersect call with a longer pipe and the other feature in this file" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-113.33847575084239, 53.52244416392682], + [-113.33847394, 53.52299533509864], + [-113.338470971, 53.52389165109878], + [-113.338468309, 53.52469456909876], + [-113.338467951, 53.5248023990988], + [-113.338462214, 53.52653346709882], + [-113.3384620759999, 53.52657586409872], + [-113.3384619429999, 53.52661770709869], + [-113.3384532659999, 53.52935323209886], + [-113.338452983, 53.52944258409877], + [-113.338452982, 53.52944333909876], + [-113.3384522719999, 53.52962258909884], + [-113.338449392, 53.53035074809878], + [-113.33704111881613, 53.53215959791441], + [-113.33698987543352, 53.53214475018778], + [-113.33690471442213, 53.53212132654082], + [-113.3382987129999, 53.53033083009888], + [-113.3383022259999, 53.52944312809881], + [-113.3383113299999, 53.52657569409888], + [-113.3383232079999, 53.52299515809875], + [-113.33832502043951, 53.52244398828247], + [-113.3384152645109, 53.52244409344282], + [-113.33847575084239, 53.52244416392682] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "fill": "#00F", + "stroke-width": 3, + "stroke-opacity": 1, + "fill-opacity": 0.1, + "description": "shape which was intersected with a longer pipe to produce the pipe shown" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-113.34145274487872, 53.53230853007057], + [-113.33797676517321, 53.53243070065233], + [-113.33698987543352, 53.53214475018778], + [-113.33287043896553, 53.53101169382826], + [-113.33387712516304, 53.522438805202505], + [-113.3384152645109, 53.52244409344282], + [-113.3429534044069, 53.522449381683145], + [-113.34145274487872, 53.53230853007057], + [-113.34145274487872, 53.53230853007057], + [-113.34145274487872, 53.53230853007057] + ] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/in/polygons.geojson b/test/examples/line_overlap/in/polygons.geojson new file mode 100644 index 00000000..fc443e3d --- /dev/null +++ b/test/examples/line_overlap/in/polygons.geojson @@ -0,0 +1,65 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "fill": "#F00", + "stroke-width": 10, + "stroke-opacity": 1, + "fill-opacity": 0.1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [120.14179343574, -17.48153498141], + [120.1456007834, -30.96997373479], + [130.34864729879, -30.96772909058], + [131.64065935144, -29.20137372199], + [129.5926694017, -28.04905296815], + [130.34739288016, -26.68605235913], + [125.76890918238, -26.68710193815], + [125.76762773192, -22.1408865296], + [130.52038135971, -22.13975701932], + [131.37809653737, -20.30857774535], + [129.67954157692, -18.92360398694], + [130.51910988115, -17.47899540098], + [120.14179343574, -17.48153498141] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "fill": "#00F", + "stroke-width": 3, + "stroke-opacity": 1, + "fill-opacity": 0.1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [139.69468150776, -17.47674988707], + [130.51910988115, -17.47899540098], + [129.67954157692, -18.92360398694], + [131.37809653737, -20.30857774535], + [130.52038135971, -22.13975701932], + [135.29428724786, -22.138622473], + [135.29556869831, -26.68491802042], + [130.34739288016, -26.68605235913], + [129.5926694017, -28.04905296815], + [131.64065935144, -29.20137372199], + [130.34864729879, -30.96772909058], + [139.69848885541, -30.96567210295], + [139.69468150776, -17.47674988707] + ] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/in/simple1.geojson b/test/examples/line_overlap/in/simple1.geojson new file mode 100644 index 00000000..77f9e48a --- /dev/null +++ b/test/examples/line_overlap/in/simple1.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 10, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [115, -35], + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 3, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [115, -25], + [125, -30], + [135, -30], + [145, -35], + [145, -25] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/in/simple2.geojson b/test/examples/line_overlap/in/simple2.geojson new file mode 100644 index 00000000..a283beac --- /dev/null +++ b/test/examples/line_overlap/in/simple2.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 10, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [115, -35], + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 3, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [115, -25], + [125, -30], + [135, -30], + [145, -35] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/in/simple3.geojson b/test/examples/line_overlap/in/simple3.geojson new file mode 100644 index 00000000..aa813d2b --- /dev/null +++ b/test/examples/line_overlap/in/simple3.geojson @@ -0,0 +1,38 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#ff0000", + "stroke-width": 10, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 3, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [125, -30], + [135, -30], + [145, -35], + [145, -25] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/out/boolean-line-overlap.geojson b/test/examples/line_overlap/out/boolean-line-overlap.geojson new file mode 100644 index 00000000..c3414c3c --- /dev/null +++ b/test/examples/line_overlap/out/boolean-line-overlap.geojson @@ -0,0 +1,32 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-22.564544677734375, 46.25917013377904], + [-22.559051513671875, 46.32369743336783], + [-22.446441650390625, 46.352141192009334], + [-22.361297607421875, 46.32891323009468], + [-22.361297607421875, 46.30472670751783] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [-22.570724487304688, 46.36398839132818], + [-22.444381713867188, 46.357354276167015], + [-22.391510009765625, 46.3291502999477], + [-22.29263305664062, 46.382464893261165] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/out/issue-#901-simplified.geojson b/test/examples/line_overlap/out/issue-#901-simplified.geojson new file mode 100644 index 00000000..988780fd --- /dev/null +++ b/test/examples/line_overlap/out/issue-#901-simplified.geojson @@ -0,0 +1,52 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 2], + [4, 4] + ] + }, + "bbox": [2, 2, 4, 4], + "id": 0 + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 10, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [2, 2], + [4, 4] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 3, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [6, 6] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/out/issue-#901.geojson b/test/examples/line_overlap/out/issue-#901.geojson new file mode 100644 index 00000000..09d13e5e --- /dev/null +++ b/test/examples/line_overlap/out/issue-#901.geojson @@ -0,0 +1,170 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-113.33698987543352, 53.53214475018778], + [-113.33690471442213, 53.53212132654082], + [-113.33698987543352, 53.53214475018778], + [-113.33704111881613, 53.53215959791441] + ] + }, + "bbox": [ + -113.33704111881613, + 53.53214475018778, + -113.33698987543352, + 53.53215959791441 + ], + "id": 13 + }, + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-113.33698987543352, 53.53214475018778], + [-113.33690471442213, 53.53212132654082], + [-113.33698987543352, 53.53214475018778], + [-113.33704111881613, 53.53215959791441] + ] + }, + "bbox": [ + -113.33704111881613, + 53.53214475018778, + -113.33698987543352, + 53.53215959791441 + ], + "id": 13 + }, + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-113.33832502043951, 53.52244398828247], + [-113.3384152645109, 53.52244409344282], + [-113.33847575084239, 53.52244416392682], + [-113.3384152645109, 53.52244409344282] + ] + }, + "bbox": [ + -113.3384152645109, + 53.52244398828247, + -113.33832502043951, + 53.52244409344282 + ], + "id": 20 + }, + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-113.33832502043951, 53.52244398828247], + [-113.3384152645109, 53.52244409344282], + [-113.33847575084239, 53.52244416392682], + [-113.3384152645109, 53.52244409344282] + ] + }, + "bbox": [ + -113.3384152645109, + 53.52244398828247, + -113.33832502043951, + 53.52244409344282 + ], + "id": 20 + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "fill": "#F00", + "stroke-width": 10, + "stroke-opacity": 1, + "fill-opacity": 0.1, + "description": "output of an intersect call with a longer pipe and the other feature in this file" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-113.33847575084239, 53.52244416392682], + [-113.33847394, 53.52299533509864], + [-113.338470971, 53.52389165109878], + [-113.338468309, 53.52469456909876], + [-113.338467951, 53.5248023990988], + [-113.338462214, 53.52653346709882], + [-113.3384620759999, 53.52657586409872], + [-113.3384619429999, 53.52661770709869], + [-113.3384532659999, 53.52935323209886], + [-113.338452983, 53.52944258409877], + [-113.338452982, 53.52944333909876], + [-113.3384522719999, 53.52962258909884], + [-113.338449392, 53.53035074809878], + [-113.33704111881613, 53.53215959791441], + [-113.33698987543352, 53.53214475018778], + [-113.33690471442213, 53.53212132654082], + [-113.3382987129999, 53.53033083009888], + [-113.3383022259999, 53.52944312809881], + [-113.3383113299999, 53.52657569409888], + [-113.3383232079999, 53.52299515809875], + [-113.33832502043951, 53.52244398828247], + [-113.3384152645109, 53.52244409344282], + [-113.33847575084239, 53.52244416392682] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "fill": "#00F", + "stroke-width": 3, + "stroke-opacity": 1, + "fill-opacity": 0.1, + "description": "shape which was intersected with a longer pipe to produce the pipe shown" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-113.34145274487872, 53.53230853007057], + [-113.33797676517321, 53.53243070065233], + [-113.33698987543352, 53.53214475018778], + [-113.33287043896553, 53.53101169382826], + [-113.33387712516304, 53.522438805202505], + [-113.3384152645109, 53.52244409344282], + [-113.3429534044069, 53.522449381683145], + [-113.34145274487872, 53.53230853007057], + [-113.34145274487872, 53.53230853007057], + [-113.34145274487872, 53.53230853007057] + ] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/out/polygons.geojson b/test/examples/line_overlap/out/polygons.geojson new file mode 100644 index 00000000..d2ab42eb --- /dev/null +++ b/test/examples/line_overlap/out/polygons.geojson @@ -0,0 +1,99 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [130.52038135971, -22.13975701932], + [131.37809653737, -20.30857774535], + [129.67954157692, -18.92360398694], + [130.51910988115, -17.47899540098] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [130.34864729879, -30.96772909058], + [131.64065935144, -29.20137372199], + [129.5926694017, -28.04905296815], + [130.34739288016, -26.68605235913] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "fill": "#F00", + "stroke-width": 10, + "stroke-opacity": 1, + "fill-opacity": 0.1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [120.14179343574, -17.48153498141], + [120.1456007834, -30.96997373479], + [130.34864729879, -30.96772909058], + [131.64065935144, -29.20137372199], + [129.5926694017, -28.04905296815], + [130.34739288016, -26.68605235913], + [125.76890918238, -26.68710193815], + [125.76762773192, -22.1408865296], + [130.52038135971, -22.13975701932], + [131.37809653737, -20.30857774535], + [129.67954157692, -18.92360398694], + [130.51910988115, -17.47899540098], + [120.14179343574, -17.48153498141] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "fill": "#00F", + "stroke-width": 3, + "stroke-opacity": 1, + "fill-opacity": 0.1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [139.69468150776, -17.47674988707], + [130.51910988115, -17.47899540098], + [129.67954157692, -18.92360398694], + [131.37809653737, -20.30857774535], + [130.52038135971, -22.13975701932], + [135.29428724786, -22.138622473], + [135.29556869831, -26.68491802042], + [130.34739288016, -26.68605235913], + [129.5926694017, -28.04905296815], + [131.64065935144, -29.20137372199], + [130.34864729879, -30.96772909058], + [139.69848885541, -30.96567210295], + [139.69468150776, -17.47674988707] + ] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/out/simple1.geojson b/test/examples/line_overlap/out/simple1.geojson new file mode 100644 index 00000000..b7da65c7 --- /dev/null +++ b/test/examples/line_overlap/out/simple1.geojson @@ -0,0 +1,56 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 10, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [115, -35], + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 3, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [115, -25], + [125, -30], + [135, -30], + [145, -35], + [145, -25] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/out/simple2.geojson b/test/examples/line_overlap/out/simple2.geojson new file mode 100644 index 00000000..c9d5f41b --- /dev/null +++ b/test/examples/line_overlap/out/simple2.geojson @@ -0,0 +1,55 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 10, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [115, -35], + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 3, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [115, -25], + [125, -30], + [135, -30], + [145, -35] + ] + } + } + ] +} diff --git a/test/examples/line_overlap/out/simple3.geojson b/test/examples/line_overlap/out/simple3.geojson new file mode 100644 index 00000000..dc0d6737 --- /dev/null +++ b/test/examples/line_overlap/out/simple3.geojson @@ -0,0 +1,54 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#0F0", + "fill": "#0F0", + "stroke-width": 25 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#ff0000", + "stroke-width": 10, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [125, -30], + [135, -30], + [145, -35] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 3, + "stroke-opacity": 1 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [125, -30], + [135, -30], + [145, -35], + [145, -25] + ] + } + } + ] +} diff --git a/test/examples/rhumb_bearing/in/pair1.geojson b/test/examples/rhumb_bearing/in/pair1.geojson index b48344e8..d755b93a 100644 --- a/test/examples/rhumb_bearing/in/pair1.geojson +++ b/test/examples/rhumb_bearing/in/pair1.geojson @@ -1,31 +1,31 @@ { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "properties": { - "marker-color": "#F00" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -75, - 45 - ] - } - }, - { - "type": "Feature", - "properties": { - "marker-color": "#00F" - }, - "geometry": { - "type": "Point", - "coordinates": [ - 20, - 60 - ] - } - } - ] + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -75, + 45 + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-color": "#00F" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 20, + 60 + ] + } + } + ] } \ No newline at end of file diff --git a/test/examples/rhumb_bearing/out/pair1.geojson b/test/examples/rhumb_bearing/out/pair1.geojson index b5ab5e26..97c68508 100644 --- a/test/examples/rhumb_bearing/out/pair1.geojson +++ b/test/examples/rhumb_bearing/out/pair1.geojson @@ -1,71 +1,71 @@ { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "properties": { - "marker-color": "#F00" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -75, - 45 - ] - } - }, - { - "type": "Feature", - "properties": { - "marker-color": "#00F" - }, - "geometry": { - "type": "Point", - "coordinates": [ - 20, - 60 - ] - } - }, - { - "type": "Feature", - "properties": { - "stroke": "#F00", - "stroke-width": 6 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - -75, - 45 - ], - [ - -66.10068737769872, - 51.79325008492101 - ] - ] - } - }, - { - "type": "Feature", - "properties": { - "stroke": "#00F", - "stroke-width": 6 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 20, - 60 - ], - [ - 2.3844816279733956, - 63.440396381483744 - ] - ] - } - } - ] + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -75, + 45 + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-color": "#00F" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 20, + 60 + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -75, + 45 + ], + [ + -66.10068737769872, + 51.79325008492101 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "stroke": "#00F", + "stroke-width": 6 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 20, + 60 + ], + [ + 2.3844816279733956, + 63.440396381483744 + ] + ] + } + } + ] } \ No newline at end of file diff --git a/test/examples/rhumb_bearing/out/pair1.json b/test/examples/rhumb_bearing/out/pair1.json index 171e525a..800f3dd1 100644 --- a/test/examples/rhumb_bearing/out/pair1.json +++ b/test/examples/rhumb_bearing/out/pair1.json @@ -1,4 +1,4 @@ { - "initialBearing": 75.28061364784332, - "finalBearing": -104.7193863521567 + "initialBearing": 75.28061364784332, + "finalBearing": -104.7193863521567 } \ No newline at end of file From c5843364f927561275b15f33ce12cc912f79e0c3 Mon Sep 17 00:00:00 2001 From: Kangmin An Date: Thu, 22 Dec 2022 06:32:38 +0900 Subject: [PATCH 55/72] Add missing parameter 'unit'. (#145) --- lib/src/nearest_point_on_line.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/nearest_point_on_line.dart b/lib/src/nearest_point_on_line.dart index 72e924af..12554074 100644 --- a/lib/src/nearest_point_on_line.dart +++ b/lib/src/nearest_point_on_line.dart @@ -163,7 +163,7 @@ _NearestMulti? _nearestPointOnMultiLine( for (var i = 0; i < lines.coordinates.length; ++i) { final line = LineString(coordinates: lines.coordinates[i]); - final candidate = _nearestPointOnLine(line, point); + final candidate = _nearestPointOnLine(line, point, unit); if (nearest == null || candidate.distance < nearest.distance) { nearest = _NearestMulti( From e39cc45faa3a8162e5beb5732f9e97b50b7af04e Mon Sep 17 00:00:00 2001 From: ggastv Date: Wed, 19 Apr 2023 12:55:28 +0300 Subject: [PATCH 56/72] Implement rhumb_distance with tests. --- lib/distance.dart | 1 + lib/src/rhumb_distance.dart | 67 +++++++++++++++++ test/components/rhumb_distance_test.dart | 71 +++++++++++++++++++ .../rhumb_distance/in/fiji-539-lng.geojson | 21 ++++++ .../rhumb_distance/in/points-fiji.geojson | 21 ++++++ .../rhumb_distance/in/points1.geojson | 21 ++++++ .../rhumb_distance/in/points2.geojson | 21 ++++++ .../rhumb_distance/out/fiji-539-lng.json | 8 +++ .../rhumb_distance/out/points-fiji.json | 8 +++ test/examples/rhumb_distance/out/points1.json | 8 +++ test/examples/rhumb_distance/out/points2.json | 8 +++ 11 files changed, 255 insertions(+) create mode 100644 lib/src/rhumb_distance.dart create mode 100644 test/components/rhumb_distance_test.dart create mode 100644 test/examples/rhumb_distance/in/fiji-539-lng.geojson create mode 100644 test/examples/rhumb_distance/in/points-fiji.geojson create mode 100644 test/examples/rhumb_distance/in/points1.geojson create mode 100644 test/examples/rhumb_distance/in/points2.geojson create mode 100644 test/examples/rhumb_distance/out/fiji-539-lng.json create mode 100644 test/examples/rhumb_distance/out/points-fiji.json create mode 100644 test/examples/rhumb_distance/out/points1.json create mode 100644 test/examples/rhumb_distance/out/points2.json diff --git a/lib/distance.dart b/lib/distance.dart index 80f94203..0debc57d 100644 --- a/lib/distance.dart +++ b/lib/distance.dart @@ -1,3 +1,4 @@ library turf_distance; export 'src/distance.dart'; +export 'src/rhumb_distance.dart'; diff --git a/lib/src/rhumb_distance.dart b/lib/src/rhumb_distance.dart new file mode 100644 index 00000000..6adcb052 --- /dev/null +++ b/lib/src/rhumb_distance.dart @@ -0,0 +1,67 @@ +import 'package:turf/src/invariant.dart'; +import 'dart:math' as math; +import '../helpers.dart'; + +/// Calculates the distance along a rhumb line between two [Point] in degrees, radians, +/// miles, or kilometers. +/// +/// example: +/// ```dart +/// var from = Feature(geometry: Point(coordinates: Position.of([-75.343, 39.984]))); +/// var to = Feature(geometry: Point(coordinates: Position.of([-75.534, 39.123]))); +/// +/// var distance = turf.rhumbDistance(from, to, Unit.meters); +/// ``` + +num rhumbDistance(Point from, Point to, [Unit unit = Unit.kilometers]) { + final origin = getCoord(from); + final destination = getCoord(to); + + // compensate the crossing of the 180th meridian (https://macwright.org/2016/09/26/the-180th-meridian.html) + // solution from https://github.com/mapbox/mapbox-gl-js/issues/3250#issuecomment-294887678 + final compensateLng = (destination.lng - origin.lng) > 180 + ? -360 + : (origin.lng - destination.lng) > 180 + ? 360 + : 0; + + final distanceInMeters = calculateRhumbDistance(origin, Position(destination.lng + compensateLng, destination.lat)); + final distance = convertLength(distanceInMeters, Unit.meters, unit); + return distance; +} + +/// +/// Returns the distance travelling from ‘this’ point to destination point along a rhumb line. +/// Adapted from Geodesy ‘distanceTo‘: https://github.com/chrisveness/geodesy/blob/master/latlon-spherical.js +/// +/// example: +/// ```dart +/// var p1 = Feature(geometry: Point(coordinates: Position.of([1.338, 51.127]))); +/// var p2 = Feature(geometry: Point(coordinates: Position.of([1.853, 50.964]))); +/// var d = calculateRhumbDistance(p1, p2); // 40310 m +/// ``` +/// + +num calculateRhumbDistance(Position origin, Position destination, [num radius = earthRadius]) { + final R = radius; + final phi1 = (origin.lat * math.pi) / 180; + final phi2 = (destination.lat * math.pi) / 180; + final dPhi = phi2 - phi1; + + var dLambda = ((destination.lng - origin.lng).abs() * math.pi) / 180; + // if dLon over 180° take shorter rhumb line across the anti-meridian: + if (dLambda > math.pi) { + dLambda -= 2 * math.pi; + } + + // on Mercator projection, longitude distances shrink by latitude; q is the 'stretch factor' + // q becomes ill-conditioned along E-W line (0/0); use empirical tolerance to avoid it + final dPsi = math.log(math.tan(phi2 / 2 + math.pi / 4) / math.tan(phi1 / 2 + math.pi / 4)); + final q = dPsi.abs() > 10e-12 ? dPhi / dPsi : math.cos(phi1); + + // distance is pythagoras on 'stretched' Mercator projection + final delta = math.sqrt(dPhi * dPhi + q * q * dLambda * dLambda); // angular distance in radians + final dist = delta * R; + + return dist; +} diff --git a/test/components/rhumb_distance_test.dart b/test/components/rhumb_distance_test.dart new file mode 100644 index 00000000..ba845d1c --- /dev/null +++ b/test/components/rhumb_distance_test.dart @@ -0,0 +1,71 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/distance.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/rhumb_distance.dart'; + +void main() { + group( + 'rhumb_distance', + () { + test('calculateRhumbDistance -- raw parameters', () { + final matcher = 40.31; + final p1 = Position(1.338, 51.127); + final p2 = Position(1.853, 50.964); + + final distanceInMeters = calculateRhumbDistance(p1, p2); + final distance = round(convertLength(distanceInMeters, Unit.meters, Unit.kilometers), 2); + + expect(distance, matcher); + }); + + test('rhumbDistance -- raw parameters', () { + final matcher = 40.31; + final pt1 = Point(coordinates: Position(1.338, 51.127)); + final pt2 = Point(coordinates: Position(1.853, 50.964)); + + final distance = round(rhumbDistance(pt1, pt2), 2); + + expect(distance, matcher); + }); + + Directory inDir = Directory('./test/examples/rhumb_distance/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 = FeatureCollection.fromJson(jsonDecode(inSource)); + + final pt1 = inGeom.features[0].geometry!; + final pt2 = inGeom.features[1].geometry!; + + final distances = { + 'miles': round(rhumbDistance(pt1, pt2, Unit.miles), 6), + 'nauticalmiles': round(rhumbDistance(pt1, pt2, Unit.nauticalmiles), 6), + 'kilometers': round(rhumbDistance(pt1, pt2, Unit.kilometers), 6), + 'greatCircleDistance': round(distance(pt1, pt2, Unit.kilometers), 6), + 'radians': round(rhumbDistance(pt1, pt2, Unit.radians), 6), + 'degrees': round(rhumbDistance(pt1, pt2, Unit.degrees), 6), + }; + + Directory outDir = Directory('./test/examples/rhumb_distance/out'); + for (var file2 in outDir.listSync(recursive: true)) { + if (file2 is File && + file.path.endsWith('.json') && + file2.uri.pathSegments.last == file.uri.pathSegments.last) { + var outSource = jsonDecode(file.readAsStringSync()); + final isEqual = distances.keys.every((key) => distances[key] == outSource[key]); + expect(isEqual, true); + } + } + }, + ); + } + } + }, + ); +} diff --git a/test/examples/rhumb_distance/in/fiji-539-lng.geojson b/test/examples/rhumb_distance/in/fiji-539-lng.geojson new file mode 100644 index 00000000..608da0ea --- /dev/null +++ b/test/examples/rhumb_distance/in/fiji-539-lng.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-539.5, -16.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-541.5, -18.5] + } + } + ] +} diff --git a/test/examples/rhumb_distance/in/points-fiji.geojson b/test/examples/rhumb_distance/in/points-fiji.geojson new file mode 100644 index 00000000..5bd7c138 --- /dev/null +++ b/test/examples/rhumb_distance/in/points-fiji.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-179.5, -16.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [178.5, -16.5] + } + } + ] +} diff --git a/test/examples/rhumb_distance/in/points1.geojson b/test/examples/rhumb_distance/in/points1.geojson new file mode 100644 index 00000000..4e6de2dc --- /dev/null +++ b/test/examples/rhumb_distance/in/points1.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-75.343, 39.984] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-75.534, 39.123] + } + } + ] +} diff --git a/test/examples/rhumb_distance/in/points2.geojson b/test/examples/rhumb_distance/in/points2.geojson new file mode 100644 index 00000000..f423766b --- /dev/null +++ b/test/examples/rhumb_distance/in/points2.geojson @@ -0,0 +1,21 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-119.17968749999999, 35.60371874069731] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-67.5, 46.92025531537451] + } + } + ] +} diff --git a/test/examples/rhumb_distance/out/fiji-539-lng.json b/test/examples/rhumb_distance/out/fiji-539-lng.json new file mode 100644 index 00000000..9ad72e19 --- /dev/null +++ b/test/examples/rhumb_distance/out/fiji-539-lng.json @@ -0,0 +1,8 @@ +{ + "miles": 190.951278, + "nauticalmiles": 165.932124, + "kilometers": 307.306293, + "greatCircleDistance": 307.304881, + "radians": 0.048235, + "degrees": 2.763668 +} diff --git a/test/examples/rhumb_distance/out/points-fiji.json b/test/examples/rhumb_distance/out/points-fiji.json new file mode 100644 index 00000000..fa8a7556 --- /dev/null +++ b/test/examples/rhumb_distance/out/points-fiji.json @@ -0,0 +1,8 @@ +{ + "miles": 132.496268, + "nauticalmiles": 115.136109, + "kilometers": 213.232075, + "greatCircleDistance": 213.231201, + "radians": 0.033469, + "degrees": 1.917639 +} diff --git a/test/examples/rhumb_distance/out/points1.json b/test/examples/rhumb_distance/out/points1.json new file mode 100644 index 00000000..6bb364ad --- /dev/null +++ b/test/examples/rhumb_distance/out/points1.json @@ -0,0 +1,8 @@ +{ + "miles": 60.353311, + "nauticalmiles": 52.445594, + "kilometers": 97.129239, + "greatCircleDistance": 97.129221, + "radians": 0.015246, + "degrees": 0.873503 +} diff --git a/test/examples/rhumb_distance/out/points2.json b/test/examples/rhumb_distance/out/points2.json new file mode 100644 index 00000000..52186501 --- /dev/null +++ b/test/examples/rhumb_distance/out/points2.json @@ -0,0 +1,8 @@ +{ + "miles": 2785.013176, + "nauticalmiles": 2420.110283, + "kilometers": 4482.044244, + "greatCircleDistance": 4412.81774, + "radians": 0.703506, + "degrees": 40.307937 +} From bfbbe11d142baeddf712e42597d2cb63839367d5 Mon Sep 17 00:00:00 2001 From: ggastv Date: Wed, 19 Apr 2023 20:06:09 +0300 Subject: [PATCH 57/72] Implement rhumb_destination with tests. --- lib/destination.dart | 1 + lib/src/rhumb_destination.dart | 76 ++++++++++++++++ test/components/rhumb_destination_test.dart | 88 +++++++++++++++++++ .../in/fiji-east-west-539-lng.geojson | 11 +++ .../in/fiji-east-west.geojson | 11 +++ .../in/fiji-west-east.geojson | 11 +++ .../rhumb_destination/in/point-0.geojson | 10 +++ .../rhumb_destination/in/point-180.geojson | 8 ++ .../rhumb_destination/in/point-90.geojson | 10 +++ .../in/point-way-far-away.geojson | 12 +++ .../out/fiji-east-west-539-lng.geojson | 39 ++++++++ .../out/fiji-east-west.geojson | 39 ++++++++ .../out/fiji-west-east.geojson | 39 ++++++++ .../rhumb_destination/out/point-0.geojson | 38 ++++++++ .../rhumb_destination/out/point-180.geojson | 37 ++++++++ .../rhumb_destination/out/point-90.geojson | 38 ++++++++ .../out/point-way-far-away.geojson | 40 +++++++++ 17 files changed, 508 insertions(+) create mode 100644 lib/src/rhumb_destination.dart create mode 100644 test/components/rhumb_destination_test.dart create mode 100644 test/examples/rhumb_destination/in/fiji-east-west-539-lng.geojson create mode 100644 test/examples/rhumb_destination/in/fiji-east-west.geojson create mode 100644 test/examples/rhumb_destination/in/fiji-west-east.geojson create mode 100644 test/examples/rhumb_destination/in/point-0.geojson create mode 100644 test/examples/rhumb_destination/in/point-180.geojson create mode 100644 test/examples/rhumb_destination/in/point-90.geojson create mode 100644 test/examples/rhumb_destination/in/point-way-far-away.geojson create mode 100644 test/examples/rhumb_destination/out/fiji-east-west-539-lng.geojson create mode 100644 test/examples/rhumb_destination/out/fiji-east-west.geojson create mode 100644 test/examples/rhumb_destination/out/fiji-west-east.geojson create mode 100644 test/examples/rhumb_destination/out/point-0.geojson create mode 100644 test/examples/rhumb_destination/out/point-180.geojson create mode 100644 test/examples/rhumb_destination/out/point-90.geojson create mode 100644 test/examples/rhumb_destination/out/point-way-far-away.geojson diff --git a/lib/destination.dart b/lib/destination.dart index 29b0ce54..72965b4e 100644 --- a/lib/destination.dart +++ b/lib/destination.dart @@ -1,3 +1,4 @@ library turf_destination; export 'src/destination.dart'; +export 'src/rhumb_destination.dart'; diff --git a/lib/src/rhumb_destination.dart b/lib/src/rhumb_destination.dart new file mode 100644 index 00000000..8672fdbf --- /dev/null +++ b/lib/src/rhumb_destination.dart @@ -0,0 +1,76 @@ +import 'package:turf/src/invariant.dart'; +import 'dart:math' as math; +import '../helpers.dart'; + +/// +/// Returns the destination [Point] having travelled the given distance along a Rhumb line from the +/// origin Point with the (varant) given bearing. +/// +/// example: +/// ```dart +/// var properties = { 'foo': 'bar' }; +/// var point = Feature(geometry: Point(coordinates: Position.of([-75.343, 39.984]))); +/// +/// final destinationPoint = rhumbDestination( +/// feature.geometry!, +/// dist, +/// bearing, +/// unit: Unit.meters, +/// properties: feature.properties, +/// ); +/// ``` + +Feature rhumbDestination( + Point origin, + num distance, + num bearing, { + Unit? unit = Unit.kilometers, + Map? properties, +}) { + unit ??= Unit.kilometers; + + final wasNegativeDistance = distance < 0; + var distanceInMeters = convertLength(distance.abs(), unit, Unit.meters); + if (wasNegativeDistance) distanceInMeters = -(distanceInMeters.abs()); + final coords = getCoord(origin); + final destination = calculateRhumbDestination(coords, distanceInMeters, bearing); + + // compensate the crossing of the 180th meridian (https://macwright.org/2016/09/26/the-180th-meridian.html) + // solution from https://github.com/mapbox/mapbox-gl-js/issues/3250#issuecomment-294887678 + final compensateLng = (destination.lng - coords.lng) > 180 + ? -360 + : (coords.lng - destination.lng) > 180 + ? 360 + : 0; + + return Feature(geometry: Point(coordinates: Position(destination.lng + compensateLng, destination.lat))); +} + +Position calculateRhumbDestination(Position origin, num distance, num bearing, [num radius = earthRadius]) { + final R = radius > 0 ? radius : earthRadius; + final delta = distance / R; + final lambda1 = (origin.lng * math.pi) / 180; + final phi1 = degreesToRadians(origin.lat); + final theta = degreesToRadians(bearing); + + final dPhi = delta * math.cos(theta); + var phi2 = phi1 + dPhi; + + // check for some daft bugger going past the pole, normalise latitude if so + if (phi2.abs() > math.pi / 2) { + phi2 = phi2 > 0 ? math.pi - phi2 : -math.pi - phi2; + } + + final dPsi = math.log(math.tan(phi2 / 2 + math.pi / 4) / math.tan(phi1 / 2 + math.pi / 4)); + // E-W course becomes ill-conditioned with 0/0 + final q = dPsi.abs() > 10e-12 ? dPhi / dPsi : math.cos(phi1); + + final dLambda = (delta * math.sin(theta)) / q; + final lambda2 = lambda1 + dLambda; + + // normalise to −180..+180° + final lng = (((lambda2 * 180) / math.pi + 540) % 360) - 180; + final lat = (phi2 * 180) / math.pi; + + return Position(lng, lat); +} diff --git a/test/components/rhumb_destination_test.dart b/test/components/rhumb_destination_test.dart new file mode 100644 index 00000000..e47b814a --- /dev/null +++ b/test/components/rhumb_destination_test.dart @@ -0,0 +1,88 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/destination.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/invariant.dart'; +import 'package:turf/truncate.dart'; +import 'package:turf_equality/turf_equality.dart'; + +void main() { + group( + 'rhumb_destination', + () { + test('rhumb-destintation -- add properties', () { + final props = {'foo': 'bar'}; + final pt = Feature( + geometry: Point(coordinates: Position(12, -54)), + properties: props, + ); + final out = rhumbDestination(pt.geometry!, 0, 45, properties: {'foo': 'bar'}); + + final isEqual = out.properties != null && out.properties!.keys.every((k) => props[k] == out.properties?[k]); + expect(isEqual, true); + }); + + test('rhumb-destintation -- allows negative distance', () { + final matcher = Point(coordinates: Position(10.90974456038191, -54.63591552764877)); + final pt = Point(coordinates: Position(12, -54)); + + final out = rhumbDestination(pt, -100, 45); + + expect(out.geometry!, matcher); + }); + + Directory inDir = Directory('./test/examples/rhumb_destination/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 feature = Feature.fromJson(jsonDecode(inSource)); + + final bearing = feature.properties?['bearing'] ?? 180; + final dist = feature.properties?['dist'] ?? 100; + final unitName = feature.properties?['units']; + final unit = unitName == null ? null : Unit.values.byName(unitName); + + final destinationPoint = rhumbDestination( + feature.geometry!, + dist, + bearing, + unit: unit, + properties: feature.properties, + ); + + final line = truncate( + Feature( + geometry: LineString(coordinates: [getCoord(feature), getCoord(destinationPoint)]), + properties: { + 'stroke': "#F00", + "stroke-width": 4, + }), + ) as Feature; + + feature.properties ??= const {}; + feature.properties?.putIfAbsent('marker-color', () => "#F00"); + + final result = FeatureCollection(features: [line, feature, destinationPoint]); + + Directory outDir = Directory('./test/examples/rhumb_destination/out'); + for (var file2 in outDir.listSync(recursive: true)) { + if (file2 is File && + file2.uri.pathSegments.last == file.uri.pathSegments.last) { + var outSource = file2.readAsStringSync(); + var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); + Equality eq = Equality(); + expect(eq.compare(result, outGeom), true); + } + } + }, + ); + } + } + }, + ); +} diff --git a/test/examples/rhumb_destination/in/fiji-east-west-539-lng.geojson b/test/examples/rhumb_destination/in/fiji-east-west-539-lng.geojson new file mode 100644 index 00000000..ceaf24f9 --- /dev/null +++ b/test/examples/rhumb_destination/in/fiji-east-west-539-lng.geojson @@ -0,0 +1,11 @@ +{ + "type": "Feature", + "properties": { + "bearing": -90, + "dist": 100 + }, + "geometry": { + "type": "Point", + "coordinates": [-539.5, -16.5] + } +} diff --git a/test/examples/rhumb_destination/in/fiji-east-west.geojson b/test/examples/rhumb_destination/in/fiji-east-west.geojson new file mode 100644 index 00000000..8cdd3de0 --- /dev/null +++ b/test/examples/rhumb_destination/in/fiji-east-west.geojson @@ -0,0 +1,11 @@ +{ + "type": "Feature", + "properties": { + "bearing": -90, + "dist": 100 + }, + "geometry": { + "type": "Point", + "coordinates": [-179.5, -16.5] + } +} diff --git a/test/examples/rhumb_destination/in/fiji-west-east.geojson b/test/examples/rhumb_destination/in/fiji-west-east.geojson new file mode 100644 index 00000000..9e660ebf --- /dev/null +++ b/test/examples/rhumb_destination/in/fiji-west-east.geojson @@ -0,0 +1,11 @@ +{ + "type": "Feature", + "properties": { + "bearing": 120, + "dist": 150 + }, + "geometry": { + "type": "Point", + "coordinates": [179.5, -16.5] + } +} diff --git a/test/examples/rhumb_destination/in/point-0.geojson b/test/examples/rhumb_destination/in/point-0.geojson new file mode 100644 index 00000000..1a68cbfc --- /dev/null +++ b/test/examples/rhumb_destination/in/point-0.geojson @@ -0,0 +1,10 @@ +{ + "type": "Feature", + "properties": { + "bearing": 0 + }, + "geometry": { + "type": "Point", + "coordinates": [-75, 38.10096062273525] + } +} diff --git a/test/examples/rhumb_destination/in/point-180.geojson b/test/examples/rhumb_destination/in/point-180.geojson new file mode 100644 index 00000000..ffd2eff9 --- /dev/null +++ b/test/examples/rhumb_destination/in/point-180.geojson @@ -0,0 +1,8 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-75, 39] + } +} diff --git a/test/examples/rhumb_destination/in/point-90.geojson b/test/examples/rhumb_destination/in/point-90.geojson new file mode 100644 index 00000000..99907be4 --- /dev/null +++ b/test/examples/rhumb_destination/in/point-90.geojson @@ -0,0 +1,10 @@ +{ + "type": "Feature", + "properties": { + "bearing": 90 + }, + "geometry": { + "type": "Point", + "coordinates": [-75, 39] + } +} diff --git a/test/examples/rhumb_destination/in/point-way-far-away.geojson b/test/examples/rhumb_destination/in/point-way-far-away.geojson new file mode 100644 index 00000000..c01b24f8 --- /dev/null +++ b/test/examples/rhumb_destination/in/point-way-far-away.geojson @@ -0,0 +1,12 @@ +{ + "type": "Feature", + "properties": { + "bearing": 90, + "dist": 5000, + "units": "miles" + }, + "geometry": { + "type": "Point", + "coordinates": [-75, 39] + } +} diff --git a/test/examples/rhumb_destination/out/fiji-east-west-539-lng.geojson b/test/examples/rhumb_destination/out/fiji-east-west-539-lng.geojson new file mode 100644 index 00000000..c82eaf39 --- /dev/null +++ b/test/examples/rhumb_destination/out/fiji-east-west-539-lng.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-539.5, -16.5], + [-180.437945, -16.5] + ] + } + }, + { + "type": "Feature", + "properties": { + "bearing": -90, + "dist": 100, + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [-539.5, -16.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-180.4379451955566, -16.5] + } + } + ] +} diff --git a/test/examples/rhumb_destination/out/fiji-east-west.geojson b/test/examples/rhumb_destination/out/fiji-east-west.geojson new file mode 100644 index 00000000..bf69e159 --- /dev/null +++ b/test/examples/rhumb_destination/out/fiji-east-west.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-179.5, -16.5], + [-180.437945, -16.5] + ] + } + }, + { + "type": "Feature", + "properties": { + "bearing": -90, + "dist": 100, + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [-179.5, -16.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-180.43794519555667, -16.5] + } + } + ] +} diff --git a/test/examples/rhumb_destination/out/fiji-west-east.geojson b/test/examples/rhumb_destination/out/fiji-west-east.geojson new file mode 100644 index 00000000..1f31b95c --- /dev/null +++ b/test/examples/rhumb_destination/out/fiji-west-east.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [179.5, -16.5], + [180.720584, -17.17449] + ] + } + }, + { + "type": "Feature", + "properties": { + "bearing": 120, + "dist": 150, + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [179.5, -16.5] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [180.72058412338447, -17.174490272793403] + } + } + ] +} diff --git a/test/examples/rhumb_destination/out/point-0.geojson b/test/examples/rhumb_destination/out/point-0.geojson new file mode 100644 index 00000000..7dc3c407 --- /dev/null +++ b/test/examples/rhumb_destination/out/point-0.geojson @@ -0,0 +1,38 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-75, 38.100961], + [-75, 39.000281] + ] + } + }, + { + "type": "Feature", + "properties": { + "bearing": 0, + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [-75, 38.10096062273525] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-75, 39.00028098645979] + } + } + ] +} diff --git a/test/examples/rhumb_destination/out/point-180.geojson b/test/examples/rhumb_destination/out/point-180.geojson new file mode 100644 index 00000000..05af073e --- /dev/null +++ b/test/examples/rhumb_destination/out/point-180.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-75, 39], + [-75, 38.10068] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [-75, 39] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-75, 38.10067963627546] + } + } + ] +} diff --git a/test/examples/rhumb_destination/out/point-90.geojson b/test/examples/rhumb_destination/out/point-90.geojson new file mode 100644 index 00000000..5eb11bcf --- /dev/null +++ b/test/examples/rhumb_destination/out/point-90.geojson @@ -0,0 +1,38 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-75, 39], + [-73.842791, 39] + ] + } + }, + { + "type": "Feature", + "properties": { + "bearing": 90, + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [-75, 39] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [-73.84279091917494, 39] + } + } + ] +} diff --git a/test/examples/rhumb_destination/out/point-way-far-away.geojson b/test/examples/rhumb_destination/out/point-way-far-away.geojson new file mode 100644 index 00000000..af604fcb --- /dev/null +++ b/test/examples/rhumb_destination/out/point-way-far-away.geojson @@ -0,0 +1,40 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [-75, 39], + [18.117375, 39] + ] + } + }, + { + "type": "Feature", + "properties": { + "bearing": 90, + "dist": 5000, + "units": "miles", + "marker-color": "#F00" + }, + "geometry": { + "type": "Point", + "coordinates": [-75, 39] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [18.117374548567227, 39] + } + } + ] +} From 02f5497313913c36289a2bd05619e1929ae2aada Mon Sep 17 00:00:00 2001 From: ggastv Date: Wed, 19 Apr 2023 20:31:40 +0300 Subject: [PATCH 58/72] Implement centroid with tests. --- lib/src/centroid.dart | 34 +++++++++++ lib/turf.dart | 1 + test/components/centroid_test.dart | 56 +++++++++++++++++++ .../centroid/in/feature-collection.geojson | 37 ++++++++++++ .../centroid/in/imbalanced-polygon.geojson | 31 ++++++++++ test/examples/centroid/in/linestring.geojson | 11 ++++ test/examples/centroid/in/point.geojson | 8 +++ test/examples/centroid/in/polygon.geojson | 19 +++++++ .../centroid/out/feature-collection.geojson | 47 ++++++++++++++++ .../centroid/out/imbalanced-polygon.geojson | 46 +++++++++++++++ test/examples/centroid/out/linestring.geojson | 26 +++++++++ test/examples/centroid/out/point.geojson | 23 ++++++++ test/examples/centroid/out/polygon.geojson | 34 +++++++++++ 13 files changed, 373 insertions(+) create mode 100644 lib/src/centroid.dart create mode 100644 test/components/centroid_test.dart create mode 100644 test/examples/centroid/in/feature-collection.geojson create mode 100644 test/examples/centroid/in/imbalanced-polygon.geojson create mode 100644 test/examples/centroid/in/linestring.geojson create mode 100644 test/examples/centroid/in/point.geojson create mode 100644 test/examples/centroid/in/polygon.geojson create mode 100644 test/examples/centroid/out/feature-collection.geojson create mode 100644 test/examples/centroid/out/imbalanced-polygon.geojson create mode 100644 test/examples/centroid/out/linestring.geojson create mode 100644 test/examples/centroid/out/point.geojson create mode 100644 test/examples/centroid/out/polygon.geojson diff --git a/lib/src/centroid.dart b/lib/src/centroid.dart new file mode 100644 index 00000000..33874ad1 --- /dev/null +++ b/lib/src/centroid.dart @@ -0,0 +1,34 @@ +import 'package:turf/helpers.dart'; +import 'package:turf/meta.dart'; + +/// Takes a [Feature] or a [FeatureCollection] and computes the centroid as the mean of all vertices within the object. +/// +/// example: +/// ```dart +/// final line = Feature(geometry: LineString(coordinates: [Position(0, 0), Position(1, 1)])); +/// +/// final pt = centroid(line); +/// ``` +Feature centroid( + GeoJSONObject geoJSON, { + Map? properties, +}) { + num xSum = 0; + num ySum = 0; + int len = 0; + + coordEach(geoJSON, (coords, _, __, ___, ____) { + if (coords != null) { + xSum += coords[0]!; + ySum += coords[1]!; + len++; + } + }, true); + + return Feature( + geometry: Point( + coordinates: Position(xSum / len, ySum / len), + ), + properties: properties, + ); +} diff --git a/lib/turf.dart b/lib/turf.dart index f709df2c..01f1bc68 100644 --- a/lib/turf.dart +++ b/lib/turf.dart @@ -4,6 +4,7 @@ export 'src/area.dart'; export 'src/bbox.dart'; export 'src/bearing.dart'; export 'src/center.dart'; +export 'src/centroid.dart'; export 'src/destination.dart'; export 'src/distance.dart'; export 'src/geojson.dart'; diff --git a/test/components/centroid_test.dart b/test/components/centroid_test.dart new file mode 100644 index 00000000..814dcb5f --- /dev/null +++ b/test/components/centroid_test.dart @@ -0,0 +1,56 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/src/meta/feature.dart'; +import 'package:turf/turf.dart'; +import 'package:turf_equality/turf_equality.dart'; + +void main() { + group( + 'centroid', + () { + test('centroid -- add properties', () { + final line = Feature(geometry: LineString(coordinates: [Position(0, 0), Position(1, 1)])); + final out = centroid(line, properties: {'foo': 'bar'}); + + final isEqual = out.properties?['foo'] == 'bar'; + expect(isEqual, true); + }); + + Directory inDir = Directory('./test/examples/centroid/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 feature = GeoJSONObject.fromJson(jsonDecode(inSource)); + + final centered = centroid( + feature, + properties: {"marker-symbol": "circle"}, + ); + + final result = FeatureCollection(features: [centered]); + featureEach( + feature, + (currentFeature, featureIndex) => result.features.add(currentFeature), + ); + + Directory outDir = Directory('./test/examples/centroid/out'); + for (var file2 in outDir.listSync(recursive: true)) { + if (file2 is File && file2.uri.pathSegments.last == file.uri.pathSegments.last) { + var outSource = file2.readAsStringSync(); + var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); + Equality eq = Equality(); + expect(eq.compare(result, outGeom), true); + } + } + }, + ); + } + } + }, + ); +} diff --git a/test/examples/centroid/in/feature-collection.geojson b/test/examples/centroid/in/feature-collection.geojson new file mode 100644 index 00000000..79fa4a7b --- /dev/null +++ b/test/examples/centroid/in/feature-collection.geojson @@ -0,0 +1,37 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.833351373672485, 45.760809294695534] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.8331475257873535, 45.760296567821456] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.833984374999999, 45.76073818687033] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.834005832672119, 45.76022171678877] + } + } + ] +} diff --git a/test/examples/centroid/in/imbalanced-polygon.geojson b/test/examples/centroid/in/imbalanced-polygon.geojson new file mode 100644 index 00000000..27ddbfd8 --- /dev/null +++ b/test/examples/centroid/in/imbalanced-polygon.geojson @@ -0,0 +1,31 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.854240417480469, 45.77258200374433], + [4.8445844650268555, 45.777431068484894], + [4.845442771911621, 45.778658234059755], + [4.845914840698242, 45.779376562352425], + [4.846644401550292, 45.78021460033108], + [4.847245216369629, 45.78078326178593], + [4.848060607910156, 45.78138184652523], + [4.8487043380737305, 45.78186070968964], + [4.849562644958495, 45.78248921135124], + [4.850893020629883, 45.78302792142197], + [4.852008819580077, 45.78374619341895], + [4.852995872497559, 45.784075398324866], + [4.853854179382324, 45.78443452873236], + [4.8549699783325195, 45.78470387501975], + [4.85569953918457, 45.784793656826345], + [4.857330322265624, 45.784853511283764], + [4.858231544494629, 45.78494329284938], + [4.859304428100585, 45.784883438488365], + [4.858360290527344, 45.77294120818474], + [4.854240417480469, 45.77258200374433] + ] + ] + } +} diff --git a/test/examples/centroid/in/linestring.geojson b/test/examples/centroid/in/linestring.geojson new file mode 100644 index 00000000..6b885f50 --- /dev/null +++ b/test/examples/centroid/in/linestring.geojson @@ -0,0 +1,11 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.86020565032959, 45.76884015325622], + [4.85994815826416, 45.749558161214516] + ] + } +} diff --git a/test/examples/centroid/in/point.geojson b/test/examples/centroid/in/point.geojson new file mode 100644 index 00000000..e49e07dc --- /dev/null +++ b/test/examples/centroid/in/point.geojson @@ -0,0 +1,8 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.831961989402771, 45.75764678012361] + } +} diff --git a/test/examples/centroid/in/polygon.geojson b/test/examples/centroid/in/polygon.geojson new file mode 100644 index 00000000..5ef4bca6 --- /dev/null +++ b/test/examples/centroid/in/polygon.geojson @@ -0,0 +1,19 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.8250579833984375, 45.79398056386735], + [4.882392883300781, 45.79254427435898], + [4.910373687744141, 45.76081677972451], + [4.894924163818359, 45.7271539426975], + [4.824199676513671, 45.71337148333104], + [4.773387908935547, 45.74021417890731], + [4.778022766113281, 45.778418789239055], + [4.8250579833984375, 45.79398056386735] + ] + ] + } +} diff --git a/test/examples/centroid/out/feature-collection.geojson b/test/examples/centroid/out/feature-collection.geojson new file mode 100644 index 00000000..9d1cbb4f --- /dev/null +++ b/test/examples/centroid/out/feature-collection.geojson @@ -0,0 +1,47 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [4.8336222767829895, 45.76051644154402] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.833351373672485, 45.760809294695534] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.8331475257873535, 45.760296567821456] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.833984374999999, 45.76073818687033] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.834005832672119, 45.76022171678877] + } + } + ] +} diff --git a/test/examples/centroid/out/imbalanced-polygon.geojson b/test/examples/centroid/out/imbalanced-polygon.geojson new file mode 100644 index 00000000..3a257a70 --- /dev/null +++ b/test/examples/centroid/out/imbalanced-polygon.geojson @@ -0,0 +1,46 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [4.851791984156558, 45.78143055383553] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.854240417480469, 45.77258200374433], + [4.8445844650268555, 45.777431068484894], + [4.845442771911621, 45.778658234059755], + [4.845914840698242, 45.779376562352425], + [4.846644401550292, 45.78021460033108], + [4.847245216369629, 45.78078326178593], + [4.848060607910156, 45.78138184652523], + [4.8487043380737305, 45.78186070968964], + [4.849562644958495, 45.78248921135124], + [4.850893020629883, 45.78302792142197], + [4.852008819580077, 45.78374619341895], + [4.852995872497559, 45.784075398324866], + [4.853854179382324, 45.78443452873236], + [4.8549699783325195, 45.78470387501975], + [4.85569953918457, 45.784793656826345], + [4.857330322265624, 45.784853511283764], + [4.858231544494629, 45.78494329284938], + [4.859304428100585, 45.784883438488365], + [4.858360290527344, 45.77294120818474], + [4.854240417480469, 45.77258200374433] + ] + ] + } + } + ] +} diff --git a/test/examples/centroid/out/linestring.geojson b/test/examples/centroid/out/linestring.geojson new file mode 100644 index 00000000..b2447abf --- /dev/null +++ b/test/examples/centroid/out/linestring.geojson @@ -0,0 +1,26 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [4.860076904296875, 45.75919915723537] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [4.86020565032959, 45.76884015325622], + [4.85994815826416, 45.749558161214516] + ] + } + } + ] +} diff --git a/test/examples/centroid/out/point.geojson b/test/examples/centroid/out/point.geojson new file mode 100644 index 00000000..931d3d83 --- /dev/null +++ b/test/examples/centroid/out/point.geojson @@ -0,0 +1,23 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [4.831961989402771, 45.75764678012361] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [4.831961989402771, 45.75764678012361] + } + } + ] +} diff --git a/test/examples/centroid/out/polygon.geojson b/test/examples/centroid/out/polygon.geojson new file mode 100644 index 00000000..5ae0c04d --- /dev/null +++ b/test/examples/centroid/out/polygon.geojson @@ -0,0 +1,34 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [4.841194152832031, 45.75807143030368] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.8250579833984375, 45.79398056386735], + [4.882392883300781, 45.79254427435898], + [4.910373687744141, 45.76081677972451], + [4.894924163818359, 45.7271539426975], + [4.824199676513671, 45.71337148333104], + [4.773387908935547, 45.74021417890731], + [4.778022766113281, 45.778418789239055], + [4.8250579833984375, 45.79398056386735] + ] + ] + } + } + ] +} From a0aba247f832e37efba6a8e795e24c44d4c52205 Mon Sep 17 00:00:00 2001 From: ggastv Date: Thu, 20 Apr 2023 14:54:17 +0300 Subject: [PATCH 59/72] Implement transform_rotate with tests. --- lib/src/transform_rotate.dart | 46 +++ lib/transform.dart | 3 + test/components/transform_rotate_test.dart | 111 ++++++++ .../examples/transform_rotate/in/line.geojson | 23 ++ .../transform_rotate/in/multiLine.geojson | 22 ++ .../transform_rotate/in/multiPoint.geojson | 15 + .../transform_rotate/in/multiPolygon.geojson | 123 ++++++++ .../transform_rotate/in/no-rotation.geojson | 42 +++ .../transform_rotate/in/point.geojson | 11 + .../transform_rotate/in/polygon-fiji.geojson | 39 +++ .../in/polygon-resolute-bay.geojson | 38 +++ .../in/polygon-with-hole.geojson | 59 ++++ .../transform_rotate/in/polygon.geojson | 18 ++ .../transform_rotate/in/z-coord.geojson | 19 ++ .../transform_rotate/out/line.geojson | 63 +++++ .../transform_rotate/out/multiLine.geojson | 61 ++++ .../transform_rotate/out/multiPoint.geojson | 47 ++++ .../transform_rotate/out/multiPolygon.geojson | 263 ++++++++++++++++++ .../transform_rotate/out/no-rotation.geojson | 101 +++++++ .../transform_rotate/out/point.geojson | 39 +++ .../transform_rotate/out/polygon-fiji.geojson | 95 +++++++ .../out/polygon-resolute-bay.geojson | 93 +++++++ .../out/polygon-with-hole.geojson | 135 +++++++++ .../transform_rotate/out/polygon.geojson | 53 ++++ .../transform_rotate/out/z-coord.geojson | 55 ++++ 25 files changed, 1574 insertions(+) create mode 100644 lib/src/transform_rotate.dart create mode 100644 lib/transform.dart create mode 100644 test/components/transform_rotate_test.dart create mode 100644 test/examples/transform_rotate/in/line.geojson create mode 100644 test/examples/transform_rotate/in/multiLine.geojson create mode 100644 test/examples/transform_rotate/in/multiPoint.geojson create mode 100644 test/examples/transform_rotate/in/multiPolygon.geojson create mode 100644 test/examples/transform_rotate/in/no-rotation.geojson create mode 100644 test/examples/transform_rotate/in/point.geojson create mode 100644 test/examples/transform_rotate/in/polygon-fiji.geojson create mode 100644 test/examples/transform_rotate/in/polygon-resolute-bay.geojson create mode 100644 test/examples/transform_rotate/in/polygon-with-hole.geojson create mode 100644 test/examples/transform_rotate/in/polygon.geojson create mode 100644 test/examples/transform_rotate/in/z-coord.geojson create mode 100644 test/examples/transform_rotate/out/line.geojson create mode 100644 test/examples/transform_rotate/out/multiLine.geojson create mode 100644 test/examples/transform_rotate/out/multiPoint.geojson create mode 100644 test/examples/transform_rotate/out/multiPolygon.geojson create mode 100644 test/examples/transform_rotate/out/no-rotation.geojson create mode 100644 test/examples/transform_rotate/out/point.geojson create mode 100644 test/examples/transform_rotate/out/polygon-fiji.geojson create mode 100644 test/examples/transform_rotate/out/polygon-resolute-bay.geojson create mode 100644 test/examples/transform_rotate/out/polygon-with-hole.geojson create mode 100644 test/examples/transform_rotate/out/polygon.geojson create mode 100644 test/examples/transform_rotate/out/z-coord.geojson diff --git a/lib/src/transform_rotate.dart b/lib/src/transform_rotate.dart new file mode 100644 index 00000000..d6d078e2 --- /dev/null +++ b/lib/src/transform_rotate.dart @@ -0,0 +1,46 @@ +import 'package:turf/bearing.dart'; +import 'package:turf/distance.dart'; +import 'package:turf/src/centroid.dart'; +import 'package:turf/src/meta/coord.dart'; +import 'package:turf/src/rhumb_destination.dart'; + +import '../helpers.dart'; +import 'invariant.dart'; + +/// Rotates any [GeoJSONObject] of a specified angle, around its `centroid` or a given `pivot` [Point]. +/// +/// example: +/// ```dart +/// final line = Feature(geometry: LineString.fromJson({'coordinates': [[10, 10],[12, 15]]})); +/// final rotated = transformRotate(line, 100); +/// ``` + +GeoJSONObject transformRotate( + GeoJSONObject geoJSON, + num angle, { + Point? pivot, + bool mutate = false, +}) { + if (angle == 0) { + return geoJSON; + } + + // Use centroid of GeoJSON if pivot is not provided + pivot ??= centroid(geoJSON).geometry!; + + // Clone geojson to avoid side effects + if (mutate == false) geoJSON = geoJSON.clone(); + + // Rotate each coordinate + coordEach(geoJSON, (pointCoords, _, __, ___, ____) { + final currentPoint = Point(coordinates: pointCoords!); + final initialAngle = rhumbBearing(pivot!, currentPoint); + final finalAngle = initialAngle + angle; + final distance = rhumbDistance(pivot, currentPoint); + final newCoords = getCoord(rhumbDestination(pivot, distance, finalAngle)); + pointCoords[0] = newCoords[0]!; + pointCoords[1] = newCoords[1]!; + }); + + return geoJSON; +} diff --git a/lib/transform.dart b/lib/transform.dart new file mode 100644 index 00000000..067b85e6 --- /dev/null +++ b/lib/transform.dart @@ -0,0 +1,3 @@ +library turf_transform; + +export 'src/transform_rotate.dart'; \ No newline at end of file diff --git a/test/components/transform_rotate_test.dart b/test/components/transform_rotate_test.dart new file mode 100644 index 00000000..e5a97325 --- /dev/null +++ b/test/components/transform_rotate_test.dart @@ -0,0 +1,111 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/src/centroid.dart'; +import 'package:turf/src/invariant.dart'; +import 'package:turf/src/transform_rotate.dart'; +import 'package:turf/truncate.dart'; +import 'package:turf_equality/turf_equality.dart'; + +void main() { + group( + 'transform_rotate', + () { + test('transform_rotate -- mutated input', () { + Equality eq = Equality(); + final line = Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [10, 10], + [12, 15], + ] + }), + ); + final lineBefore = line.clone(); + final rotatedMatcher = Feature( + geometry: LineString.fromJson({ + 'coordinates': [ + [8.6, 13.9], + [13.3, 11.1], + ] + }), + ); + + transformRotate(line, 100); + + expect(eq.compare(line, lineBefore), true, reason: 'input should NOT be mutated'); + + transformRotate(line, 100, mutate: true); + + expect(eq.compare(truncate(line, precision: 1), rotatedMatcher), true, reason: "input should be mutated"); + }); + + Directory inDir = Directory('./test/examples/transform_rotate/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 feature = Feature.fromJson(jsonDecode(inSource)); + + final angle = feature.properties?['angle']; + var pivot = feature.properties?['pivot']; + pivot = pivot == null ? null : Point.fromJson({'coordinates': pivot}); + + final rotated = transformRotate( + feature, + angle, + pivot: pivot, + ); + + final truncated = truncate( + rotated as Feature, + precision: 6, + coordinates: 3, + ); + + final result = FeatureCollection() + ..features = [ + colorize(truncated), + feature, + makePivot(pivot, feature), + ]; + + Directory outDir = Directory('./test/examples/transform_rotate/out'); + for (var file2 in outDir.listSync(recursive: true)) { + if (file2 is File && file2.uri.pathSegments.last == file.uri.pathSegments.last) { + var outSource = file2.readAsStringSync(); + var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); + Equality eq = Equality(); + expect(eq.compare(result, outGeom), true); + } + } + }, + ); + } + } + }, + ); +} + +Feature colorize(GeoJSONObject geojson) { + final feature = geojson as Feature; + if (feature.geometry?.type == GeoJSONObjectType.point || feature.geometry?.type == GeoJSONObjectType.multiPoint) { + feature.properties?.putIfAbsent("marker-color", () => "#F00"); + feature.properties?.putIfAbsent("marker-symbol", () => "star"); + } else { + feature.properties?.putIfAbsent("stroke", () => "#F00"); + feature.properties?.putIfAbsent("stroke-width", () => 4); + } + return feature; +} + +Feature makePivot(Point? pivot, GeoJSONObject geojson) { + if (pivot == null) { + return centroid(geojson, properties: {"marker-symbol": "circle"}); + } + return Feature(geometry: Point(coordinates: getCoord(pivot)), properties: {"marker-symbol": "circle"}); +} diff --git a/test/examples/transform_rotate/in/line.geojson b/test/examples/transform_rotate/in/line.geojson new file mode 100644 index 00000000..ad05ef7d --- /dev/null +++ b/test/examples/transform_rotate/in/line.geojson @@ -0,0 +1,23 @@ +{ + "type": "Feature", + "properties": { + "angle": 30 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [11.259269714355469, 44.48450449695473], + [11.268196105957031, 44.48866833139464], + [11.272315979003906, 44.5063000997406], + [11.286735534667969, 44.52343698529045], + [11.306304931640625, 44.52515039667307], + [11.325874328613281, 44.53298249265435], + [11.347160339355469, 44.5302903284497], + [11.37359619140625, 44.51878604321948], + [11.381149291992186, 44.50948304524639], + [11.381492614746094, 44.503606702401854], + [11.392478942871094, 44.49185223953622], + [11.406898498535156, 44.48548424944496] + ] + } +} diff --git a/test/examples/transform_rotate/in/multiLine.geojson b/test/examples/transform_rotate/in/multiLine.geojson new file mode 100644 index 00000000..9a6f99a6 --- /dev/null +++ b/test/examples/transform_rotate/in/multiLine.geojson @@ -0,0 +1,22 @@ +{ + "type": "Feature", + "properties": { + "angle": 90, + "pivot": [-98.9, 19.15] + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [-99.2, 19.1], + [-99.1, 19.17], + [-99, 19.1] + ], + [ + [-99.2, 19.16], + [-99.1, 19.23], + [-99, 19.16] + ] + ] + } +} diff --git a/test/examples/transform_rotate/in/multiPoint.geojson b/test/examples/transform_rotate/in/multiPoint.geojson new file mode 100644 index 00000000..6981caeb --- /dev/null +++ b/test/examples/transform_rotate/in/multiPoint.geojson @@ -0,0 +1,15 @@ +{ + "type": "Feature", + "properties": { + "angle": -110 + }, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [100.0, 0.0], + [101.0, 1.0], + [101.15, -0.86], + [99.8, 1.8] + ] + } +} diff --git a/test/examples/transform_rotate/in/multiPolygon.geojson b/test/examples/transform_rotate/in/multiPolygon.geojson new file mode 100644 index 00000000..c5d429fb --- /dev/null +++ b/test/examples/transform_rotate/in/multiPolygon.geojson @@ -0,0 +1,123 @@ +{ + "type": "Feature", + "properties": { + "angle": -35 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-80.83740234375, -33.75146241858857], + [-80.8267593383789, -33.76316538009658], + [-80.83036422729492, -33.77643631739436], + [-80.79448699951172, -33.81181543283183], + [-80.77629089355469, -33.8159515518711], + [-80.76066970825195, -33.805254282102595], + [-80.75637817382812, -33.76587681391894], + [-80.77457427978516, -33.723197462817026], + [-80.80615997314453, -33.724054113439884], + [-80.83740234375, -33.75146241858857] + ] + ], + [ + [ + [-78.87805938720703, -33.60575555447342], + [-78.88629913330078, -33.61318971884082], + [-78.87943267822264, -33.63034303571294], + [-78.89350891113281, -33.64520648119226], + [-78.90380859375, -33.64720713369291], + [-78.90827178955078, -33.64434904445886], + [-78.9151382446289, -33.64606390938584], + [-78.92166137695312, -33.65206566761678], + [-78.92303466796875, -33.65492350063952], + [-78.93024444580078, -33.65749546922024], + [-78.94020080566406, -33.66778257479216], + [-78.93573760986328, -33.67092561169521], + [-78.93882751464844, -33.674354248232504], + [-78.94191741943358, -33.67292566628718], + [-78.94878387451172, -33.67692563592954], + [-78.94123077392578, -33.682353868548184], + [-78.93539428710938, -33.68321092658006], + [-78.93814086914062, -33.678639851675534], + [-78.93848419189453, -33.675782806445994], + [-78.93299102783203, -33.671497060610534], + [-78.92406463623047, -33.671211336627486], + [-78.92131805419922, -33.6652109137176], + [-78.92406463623047, -33.66178191269289], + [-78.914794921875, -33.65578083204094], + [-78.90758514404297, -33.662924928220384], + [-78.90449523925781, -33.660353121928814], + [-78.90552520751953, -33.657209698729595], + [-78.89934539794922, -33.652637241813174], + [-78.89213562011719, -33.66006736092875], + [-78.88458251953125, -33.65606660727672], + [-78.87428283691406, -33.644920669896656], + [-78.8656997680664, -33.64520648119226], + [-78.86089324951172, -33.66549665763364], + [-78.82793426513672, -33.66092464108171], + [-78.78398895263672, -33.6794969467326], + [-78.76922607421875, -33.670639885813706], + [-78.7771224975586, -33.662067667998414], + [-78.77918243408203, -33.655495055856136], + [-78.79051208496094, -33.641490860339054], + [-78.81351470947266, -33.64063338660099], + [-78.81729125976561, -33.64434904445886], + [-78.83068084716797, -33.640919212129155], + [-78.83033752441406, -33.63148646875166], + [-78.84819030761717, -33.618621971969276], + [-78.848876953125, -33.61347563543629], + [-78.86295318603516, -33.6071852512562], + [-78.87805938720703, -33.60575555447342] + ] + ], + [ + [ + [-78.95161628723145, -33.69528025294664], + [-78.95530700683594, -33.70006466462807], + [-78.9521312713623, -33.70163560737423], + [-78.9506721496582, -33.700278885784996], + [-78.94861221313477, -33.701207171292374], + [-78.94972801208496, -33.70306371221516], + [-78.95075798034668, -33.70284949800254], + [-78.95178794860838, -33.7045631967461], + [-78.9480972290039, -33.70784769044128], + [-78.94947052001952, -33.70934709145684], + [-78.94303321838379, -33.71377374172037], + [-78.93917083740234, -33.71363095011231], + [-78.93771171569824, -33.71455909132016], + [-78.93874168395996, -33.7163439500602], + [-78.93659591674805, -33.714987460801574], + [-78.93685340881348, -33.7134881582668], + [-78.93479347229004, -33.714916066036416], + [-78.93410682678223, -33.71355955421924], + [-78.93075942993164, -33.71355955421924], + [-78.92475128173828, -33.715201644740844], + [-78.92380714416502, -33.714773276327996], + [-78.92483711242676, -33.71377374172037], + [-78.92706871032715, -33.712988384937574], + [-78.92998695373535, -33.712845592023534], + [-78.92998695373535, -33.71170324016297], + [-78.93118858337402, -33.70970408784028], + [-78.93393516540527, -33.70998968387856], + [-78.93625259399414, -33.70791909108323], + [-78.9378833770752, -33.708276093402596], + [-78.93925666809082, -33.7064196651371], + [-78.9411449432373, -33.706205459293635], + [-78.94020080566406, -33.70506301910626], + [-78.94140243530273, -33.704206178993886], + [-78.94037246704102, -33.70263528325574], + [-78.94208908081055, -33.69792242367998], + [-78.94320487976074, -33.69742255977288], + [-78.94569396972656, -33.699350590247136], + [-78.94929885864258, -33.69799383257217], + [-78.94981384277342, -33.69649423337286], + [-78.9492130279541, -33.695922950602935], + [-78.95015716552734, -33.69513743059241], + [-78.95092964172363, -33.69578012931697], + [-78.95161628723145, -33.69528025294664] + ] + ] + ] + } +} diff --git a/test/examples/transform_rotate/in/no-rotation.geojson b/test/examples/transform_rotate/in/no-rotation.geojson new file mode 100644 index 00000000..634ada00 --- /dev/null +++ b/test/examples/transform_rotate/in/no-rotation.geojson @@ -0,0 +1,42 @@ +{ + "type": "Feature", + "properties": { + "angle": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [128.84, -25.76], + [128.18, -25.6], + [127.96, -25.52], + [127.88, -25.52], + [127.7, -25.6], + [127.26, -25.79], + [126.6, -26.11], + [126.16, -26.78], + [126.12, -27.68], + [126.21, -28.42], + [126.69, -29.49], + [127.74, -29.8], + [128.8, -29.72], + [129.41, -29.03], + [129.72, -27.95], + [129.68, -27.21], + [129.33, -26.23], + [128.84, -25.76] + ], + [ + [128.45, -27.44], + [128.32, -26.94], + [127.7, -26.82], + [127.35, -27.05], + [127.17, -27.8], + [127.57, -28.22], + [128.1, -28.42], + [128.49, -27.8], + [128.45, -27.44] + ] + ] + } +} diff --git a/test/examples/transform_rotate/in/point.geojson b/test/examples/transform_rotate/in/point.geojson new file mode 100644 index 00000000..94987cee --- /dev/null +++ b/test/examples/transform_rotate/in/point.geojson @@ -0,0 +1,11 @@ +{ + "type": "Feature", + "properties": { + "angle": 80, + "pivot": [-75.6, 45.3] + }, + "geometry": { + "type": "Point", + "coordinates": [-75.69926351308823, 45.43145021122502] + } +} diff --git a/test/examples/transform_rotate/in/polygon-fiji.geojson b/test/examples/transform_rotate/in/polygon-fiji.geojson new file mode 100644 index 00000000..c42624e6 --- /dev/null +++ b/test/examples/transform_rotate/in/polygon-fiji.geojson @@ -0,0 +1,39 @@ +{ + "type": "Feature", + "properties": { + "angle": 90 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-179.6319580078125, -16.762467717941593], + [-179.659423828125, -16.64671805097192], + [-179.725341796875, -16.578287608637478], + [-179.99450683593747, -16.641455036937753], + [-180.1702880859375, -16.935960102864705], + [-180.1373291015625, -17.056784609942543], + [-179.93408203125, -17.00951473208515], + [-179.6319580078125, -16.762467717941593] + ] + ], + [ + [ + [-180.06591796875, -16.509832826905836], + [-179.79125976562497, -16.093320185359257], + [-180.0933837890625, -16.0352548623504], + [-180.7086181640625, -16.0774858690887], + [-181.63146972656247, -16.525632239869275], + [-181.6644287109375, -16.836089974560213], + [-181.4996337890625, -17.06728740376787], + [-181.219482421875, -17.06728740376787], + [-180.9503173828125, -16.956978651248072], + [-180.59326171875, -16.914939206301646], + [-180.1922607421875, -16.867633616803836], + [-180.06591796875, -16.509832826905836] + ] + ] + ] + } +} diff --git a/test/examples/transform_rotate/in/polygon-resolute-bay.geojson b/test/examples/transform_rotate/in/polygon-resolute-bay.geojson new file mode 100644 index 00000000..1a137ad1 --- /dev/null +++ b/test/examples/transform_rotate/in/polygon-resolute-bay.geojson @@ -0,0 +1,38 @@ +{ + "type": "Feature", + "properties": { + "angle": 45 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-95.174560546875, 75.60953172351893], + [-96.03149414062499, 75.4282153667069], + [-96.492919921875, 75.16048677152294], + [-96.6357421875, 75.03617629075062], + [-95.723876953125, 74.80466599405533], + [-94.910888671875, 74.66582807452669], + [-94.317626953125, 74.62218784846145], + [-93.49365234375, 74.66292249033842], + [-93.438720703125, 74.86788912917916], + [-93.515625, 75.03901279805076], + [-93.55957031249999, 75.3060980061604], + [-94.163818359375, 75.52189820596192], + [-94.449462890625, 75.60953172351893], + [-94.82299804687499, 75.63681056594325], + [-95.174560546875, 75.60953172351893] + ], + [ + [-95.108642578125, 75.40054889588245], + [-95.6634521484375, 75.22926698530169], + [-95.614013671875, 75.01062406678055], + [-94.647216796875, 74.84061980605131], + [-94.0264892578125, 74.83774656082585], + [-94.0155029296875, 75.17876503868581], + [-94.5867919921875, 75.3700564253908], + [-95.108642578125, 75.40054889588245] + ] + ] + } +} diff --git a/test/examples/transform_rotate/in/polygon-with-hole.geojson b/test/examples/transform_rotate/in/polygon-with-hole.geojson new file mode 100644 index 00000000..bf52ef42 --- /dev/null +++ b/test/examples/transform_rotate/in/polygon-with-hole.geojson @@ -0,0 +1,59 @@ +{ + "type": "Feature", + "properties": { + "angle": 120, + "name": "Bled Lake", + "area": "1.45", + "area-unit": "km2", + "volume": "0.0257", + "volume-unit": "km3", + "picture": "https://en.wikipedia.org/wiki/Lake_Bled#/media/File:Lake_Bled_from_the_Mountain.jpg" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [14.086918830871582, 46.368163916782294], + [14.085588455200194, 46.3670386292829], + [14.086060523986816, 46.36644636339309], + [14.08374309539795, 46.36366262769442], + [14.081940650939941, 46.362714940623896], + [14.082798957824707, 46.36155992478001], + [14.084773063659668, 46.36188570095187], + [14.08473014831543, 46.36016795016414], + [14.085588455200194, 46.35895364547403], + [14.089837074279785, 46.3583020562222], + [14.090909957885742, 46.35856861640076], + [14.091768264770508, 46.35936828913414], + [14.093270301818846, 46.35996063176163], + [14.09816265106201, 46.35978292964766], + [14.099278450012207, 46.36022718384896], + [14.098892211914062, 46.36215224364764], + [14.106316566467285, 46.36499528482401], + [14.108591079711914, 46.36840081645984], + [14.106273651123047, 46.36958529943602], + [14.103312492370605, 46.36937801676938], + [14.09996509552002, 46.36854887823657], + [14.097347259521484, 46.368163916782294], + [14.095587730407715, 46.36801585396206], + [14.094429016113281, 46.36733475981976], + [14.092626571655273, 46.36724592082726], + [14.086918830871582, 46.368163916782294] + ], + [ + [14.089826345443726, 46.36308513284238], + [14.08948302268982, 46.362611286353214], + [14.089547395706177, 46.362026376425554], + [14.089912176132202, 46.36157473282996], + [14.090116024017334, 46.36154511672605], + [14.09022331237793, 46.36160434891784], + [14.090287685394287, 46.36172281310876], + [14.090502262115479, 46.36203378038783], + [14.090588092803955, 46.36238916939662], + [14.090534448623657, 46.36260388246917], + [14.089933633804321, 46.36306292138001], + [14.089826345443726, 46.36308513284238] + ] + ] + } +} diff --git a/test/examples/transform_rotate/in/polygon.geojson b/test/examples/transform_rotate/in/polygon.geojson new file mode 100644 index 00000000..ae0d6a2c --- /dev/null +++ b/test/examples/transform_rotate/in/polygon.geojson @@ -0,0 +1,18 @@ +{ + "type": "Feature", + "properties": { + "angle": 200, + "pivot": [2.48291015625, 27.819644755099446] + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0, 29], + [3.5, 29], + [2.5, 32], + [0, 29] + ] + ] + } +} diff --git a/test/examples/transform_rotate/in/z-coord.geojson b/test/examples/transform_rotate/in/z-coord.geojson new file mode 100644 index 00000000..f5fc5082 --- /dev/null +++ b/test/examples/transform_rotate/in/z-coord.geojson @@ -0,0 +1,19 @@ +{ + "type": "Feature", + "properties": { + "angle": 50 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [121.46484375, -23.88583769986199, 10], + [125.5078125, -27.488781168937983, 10], + [129.638671875, -25.562265014427492, 10], + [129.2431640625, -22.06527806776582, 10], + [124.93652343749999, -20.385825381874263, 10], + [121.46484375, -23.88583769986199, 10] + ] + ] + } +} diff --git a/test/examples/transform_rotate/out/line.geojson b/test/examples/transform_rotate/out/line.geojson new file mode 100644 index 00000000..a3372f2b --- /dev/null +++ b/test/examples/transform_rotate/out/line.geojson @@ -0,0 +1,63 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 30, + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [11.252453, 44.514161], + [11.263107, 44.514583], + [11.27904, 44.52838], + [11.30355, 44.538077], + [11.321702, 44.532583], + [11.344144, 44.532389], + [11.360688, 44.522469], + [11.37551, 44.50308], + [11.375528, 44.492329], + [11.371706, 44.487117], + [11.37298, 44.473017], + [11.381001, 44.462359] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": 30 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [11.259269714355469, 44.48450449695473], + [11.268196105957031, 44.48866833139464], + [11.272315979003906, 44.5063000997406], + [11.286735534667969, 44.52343698529045], + [11.306304931640625, 44.52515039667307], + [11.325874328613281, 44.53298249265435], + [11.347160339355469, 44.5302903284497], + [11.37359619140625, 44.51878604321948], + [11.381149291992186, 44.50948304524639], + [11.381492614746094, 44.503606702401854], + [11.392478942871094, 44.49185223953622], + [11.406898498535156, 44.48548424944496] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [11.333456039428711, 44.50837878425054] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/multiLine.geojson b/test/examples/transform_rotate/out/multiLine.geojson new file mode 100644 index 00000000..1beb6b0f --- /dev/null +++ b/test/examples/transform_rotate/out/multiLine.geojson @@ -0,0 +1,61 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 90, + "pivot": [-98.9, 19.15], + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [-98.952975, 19.433442], + [-98.878816, 19.338921], + [-98.952944, 19.244481] + ], + [ + [-98.889405, 19.43339], + [-98.815265, 19.338887], + [-98.889411, 19.244463] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": 90, + "pivot": [-98.9, 19.15] + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [-99.2, 19.1], + [-99.1, 19.17], + [-99, 19.1] + ], + [ + [-99.2, 19.16], + [-99.1, 19.23], + [-99, 19.16] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [-98.9, 19.15] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/multiPoint.geojson b/test/examples/transform_rotate/out/multiPoint.geojson new file mode 100644 index 00000000..adf4f5e4 --- /dev/null +++ b/test/examples/transform_rotate/out/multiPoint.geojson @@ -0,0 +1,47 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": -110, + "marker-color": "#F00", + "marker-symbol": "star" + }, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [101.109995, 0.192785], + [99.828247, 0.79041], + [101.524987, 1.567546], + [99.486875, -0.610653] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": -110 + }, + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [100, 0], + [101, 1], + [101.15, -0.86], + [99.8, 1.8] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [100.4875, 0.485] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/multiPolygon.geojson b/test/examples/transform_rotate/out/multiPolygon.geojson new file mode 100644 index 00000000..147ca475 --- /dev/null +++ b/test/examples/transform_rotate/out/multiPolygon.geojson @@ -0,0 +1,263 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": -35, + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-80.483378, -34.57529], + [-80.466447, -34.579743], + [-80.460209, -34.592269], + [-80.405962, -34.603968], + [-80.388046, -34.598658], + [-80.382565, -34.582496], + [-80.406368, -34.548376], + [-80.451046, -34.522296], + [-80.476572, -34.538065], + [-80.483378, -34.57529] + ] + ], + [ + [ + [-78.972099, -33.521085], + [-78.973726, -33.531113], + [-78.956299, -33.541895], + [-78.957586, -33.560799], + [-78.964638, -33.567356], + [-78.970259, -33.567144], + [-78.974698, -33.571827], + [-78.975904, -33.57986], + [-78.97506, -33.582858], + [-78.97919, -33.588408], + [-78.980255, -33.601591], + [-78.974436, -33.602037], + [-78.974604, -33.606321], + [-78.978117, -33.606625], + [-78.980982, -33.613181], + [-78.97106, -33.614025], + [-78.965693, -33.611941], + [-78.97109, -33.609506], + [-78.973339, -33.607328], + [-78.971795, -33.601194], + [-78.964686, -33.596699], + [-78.96657, -33.59047], + [-78.97118, -33.588971], + [-78.967726, -33.579627], + [-78.956905, -33.582042], + [-78.956147, -33.578459], + [-78.959155, -33.576374], + [-78.957246, -33.569676], + [-78.946229, -33.572325], + [-78.942803, -33.56544], + [-78.942049, -33.551387], + [-78.934829, -33.547524], + [-78.916926, -33.561862], + [-78.89311, -33.542382], + [-78.84438, -33.536635], + [-78.838404, -33.522326], + [-78.850762, -33.519065], + [-78.85697, -33.514659], + [-78.875875, -33.508584], + [-78.895281, -33.518862], + [-78.895813, -33.523712], + [-78.909128, -33.527291], + [-78.915339, -33.519394], + [-78.9388, -33.517371], + [-78.942904, -33.513479], + [-78.958752, -33.515044], + [-78.972099, -33.521085] + ] + ], + [ + [ + [-78.970655, -33.629575], + [-78.97038, -33.635257], + [-78.966698, -33.635029], + [-78.966438, -33.633221], + [-78.964113, -33.632998], + [-78.963747, -33.635052], + [-78.964737, -33.635368], + [-78.9644, -33.637264], + [-78.959116, -33.638195], + [-78.959206, -33.640079], + [-78.950887, -33.640635], + [-78.947825, -33.638675], + [-78.945991, -33.638739], + [-78.945604, -33.640694], + [-78.944783, -33.638558], + [-78.946026, -33.637452], + [-78.943357, -33.637639], + [-78.943729, -33.6362], + [-78.94099, -33.634603], + [-78.934942, -33.633081], + [-78.934464, -33.63228], + [-78.935996, -33.631952], + [-78.938363, -33.632373], + [-78.94085, -33.633649], + [-78.941637, -33.632713], + [-78.943998, -33.631648], + [-78.946049, -33.633192], + [-78.949372, -33.632601], + [-78.950461, -33.633672], + [-78.952864, -33.632806], + [-78.954557, -33.633531], + [-78.954571, -33.632144], + [-78.956145, -33.632016], + [-78.956385, -33.630237], + [-78.961037, -33.627193], + [-78.962295, -33.627316], + [-78.963003, -33.630084], + [-78.966889, -33.630693], + [-78.968344, -33.62971], + [-78.968245, -33.628955], + [-78.969559, -33.628761], + [-78.969749, -33.629657], + [-78.970655, -33.629575] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": -35 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-80.83740234375, -33.75146241858857], + [-80.8267593383789, -33.76316538009658], + [-80.83036422729492, -33.77643631739436], + [-80.79448699951172, -33.81181543283183], + [-80.77629089355469, -33.8159515518711], + [-80.76066970825195, -33.805254282102595], + [-80.75637817382812, -33.76587681391894], + [-80.77457427978516, -33.723197462817026], + [-80.80615997314453, -33.724054113439884], + [-80.83740234375, -33.75146241858857] + ] + ], + [ + [ + [-78.87805938720703, -33.60575555447342], + [-78.88629913330078, -33.61318971884082], + [-78.87943267822264, -33.63034303571294], + [-78.89350891113281, -33.64520648119226], + [-78.90380859375, -33.64720713369291], + [-78.90827178955078, -33.64434904445886], + [-78.9151382446289, -33.64606390938584], + [-78.92166137695312, -33.65206566761678], + [-78.92303466796875, -33.65492350063952], + [-78.93024444580078, -33.65749546922024], + [-78.94020080566406, -33.66778257479216], + [-78.93573760986328, -33.67092561169521], + [-78.93882751464844, -33.674354248232504], + [-78.94191741943358, -33.67292566628718], + [-78.94878387451172, -33.67692563592954], + [-78.94123077392578, -33.682353868548184], + [-78.93539428710938, -33.68321092658006], + [-78.93814086914062, -33.678639851675534], + [-78.93848419189453, -33.675782806445994], + [-78.93299102783203, -33.671497060610534], + [-78.92406463623047, -33.671211336627486], + [-78.92131805419922, -33.6652109137176], + [-78.92406463623047, -33.66178191269289], + [-78.914794921875, -33.65578083204094], + [-78.90758514404297, -33.662924928220384], + [-78.90449523925781, -33.660353121928814], + [-78.90552520751953, -33.657209698729595], + [-78.89934539794922, -33.652637241813174], + [-78.89213562011719, -33.66006736092875], + [-78.88458251953125, -33.65606660727672], + [-78.87428283691406, -33.644920669896656], + [-78.8656997680664, -33.64520648119226], + [-78.86089324951172, -33.66549665763364], + [-78.82793426513672, -33.66092464108171], + [-78.78398895263672, -33.6794969467326], + [-78.76922607421875, -33.670639885813706], + [-78.7771224975586, -33.662067667998414], + [-78.77918243408203, -33.655495055856136], + [-78.79051208496094, -33.641490860339054], + [-78.81351470947266, -33.64063338660099], + [-78.81729125976561, -33.64434904445886], + [-78.83068084716797, -33.640919212129155], + [-78.83033752441406, -33.63148646875166], + [-78.84819030761717, -33.618621971969276], + [-78.848876953125, -33.61347563543629], + [-78.86295318603516, -33.6071852512562], + [-78.87805938720703, -33.60575555447342] + ] + ], + [ + [ + [-78.95161628723145, -33.69528025294664], + [-78.95530700683594, -33.70006466462807], + [-78.9521312713623, -33.70163560737423], + [-78.9506721496582, -33.700278885784996], + [-78.94861221313477, -33.701207171292374], + [-78.94972801208496, -33.70306371221516], + [-78.95075798034668, -33.70284949800254], + [-78.95178794860838, -33.7045631967461], + [-78.9480972290039, -33.70784769044128], + [-78.94947052001952, -33.70934709145684], + [-78.94303321838379, -33.71377374172037], + [-78.93917083740234, -33.71363095011231], + [-78.93771171569824, -33.71455909132016], + [-78.93874168395996, -33.7163439500602], + [-78.93659591674805, -33.714987460801574], + [-78.93685340881348, -33.7134881582668], + [-78.93479347229004, -33.714916066036416], + [-78.93410682678223, -33.71355955421924], + [-78.93075942993164, -33.71355955421924], + [-78.92475128173828, -33.715201644740844], + [-78.92380714416502, -33.714773276327996], + [-78.92483711242676, -33.71377374172037], + [-78.92706871032715, -33.712988384937574], + [-78.92998695373535, -33.712845592023534], + [-78.92998695373535, -33.71170324016297], + [-78.93118858337402, -33.70970408784028], + [-78.93393516540527, -33.70998968387856], + [-78.93625259399414, -33.70791909108323], + [-78.9378833770752, -33.708276093402596], + [-78.93925666809082, -33.7064196651371], + [-78.9411449432373, -33.706205459293635], + [-78.94020080566406, -33.70506301910626], + [-78.94140243530273, -33.704206178993886], + [-78.94037246704102, -33.70263528325574], + [-78.94208908081055, -33.69792242367998], + [-78.94320487976074, -33.69742255977288], + [-78.94569396972656, -33.699350590247136], + [-78.94929885864258, -33.69799383257217], + [-78.94981384277342, -33.69649423337286], + [-78.9492130279541, -33.695922950602935], + [-78.95015716552734, -33.69513743059241], + [-78.95092964172363, -33.69578012931697], + [-78.95161628723145, -33.69528025294664] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [-79.08634303771343, -33.68749020845278] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/no-rotation.geojson b/test/examples/transform_rotate/out/no-rotation.geojson new file mode 100644 index 00000000..1036aacd --- /dev/null +++ b/test/examples/transform_rotate/out/no-rotation.geojson @@ -0,0 +1,101 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 0, + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [128.84, -25.76], + [128.18, -25.6], + [127.96, -25.52], + [127.88, -25.52], + [127.7, -25.6], + [127.26, -25.79], + [126.6, -26.11], + [126.16, -26.78], + [126.12, -27.68], + [126.21, -28.42], + [126.69, -29.49], + [127.74, -29.8], + [128.8, -29.72], + [129.41, -29.03], + [129.72, -27.95], + [129.68, -27.21], + [129.33, -26.23], + [128.84, -25.76] + ], + [ + [128.45, -27.44], + [128.32, -26.94], + [127.7, -26.82], + [127.35, -27.05], + [127.17, -27.8], + [127.57, -28.22], + [128.1, -28.42], + [128.49, -27.8], + [128.45, -27.44] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": 0 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [128.84, -25.76], + [128.18, -25.6], + [127.96, -25.52], + [127.88, -25.52], + [127.7, -25.6], + [127.26, -25.79], + [126.6, -26.11], + [126.16, -26.78], + [126.12, -27.68], + [126.21, -28.42], + [126.69, -29.49], + [127.74, -29.8], + [128.8, -29.72], + [129.41, -29.03], + [129.72, -27.95], + [129.68, -27.21], + [129.33, -26.23], + [128.84, -25.76] + ], + [ + [128.45, -27.44], + [128.32, -26.94], + [127.7, -26.82], + [127.35, -27.05], + [127.17, -27.8], + [127.57, -28.22], + [128.1, -28.42], + [128.49, -27.8], + [128.45, -27.44] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [127.89720000000001, -27.307999999999993] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/point.geojson b/test/examples/transform_rotate/out/point.geojson new file mode 100644 index 00000000..07c838f0 --- /dev/null +++ b/test/examples/transform_rotate/out/point.geojson @@ -0,0 +1,39 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 80, + "pivot": [-75.6, 45.3], + "marker-color": "#F00", + "marker-symbol": "star" + }, + "geometry": { + "type": "Point", + "coordinates": [-75.433041, 45.391507] + } + }, + { + "type": "Feature", + "properties": { + "angle": 80, + "pivot": [-75.6, 45.3] + }, + "geometry": { + "type": "Point", + "coordinates": [-75.69926351308823, 45.43145021122502] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [-75.6, 45.3] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/polygon-fiji.geojson b/test/examples/transform_rotate/out/polygon-fiji.geojson new file mode 100644 index 00000000..8e9358a3 --- /dev/null +++ b/test/examples/transform_rotate/out/polygon-fiji.geojson @@ -0,0 +1,95 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 90, + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-180.492063, -17.459212], + [-180.370976, -17.433132], + [-180.299414, -17.370105], + [-180.365522, -17.112142], + [-180.673219, -16.943559], + [-180.799476, -16.97502], + [-180.750256, -17.169571], + [-180.492063, -17.459212] + ] + ], + [ + [ + [-180.22799, -17.04385], + [-179.792297, -17.307707], + [-179.732114, -17.017918], + [-179.777245, -16.427649], + [-180.245198, -15.543629], + [-180.56836, -15.51301], + [-180.809159, -15.671427], + [-180.809418, -15.939503], + [-180.694654, -16.196919], + [-180.651019, -16.538667], + [-180.601828, -16.922566], + [-180.22799, -17.04385] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": 90 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-179.6319580078125, -16.762467717941593], + [-179.659423828125, -16.64671805097192], + [-179.725341796875, -16.578287608637478], + [-179.99450683593747, -16.641455036937753], + [-180.1702880859375, -16.935960102864705], + [-180.1373291015625, -17.056784609942543], + [-179.93408203125, -17.00951473208515], + [-179.6319580078125, -16.762467717941593] + ] + ], + [ + [ + [-180.06591796875, -16.509832826905836], + [-179.79125976562497, -16.093320185359257], + [-180.0933837890625, -16.0352548623504], + [-180.7086181640625, -16.0774858690887], + [-181.63146972656247, -16.525632239869275], + [-181.6644287109375, -16.836089974560213], + [-181.4996337890625, -17.06728740376787], + [-181.219482421875, -17.06728740376787], + [-180.9503173828125, -16.956978651248072], + [-180.59326171875, -16.914939206301646], + [-180.1922607421875, -16.867633616803836], + [-180.06591796875, -16.509832826905836] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [-180.42572021484375, -16.69905167218912] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/polygon-resolute-bay.geojson b/test/examples/transform_rotate/out/polygon-resolute-bay.geojson new file mode 100644 index 00000000..06a600ad --- /dev/null +++ b/test/examples/transform_rotate/out/polygon-resolute-bay.geojson @@ -0,0 +1,93 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 45, + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-93.733309, 75.540938], + [-94.849869, 75.567104], + [-95.933141, 75.46343], + [-96.383707, 75.402789], + [-96.362684, 75.074432], + [-96.154, 74.827292], + [-95.846124, 74.687046], + [-95.151349, 74.564184], + [-94.563287, 74.700624], + [-94.154507, 74.836985], + [-93.455303, 75.035786], + [-93.27606, 75.298173], + [-93.228527, 75.411469], + [-93.411057, 75.497447], + [-93.733309, 75.540938] + ], + [ + [-94.274994, 75.381808], + [-95.14635, 75.361361], + [-95.717624, 75.198903], + [-95.491872, 74.902463], + [-95.058838, 74.786731], + [-94.122584, 75.027407], + [-93.993843, 75.266376], + [-94.274994, 75.381808] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": 45 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-95.174560546875, 75.60953172351893], + [-96.03149414062499, 75.4282153667069], + [-96.492919921875, 75.16048677152294], + [-96.6357421875, 75.03617629075062], + [-95.723876953125, 74.80466599405533], + [-94.910888671875, 74.66582807452669], + [-94.317626953125, 74.62218784846145], + [-93.49365234375, 74.66292249033842], + [-93.438720703125, 74.86788912917916], + [-93.515625, 75.03901279805076], + [-93.55957031249999, 75.3060980061604], + [-94.163818359375, 75.52189820596192], + [-94.449462890625, 75.60953172351893], + [-94.82299804687499, 75.63681056594325], + [-95.174560546875, 75.60953172351893] + ], + [ + [-95.108642578125, 75.40054889588245], + [-95.6634521484375, 75.22926698530169], + [-95.614013671875, 75.01062406678055], + [-94.647216796875, 74.84061980605131], + [-94.0264892578125, 74.83774656082585], + [-94.0155029296875, 75.17876503868581], + [-94.5867919921875, 75.3700564253908], + [-95.108642578125, 75.40054889588245] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [-94.78062220982143, 75.13518489369591] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/polygon-with-hole.geojson b/test/examples/transform_rotate/out/polygon-with-hole.geojson new file mode 100644 index 00000000..49ef9db3 --- /dev/null +++ b/test/examples/transform_rotate/out/polygon-with-hole.geojson @@ -0,0 +1,135 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 120, + "name": "Bled Lake", + "area": "1.45", + "area-unit": "km2", + "volume": "0.0257", + "volume-unit": "km3", + "picture": "https://en.wikipedia.org/wiki/Lake_Bled#/media/File:Lake_Bled_from_the_Mountain.jpg", + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [14.100752, 46.364285], + [14.100005, 46.365643], + [14.099026, 46.365657], + [14.096691, 46.368434], + [14.096403, 46.369985], + [14.094524, 46.37005], + [14.093946, 46.368707], + [14.091812, 46.369592], + [14.089859, 46.369686], + [14.086916, 46.367472], + [14.086714, 46.366698], + [14.087289, 46.365785], + [14.087281, 46.364591], + [14.084612, 46.361756], + [14.084612, 46.360867], + [14.087221, 46.360136], + [14.087077, 46.354277], + [14.090214, 46.351215], + [14.092859, 46.352008], + [14.094079, 46.353881], + [14.094712, 46.356296], + [14.095538, 46.358053], + [14.096232, 46.359179], + [14.095956, 46.360212], + [14.096746, 46.361333], + [14.100752, 46.364285] + ], + [ + [14.092924, 46.365087], + [14.092501, 46.365529], + [14.091735, 46.365783], + [14.090986, 46.365791], + [14.090847, 46.365684], + [14.090868, 46.36559], + [14.090984, 46.365493], + [14.091267, 46.365209], + [14.09167, 46.36498], + [14.091966, 46.364905], + [14.092843, 46.365034], + [14.092924, 46.365087] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": 120, + "name": "Bled Lake", + "area": "1.45", + "area-unit": "km2", + "volume": "0.0257", + "volume-unit": "km3", + "picture": "https://en.wikipedia.org/wiki/Lake_Bled#/media/File:Lake_Bled_from_the_Mountain.jpg" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [14.086918830871582, 46.368163916782294], + [14.085588455200194, 46.3670386292829], + [14.086060523986816, 46.36644636339309], + [14.08374309539795, 46.36366262769442], + [14.081940650939941, 46.362714940623896], + [14.082798957824707, 46.36155992478001], + [14.084773063659668, 46.36188570095187], + [14.08473014831543, 46.36016795016414], + [14.085588455200194, 46.35895364547403], + [14.089837074279785, 46.3583020562222], + [14.090909957885742, 46.35856861640076], + [14.091768264770508, 46.35936828913414], + [14.093270301818846, 46.35996063176163], + [14.09816265106201, 46.35978292964766], + [14.099278450012207, 46.36022718384896], + [14.098892211914062, 46.36215224364764], + [14.106316566467285, 46.36499528482401], + [14.108591079711914, 46.36840081645984], + [14.106273651123047, 46.36958529943602], + [14.103312492370605, 46.36937801676938], + [14.09996509552002, 46.36854887823657], + [14.097347259521484, 46.368163916782294], + [14.095587730407715, 46.36801585396206], + [14.094429016113281, 46.36733475981976], + [14.092626571655273, 46.36724592082726], + [14.086918830871582, 46.368163916782294] + ], + [ + [14.089826345443726, 46.36308513284238], + [14.08948302268982, 46.362611286353214], + [14.089547395706177, 46.362026376425554], + [14.089912176132202, 46.36157473282996], + [14.090116024017334, 46.36154511672605], + [14.09022331237793, 46.36160434891784], + [14.090287685394287, 46.36172281310876], + [14.090502262115479, 46.36203378038783], + [14.090588092803955, 46.36238916939662], + [14.090534448623657, 46.36260388246917], + [14.089933633804321, 46.36306292138001], + [14.089826345443726, 46.36308513284238] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [14.092212915420532, 46.36346899882679] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/polygon.geojson b/test/examples/transform_rotate/out/polygon.geojson new file mode 100644 index 00000000..272ed8be --- /dev/null +++ b/test/examples/transform_rotate/out/polygon.geojson @@ -0,0 +1,53 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 200, + "pivot": [2.48291015625, 27.819644755099446], + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.331318, 25.963562], + [1.0811, 27.016436], + [0.878141, 23.89646], + [4.331318, 25.963562] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": 200, + "pivot": [2.48291015625, 27.819644755099446] + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0, 29], + [3.5, 29], + [2.5, 32], + [0, 29] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [2.48291015625, 27.819644755099446] + } + } + ] +} diff --git a/test/examples/transform_rotate/out/z-coord.geojson b/test/examples/transform_rotate/out/z-coord.geojson new file mode 100644 index 00000000..a00f767b --- /dev/null +++ b/test/examples/transform_rotate/out/z-coord.geojson @@ -0,0 +1,55 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "angle": 50, + "stroke": "#F00", + "stroke-width": 4 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [123.17066, -20.595392, 10], + [122.695301, -25.749925, 10], + [126.980874, -27.382228, 10], + [129.68694, -24.888351, 10], + [128.263897, -20.766401, 10], + [123.17066, -20.595392, 10] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "angle": 50 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [121.46484375, -23.88583769986199, 10], + [125.5078125, -27.488781168937983, 10], + [129.638671875, -25.562265014427492, 10], + [129.2431640625, -22.06527806776582, 10], + [124.93652343749999, -20.385825381874263, 10], + [121.46484375, -23.88583769986199, 10] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [126.158203125, -23.87759746657351] + } + } + ] +} From 49ff3855c18723df04918e8caeece8dfa5a9e0c2 Mon Sep 17 00:00:00 2001 From: ggastv Date: Thu, 20 Apr 2023 14:55:12 +0300 Subject: [PATCH 60/72] Add truncate tests for MultiLineString, MultiPoint, MultiPolygon --- test/examples/truncate/in/multiLine.geojson | 18 + test/examples/truncate/in/multiPoint.geojson | 12 + .../examples/truncate/in/multiPolygon.geojson | 120 +++++ test/examples/truncate/out/multiLine.geojson | 18 + test/examples/truncate/out/multiPoint.geojson | 12 + .../truncate/out/multiPolygon.geojson | 422 ++++++++++++++++++ 6 files changed, 602 insertions(+) create mode 100644 test/examples/truncate/in/multiLine.geojson create mode 100644 test/examples/truncate/in/multiPoint.geojson create mode 100644 test/examples/truncate/in/multiPolygon.geojson create mode 100644 test/examples/truncate/out/multiLine.geojson create mode 100644 test/examples/truncate/out/multiPoint.geojson create mode 100644 test/examples/truncate/out/multiPolygon.geojson diff --git a/test/examples/truncate/in/multiLine.geojson b/test/examples/truncate/in/multiLine.geojson new file mode 100644 index 00000000..f76f5416 --- /dev/null +++ b/test/examples/truncate/in/multiLine.geojson @@ -0,0 +1,18 @@ +{ + "type": "Feature", + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [-99.2, 19.1], + [-99.1, 19.17], + [-99, 19.1] + ], + [ + [-99.2, 19.16], + [-99.1, 19.23], + [-99, 19.16] + ] + ] + } +} diff --git a/test/examples/truncate/in/multiPoint.geojson b/test/examples/truncate/in/multiPoint.geojson new file mode 100644 index 00000000..e87f8114 --- /dev/null +++ b/test/examples/truncate/in/multiPoint.geojson @@ -0,0 +1,12 @@ +{ + "type": "Feature", + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [100.0452341, 0.0123456789], + [101.0, 1.0], + [101.15, -0.86], + [99.8, 1.8] + ] + } +} diff --git a/test/examples/truncate/in/multiPolygon.geojson b/test/examples/truncate/in/multiPolygon.geojson new file mode 100644 index 00000000..bcac7218 --- /dev/null +++ b/test/examples/truncate/in/multiPolygon.geojson @@ -0,0 +1,120 @@ +{ + "type": "Feature", + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-80.83740234375, -33.75146241858857], + [-80.8267593383789, -33.76316538009658], + [-80.83036422729492, -33.77643631739436], + [-80.79448699951172, -33.81181543283183], + [-80.77629089355469, -33.8159515518711], + [-80.76066970825195, -33.805254282102595], + [-80.75637817382812, -33.76587681391894], + [-80.77457427978516, -33.723197462817026], + [-80.80615997314453, -33.724054113439884], + [-80.83740234375, -33.75146241858857] + ] + ], + [ + [ + [-78.87805938720703, -33.60575555447342], + [-78.88629913330078, -33.61318971884082], + [-78.87943267822264, -33.63034303571294], + [-78.89350891113281, -33.64520648119226], + [-78.90380859375, -33.64720713369291], + [-78.90827178955078, -33.64434904445886], + [-78.9151382446289, -33.64606390938584], + [-78.92166137695312, -33.65206566761678], + [-78.92303466796875, -33.65492350063952], + [-78.93024444580078, -33.65749546922024], + [-78.94020080566406, -33.66778257479216], + [-78.93573760986328, -33.67092561169521], + [-78.93882751464844, -33.674354248232504], + [-78.94191741943358, -33.67292566628718], + [-78.94878387451172, -33.67692563592954], + [-78.94123077392578, -33.682353868548184], + [-78.93539428710938, -33.68321092658006], + [-78.93814086914062, -33.678639851675534], + [-78.93848419189453, -33.675782806445994], + [-78.93299102783203, -33.671497060610534], + [-78.92406463623047, -33.671211336627486], + [-78.92131805419922, -33.6652109137176], + [-78.92406463623047, -33.66178191269289], + [-78.914794921875, -33.65578083204094], + [-78.90758514404297, -33.662924928220384], + [-78.90449523925781, -33.660353121928814], + [-78.90552520751953, -33.657209698729595], + [-78.89934539794922, -33.652637241813174], + [-78.89213562011719, -33.66006736092875], + [-78.88458251953125, -33.65606660727672], + [-78.87428283691406, -33.644920669896656], + [-78.8656997680664, -33.64520648119226], + [-78.86089324951172, -33.66549665763364], + [-78.82793426513672, -33.66092464108171], + [-78.78398895263672, -33.6794969467326], + [-78.76922607421875, -33.670639885813706], + [-78.7771224975586, -33.662067667998414], + [-78.77918243408203, -33.655495055856136], + [-78.79051208496094, -33.641490860339054], + [-78.81351470947266, -33.64063338660099], + [-78.81729125976561, -33.64434904445886], + [-78.83068084716797, -33.640919212129155], + [-78.83033752441406, -33.63148646875166], + [-78.84819030761717, -33.618621971969276], + [-78.848876953125, -33.61347563543629], + [-78.86295318603516, -33.6071852512562], + [-78.87805938720703, -33.60575555447342] + ] + ], + [ + [ + [-78.95161628723145, -33.69528025294664], + [-78.95530700683594, -33.70006466462807], + [-78.9521312713623, -33.70163560737423], + [-78.9506721496582, -33.700278885784996], + [-78.94861221313477, -33.701207171292374], + [-78.94972801208496, -33.70306371221516], + [-78.95075798034668, -33.70284949800254], + [-78.95178794860838, -33.7045631967461], + [-78.9480972290039, -33.70784769044128], + [-78.94947052001952, -33.70934709145684], + [-78.94303321838379, -33.71377374172037], + [-78.93917083740234, -33.71363095011231], + [-78.93771171569824, -33.71455909132016], + [-78.93874168395996, -33.7163439500602], + [-78.93659591674805, -33.714987460801574], + [-78.93685340881348, -33.7134881582668], + [-78.93479347229004, -33.714916066036416], + [-78.93410682678223, -33.71355955421924], + [-78.93075942993164, -33.71355955421924], + [-78.92475128173828, -33.715201644740844], + [-78.92380714416502, -33.714773276327996], + [-78.92483711242676, -33.71377374172037], + [-78.92706871032715, -33.712988384937574], + [-78.92998695373535, -33.712845592023534], + [-78.92998695373535, -33.71170324016297], + [-78.93118858337402, -33.70970408784028], + [-78.93393516540527, -33.70998968387856], + [-78.93625259399414, -33.70791909108323], + [-78.9378833770752, -33.708276093402596], + [-78.93925666809082, -33.7064196651371], + [-78.9411449432373, -33.706205459293635], + [-78.94020080566406, -33.70506301910626], + [-78.94140243530273, -33.704206178993886], + [-78.94037246704102, -33.70263528325574], + [-78.94208908081055, -33.69792242367998], + [-78.94320487976074, -33.69742255977288], + [-78.94569396972656, -33.699350590247136], + [-78.94929885864258, -33.69799383257217], + [-78.94981384277342, -33.69649423337286], + [-78.9492130279541, -33.695922950602935], + [-78.95015716552734, -33.69513743059241], + [-78.95092964172363, -33.69578012931697], + [-78.95161628723145, -33.69528025294664] + ] + ] + ] + } +} diff --git a/test/examples/truncate/out/multiLine.geojson b/test/examples/truncate/out/multiLine.geojson new file mode 100644 index 00000000..f76f5416 --- /dev/null +++ b/test/examples/truncate/out/multiLine.geojson @@ -0,0 +1,18 @@ +{ + "type": "Feature", + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [-99.2, 19.1], + [-99.1, 19.17], + [-99, 19.1] + ], + [ + [-99.2, 19.16], + [-99.1, 19.23], + [-99, 19.16] + ] + ] + } +} diff --git a/test/examples/truncate/out/multiPoint.geojson b/test/examples/truncate/out/multiPoint.geojson new file mode 100644 index 00000000..d694e153 --- /dev/null +++ b/test/examples/truncate/out/multiPoint.geojson @@ -0,0 +1,12 @@ +{ + "type": "Feature", + "geometry": { + "type": "MultiPoint", + "coordinates": [ + [100.045234, 0.012346], + [101.0, 1.0], + [101.15, -0.86], + [99.8, 1.8] + ] + } +} diff --git a/test/examples/truncate/out/multiPolygon.geojson b/test/examples/truncate/out/multiPolygon.geojson new file mode 100644 index 00000000..880dd503 --- /dev/null +++ b/test/examples/truncate/out/multiPolygon.geojson @@ -0,0 +1,422 @@ +{ + "type": "Feature", + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + -80.837402, + -33.751462 + ], + [ + -80.826759, + -33.763165 + ], + [ + -80.830364, + -33.776436 + ], + [ + -80.794487, + -33.811815 + ], + [ + -80.776291, + -33.815952 + ], + [ + -80.76067, + -33.805254 + ], + [ + -80.756378, + -33.765877 + ], + [ + -80.774574, + -33.723197 + ], + [ + -80.80616, + -33.724054 + ], + [ + -80.837402, + -33.751462 + ] + ] + ], + [ + [ + [ + -78.878059, + -33.605756 + ], + [ + -78.886299, + -33.61319 + ], + [ + -78.879433, + -33.630343 + ], + [ + -78.893509, + -33.645206 + ], + [ + -78.903809, + -33.647207 + ], + [ + -78.908272, + -33.644349 + ], + [ + -78.915138, + -33.646064 + ], + [ + -78.921661, + -33.652066 + ], + [ + -78.923035, + -33.654924 + ], + [ + -78.930244, + -33.657495 + ], + [ + -78.940201, + -33.667783 + ], + [ + -78.935738, + -33.670926 + ], + [ + -78.938828, + -33.674354 + ], + [ + -78.941917, + -33.672926 + ], + [ + -78.948784, + -33.676926 + ], + [ + -78.941231, + -33.682354 + ], + [ + -78.935394, + -33.683211 + ], + [ + -78.938141, + -33.67864 + ], + [ + -78.938484, + -33.675783 + ], + [ + -78.932991, + -33.671497 + ], + [ + -78.924065, + -33.671211 + ], + [ + -78.921318, + -33.665211 + ], + [ + -78.924065, + -33.661782 + ], + [ + -78.914795, + -33.655781 + ], + [ + -78.907585, + -33.662925 + ], + [ + -78.904495, + -33.660353 + ], + [ + -78.905525, + -33.65721 + ], + [ + -78.899345, + -33.652637 + ], + [ + -78.892136, + -33.660067 + ], + [ + -78.884583, + -33.656067 + ], + [ + -78.874283, + -33.644921 + ], + [ + -78.8657, + -33.645206 + ], + [ + -78.860893, + -33.665497 + ], + [ + -78.827934, + -33.660925 + ], + [ + -78.783989, + -33.679497 + ], + [ + -78.769226, + -33.67064 + ], + [ + -78.777122, + -33.662068 + ], + [ + -78.779182, + -33.655495 + ], + [ + -78.790512, + -33.641491 + ], + [ + -78.813515, + -33.640633 + ], + [ + -78.817291, + -33.644349 + ], + [ + -78.830681, + -33.640919 + ], + [ + -78.830338, + -33.631486 + ], + [ + -78.84819, + -33.618622 + ], + [ + -78.848877, + -33.613476 + ], + [ + -78.862953, + -33.607185 + ], + [ + -78.878059, + -33.605756 + ] + ] + ], + [ + [ + [ + -78.951616, + -33.69528 + ], + [ + -78.955307, + -33.700065 + ], + [ + -78.952131, + -33.701636 + ], + [ + -78.950672, + -33.700279 + ], + [ + -78.948612, + -33.701207 + ], + [ + -78.949728, + -33.703064 + ], + [ + -78.950758, + -33.702849 + ], + [ + -78.951788, + -33.704563 + ], + [ + -78.948097, + -33.707848 + ], + [ + -78.949471, + -33.709347 + ], + [ + -78.943033, + -33.713774 + ], + [ + -78.939171, + -33.713631 + ], + [ + -78.937712, + -33.714559 + ], + [ + -78.938742, + -33.716344 + ], + [ + -78.936596, + -33.714987 + ], + [ + -78.936853, + -33.713488 + ], + [ + -78.934793, + -33.714916 + ], + [ + -78.934107, + -33.71356 + ], + [ + -78.930759, + -33.71356 + ], + [ + -78.924751, + -33.715202 + ], + [ + -78.923807, + -33.714773 + ], + [ + -78.924837, + -33.713774 + ], + [ + -78.927069, + -33.712988 + ], + [ + -78.929987, + -33.712846 + ], + [ + -78.929987, + -33.711703 + ], + [ + -78.931189, + -33.709704 + ], + [ + -78.933935, + -33.70999 + ], + [ + -78.936253, + -33.707919 + ], + [ + -78.937883, + -33.708276 + ], + [ + -78.939257, + -33.70642 + ], + [ + -78.941145, + -33.706205 + ], + [ + -78.940201, + -33.705063 + ], + [ + -78.941402, + -33.704206 + ], + [ + -78.940372, + -33.702635 + ], + [ + -78.942089, + -33.697922 + ], + [ + -78.943205, + -33.697423 + ], + [ + -78.945694, + -33.699351 + ], + [ + -78.949299, + -33.697994 + ], + [ + -78.949814, + -33.696494 + ], + [ + -78.949213, + -33.695923 + ], + [ + -78.950157, + -33.695137 + ], + [ + -78.95093, + -33.69578 + ], + [ + -78.951616, + -33.69528 + ] + ] + ] + ] + } +} + + From 2c2f5c5263ae5e8165c89c6ba828d9010cc86484 Mon Sep 17 00:00:00 2001 From: ggastv Date: Thu, 27 Apr 2023 22:22:38 +0300 Subject: [PATCH 61/72] run dart format --- lib/src/geojson.dart | 1 - lib/src/rhumb_destination.dart | 19 +++++++++++------ lib/src/rhumb_distance.dart | 17 +++++++++------ lib/src/transform_rotate.dart | 5 ++--- lib/transform.dart | 2 +- test/components/centroid_test.dart | 13 ++++++++---- test/components/rhumb_destination_test.dart | 23 ++++++++++++++------- test/components/rhumb_distance_test.dart | 22 +++++++++++++------- test/components/transform_rotate_test.dart | 22 +++++++++++++------- 9 files changed, 81 insertions(+), 43 deletions(-) diff --git a/lib/src/geojson.dart b/lib/src/geojson.dart index eacf22d5..619fe127 100644 --- a/lib/src/geojson.dart +++ b/lib/src/geojson.dart @@ -293,7 +293,6 @@ class BBox extends CoordinateType { /// latitude 2 for 2 dim. positions; longitude 2 for 3 dim. positions num lng2, [ - /// latitude 2 for 3 dim. positions num? lat2, diff --git a/lib/src/rhumb_destination.dart b/lib/src/rhumb_destination.dart index 8672fdbf..b9016324 100644 --- a/lib/src/rhumb_destination.dart +++ b/lib/src/rhumb_destination.dart @@ -1,6 +1,7 @@ -import 'package:turf/src/invariant.dart'; import 'dart:math' as math; -import '../helpers.dart'; + +import 'package:turf/helpers.dart'; +import 'package:turf/src/invariant.dart'; /// /// Returns the destination [Point] having travelled the given distance along a Rhumb line from the @@ -33,7 +34,8 @@ Feature rhumbDestination( var distanceInMeters = convertLength(distance.abs(), unit, Unit.meters); if (wasNegativeDistance) distanceInMeters = -(distanceInMeters.abs()); final coords = getCoord(origin); - final destination = calculateRhumbDestination(coords, distanceInMeters, bearing); + final destination = + calculateRhumbDestination(coords, distanceInMeters, bearing); // compensate the crossing of the 180th meridian (https://macwright.org/2016/09/26/the-180th-meridian.html) // solution from https://github.com/mapbox/mapbox-gl-js/issues/3250#issuecomment-294887678 @@ -43,10 +45,14 @@ Feature rhumbDestination( ? 360 : 0; - return Feature(geometry: Point(coordinates: Position(destination.lng + compensateLng, destination.lat))); + return Feature( + geometry: Point( + coordinates: + Position(destination.lng + compensateLng, destination.lat))); } -Position calculateRhumbDestination(Position origin, num distance, num bearing, [num radius = earthRadius]) { +Position calculateRhumbDestination(Position origin, num distance, num bearing, + [num radius = earthRadius]) { final R = radius > 0 ? radius : earthRadius; final delta = distance / R; final lambda1 = (origin.lng * math.pi) / 180; @@ -61,7 +67,8 @@ Position calculateRhumbDestination(Position origin, num distance, num bearing, [ phi2 = phi2 > 0 ? math.pi - phi2 : -math.pi - phi2; } - final dPsi = math.log(math.tan(phi2 / 2 + math.pi / 4) / math.tan(phi1 / 2 + math.pi / 4)); + final dPsi = math + .log(math.tan(phi2 / 2 + math.pi / 4) / math.tan(phi1 / 2 + math.pi / 4)); // E-W course becomes ill-conditioned with 0/0 final q = dPsi.abs() > 10e-12 ? dPhi / dPsi : math.cos(phi1); diff --git a/lib/src/rhumb_distance.dart b/lib/src/rhumb_distance.dart index 6adcb052..2524c4d1 100644 --- a/lib/src/rhumb_distance.dart +++ b/lib/src/rhumb_distance.dart @@ -1,6 +1,7 @@ -import 'package:turf/src/invariant.dart'; import 'dart:math' as math; -import '../helpers.dart'; + +import 'package:turf/helpers.dart'; +import 'package:turf/src/invariant.dart'; /// Calculates the distance along a rhumb line between two [Point] in degrees, radians, /// miles, or kilometers. @@ -25,7 +26,8 @@ num rhumbDistance(Point from, Point to, [Unit unit = Unit.kilometers]) { ? 360 : 0; - final distanceInMeters = calculateRhumbDistance(origin, Position(destination.lng + compensateLng, destination.lat)); + final distanceInMeters = calculateRhumbDistance( + origin, Position(destination.lng + compensateLng, destination.lat)); final distance = convertLength(distanceInMeters, Unit.meters, unit); return distance; } @@ -42,7 +44,8 @@ num rhumbDistance(Point from, Point to, [Unit unit = Unit.kilometers]) { /// ``` /// -num calculateRhumbDistance(Position origin, Position destination, [num radius = earthRadius]) { +num calculateRhumbDistance(Position origin, Position destination, + [num radius = earthRadius]) { final R = radius; final phi1 = (origin.lat * math.pi) / 180; final phi2 = (destination.lat * math.pi) / 180; @@ -56,11 +59,13 @@ num calculateRhumbDistance(Position origin, Position destination, [num radius = // on Mercator projection, longitude distances shrink by latitude; q is the 'stretch factor' // q becomes ill-conditioned along E-W line (0/0); use empirical tolerance to avoid it - final dPsi = math.log(math.tan(phi2 / 2 + math.pi / 4) / math.tan(phi1 / 2 + math.pi / 4)); + final dPsi = math + .log(math.tan(phi2 / 2 + math.pi / 4) / math.tan(phi1 / 2 + math.pi / 4)); final q = dPsi.abs() > 10e-12 ? dPhi / dPsi : math.cos(phi1); // distance is pythagoras on 'stretched' Mercator projection - final delta = math.sqrt(dPhi * dPhi + q * q * dLambda * dLambda); // angular distance in radians + final delta = math.sqrt( + dPhi * dPhi + q * q * dLambda * dLambda); // angular distance in radians final dist = delta * R; return dist; diff --git a/lib/src/transform_rotate.dart b/lib/src/transform_rotate.dart index d6d078e2..02346061 100644 --- a/lib/src/transform_rotate.dart +++ b/lib/src/transform_rotate.dart @@ -1,12 +1,11 @@ import 'package:turf/bearing.dart'; import 'package:turf/distance.dart'; +import 'package:turf/helpers.dart'; import 'package:turf/src/centroid.dart'; +import 'package:turf/src/invariant.dart'; import 'package:turf/src/meta/coord.dart'; import 'package:turf/src/rhumb_destination.dart'; -import '../helpers.dart'; -import 'invariant.dart'; - /// Rotates any [GeoJSONObject] of a specified angle, around its `centroid` or a given `pivot` [Point]. /// /// example: diff --git a/lib/transform.dart b/lib/transform.dart index 067b85e6..fdd9f4d7 100644 --- a/lib/transform.dart +++ b/lib/transform.dart @@ -1,3 +1,3 @@ library turf_transform; -export 'src/transform_rotate.dart'; \ No newline at end of file +export 'src/transform_rotate.dart'; diff --git a/test/components/centroid_test.dart b/test/components/centroid_test.dart index 814dcb5f..30ceb0b2 100644 --- a/test/components/centroid_test.dart +++ b/test/components/centroid_test.dart @@ -11,7 +11,9 @@ void main() { 'centroid', () { test('centroid -- add properties', () { - final line = Feature(geometry: LineString(coordinates: [Position(0, 0), Position(1, 1)])); + final line = Feature( + geometry: + LineString(coordinates: [Position(0, 0), Position(1, 1)])); final out = centroid(line, properties: {'foo': 'bar'}); final isEqual = out.properties?['foo'] == 'bar'; @@ -32,15 +34,18 @@ void main() { properties: {"marker-symbol": "circle"}, ); - final result = FeatureCollection(features: [centered]); + final result = + FeatureCollection(features: [centered]); featureEach( feature, - (currentFeature, featureIndex) => result.features.add(currentFeature), + (currentFeature, featureIndex) => + result.features.add(currentFeature), ); Directory outDir = Directory('./test/examples/centroid/out'); for (var file2 in outDir.listSync(recursive: true)) { - if (file2 is File && file2.uri.pathSegments.last == file.uri.pathSegments.last) { + if (file2 is File && + file2.uri.pathSegments.last == file.uri.pathSegments.last) { var outSource = file2.readAsStringSync(); var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); Equality eq = Equality(); diff --git a/test/components/rhumb_destination_test.dart b/test/components/rhumb_destination_test.dart index e47b814a..5522098f 100644 --- a/test/components/rhumb_destination_test.dart +++ b/test/components/rhumb_destination_test.dart @@ -18,14 +18,17 @@ void main() { geometry: Point(coordinates: Position(12, -54)), properties: props, ); - final out = rhumbDestination(pt.geometry!, 0, 45, properties: {'foo': 'bar'}); + final out = + rhumbDestination(pt.geometry!, 0, 45, properties: {'foo': 'bar'}); - final isEqual = out.properties != null && out.properties!.keys.every((k) => props[k] == out.properties?[k]); + final isEqual = out.properties != null && + out.properties!.keys.every((k) => props[k] == out.properties?[k]); expect(isEqual, true); }); test('rhumb-destintation -- allows negative distance', () { - final matcher = Point(coordinates: Position(10.90974456038191, -54.63591552764877)); + final matcher = + Point(coordinates: Position(10.90974456038191, -54.63591552764877)); final pt = Point(coordinates: Position(12, -54)); final out = rhumbDestination(pt, -100, 45); @@ -45,7 +48,8 @@ void main() { final bearing = feature.properties?['bearing'] ?? 180; final dist = feature.properties?['dist'] ?? 100; final unitName = feature.properties?['units']; - final unit = unitName == null ? null : Unit.values.byName(unitName); + final unit = + unitName == null ? null : Unit.values.byName(unitName); final destinationPoint = rhumbDestination( feature.geometry!, @@ -57,7 +61,10 @@ void main() { final line = truncate( Feature( - geometry: LineString(coordinates: [getCoord(feature), getCoord(destinationPoint)]), + geometry: LineString(coordinates: [ + getCoord(feature), + getCoord(destinationPoint) + ]), properties: { 'stroke': "#F00", "stroke-width": 4, @@ -67,9 +74,11 @@ void main() { feature.properties ??= const {}; feature.properties?.putIfAbsent('marker-color', () => "#F00"); - final result = FeatureCollection(features: [line, feature, destinationPoint]); + final result = FeatureCollection( + features: [line, feature, destinationPoint]); - Directory outDir = Directory('./test/examples/rhumb_destination/out'); + Directory outDir = + Directory('./test/examples/rhumb_destination/out'); for (var file2 in outDir.listSync(recursive: true)) { if (file2 is File && file2.uri.pathSegments.last == file.uri.pathSegments.last) { diff --git a/test/components/rhumb_distance_test.dart b/test/components/rhumb_distance_test.dart index ba845d1c..f260e950 100644 --- a/test/components/rhumb_distance_test.dart +++ b/test/components/rhumb_distance_test.dart @@ -4,7 +4,6 @@ import 'dart:io'; import 'package:test/test.dart'; import 'package:turf/distance.dart'; import 'package:turf/helpers.dart'; -import 'package:turf/src/rhumb_distance.dart'; void main() { group( @@ -16,7 +15,8 @@ void main() { final p2 = Position(1.853, 50.964); final distanceInMeters = calculateRhumbDistance(p1, p2); - final distance = round(convertLength(distanceInMeters, Unit.meters, Unit.kilometers), 2); + final distance = round( + convertLength(distanceInMeters, Unit.meters, Unit.kilometers), 2); expect(distance, matcher); }); @@ -38,27 +38,33 @@ void main() { file.path, () { var inSource = file.readAsStringSync(); - var inGeom = FeatureCollection.fromJson(jsonDecode(inSource)); + var inGeom = + FeatureCollection.fromJson(jsonDecode(inSource)); final pt1 = inGeom.features[0].geometry!; final pt2 = inGeom.features[1].geometry!; final distances = { 'miles': round(rhumbDistance(pt1, pt2, Unit.miles), 6), - 'nauticalmiles': round(rhumbDistance(pt1, pt2, Unit.nauticalmiles), 6), - 'kilometers': round(rhumbDistance(pt1, pt2, Unit.kilometers), 6), - 'greatCircleDistance': round(distance(pt1, pt2, Unit.kilometers), 6), + 'nauticalmiles': + round(rhumbDistance(pt1, pt2, Unit.nauticalmiles), 6), + 'kilometers': + round(rhumbDistance(pt1, pt2, Unit.kilometers), 6), + 'greatCircleDistance': + round(distance(pt1, pt2, Unit.kilometers), 6), 'radians': round(rhumbDistance(pt1, pt2, Unit.radians), 6), 'degrees': round(rhumbDistance(pt1, pt2, Unit.degrees), 6), }; - Directory outDir = Directory('./test/examples/rhumb_distance/out'); + Directory outDir = + Directory('./test/examples/rhumb_distance/out'); for (var file2 in outDir.listSync(recursive: true)) { if (file2 is File && file.path.endsWith('.json') && file2.uri.pathSegments.last == file.uri.pathSegments.last) { var outSource = jsonDecode(file.readAsStringSync()); - final isEqual = distances.keys.every((key) => distances[key] == outSource[key]); + final isEqual = distances.keys + .every((key) => distances[key] == outSource[key]); expect(isEqual, true); } } diff --git a/test/components/transform_rotate_test.dart b/test/components/transform_rotate_test.dart index e5a97325..03202942 100644 --- a/test/components/transform_rotate_test.dart +++ b/test/components/transform_rotate_test.dart @@ -35,11 +35,13 @@ void main() { transformRotate(line, 100); - expect(eq.compare(line, lineBefore), true, reason: 'input should NOT be mutated'); + expect(eq.compare(line, lineBefore), true, + reason: 'input should NOT be mutated'); transformRotate(line, 100, mutate: true); - expect(eq.compare(truncate(line, precision: 1), rotatedMatcher), true, reason: "input should be mutated"); + expect(eq.compare(truncate(line, precision: 1), rotatedMatcher), true, + reason: "input should be mutated"); }); Directory inDir = Directory('./test/examples/transform_rotate/in'); @@ -53,7 +55,8 @@ void main() { final angle = feature.properties?['angle']; var pivot = feature.properties?['pivot']; - pivot = pivot == null ? null : Point.fromJson({'coordinates': pivot}); + pivot = + pivot == null ? null : Point.fromJson({'coordinates': pivot}); final rotated = transformRotate( feature, @@ -74,9 +77,11 @@ void main() { makePivot(pivot, feature), ]; - Directory outDir = Directory('./test/examples/transform_rotate/out'); + Directory outDir = + Directory('./test/examples/transform_rotate/out'); for (var file2 in outDir.listSync(recursive: true)) { - if (file2 is File && file2.uri.pathSegments.last == file.uri.pathSegments.last) { + if (file2 is File && + file2.uri.pathSegments.last == file.uri.pathSegments.last) { var outSource = file2.readAsStringSync(); var outGeom = GeoJSONObject.fromJson(jsonDecode(outSource)); Equality eq = Equality(); @@ -93,7 +98,8 @@ void main() { Feature colorize(GeoJSONObject geojson) { final feature = geojson as Feature; - if (feature.geometry?.type == GeoJSONObjectType.point || feature.geometry?.type == GeoJSONObjectType.multiPoint) { + if (feature.geometry?.type == GeoJSONObjectType.point || + feature.geometry?.type == GeoJSONObjectType.multiPoint) { feature.properties?.putIfAbsent("marker-color", () => "#F00"); feature.properties?.putIfAbsent("marker-symbol", () => "star"); } else { @@ -107,5 +113,7 @@ Feature makePivot(Point? pivot, GeoJSONObject geojson) { if (pivot == null) { return centroid(geojson, properties: {"marker-symbol": "circle"}); } - return Feature(geometry: Point(coordinates: getCoord(pivot)), properties: {"marker-symbol": "circle"}); + return Feature( + geometry: Point(coordinates: getCoord(pivot)), + properties: {"marker-symbol": "circle"}); } From 0be7e683671f6748fd661a5ad8be2810976fd72a Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Fri, 28 Apr 2023 10:41:45 +0200 Subject: [PATCH 62/72] introduce localCoordIndex in coordEach, cover more test cases in truncate_test --- lib/src/meta/coord.dart | 90 +++++++++++++++--------- lib/src/truncate.dart | 12 ++-- test/components/geojson_test.dart | 2 + test/components/midpoint_test.dart | 2 + test/components/polygon_smooth_test.dart | 2 + 5 files changed, 70 insertions(+), 38 deletions(-) diff --git a/lib/src/meta/coord.dart b/lib/src/meta/coord.dart index 9e47bc17..5c3a522b 100644 --- a/lib/src/meta/coord.dart +++ b/lib/src/meta/coord.dart @@ -10,6 +10,39 @@ typedef CoordEachCallback = dynamic Function( int? geometryIndex, ); +typedef LocalizedCoordEachCallback = dynamic Function( + Position? currentCoord, + int? coordIndex, + int? featureIndex, + int? multiFeatureIndex, + int? geometryIndex, + int? localCoordIndex, +); + +dynamic _callbackWrapper( + Function callback, Position? currentCoord, _IndexCounter counter) { + if (callback is CoordEachCallback) { + return callback( + currentCoord, + counter.coordIndex, + counter.featureIndex, + counter.multiFeatureIndex, + counter.geometryIndex, + ); + } else if (callback is LocalizedCoordEachCallback) { + return callback( + currentCoord, + counter.coordIndex, + counter.featureIndex, + counter.multiFeatureIndex, + counter.geometryIndex, + counter.localCoordIndex, + ); + } else { + throw Exception('Unknown callback type'); + } +} + /// Iterates over coordinates in any [geoJSONObject], similar to [Iterable.forEach] /// example: /// ```dart @@ -26,7 +59,7 @@ typedef CoordEachCallback = dynamic Function( /// //=geometryIndex /// }); /// ``` -void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, +void coordEach(GeoJSONObject geoJSON, Function callback, [bool excludeWrapCoord = false]) { _IndexCounter indexCounter = _IndexCounter(); try { @@ -52,11 +85,8 @@ void coordEach(GeoJSONObject geoJSON, CoordEachCallback callback, } } -void _forEachCoordInGeometryObject( - GeometryType geometry, - CoordEachCallback callback, - bool excludeWrapCoord, - _IndexCounter indexCounter) { +void _forEachCoordInGeometryObject(GeometryType geometry, Function callback, + bool excludeWrapCoord, _IndexCounter indexCounter) { GeoJSONObjectType geomType = geometry.type; int wrapShrink = excludeWrapCoord && (geomType == GeoJSONObjectType.polygon || @@ -84,42 +114,35 @@ void _forEachCoordInGeometryObject( } void _forEachCoordInMultiNestedCollection(coords, GeoJSONObjectType geomType, - int wrapShrink, CoordEachCallback callback, _IndexCounter indexCounter) { + int wrapShrink, Function callback, _IndexCounter indexCounter) { for (var j = 0; j < coords.length; j++) { - int geometryIndex = 0; + indexCounter.geometryIndex = 0; for (var k = 0; k < coords[j].length; k++) { + indexCounter.localCoordIndex = 0; for (var l = 0; l < coords[j][k].length - wrapShrink; l++) { - if (callback( - coords[j][k][l], - indexCounter.coordIndex, - indexCounter.featureIndex, - indexCounter.multiFeatureIndex, - geometryIndex) == + if (_callbackWrapper(callback, coords[j][k][l], indexCounter) == false) { throw ShortCircuit(); } indexCounter.coordIndex++; + indexCounter.localCoordIndex++; } - geometryIndex++; + indexCounter.geometryIndex++; } indexCounter.multiFeatureIndex++; } } void _forEachCoordInNestedCollection(coords, GeoJSONObjectType geomType, - int wrapShrink, CoordEachCallback callback, _IndexCounter indexCounter) { + int wrapShrink, Function callback, _IndexCounter indexCounter) { for (var j = 0; j < coords.length; j++) { + indexCounter.localCoordIndex = 0; for (var k = 0; k < coords[j].length - wrapShrink; k++) { - if (callback( - coords[j][k], - indexCounter.coordIndex, - indexCounter.featureIndex, - indexCounter.multiFeatureIndex, - indexCounter.geometryIndex) == - false) { + if (_callbackWrapper(callback, coords[j][k], indexCounter) == false) { throw ShortCircuit(); } indexCounter.coordIndex++; + indexCounter.localCoordIndex++; } if (geomType == GeoJSONObjectType.multiLineString) { indexCounter.multiFeatureIndex++; @@ -134,14 +157,14 @@ void _forEachCoordInNestedCollection(coords, GeoJSONObjectType geomType, } void _forEachCoordInCollection(coords, GeoJSONObjectType geomType, - CoordEachCallback callback, _IndexCounter indexCounter) { + Function callback, _IndexCounter indexCounter) { + indexCounter.localCoordIndex = 0; for (var j = 0; j < coords.length; j++) { - if (callback(coords[j], indexCounter.coordIndex, indexCounter.featureIndex, - indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == - false) { + if (_callbackWrapper(callback, coords[j], indexCounter) == false) { throw ShortCircuit(); } indexCounter.coordIndex++; + indexCounter.localCoordIndex++; if (geomType == GeoJSONObjectType.multiPoint) { indexCounter.multiFeatureIndex++; } @@ -152,18 +175,19 @@ void _forEachCoordInCollection(coords, GeoJSONObjectType geomType, } void _forEachCoordInPoint( - Position coords, CoordEachCallback callback, _IndexCounter indexCounter) { - if (callback(coords, indexCounter.coordIndex, indexCounter.featureIndex, - indexCounter.multiFeatureIndex, indexCounter.geometryIndex) == - false) { + Position coords, Function callback, _IndexCounter indexCounter) { + indexCounter.localCoordIndex = 0; + if (_callbackWrapper(callback, coords, indexCounter) == false) { throw ShortCircuit(); } + indexCounter.localCoordIndex++; indexCounter.coordIndex++; indexCounter.multiFeatureIndex++; } /// A simple class to manage counters from CoordinateEach functions class _IndexCounter { + int localCoordIndex = 0; int coordIndex = 0; int geometryIndex = 0; int multiFeatureIndex = 0; @@ -232,8 +256,8 @@ T? coordReduce( bool excludeWrapCoord = false, ]) { var previousValue = initialValue; - coordEach(geojson, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, - geometryIndex) { + coordEach(geojson, (Position? currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { if (coordIndex == 0 && initialValue == null && currentCoord is T) { previousValue = currentCoord?.clone() as T; } else { diff --git a/lib/src/truncate.dart b/lib/src/truncate.dart index 1d1b6f66..4db5f0a1 100644 --- a/lib/src/truncate.dart +++ b/lib/src/truncate.dart @@ -51,22 +51,24 @@ void _replaceCoords(int precision, int coordinates, GeoJSONObject geojson) { int? featureIndex, int? multiFeatureIndex, int? geometryIndex, + int? localCoordIndex, ) { if (currentGeometry is Point) { currentGeometry.coordinates = _truncateCoords(currentCoord!, precision, coordinates); - } else if (currentGeometry is LineString) { - currentGeometry.coordinates[coordIndex!] = + } else if (currentGeometry is LineString || + currentGeometry is MultiPoint) { + currentGeometry.coordinates[localCoordIndex!] = _truncateCoords(currentCoord!, precision, coordinates); } else if (currentGeometry is Polygon) { - currentGeometry.coordinates[geometryIndex!][coordIndex!] = + currentGeometry.coordinates[geometryIndex!][localCoordIndex!] = _truncateCoords(currentCoord!, precision, coordinates); } else if (currentGeometry is MultiLineString) { - currentGeometry.coordinates[multiFeatureIndex!][coordIndex!] = + currentGeometry.coordinates[multiFeatureIndex!][localCoordIndex!] = _truncateCoords(currentCoord!, precision, coordinates); } else if (currentGeometry is MultiPolygon) { currentGeometry.coordinates[multiFeatureIndex!][geometryIndex!] - [coordIndex!] = + [localCoordIndex!] = _truncateCoords(currentCoord!, precision, coordinates); } }, diff --git a/test/components/geojson_test.dart b/test/components/geojson_test.dart index 87a29c67..9133302e 100644 --- a/test/components/geojson_test.dart +++ b/test/components/geojson_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: no_leading_underscores_for_local_identifiers + import 'dart:convert'; import 'dart:io'; import 'dart:math'; diff --git a/test/components/midpoint_test.dart b/test/components/midpoint_test.dart index 118403d1..51dc60de 100644 --- a/test/components/midpoint_test.dart +++ b/test/components/midpoint_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: no_leading_underscores_for_local_identifiers + import 'package:test/test.dart'; import 'package:turf/distance.dart'; import 'package:turf/helpers.dart'; diff --git a/test/components/polygon_smooth_test.dart b/test/components/polygon_smooth_test.dart index 2b92dab5..119b2b6f 100644 --- a/test/components/polygon_smooth_test.dart +++ b/test/components/polygon_smooth_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: no_leading_underscores_for_local_identifiers + import 'dart:convert'; import 'dart:io'; From 98fa7803ff96f3fb05a99e50cc38043927f310ea Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 13 Jun 2023 10:16:33 +0200 Subject: [PATCH 63/72] prepare for next release, support --- CHANGELOG.md | 11 +++++++++++ README.md | 8 ++++---- analysis_options.yaml | 2 +- lib/centroid.dart | 3 +++ pubspec.yaml | 16 ++++++++-------- 5 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 lib/centroid.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 383fc3c1..7af7de24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.0.8 + +- Implements `transformRotate`, `rhumbDistance`, `rhumbDestination`, `centroid` [#147](https://github.com/dartclub/turf_dart/pull/147) +- Introduce `localCoordIndex` in `coordEach` +- Implements all the `boolean`* functions [#91](https://github.com/dartclub/turf_dart/pull/91) +- Implements `area` function [#123](https://github.com/dartclub/turf_dart/pull/123) +- Implements `polygonSmooth` function [#127](https://github.com/dartclub/turf_dart/pull/127) +- Fixes missing parameter in nearest point on line [#145](https://github.com/dartclub/turf_dart/pull/145) +- Other core improvements +- Support for Dart 3 + ## 0.0.7 - Implements `nearestPointOn(Multi)Line` [#87](https://github.com/dartclub/turf_dart/pull/87) diff --git a/README.md b/README.md index bd066e46..ff930252 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [bearing](https://github.com/dartclub/turf_dart/blob/main/lib/src/bearing.dart) - [x] [center](https://github.com/Dennis-Mwea/turf_dart/blob/main/lib/src/center.dart) - [ ] centerOfMass -- [ ] centroid +- [x] [centroid](https://github.com/dartclub/turf_dart/blob/main/lib/src/centroid.dart) - [x] [destination](https://github.com/dartclub/turf_dart/blob/main/lib/src/destination.dart) - [x] [distance](https://github.com/dartclub/turf_dart/blob/main/lib/src/distance.dart) - [ ] envelope @@ -95,8 +95,8 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] polygonTangents - [ ] pointToLineDistance - [x] [rhumbBearing](https://github.com/dartclub/turf_dart/blob/main/lib/src/rhumb_bearing.dart) -- [ ] rhumbDestination -- [ ] rhumbDistance +- [x] [rhumbDestination](https://github.com/dartclub/turf_dart/blob/main/lib/src/rhumb_destination.dart) +- [x] [rhumbDistance](https://github.com/dartclub/turf_dart/blob/main/lib/src/rhumb_distance.dart) - [ ] square - [ ] greatCircle @@ -124,7 +124,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [polygonSmooth](ttps://github.com/dartclub/turf_dart/blob/main/lib/src/polygon_smooth.dart) - [ ] simplify - [ ] tesselate -- [ ] transformRotate +- [x] [transformRotate](https://github.com/dartclub/turf_dart/blob/main/lib/src/transform_rotate.dart) - [ ] transformTranslate - [ ] transformScale - [ ] union diff --git a/analysis_options.yaml b/analysis_options.yaml index f6555aff..54e0825e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,4 +1,4 @@ -include: package:dartclub_lint/dart.yaml +include: package:lints/recommended.yaml analyzer: errors: diff --git a/lib/centroid.dart b/lib/centroid.dart new file mode 100644 index 00000000..9cf9ee5b --- /dev/null +++ b/lib/centroid.dart @@ -0,0 +1,3 @@ +library turf_centroid; + +export 'src/centroid.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index c1f54c7a..d2f9c492 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,22 +1,22 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.7 +version: 0.0.8 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.15.0 <4.0.0" homepage: https://github.com/dartclub/turf_dart repository: https://github.com/dartclub/turf_dart dependencies: - json_annotation: ^4.4.0 + json_annotation: ^4.8.1 turf_equality: ^0.0.2 turf_pip: ^0.0.1+1 rbush: ^1.1.0 sweepline_intersections: ^0.0.3+1 dev_dependencies: - dartclub_lint: ^1.0.0 - test: ^1.19.3 - json_serializable: ^6.1.1 - build_runner: ^2.1.5 - analyzer: ^2.7.0 + lints: ^2.1.1 + test: ^1.24.3 + json_serializable: ^6.7.0 + build_runner: ^2.4.5 + analyzer: ^5.13.0 benchmark: ^0.3.0 From 4b7e16f71bb1b1597dd5acd1e3f44f70fe6c71fc Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 13 Jun 2023 11:02:23 +0200 Subject: [PATCH 64/72] work student position --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ff930252..cabd1910 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # turf.dart +ℹ️ Looking for maintainers as a work student position in Germany: Write an email to jobs@scalabs.de ℹ️ + [![pub package](https://img.shields.io/pub/v/turf.svg)](https://pub.dev/packages/turf) THIS PROJECT IS WORK IN PROCESS From 38edf938d58165ae76c7071d68b60a17c8c345ae Mon Sep 17 00:00:00 2001 From: ggastv Date: Tue, 13 Jun 2023 16:08:19 +0300 Subject: [PATCH 65/72] Fix excludeWrapCoord in coordEach for MultiPolygon type. (#148) * Fix excludeWrapCoord in coordEach for MultiPolygon type. * Added multipolygon test case for centroid. --- lib/src/meta/coord.dart | 2 +- test/components/meta_test.dart | 18 +++ .../examples/centroid/in/multipolygon.geojson | 121 ++++++++++++++++ .../centroid/out/multipolygon.geojson | 136 ++++++++++++++++++ 4 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 test/examples/centroid/in/multipolygon.geojson create mode 100644 test/examples/centroid/out/multipolygon.geojson diff --git a/lib/src/meta/coord.dart b/lib/src/meta/coord.dart index 5c3a522b..68b22d46 100644 --- a/lib/src/meta/coord.dart +++ b/lib/src/meta/coord.dart @@ -90,7 +90,7 @@ void _forEachCoordInGeometryObject(GeometryType geometry, Function callback, GeoJSONObjectType geomType = geometry.type; int wrapShrink = excludeWrapCoord && (geomType == GeoJSONObjectType.polygon || - geomType == GeoJSONObjectType.multiLineString) + geomType == GeoJSONObjectType.multiPolygon) ? 1 : 0; indexCounter.multiFeatureIndex = 0; diff --git a/test/components/meta_test.dart b/test/components/meta_test.dart index b178cb18..7e47282e 100644 --- a/test/components/meta_test.dart +++ b/test/components/meta_test.dart @@ -487,6 +487,24 @@ void main() { expect(count, 1); }); + test('coordEach -- excludeWrapCoord - Polygon', () { + var count = 0; + coordEach(poly, (currentCoord, coordIndex, featureIndex, multiFeatureIndex, + geometryIndex) { + count += 1; + }, true); + expect(count, 3); + }); + + test('coordEach -- excludeWrapCoord - MultiPolygon', () { + var count = 0; + coordEach(multiPoly, (currentCoord, coordIndex, featureIndex, + multiFeatureIndex, geometryIndex) { + count += 1; + }, true); + expect(count, 6); + }); + test('propEach --featureCollection', () { collection(pt).forEach((input) { propEach(input, (prop, i) { diff --git a/test/examples/centroid/in/multipolygon.geojson b/test/examples/centroid/in/multipolygon.geojson new file mode 100644 index 00000000..5792e1cd --- /dev/null +++ b/test/examples/centroid/in/multipolygon.geojson @@ -0,0 +1,121 @@ +{ + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-80.83740234375, -33.75146241858857], + [-80.8267593383789, -33.76316538009658], + [-80.83036422729492, -33.77643631739436], + [-80.79448699951172, -33.81181543283183], + [-80.77629089355469, -33.8159515518711], + [-80.76066970825195, -33.805254282102595], + [-80.75637817382812, -33.76587681391894], + [-80.77457427978516, -33.723197462817026], + [-80.80615997314453, -33.724054113439884], + [-80.83740234375, -33.75146241858857] + ] + ], + [ + [ + [-78.87805938720703, -33.60575555447342], + [-78.88629913330078, -33.61318971884082], + [-78.87943267822264, -33.63034303571294], + [-78.89350891113281, -33.64520648119226], + [-78.90380859375, -33.64720713369291], + [-78.90827178955078, -33.64434904445886], + [-78.9151382446289, -33.64606390938584], + [-78.92166137695312, -33.65206566761678], + [-78.92303466796875, -33.65492350063952], + [-78.93024444580078, -33.65749546922024], + [-78.94020080566406, -33.66778257479216], + [-78.93573760986328, -33.67092561169521], + [-78.93882751464844, -33.674354248232504], + [-78.94191741943358, -33.67292566628718], + [-78.94878387451172, -33.67692563592954], + [-78.94123077392578, -33.682353868548184], + [-78.93539428710938, -33.68321092658006], + [-78.93814086914062, -33.678639851675534], + [-78.93848419189453, -33.675782806445994], + [-78.93299102783203, -33.671497060610534], + [-78.92406463623047, -33.671211336627486], + [-78.92131805419922, -33.6652109137176], + [-78.92406463623047, -33.66178191269289], + [-78.914794921875, -33.65578083204094], + [-78.90758514404297, -33.662924928220384], + [-78.90449523925781, -33.660353121928814], + [-78.90552520751953, -33.657209698729595], + [-78.89934539794922, -33.652637241813174], + [-78.89213562011719, -33.66006736092875], + [-78.88458251953125, -33.65606660727672], + [-78.87428283691406, -33.644920669896656], + [-78.8656997680664, -33.64520648119226], + [-78.86089324951172, -33.66549665763364], + [-78.82793426513672, -33.66092464108171], + [-78.78398895263672, -33.6794969467326], + [-78.76922607421875, -33.670639885813706], + [-78.7771224975586, -33.662067667998414], + [-78.77918243408203, -33.655495055856136], + [-78.79051208496094, -33.641490860339054], + [-78.81351470947266, -33.64063338660099], + [-78.81729125976561, -33.64434904445886], + [-78.83068084716797, -33.640919212129155], + [-78.83033752441406, -33.63148646875166], + [-78.84819030761717, -33.618621971969276], + [-78.848876953125, -33.61347563543629], + [-78.86295318603516, -33.6071852512562], + [-78.87805938720703, -33.60575555447342] + ] + ], + [ + [ + [-78.95161628723145, -33.69528025294664], + [-78.95530700683594, -33.70006466462807], + [-78.9521312713623, -33.70163560737423], + [-78.9506721496582, -33.700278885784996], + [-78.94861221313477, -33.701207171292374], + [-78.94972801208496, -33.70306371221516], + [-78.95075798034668, -33.70284949800254], + [-78.95178794860838, -33.7045631967461], + [-78.9480972290039, -33.70784769044128], + [-78.94947052001952, -33.70934709145684], + [-78.94303321838379, -33.71377374172037], + [-78.93917083740234, -33.71363095011231], + [-78.93771171569824, -33.71455909132016], + [-78.93874168395996, -33.7163439500602], + [-78.93659591674805, -33.714987460801574], + [-78.93685340881348, -33.7134881582668], + [-78.93479347229004, -33.714916066036416], + [-78.93410682678223, -33.71355955421924], + [-78.93075942993164, -33.71355955421924], + [-78.92475128173828, -33.715201644740844], + [-78.92380714416502, -33.714773276327996], + [-78.92483711242676, -33.71377374172037], + [-78.92706871032715, -33.712988384937574], + [-78.92998695373535, -33.712845592023534], + [-78.92998695373535, -33.71170324016297], + [-78.93118858337402, -33.70970408784028], + [-78.93393516540527, -33.70998968387856], + [-78.93625259399414, -33.70791909108323], + [-78.9378833770752, -33.708276093402596], + [-78.93925666809082, -33.7064196651371], + [-78.9411449432373, -33.706205459293635], + [-78.94020080566406, -33.70506301910626], + [-78.94140243530273, -33.704206178993886], + [-78.94037246704102, -33.70263528325574], + [-78.94208908081055, -33.69792242367998], + [-78.94320487976074, -33.69742255977288], + [-78.94569396972656, -33.699350590247136], + [-78.94929885864258, -33.69799383257217], + [-78.94981384277342, -33.69649423337286], + [-78.9492130279541, -33.695922950602935], + [-78.95015716552734, -33.69513743059241], + [-78.95092964172363, -33.69578012931697], + [-78.95161628723145, -33.69528025294664] + ] + ] + ] + } +} diff --git a/test/examples/centroid/out/multipolygon.geojson b/test/examples/centroid/out/multipolygon.geojson new file mode 100644 index 00000000..14d547b6 --- /dev/null +++ b/test/examples/centroid/out/multipolygon.geojson @@ -0,0 +1,136 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "marker-symbol": "circle" + }, + "geometry": { + "type": "Point", + "coordinates": [-79.08634303771343, -33.68749020845278] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-80.83740234375, -33.75146241858857], + [-80.8267593383789, -33.76316538009658], + [-80.83036422729492, -33.77643631739436], + [-80.79448699951172, -33.81181543283183], + [-80.77629089355469, -33.8159515518711], + [-80.76066970825195, -33.805254282102595], + [-80.75637817382812, -33.76587681391894], + [-80.77457427978516, -33.723197462817026], + [-80.80615997314453, -33.724054113439884], + [-80.83740234375, -33.75146241858857] + ] + ], + [ + [ + [-78.87805938720703, -33.60575555447342], + [-78.88629913330078, -33.61318971884082], + [-78.87943267822264, -33.63034303571294], + [-78.89350891113281, -33.64520648119226], + [-78.90380859375, -33.64720713369291], + [-78.90827178955078, -33.64434904445886], + [-78.9151382446289, -33.64606390938584], + [-78.92166137695312, -33.65206566761678], + [-78.92303466796875, -33.65492350063952], + [-78.93024444580078, -33.65749546922024], + [-78.94020080566406, -33.66778257479216], + [-78.93573760986328, -33.67092561169521], + [-78.93882751464844, -33.674354248232504], + [-78.94191741943358, -33.67292566628718], + [-78.94878387451172, -33.67692563592954], + [-78.94123077392578, -33.682353868548184], + [-78.93539428710938, -33.68321092658006], + [-78.93814086914062, -33.678639851675534], + [-78.93848419189453, -33.675782806445994], + [-78.93299102783203, -33.671497060610534], + [-78.92406463623047, -33.671211336627486], + [-78.92131805419922, -33.6652109137176], + [-78.92406463623047, -33.66178191269289], + [-78.914794921875, -33.65578083204094], + [-78.90758514404297, -33.662924928220384], + [-78.90449523925781, -33.660353121928814], + [-78.90552520751953, -33.657209698729595], + [-78.89934539794922, -33.652637241813174], + [-78.89213562011719, -33.66006736092875], + [-78.88458251953125, -33.65606660727672], + [-78.87428283691406, -33.644920669896656], + [-78.8656997680664, -33.64520648119226], + [-78.86089324951172, -33.66549665763364], + [-78.82793426513672, -33.66092464108171], + [-78.78398895263672, -33.6794969467326], + [-78.76922607421875, -33.670639885813706], + [-78.7771224975586, -33.662067667998414], + [-78.77918243408203, -33.655495055856136], + [-78.79051208496094, -33.641490860339054], + [-78.81351470947266, -33.64063338660099], + [-78.81729125976561, -33.64434904445886], + [-78.83068084716797, -33.640919212129155], + [-78.83033752441406, -33.63148646875166], + [-78.84819030761717, -33.618621971969276], + [-78.848876953125, -33.61347563543629], + [-78.86295318603516, -33.6071852512562], + [-78.87805938720703, -33.60575555447342] + ] + ], + [ + [ + [-78.95161628723145, -33.69528025294664], + [-78.95530700683594, -33.70006466462807], + [-78.9521312713623, -33.70163560737423], + [-78.9506721496582, -33.700278885784996], + [-78.94861221313477, -33.701207171292374], + [-78.94972801208496, -33.70306371221516], + [-78.95075798034668, -33.70284949800254], + [-78.95178794860838, -33.7045631967461], + [-78.9480972290039, -33.70784769044128], + [-78.94947052001952, -33.70934709145684], + [-78.94303321838379, -33.71377374172037], + [-78.93917083740234, -33.71363095011231], + [-78.93771171569824, -33.71455909132016], + [-78.93874168395996, -33.7163439500602], + [-78.93659591674805, -33.714987460801574], + [-78.93685340881348, -33.7134881582668], + [-78.93479347229004, -33.714916066036416], + [-78.93410682678223, -33.71355955421924], + [-78.93075942993164, -33.71355955421924], + [-78.92475128173828, -33.715201644740844], + [-78.92380714416502, -33.714773276327996], + [-78.92483711242676, -33.71377374172037], + [-78.92706871032715, -33.712988384937574], + [-78.92998695373535, -33.712845592023534], + [-78.92998695373535, -33.71170324016297], + [-78.93118858337402, -33.70970408784028], + [-78.93393516540527, -33.70998968387856], + [-78.93625259399414, -33.70791909108323], + [-78.9378833770752, -33.708276093402596], + [-78.93925666809082, -33.7064196651371], + [-78.9411449432373, -33.706205459293635], + [-78.94020080566406, -33.70506301910626], + [-78.94140243530273, -33.704206178993886], + [-78.94037246704102, -33.70263528325574], + [-78.94208908081055, -33.69792242367998], + [-78.94320487976074, -33.69742255977288], + [-78.94569396972656, -33.699350590247136], + [-78.94929885864258, -33.69799383257217], + [-78.94981384277342, -33.69649423337286], + [-78.9492130279541, -33.695922950602935], + [-78.95015716552734, -33.69513743059241], + [-78.95092964172363, -33.69578012931697], + [-78.95161628723145, -33.69528025294664] + ] + ] + ] + } + } + ] +} From bbccfb3cebb532a2e8341294f30590ae8a541b5d Mon Sep 17 00:00:00 2001 From: Lukas Himsel Date: Tue, 13 Jun 2023 16:13:26 +0200 Subject: [PATCH 66/72] format markdown --- CHANGELOG.md | 3 +-- CONTRIBUTING.md | 29 +++++++++++++++++++---------- README.md | 2 +- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7af7de24..36864a3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,10 +36,9 @@ - Documentation: improves pub.dev scores, raised documentation coverage, fixed typos - Return type fixes for the the meta extensions - ## 0.0.5 -- Implements *all* meta functions and`lineSegment` +- Implements *all* meta functions and`lineSegment` - Adds a lot of documentation - Several bug and type fixes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a78adf91..3fe382c5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,24 +3,29 @@ Welcome and thank you for deciding to contribute to the project! Here is how cooperation works perfectly at [Turf Dart](https://github.com/dartclub/turf_dart) + #### Table of Contents - - [Code of Conduct](#code-of-conduct) - - [Get started](#get-started) - - [Structure of modules](#structure-of-modules) - - [Implementation Process](#implementation-process) - - [Documentation](#documentation) - - [GeoJSON object model](#GeoJSON-object-model) + +- [Code of Conduct](#code-of-conduct) +- [Get started](#get-started) +- [Structure of modules](#structure-of-modules) +- [Implementation Process](#implementation-process) +- [Documentation](#documentation) +- [GeoJSON object model](#GeoJSON-object-model) ## Code of conduct + By participating, you are expected to uphold international human rights and fundamental freedoms! -To put it simply, be kind to each other. +To put it simply, be kind to each other. ## Get started + - Get the [Dart tools](https://dart.dev/tools) - Clone the repository: ```git clone git@github.com:dartclub/turf_dart.git``` - Navigate to project's folder in terminal & get its dependencies: ```dart pub get``` - Go through [Implementation Process](#implementation-process) - Import the library in your code and use it. For example: + ```dart import 'package:turf/helpers.dart'; import 'package:turf/src/line_segment.dart'; @@ -58,7 +63,8 @@ var total = segmentReduce(poly, (previousValue, ``` ## Structure of modules -``` + +```text TURF_DART/lib/.dart // public facing API, exports the implementation │ │ │ └───src/.dart // the implementation @@ -67,7 +73,9 @@ TURF_DART/lib/.dart // public facing API, exports the implementatio │ └───test/components/_test.dart // all the related tests ``` + ## Implementation process + - Check the Backlog/Issues for similar issues - Create a new branch _feature-_ from _main_ - Create a _draft Pull request_, mention in it the associated issues @@ -80,10 +88,10 @@ TURF_DART/lib/.dart // public facing API, exports the implementatio - run the benchmark: ```dart pub run benchmark``` - Commit - Convert to real Pull request _ready for review_ -- Code review / mention a reviewer from [contributors list](https://github.com/dartclub/turf_dart/graphs/contributors) - +- Code review / mention a reviewer from [contributors list](https://github.com/dartclub/turf_dart/graphs/contributors) ## Documentation + We follow [Effective Dart](https://dart.dev/guides/language/effective-dart/documentation) guidelines for documentation. After going through the [Implementation Process](#implementation-process), please mention the made changes in [README.md](https://github.com/dartclub/turf_dart/blob/main/README.md) @@ -91,5 +99,6 @@ After going through the [Implementation Process](#implementation-process), pleas In order to add to this very documentation, please develop CONTRIBUTING.md in [documentation branch](https://github.com/dartclub/turf_dart/tree/documentation) ## GeoJSON Object Model + If you have not read our [README.md](https://github.com/dartclub/turf_dart/blob/main/README.md) this diagram will give you a lot of information. Please consider looking our [notable design decisions](https://github.com/dartclub/turf_dart/blob/main/README.md#notable-design-decisions). ![polymorphism](https://user-images.githubusercontent.com/10634693/159876354-f9da2f37-02b3-4546-b32a-c0f82c372272.png) diff --git a/README.md b/README.md index cabd1910..a20a98f7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # turf.dart -ℹ️ Looking for maintainers as a work student position in Germany: Write an email to jobs@scalabs.de ℹ️ +ℹ️ Looking for maintainers as a work student position in Germany: Write an email to [jobs@scalabs.de](mailto:jobs@scalabs.de) ℹ️ [![pub package](https://img.shields.io/pub/v/turf.svg)](https://pub.dev/packages/turf) From c3537d6878dda2cab47f1fd420434c1d222b2aff Mon Sep 17 00:00:00 2001 From: L Linse Date: Thu, 25 Jan 2024 10:54:21 +0100 Subject: [PATCH 67/72] Document properties set by NearestPointOnLine on returned Point (#155) --- lib/src/nearest_point_on_line.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/src/nearest_point_on_line.dart b/lib/src/nearest_point_on_line.dart index 12554074..4656bef1 100644 --- a/lib/src/nearest_point_on_line.dart +++ b/lib/src/nearest_point_on_line.dart @@ -183,6 +183,13 @@ _NearestMulti? _nearestPointOnMultiLine( } /// Takes a [Point] and a [LineString] and calculates the closest Point on the [LineString]. +/// +/// The properties of returned [Point] will contain three values: +/// * index: closest point was found on nth line part +/// * dist: distance between [point] and the closest point on line +/// * location: distance along the line between start and the closest point. +/// +/// Example: /// ```dart /// var line = LineString( /// coordinates: [ From bec5af9ba7ac8282ce1be146f6098540b02d3dda Mon Sep 17 00:00:00 2001 From: Leif Linse <118986082+leiflinse-trivector@users.noreply.github.com> Date: Thu, 25 Jan 2024 16:56:26 +0100 Subject: [PATCH 68/72] Implement length and along (#153) * Implement length with tests * Implement along with tests * Fix export added functions * Document along behaviour when distance is outside line length range * Format along test * Change length and along to accept Feature instead of LineString * Change length to never return null. To my understanding, the reason why segmentReduce in its signature may return null is due to initialValue may be null, but in length() we supply 0.0 as the default. * Change along to throw Exception when empty line is passed instead of returning null It appears to be more in line with how turf.js operates and also existing error handling in turf_dart. * Change along to count from back when distance is negative I raised an issue with turf.js about behavour being undefined when distance is zero and they where in favour of counting from back behavour over clamping to the end. I think it is best to use same behavour as upstream turf.js so changing to their solution. * Update along test for negative distance * Fix along test for negative distance * Add along test using default unit * Add test of length() using default unit * Fix docs for along() when distance is negative * Change along() implementation to handle travelled == distance eagerly --- README.md | 4 +- lib/along.dart | 3 ++ lib/length.dart | 3 ++ lib/src/along.dart | 53 +++++++++++++++++++ lib/src/length.dart | 25 +++++++++ lib/turf.dart | 2 + test/components/along_test.dart | 90 ++++++++++++++++++++++++++++++++ test/components/length_test.dart | 36 +++++++++++++ 8 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 lib/along.dart create mode 100644 lib/length.dart create mode 100644 lib/src/along.dart create mode 100644 lib/src/length.dart create mode 100644 test/components/along_test.dart create mode 100644 test/components/length_test.dart diff --git a/README.md b/README.md index a20a98f7..d6e131ff 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the ### Measurement -- [ ] along +- [x] [along](https://github.com/dartclub/turf_dart/blob/main/lib/src/along.dart) - [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) - [x] [bboxPolygon](https://github.com/dartclub/turf_dart/blob/main/lib/src/bbox_polygon.dart) @@ -91,7 +91,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [destination](https://github.com/dartclub/turf_dart/blob/main/lib/src/destination.dart) - [x] [distance](https://github.com/dartclub/turf_dart/blob/main/lib/src/distance.dart) - [ ] envelope -- [ ] length +- [x] [length](https://github.com/dartclub/turf_dart/blob/main/lib/src/length.dart) - [x] [midpoint](https://github.com/dartclub/turf_dart/blob/main/lib/src/midpoint.dart) - [ ] pointOnFeature - [ ] polygonTangents diff --git a/lib/along.dart b/lib/along.dart new file mode 100644 index 00000000..d8d18fa5 --- /dev/null +++ b/lib/along.dart @@ -0,0 +1,3 @@ +library turf_along; + +export "src/along.dart"; diff --git a/lib/length.dart b/lib/length.dart new file mode 100644 index 00000000..fa72f3ee --- /dev/null +++ b/lib/length.dart @@ -0,0 +1,3 @@ +library turf_length; + +export "src/length.dart"; diff --git a/lib/src/along.dart b/lib/src/along.dart new file mode 100644 index 00000000..9fb4c7e9 --- /dev/null +++ b/lib/src/along.dart @@ -0,0 +1,53 @@ +import 'dart:math'; + +import 'package:turf/bearing.dart'; +import 'package:turf/destination.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/length.dart'; +import 'package:turf/src/distance.dart' as measure_distance; +import 'package:turf/src/invariant.dart'; + +/// Takes a [line] and returns a [Point] at a specified [distance] along the line. +/// +/// If [distance] is less than 0, it will count distance along the line from end +/// to start of line. If negative [distance] overshoots the length of the line, +/// the start point of the line is returned. +/// If [distance] is larger than line length, the end point is returned +/// If [line] have no geometry or coordinates, an Exception is thrown +Point along(Feature line, num distance, + [Unit unit = Unit.kilometers]) { + // Get Coords + final coords = getCoords(line); + if (coords.isEmpty) { + throw Exception('line must contain at least one coordinate'); + } + if (distance < 0) { + distance = max(0, length(line, unit) + distance); + } + num travelled = 0; + for (int i = 0; i < coords.length; i++) { + if (distance >= travelled && i == coords.length - 1) { + break; + } + if (travelled == distance) { + return Point(coordinates: coords[i]); + } + if (travelled > distance) { + final overshot = distance - travelled; + final direction = bearing(Point(coordinates: coords[i]), + Point(coordinates: coords[i - 1])) - + 180; + final interpolated = destination( + Point(coordinates: coords[i]), + overshot, + direction, + unit, + ); + return interpolated; + } else { + travelled += measure_distance.distance(Point(coordinates: coords[i]), + Point(coordinates: coords[i + 1]), unit); + } + } + return Point(coordinates: coords[coords.length - 1]); +} diff --git a/lib/src/length.dart b/lib/src/length.dart new file mode 100644 index 00000000..b7d5e1f7 --- /dev/null +++ b/lib/src/length.dart @@ -0,0 +1,25 @@ +import 'package:turf/distance.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/line_segment.dart'; + +/// Takes a [line] and measures its length in the specified [unit]. +num length(Feature line, [Unit unit = Unit.kilometers]) { + return segmentReduce(line, ( + previousValue, + currentSegment, + initialValue, + featureIndex, + multiFeatureIndex, + geometryIndex, + segmentIndex, + ) { + final coords = currentSegment.geometry!.coordinates; + return previousValue! + + distance( + Point(coordinates: coords[0]), + Point(coordinates: coords[1]), + unit, + ); + }, 0.0) ?? + 0.0; +} diff --git a/lib/turf.dart b/lib/turf.dart index 01f1bc68..25d03aea 100644 --- a/lib/turf.dart +++ b/lib/turf.dart @@ -1,5 +1,6 @@ library turf; +export 'src/along.dart'; export 'src/area.dart'; export 'src/bbox.dart'; export 'src/bearing.dart'; @@ -9,6 +10,7 @@ export 'src/destination.dart'; export 'src/distance.dart'; export 'src/geojson.dart'; export 'src/helpers.dart'; +export 'src/length.dart'; export 'src/midpoint.dart'; export 'src/nearest_point.dart'; export 'src/polyline.dart'; diff --git a/test/components/along_test.dart b/test/components/along_test.dart new file mode 100644 index 00000000..dbc81a1a --- /dev/null +++ b/test/components/along_test.dart @@ -0,0 +1,90 @@ +import 'package:test/test.dart'; +import 'package:turf/along.dart'; +import 'package:turf/distance.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/length.dart'; + +void main() { + test('along - negative distance should count backwards', () { + final viaToEndDistance = + distance(Point(coordinates: via), Point(coordinates: end), Unit.meters); + expect(viaToEndDistance.round(), equals(198)); + final resolvedViaPoint = along(line, -1 * viaToEndDistance, Unit.meters); + expect(resolvedViaPoint.coordinates, equals(via)); + }); + test('along - to start point', () { + final resolvedStartPoint = along(line, 0, Unit.meters); + expect(resolvedStartPoint.coordinates, equals(start)); + }); + test('along - to point between start and via', () { + final startToViaDistance = distance( + Point(coordinates: start), Point(coordinates: via), Unit.meters); + expect(startToViaDistance.round(), equals(57)); + final resolvedViaPoint = along(line, startToViaDistance / 2, Unit.meters); + expect(resolvedViaPoint.coordinates.lat.toStringAsFixed(6), + equals('55.709028')); + expect(resolvedViaPoint.coordinates.lng.toStringAsFixed(6), + equals('13.185096')); + }); + test('along - to via point', () { + final startToViaDistance = distance( + Point(coordinates: start), Point(coordinates: via), Unit.meters); + expect(startToViaDistance.round(), equals(57)); + final resolvedViaPoint = along(line, startToViaDistance, Unit.meters); + expect(resolvedViaPoint.coordinates, equals(via)); + }); + test('along - to point between via and end', () { + final startToViaDistance = distance( + Point(coordinates: start), Point(coordinates: via), Unit.meters); + final viaToEndDistance = + distance(Point(coordinates: via), Point(coordinates: end), Unit.meters); + expect(startToViaDistance.round(), equals(57)); + expect(viaToEndDistance.round(), equals(198)); + final resolvedViaPoint = + along(line, startToViaDistance + viaToEndDistance / 2, Unit.meters); + expect(resolvedViaPoint.coordinates.lat.toStringAsFixed(6), + equals('55.708330')); + expect(resolvedViaPoint.coordinates.lng.toStringAsFixed(6), + equals('13.186555')); + }); + test('along - to end point', () { + final len = length(line, Unit.meters); + expect(len.round(), equals(254)); + final resolvedEndPoint = along(line, len, Unit.meters); + expect(resolvedEndPoint.coordinates, equals(end)); + }); + test('along - to end point - default unit (km)', () { + final len = length(line); + expect((len * 1000).round(), equals(254)); + final resolvedEndPoint = along(line, len); + expect(resolvedEndPoint.coordinates, equals(end)); + }); + test('along - beyond end point', () { + final len = length(line, Unit.meters); + expect(len.round(), equals(254)); + final resolvedEndPoint = along(line, len + 100, Unit.meters); + expect(resolvedEndPoint.coordinates, equals(end)); + }); +} + +final start = Position.named( + lat: 55.7090430186194, + lng: 13.184645393920405, +); +final via = Position.named( + lat: 55.70901279569489, + lng: 13.185546616182755, +); +final end = Position.named( + lat: 55.70764669578079, + lng: 13.187563637197076, +); +final line = Feature( + geometry: LineString( + coordinates: [ + start, + via, + end, + ], + ), +); diff --git a/test/components/length_test.dart b/test/components/length_test.dart new file mode 100644 index 00000000..5c45f8d2 --- /dev/null +++ b/test/components/length_test.dart @@ -0,0 +1,36 @@ +import 'package:test/test.dart'; +import 'package:turf/helpers.dart'; +import 'package:turf/length.dart'; + +void main() { + test('length - in meters', () { + final len = length(line, Unit.meters); + expect(len.round(), equals(254)); + }); + test('length - default unit (km)', () { + final len = length(line); + expect((len * 1000).round(), equals(254)); + }); +} + +final start = Position.named( + lat: 55.7090430186194, + lng: 13.184645393920405, +); +final via = Position.named( + lat: 55.70901279569489, + lng: 13.185546616182755, +); +final end = Position.named( + lat: 55.70764669578079, + lng: 13.187563637197076, +); +final line = Feature( + geometry: LineString( + coordinates: [ + start, + via, + end, + ], + ), +); \ No newline at end of file From c123163ea55296a6070f4c9189925a2240795ca5 Mon Sep 17 00:00:00 2001 From: Leif Linse <118986082+leiflinse-trivector@users.noreply.github.com> Date: Thu, 25 Jan 2024 18:11:29 +0100 Subject: [PATCH 69/72] Fix length_test.dart formatting (#159) --- test/components/length_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/components/length_test.dart b/test/components/length_test.dart index 5c45f8d2..d93278fc 100644 --- a/test/components/length_test.dart +++ b/test/components/length_test.dart @@ -33,4 +33,4 @@ final line = Feature( end, ], ), -); \ No newline at end of file +); From 620d1f9ea614c27a52a824cb37aa3588e2013556 Mon Sep 17 00:00:00 2001 From: Leif Linse <118986082+leiflinse-trivector@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:35:34 +0100 Subject: [PATCH 70/72] Change return type of along to Feature (#161) This goes along with preferring to pass around full Features, and it allow to in the future set properties on the returned point without it being a breaking change. --- lib/src/along.dart | 9 +++++---- test/components/along_test.dart | 28 ++++++++++++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/src/along.dart b/lib/src/along.dart index 9fb4c7e9..f4b50267 100644 --- a/lib/src/along.dart +++ b/lib/src/along.dart @@ -14,7 +14,7 @@ import 'package:turf/src/invariant.dart'; /// the start point of the line is returned. /// If [distance] is larger than line length, the end point is returned /// If [line] have no geometry or coordinates, an Exception is thrown -Point along(Feature line, num distance, +Feature along(Feature line, num distance, [Unit unit = Unit.kilometers]) { // Get Coords final coords = getCoords(line); @@ -30,7 +30,7 @@ Point along(Feature line, num distance, break; } if (travelled == distance) { - return Point(coordinates: coords[i]); + return Feature(geometry: Point(coordinates: coords[i])); } if (travelled > distance) { final overshot = distance - travelled; @@ -43,11 +43,12 @@ Point along(Feature line, num distance, direction, unit, ); - return interpolated; + return Feature(geometry: interpolated); } else { travelled += measure_distance.distance(Point(coordinates: coords[i]), Point(coordinates: coords[i + 1]), unit); } } - return Point(coordinates: coords[coords.length - 1]); + return Feature( + geometry: Point(coordinates: coords[coords.length - 1])); } diff --git a/test/components/along_test.dart b/test/components/along_test.dart index dbc81a1a..f2c9d304 100644 --- a/test/components/along_test.dart +++ b/test/components/along_test.dart @@ -10,20 +10,23 @@ void main() { distance(Point(coordinates: via), Point(coordinates: end), Unit.meters); expect(viaToEndDistance.round(), equals(198)); final resolvedViaPoint = along(line, -1 * viaToEndDistance, Unit.meters); - expect(resolvedViaPoint.coordinates, equals(via)); + expect(resolvedViaPoint.geometry, isNotNull); + expect(resolvedViaPoint.geometry!.coordinates, equals(via)); }); test('along - to start point', () { final resolvedStartPoint = along(line, 0, Unit.meters); - expect(resolvedStartPoint.coordinates, equals(start)); + expect(resolvedStartPoint.geometry, isNotNull); + expect(resolvedStartPoint.geometry!.coordinates, equals(start)); }); test('along - to point between start and via', () { final startToViaDistance = distance( Point(coordinates: start), Point(coordinates: via), Unit.meters); expect(startToViaDistance.round(), equals(57)); final resolvedViaPoint = along(line, startToViaDistance / 2, Unit.meters); - expect(resolvedViaPoint.coordinates.lat.toStringAsFixed(6), + expect(resolvedViaPoint.geometry, isNotNull); + expect(resolvedViaPoint.geometry!.coordinates.lat.toStringAsFixed(6), equals('55.709028')); - expect(resolvedViaPoint.coordinates.lng.toStringAsFixed(6), + expect(resolvedViaPoint.geometry!.coordinates.lng.toStringAsFixed(6), equals('13.185096')); }); test('along - to via point', () { @@ -31,7 +34,8 @@ void main() { Point(coordinates: start), Point(coordinates: via), Unit.meters); expect(startToViaDistance.round(), equals(57)); final resolvedViaPoint = along(line, startToViaDistance, Unit.meters); - expect(resolvedViaPoint.coordinates, equals(via)); + expect(resolvedViaPoint.geometry, isNotNull); + expect(resolvedViaPoint.geometry!.coordinates, equals(via)); }); test('along - to point between via and end', () { final startToViaDistance = distance( @@ -42,28 +46,32 @@ void main() { expect(viaToEndDistance.round(), equals(198)); final resolvedViaPoint = along(line, startToViaDistance + viaToEndDistance / 2, Unit.meters); - expect(resolvedViaPoint.coordinates.lat.toStringAsFixed(6), + expect(resolvedViaPoint.geometry, isNotNull); + expect(resolvedViaPoint.geometry!.coordinates.lat.toStringAsFixed(6), equals('55.708330')); - expect(resolvedViaPoint.coordinates.lng.toStringAsFixed(6), + expect(resolvedViaPoint.geometry!.coordinates.lng.toStringAsFixed(6), equals('13.186555')); }); test('along - to end point', () { final len = length(line, Unit.meters); expect(len.round(), equals(254)); final resolvedEndPoint = along(line, len, Unit.meters); - expect(resolvedEndPoint.coordinates, equals(end)); + expect(resolvedEndPoint.geometry, isNotNull); + expect(resolvedEndPoint.geometry!.coordinates, equals(end)); }); test('along - to end point - default unit (km)', () { final len = length(line); expect((len * 1000).round(), equals(254)); final resolvedEndPoint = along(line, len); - expect(resolvedEndPoint.coordinates, equals(end)); + expect(resolvedEndPoint.geometry, isNotNull); + expect(resolvedEndPoint.geometry!.coordinates, equals(end)); }); test('along - beyond end point', () { final len = length(line, Unit.meters); expect(len.round(), equals(254)); final resolvedEndPoint = along(line, len + 100, Unit.meters); - expect(resolvedEndPoint.coordinates, equals(end)); + expect(resolvedEndPoint.geometry, isNotNull); + expect(resolvedEndPoint.geometry!.coordinates, equals(end)); }); } From a0b930455db8532c2e8438487d9fac548a9c8524 Mon Sep 17 00:00:00 2001 From: Jonas Siedentop Date: Wed, 31 Jan 2024 16:20:32 +0100 Subject: [PATCH 71/72] Prepare release 0.0.9 (#162) * Update Dart SDK version in pubspec.yaml * Update README.md * Remove .DS_Store files * Update changelog * Update package version to 0.0.9 * Update dependencies --- .gitignore | 1 + CHANGELOG.md | 7 ++++++- README.md | 8 +++----- pubspec.yaml | 14 +++++++------- test/.DS_Store | Bin 6148 -> 0 bytes test/examples/.DS_Store | Bin 10244 -> 0 bytes test/examples/booleans/.DS_Store | Bin 8196 -> 0 bytes test/examples/booleans/disjoint/.DS_Store | Bin 6148 -> 0 bytes 8 files changed, 17 insertions(+), 13 deletions(-) delete mode 100644 test/.DS_Store delete mode 100644 test/examples/.DS_Store delete mode 100644 test/examples/booleans/.DS_Store delete mode 100644 test/examples/booleans/disjoint/.DS_Store diff --git a/.gitignore b/.gitignore index 360fc0f5..bd71dd88 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ coverage/ .idea/ +.DS_Store \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 36864a3f..b70908c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.0.9 + +- Implements `length`, `along` [#153](https://github.com/dartclub/turf_dart/pull/153) +- Documentation: Improves pub.dev scores by fixing bad links in Readme.md + ## 0.0.8 - Implements `transformRotate`, `rhumbDistance`, `rhumbDestination`, `centroid` [#147](https://github.com/dartclub/turf_dart/pull/147) @@ -38,7 +43,7 @@ ## 0.0.5 -- Implements *all* meta functions and`lineSegment` +- Implements *all* meta functions and `lineSegment` - Adds a lot of documentation - Several bug and type fixes diff --git a/README.md b/README.md index d6e131ff..180e7c94 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # turf.dart -ℹ️ Looking for maintainers as a work student position in Germany: Write an email to [jobs@scalabs.de](mailto:jobs@scalabs.de) ℹ️ - [![pub package](https://img.shields.io/pub/v/turf.svg)](https://pub.dev/packages/turf) THIS PROJECT IS WORK IN PROCESS @@ -123,7 +121,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [ ] dissolve - [ ] intersect - [ ] lineOffset -- [x] [polygonSmooth](ttps://github.com/dartclub/turf_dart/blob/main/lib/src/polygon_smooth.dart) +- [x] [polygonSmooth](https://github.com/dartclub/turf_dart/blob/main/lib/src/polygon_smooth.dart) - [ ] simplify - [ ] tesselate - [x] [transformRotate](https://github.com/dartclub/turf_dart/blob/main/lib/src/transform_rotate.dart) @@ -234,7 +232,7 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [booleanCrosses](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_crosses.dart) - [x] [booleanDisjoint](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_disjoint.dart) - [x] [booleanEqual](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_equal.dart) -- [x] [booleanIntersects](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_intersect.dart) +- [x] [booleanIntersects](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_intersects.dart) - [ ] booleanOverlap - [x] [booleanParallel](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_parallel.dart) - [x] [booleanPointInPolygon](https://github.com/dartclub/turf_dart/blob/main/lib/src/booleans/boolean_point_in_polygon.dart) @@ -252,4 +250,4 @@ Any new benchmarks must be named `*_benchmark.dart` and reside in the - [x] [radiansToLength](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) - [x] [radiansToDegrees](https://github.com/dartclub/turf_dart/blob/main/lib/src/helpers.dart) - [ ] toMercator -- [ ] toWgs84 +- [ ] toWgs84 \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index d2f9c492..2bf83faa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,22 +1,22 @@ name: turf description: A turf.js-like geospatial analysis library working with GeoJSON, written in pure Dart. -version: 0.0.8 +version: 0.0.9 environment: - sdk: ">=2.15.0 <4.0.0" + sdk: ">=2.17.0 <4.0.0" homepage: https://github.com/dartclub/turf_dart repository: https://github.com/dartclub/turf_dart dependencies: json_annotation: ^4.8.1 - turf_equality: ^0.0.2 - turf_pip: ^0.0.1+1 + turf_equality: ^0.0.3 + turf_pip: ^0.0.2 rbush: ^1.1.0 - sweepline_intersections: ^0.0.3+1 + sweepline_intersections: ^0.0.4 dev_dependencies: - lints: ^2.1.1 + lints: ^3.0.0 test: ^1.24.3 json_serializable: ^6.7.0 build_runner: ^2.4.5 - analyzer: ^5.13.0 + analyzer: ^6.4.0 benchmark: ^0.3.0 diff --git a/test/.DS_Store b/test/.DS_Store deleted file mode 100644 index 8dca1b0c6041d6f51c12453d5fe1b56c21e4e4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~O=}ZD7{{M!qn)$}IVkiZ40sJSZSWAhtg#-vc1t~|#NFl5p16K8oKMkF#&sj_=_? zVXu)>LYk_VrMcXQ4jq9&An?BtaFaVFgI`HY^EWL`iihQe;Tinsr#1WdlGftWSvB_Y z-_vnfRCTZSL+tFf?%dszd-6cOjX#)KTqpIk8YYw1+&VX=OmFH*dQs%FQRn`1qwA#5 z`NSp^S&oo5uL_-++0aaNR@vOx4al}^k2;6*dB6XptBy|wi>{gvPI_H6=noc)wtVpD z@zb->$MQ;>FZRhvV4bpd&+CnRMP=i?KE)GV8vPz)oVQPxpmarJlp3rw)o!g@V)YGi ztE_VRj8&1dn6F(Mf5nT3e~aH5wrd>L*tS6^p#n^gC_`;RHSZ!zr1&3NCW~gUTM_Vc zK_1-dDj_)#2n4o~0Iv@U&Kh}boZ6)Wg*^g5Tj;iiI)5^7j`A9LZJc5RCR{4ir3!z< z5H214%Ev`s8>cRvgg<-;e`n!OD8k+y*H<>2MC3G-fj}UzN?_MDJG}qD`1ARHH7T?L zfk0rZ2#D5cd^*G{`Mq`H<#?}E@ON-Fj%%FS6cm0twiVur58>7@rnmx)yf#kJ0}CGl M7DFfkfqzQi8kGOR@Bjb+ diff --git a/test/examples/.DS_Store b/test/examples/.DS_Store deleted file mode 100644 index 0c63b13f2fe9cae5a682169f7d851bde0585b08c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHM&u$Vy82^T1SyCH0*u+bdO^k_$s`QU-h!>=IF!5ld(SsUf%L;^Lhb&NPnkJm} z4LtY?UVQ+cz(n7|2k@l7Z)PE|3!z$LO*_-fd^@w>Z)fK>znSef5RoYKs_R5H5n0G= zGnY|JNqnDkEG5F0RagN$J@n+h<4FhgOw8Lf7zPXjh5^HXVZbo(KQMrAHYaOITT>ba z3E3XFMnDS%eXa2m=pcD|ZrkZB1zyFbu>Q;MhG$4*nz^M&kGTxOe-f zN(y*Ic}eofr3(2}rhTA%lodK4H-dhT#kqQNwA1gj!?S}=PTOmAy4mbEkyuDxT1;6f zYsq?9s>^<(DK#PkIa9 zpCg~~qR#yr${~Bu8p&V_|cBG#lv3>%oO)&ieRoxAlAC-0e0b_U4^$p$i%}jq3)l&liu*SGk0Vo21ft|3hgXSBJ z=BcMzMvd$tGUNjs!vs7Cp?lv?dFuhKfL1^&pcT*xXazPw0o=2x8Q3nJO`uq~p9v?ud1T zbBU4;Owxg=D>GH0FmZL{nZg}dU81&H0j)q<0jk~e&;}nk+DQG*+pf=DoTVSs9qc#G zM8hM19Qtwy(6-=|s{NSvyM(u)yhrHmAuEjgv#SYzI{OgMAJUtIl=tf&d%Kfxpzi#= zJMg`5R4#vFnXT;hrJRv7c8q8C5uezj)@U3yTEi#w=^^L7yEtySkG$^0DeT?l!Kmd0 z-Ju|Ooi4gOee4AtK56iA&$a$UBANbXv8lCG+4`ZB{a;)_%EU)~biIS>CvO z?dI(V&avMQ_$yoiHl|V;?8?teODjxhaB2?&p9ejnVK<;7-m|1Ejws4; q#N{7`cx<98aq0@^5^)6EUw;vB{%7!&d$QjD<4=lu{}&LZhaa-3!n@+bRdJA)_EfC?Wee~pFO#_ z_wXr+v%Fsa5T%9k;?lBQmMikwzt?>~5At5t3c8onJJUJ|M|KdN$DMw=x^}43Jc!dy z*CfPI2Sctd;xy9zmhPodW^#QyAS<%cu5Jtl&Ar{4+G`AJYS7%>si{W2-W(1qa(#1q z|Fr#(Jf`}^%nStn$3|8ij^GuI@w}h?Zkp)y4t=BeQ5+*Pzzi@0e}MtFcgdB%@Ui@j z%m6bmR|aT*P^g5S!@{E3I3Ds{XhQs{y&|>J!XIz_*V>w z@{xbk!YR4hIx{({wF>nHm4xC7i{lhDOew}#D#aV9M$oUwK=d3I7SV&k2LVF^H_X6X G8TbOms$y{f From ac46ee1d9a3f51496b202f17117dbff74e1a2337 Mon Sep 17 00:00:00 2001 From: Jonas Siedentop Date: Wed, 31 Jan 2024 16:56:34 +0100 Subject: [PATCH 72/72] Entfernt .DS_Store --- test/.DS_Store | Bin 6148 -> 0 bytes test/examples/booleans/.DS_Store | Bin 8196 -> 0 bytes test/examples/booleans/disjoint/.DS_Store | Bin 6148 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/.DS_Store delete mode 100644 test/examples/booleans/.DS_Store delete mode 100644 test/examples/booleans/disjoint/.DS_Store diff --git a/test/.DS_Store b/test/.DS_Store deleted file mode 100644 index 8dca1b0c6041d6f51c12453d5fe1b56c21e4e4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~O=}ZD7{{M!qn)$}IVkiZ40sJSZSWAhtg#-vc1t~|#NFl5p16K8oKMkF#&sj_=_? zVXu)>LYk_VrMcXQ4jq9&An?BtaFaVFgI`HY^EWL`iihQe;Tinsr#1WdlGftWSvB_Y z-_vnfRCTZSL+tFf?%dszd-6cOjX#)KTqpIk8YYw1+&VX=OmFH*dQs%FQRn`1qwA#5 z`NSp^S&oo5uL_-++0aaNR@vOx4al}^k2;6*dB6XptBy|wi>{gvPI_H6=noc)wtVpD z@zb->$MQ;>FZRhvV4bpd&+CnRMP=i?KE)GV8vPz)oVQPxpmarJlp3rw)o!g@V)YGi ztE_VRj8&1dn6F(Mf5nT3e~aH5wrd>L*tS6^p#n^gC_`;RHSZ!zr1&3NCW~gUTM_Vc zK_1-dDj_)#2n4o~0Iv@U&Kh}boZ6)Wg*^g5Tj;iiI)5^7j`A9LZJc5RCR{4ir3!z< z5H214%Ev`s8>cRvgg<-;e`n!OD8k+y*H<>2MC3G-fj}UzN?_MDJG}qD`1ARHH7T?L zfk0rZ2#D5cd^*G{`Mq`H<#?}E@ON-Fj%%FS6cm0twiVur58>7@rnmx)yf#kJ0}CGl M7DFfkfqzQi8kGOR@Bjb+ diff --git a/test/examples/booleans/.DS_Store b/test/examples/booleans/.DS_Store deleted file mode 100644 index f22ab7845a312896a98a008477a7717105e622ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHM&5ja55Uyrf8M4`g!y37mOybFeC@k!ni5EmXcy){()Qk)ecHCi_WnhURB%Jjf zd;l+Ay?FB(d=@>eRoxAlAC-0e0b_U4^$p$i%}jq3)l&liu*SGk0Vo21ft|3hgXSBJ z=BcMzMvd$tGUNjs!vs7Cp?lv?dFuhKfL1^&pcT*xXazPw0o=2x8Q3nJO`uq~p9v?ud1T zbBU4;Owxg=D>GH0FmZL{nZg}dU81&H0j)q<0jk~e&;}nk+DQG*+pf=DoTVSs9qc#G zM8hM19Qtwy(6-=|s{NSvyM(u)yhrHmAuEjgv#SYzI{OgMAJUtIl=tf&d%Kfxpzi#= zJMg`5R4#vFnXT;hrJRv7c8q8C5uezj)@U3yTEi#w=^^L7yEtySkG$^0DeT?l!Kmd0 z-Ju|Ooi4gOee4AtK56iA&$a$UBANbXv8lCG+4`ZB{a;)_%EU)~biIS>CvO z?dI(V&avMQ_$yoiHl|V;?8?teODjxhaB2?&p9ejnVK<;7-m|1Ejws4; q#N{7`cx<98aq0@^5^)6EUw;vB{%7!&d$QjD<4=lu{}&LZhaa-3!n@+bRdJA)_EfC?Wee~pFO#_ z_wXr+v%Fsa5T%9k;?lBQmMikwzt?>~5At5t3c8onJJUJ|M|KdN$DMw=x^}43Jc!dy z*CfPI2Sctd;xy9zmhPodW^#QyAS<%cu5Jtl&Ar{4+G`AJYS7%>si{W2-W(1qa(#1q z|Fr#(Jf`}^%nStn$3|8ij^GuI@w}h?Zkp)y4t=BeQ5+*Pzzi@0e}MtFcgdB%@Ui@j z%m6bmR|aT*P^g5S!@{E3I3Ds{XhQs{y&|>J!XIz_*V>w z@{xbk!YR4hIx{({wF>nHm4xC7i{lhDOew}#D#aV9M$oUwK=d3I7SV&k2LVF^H_X6X G8TbOms$y{f