diff options
43 files changed, 17074 insertions, 263 deletions
diff --git a/.gitmodules b/.gitmodules index 6a4b1d5162..d84cfecbc2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -17,3 +17,7 @@ [submodule "platform/ios/vendor/SMCalloutView"] path = platform/ios/vendor/SMCalloutView url = https://github.com/nfarina/calloutview.git + +[submodule "src/mbgl/util/geojsonvt"] + path = src/mbgl/util/geojsonvt + url = https://github.com/mapbox/geojson-vt-cpp @@ -39,6 +39,9 @@ else SMCalloutView: endif +geojsonvt: + git submodule update --init src/mbgl/util/geojsonvt + KIF: git submodule update --init test/ios/KIF @@ -46,11 +49,11 @@ KIF: #### Build files ############################################################### .PRECIOUS: Makefile/project -Makefile/project: config/$(HOST).gypi styles/styles SMCalloutView +Makefile/project: config/$(HOST).gypi styles/styles SMCalloutView geojsonvt deps/run_gyp gyp/$(HOST).gyp $(CONFIG_$(HOST)) $(LIBS_$(HOST)) --generator-output=./build/$(HOST) -f make .PRECIOUS: Xcode/project -Xcode/project: config/$(HOST).gypi styles/styles SMCalloutView +Xcode/project: config/$(HOST).gypi styles/styles SMCalloutView geojsonvt deps/run_gyp gyp/$(HOST).gyp $(CONFIG_$(HOST)) $(LIBS_$(HOST)) --generator-output=./build/$(HOST) -f xcode @@ -115,7 +118,7 @@ xproj: xosx-proj #### iOS application builds #################################################### .PRECIOUS: Xcode/ios -Xcode/ios: gyp/ios.gyp config/ios.gypi styles/styles SMCalloutView +Xcode/ios: gyp/ios.gyp config/ios.gypi styles/styles SMCalloutView geojsonvt deps/run_gyp gyp/ios.gyp $(CONFIG_ios) $(LIBS_ios) --generator-output=./build/ios -f xcode .PHONY: ios-proj ios isim ipackage @@ -172,7 +175,7 @@ run-xlinux: xlinux .PRECIOUS: Makefile/android-% Makefile/android-%: CMD = deps/run_gyp android/mapboxgl-app.gyp $(CONFIG_android-$*) $(LIBS_android) --generator-output=./build/android-$* -f make-android -Makefile/android-%: config/android-%.gypi styles/styles +Makefile/android-%: config/android-%.gypi styles/styles geojsonvt @echo $(CMD) @$(ENV_android-$*) $(CMD) diff --git a/gyp/platform-ios.gypi b/gyp/platform-ios.gypi index 0ec67786a7..484135a2ec 100644 --- a/gyp/platform-ios.gypi +++ b/gyp/platform-ios.gypi @@ -36,6 +36,18 @@ '../platform/ios/MGLUserLocationAnnotationView.m', '../include/mbgl/ios/MGLTypes.h', '../platform/ios/MGLTypes.m', + '../include/mbgl/ios/MGLMultiPoint.h', + '../platform/ios/MGLMultiPoint_Private.h', + '../platform/ios/MGLMultiPoint.mm', + '../include/mbgl/ios/MGLOverlay.h', + '../include/mbgl/ios/MGLPointAnnotation.h', + '../platform/ios/MGLPointAnnotation.m', + '../include/mbgl/ios/MGLPolyline.h', + '../platform/ios/MGLPolyline.m', + '../include/mbgl/ios/MGLPolygon.h', + '../platform/ios/MGLPolygon.m', + '../include/mbgl/ios/MGLShape.h', + '../platform/ios/MGLShape.m', '../platform/ios/NSBundle+MGLAdditions.h', '../platform/ios/NSBundle+MGLAdditions.m', '../platform/ios/NSException+MGLAdditions.h', diff --git a/include/mbgl/ios/MGLAnnotation.h b/include/mbgl/ios/MGLAnnotation.h index 0d45f15e44..70460f6492 100644 --- a/include/mbgl/ios/MGLAnnotation.h +++ b/include/mbgl/ios/MGLAnnotation.h @@ -4,7 +4,7 @@ NS_ASSUME_NONNULL_BEGIN -/** The MGLAnnotation protocol is used to provide annotation-related information to a map view. To use this protocol, you adopt it in any custom objects that store or represent annotation data. Each object then serves as the source of information about a single map annotation and provides critical information, such as the annotation’s location on the map. Annotation objects do not provide the visual representation of the annotation but typically coordinate (in conjunction with the map view’s delegate) the creation of an appropriate objects to handle the display. +/** The `MGLAnnotation` protocol is used to provide annotation-related information to a map view. To use this protocol, you adopt it in any custom objects that store or represent annotation data. Each object then serves as the source of information about a single map annotation and provides critical information, such as the annotation’s location on the map. Annotation objects do not provide the visual representation of the annotation but typically coordinate (in conjunction with the map view’s delegate) the creation of an appropriate objects to handle the display. * * An object that adopts this protocol must implement the `coordinate` property. The other methods of this protocol are optional. */ @protocol MGLAnnotation <NSObject> diff --git a/include/mbgl/ios/MGLMapView.h b/include/mbgl/ios/MGLMapView.h index 29cb682713..f59aa7269d 100644 --- a/include/mbgl/ios/MGLMapView.h +++ b/include/mbgl/ios/MGLMapView.h @@ -6,6 +6,9 @@ NS_ASSUME_NONNULL_BEGIN @class MGLUserLocation; +@class MGLPolyline; +@class MGLPolygon; +@class MGLShape; @protocol MGLMapViewDelegate; @protocol MGLAnnotation; @@ -304,6 +307,30 @@ IB_DESIGNABLE * @return The marker symbol to display for the specified annotation or `nil` if you want to display the default symbol. */ - (nullable NSString *)mapView:(MGLMapView *)mapView symbolNameForAnnotation:(id <MGLAnnotation>)annotation; +/** Returns the alpha value to use when rendering a shape annotation. Defaults to `1.0`. +* @param mapView The map view rendering the shape annotation. +* @param annotation The annotation being rendered. +* @return An alpha value between `0` and `1.0`. */ +- (CGFloat)mapView:(MGLMapView *)mapView alphaForShapeAnnotation:(MGLShape *)annotation; + +/** Returns the stroke color to use when rendering a shape annotation. Defaults to black. +* @param mapView The map view rendering the shape annotation. +* @param annotation The annotation being rendered. +* @return A color to use for the shape outline. */ +- (UIColor *)mapView:(MGLMapView *)mapView strokeColorForShapeAnnotation:(MGLShape *)annotation; + +/** Returns the fill color to use when rendering a polygon annotation. Defaults to blue. +* @param mapView The map view rendering the polygon annotation. +* @param annotation The annotation being rendered. +* @return A color to use for the polygon interior. */ +- (UIColor *)mapView:(MGLMapView *)mapView fillColorForPolygonAnnotation:(MGLPolygon *)annotation; + +/** Returns the line width to use when rendering a polyline annotation. Defaults to `3.0`. +* @param mapView The map view rendering the polygon annotation. +* @param annotation The annotation being rendered. +* @return A line width for the polyline. */ +- (CGFloat)mapView:(MGLMapView *)mapView lineWidthForPolylineAnnotation:(MGLPolyline *)annotation; + /** Returns a Boolean value indicating whether the annotation is able to display extra information in a callout bubble. * * If the value returned is `YES`, a standard callout bubble is shown when the user taps a selected annotation. The callout uses the title and subtitle text from the associated annotation object. If there is no title text, though, the annotation will not show a callout. The callout also displays any custom callout views returned by the delegate for the left and right callout accessory views. @@ -371,6 +398,8 @@ IB_DESIGNABLE #pragma mark - Tracking the User Location +/** @name Tracking the User Location */ + /** Tells the delegate that the map view will begin tracking the user’s location. * * This method is called when the value of the showsUserLocation property changes to `YES`. diff --git a/include/mbgl/ios/MGLMultiPoint.h b/include/mbgl/ios/MGLMultiPoint.h new file mode 100644 index 0000000000..8da956b539 --- /dev/null +++ b/include/mbgl/ios/MGLMultiPoint.h @@ -0,0 +1,17 @@ +#import <Foundation/Foundation.h> +#import <CoreLocation/CoreLocation.h> + +#import "MGLShape.h" + +/** The `MGLMultiPoint` class is an abstract superclass used to define shapes composed of multiple points. You should not create instances of this class directly. Instead, you should create instances of the `MGLPolyline` or `MGLPolygon` classes. However, you can use the method and properties of this class to access information about the specific points associated with the line or polygon. */ +@interface MGLMultiPoint : MGLShape + +/** The number of points associated with the shape. (read-only) */ +@property (nonatomic, readonly) NSUInteger pointCount; + +/** Retrieves one or more coordinates associated with the shape. +* @param coords On input, you must provide a C array of structures large enough to hold the desired number of coordinates. On output, this structure contains the requested coordinate data. +* @param range The range of points you want. The `location` field indicates the first point you are requesting, with `0` being the first point, `1` being the second point, and so on. The `length` field indicates the number of points you want. The array in _`coords`_ must be large enough to accommodate the number of requested coordinates. */ +- (void)getCoordinates:(CLLocationCoordinate2D *)coords range:(NSRange)range; + +@end diff --git a/include/mbgl/ios/MGLOverlay.h b/include/mbgl/ios/MGLOverlay.h new file mode 100644 index 0000000000..686aefc2be --- /dev/null +++ b/include/mbgl/ios/MGLOverlay.h @@ -0,0 +1,31 @@ +#import <Foundation/Foundation.h> +#import <CoreLocation/CoreLocation.h> + +#import "MGLAnnotation.h" +#import "MGLTypes.h" + +/** The `MGLOverlay` protocol defines a specific type of annotation that represents both a point and an area on a map. Overlay objects are essentially data objects that contain the geographic data needed to represent the map area. For example, overlays can take the form of common shapes such as rectangles and circles. They can also describe polygons and other complex shapes. +* +* You use overlays to layer more sophisticated content on top of a map view. For example, you could use an overlay to show the boundaries of a national park or trace a bus route along city streets. Mapbox GL defines several concrete classes that conform to this protocol and define standard shapes. +* +* Because overlays are also annotations, they have similar usage pattern to annotations. When added to a map view using the `addOverlay:` method, that view detects whenever the overlay’s defined region intersects the visible portion of the map. At that point, the map view asks its delegate to provide a special overlay view to draw the visual representation of the overlay. If you add an overlay to a map view as an annotation instead, it is treated as an annotation with a single point. */ +@protocol MGLOverlay <MGLAnnotation> + +/* The approximate center point of the overlay area. (required) (read-only) +* +* This point is typically set to the center point of the map’s bounding rectangle. It is used as the anchor point for any callouts displayed for the annotation. */ +@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; + +/** The cooordinate rectangle that encompasses the overlay. (required) (read-only) +* +* This property contains the smallest rectangle that completely encompasses the overlay. Implementers of this protocol must set this area when implementing their overlay class, and after setting it, you must not change it. */ +@property (nonatomic, readonly) MGLCoordinateBounds overlayBounds; + +/** Returns a Boolean indicating whether the specified rectangle intersects the receiver’s shape. +* +* You can implement this method to provide more specific bounds checking for an overlay. If you do not implement it, the bounding rectangle is used to detect intersections. +* @param overlayBounds The rectangle to intersect with the receiver’s area. +* @return `YES` if any part of the map rectangle intersects the receiver’s shape or `NO` if it does not. */ +- (BOOL)intersectsOverlayBounds:(MGLCoordinateBounds)overlayBounds; + +@end diff --git a/include/mbgl/ios/MGLPointAnnotation.h b/include/mbgl/ios/MGLPointAnnotation.h new file mode 100644 index 0000000000..d3d1a8f0e9 --- /dev/null +++ b/include/mbgl/ios/MGLPointAnnotation.h @@ -0,0 +1,12 @@ +#import <Foundation/Foundation.h> +#import <CoreLocation/CoreLocation.h> + +#import "MGLShape.h" + +/** The `MGLPointAnnotation` class defines a concrete annotation object located at a specified point. You can use this class, rather than define your own, in situations where all you want to do is associate a point on the map with a title. */ +@interface MGLPointAnnotation : MGLShape + +/** The coordinate point of the annotation, specified as a latitude and longitude. */ +@property (nonatomic, assign) CLLocationCoordinate2D coordinate; + +@end diff --git a/include/mbgl/ios/MGLPolygon.h b/include/mbgl/ios/MGLPolygon.h new file mode 100644 index 0000000000..bd6907dbe7 --- /dev/null +++ b/include/mbgl/ios/MGLPolygon.h @@ -0,0 +1,17 @@ +#import <Foundation/Foundation.h> +#import <CoreLocation/CoreLocation.h> + +#import "MGLMultiPoint.h" +#import "MGLOverlay.h" + +/** The `MGLPolygon` class represents a shape consisting of one or more points that define a closed polygon. The points are connected end-to-end in the order they are provided. The first and last points are connected to each other to create the closed shape. */ +@interface MGLPolygon : MGLMultiPoint <MGLOverlay> + +/** Creates and returns an `MGLPolygon` object from the specified set of coordinates. +* @param coords The array of coordinates defining the shape. The data in this array is copied to the new object. +* @param count The number of items in the _`coords`_ array. +* @return A new polygon object. */ ++ (instancetype)polygonWithCoordinates:(CLLocationCoordinate2D *)coords + count:(NSUInteger)count; + +@end diff --git a/include/mbgl/ios/MGLPolyline.h b/include/mbgl/ios/MGLPolyline.h new file mode 100644 index 0000000000..a49fae07c6 --- /dev/null +++ b/include/mbgl/ios/MGLPolyline.h @@ -0,0 +1,17 @@ +#import <Foundation/Foundation.h> +#import <CoreLocation/CoreLocation.h> + +#import "MGLMultiPoint.h" +#import "MGLOverlay.h" + +/** The `MGLPolyline` class represents a shape consisting of one or more points that define connecting line segments. The points are connected end-to-end in the order they are provided. The first and last points are not connected to each other. */ +@interface MGLPolyline : MGLMultiPoint <MGLOverlay> + +/** Creates and returns an `MGLPolygon` object from the specified set of coordinates. +* @param coords The array of coordinates defining the shape. The data in this array is copied to the new object. +* @param count The number of items in the _`coords`_ array. +* @return A new polyline object. */ ++ (instancetype)polylineWithCoordinates:(CLLocationCoordinate2D *)coords + count:(NSUInteger)count; + +@end diff --git a/include/mbgl/ios/MGLShape.h b/include/mbgl/ios/MGLShape.h new file mode 100644 index 0000000000..6693d2b302 --- /dev/null +++ b/include/mbgl/ios/MGLShape.h @@ -0,0 +1,14 @@ +#import <Foundation/Foundation.h> + +#import "MGLAnnotation.h" + +/** The `MGLShape` class is an abstract class that defines the basic properties for all shape-based annotation objects. This class must be subclassed and cannot be used as is. Subclasses are responsible for defining the geometry of the shape and providing an appropriate value for the coordinate property inherited from the `MGLAnnotation` protocol. */ +@interface MGLShape : NSObject <MGLAnnotation> + +/** The title of the shape annotation. The default value of this property is `nil`. */ +@property (nonatomic, copy) NSString *title; + +/** The subtitle of the shape annotation. The default value of this property is `nil`. */ +@property (nonatomic, copy) NSString *subtitle; + +@end diff --git a/include/mbgl/ios/MGLTypes.h b/include/mbgl/ios/MGLTypes.h index 6b56b47add..3d3892610a 100644 --- a/include/mbgl/ios/MGLTypes.h +++ b/include/mbgl/ios/MGLTypes.h @@ -1,4 +1,5 @@ #import <Foundation/Foundation.h> +#import <CoreLocation/CoreLocation.h> #if !__has_feature(nullability) #define NS_ASSUME_NONNULL_BEGIN @@ -13,8 +14,7 @@ NS_ASSUME_NONNULL_BEGIN extern NSString * const MGLErrorDomain; /** The mode used to track the user location on the map. */ -typedef NS_ENUM(NSUInteger, MGLUserTrackingMode) -{ +typedef NS_ENUM(NSUInteger, MGLUserTrackingMode) { /** The map does not follow the user location. */ MGLUserTrackingModeNone = 0, /** The map follows the user location. */ @@ -23,4 +23,9 @@ typedef NS_ENUM(NSUInteger, MGLUserTrackingMode) MGLUserTrackingModeFollowWithHeading }; +typedef struct { + CLLocationCoordinate2D sw; + CLLocationCoordinate2D ne; +} MGLCoordinateBounds; + NS_ASSUME_NONNULL_END diff --git a/include/mbgl/ios/MapboxGL.h b/include/mbgl/ios/MapboxGL.h index a6d23d3280..d3b032b9c9 100644 --- a/include/mbgl/ios/MapboxGL.h +++ b/include/mbgl/ios/MapboxGL.h @@ -1,5 +1,11 @@ #import "MGLAccountManager.h" #import "MGLAnnotation.h" #import "MGLMapView.h" +#import "MGLMultiPoint.h" +#import "MGLOverlay.h" +#import "MGLPointAnnotation.h" +#import "MGLPolygon.h" +#import "MGLPolyline.h" +#import "MGLShape.h" #import "MGLTypes.h" #import "MGLUserLocation.h" diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 5535dbcc91..e7474005e4 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -4,6 +4,7 @@ #include <mbgl/util/chrono.hpp> #include <mbgl/map/update.hpp> #include <mbgl/map/mode.hpp> +#include <mbgl/style/style_properties.hpp> #include <mbgl/util/geo.hpp> #include <mbgl/util/noncopyable.hpp> #include <mbgl/util/vec.hpp> @@ -13,6 +14,7 @@ #include <functional> #include <vector> #include <memory> +#include <unordered_map> namespace mbgl { @@ -26,6 +28,16 @@ namespace util { template <class T> class Thread; } +enum class AnnotationType : uint8_t { + Any = 0, + Point = 1 << 0, + Shape = 1 << 1, +}; + +using AnnotationIDs = std::vector<uint32_t>; +using AnnotationSegment = std::vector<LatLng>; +using AnnotationSegments = std::vector<AnnotationSegment>; + class Map : private util::noncopyable { friend class View; @@ -112,12 +124,16 @@ public: void setDefaultPointAnnotationSymbol(const std::string&); double getTopOffsetPixelsForAnnotationSymbol(const std::string&); uint32_t addPointAnnotation(const LatLng&, const std::string& symbol); - std::vector<uint32_t> addPointAnnotations(const std::vector<LatLng>&, - const std::vector<std::string>& symbols); + AnnotationIDs addPointAnnotations(const AnnotationSegment&, + const std::vector<std::string>& symbols); + uint32_t addShapeAnnotation(const AnnotationSegments&, + const StyleProperties&); + AnnotationIDs addShapeAnnotations(const std::vector<AnnotationSegments>&, + const std::vector<StyleProperties>&); void removeAnnotation(uint32_t); - void removeAnnotations(const std::vector<uint32_t>&); - std::vector<uint32_t> getAnnotationsInBounds(const LatLngBounds&); - LatLngBounds getBoundsForAnnotations(const std::vector<uint32_t>&); + void removeAnnotations(const AnnotationIDs&); + AnnotationIDs getAnnotationsInBounds(const LatLngBounds&, const AnnotationType& = AnnotationType::Any); + LatLngBounds getBoundsForAnnotations(const AnnotationIDs&); // Memory void setSourceTileCacheSize(size_t); diff --git a/src/mbgl/style/style_properties.hpp b/include/mbgl/style/style_properties.hpp index 8e8619fb99..9ab528586f 100644 --- a/src/mbgl/style/style_properties.hpp +++ b/include/mbgl/style/style_properties.hpp @@ -3,7 +3,6 @@ #include <mbgl/util/variant.hpp> #include <mbgl/style/types.hpp> -#include <mbgl/style/piecewisefunction_properties.hpp> #include <array> #include <string> diff --git a/src/mbgl/style/types.hpp b/include/mbgl/style/types.hpp index f6ffcd6865..f6ffcd6865 100644 --- a/src/mbgl/style/types.hpp +++ b/include/mbgl/style/types.hpp diff --git a/include/mbgl/util/geo.hpp b/include/mbgl/util/geo.hpp index ff13726803..1f073ded8f 100644 --- a/include/mbgl/util/geo.hpp +++ b/include/mbgl/util/geo.hpp @@ -41,12 +41,24 @@ struct LatLngBounds { if (point.longitude > ne.longitude) ne.longitude = point.longitude; } - inline bool contains(const LatLng& point) { + inline void extend(const LatLngBounds& bounds) { + extend(bounds.sw); + extend(bounds.ne); + } + + inline bool contains(const LatLng& point) const { return (point.latitude >= sw.latitude && point.latitude <= ne.latitude && point.longitude >= sw.longitude && point.longitude <= ne.longitude); } + + inline bool intersects(const LatLngBounds area) const { + return (area.ne.latitude > sw.latitude && + area.sw.latitude < ne.latitude && + area.ne.longitude > sw.longitude && + area.sw.longitude < ne.longitude); + } }; } diff --git a/ios/app/MBXAnnotation.h b/ios/app/MBXAnnotation.h deleted file mode 100644 index 63c5f9425f..0000000000 --- a/ios/app/MBXAnnotation.h +++ /dev/null @@ -1,12 +0,0 @@ -#import <UIKit/UIKit.h> -#import <CoreLocation/CoreLocation.h> - -#import <mbgl/ios/MGLAnnotation.h> - -@interface MBXAnnotation : NSObject <MGLAnnotation> - -+ (instancetype)annotationWithLocation:(CLLocationCoordinate2D)coordinate title:(NSString *)title subtitle:(NSString *)subtitle; - -- (instancetype)initWithLocation:(CLLocationCoordinate2D)coordinate title:(NSString *)title subtitle:(NSString *)subtitle; - -@end diff --git a/ios/app/MBXAnnotation.m b/ios/app/MBXAnnotation.m deleted file mode 100644 index f942a8572d..0000000000 --- a/ios/app/MBXAnnotation.m +++ /dev/null @@ -1,30 +0,0 @@ -#import "MBXAnnotation.h" - -@interface MBXAnnotation () - -@property (nonatomic) CLLocationCoordinate2D coordinate; -@property (nonatomic) NSString *title; -@property (nonatomic) NSString *subtitle; - -@end - -@implementation MBXAnnotation - -+ (instancetype)annotationWithLocation:(CLLocationCoordinate2D)coordinate title:(NSString *)title subtitle:(NSString *)subtitle -{ - return [[self alloc] initWithLocation:coordinate title:title subtitle:subtitle]; -} - -- (instancetype)initWithLocation:(CLLocationCoordinate2D)coordinate title:(NSString *)title subtitle:(NSString *)subtitle -{ - if (self = [super init]) - { - _coordinate = coordinate; - _title = title; - _subtitle = subtitle; - } - - return self; -} - -@end diff --git a/ios/app/MBXViewController.mm b/ios/app/MBXViewController.mm index 9ccda7ac6d..00245828ed 100644 --- a/ios/app/MBXViewController.mm +++ b/ios/app/MBXViewController.mm @@ -6,8 +6,6 @@ #import <CoreLocation/CoreLocation.h> -#import "MBXAnnotation.h" - static UIColor *const kTintColor = [UIColor colorWithRed:0.120 green:0.550 blue:0.670 alpha:1.000]; static NSArray *const kStyleNames = @[ @@ -130,7 +128,8 @@ mbgl::Settings_NSUserDefaults *settings = nullptr; @"Add 100 Points", @"Add 1,000 Points", @"Add 10,000 Points", - @"Remove Points", + @"Add Test Shapes", + @"Remove Annotations", nil]; [sheet showFromBarButtonItem:self.navigationItem.leftBarButtonItem animated:YES]; @@ -168,6 +167,73 @@ mbgl::Settings_NSUserDefaults *settings = nullptr; } else if (buttonIndex == actionSheet.firstOtherButtonIndex + 7) { + // PNW triangle + // + CLLocationCoordinate2D triangleCoordinates[3] = + { + CLLocationCoordinate2DMake(44, -122), + CLLocationCoordinate2DMake(46, -122), + CLLocationCoordinate2DMake(46, -121) + }; + + MGLPolygon *triangle = [MGLPolygon polygonWithCoordinates:triangleCoordinates count:3]; + + [self.mapView addAnnotation:triangle]; + + // Orcas Island hike + // + NSDictionary *hike = [NSJSONSerialization JSONObjectWithData: + [NSData dataWithContentsOfFile: + [[NSBundle mainBundle] pathForResource:@"polyline" ofType:@"geojson"]] + options:0 + error:nil]; + + NSArray *hikeCoordinatePairs = hike[@"features"][0][@"geometry"][@"coordinates"]; + + CLLocationCoordinate2D *polylineCoordinates = (CLLocationCoordinate2D *)malloc([hikeCoordinatePairs count] * sizeof(CLLocationCoordinate2D)); + + for (NSUInteger i = 0; i < [hikeCoordinatePairs count]; i++) + { + polylineCoordinates[i] = CLLocationCoordinate2DMake([hikeCoordinatePairs[i][1] doubleValue], [hikeCoordinatePairs[i][0] doubleValue]); + } + + MGLPolyline *polyline = [MGLPolyline polylineWithCoordinates:polylineCoordinates + count:[hikeCoordinatePairs count]]; + + [self.mapView addAnnotation:polyline]; + + free(polylineCoordinates); + + // PA/NJ/DE polys + // + NSDictionary *threestates = [NSJSONSerialization JSONObjectWithData: + [NSData dataWithContentsOfFile: + [[NSBundle mainBundle] pathForResource:@"threestates" ofType:@"geojson"]] + options:0 + error:nil]; + + for (NSDictionary *feature in threestates[@"features"]) + { + NSArray *stateCoordinatePairs = feature[@"geometry"][@"coordinates"]; + + while ([stateCoordinatePairs count] == 1) stateCoordinatePairs = stateCoordinatePairs[0]; + + CLLocationCoordinate2D *polygonCoordinates = (CLLocationCoordinate2D *)malloc([stateCoordinatePairs count] * sizeof(CLLocationCoordinate2D)); + + for (NSUInteger i = 0; i < [stateCoordinatePairs count]; i++) + { + polygonCoordinates[i] = CLLocationCoordinate2DMake([stateCoordinatePairs[i][1] doubleValue], [stateCoordinatePairs[i][0] doubleValue]); + } + + MGLPolygon *polygon = [MGLPolygon polygonWithCoordinates:polygonCoordinates count:[stateCoordinatePairs count]]; + + [self.mapView addAnnotation:polygon]; + + free(polygonCoordinates); + } + } + else if (buttonIndex == actionSheet.firstOtherButtonIndex + 8) + { [self.mapView removeAnnotations:self.mapView.annotations]; } } @@ -178,7 +244,7 @@ mbgl::Settings_NSUserDefaults *settings = nullptr; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ { - NSData *featuresData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"features" ofType:@"geojson"]]; + NSData *featuresData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"points" ofType:@"geojson"]]; id features = [NSJSONSerialization JSONObjectWithData:featuresData options:0 @@ -194,9 +260,9 @@ mbgl::Settings_NSUserDefaults *settings = nullptr; [feature[@"geometry"][@"coordinates"][0] doubleValue]); NSString *title = feature[@"properties"][@"NAME"]; - MBXAnnotation *annotation = [MBXAnnotation annotationWithLocation:coordinate - title:title - subtitle:nil]; + MGLPointAnnotation *annotation = [MGLPointAnnotation new]; + annotation.coordinate = coordinate; + annotation.title = title; [annotations addObject:annotation]; @@ -279,6 +345,21 @@ mbgl::Settings_NSUserDefaults *settings = nullptr; return YES; } +- (CGFloat)mapView:(__unused MGLMapView *)mapView alphaForShapeAnnotation:(MGLShape *)annotation +{ + return ([annotation isKindOfClass:[MGLPolygon class]] ? 0.5 : 1.0); +} + +- (UIColor *)mapView:(__unused MGLMapView *)mapView strokeColorForShapeAnnotation:(MGLShape *)annotation +{ + return ([annotation isKindOfClass:[MGLPolyline class]] ? [UIColor purpleColor] : [UIColor blackColor]); +} + +- (UIColor *)mapView:(__unused MGLMapView *)mapView fillColorForPolygonAnnotation:(__unused MGLPolygon *)annotation +{ + return (annotation.pointCount > 3 ? [UIColor greenColor] : [UIColor redColor]); +} + - (void)mapView:(__unused MGLMapView *)mapView didChangeUserTrackingMode:(MGLUserTrackingMode)mode animated:(__unused BOOL)animated { UIImage *newButtonImage; diff --git a/ios/app/mapboxgl-app.gypi b/ios/app/mapboxgl-app.gypi index 73b66dff12..0a39c7f7d3 100644 --- a/ios/app/mapboxgl-app.gypi +++ b/ios/app/mapboxgl-app.gypi @@ -10,7 +10,9 @@ 'mac_bundle': 1, 'mac_bundle_resources': [ '<!@(find ../ios/app/img -type f)', - './features.geojson', + './points.geojson', + './polyline.geojson', + './threestates.geojson', './Settings.bundle/' ], @@ -29,8 +31,6 @@ './MBXAppDelegate.m', './MBXViewController.h', './MBXViewController.mm', - './MBXAnnotation.h', - './MBXAnnotation.m', '../../platform/darwin/settings_nsuserdefaults.mm', ], diff --git a/ios/app/features.geojson b/ios/app/points.geojson index a34f53bd36..a34f53bd36 100644 --- a/ios/app/features.geojson +++ b/ios/app/points.geojson diff --git a/ios/app/polyline.geojson b/ios/app/polyline.geojson new file mode 100644 index 0000000000..c104969544 --- /dev/null +++ b/ios/app/polyline.geojson @@ -0,0 +1,14187 @@ +{ + "features": [ + { + "geometry": { + "coordinates": [ + [ + -122.854957, + 48.65588, + 109.7 + ], + [ + -122.854644, + 48.656217, + 112 + ], + [ + -122.855082, + 48.656155, + 111.1 + ], + [ + -122.855053, + 48.656188, + 111.4 + ], + [ + -122.854857, + 48.656198, + 111.6 + ], + [ + -122.854893, + 48.65629, + 111.8 + ], + [ + -122.855026, + 48.656349, + 111.9 + ], + [ + -122.855035, + 48.656411, + 112.1 + ], + [ + -122.855044, + 48.656437, + 112.1 + ], + [ + -122.855006, + 48.656472, + 112.6 + ], + [ + -122.85496, + 48.656508, + 112.8 + ], + [ + -122.854941, + 48.656534, + 112.9 + ], + [ + -122.854921, + 48.656575, + 113.5 + ], + [ + -122.854914, + 48.656603, + 114 + ], + [ + -122.854894, + 48.656628, + 114.5 + ], + [ + -122.854864, + 48.656659, + 114.8 + ], + [ + -122.854851, + 48.656687, + 115.2 + ], + [ + -122.854818, + 48.656718, + 115.5 + ], + [ + -122.8548, + 48.656757, + 115.3 + ], + [ + -122.85479, + 48.656783, + 115.3 + ], + [ + -122.854761, + 48.65682, + 115.5 + ], + [ + -122.854771, + 48.656851, + 115.8 + ], + [ + -122.854781, + 48.656886, + 116 + ], + [ + -122.854793, + 48.656921, + 115.9 + ], + [ + -122.854785, + 48.656954, + 115.8 + ], + [ + -122.854756, + 48.656977, + 116 + ], + [ + -122.854729, + 48.657002, + 116.1 + ], + [ + -122.85476, + 48.657038, + 118.3 + ], + [ + -122.854757, + 48.657067, + 118.5 + ], + [ + -122.854744, + 48.657097, + 118.3 + ], + [ + -122.854728, + 48.657127, + 118.6 + ], + [ + -122.854678, + 48.657135, + 117.1 + ], + [ + -122.85466, + 48.657169, + 117.5 + ], + [ + -122.854659, + 48.657203, + 117.8 + ], + [ + -122.854645, + 48.65724, + 118.2 + ], + [ + -122.854624, + 48.657282, + 118.6 + ], + [ + -122.854608, + 48.657312, + 118.8 + ], + [ + -122.854615, + 48.65735, + 119.8 + ], + [ + -122.854626, + 48.657377, + 120.8 + ], + [ + -122.854614, + 48.65741, + 120.9 + ], + [ + -122.854655, + 48.657389, + 122 + ], + [ + -122.854702, + 48.657391, + 123 + ], + [ + -122.854656, + 48.65738, + 121.9 + ], + [ + -122.854625, + 48.657402, + 121.2 + ], + [ + -122.854599, + 48.657438, + 121 + ], + [ + -122.854575, + 48.657468, + 120.9 + ], + [ + -122.854586, + 48.6575, + 121.7 + ], + [ + -122.854573, + 48.657532, + 121.9 + ], + [ + -122.854553, + 48.657569, + 122.1 + ], + [ + -122.854549, + 48.657605, + 122.4 + ], + [ + -122.854553, + 48.657636, + 123.5 + ], + [ + -122.854566, + 48.657665, + 124.7 + ], + [ + -122.854564, + 48.657693, + 125.2 + ], + [ + -122.854574, + 48.65772, + 125.9 + ], + [ + -122.854596, + 48.657747, + 126.8 + ], + [ + -122.854619, + 48.657778, + 127.4 + ], + [ + -122.854629, + 48.657807, + 127.1 + ], + [ + -122.854644, + 48.657844, + 126.7 + ], + [ + -122.854705, + 48.657861, + 128.4 + ], + [ + -122.854746, + 48.657866, + 130.3 + ], + [ + -122.854782, + 48.657897, + 131.8 + ], + [ + -122.854748, + 48.657939, + 130.5 + ], + [ + -122.854719, + 48.657958, + 129.3 + ], + [ + -122.854663, + 48.657967, + 127.8 + ], + [ + -122.854614, + 48.657967, + 128.7 + ], + [ + -122.854561, + 48.657965, + 129.5 + ], + [ + -122.8545, + 48.657953, + 131 + ], + [ + -122.854442, + 48.657947, + 133.6 + ], + [ + -122.854399, + 48.657927, + 133.8 + ], + [ + -122.854351, + 48.657929, + 135.8 + ], + [ + -122.854319, + 48.657894, + 134.8 + ], + [ + -122.854311, + 48.657866, + 133.6 + ], + [ + -122.85436, + 48.657873, + 131.5 + ], + [ + -122.854398, + 48.657886, + 130.6 + ], + [ + -122.85445, + 48.657883, + 128.6 + ], + [ + -122.854501, + 48.657883, + 127.2 + ], + [ + -122.854549, + 48.657885, + 126.7 + ], + [ + -122.854596, + 48.657899, + 127 + ], + [ + -122.854612, + 48.657924, + 127.7 + ], + [ + -122.854566, + 48.657937, + 128.4 + ], + [ + -122.854518, + 48.657934, + 129.2 + ], + [ + -122.854459, + 48.657926, + 131.1 + ], + [ + -122.854414, + 48.657951, + 135.1 + ], + [ + -122.854391, + 48.657973, + 137.1 + ], + [ + -122.854357, + 48.657953, + 137.2 + ], + [ + -122.854336, + 48.657927, + 136.3 + ], + [ + -122.854322, + 48.657902, + 135.1 + ], + [ + -122.854295, + 48.657878, + 135.1 + ], + [ + -122.854265, + 48.657854, + 135.4 + ], + [ + -122.854233, + 48.657833, + 136 + ], + [ + -122.854211, + 48.657799, + 135.6 + ], + [ + -122.854204, + 48.657753, + 133.7 + ], + [ + -122.854204, + 48.657721, + 132.3 + ], + [ + -122.854213, + 48.657685, + 130.6 + ], + [ + -122.854213, + 48.657653, + 128.7 + ], + [ + -122.854215, + 48.657618, + 126.6 + ], + [ + -122.854211, + 48.657579, + 125.5 + ], + [ + -122.85424, + 48.657534, + 124.2 + ], + [ + -122.854264, + 48.657511, + 123.6 + ], + [ + -122.854329, + 48.657491, + 122.6 + ], + [ + -122.854387, + 48.657489, + 121.6 + ], + [ + -122.854441, + 48.657494, + 121.3 + ], + [ + -122.854483, + 48.65749, + 120.8 + ], + [ + -122.854521, + 48.657469, + 120.1 + ], + [ + -122.854565, + 48.657463, + 120.5 + ], + [ + -122.854604, + 48.657453, + 121.5 + ], + [ + -122.85465, + 48.657446, + 122.7 + ], + [ + -122.854692, + 48.657445, + 123.5 + ], + [ + -122.854738, + 48.657442, + 124.3 + ], + [ + -122.854789, + 48.657438, + 125.2 + ], + [ + -122.854844, + 48.657429, + 126.4 + ], + [ + -122.854892, + 48.657419, + 127.5 + ], + [ + -122.854897, + 48.657457, + 128.4 + ], + [ + -122.854882, + 48.657491, + 128.6 + ], + [ + -122.854876, + 48.657518, + 129 + ], + [ + -122.854868, + 48.657545, + 129.7 + ], + [ + -122.854823, + 48.657551, + 129.1 + ], + [ + -122.854782, + 48.657556, + 128.5 + ], + [ + -122.854742, + 48.657548, + 127.5 + ], + [ + -122.854698, + 48.657553, + 126 + ], + [ + -122.854671, + 48.657574, + 125.6 + ], + [ + -122.854626, + 48.657578, + 124.2 + ], + [ + -122.854576, + 48.657564, + 122.5 + ], + [ + -122.854541, + 48.657584, + 122.1 + ], + [ + -122.854527, + 48.657612, + 121.9 + ], + [ + -122.85453, + 48.65764, + 122.8 + ], + [ + -122.854536, + 48.657667, + 123.9 + ], + [ + -122.85453, + 48.657695, + 124.4 + ], + [ + -122.854524, + 48.657731, + 124.8 + ], + [ + -122.854507, + 48.657758, + 124.6 + ], + [ + -122.854521, + 48.657784, + 124.9 + ], + [ + -122.854567, + 48.657808, + 125.6 + ], + [ + -122.854579, + 48.657834, + 125.7 + ], + [ + -122.854606, + 48.657856, + 126.2 + ], + [ + -122.854639, + 48.657877, + 126.7 + ], + [ + -122.854635, + 48.657909, + 127.3 + ], + [ + -122.854656, + 48.657935, + 127.6 + ], + [ + -122.854642, + 48.657961, + 127.8 + ], + [ + -122.854606, + 48.657986, + 129.2 + ], + [ + -122.854564, + 48.657977, + 129.8 + ], + [ + -122.854521, + 48.657963, + 130.7 + ], + [ + -122.854471, + 48.657959, + 132.8 + ], + [ + -122.854437, + 48.657939, + 133.2 + ], + [ + -122.854391, + 48.657924, + 133.9 + ], + [ + -122.854343, + 48.657935, + 136.6 + ], + [ + -122.854301, + 48.657928, + 137.7 + ], + [ + -122.854273, + 48.657903, + 137.6 + ], + [ + -122.854247, + 48.657882, + 137.7 + ], + [ + -122.854212, + 48.657865, + 138.2 + ], + [ + -122.854175, + 48.657851, + 138.7 + ], + [ + -122.854124, + 48.657832, + 139 + ], + [ + -122.854073, + 48.657828, + 139.9 + ], + [ + -122.854029, + 48.657824, + 140.6 + ], + [ + -122.853978, + 48.65783, + 141.8 + ], + [ + -122.853925, + 48.65783, + 142.6 + ], + [ + -122.853915, + 48.657795, + 141.2 + ], + [ + -122.853873, + 48.657801, + 141.7 + ], + [ + -122.853813, + 48.657794, + 142.4 + ], + [ + -122.853778, + 48.657774, + 142.3 + ], + [ + -122.853747, + 48.657755, + 142.3 + ], + [ + -122.853733, + 48.65773, + 142 + ], + [ + -122.853731, + 48.657693, + 141.9 + ], + [ + -122.853729, + 48.657662, + 142.4 + ], + [ + -122.85373, + 48.657632, + 143.2 + ], + [ + -122.853716, + 48.6576, + 144.6 + ], + [ + -122.853683, + 48.657583, + 146.2 + ], + [ + -122.8537, + 48.657547, + 146.3 + ], + [ + -122.853714, + 48.657518, + 146.1 + ], + [ + -122.853708, + 48.657476, + 147 + ], + [ + -122.853695, + 48.657446, + 147.9 + ], + [ + -122.853696, + 48.657405, + 148.1 + ], + [ + -122.853685, + 48.657376, + 148.5 + ], + [ + -122.853683, + 48.657345, + 148.7 + ], + [ + -122.853689, + 48.657317, + 148.8 + ], + [ + -122.853712, + 48.657348, + 147.8 + ], + [ + -122.853722, + 48.657383, + 147.3 + ], + [ + -122.853741, + 48.657413, + 146.5 + ], + [ + -122.853718, + 48.657437, + 147.2 + ], + [ + -122.853711, + 48.657465, + 147.1 + ], + [ + -122.853694, + 48.65749, + 147.2 + ], + [ + -122.853679, + 48.657525, + 147.3 + ], + [ + -122.853662, + 48.65755, + 147.6 + ], + [ + -122.853641, + 48.657575, + 147.7 + ], + [ + -122.853627, + 48.657609, + 147.2 + ], + [ + -122.853616, + 48.657638, + 147.1 + ], + [ + -122.853609, + 48.657665, + 147.1 + ], + [ + -122.853596, + 48.657699, + 147.3 + ], + [ + -122.853583, + 48.657727, + 147.6 + ], + [ + -122.853581, + 48.657755, + 147.6 + ], + [ + -122.853564, + 48.657788, + 148.3 + ], + [ + -122.853534, + 48.657817, + 149.5 + ], + [ + -122.853507, + 48.657852, + 150.8 + ], + [ + -122.853487, + 48.657878, + 151.7 + ], + [ + -122.853509, + 48.657905, + 152.2 + ], + [ + -122.853491, + 48.657943, + 153.5 + ], + [ + -122.853466, + 48.657965, + 154.5 + ], + [ + -122.853431, + 48.657998, + 156.1 + ], + [ + -122.853394, + 48.658018, + 157.2 + ], + [ + -122.853352, + 48.658037, + 158.2 + ], + [ + -122.853329, + 48.658071, + 159.3 + ], + [ + -122.853281, + 48.65809, + 160.5 + ], + [ + -122.853233, + 48.658104, + 161.6 + ], + [ + -122.853197, + 48.65812, + 162.3 + ], + [ + -122.853156, + 48.658147, + 163.4 + ], + [ + -122.853105, + 48.658157, + 164.1 + ], + [ + -122.853048, + 48.658166, + 164.6 + ], + [ + -122.852982, + 48.658164, + 164.7 + ], + [ + -122.852922, + 48.658163, + 164.7 + ], + [ + -122.852872, + 48.658166, + 164.8 + ], + [ + -122.852826, + 48.658174, + 164.9 + ], + [ + -122.85278, + 48.658167, + 165 + ], + [ + -122.852731, + 48.658151, + 165.3 + ], + [ + -122.852676, + 48.65815, + 166 + ], + [ + -122.852634, + 48.658148, + 166.5 + ], + [ + -122.852583, + 48.658141, + 166.8 + ], + [ + -122.852546, + 48.658157, + 167.2 + ], + [ + -122.852544, + 48.658188, + 167.4 + ], + [ + -122.852546, + 48.658219, + 167.4 + ], + [ + -122.852527, + 48.658247, + 168.2 + ], + [ + -122.852499, + 48.658271, + 169.5 + ], + [ + -122.852473, + 48.658293, + 170.6 + ], + [ + -122.852454, + 48.658323, + 172.1 + ], + [ + -122.852458, + 48.658351, + 173.8 + ], + [ + -122.852474, + 48.658384, + 175.8 + ], + [ + -122.852505, + 48.658402, + 177 + ], + [ + -122.852551, + 48.658421, + 178.8 + ], + [ + -122.852595, + 48.658431, + 179.5 + ], + [ + -122.852638, + 48.658444, + 180.1 + ], + [ + -122.852686, + 48.658455, + 180.4 + ], + [ + -122.852733, + 48.658475, + 181.1 + ], + [ + -122.852794, + 48.65848, + 180.7 + ], + [ + -122.852855, + 48.658502, + 180.7 + ], + [ + -122.852898, + 48.658525, + 181 + ], + [ + -122.852946, + 48.658553, + 181.3 + ], + [ + -122.852983, + 48.658565, + 181 + ], + [ + -122.853026, + 48.65858, + 180.6 + ], + [ + -122.853067, + 48.658596, + 180.6 + ], + [ + -122.853112, + 48.658611, + 180.5 + ], + [ + -122.853161, + 48.658614, + 180.1 + ], + [ + -122.853204, + 48.658636, + 180.3 + ], + [ + -122.853247, + 48.658666, + 180.9 + ], + [ + -122.853277, + 48.658694, + 180.9 + ], + [ + -122.853288, + 48.658727, + 181 + ], + [ + -122.853302, + 48.658756, + 180.9 + ], + [ + -122.85331, + 48.658791, + 181 + ], + [ + -122.853301, + 48.658823, + 181.7 + ], + [ + -122.853306, + 48.658858, + 182.1 + ], + [ + -122.853309, + 48.658889, + 182.6 + ], + [ + -122.85331, + 48.658926, + 183.3 + ], + [ + -122.853312, + 48.658957, + 184.1 + ], + [ + -122.853307, + 48.658995, + 185.4 + ], + [ + -122.853309, + 48.659026, + 186.5 + ], + [ + -122.853319, + 48.659052, + 187.7 + ], + [ + -122.853341, + 48.659087, + 189.3 + ], + [ + -122.853365, + 48.65911, + 190.2 + ], + [ + -122.853411, + 48.659135, + 190.5 + ], + [ + -122.853458, + 48.659146, + 189.8 + ], + [ + -122.853496, + 48.659162, + 189.1 + ], + [ + -122.853524, + 48.65919, + 188.9 + ], + [ + -122.853574, + 48.659196, + 189 + ], + [ + -122.853617, + 48.659209, + 190 + ], + [ + -122.853655, + 48.659231, + 191.1 + ], + [ + -122.853677, + 48.659263, + 191.7 + ], + [ + -122.853713, + 48.659287, + 191.6 + ], + [ + -122.85375, + 48.65931, + 191 + ], + [ + -122.853774, + 48.65934, + 190.9 + ], + [ + -122.853735, + 48.659356, + 191.8 + ], + [ + -122.853689, + 48.659374, + 193.1 + ], + [ + -122.85365, + 48.659358, + 193.5 + ], + [ + -122.853619, + 48.659325, + 193 + ], + [ + -122.853567, + 48.659346, + 193.3 + ], + [ + -122.853609, + 48.65936, + 193.7 + ], + [ + -122.853656, + 48.659385, + 193.8 + ], + [ + -122.853705, + 48.659405, + 193.1 + ], + [ + -122.853759, + 48.659417, + 192.5 + ], + [ + -122.853805, + 48.659433, + 192.7 + ], + [ + -122.853844, + 48.65944, + 193 + ], + [ + -122.853892, + 48.659454, + 193.3 + ], + [ + -122.853945, + 48.659462, + 193.4 + ], + [ + -122.853995, + 48.659472, + 193.3 + ], + [ + -122.854035, + 48.659455, + 192.7 + ], + [ + -122.85408, + 48.659455, + 192.3 + ], + [ + -122.854126, + 48.659472, + 192.8 + ], + [ + -122.854181, + 48.659484, + 193.6 + ], + [ + -122.854221, + 48.659498, + 194.7 + ], + [ + -122.854268, + 48.659519, + 195.8 + ], + [ + -122.854317, + 48.65954, + 196.7 + ], + [ + -122.85435, + 48.659564, + 197.9 + ], + [ + -122.854375, + 48.659596, + 199.8 + ], + [ + -122.854391, + 48.659622, + 201.5 + ], + [ + -122.854425, + 48.659658, + 203.7 + ], + [ + -122.854461, + 48.659675, + 204.2 + ], + [ + -122.854503, + 48.659685, + 203 + ], + [ + -122.854567, + 48.659691, + 200.2 + ], + [ + -122.854606, + 48.659682, + 198.2 + ], + [ + -122.854617, + 48.659646, + 196.2 + ], + [ + -122.854593, + 48.659614, + 195.8 + ], + [ + -122.854579, + 48.659586, + 195.7 + ], + [ + -122.854603, + 48.659551, + 193.1 + ], + [ + -122.854656, + 48.659531, + 190.4 + ], + [ + -122.854692, + 48.659515, + 189.4 + ], + [ + -122.854741, + 48.659517, + 190.7 + ], + [ + -122.854785, + 48.659525, + 193 + ], + [ + -122.854833, + 48.659515, + 194.6 + ], + [ + -122.854864, + 48.659497, + 194.4 + ], + [ + -122.854911, + 48.6595, + 195.4 + ], + [ + -122.854954, + 48.659506, + 196.4 + ], + [ + -122.855003, + 48.659516, + 197.6 + ], + [ + -122.85505, + 48.659526, + 198.8 + ], + [ + -122.855105, + 48.659533, + 200 + ], + [ + -122.855155, + 48.659542, + 201.2 + ], + [ + -122.855208, + 48.659551, + 202.2 + ], + [ + -122.855263, + 48.659551, + 202.7 + ], + [ + -122.855321, + 48.659549, + 202.6 + ], + [ + -122.855367, + 48.659548, + 202.4 + ], + [ + -122.855431, + 48.659537, + 201.9 + ], + [ + -122.855454, + 48.659537, + 202 + ], + [ + -122.855496, + 48.659541, + 202.3 + ], + [ + -122.855548, + 48.659542, + 202.8 + ], + [ + -122.855594, + 48.659538, + 203.1 + ], + [ + -122.855644, + 48.659553, + 204.8 + ], + [ + -122.855688, + 48.659565, + 205.6 + ], + [ + -122.855732, + 48.659577, + 205.8 + ], + [ + -122.85577, + 48.659596, + 206.2 + ], + [ + -122.855804, + 48.659617, + 206.8 + ], + [ + -122.855836, + 48.659637, + 207.4 + ], + [ + -122.855884, + 48.65966, + 208.1 + ], + [ + -122.855923, + 48.659675, + 208.2 + ], + [ + -122.855963, + 48.659688, + 208.3 + ], + [ + -122.856003, + 48.659698, + 208.4 + ], + [ + -122.856054, + 48.659707, + 208.3 + ], + [ + -122.856095, + 48.659715, + 208.3 + ], + [ + -122.856136, + 48.659733, + 208.6 + ], + [ + -122.856174, + 48.659743, + 208.7 + ], + [ + -122.856224, + 48.659746, + 208.7 + ], + [ + -122.85626, + 48.659765, + 209.5 + ], + [ + -122.856293, + 48.659789, + 210.1 + ], + [ + -122.856317, + 48.659812, + 210.6 + ], + [ + -122.856342, + 48.659848, + 211.2 + ], + [ + -122.856358, + 48.659874, + 211.3 + ], + [ + -122.856375, + 48.659909, + 211.5 + ], + [ + -122.856395, + 48.659945, + 211.5 + ], + [ + -122.856411, + 48.659975, + 211.4 + ], + [ + -122.85642, + 48.660008, + 211.3 + ], + [ + -122.856421, + 48.660039, + 211 + ], + [ + -122.856416, + 48.660071, + 210.5 + ], + [ + -122.856408, + 48.660101, + 210.1 + ], + [ + -122.856396, + 48.660129, + 210.1 + ], + [ + -122.856409, + 48.660162, + 211 + ], + [ + -122.85643, + 48.660188, + 212.1 + ], + [ + -122.856468, + 48.660212, + 213.2 + ], + [ + -122.856514, + 48.660233, + 214.1 + ], + [ + -122.856553, + 48.660245, + 214.4 + ], + [ + -122.856602, + 48.660248, + 214.2 + ], + [ + -122.856637, + 48.660264, + 214.7 + ], + [ + -122.856678, + 48.660272, + 214.6 + ], + [ + -122.856677, + 48.660301, + 215.9 + ], + [ + -122.856637, + 48.660286, + 215.6 + ], + [ + -122.856633, + 48.660336, + 218.2 + ], + [ + -122.856674, + 48.660316, + 216.6 + ], + [ + -122.856632, + 48.660275, + 215.2 + ], + [ + -122.85667, + 48.660263, + 214.2 + ], + [ + -122.856691, + 48.660236, + 212.8 + ], + [ + -122.856732, + 48.660236, + 212.7 + ], + [ + -122.85679, + 48.660225, + 212.3 + ], + [ + -122.856816, + 48.660263, + 213.7 + ], + [ + -122.856844, + 48.660286, + 214.8 + ], + [ + -122.856916, + 48.66029, + 214.6 + ], + [ + -122.856916, + 48.660329, + 216.3 + ], + [ + -122.856903, + 48.660355, + 217.4 + ], + [ + -122.856861, + 48.660355, + 217.6 + ], + [ + -122.856821, + 48.660361, + 217.7 + ], + [ + -122.856762, + 48.660366, + 217.9 + ], + [ + -122.85672, + 48.660371, + 218.4 + ], + [ + -122.856749, + 48.660395, + 219.2 + ], + [ + -122.856782, + 48.660414, + 220 + ], + [ + -122.856819, + 48.660398, + 219.5 + ], + [ + -122.856868, + 48.660383, + 218.8 + ], + [ + -122.856921, + 48.660378, + 218.4 + ], + [ + -122.85688, + 48.660381, + 218.6 + ], + [ + -122.856872, + 48.660413, + 220 + ], + [ + -122.856874, + 48.660442, + 221.3 + ], + [ + -122.856897, + 48.660464, + 222.3 + ], + [ + -122.856933, + 48.660479, + 223.1 + ], + [ + -122.856935, + 48.660506, + 224.7 + ], + [ + -122.856899, + 48.660487, + 223.5 + ], + [ + -122.856849, + 48.660494, + 223.8 + ], + [ + -122.856889, + 48.660511, + 224.7 + ], + [ + -122.856929, + 48.660525, + 225.7 + ], + [ + -122.856929, + 48.660553, + 227.2 + ], + [ + -122.856971, + 48.660558, + 227.4 + ], + [ + -122.857001, + 48.660581, + 228.8 + ], + [ + -122.856981, + 48.660605, + 230.2 + ], + [ + -122.856905, + 48.660625, + 230.7 + ], + [ + -122.856843, + 48.660619, + 229.6 + ], + [ + -122.856775, + 48.660621, + 229.4 + ], + [ + -122.856732, + 48.660647, + 230.8 + ], + [ + -122.8567, + 48.660671, + 232.1 + ], + [ + -122.856668, + 48.6607, + 233.6 + ], + [ + -122.856654, + 48.660732, + 235.1 + ], + [ + -122.856617, + 48.660746, + 235.8 + ], + [ + -122.85661, + 48.660779, + 237.2 + ], + [ + -122.856628, + 48.660806, + 238.2 + ], + [ + -122.856595, + 48.660825, + 238.7 + ], + [ + -122.856547, + 48.660834, + 238.6 + ], + [ + -122.856595, + 48.660847, + 239.5 + ], + [ + -122.856605, + 48.660873, + 240.4 + ], + [ + -122.856607, + 48.660903, + 241.1 + ], + [ + -122.856638, + 48.660928, + 242.2 + ], + [ + -122.856679, + 48.660948, + 243.3 + ], + [ + -122.85671, + 48.660971, + 244.5 + ], + [ + -122.856747, + 48.660985, + 245.2 + ], + [ + -122.856794, + 48.660996, + 245.7 + ], + [ + -122.856836, + 48.660994, + 245.7 + ], + [ + -122.856871, + 48.661023, + 247.2 + ], + [ + -122.856881, + 48.66105, + 248.7 + ], + [ + -122.856876, + 48.661085, + 250.5 + ], + [ + -122.856885, + 48.661113, + 252 + ], + [ + -122.856903, + 48.661148, + 253.7 + ], + [ + -122.856855, + 48.661172, + 254.7 + ], + [ + -122.856803, + 48.661178, + 254.8 + ], + [ + -122.856765, + 48.661189, + 255 + ], + [ + -122.856746, + 48.661221, + 256.3 + ], + [ + -122.856704, + 48.661243, + 257.3 + ], + [ + -122.856662, + 48.661223, + 256 + ], + [ + -122.856659, + 48.66126, + 257.7 + ], + [ + -122.856658, + 48.661291, + 259 + ], + [ + -122.85663, + 48.661312, + 259.8 + ], + [ + -122.856593, + 48.661325, + 260.2 + ], + [ + -122.856561, + 48.661346, + 260.7 + ], + [ + -122.856541, + 48.661378, + 261.5 + ], + [ + -122.856526, + 48.661416, + 263 + ], + [ + -122.85651, + 48.661444, + 263.9 + ], + [ + -122.856474, + 48.661468, + 264.6 + ], + [ + -122.856428, + 48.661488, + 265 + ], + [ + -122.856396, + 48.661509, + 265.6 + ], + [ + -122.856388, + 48.661537, + 266.5 + ], + [ + -122.856404, + 48.661571, + 267.6 + ], + [ + -122.856384, + 48.661611, + 268.8 + ], + [ + -122.856386, + 48.661648, + 270.1 + ], + [ + -122.856346, + 48.66167, + 270.7 + ], + [ + -122.85633, + 48.6617, + 271.6 + ], + [ + -122.856343, + 48.66173, + 272.7 + ], + [ + -122.856375, + 48.661768, + 274.3 + ], + [ + -122.856332, + 48.661741, + 273.2 + ], + [ + -122.856279, + 48.661651, + 269.6 + ], + [ + -122.856255, + 48.66162, + 268.5 + ], + [ + -122.856108, + 48.661491, + 262.8 + ], + [ + -122.856162, + 48.661517, + 264.1 + ], + [ + -122.856192, + 48.661546, + 265.6 + ], + [ + -122.856245, + 48.661593, + 267.5 + ], + [ + -122.85628, + 48.661636, + 269.1 + ], + [ + -122.856306, + 48.661666, + 270.2 + ], + [ + -122.856353, + 48.661726, + 272.6 + ], + [ + -122.856302, + 48.661688, + 271 + ], + [ + -122.856354, + 48.661699, + 271.7 + ], + [ + -122.856405, + 48.661709, + 272.2 + ], + [ + -122.856437, + 48.661746, + 273.8 + ], + [ + -122.856412, + 48.661782, + 274.9 + ], + [ + -122.856369, + 48.661742, + 273.3 + ], + [ + -122.856346, + 48.661714, + 272.1 + ], + [ + -122.856325, + 48.661747, + 273.4 + ], + [ + -122.856339, + 48.661779, + 274.6 + ], + [ + -122.856356, + 48.661809, + 275.5 + ], + [ + -122.856347, + 48.661838, + 276.4 + ], + [ + -122.856334, + 48.661872, + 277.3 + ], + [ + -122.856328, + 48.661899, + 278.2 + ], + [ + -122.856348, + 48.661925, + 279.3 + ], + [ + -122.856359, + 48.661953, + 280.5 + ], + [ + -122.856333, + 48.661976, + 280.9 + ], + [ + -122.85635, + 48.662004, + 282 + ], + [ + -122.856314, + 48.662027, + 282.4 + ], + [ + -122.856306, + 48.662058, + 283.3 + ], + [ + -122.856331, + 48.66208, + 283.9 + ], + [ + -122.856333, + 48.662108, + 284.6 + ], + [ + -122.856337, + 48.662143, + 285.3 + ], + [ + -122.856354, + 48.662171, + 286 + ], + [ + -122.856387, + 48.662193, + 286.4 + ], + [ + -122.85642, + 48.662213, + 287 + ], + [ + -122.856438, + 48.662242, + 287.7 + ], + [ + -122.856463, + 48.662278, + 288.7 + ], + [ + -122.856498, + 48.662307, + 289.4 + ], + [ + -122.856512, + 48.662333, + 289.8 + ], + [ + -122.856479, + 48.66236, + 290.1 + ], + [ + -122.856444, + 48.662383, + 290.7 + ], + [ + -122.856442, + 48.662411, + 291.2 + ], + [ + -122.856463, + 48.662435, + 291.5 + ], + [ + -122.856428, + 48.66242, + 291.4 + ], + [ + -122.856397, + 48.662396, + 291.4 + ], + [ + -122.856433, + 48.66241, + 291.3 + ], + [ + -122.856462, + 48.662439, + 291.6 + ], + [ + -122.856487, + 48.662465, + 292.1 + ], + [ + -122.856506, + 48.662495, + 292.7 + ], + [ + -122.856529, + 48.662522, + 293.3 + ], + [ + -122.856533, + 48.662552, + 293.9 + ], + [ + -122.856557, + 48.662581, + 294.6 + ], + [ + -122.856585, + 48.662609, + 295.4 + ], + [ + -122.856583, + 48.662641, + 295.9 + ], + [ + -122.856583, + 48.662675, + 296.5 + ], + [ + -122.85661, + 48.6627, + 297.3 + ], + [ + -122.856643, + 48.662719, + 297.9 + ], + [ + -122.856653, + 48.662749, + 298.3 + ], + [ + -122.856631, + 48.662783, + 298.3 + ], + [ + -122.856615, + 48.662813, + 298.4 + ], + [ + -122.85659, + 48.662836, + 298.8 + ], + [ + -122.856594, + 48.662864, + 299.4 + ], + [ + -122.856611, + 48.662895, + 300 + ], + [ + -122.856652, + 48.662915, + 300.6 + ], + [ + -122.856675, + 48.662939, + 300.9 + ], + [ + -122.856688, + 48.662984, + 301.4 + ], + [ + -122.856701, + 48.663023, + 302.1 + ], + [ + -122.856713, + 48.663049, + 302.7 + ], + [ + -122.856718, + 48.663079, + 303.3 + ], + [ + -122.856741, + 48.663106, + 303.9 + ], + [ + -122.856792, + 48.663122, + 304.4 + ], + [ + -122.856815, + 48.663148, + 304.9 + ], + [ + -122.856832, + 48.663173, + 305.6 + ], + [ + -122.856848, + 48.663209, + 306.1 + ], + [ + -122.856862, + 48.663241, + 306.2 + ], + [ + -122.856893, + 48.663265, + 306.6 + ], + [ + -122.856925, + 48.663288, + 307 + ], + [ + -122.856945, + 48.66332, + 307.5 + ], + [ + -122.856973, + 48.66334, + 307.9 + ], + [ + -122.856999, + 48.663374, + 308.2 + ], + [ + -122.857012, + 48.663404, + 307.8 + ], + [ + -122.857014, + 48.663433, + 307.2 + ], + [ + -122.857009, + 48.663462, + 306.6 + ], + [ + -122.857002, + 48.663497, + 306.2 + ], + [ + -122.856983, + 48.663529, + 306 + ], + [ + -122.856951, + 48.663557, + 305.6 + ], + [ + -122.856953, + 48.663586, + 305.5 + ], + [ + -122.85698, + 48.663607, + 305.7 + ], + [ + -122.857024, + 48.663635, + 306.2 + ], + [ + -122.857044, + 48.663668, + 306.2 + ], + [ + -122.857065, + 48.663699, + 306.1 + ], + [ + -122.857076, + 48.663729, + 305.8 + ], + [ + -122.857081, + 48.663758, + 305.7 + ], + [ + -122.857079, + 48.66379, + 305.6 + ], + [ + -122.857077, + 48.663827, + 305.6 + ], + [ + -122.857071, + 48.663854, + 305.6 + ], + [ + -122.85706, + 48.663885, + 305.3 + ], + [ + -122.857081, + 48.663916, + 305.3 + ], + [ + -122.857126, + 48.663938, + 306.1 + ], + [ + -122.857135, + 48.663972, + 306.7 + ], + [ + -122.857155, + 48.664011, + 307.4 + ], + [ + -122.857151, + 48.664046, + 307.6 + ], + [ + -122.8571, + 48.664056, + 306.6 + ], + [ + -122.85706, + 48.664046, + 305.7 + ], + [ + -122.857084, + 48.664077, + 306.8 + ], + [ + -122.857107, + 48.664107, + 307.4 + ], + [ + -122.857121, + 48.664134, + 308 + ], + [ + -122.857103, + 48.664159, + 308.1 + ], + [ + -122.857067, + 48.664185, + 306.9 + ], + [ + -122.857073, + 48.664214, + 307.2 + ], + [ + -122.857011, + 48.664236, + 304.5 + ], + [ + -122.856953, + 48.66426, + 303.4 + ], + [ + -122.856929, + 48.664217, + 302.4 + ], + [ + -122.856933, + 48.664169, + 302.9 + ], + [ + -122.856948, + 48.664131, + 303.8 + ], + [ + -122.857051, + 48.66409, + 306.1 + ], + [ + -122.857144, + 48.664092, + 307.5 + ], + [ + -122.857197, + 48.664069, + 309.8 + ], + [ + -122.85729, + 48.664053, + 313.4 + ], + [ + -122.857366, + 48.664048, + 316.8 + ], + [ + -122.857342, + 48.664077, + 315.8 + ], + [ + -122.857294, + 48.664094, + 313.7 + ], + [ + -122.857182, + 48.664129, + 309.3 + ], + [ + -122.857108, + 48.66414, + 307.9 + ], + [ + -122.857061, + 48.664181, + 306.6 + ], + [ + -122.857044, + 48.664227, + 305.7 + ], + [ + -122.857089, + 48.664243, + 307.7 + ], + [ + -122.857139, + 48.664252, + 309.7 + ], + [ + -122.857114, + 48.664273, + 308.3 + ], + [ + -122.857131, + 48.664302, + 308.5 + ], + [ + -122.85711, + 48.664328, + 306.9 + ], + [ + -122.857091, + 48.664354, + 306.6 + ], + [ + -122.85709, + 48.664394, + 307.9 + ], + [ + -122.857102, + 48.664421, + 308.9 + ], + [ + -122.857116, + 48.664453, + 309.9 + ], + [ + -122.857156, + 48.664469, + 310.4 + ], + [ + -122.857194, + 48.664498, + 311.4 + ], + [ + -122.857195, + 48.664531, + 312.3 + ], + [ + -122.857179, + 48.664557, + 313.2 + ], + [ + -122.857158, + 48.664593, + 314.3 + ], + [ + -122.857148, + 48.664653, + 314.2 + ], + [ + -122.857142, + 48.664668, + 313.9 + ], + [ + -122.857108, + 48.664698, + 313.4 + ], + [ + -122.857099, + 48.664726, + 313.1 + ], + [ + -122.857091, + 48.66476, + 313.3 + ], + [ + -122.857088, + 48.664791, + 314.1 + ], + [ + -122.857109, + 48.664816, + 315.2 + ], + [ + -122.857128, + 48.664848, + 316.9 + ], + [ + -122.85714, + 48.664874, + 318.6 + ], + [ + -122.857102, + 48.66489, + 319.7 + ], + [ + -122.857112, + 48.66492, + 321.4 + ], + [ + -122.857103, + 48.664948, + 322.7 + ], + [ + -122.857134, + 48.664972, + 324.3 + ], + [ + -122.857153, + 48.664998, + 325.5 + ], + [ + -122.857153, + 48.665025, + 326.7 + ], + [ + -122.857131, + 48.665062, + 327.6 + ], + [ + -122.857129, + 48.665091, + 328.4 + ], + [ + -122.857127, + 48.665124, + 329.1 + ], + [ + -122.857107, + 48.665161, + 329.5 + ], + [ + -122.857133, + 48.665181, + 330.5 + ], + [ + -122.857144, + 48.665208, + 331.4 + ], + [ + -122.857155, + 48.66524, + 332.5 + ], + [ + -122.85719, + 48.665217, + 333 + ], + [ + -122.85718, + 48.665245, + 333.3 + ], + [ + -122.857158, + 48.665279, + 333.4 + ], + [ + -122.85716, + 48.665311, + 333.9 + ], + [ + -122.857167, + 48.665342, + 334.4 + ], + [ + -122.857161, + 48.665371, + 334.7 + ], + [ + -122.857152, + 48.665409, + 335.3 + ], + [ + -122.857151, + 48.665439, + 335.5 + ], + [ + -122.857149, + 48.665472, + 335.8 + ], + [ + -122.85716, + 48.665506, + 336 + ], + [ + -122.85716, + 48.665536, + 336.1 + ], + [ + -122.857154, + 48.665568, + 335.8 + ], + [ + -122.857144, + 48.665597, + 335.4 + ], + [ + -122.857162, + 48.665624, + 336.1 + ], + [ + -122.857165, + 48.665654, + 336.1 + ], + [ + -122.857167, + 48.665691, + 336 + ], + [ + -122.857189, + 48.66572, + 336.5 + ], + [ + -122.857225, + 48.665737, + 337.6 + ], + [ + -122.857258, + 48.665767, + 338.3 + ], + [ + -122.857289, + 48.665789, + 339 + ], + [ + -122.857322, + 48.665818, + 339.6 + ], + [ + -122.85735, + 48.665845, + 339.8 + ], + [ + -122.857388, + 48.665869, + 340.2 + ], + [ + -122.857434, + 48.665891, + 340.8 + ], + [ + -122.857473, + 48.66591, + 341.6 + ], + [ + -122.857511, + 48.665929, + 342.1 + ], + [ + -122.857546, + 48.66596, + 342.7 + ], + [ + -122.857581, + 48.665984, + 343.7 + ], + [ + -122.857623, + 48.665975, + 344.9 + ], + [ + -122.857665, + 48.665982, + 345.6 + ], + [ + -122.857623, + 48.665986, + 344.8 + ], + [ + -122.857577, + 48.665994, + 343.5 + ], + [ + -122.857531, + 48.666008, + 342.6 + ], + [ + -122.857602, + 48.665994, + 344.2 + ], + [ + -122.85761, + 48.665967, + 344.6 + ], + [ + -122.857623, + 48.665936, + 344.3 + ], + [ + -122.857617, + 48.665907, + 343.6 + ], + [ + -122.857604, + 48.665871, + 343.2 + ], + [ + -122.857607, + 48.66582, + 343.9 + ], + [ + -122.857598, + 48.665892, + 343.1 + ], + [ + -122.857648, + 48.665912, + 344.3 + ], + [ + -122.857698, + 48.66593, + 345.5 + ], + [ + -122.857729, + 48.665949, + 346.4 + ], + [ + -122.857758, + 48.665975, + 346.8 + ], + [ + -122.857789, + 48.665994, + 346.5 + ], + [ + -122.85784, + 48.666005, + 346.2 + ], + [ + -122.857885, + 48.666013, + 345.9 + ], + [ + -122.857931, + 48.666031, + 345.5 + ], + [ + -122.857975, + 48.666024, + 345.4 + ], + [ + -122.858023, + 48.666032, + 345 + ], + [ + -122.858054, + 48.666051, + 344.3 + ], + [ + -122.858077, + 48.666079, + 344.3 + ], + [ + -122.858102, + 48.666108, + 344.8 + ], + [ + -122.858129, + 48.666142, + 345.5 + ], + [ + -122.858158, + 48.666171, + 346.4 + ], + [ + -122.858179, + 48.666195, + 347.4 + ], + [ + -122.858194, + 48.666225, + 348.7 + ], + [ + -122.858209, + 48.66626, + 350.1 + ], + [ + -122.858211, + 48.666287, + 351.2 + ], + [ + -122.858205, + 48.666319, + 352.4 + ], + [ + -122.858217, + 48.666359, + 353.5 + ], + [ + -122.858228, + 48.666393, + 354.3 + ], + [ + -122.858224, + 48.666424, + 355.3 + ], + [ + -122.858209, + 48.666449, + 356.1 + ], + [ + -122.858217, + 48.666484, + 357.1 + ], + [ + -122.85823, + 48.666509, + 357.8 + ], + [ + -122.858239, + 48.666545, + 358.8 + ], + [ + -122.858232, + 48.666574, + 359.1 + ], + [ + -122.858236, + 48.666605, + 359.5 + ], + [ + -122.858251, + 48.666634, + 360 + ], + [ + -122.858273, + 48.666661, + 360.8 + ], + [ + -122.858285, + 48.666692, + 361.5 + ], + [ + -122.858288, + 48.666723, + 361.9 + ], + [ + -122.858291, + 48.666752, + 362.2 + ], + [ + -122.858295, + 48.666788, + 362.7 + ], + [ + -122.858304, + 48.666817, + 363.1 + ], + [ + -122.858289, + 48.66685, + 362.7 + ], + [ + -122.858271, + 48.666884, + 362.3 + ], + [ + -122.858263, + 48.66692, + 362.3 + ], + [ + -122.858258, + 48.666949, + 362.2 + ], + [ + -122.85825, + 48.666975, + 362.1 + ], + [ + -122.858245, + 48.667006, + 362.2 + ], + [ + -122.858243, + 48.667038, + 362.3 + ], + [ + -122.85822, + 48.667075, + 362.3 + ], + [ + -122.858192, + 48.667099, + 362.4 + ], + [ + -122.858133, + 48.667122, + 362.6 + ], + [ + -122.858091, + 48.667147, + 363.2 + ], + [ + -122.858051, + 48.667162, + 363.6 + ], + [ + -122.857996, + 48.667186, + 364.5 + ], + [ + -122.857961, + 48.667211, + 365.2 + ], + [ + -122.857927, + 48.667238, + 366.2 + ], + [ + -122.857876, + 48.667244, + 366.9 + ], + [ + -122.857843, + 48.667261, + 368 + ], + [ + -122.857803, + 48.667282, + 369.5 + ], + [ + -122.857762, + 48.667301, + 370.6 + ], + [ + -122.857705, + 48.667304, + 370.3 + ], + [ + -122.857648, + 48.667306, + 369.3 + ], + [ + -122.857603, + 48.667306, + 368.2 + ], + [ + -122.857555, + 48.667304, + 367 + ], + [ + -122.857512, + 48.667295, + 365.9 + ], + [ + -122.857471, + 48.667266, + 364.9 + ], + [ + -122.857433, + 48.667255, + 364.4 + ], + [ + -122.857376, + 48.667259, + 363.9 + ], + [ + -122.857316, + 48.667269, + 363.6 + ], + [ + -122.857267, + 48.667277, + 363.5 + ], + [ + -122.857213, + 48.667279, + 363.3 + ], + [ + -122.857171, + 48.667288, + 363.4 + ], + [ + -122.857138, + 48.667305, + 363.5 + ], + [ + -122.857126, + 48.667336, + 364.1 + ], + [ + -122.857145, + 48.667367, + 365.1 + ], + [ + -122.857153, + 48.667396, + 366.1 + ], + [ + -122.857154, + 48.667425, + 366.9 + ], + [ + -122.857137, + 48.667452, + 367 + ], + [ + -122.857094, + 48.667469, + 366.1 + ], + [ + -122.857138, + 48.667509, + 367.7 + ], + [ + -122.857192, + 48.66754, + 369.3 + ], + [ + -122.857165, + 48.667564, + 368.7 + ], + [ + -122.857133, + 48.667589, + 368 + ], + [ + -122.857101, + 48.667609, + 367.9 + ], + [ + -122.857092, + 48.667637, + 368.8 + ], + [ + -122.857071, + 48.667664, + 370.2 + ], + [ + -122.85707, + 48.667692, + 371.1 + ], + [ + -122.85707, + 48.667722, + 372.4 + ], + [ + -122.857062, + 48.667754, + 373.9 + ], + [ + -122.856994, + 48.667758, + 375.8 + ], + [ + -122.85698, + 48.667793, + 377.7 + ], + [ + -122.856984, + 48.667817, + 378.7 + ], + [ + -122.85702, + 48.667839, + 378.6 + ], + [ + -122.857036, + 48.667867, + 379.6 + ], + [ + -122.857028, + 48.6679, + 381.5 + ], + [ + -122.857046, + 48.667924, + 382.1 + ], + [ + -122.857078, + 48.667945, + 382.3 + ], + [ + -122.857124, + 48.667952, + 381.6 + ], + [ + -122.857134, + 48.667981, + 382.7 + ], + [ + -122.857143, + 48.668011, + 383.7 + ], + [ + -122.857109, + 48.668033, + 385.5 + ], + [ + -122.8571, + 48.668066, + 387 + ], + [ + -122.857083, + 48.668105, + 389.5 + ], + [ + -122.857101, + 48.668136, + 390.3 + ], + [ + -122.857117, + 48.668162, + 391.1 + ], + [ + -122.857123, + 48.668194, + 392.6 + ], + [ + -122.857085, + 48.668223, + 394.7 + ], + [ + -122.857071, + 48.668249, + 395.5 + ], + [ + -122.857069, + 48.66828, + 396.3 + ], + [ + -122.857075, + 48.668311, + 397.1 + ], + [ + -122.857061, + 48.668337, + 396.9 + ], + [ + -122.857048, + 48.668368, + 396.8 + ], + [ + -122.857063, + 48.668402, + 397.4 + ], + [ + -122.857085, + 48.668437, + 398 + ], + [ + -122.857088, + 48.668474, + 398 + ], + [ + -122.857072, + 48.6685, + 398.3 + ], + [ + -122.857073, + 48.668528, + 398.7 + ], + [ + -122.85709, + 48.668561, + 399.4 + ], + [ + -122.857104, + 48.668588, + 400 + ], + [ + -122.857113, + 48.668619, + 400.5 + ], + [ + -122.857122, + 48.668646, + 400.8 + ], + [ + -122.857133, + 48.668676, + 401.1 + ], + [ + -122.857136, + 48.668706, + 401.5 + ], + [ + -122.857151, + 48.668731, + 401.7 + ], + [ + -122.857133, + 48.668764, + 402.3 + ], + [ + -122.857142, + 48.668798, + 402.4 + ], + [ + -122.857138, + 48.668829, + 402.2 + ], + [ + -122.857153, + 48.668869, + 401.4 + ], + [ + -122.85715, + 48.668902, + 400.5 + ], + [ + -122.857148, + 48.668942, + 399.8 + ], + [ + -122.857128, + 48.668976, + 399.7 + ], + [ + -122.857109, + 48.669008, + 399.7 + ], + [ + -122.857096, + 48.669036, + 399.6 + ], + [ + -122.85712, + 48.669062, + 399.1 + ], + [ + -122.857137, + 48.669089, + 399.2 + ], + [ + -122.857144, + 48.669122, + 399.7 + ], + [ + -122.857132, + 48.669152, + 400.3 + ], + [ + -122.857127, + 48.669193, + 401.2 + ], + [ + -122.857128, + 48.669223, + 402.1 + ], + [ + -122.857126, + 48.669252, + 403 + ], + [ + -122.857147, + 48.669276, + 403.7 + ], + [ + -122.857141, + 48.669305, + 403.9 + ], + [ + -122.857136, + 48.669337, + 404 + ], + [ + -122.857147, + 48.669363, + 404.7 + ], + [ + -122.857166, + 48.66939, + 405.7 + ], + [ + -122.857153, + 48.669417, + 406.3 + ], + [ + -122.857153, + 48.669445, + 407 + ], + [ + -122.857178, + 48.669474, + 408.2 + ], + [ + -122.857187, + 48.669505, + 408.7 + ], + [ + -122.857198, + 48.669531, + 409 + ], + [ + -122.857224, + 48.669559, + 409.6 + ], + [ + -122.8572, + 48.669589, + 409.4 + ], + [ + -122.857197, + 48.66963, + 410.1 + ], + [ + -122.857188, + 48.669662, + 410.8 + ], + [ + -122.85717, + 48.669692, + 411.5 + ], + [ + -122.857187, + 48.669726, + 412.8 + ], + [ + -122.857168, + 48.669754, + 413.9 + ], + [ + -122.85716, + 48.669798, + 415.2 + ], + [ + -122.857136, + 48.669831, + 416.7 + ], + [ + -122.85708, + 48.669879, + 418.2 + ], + [ + -122.857069, + 48.669911, + 419.4 + ], + [ + -122.857044, + 48.669942, + 420.6 + ], + [ + -122.857082, + 48.66992, + 419.9 + ], + [ + -122.857112, + 48.669901, + 419 + ], + [ + -122.857159, + 48.669905, + 419.4 + ], + [ + -122.857209, + 48.669909, + 419.8 + ], + [ + -122.857249, + 48.669926, + 420.3 + ], + [ + -122.85728, + 48.669949, + 420.9 + ], + [ + -122.857327, + 48.669975, + 421.4 + ], + [ + -122.857381, + 48.670008, + 422.1 + ], + [ + -122.857398, + 48.670024, + 422.7 + ], + [ + -122.857414, + 48.670041, + 423.6 + ], + [ + -122.85743, + 48.670057, + 424.3 + ], + [ + -122.857447, + 48.670074, + 425 + ], + [ + -122.857463, + 48.67009, + 425.7 + ], + [ + -122.857479, + 48.670107, + 426.5 + ], + [ + -122.857496, + 48.670123, + 427.5 + ], + [ + -122.857512, + 48.67014, + 428.4 + ], + [ + -122.857528, + 48.670156, + 429.3 + ], + [ + -122.857545, + 48.670173, + 430.2 + ], + [ + -122.857561, + 48.670189, + 430.9 + ], + [ + -122.857577, + 48.670206, + 431.7 + ], + [ + -122.857594, + 48.670223, + 432.4 + ], + [ + -122.85757, + 48.670254, + 434 + ], + [ + -122.857611, + 48.670229, + 432.7 + ], + [ + -122.857654, + 48.670226, + 432.4 + ], + [ + -122.857697, + 48.670246, + 433.5 + ], + [ + -122.857693, + 48.670277, + 435 + ], + [ + -122.857717, + 48.670245, + 433.4 + ], + [ + -122.857769, + 48.670237, + 432.9 + ], + [ + -122.857817, + 48.670232, + 433.1 + ], + [ + -122.857857, + 48.670241, + 433.6 + ], + [ + -122.857886, + 48.67027, + 435.2 + ], + [ + -122.85791, + 48.670296, + 436.5 + ], + [ + -122.857904, + 48.670324, + 437.7 + ], + [ + -122.857863, + 48.670351, + 438.3 + ], + [ + -122.857853, + 48.67038, + 439.4 + ], + [ + -122.857862, + 48.670414, + 440.9 + ], + [ + -122.857847, + 48.670443, + 442.2 + ], + [ + -122.857829, + 48.670469, + 443.2 + ], + [ + -122.857814, + 48.670504, + 444.6 + ], + [ + -122.857846, + 48.670528, + 445.5 + ], + [ + -122.857884, + 48.670561, + 446.7 + ], + [ + -122.857884, + 48.670533, + 445.7 + ], + [ + -122.857845, + 48.670545, + 446.2 + ], + [ + -122.857812, + 48.670564, + 446.8 + ], + [ + -122.857814, + 48.670591, + 447.8 + ], + [ + -122.857796, + 48.670622, + 448.9 + ], + [ + -122.857774, + 48.670645, + 449.9 + ], + [ + -122.857747, + 48.670676, + 451 + ], + [ + -122.857719, + 48.670703, + 451.8 + ], + [ + -122.857687, + 48.670728, + 452.5 + ], + [ + -122.857737, + 48.670734, + 452.7 + ], + [ + -122.857735, + 48.670765, + 453.8 + ], + [ + -122.857701, + 48.670788, + 454.6 + ], + [ + -122.857624, + 48.670777, + 453.7 + ], + [ + -122.857588, + 48.670762, + 452.7 + ], + [ + -122.857524, + 48.67079, + 452.5 + ], + [ + -122.857505, + 48.670761, + 451.5 + ], + [ + -122.857452, + 48.670767, + 450.7 + ], + [ + -122.8574, + 48.670755, + 450.2 + ], + [ + -122.857445, + 48.670748, + 450.5 + ], + [ + -122.857483, + 48.670759, + 451.1 + ], + [ + -122.857484, + 48.670793, + 451.7 + ], + [ + -122.857452, + 48.670811, + 451.2 + ], + [ + -122.857431, + 48.670838, + 451 + ], + [ + -122.85741, + 48.670867, + 451.2 + ], + [ + -122.857366, + 48.670887, + 452.6 + ], + [ + -122.857326, + 48.670904, + 454.2 + ], + [ + -122.857271, + 48.670907, + 454.8 + ], + [ + -122.857217, + 48.670924, + 455.6 + ], + [ + -122.857186, + 48.670949, + 456.5 + ], + [ + -122.857162, + 48.670972, + 457.1 + ], + [ + -122.85716, + 48.671001, + 458.1 + ], + [ + -122.857168, + 48.67103, + 459.3 + ], + [ + -122.857172, + 48.671063, + 460.5 + ], + [ + -122.857174, + 48.671093, + 461.5 + ], + [ + -122.857144, + 48.671119, + 461.9 + ], + [ + -122.85711, + 48.671061, + 459.6 + ], + [ + -122.857104, + 48.67103, + 458.4 + ], + [ + -122.857112, + 48.671064, + 459.7 + ], + [ + -122.857135, + 48.671095, + 461 + ], + [ + -122.857147, + 48.671126, + 462.2 + ], + [ + -122.857125, + 48.6711, + 461 + ], + [ + -122.857155, + 48.671125, + 462.3 + ], + [ + -122.857146, + 48.671166, + 463.3 + ], + [ + -122.857119, + 48.671186, + 463.4 + ], + [ + -122.857101, + 48.671219, + 464 + ], + [ + -122.857107, + 48.671251, + 464.9 + ], + [ + -122.857114, + 48.671283, + 465.9 + ], + [ + -122.857116, + 48.671316, + 466.7 + ], + [ + -122.857131, + 48.671344, + 467.7 + ], + [ + -122.857156, + 48.671368, + 468.6 + ], + [ + -122.857165, + 48.671395, + 469.4 + ], + [ + -122.85718, + 48.671426, + 470.3 + ], + [ + -122.857195, + 48.671454, + 471 + ], + [ + -122.857204, + 48.671483, + 471.6 + ], + [ + -122.857215, + 48.671514, + 472.1 + ], + [ + -122.857259, + 48.671523, + 471.9 + ], + [ + -122.85729, + 48.671542, + 472 + ], + [ + -122.857304, + 48.671571, + 472.6 + ], + [ + -122.857336, + 48.671602, + 473.4 + ], + [ + -122.857355, + 48.671628, + 474.4 + ], + [ + -122.85736, + 48.671662, + 475.5 + ], + [ + -122.85738, + 48.671691, + 476.3 + ], + [ + -122.857409, + 48.671711, + 476.6 + ], + [ + -122.85739, + 48.671739, + 477.5 + ], + [ + -122.857355, + 48.671768, + 477.8 + ], + [ + -122.85735, + 48.671807, + 477.5 + ], + [ + -122.857349, + 48.671834, + 477 + ], + [ + -122.857357, + 48.671867, + 476.7 + ], + [ + -122.857363, + 48.671899, + 477.7 + ], + [ + -122.857331, + 48.671935, + 479.9 + ], + [ + -122.857314, + 48.67196, + 481.9 + ], + [ + -122.857308, + 48.671988, + 482.8 + ], + [ + -122.857299, + 48.672021, + 483.6 + ], + [ + -122.857305, + 48.672049, + 483.9 + ], + [ + -122.857247, + 48.672077, + 484.8 + ], + [ + -122.857214, + 48.672094, + 485.3 + ], + [ + -122.857198, + 48.672133, + 486.4 + ], + [ + -122.857199, + 48.672172, + 487.7 + ], + [ + -122.857211, + 48.672201, + 488.7 + ], + [ + -122.857226, + 48.672226, + 489.7 + ], + [ + -122.857255, + 48.672245, + 490.4 + ], + [ + -122.85722, + 48.672267, + 491.4 + ], + [ + -122.857196, + 48.672296, + 492.3 + ], + [ + -122.857175, + 48.672323, + 492.5 + ], + [ + -122.857151, + 48.672346, + 492.6 + ], + [ + -122.85717, + 48.67237, + 493.4 + ], + [ + -122.857214, + 48.672393, + 494.7 + ], + [ + -122.857173, + 48.672417, + 494.5 + ], + [ + -122.857126, + 48.672399, + 493.5 + ], + [ + -122.857044, + 48.672385, + 494.9 + ], + [ + -122.856999, + 48.67238, + 495.8 + ], + [ + -122.857056, + 48.672377, + 494.4 + ], + [ + -122.857099, + 48.672379, + 493.2 + ], + [ + -122.857156, + 48.672384, + 493.4 + ], + [ + -122.857173, + 48.672417, + 494.5 + ], + [ + -122.85716, + 48.672474, + 495.6 + ], + [ + -122.857204, + 48.672415, + 495.1 + ], + [ + -122.857196, + 48.672384, + 494.2 + ], + [ + -122.857257, + 48.672389, + 495 + ], + [ + -122.857185, + 48.672366, + 493.6 + ], + [ + -122.857194, + 48.672409, + 494.8 + ], + [ + -122.857186, + 48.672438, + 495.3 + ], + [ + -122.857193, + 48.672467, + 496.2 + ], + [ + -122.857191, + 48.672499, + 497 + ], + [ + -122.857155, + 48.672515, + 496.6 + ], + [ + -122.857136, + 48.672548, + 497.2 + ], + [ + -122.857122, + 48.672573, + 497.7 + ], + [ + -122.857117, + 48.672615, + 498.8 + ], + [ + -122.857138, + 48.672654, + 500.3 + ], + [ + -122.857153, + 48.672687, + 501.4 + ], + [ + -122.857166, + 48.672721, + 502.4 + ], + [ + -122.857169, + 48.672753, + 503.1 + ], + [ + -122.857165, + 48.672788, + 503.8 + ], + [ + -122.857165, + 48.672825, + 504.6 + ], + [ + -122.857171, + 48.672859, + 505.2 + ], + [ + -122.857187, + 48.672886, + 505.6 + ], + [ + -122.85719, + 48.672921, + 506.1 + ], + [ + -122.857191, + 48.672954, + 506.6 + ], + [ + -122.857198, + 48.672985, + 507 + ], + [ + -122.857205, + 48.673013, + 507.1 + ], + [ + -122.857218, + 48.673044, + 506.9 + ], + [ + -122.857219, + 48.673075, + 506.6 + ], + [ + -122.857207, + 48.673108, + 506.1 + ], + [ + -122.857205, + 48.673151, + 506.3 + ], + [ + -122.857205, + 48.673184, + 506.7 + ], + [ + -122.857217, + 48.673217, + 507.5 + ], + [ + -122.857222, + 48.673251, + 508.1 + ], + [ + -122.857215, + 48.67329, + 508.5 + ], + [ + -122.857212, + 48.673321, + 508.8 + ], + [ + -122.857213, + 48.673358, + 509.1 + ], + [ + -122.857212, + 48.67339, + 509.3 + ], + [ + -122.857211, + 48.673423, + 509.7 + ], + [ + -122.857205, + 48.673457, + 510.4 + ], + [ + -122.857214, + 48.673486, + 510.7 + ], + [ + -122.857247, + 48.673509, + 510.3 + ], + [ + -122.857279, + 48.673535, + 509.9 + ], + [ + -122.857306, + 48.673559, + 509.5 + ], + [ + -122.857334, + 48.673586, + 509.2 + ], + [ + -122.857354, + 48.673623, + 509.3 + ], + [ + -122.857371, + 48.67365, + 509.4 + ], + [ + -122.857405, + 48.673665, + 509.3 + ], + [ + -122.857449, + 48.673676, + 509.3 + ], + [ + -122.857472, + 48.673704, + 509.6 + ], + [ + -122.857507, + 48.673719, + 509.7 + ], + [ + -122.857547, + 48.673708, + 509.4 + ], + [ + -122.857494, + 48.673718, + 509.7 + ], + [ + -122.857441, + 48.673737, + 509.9 + ], + [ + -122.857487, + 48.673757, + 509.6 + ], + [ + -122.857514, + 48.673783, + 509.2 + ], + [ + -122.857557, + 48.673784, + 509.1 + ], + [ + -122.857606, + 48.673782, + 508.8 + ], + [ + -122.857655, + 48.673792, + 507.4 + ], + [ + -122.857711, + 48.673803, + 508.9 + ], + [ + -122.857748, + 48.673817, + 510.4 + ], + [ + -122.857789, + 48.673827, + 511.1 + ], + [ + -122.857805, + 48.673854, + 512 + ], + [ + -122.857823, + 48.673889, + 513.2 + ], + [ + -122.857857, + 48.673911, + 514.3 + ], + [ + -122.857886, + 48.673942, + 515.6 + ], + [ + -122.857897, + 48.673973, + 516.9 + ], + [ + -122.857884, + 48.674005, + 518 + ], + [ + -122.857938, + 48.674018, + 518.8 + ], + [ + -122.85796, + 48.673985, + 517.7 + ], + [ + -122.857913, + 48.673978, + 517.2 + ], + [ + -122.857926, + 48.674014, + 518.6 + ], + [ + -122.857922, + 48.674041, + 519.4 + ], + [ + -122.85792, + 48.674076, + 520.4 + ], + [ + -122.85793, + 48.67411, + 521.5 + ], + [ + -122.857929, + 48.674146, + 522.3 + ], + [ + -122.857949, + 48.674175, + 523.4 + ], + [ + -122.857983, + 48.674197, + 524.4 + ], + [ + -122.858002, + 48.674231, + 525.7 + ], + [ + -122.857985, + 48.674261, + 526.5 + ], + [ + -122.858014, + 48.674296, + 528 + ], + [ + -122.858011, + 48.67433, + 529.2 + ], + [ + -122.858002, + 48.674365, + 530.3 + ], + [ + -122.858007, + 48.674401, + 531.4 + ], + [ + -122.857967, + 48.674441, + 532.3 + ], + [ + -122.857963, + 48.674479, + 533.2 + ], + [ + -122.857943, + 48.674504, + 533.7 + ], + [ + -122.857895, + 48.674523, + 533.9 + ], + [ + -122.857881, + 48.674549, + 534.6 + ], + [ + -122.857842, + 48.674569, + 535 + ], + [ + -122.857821, + 48.674594, + 535.6 + ], + [ + -122.85778, + 48.674618, + 536.3 + ], + [ + -122.857749, + 48.674644, + 536.9 + ], + [ + -122.85775, + 48.674673, + 537.9 + ], + [ + -122.857758, + 48.674705, + 539 + ], + [ + -122.857738, + 48.674733, + 539.6 + ], + [ + -122.857758, + 48.674762, + 540.5 + ], + [ + -122.857728, + 48.674781, + 540.8 + ], + [ + -122.857707, + 48.67481, + 541.5 + ], + [ + -122.857695, + 48.674841, + 542.2 + ], + [ + -122.857673, + 48.674871, + 542.7 + ], + [ + -122.857651, + 48.674898, + 543.2 + ], + [ + -122.857619, + 48.674931, + 544 + ], + [ + -122.857594, + 48.674961, + 544.7 + ], + [ + -122.857572, + 48.674991, + 545.3 + ], + [ + -122.857549, + 48.675019, + 545.5 + ], + [ + -122.857523, + 48.675045, + 546 + ], + [ + -122.857474, + 48.67506, + 546.1 + ], + [ + -122.857434, + 48.675088, + 546.6 + ], + [ + -122.857407, + 48.675116, + 547 + ], + [ + -122.857394, + 48.675151, + 547.6 + ], + [ + -122.857369, + 48.675175, + 547.9 + ], + [ + -122.857306, + 48.675182, + 547.9 + ], + [ + -122.857266, + 48.675194, + 548.3 + ], + [ + -122.857229, + 48.675211, + 548.9 + ], + [ + -122.857207, + 48.67524, + 549.4 + ], + [ + -122.857187, + 48.675267, + 549.7 + ], + [ + -122.857171, + 48.675302, + 549.9 + ], + [ + -122.857152, + 48.675327, + 550.2 + ], + [ + -122.857131, + 48.675354, + 550.2 + ], + [ + -122.857113, + 48.675381, + 549.9 + ], + [ + -122.857099, + 48.67541, + 549.7 + ], + [ + -122.857105, + 48.675443, + 549.5 + ], + [ + -122.857108, + 48.67548, + 549.5 + ], + [ + -122.857108, + 48.675511, + 549.5 + ], + [ + -122.85715, + 48.675536, + 549.4 + ], + [ + -122.857162, + 48.675564, + 549.2 + ], + [ + -122.857175, + 48.675591, + 549 + ], + [ + -122.857175, + 48.675621, + 548.9 + ], + [ + -122.85717, + 48.675654, + 548.8 + ], + [ + -122.85718, + 48.675684, + 548.8 + ], + [ + -122.857186, + 48.675719, + 549 + ], + [ + -122.857184, + 48.675749, + 549.6 + ], + [ + -122.857184, + 48.675777, + 549.9 + ], + [ + -122.857175, + 48.675818, + 550.1 + ], + [ + -122.857168, + 48.675847, + 550.3 + ], + [ + -122.857166, + 48.675884, + 550.9 + ], + [ + -122.857171, + 48.675911, + 551.3 + ], + [ + -122.857184, + 48.675944, + 552.3 + ], + [ + -122.857204, + 48.675969, + 553 + ], + [ + -122.857217, + 48.675995, + 553.7 + ], + [ + -122.857235, + 48.676034, + 555 + ], + [ + -122.85724, + 48.676061, + 555.9 + ], + [ + -122.857261, + 48.676096, + 557.4 + ], + [ + -122.857253, + 48.676126, + 558.2 + ], + [ + -122.85726, + 48.676162, + 559.4 + ], + [ + -122.857246, + 48.676194, + 560 + ], + [ + -122.857256, + 48.676227, + 561.3 + ], + [ + -122.857253, + 48.67626, + 562.2 + ], + [ + -122.857241, + 48.676292, + 562.8 + ], + [ + -122.857218, + 48.676333, + 563.2 + ], + [ + -122.857185, + 48.676359, + 562.8 + ], + [ + -122.857149, + 48.676392, + 562.7 + ], + [ + -122.857126, + 48.676419, + 562.8 + ], + [ + -122.857092, + 48.676462, + 562.9 + ], + [ + -122.857121, + 48.676483, + 563.7 + ], + [ + -122.857153, + 48.676505, + 565.1 + ], + [ + -122.857154, + 48.67654, + 566.1 + ], + [ + -122.857141, + 48.676571, + 566.4 + ], + [ + -122.857146, + 48.676606, + 567.5 + ], + [ + -122.857151, + 48.676636, + 568.5 + ], + [ + -122.857147, + 48.676666, + 569.1 + ], + [ + -122.857149, + 48.676707, + 569.8 + ], + [ + -122.857167, + 48.676739, + 571 + ], + [ + -122.857161, + 48.676767, + 571.1 + ], + [ + -122.857155, + 48.676796, + 571.1 + ], + [ + -122.857144, + 48.676826, + 571.1 + ], + [ + -122.857131, + 48.676852, + 570.9 + ], + [ + -122.857132, + 48.676882, + 571.1 + ], + [ + -122.857136, + 48.67691, + 571.3 + ], + [ + -122.857138, + 48.676948, + 571.5 + ], + [ + -122.85714, + 48.676984, + 571.7 + ], + [ + -122.857159, + 48.677011, + 572.3 + ], + [ + -122.857194, + 48.677045, + 573.2 + ], + [ + -122.857225, + 48.677065, + 573.9 + ], + [ + -122.857249, + 48.677095, + 574.3 + ], + [ + -122.857255, + 48.677127, + 574.4 + ], + [ + -122.857255, + 48.677161, + 574.6 + ], + [ + -122.857251, + 48.677197, + 574.6 + ], + [ + -122.857244, + 48.677234, + 574.2 + ], + [ + -122.857246, + 48.677267, + 574 + ], + [ + -122.85729, + 48.677301, + 574 + ], + [ + -122.857272, + 48.677328, + 573.6 + ], + [ + -122.857235, + 48.677348, + 573.3 + ], + [ + -122.857193, + 48.677347, + 573.5 + ], + [ + -122.857147, + 48.677353, + 573.7 + ], + [ + -122.857108, + 48.677365, + 573.6 + ], + [ + -122.857058, + 48.677379, + 572.7 + ], + [ + -122.85702, + 48.677393, + 571.9 + ], + [ + -122.856984, + 48.677407, + 571.5 + ], + [ + -122.856943, + 48.677432, + 571 + ], + [ + -122.856895, + 48.677444, + 570.4 + ], + [ + -122.856845, + 48.677453, + 569.4 + ], + [ + -122.856789, + 48.677462, + 567.7 + ], + [ + -122.856745, + 48.67747, + 566.7 + ], + [ + -122.85669, + 48.677484, + 566.5 + ], + [ + -122.856647, + 48.677496, + 566.8 + ], + [ + -122.856605, + 48.677519, + 567.2 + ], + [ + -122.856584, + 48.677545, + 567.7 + ], + [ + -122.85657, + 48.677582, + 568 + ], + [ + -122.856537, + 48.677605, + 569.1 + ], + [ + -122.856494, + 48.677612, + 570.8 + ], + [ + -122.856464, + 48.677631, + 571.4 + ], + [ + -122.856423, + 48.677633, + 571.6 + ], + [ + -122.856377, + 48.677628, + 571.9 + ], + [ + -122.856327, + 48.677633, + 572.5 + ], + [ + -122.856277, + 48.677628, + 572.7 + ], + [ + -122.856227, + 48.67763, + 572.3 + ], + [ + -122.856178, + 48.677626, + 571.7 + ], + [ + -122.856134, + 48.677625, + 571.6 + ], + [ + -122.856091, + 48.677635, + 571.8 + ], + [ + -122.85605, + 48.677642, + 572.2 + ], + [ + -122.85601, + 48.677658, + 572.9 + ], + [ + -122.855959, + 48.677663, + 573.2 + ], + [ + -122.855926, + 48.677627, + 572.9 + ], + [ + -122.855888, + 48.677608, + 573.2 + ], + [ + -122.855835, + 48.677602, + 574 + ], + [ + -122.855784, + 48.67761, + 575 + ], + [ + -122.85573, + 48.677613, + 575.8 + ], + [ + -122.855673, + 48.677617, + 576.5 + ], + [ + -122.855613, + 48.677622, + 577.3 + ], + [ + -122.855555, + 48.677627, + 577.9 + ], + [ + -122.855514, + 48.677627, + 578 + ], + [ + -122.855468, + 48.677615, + 577.9 + ], + [ + -122.855426, + 48.677621, + 578.3 + ], + [ + -122.855387, + 48.677643, + 579.5 + ], + [ + -122.855359, + 48.677664, + 580.1 + ], + [ + -122.855318, + 48.677683, + 580.6 + ], + [ + -122.855264, + 48.677694, + 580.9 + ], + [ + -122.855224, + 48.677701, + 581.4 + ], + [ + -122.855172, + 48.677714, + 582.4 + ], + [ + -122.855125, + 48.677712, + 582.9 + ], + [ + -122.855086, + 48.677724, + 583.9 + ], + [ + -122.855051, + 48.677744, + 585.4 + ], + [ + -122.855005, + 48.677745, + 586.3 + ], + [ + -122.854964, + 48.677755, + 587.5 + ], + [ + -122.854929, + 48.67774, + 587.7 + ], + [ + -122.854885, + 48.67773, + 588.2 + ], + [ + -122.854832, + 48.677737, + 589.3 + ], + [ + -122.85479, + 48.677732, + 589.9 + ], + [ + -122.854753, + 48.677745, + 590.8 + ], + [ + -122.85472, + 48.677769, + 591.7 + ], + [ + -122.8547, + 48.677802, + 592.3 + ], + [ + -122.854664, + 48.677819, + 592.4 + ], + [ + -122.854624, + 48.677827, + 592.5 + ], + [ + -122.854601, + 48.677858, + 592.9 + ], + [ + -122.854592, + 48.677887, + 593.5 + ], + [ + -122.85458, + 48.677919, + 594.4 + ], + [ + -122.854573, + 48.677953, + 595.4 + ], + [ + -122.854582, + 48.677985, + 595.9 + ], + [ + -122.854568, + 48.678011, + 596.5 + ], + [ + -122.854536, + 48.678036, + 597 + ], + [ + -122.854487, + 48.678049, + 597.3 + ], + [ + -122.854443, + 48.678058, + 597.4 + ], + [ + -122.854403, + 48.678055, + 597.3 + ], + [ + -122.854363, + 48.67804, + 597.4 + ], + [ + -122.854324, + 48.678022, + 598.1 + ], + [ + -122.854284, + 48.678001, + 599.2 + ], + [ + -122.854253, + 48.677982, + 599.9 + ], + [ + -122.854219, + 48.677962, + 600.4 + ], + [ + -122.854183, + 48.677947, + 601 + ], + [ + -122.85415, + 48.677968, + 601.8 + ], + [ + -122.854089, + 48.677977, + 602.5 + ], + [ + -122.854042, + 48.677988, + 602.7 + ], + [ + -122.854005, + 48.678001, + 602.9 + ], + [ + -122.853952, + 48.678015, + 602.9 + ], + [ + -122.853909, + 48.67803, + 602.9 + ], + [ + -122.853871, + 48.678044, + 602.8 + ], + [ + -122.853828, + 48.678067, + 602.8 + ], + [ + -122.853789, + 48.678083, + 602.7 + ], + [ + -122.853766, + 48.678109, + 602.7 + ], + [ + -122.853748, + 48.678144, + 602.8 + ], + [ + -122.853729, + 48.67818, + 602.8 + ], + [ + -122.853699, + 48.67821, + 602.9 + ], + [ + -122.853691, + 48.678246, + 603.1 + ], + [ + -122.853689, + 48.678274, + 603.5 + ], + [ + -122.853673, + 48.678302, + 604.4 + ], + [ + -122.853646, + 48.678331, + 605.7 + ], + [ + -122.853621, + 48.678362, + 606.9 + ], + [ + -122.853595, + 48.678389, + 607.6 + ], + [ + -122.853568, + 48.678415, + 608 + ], + [ + -122.853527, + 48.678438, + 608.3 + ], + [ + -122.853479, + 48.678452, + 608.7 + ], + [ + -122.85344, + 48.678468, + 609.3 + ], + [ + -122.853403, + 48.678489, + 609.8 + ], + [ + -122.853369, + 48.678516, + 610.2 + ], + [ + -122.853318, + 48.678548, + 610.7 + ], + [ + -122.85329, + 48.678572, + 610.8 + ], + [ + -122.853255, + 48.678603, + 610.8 + ], + [ + -122.853233, + 48.678626, + 610.9 + ], + [ + -122.853207, + 48.678658, + 610.9 + ], + [ + -122.853192, + 48.678686, + 610.7 + ], + [ + -122.853163, + 48.678705, + 610.7 + ], + [ + -122.853133, + 48.678732, + 610.7 + ], + [ + -122.853137, + 48.678766, + 610.3 + ], + [ + -122.85313, + 48.678798, + 609.8 + ], + [ + -122.853101, + 48.678822, + 609.4 + ], + [ + -122.853063, + 48.67884, + 609.4 + ], + [ + -122.853023, + 48.678863, + 609.2 + ], + [ + -122.852996, + 48.678885, + 608.9 + ], + [ + -122.852968, + 48.678911, + 608.7 + ], + [ + -122.852952, + 48.678962, + 608.5 + ], + [ + -122.852945, + 48.678976, + 608.5 + ], + [ + -122.85292, + 48.679008, + 608.5 + ], + [ + -122.852897, + 48.679031, + 608.6 + ], + [ + -122.852865, + 48.679049, + 608.6 + ], + [ + -122.852861, + 48.679077, + 608.4 + ], + [ + -122.852839, + 48.679111, + 608.5 + ], + [ + -122.852819, + 48.67914, + 608.7 + ], + [ + -122.852795, + 48.679172, + 608.9 + ], + [ + -122.85278, + 48.679202, + 609 + ], + [ + -122.852765, + 48.679236, + 609.1 + ], + [ + -122.852755, + 48.679268, + 608.8 + ], + [ + -122.852742, + 48.679299, + 608.6 + ], + [ + -122.852724, + 48.679325, + 608.3 + ], + [ + -122.852694, + 48.679354, + 608.2 + ], + [ + -122.852684, + 48.679381, + 607.9 + ], + [ + -122.852669, + 48.679415, + 607.4 + ], + [ + -122.852647, + 48.679443, + 607.1 + ], + [ + -122.852622, + 48.679473, + 606.9 + ], + [ + -122.852602, + 48.679512, + 606.8 + ], + [ + -122.852568, + 48.67953, + 606.6 + ], + [ + -122.852532, + 48.679553, + 606.3 + ], + [ + -122.852506, + 48.679581, + 606.2 + ], + [ + -122.852472, + 48.679606, + 605.8 + ], + [ + -122.852425, + 48.679628, + 605.1 + ], + [ + -122.852403, + 48.67964, + 604.8 + ], + [ + -122.852373, + 48.679662, + 604.4 + ], + [ + -122.852351, + 48.679686, + 604 + ], + [ + -122.852318, + 48.679709, + 603.5 + ], + [ + -122.852284, + 48.679727, + 602.8 + ], + [ + -122.85224, + 48.679748, + 602 + ], + [ + -122.852198, + 48.679776, + 601.5 + ], + [ + -122.852182, + 48.679802, + 601.1 + ], + [ + -122.852156, + 48.679834, + 600.7 + ], + [ + -122.852133, + 48.679856, + 600.4 + ], + [ + -122.852098, + 48.679879, + 599.9 + ], + [ + -122.852069, + 48.679899, + 599.5 + ], + [ + -122.852023, + 48.67992, + 599.4 + ], + [ + -122.851992, + 48.679945, + 599.5 + ], + [ + -122.851964, + 48.679974, + 599.4 + ], + [ + -122.851937, + 48.680001, + 599.1 + ], + [ + -122.851913, + 48.680023, + 598.8 + ], + [ + -122.851876, + 48.680043, + 598.8 + ], + [ + -122.851831, + 48.680062, + 599 + ], + [ + -122.851789, + 48.680084, + 599.4 + ], + [ + -122.851763, + 48.680106, + 599.7 + ], + [ + -122.851719, + 48.68013, + 600.2 + ], + [ + -122.851672, + 48.680152, + 600.6 + ], + [ + -122.85163, + 48.680158, + 601 + ], + [ + -122.851631, + 48.680124, + 600.9 + ], + [ + -122.851674, + 48.680113, + 600.5 + ], + [ + -122.851678, + 48.68007, + 600.3 + ], + [ + -122.851653, + 48.680045, + 600.2 + ], + [ + -122.851588, + 48.68011, + 601.1 + ], + [ + -122.851591, + 48.680142, + 601.1 + ], + [ + -122.851546, + 48.680141, + 601.7 + ], + [ + -122.851516, + 48.680117, + 601.7 + ], + [ + -122.851523, + 48.680151, + 602.1 + ], + [ + -122.851543, + 48.680179, + 602.1 + ], + [ + -122.851516, + 48.680153, + 602.2 + ], + [ + -122.851477, + 48.68014, + 602.6 + ], + [ + -122.851464, + 48.680109, + 602.4 + ], + [ + -122.851459, + 48.680077, + 602.3 + ], + [ + -122.851448, + 48.680041, + 602 + ], + [ + -122.851425, + 48.680007, + 601.8 + ], + [ + -122.851413, + 48.679975, + 601.3 + ], + [ + -122.851399, + 48.679946, + 601.1 + ], + [ + -122.851403, + 48.679913, + 600.7 + ], + [ + -122.851394, + 48.679883, + 600.4 + ], + [ + -122.851387, + 48.679849, + 600 + ], + [ + -122.851375, + 48.679817, + 599.7 + ], + [ + -122.851392, + 48.679791, + 599.4 + ], + [ + -122.851407, + 48.679759, + 599.2 + ], + [ + -122.851407, + 48.67973, + 598.9 + ], + [ + -122.851412, + 48.679701, + 598.8 + ], + [ + -122.851422, + 48.679674, + 598.5 + ], + [ + -122.851427, + 48.679644, + 598.3 + ], + [ + -122.851421, + 48.679606, + 597.9 + ], + [ + -122.851411, + 48.67957, + 597.7 + ], + [ + -122.851396, + 48.679544, + 597.8 + ], + [ + -122.85139, + 48.679513, + 597.8 + ], + [ + -122.851397, + 48.679484, + 597.6 + ], + [ + -122.851401, + 48.679454, + 597.5 + ], + [ + -122.85138, + 48.679428, + 597.5 + ], + [ + -122.851366, + 48.679398, + 597.2 + ], + [ + -122.851362, + 48.679369, + 597.5 + ], + [ + -122.851357, + 48.679341, + 597.4 + ], + [ + -122.851354, + 48.679309, + 597.2 + ], + [ + -122.851362, + 48.679279, + 597 + ], + [ + -122.85137, + 48.67925, + 596.6 + ], + [ + -122.851376, + 48.679222, + 596.4 + ], + [ + -122.851386, + 48.679191, + 596.4 + ], + [ + -122.851401, + 48.679156, + 596.2 + ], + [ + -122.851404, + 48.679126, + 596.1 + ], + [ + -122.851387, + 48.679093, + 596.3 + ], + [ + -122.851378, + 48.679062, + 595.9 + ], + [ + -122.851383, + 48.679029, + 595.4 + ], + [ + -122.851408, + 48.679004, + 594.9 + ], + [ + -122.851401, + 48.678975, + 594.4 + ], + [ + -122.851325, + 48.678928, + 593.1 + ], + [ + -122.851284, + 48.678943, + 593 + ], + [ + -122.851329, + 48.678954, + 593.7 + ], + [ + -122.851327, + 48.678987, + 594.5 + ], + [ + -122.851334, + 48.678925, + 593.1 + ], + [ + -122.851337, + 48.678894, + 592.6 + ], + [ + -122.85134, + 48.678867, + 592.3 + ], + [ + -122.85135, + 48.678831, + 592 + ], + [ + -122.851352, + 48.678791, + 591.8 + ], + [ + -122.851351, + 48.678762, + 591.6 + ], + [ + -122.851372, + 48.678725, + 591.8 + ], + [ + -122.851385, + 48.678686, + 591.9 + ], + [ + -122.851402, + 48.678653, + 592.2 + ], + [ + -122.851413, + 48.67862, + 592.3 + ], + [ + -122.851436, + 48.678596, + 592.6 + ], + [ + -122.85144, + 48.678563, + 592.8 + ], + [ + -122.851459, + 48.678538, + 593 + ], + [ + -122.851469, + 48.678508, + 593.2 + ], + [ + -122.851478, + 48.678479, + 593.4 + ], + [ + -122.851504, + 48.678453, + 593.4 + ], + [ + -122.851536, + 48.678419, + 593.2 + ], + [ + -122.85155, + 48.67839, + 593.3 + ], + [ + -122.851557, + 48.678363, + 593.5 + ], + [ + -122.851581, + 48.678333, + 593.9 + ], + [ + -122.851593, + 48.678299, + 594.2 + ], + [ + -122.851596, + 48.678269, + 594.5 + ], + [ + -122.851591, + 48.678232, + 595 + ], + [ + -122.851585, + 48.678203, + 596.1 + ], + [ + -122.851588, + 48.678155, + 596.9 + ], + [ + -122.851625, + 48.678142, + 596.8 + ], + [ + -122.851647, + 48.678117, + 596.5 + ], + [ + -122.851639, + 48.678082, + 596.1 + ], + [ + -122.85163, + 48.678044, + 595.6 + ], + [ + -122.851645, + 48.678011, + 595.4 + ], + [ + -122.851652, + 48.67798, + 595.8 + ], + [ + -122.851644, + 48.677949, + 596.3 + ], + [ + -122.851615, + 48.677929, + 596.5 + ], + [ + -122.851629, + 48.677893, + 597.2 + ], + [ + -122.851642, + 48.67786, + 597.9 + ], + [ + -122.851634, + 48.677826, + 599 + ], + [ + -122.851602, + 48.677793, + 600 + ], + [ + -122.851564, + 48.677778, + 600.4 + ], + [ + -122.851539, + 48.677754, + 600.9 + ], + [ + -122.851522, + 48.677713, + 601.2 + ], + [ + -122.851518, + 48.677682, + 601.4 + ], + [ + -122.851514, + 48.677653, + 601.5 + ], + [ + -122.851509, + 48.67762, + 601.7 + ], + [ + -122.851478, + 48.677583, + 601.6 + ], + [ + -122.851461, + 48.677555, + 601.8 + ], + [ + -122.851452, + 48.677521, + 602 + ], + [ + -122.851466, + 48.677489, + 602.1 + ], + [ + -122.851477, + 48.677454, + 602.1 + ], + [ + -122.851478, + 48.677418, + 602.3 + ], + [ + -122.851461, + 48.677392, + 602.5 + ], + [ + -122.851456, + 48.677364, + 602.6 + ], + [ + -122.851448, + 48.677326, + 602.6 + ], + [ + -122.851463, + 48.677284, + 601.9 + ], + [ + -122.851473, + 48.677249, + 601.1 + ], + [ + -122.851494, + 48.677218, + 600 + ], + [ + -122.851504, + 48.67719, + 599.3 + ], + [ + -122.851489, + 48.677161, + 599.1 + ], + [ + -122.851465, + 48.677135, + 599.1 + ], + [ + -122.851449, + 48.677095, + 598.8 + ], + [ + -122.851448, + 48.677058, + 598.4 + ], + [ + -122.851446, + 48.677029, + 598.1 + ], + [ + -122.851431, + 48.677, + 597.7 + ], + [ + -122.851417, + 48.676965, + 596.6 + ], + [ + -122.851415, + 48.676935, + 595.7 + ], + [ + -122.851412, + 48.676904, + 595.2 + ], + [ + -122.851401, + 48.676862, + 595.6 + ], + [ + -122.851404, + 48.676829, + 596.4 + ], + [ + -122.851414, + 48.676797, + 596.9 + ], + [ + -122.851418, + 48.676771, + 597 + ], + [ + -122.851405, + 48.676738, + 597 + ], + [ + -122.851413, + 48.676707, + 596.8 + ], + [ + -122.851405, + 48.676678, + 596.5 + ], + [ + -122.851403, + 48.676646, + 596 + ], + [ + -122.851396, + 48.676612, + 595.5 + ], + [ + -122.851412, + 48.676584, + 594.9 + ], + [ + -122.851399, + 48.676555, + 594.5 + ], + [ + -122.85139, + 48.676524, + 593.9 + ], + [ + -122.851403, + 48.676493, + 593.3 + ], + [ + -122.851398, + 48.676463, + 592.7 + ], + [ + -122.851389, + 48.676431, + 592.1 + ], + [ + -122.851379, + 48.676387, + 591.5 + ], + [ + -122.851387, + 48.676349, + 591.2 + ], + [ + -122.851402, + 48.676315, + 591.2 + ], + [ + -122.851438, + 48.676294, + 592 + ], + [ + -122.851478, + 48.676277, + 592.9 + ], + [ + -122.851455, + 48.676235, + 592.4 + ], + [ + -122.851433, + 48.676207, + 591.6 + ], + [ + -122.851437, + 48.67617, + 591.5 + ], + [ + -122.851448, + 48.67614, + 591.5 + ], + [ + -122.851485, + 48.676118, + 591.8 + ], + [ + -122.851499, + 48.676089, + 591.4 + ], + [ + -122.851507, + 48.676058, + 590.9 + ], + [ + -122.851555, + 48.676028, + 591 + ], + [ + -122.851568, + 48.675998, + 590.9 + ], + [ + -122.851566, + 48.675965, + 590.3 + ], + [ + -122.851584, + 48.675936, + 590.1 + ], + [ + -122.851605, + 48.675911, + 590.2 + ], + [ + -122.851591, + 48.675875, + 589.8 + ], + [ + -122.851561, + 48.67584, + 589.9 + ], + [ + -122.851544, + 48.675802, + 589.9 + ], + [ + -122.851533, + 48.675774, + 589.9 + ], + [ + -122.851513, + 48.675739, + 590.1 + ], + [ + -122.85152, + 48.675709, + 589.7 + ], + [ + -122.851497, + 48.67567, + 590.3 + ], + [ + -122.851478, + 48.675641, + 590.3 + ], + [ + -122.851456, + 48.675611, + 590.4 + ], + [ + -122.851438, + 48.675586, + 590.8 + ], + [ + -122.851427, + 48.675556, + 590.8 + ], + [ + -122.851409, + 48.675523, + 590.6 + ], + [ + -122.851398, + 48.675489, + 590.3 + ], + [ + -122.851381, + 48.675457, + 589.9 + ], + [ + -122.85137, + 48.675422, + 589.5 + ], + [ + -122.851357, + 48.675389, + 589.9 + ], + [ + -122.851332, + 48.675342, + 590.9 + ], + [ + -122.851324, + 48.675297, + 591.9 + ], + [ + -122.851312, + 48.675264, + 592.2 + ], + [ + -122.85131, + 48.675225, + 593 + ], + [ + -122.851307, + 48.675196, + 593.2 + ], + [ + -122.851331, + 48.675166, + 593.5 + ], + [ + -122.851366, + 48.675148, + 594 + ], + [ + -122.851364, + 48.675118, + 594.5 + ], + [ + -122.851365, + 48.675077, + 595.2 + ], + [ + -122.851365, + 48.675047, + 595.6 + ], + [ + -122.851362, + 48.675017, + 596.4 + ], + [ + -122.851371, + 48.674988, + 597.1 + ], + [ + -122.851386, + 48.674963, + 597.8 + ], + [ + -122.851395, + 48.674933, + 598.6 + ], + [ + -122.851395, + 48.674898, + 599.7 + ], + [ + -122.851382, + 48.674862, + 600.8 + ], + [ + -122.851374, + 48.674835, + 601.5 + ], + [ + -122.851376, + 48.674803, + 602.7 + ], + [ + -122.85138, + 48.674775, + 603.3 + ], + [ + -122.851387, + 48.674739, + 603.8 + ], + [ + -122.85142, + 48.67471, + 603.9 + ], + [ + -122.851446, + 48.674682, + 604.1 + ], + [ + -122.851493, + 48.674673, + 604.2 + ], + [ + -122.85154, + 48.674656, + 604.8 + ], + [ + -122.851582, + 48.674656, + 605 + ], + [ + -122.851636, + 48.674646, + 605.5 + ], + [ + -122.851688, + 48.674654, + 605.8 + ], + [ + -122.851747, + 48.674644, + 606.6 + ], + [ + -122.851798, + 48.674633, + 607.2 + ], + [ + -122.85185, + 48.67463, + 607.9 + ], + [ + -122.851898, + 48.674634, + 608.4 + ], + [ + -122.85194, + 48.674628, + 609.7 + ], + [ + -122.851986, + 48.674623, + 611.4 + ], + [ + -122.852039, + 48.674612, + 613.1 + ], + [ + -122.852082, + 48.674619, + 613.7 + ], + [ + -122.852037, + 48.674643, + 612.2 + ], + [ + -122.852, + 48.674626, + 611.7 + ], + [ + -122.851961, + 48.674614, + 610.9 + ], + [ + -122.851921, + 48.674605, + 610.1 + ], + [ + -122.851889, + 48.674582, + 610.9 + ], + [ + -122.851846, + 48.674559, + 612.2 + ], + [ + -122.851824, + 48.674524, + 614.1 + ], + [ + -122.851814, + 48.674497, + 615.8 + ], + [ + -122.851795, + 48.674463, + 618 + ], + [ + -122.851773, + 48.674433, + 618.4 + ], + [ + -122.851745, + 48.674409, + 618.5 + ], + [ + -122.851729, + 48.674376, + 619.3 + ], + [ + -122.851726, + 48.674348, + 620 + ], + [ + -122.851703, + 48.674315, + 620.8 + ], + [ + -122.851665, + 48.674292, + 621.2 + ], + [ + -122.85163, + 48.674262, + 622 + ], + [ + -122.85162, + 48.674226, + 623.7 + ], + [ + -122.851587, + 48.674199, + 625.3 + ], + [ + -122.851552, + 48.674163, + 625.7 + ], + [ + -122.851529, + 48.674135, + 625.6 + ], + [ + -122.851494, + 48.674115, + 625.3 + ], + [ + -122.851468, + 48.674091, + 625.1 + ], + [ + -122.851446, + 48.674061, + 624.9 + ], + [ + -122.85144, + 48.674033, + 625.2 + ], + [ + -122.851441, + 48.674005, + 625.9 + ], + [ + -122.851457, + 48.673979, + 626.9 + ], + [ + -122.851478, + 48.673946, + 627.9 + ], + [ + -122.8515, + 48.673921, + 628.8 + ], + [ + -122.851483, + 48.673896, + 629.5 + ], + [ + -122.851459, + 48.673861, + 630.8 + ], + [ + -122.851437, + 48.673835, + 631.2 + ], + [ + -122.851454, + 48.673807, + 631.7 + ], + [ + -122.851493, + 48.673794, + 631.8 + ], + [ + -122.851479, + 48.673828, + 631.5 + ], + [ + -122.851447, + 48.673852, + 630.9 + ], + [ + -122.851507, + 48.673836, + 631.2 + ], + [ + -122.851532, + 48.673818, + 631.4 + ], + [ + -122.85153, + 48.673788, + 631.8 + ], + [ + -122.851533, + 48.673756, + 632 + ], + [ + -122.851516, + 48.673721, + 632.3 + ], + [ + -122.851497, + 48.673685, + 632.5 + ], + [ + -122.851479, + 48.67365, + 632.7 + ], + [ + -122.851454, + 48.673626, + 632.9 + ], + [ + -122.851436, + 48.673595, + 632.8 + ], + [ + -122.851423, + 48.673556, + 632.6 + ], + [ + -122.851424, + 48.673527, + 632.3 + ], + [ + -122.851426, + 48.673493, + 632 + ], + [ + -122.851404, + 48.673466, + 631.9 + ], + [ + -122.851376, + 48.673434, + 631.6 + ], + [ + -122.851347, + 48.673409, + 631.8 + ], + [ + -122.851319, + 48.673385, + 632.2 + ], + [ + -122.851305, + 48.673355, + 632.5 + ], + [ + -122.851284, + 48.673322, + 633.2 + ], + [ + -122.851263, + 48.673298, + 633.4 + ], + [ + -122.851224, + 48.673271, + 634 + ], + [ + -122.851185, + 48.673247, + 634.4 + ], + [ + -122.851156, + 48.673224, + 634.2 + ], + [ + -122.851133, + 48.673201, + 634.6 + ], + [ + -122.851098, + 48.673179, + 635.1 + ], + [ + -122.851071, + 48.673158, + 635.3 + ], + [ + -122.851041, + 48.673135, + 635.3 + ], + [ + -122.851, + 48.673106, + 635.8 + ], + [ + -122.850967, + 48.673078, + 636.2 + ], + [ + -122.850918, + 48.673058, + 636.7 + ], + [ + -122.85087, + 48.673055, + 637.3 + ], + [ + -122.850846, + 48.673021, + 637.2 + ], + [ + -122.850829, + 48.672993, + 637.1 + ], + [ + -122.850801, + 48.672957, + 637.3 + ], + [ + -122.85078, + 48.672932, + 637.3 + ], + [ + -122.850732, + 48.67293, + 637 + ], + [ + -122.850683, + 48.672915, + 636.7 + ], + [ + -122.850659, + 48.67289, + 636.6 + ], + [ + -122.850629, + 48.672864, + 636.6 + ], + [ + -122.850602, + 48.672838, + 636.7 + ], + [ + -122.850572, + 48.672806, + 636.9 + ], + [ + -122.850538, + 48.67278, + 637.1 + ], + [ + -122.850487, + 48.672777, + 637 + ], + [ + -122.850431, + 48.672761, + 637.4 + ], + [ + -122.850408, + 48.672736, + 637.7 + ], + [ + -122.850384, + 48.672767, + 637.7 + ], + [ + -122.850347, + 48.67273, + 638.1 + ], + [ + -122.850292, + 48.672747, + 638.1 + ], + [ + -122.850264, + 48.672722, + 638.3 + ], + [ + -122.850313, + 48.67274, + 638.1 + ], + [ + -122.850304, + 48.672692, + 638.2 + ], + [ + -122.850225, + 48.672679, + 638.4 + ], + [ + -122.850187, + 48.672669, + 638.6 + ], + [ + -122.850139, + 48.672661, + 639.3 + ], + [ + -122.850127, + 48.672628, + 639.2 + ], + [ + -122.850073, + 48.67259, + 638.8 + ], + [ + -122.850039, + 48.672571, + 638.4 + ], + [ + -122.849995, + 48.672563, + 638.5 + ], + [ + -122.849954, + 48.672558, + 638.9 + ], + [ + -122.849915, + 48.672536, + 639.2 + ], + [ + -122.849874, + 48.672524, + 639.6 + ], + [ + -122.84983, + 48.672504, + 640 + ], + [ + -122.849823, + 48.67247, + 639.8 + ], + [ + -122.849807, + 48.672436, + 640.2 + ], + [ + -122.849789, + 48.672402, + 640.5 + ], + [ + -122.849772, + 48.672371, + 640.5 + ], + [ + -122.849745, + 48.672342, + 640.3 + ], + [ + -122.8497, + 48.672326, + 640.4 + ], + [ + -122.84966, + 48.672304, + 640.3 + ], + [ + -122.849636, + 48.672278, + 640 + ], + [ + -122.849609, + 48.672252, + 639.7 + ], + [ + -122.849578, + 48.672223, + 639.4 + ], + [ + -122.849534, + 48.672219, + 639.2 + ], + [ + -122.849495, + 48.672232, + 639.1 + ], + [ + -122.849452, + 48.672253, + 639.1 + ], + [ + -122.84941, + 48.672253, + 638.8 + ], + [ + -122.84937, + 48.672268, + 638.8 + ], + [ + -122.849328, + 48.67228, + 638.6 + ], + [ + -122.849268, + 48.672287, + 638.5 + ], + [ + -122.849226, + 48.672282, + 637.9 + ], + [ + -122.849165, + 48.672273, + 637 + ], + [ + -122.849128, + 48.67226, + 636.7 + ], + [ + -122.849091, + 48.672234, + 636.6 + ], + [ + -122.849072, + 48.67221, + 636.8 + ], + [ + -122.849025, + 48.672189, + 637.1 + ], + [ + -122.848988, + 48.672173, + 637.6 + ], + [ + -122.848951, + 48.672159, + 638 + ], + [ + -122.84893, + 48.672135, + 638.1 + ], + [ + -122.848911, + 48.672103, + 638.3 + ], + [ + -122.848886, + 48.672081, + 638.5 + ], + [ + -122.848866, + 48.672039, + 639.1 + ], + [ + -122.848823, + 48.67199, + 640.1 + ], + [ + -122.848786, + 48.671962, + 640.3 + ], + [ + -122.848749, + 48.671929, + 640.8 + ], + [ + -122.848728, + 48.671892, + 640.8 + ], + [ + -122.848718, + 48.671862, + 640.8 + ], + [ + -122.848714, + 48.671828, + 640.6 + ], + [ + -122.848711, + 48.671792, + 640.5 + ], + [ + -122.848722, + 48.671765, + 640.4 + ], + [ + -122.848711, + 48.671725, + 640.4 + ], + [ + -122.848706, + 48.67169, + 640.4 + ], + [ + -122.848695, + 48.671663, + 640.5 + ], + [ + -122.848672, + 48.671637, + 640.6 + ], + [ + -122.848653, + 48.671612, + 640.2 + ], + [ + -122.848635, + 48.671585, + 639.8 + ], + [ + -122.848619, + 48.671559, + 639.7 + ], + [ + -122.848589, + 48.671527, + 639.1 + ], + [ + -122.848558, + 48.671507, + 638.1 + ], + [ + -122.848527, + 48.671482, + 637.3 + ], + [ + -122.848521, + 48.671453, + 636.8 + ], + [ + -122.848513, + 48.671416, + 636.3 + ], + [ + -122.848485, + 48.671392, + 636 + ], + [ + -122.848445, + 48.671384, + 635.9 + ], + [ + -122.848397, + 48.671365, + 636 + ], + [ + -122.848333, + 48.671349, + 636.3 + ], + [ + -122.848295, + 48.671333, + 636.6 + ], + [ + -122.848263, + 48.671315, + 636.9 + ], + [ + -122.84823, + 48.671283, + 636.7 + ], + [ + -122.848219, + 48.671246, + 635.9 + ], + [ + -122.848178, + 48.67122, + 635.3 + ], + [ + -122.848131, + 48.671211, + 634.6 + ], + [ + -122.848084, + 48.671206, + 634.3 + ], + [ + -122.848042, + 48.671204, + 634.2 + ], + [ + -122.847993, + 48.671203, + 634 + ], + [ + -122.847934, + 48.671208, + 633.4 + ], + [ + -122.84789, + 48.671201, + 632.9 + ], + [ + -122.847851, + 48.671166, + 633.4 + ], + [ + -122.847828, + 48.671141, + 633.6 + ], + [ + -122.847803, + 48.671117, + 633.7 + ], + [ + -122.847762, + 48.671089, + 633.7 + ], + [ + -122.847731, + 48.67107, + 633.8 + ], + [ + -122.847688, + 48.671053, + 633.2 + ], + [ + -122.847653, + 48.671034, + 632.8 + ], + [ + -122.847622, + 48.671014, + 632.6 + ], + [ + -122.847599, + 48.67099, + 632.7 + ], + [ + -122.847573, + 48.670966, + 632.8 + ], + [ + -122.847543, + 48.670945, + 633 + ], + [ + -122.847498, + 48.67092, + 633.2 + ], + [ + -122.84746, + 48.670894, + 633.5 + ], + [ + -122.847416, + 48.670888, + 633.7 + ], + [ + -122.847367, + 48.67087, + 634.3 + ], + [ + -122.847336, + 48.670847, + 635.2 + ], + [ + -122.847297, + 48.670828, + 635.6 + ], + [ + -122.847257, + 48.670819, + 635.7 + ], + [ + -122.847215, + 48.670787, + 636.3 + ], + [ + -122.847188, + 48.670766, + 636.7 + ], + [ + -122.847148, + 48.670754, + 636.8 + ], + [ + -122.847126, + 48.67073, + 637.3 + ], + [ + -122.847092, + 48.670712, + 637.6 + ], + [ + -122.847068, + 48.670668, + 638.1 + ], + [ + -122.847047, + 48.670642, + 638.4 + ], + [ + -122.847013, + 48.670614, + 638.7 + ], + [ + -122.846977, + 48.670595, + 638.9 + ], + [ + -122.846938, + 48.670578, + 639.2 + ], + [ + -122.84689, + 48.670561, + 639.3 + ], + [ + -122.846848, + 48.670537, + 639.4 + ], + [ + -122.846806, + 48.670525, + 639.7 + ], + [ + -122.846763, + 48.670515, + 640.1 + ], + [ + -122.846718, + 48.670514, + 640.4 + ], + [ + -122.846676, + 48.670508, + 640 + ], + [ + -122.846625, + 48.670498, + 639.5 + ], + [ + -122.846576, + 48.670488, + 639 + ], + [ + -122.846537, + 48.670476, + 638.4 + ], + [ + -122.846503, + 48.67046, + 637 + ], + [ + -122.846463, + 48.670455, + 636 + ], + [ + -122.846412, + 48.670468, + 635.6 + ], + [ + -122.846364, + 48.67047, + 634.8 + ], + [ + -122.8463, + 48.670426, + 633 + ], + [ + -122.846273, + 48.670403, + 633 + ], + [ + -122.846266, + 48.670374, + 633.2 + ], + [ + -122.846327, + 48.670342, + 633.4 + ], + [ + -122.846354, + 48.670321, + 633.5 + ], + [ + -122.846305, + 48.670308, + 633.5 + ], + [ + -122.846274, + 48.670354, + 633.3 + ], + [ + -122.846243, + 48.670322, + 633.4 + ], + [ + -122.84628, + 48.670291, + 633.7 + ], + [ + -122.846321, + 48.670276, + 633.8 + ], + [ + -122.846372, + 48.670279, + 633.8 + ], + [ + -122.846424, + 48.670269, + 634.2 + ], + [ + -122.84646, + 48.670253, + 634.7 + ], + [ + -122.846501, + 48.670238, + 635.1 + ], + [ + -122.846552, + 48.670225, + 634.9 + ], + [ + -122.84659, + 48.670205, + 634.8 + ], + [ + -122.846626, + 48.670189, + 634.5 + ], + [ + -122.846666, + 48.670173, + 633.6 + ], + [ + -122.846714, + 48.670168, + 632.2 + ], + [ + -122.846745, + 48.670149, + 631.6 + ], + [ + -122.846755, + 48.670119, + 631.7 + ], + [ + -122.846779, + 48.670092, + 631.7 + ], + [ + -122.846831, + 48.670086, + 630.2 + ], + [ + -122.846879, + 48.670081, + 629.1 + ], + [ + -122.846932, + 48.670069, + 628.2 + ], + [ + -122.846987, + 48.670063, + 627.4 + ], + [ + -122.847042, + 48.67006, + 627.2 + ], + [ + -122.847088, + 48.670045, + 626.5 + ], + [ + -122.847131, + 48.670047, + 626.4 + ], + [ + -122.847173, + 48.670045, + 626.2 + ], + [ + -122.847175, + 48.670017, + 625 + ], + [ + -122.84718, + 48.669983, + 625.1 + ], + [ + -122.847188, + 48.669955, + 625.5 + ], + [ + -122.847211, + 48.669926, + 625.2 + ], + [ + -122.847245, + 48.669904, + 624.5 + ], + [ + -122.847281, + 48.669877, + 623.6 + ], + [ + -122.847303, + 48.669851, + 623.5 + ], + [ + -122.847339, + 48.669827, + 622.4 + ], + [ + -122.847354, + 48.669801, + 622 + ], + [ + -122.84735, + 48.669773, + 622.5 + ], + [ + -122.847379, + 48.669745, + 621 + ], + [ + -122.847391, + 48.669712, + 620.1 + ], + [ + -122.847397, + 48.669677, + 619.6 + ], + [ + -122.847385, + 48.669645, + 620.2 + ], + [ + -122.847378, + 48.669609, + 620.3 + ], + [ + -122.84739, + 48.669581, + 619.3 + ], + [ + -122.847411, + 48.669557, + 617.6 + ], + [ + -122.847439, + 48.669529, + 615 + ], + [ + -122.847479, + 48.669494, + 611.9 + ], + [ + -122.847482, + 48.669461, + 611.4 + ], + [ + -122.847483, + 48.669433, + 611 + ], + [ + -122.847505, + 48.669403, + 609.7 + ], + [ + -122.847543, + 48.669369, + 607.6 + ], + [ + -122.84757, + 48.669345, + 606.4 + ], + [ + -122.847598, + 48.66932, + 605 + ], + [ + -122.847627, + 48.669283, + 603.4 + ], + [ + -122.847654, + 48.669242, + 602.4 + ], + [ + -122.84767, + 48.669206, + 602.1 + ], + [ + -122.847672, + 48.669175, + 602 + ], + [ + -122.847692, + 48.669137, + 601.3 + ], + [ + -122.847731, + 48.669123, + 599.5 + ], + [ + -122.847781, + 48.669105, + 596.8 + ], + [ + -122.847827, + 48.669119, + 594.8 + ], + [ + -122.847863, + 48.669146, + 592.7 + ], + [ + -122.847893, + 48.669167, + 590.8 + ], + [ + -122.847918, + 48.669197, + 588.8 + ], + [ + -122.847935, + 48.669222, + 586.8 + ], + [ + -122.847941, + 48.669256, + 586.6 + ], + [ + -122.847957, + 48.669292, + 585.7 + ], + [ + -122.84796, + 48.669329, + 586.3 + ], + [ + -122.847989, + 48.669358, + 586 + ], + [ + -122.848, + 48.669392, + 587.2 + ], + [ + -122.847996, + 48.669421, + 588.6 + ], + [ + -122.848028, + 48.669442, + 590.1 + ], + [ + -122.847983, + 48.669484, + 592.2 + ], + [ + -122.847952, + 48.669514, + 593.9 + ], + [ + -122.847981, + 48.669493, + 592.8 + ], + [ + -122.847991, + 48.669461, + 590.9 + ], + [ + -122.84802, + 48.669435, + 589.6 + ], + [ + -122.848053, + 48.669413, + 588.7 + ], + [ + -122.848072, + 48.669381, + 587 + ], + [ + -122.848084, + 48.669353, + 585.5 + ], + [ + -122.848098, + 48.669328, + 583.9 + ], + [ + -122.84812, + 48.6693, + 582.3 + ], + [ + -122.848146, + 48.669274, + 580.9 + ], + [ + -122.848196, + 48.669257, + 580.6 + ], + [ + -122.848245, + 48.669233, + 579.9 + ], + [ + -122.848283, + 48.669218, + 579.4 + ], + [ + -122.848348, + 48.669196, + 578.9 + ], + [ + -122.848405, + 48.669184, + 579.2 + ], + [ + -122.848448, + 48.669166, + 579 + ], + [ + -122.848505, + 48.669168, + 579.7 + ], + [ + -122.848566, + 48.669157, + 579.6 + ], + [ + -122.848617, + 48.669162, + 578.9 + ], + [ + -122.848664, + 48.66918, + 578.1 + ], + [ + -122.848704, + 48.669204, + 577.9 + ], + [ + -122.848731, + 48.669226, + 578 + ], + [ + -122.84876, + 48.669247, + 578.1 + ], + [ + -122.848712, + 48.669244, + 579.7 + ], + [ + -122.848683, + 48.669225, + 579.7 + ], + [ + -122.848614, + 48.669238, + 582.4 + ], + [ + -122.848558, + 48.669256, + 584.3 + ], + [ + -122.848517, + 48.669269, + 585.1 + ], + [ + -122.848473, + 48.66926, + 584.5 + ], + [ + -122.84849, + 48.669228, + 582.9 + ], + [ + -122.848471, + 48.669198, + 581 + ], + [ + -122.848445, + 48.669171, + 579.2 + ], + [ + -122.848413, + 48.669153, + 577.5 + ], + [ + -122.848367, + 48.669158, + 577.1 + ], + [ + -122.84832, + 48.669178, + 577.4 + ], + [ + -122.848281, + 48.669188, + 577.4 + ], + [ + -122.848237, + 48.669189, + 577 + ], + [ + -122.84823, + 48.669157, + 575.3 + ], + [ + -122.848197, + 48.669128, + 573.7 + ], + [ + -122.848147, + 48.669113, + 572.8 + ], + [ + -122.848122, + 48.669089, + 572.7 + ], + [ + -122.848081, + 48.669075, + 574 + ], + [ + -122.848043, + 48.669062, + 576 + ], + [ + -122.848062, + 48.669028, + 575.5 + ], + [ + -122.848077, + 48.668998, + 574.6 + ], + [ + -122.848101, + 48.668969, + 573.7 + ], + [ + -122.848115, + 48.668941, + 573 + ], + [ + -122.848161, + 48.668917, + 570.9 + ], + [ + -122.848214, + 48.668903, + 569.1 + ], + [ + -122.848277, + 48.668935, + 569.3 + ], + [ + -122.848307, + 48.668903, + 568.2 + ], + [ + -122.848328, + 48.668871, + 567.2 + ], + [ + -122.848341, + 48.668842, + 566.5 + ], + [ + -122.848365, + 48.668799, + 565.4 + ], + [ + -122.848396, + 48.668762, + 564.4 + ], + [ + -122.848432, + 48.66873, + 563.7 + ], + [ + -122.848475, + 48.668708, + 563.3 + ], + [ + -122.848516, + 48.668687, + 562.3 + ], + [ + -122.848569, + 48.668679, + 561.2 + ], + [ + -122.848611, + 48.668681, + 560.3 + ], + [ + -122.848651, + 48.668693, + 559.5 + ], + [ + -122.848693, + 48.668706, + 558.3 + ], + [ + -122.848737, + 48.668712, + 556.8 + ], + [ + -122.848783, + 48.668718, + 555.3 + ], + [ + -122.848828, + 48.668705, + 553.4 + ], + [ + -122.848872, + 48.668721, + 552.5 + ], + [ + -122.848912, + 48.668731, + 551.2 + ], + [ + -122.848936, + 48.668756, + 551.3 + ], + [ + -122.848965, + 48.668779, + 551.1 + ], + [ + -122.849003, + 48.668795, + 550.3 + ], + [ + -122.849043, + 48.668812, + 549.7 + ], + [ + -122.84909, + 48.668804, + 548.6 + ], + [ + -122.849138, + 48.668804, + 548 + ], + [ + -122.849181, + 48.668818, + 548.1 + ], + [ + -122.849204, + 48.668842, + 548.6 + ], + [ + -122.849192, + 48.668868, + 549.4 + ], + [ + -122.849161, + 48.668888, + 550.4 + ], + [ + -122.849113, + 48.668893, + 551.5 + ], + [ + -122.849074, + 48.668871, + 551.4 + ], + [ + -122.849023, + 48.668868, + 552.5 + ], + [ + -122.848975, + 48.668858, + 553.4 + ], + [ + -122.848955, + 48.668828, + 553.1 + ], + [ + -122.848924, + 48.668807, + 553.5 + ], + [ + -122.84888, + 48.668807, + 554.9 + ], + [ + -122.848817, + 48.668808, + 557.1 + ], + [ + -122.84876, + 48.668797, + 558.8 + ], + [ + -122.848727, + 48.668778, + 559.2 + ], + [ + -122.848725, + 48.668747, + 558.4 + ], + [ + -122.848727, + 48.668711, + 557.1 + ], + [ + -122.848726, + 48.668679, + 556.1 + ], + [ + -122.848721, + 48.668651, + 555.3 + ], + [ + -122.848735, + 48.668624, + 553.5 + ], + [ + -122.848731, + 48.668589, + 552 + ], + [ + -122.848739, + 48.668553, + 550.1 + ], + [ + -122.848726, + 48.668518, + 548.8 + ], + [ + -122.848751, + 48.668492, + 546.8 + ], + [ + -122.848786, + 48.668468, + 544.2 + ], + [ + -122.848826, + 48.668445, + 542 + ], + [ + -122.848869, + 48.668425, + 540.1 + ], + [ + -122.848909, + 48.668406, + 538.8 + ], + [ + -122.848952, + 48.668396, + 538 + ], + [ + -122.848945, + 48.66843, + 538.9 + ], + [ + -122.848914, + 48.668455, + 540.4 + ], + [ + -122.848882, + 48.668484, + 542.3 + ], + [ + -122.848842, + 48.668522, + 545.1 + ], + [ + -122.848785, + 48.66856, + 548.8 + ], + [ + -122.848734, + 48.668582, + 551.6 + ], + [ + -122.848738, + 48.668535, + 549.2 + ], + [ + -122.848737, + 48.668497, + 547.5 + ], + [ + -122.848744, + 48.668452, + 545 + ], + [ + -122.84883, + 48.668402, + 540 + ], + [ + -122.848792, + 48.66838, + 540.3 + ], + [ + -122.848736, + 48.668372, + 541.3 + ], + [ + -122.848683, + 48.668368, + 542.7 + ], + [ + -122.848639, + 48.668363, + 544.2 + ], + [ + -122.848619, + 48.668334, + 543.4 + ], + [ + -122.848597, + 48.668303, + 542.7 + ], + [ + -122.84859, + 48.668271, + 541.4 + ], + [ + -122.848616, + 48.668236, + 538.4 + ], + [ + -122.848666, + 48.668205, + 535.3 + ], + [ + -122.848709, + 48.668176, + 533.2 + ], + [ + -122.84874, + 48.668149, + 531.4 + ], + [ + -122.848766, + 48.668123, + 530.2 + ], + [ + -122.848796, + 48.668102, + 529.2 + ], + [ + -122.848832, + 48.66809, + 528.6 + ], + [ + -122.848799, + 48.668067, + 528.5 + ], + [ + -122.848752, + 48.668061, + 528.6 + ], + [ + -122.848706, + 48.668053, + 528.4 + ], + [ + -122.848651, + 48.668051, + 528.8 + ], + [ + -122.848607, + 48.66806, + 530.2 + ], + [ + -122.848634, + 48.66803, + 528.1 + ], + [ + -122.848662, + 48.667996, + 526.1 + ], + [ + -122.848683, + 48.667955, + 524.3 + ], + [ + -122.848708, + 48.667918, + 523.1 + ], + [ + -122.84873, + 48.667893, + 521.9 + ], + [ + -122.848719, + 48.667862, + 520.8 + ], + [ + -122.848735, + 48.667836, + 519.5 + ], + [ + -122.848762, + 48.667815, + 518.2 + ], + [ + -122.84881, + 48.667811, + 517.2 + ], + [ + -122.848861, + 48.667822, + 516.5 + ], + [ + -122.848903, + 48.667837, + 516.2 + ], + [ + -122.848948, + 48.667854, + 515.9 + ], + [ + -122.849001, + 48.66786, + 515.2 + ], + [ + -122.849052, + 48.667869, + 515.1 + ], + [ + -122.849099, + 48.667875, + 514.6 + ], + [ + -122.849141, + 48.667879, + 513.9 + ], + [ + -122.849185, + 48.667883, + 512.9 + ], + [ + -122.849242, + 48.667886, + 511.7 + ], + [ + -122.849271, + 48.667908, + 511.8 + ], + [ + -122.849229, + 48.667908, + 513.1 + ], + [ + -122.849194, + 48.667922, + 514.4 + ], + [ + -122.849154, + 48.667939, + 515.7 + ], + [ + -122.84911, + 48.667934, + 516.4 + ], + [ + -122.849069, + 48.667926, + 516.9 + ], + [ + -122.849029, + 48.667908, + 516.9 + ], + [ + -122.848997, + 48.667887, + 516.5 + ], + [ + -122.848969, + 48.667861, + 515.8 + ], + [ + -122.848947, + 48.667832, + 515 + ], + [ + -122.848913, + 48.667817, + 515.1 + ], + [ + -122.848861, + 48.667811, + 516 + ], + [ + -122.848827, + 48.66779, + 515.9 + ], + [ + -122.848851, + 48.667756, + 514.2 + ], + [ + -122.848889, + 48.667716, + 511.8 + ], + [ + -122.848933, + 48.667684, + 510 + ], + [ + -122.84896, + 48.667663, + 508.7 + ], + [ + -122.848961, + 48.667629, + 507.6 + ], + [ + -122.848951, + 48.667598, + 507 + ], + [ + -122.848972, + 48.667553, + 505 + ], + [ + -122.849005, + 48.667514, + 502.5 + ], + [ + -122.849046, + 48.667509, + 500.6 + ], + [ + -122.849088, + 48.667513, + 499.1 + ], + [ + -122.849129, + 48.667515, + 497.8 + ], + [ + -122.849165, + 48.667535, + 497.6 + ], + [ + -122.849212, + 48.667541, + 496.5 + ], + [ + -122.849255, + 48.66753, + 494.8 + ], + [ + -122.849319, + 48.667518, + 492.6 + ], + [ + -122.84937, + 48.667525, + 491.8 + ], + [ + -122.849413, + 48.667544, + 491.7 + ], + [ + -122.849453, + 48.66756, + 491.5 + ], + [ + -122.849499, + 48.667569, + 491.4 + ], + [ + -122.849537, + 48.667589, + 491.8 + ], + [ + -122.849571, + 48.667605, + 492.8 + ], + [ + -122.849603, + 48.667626, + 494.1 + ], + [ + -122.849651, + 48.667617, + 492.4 + ], + [ + -122.849685, + 48.667595, + 490.1 + ], + [ + -122.849727, + 48.667585, + 488.2 + ], + [ + -122.849766, + 48.667575, + 486.8 + ], + [ + -122.849814, + 48.667583, + 486.6 + ], + [ + -122.849853, + 48.667607, + 487.6 + ], + [ + -122.849896, + 48.667648, + 488.4 + ], + [ + -122.849938, + 48.667688, + 488.7 + ], + [ + -122.849889, + 48.667679, + 489.1 + ], + [ + -122.849846, + 48.667711, + 490.6 + ], + [ + -122.849815, + 48.667735, + 491.6 + ], + [ + -122.849852, + 48.667709, + 490.5 + ], + [ + -122.8499, + 48.667682, + 489.1 + ], + [ + -122.849945, + 48.667661, + 487.8 + ], + [ + -122.84999, + 48.66765, + 486.5 + ], + [ + -122.850035, + 48.667646, + 485.9 + ], + [ + -122.850081, + 48.667658, + 486 + ], + [ + -122.850129, + 48.667672, + 485.2 + ], + [ + -122.850166, + 48.667689, + 484.1 + ], + [ + -122.850208, + 48.667703, + 483.7 + ], + [ + -122.850249, + 48.667713, + 483.2 + ], + [ + -122.850291, + 48.667725, + 483.1 + ], + [ + -122.850333, + 48.667745, + 482.3 + ], + [ + -122.850359, + 48.667768, + 482.1 + ], + [ + -122.85039, + 48.66779, + 482.6 + ], + [ + -122.850438, + 48.667796, + 481.6 + ], + [ + -122.850482, + 48.667803, + 481 + ], + [ + -122.850526, + 48.667807, + 479.9 + ], + [ + -122.850572, + 48.667801, + 478.3 + ], + [ + -122.85062, + 48.667804, + 477.2 + ], + [ + -122.850665, + 48.667813, + 476.2 + ], + [ + -122.850709, + 48.667825, + 475.4 + ], + [ + -122.850742, + 48.667844, + 475.8 + ], + [ + -122.850781, + 48.667857, + 475.8 + ], + [ + -122.850826, + 48.667868, + 475.1 + ], + [ + -122.850876, + 48.667869, + 473.3 + ], + [ + -122.850918, + 48.667869, + 471.7 + ], + [ + -122.850959, + 48.667878, + 470 + ], + [ + -122.851005, + 48.667901, + 469.4 + ], + [ + -122.851046, + 48.667924, + 469.8 + ], + [ + -122.851088, + 48.667945, + 469.7 + ], + [ + -122.851126, + 48.667958, + 469 + ], + [ + -122.851161, + 48.667975, + 468.7 + ], + [ + -122.851191, + 48.667999, + 469 + ], + [ + -122.851215, + 48.668026, + 469.8 + ], + [ + -122.851259, + 48.668031, + 468.8 + ], + [ + -122.8513, + 48.668026, + 467.5 + ], + [ + -122.85134, + 48.668037, + 466.9 + ], + [ + -122.851373, + 48.668066, + 466.8 + ], + [ + -122.851415, + 48.668082, + 466.5 + ], + [ + -122.851467, + 48.668083, + 465.1 + ], + [ + -122.851507, + 48.668075, + 464 + ], + [ + -122.851546, + 48.668091, + 463.6 + ], + [ + -122.851584, + 48.668112, + 463.4 + ], + [ + -122.851627, + 48.668113, + 462.6 + ], + [ + -122.851627, + 48.66815, + 463.6 + ], + [ + -122.851608, + 48.668177, + 464.9 + ], + [ + -122.85158, + 48.668201, + 466.6 + ], + [ + -122.851616, + 48.668225, + 466.3 + ], + [ + -122.851724, + 48.668221, + 464 + ], + [ + -122.851765, + 48.668205, + 463.3 + ], + [ + -122.851803, + 48.668183, + 462.6 + ], + [ + -122.851849, + 48.668174, + 462.2 + ], + [ + -122.851885, + 48.668151, + 461.5 + ], + [ + -122.851936, + 48.668131, + 460.7 + ], + [ + -122.851979, + 48.668133, + 460.3 + ], + [ + -122.852035, + 48.668142, + 459.2 + ], + [ + -122.851996, + 48.668156, + 460.8 + ], + [ + -122.852022, + 48.668134, + 459.3 + ], + [ + -122.851982, + 48.668122, + 459.9 + ], + [ + -122.851947, + 48.668107, + 459.8 + ], + [ + -122.851904, + 48.66812, + 460.5 + ], + [ + -122.851859, + 48.668143, + 461.3 + ], + [ + -122.851817, + 48.668127, + 461.1 + ], + [ + -122.851776, + 48.668117, + 460.9 + ], + [ + -122.85175, + 48.668068, + 459.3 + ], + [ + -122.85171, + 48.668056, + 459.3 + ], + [ + -122.851712, + 48.668023, + 458.3 + ], + [ + -122.851686, + 48.668002, + 458.4 + ], + [ + -122.851628, + 48.668009, + 459.7 + ], + [ + -122.851587, + 48.667995, + 459.7 + ], + [ + -122.851541, + 48.667985, + 460.4 + ], + [ + -122.851515, + 48.667964, + 460.4 + ], + [ + -122.851498, + 48.667938, + 460.1 + ], + [ + -122.851463, + 48.667916, + 460.2 + ], + [ + -122.851441, + 48.667891, + 459.6 + ], + [ + -122.851384, + 48.667879, + 460.2 + ], + [ + -122.851342, + 48.667881, + 461 + ], + [ + -122.851283, + 48.667882, + 462.1 + ], + [ + -122.851242, + 48.667876, + 462.7 + ], + [ + -122.851205, + 48.667857, + 462.8 + ], + [ + -122.851182, + 48.667833, + 462.3 + ], + [ + -122.851168, + 48.667803, + 461.5 + ], + [ + -122.851134, + 48.667774, + 461.1 + ], + [ + -122.851106, + 48.667744, + 460.5 + ], + [ + -122.851082, + 48.667717, + 459.7 + ], + [ + -122.851053, + 48.667693, + 459 + ], + [ + -122.85102, + 48.667672, + 458.3 + ], + [ + -122.850978, + 48.667652, + 458.1 + ], + [ + -122.850938, + 48.667652, + 458.8 + ], + [ + -122.850893, + 48.667658, + 459.6 + ], + [ + -122.850839, + 48.667657, + 460.7 + ], + [ + -122.850798, + 48.667647, + 461.5 + ], + [ + -122.850775, + 48.667622, + 460.7 + ], + [ + -122.850761, + 48.667592, + 459.3 + ], + [ + -122.850768, + 48.667552, + 456.6 + ], + [ + -122.85078, + 48.667519, + 454.4 + ], + [ + -122.850801, + 48.66749, + 452.4 + ], + [ + -122.850834, + 48.667464, + 450.5 + ], + [ + -122.850859, + 48.667438, + 448.8 + ], + [ + -122.850873, + 48.667412, + 447.7 + ], + [ + -122.850917, + 48.667383, + 446.1 + ], + [ + -122.850967, + 48.66736, + 444.6 + ], + [ + -122.851013, + 48.667348, + 443.7 + ], + [ + -122.851051, + 48.667331, + 442.8 + ], + [ + -122.851081, + 48.667312, + 441.9 + ], + [ + -122.851121, + 48.667295, + 441.2 + ], + [ + -122.851151, + 48.667271, + 440.4 + ], + [ + -122.851193, + 48.667263, + 440 + ], + [ + -122.851246, + 48.66725, + 439.2 + ], + [ + -122.851274, + 48.667243, + 438.6 + ], + [ + -122.851331, + 48.667245, + 437.7 + ], + [ + -122.851374, + 48.667237, + 436.9 + ], + [ + -122.851429, + 48.667231, + 435.8 + ], + [ + -122.851475, + 48.66721, + 434.3 + ], + [ + -122.851517, + 48.667195, + 432.9 + ], + [ + -122.85156, + 48.66718, + 431.5 + ], + [ + -122.851607, + 48.667156, + 429.4 + ], + [ + -122.851643, + 48.667135, + 428.1 + ], + [ + -122.851709, + 48.667132, + 426.7 + ], + [ + -122.851772, + 48.667132, + 425.6 + ], + [ + -122.851815, + 48.667132, + 424.9 + ], + [ + -122.851858, + 48.667152, + 425 + ], + [ + -122.851913, + 48.667166, + 424.7 + ], + [ + -122.851953, + 48.66719, + 425 + ], + [ + -122.851976, + 48.667233, + 426.4 + ], + [ + -122.851999, + 48.667262, + 427.2 + ], + [ + -122.852038, + 48.667269, + 426.6 + ], + [ + -122.852077, + 48.667291, + 426.7 + ], + [ + -122.852051, + 48.667317, + 428 + ], + [ + -122.852009, + 48.667347, + 429.9 + ], + [ + -122.851978, + 48.667368, + 430.7 + ], + [ + -122.852005, + 48.667345, + 429.8 + ], + [ + -122.852044, + 48.667318, + 428.2 + ], + [ + -122.852043, + 48.667288, + 427.2 + ], + [ + -122.852007, + 48.667273, + 427.5 + ], + [ + -122.851955, + 48.66726, + 427.8 + ], + [ + -122.851934, + 48.66723, + 426.9 + ], + [ + -122.851937, + 48.667198, + 425.6 + ], + [ + -122.851915, + 48.667173, + 424.9 + ], + [ + -122.851902, + 48.667138, + 423.9 + ], + [ + -122.851909, + 48.66711, + 422.9 + ], + [ + -122.851881, + 48.66708, + 422.6 + ], + [ + -122.851855, + 48.667053, + 422.8 + ], + [ + -122.851832, + 48.66703, + 423.1 + ], + [ + -122.851836, + 48.667002, + 422.9 + ], + [ + -122.851813, + 48.66698, + 423.1 + ], + [ + -122.851853, + 48.666942, + 422.1 + ], + [ + -122.851839, + 48.666908, + 421.6 + ], + [ + -122.851827, + 48.666879, + 421 + ], + [ + -122.851833, + 48.666842, + 420.1 + ], + [ + -122.851835, + 48.666813, + 419.7 + ], + [ + -122.85185, + 48.666786, + 419.4 + ], + [ + -122.851862, + 48.666747, + 418.7 + ], + [ + -122.851874, + 48.666716, + 418.1 + ], + [ + -122.85186, + 48.666688, + 418.4 + ], + [ + -122.851892, + 48.666651, + 417.5 + ], + [ + -122.851899, + 48.666619, + 416.4 + ], + [ + -122.851904, + 48.666587, + 415.6 + ], + [ + -122.851925, + 48.666563, + 414.4 + ], + [ + -122.851942, + 48.66653, + 413.4 + ], + [ + -122.851958, + 48.666497, + 412.3 + ], + [ + -122.851969, + 48.666467, + 411 + ], + [ + -122.851987, + 48.666437, + 409.6 + ], + [ + -122.852001, + 48.666409, + 408.6 + ], + [ + -122.852038, + 48.666388, + 407.5 + ], + [ + -122.852075, + 48.666356, + 406 + ], + [ + -122.852113, + 48.666335, + 404.7 + ], + [ + -122.852145, + 48.666317, + 403.3 + ], + [ + -122.852187, + 48.6663, + 401.6 + ], + [ + -122.852236, + 48.666306, + 400.6 + ], + [ + -122.852278, + 48.666311, + 399.5 + ], + [ + -122.852313, + 48.666335, + 399.2 + ], + [ + -122.852336, + 48.666357, + 399.2 + ], + [ + -122.852363, + 48.666382, + 399.4 + ], + [ + -122.852407, + 48.666385, + 398 + ], + [ + -122.852477, + 48.66639, + 396 + ], + [ + -122.852529, + 48.66639, + 394.7 + ], + [ + -122.852576, + 48.666396, + 393.6 + ], + [ + -122.852557, + 48.666423, + 394.8 + ], + [ + -122.852586, + 48.666442, + 394.6 + ], + [ + -122.852634, + 48.666462, + 394.6 + ], + [ + -122.852658, + 48.66648, + 394.7 + ], + [ + -122.852682, + 48.666505, + 395 + ], + [ + -122.852714, + 48.666531, + 395.2 + ], + [ + -122.852739, + 48.666554, + 395.4 + ], + [ + -122.852764, + 48.66653, + 394.3 + ], + [ + -122.852775, + 48.666497, + 393 + ], + [ + -122.852821, + 48.666498, + 391.9 + ], + [ + -122.852871, + 48.66649, + 390.4 + ], + [ + -122.852912, + 48.666513, + 390 + ], + [ + -122.852937, + 48.666539, + 389.9 + ], + [ + -122.852979, + 48.666529, + 388.5 + ], + [ + -122.853021, + 48.666544, + 387.8 + ], + [ + -122.853042, + 48.666568, + 387.9 + ], + [ + -122.853072, + 48.666593, + 388 + ], + [ + -122.853111, + 48.666605, + 387.7 + ], + [ + -122.853149, + 48.666615, + 387.3 + ], + [ + -122.853163, + 48.666649, + 388 + ], + [ + -122.853206, + 48.666665, + 388 + ], + [ + -122.853255, + 48.666666, + 386.9 + ], + [ + -122.853301, + 48.666661, + 385.7 + ], + [ + -122.853344, + 48.666655, + 384.7 + ], + [ + -122.853382, + 48.666675, + 384.5 + ], + [ + -122.853415, + 48.666701, + 384.7 + ], + [ + -122.853467, + 48.666713, + 384 + ], + [ + -122.853513, + 48.666694, + 382.4 + ], + [ + -122.853545, + 48.666715, + 382.1 + ], + [ + -122.853564, + 48.666746, + 382.4 + ], + [ + -122.853591, + 48.666767, + 381.9 + ], + [ + -122.853647, + 48.666767, + 380.5 + ], + [ + -122.853681, + 48.666784, + 379.9 + ], + [ + -122.85371, + 48.666806, + 379.7 + ], + [ + -122.853752, + 48.666798, + 378.9 + ], + [ + -122.853785, + 48.666781, + 377.8 + ], + [ + -122.853812, + 48.666754, + 375.7 + ], + [ + -122.853818, + 48.666787, + 377.1 + ], + [ + -122.85382, + 48.666817, + 378.1 + ], + [ + -122.853824, + 48.666844, + 378.7 + ], + [ + -122.853816, + 48.666882, + 380.1 + ], + [ + -122.853792, + 48.666914, + 381.5 + ], + [ + -122.853759, + 48.66689, + 380.9 + ], + [ + -122.853734, + 48.666867, + 380.8 + ], + [ + -122.853692, + 48.666865, + 381.3 + ], + [ + -122.853644, + 48.666857, + 382.4 + ], + [ + -122.853586, + 48.666852, + 384 + ], + [ + -122.853543, + 48.666842, + 385.1 + ], + [ + -122.853558, + 48.666814, + 384 + ], + [ + -122.85351, + 48.666805, + 385.2 + ], + [ + -122.853476, + 48.666784, + 385.5 + ], + [ + -122.853461, + 48.666757, + 385.3 + ], + [ + -122.853469, + 48.666728, + 384.3 + ], + [ + -122.853466, + 48.666699, + 383.6 + ], + [ + -122.853463, + 48.666671, + 382.8 + ], + [ + -122.853459, + 48.666642, + 381.8 + ], + [ + -122.853442, + 48.666615, + 381.3 + ], + [ + -122.85344, + 48.666586, + 380.3 + ], + [ + -122.853443, + 48.666559, + 379.2 + ], + [ + -122.853452, + 48.666531, + 377.9 + ], + [ + -122.853448, + 48.666493, + 377 + ], + [ + -122.853434, + 48.666461, + 376.5 + ], + [ + -122.853425, + 48.666433, + 376 + ], + [ + -122.853444, + 48.666409, + 374.8 + ], + [ + -122.853471, + 48.666381, + 373.6 + ], + [ + -122.853505, + 48.666357, + 372.5 + ], + [ + -122.853535, + 48.666337, + 371.6 + ], + [ + -122.85354, + 48.666308, + 370.9 + ], + [ + -122.853517, + 48.666282, + 370.6 + ], + [ + -122.853486, + 48.666261, + 370.4 + ], + [ + -122.853442, + 48.666246, + 371 + ], + [ + -122.853411, + 48.666224, + 371.1 + ], + [ + -122.853392, + 48.666197, + 370.9 + ], + [ + -122.853364, + 48.666171, + 370.9 + ], + [ + -122.853379, + 48.666142, + 369.5 + ], + [ + -122.85339, + 48.666111, + 368.4 + ], + [ + -122.853371, + 48.66608, + 368.1 + ], + [ + -122.853344, + 48.666049, + 368 + ], + [ + -122.853327, + 48.666021, + 367.3 + ], + [ + -122.853303, + 48.665995, + 366.9 + ], + [ + -122.853259, + 48.66599, + 367.4 + ], + [ + -122.853251, + 48.665963, + 366.8 + ], + [ + -122.853216, + 48.665929, + 366.3 + ], + [ + -122.853185, + 48.6659, + 365.6 + ], + [ + -122.853173, + 48.665873, + 364.7 + ], + [ + -122.853133, + 48.665864, + 365 + ], + [ + -122.853135, + 48.665834, + 364.3 + ], + [ + -122.853132, + 48.665806, + 363.9 + ], + [ + -122.85309, + 48.665789, + 364.4 + ], + [ + -122.853068, + 48.665758, + 364 + ], + [ + -122.85305, + 48.665726, + 363.3 + ], + [ + -122.853037, + 48.665695, + 362.1 + ], + [ + -122.852998, + 48.665674, + 362.2 + ], + [ + -122.852998, + 48.665635, + 360.7 + ], + [ + -122.852991, + 48.665608, + 359.8 + ], + [ + -122.853024, + 48.665575, + 358 + ], + [ + -122.853046, + 48.665549, + 356.7 + ], + [ + -122.853078, + 48.665525, + 355.4 + ], + [ + -122.853113, + 48.665504, + 354.1 + ], + [ + -122.85314, + 48.66548, + 352.7 + ], + [ + -122.853174, + 48.665455, + 351 + ], + [ + -122.853204, + 48.665436, + 349.8 + ], + [ + -122.853254, + 48.665438, + 349 + ], + [ + -122.853298, + 48.66543, + 347.9 + ], + [ + -122.853338, + 48.665438, + 347.5 + ], + [ + -122.853382, + 48.665448, + 346.8 + ], + [ + -122.853429, + 48.665459, + 346.4 + ], + [ + -122.853485, + 48.66546, + 345.4 + ], + [ + -122.853535, + 48.665455, + 344.2 + ], + [ + -122.853575, + 48.665465, + 342.8 + ], + [ + -122.85361, + 48.665481, + 341.6 + ], + [ + -122.853641, + 48.665506, + 341.5 + ], + [ + -122.853683, + 48.66552, + 341.6 + ], + [ + -122.853735, + 48.665531, + 341 + ], + [ + -122.85378, + 48.665544, + 340.2 + ], + [ + -122.85381, + 48.665568, + 340.3 + ], + [ + -122.853875, + 48.665575, + 338.3 + ], + [ + -122.853866, + 48.665603, + 339.6 + ], + [ + -122.853901, + 48.665626, + 339 + ], + [ + -122.853947, + 48.665631, + 337.4 + ], + [ + -122.853988, + 48.665639, + 336.4 + ], + [ + -122.854022, + 48.665658, + 335.7 + ], + [ + -122.854068, + 48.66567, + 334.8 + ], + [ + -122.8541, + 48.665698, + 334.9 + ], + [ + -122.854096, + 48.665732, + 335.7 + ], + [ + -122.854094, + 48.665762, + 336.5 + ], + [ + -122.854074, + 48.665787, + 337.9 + ], + [ + -122.854052, + 48.665758, + 337.6 + ], + [ + -122.854011, + 48.665747, + 338.8 + ], + [ + -122.853966, + 48.66574, + 340.1 + ], + [ + -122.853922, + 48.665732, + 341.3 + ], + [ + -122.853912, + 48.665695, + 340.5 + ], + [ + -122.853907, + 48.665665, + 339.9 + ], + [ + -122.85391, + 48.665638, + 339 + ], + [ + -122.853918, + 48.665604, + 337.7 + ], + [ + -122.853917, + 48.66557, + 336.6 + ], + [ + -122.853935, + 48.665544, + 335.6 + ], + [ + -122.853914, + 48.665514, + 334.7 + ], + [ + -122.853895, + 48.665481, + 334 + ], + [ + -122.853897, + 48.665446, + 332.5 + ], + [ + -122.853922, + 48.665413, + 330.2 + ], + [ + -122.853932, + 48.665385, + 329.1 + ], + [ + -122.853897, + 48.66537, + 329.2 + ], + [ + -122.853872, + 48.665344, + 328.6 + ], + [ + -122.85388, + 48.665304, + 327.2 + ], + [ + -122.853856, + 48.665272, + 327.3 + ], + [ + -122.85385, + 48.665244, + 326.9 + ], + [ + -122.853832, + 48.665216, + 326.9 + ], + [ + -122.853833, + 48.665185, + 326.3 + ], + [ + -122.853837, + 48.665156, + 325.9 + ], + [ + -122.853826, + 48.665118, + 325.2 + ], + [ + -122.853839, + 48.665091, + 323.9 + ], + [ + -122.853867, + 48.66507, + 322.7 + ], + [ + -122.853896, + 48.665041, + 321.3 + ], + [ + -122.853916, + 48.665068, + 322 + ], + [ + -122.853917, + 48.665102, + 322.9 + ], + [ + -122.853964, + 48.665107, + 322.5 + ], + [ + -122.854063, + 48.665088, + 319.7 + ], + [ + -122.854034, + 48.66511, + 320.3 + ], + [ + -122.854048, + 48.665069, + 320.1 + ], + [ + -122.854062, + 48.665038, + 319.6 + ], + [ + -122.854076, + 48.664991, + 318.1 + ], + [ + -122.854048, + 48.664957, + 317.3 + ], + [ + -122.853998, + 48.664967, + 318.3 + ], + [ + -122.854004, + 48.664935, + 316.8 + ], + [ + -122.853959, + 48.664937, + 317 + ], + [ + -122.853908, + 48.664943, + 317.4 + ], + [ + -122.853877, + 48.664916, + 317 + ], + [ + -122.853848, + 48.664891, + 316.9 + ], + [ + -122.853807, + 48.664883, + 318 + ], + [ + -122.853784, + 48.664861, + 318.4 + ], + [ + -122.85375, + 48.664844, + 319.3 + ], + [ + -122.853774, + 48.664822, + 318 + ], + [ + -122.853793, + 48.664794, + 316.6 + ], + [ + -122.853826, + 48.664773, + 314.9 + ], + [ + -122.853875, + 48.664768, + 313.5 + ], + [ + -122.853915, + 48.664755, + 312.2 + ], + [ + -122.853933, + 48.664727, + 311 + ], + [ + -122.853963, + 48.664698, + 309.5 + ], + [ + -122.854004, + 48.664689, + 308.4 + ], + [ + -122.854035, + 48.664668, + 307 + ], + [ + -122.854013, + 48.664644, + 306.8 + ], + [ + -122.853973, + 48.664649, + 307.7 + ], + [ + -122.85393, + 48.664657, + 308.6 + ], + [ + -122.853877, + 48.664659, + 309.9 + ], + [ + -122.853859, + 48.664633, + 309.5 + ], + [ + -122.85387, + 48.664604, + 308.2 + ], + [ + -122.853883, + 48.66457, + 306.6 + ], + [ + -122.853872, + 48.664539, + 306 + ], + [ + -122.853849, + 48.664507, + 305.9 + ], + [ + -122.853838, + 48.664467, + 304.9 + ], + [ + -122.853852, + 48.664439, + 303.5 + ], + [ + -122.853879, + 48.664415, + 301.9 + ], + [ + -122.853875, + 48.664383, + 300.9 + ], + [ + -122.853882, + 48.664346, + 299.6 + ], + [ + -122.853894, + 48.664315, + 298.3 + ], + [ + -122.853899, + 48.664287, + 297.6 + ], + [ + -122.853905, + 48.664252, + 297.1 + ], + [ + -122.853919, + 48.664222, + 296.3 + ], + [ + -122.853926, + 48.664181, + 295.7 + ], + [ + -122.853955, + 48.664142, + 294.8 + ], + [ + -122.853997, + 48.664122, + 293.6 + ], + [ + -122.854036, + 48.664112, + 292.4 + ], + [ + -122.854067, + 48.664091, + 291.2 + ], + [ + -122.854034, + 48.664061, + 291.6 + ], + [ + -122.854042, + 48.664029, + 291.1 + ], + [ + -122.85406, + 48.664001, + 290.5 + ], + [ + -122.854092, + 48.663972, + 289.4 + ], + [ + -122.854108, + 48.663941, + 289 + ], + [ + -122.854127, + 48.663915, + 288.7 + ], + [ + -122.854143, + 48.663887, + 288.5 + ], + [ + -122.854175, + 48.663853, + 288.2 + ], + [ + -122.854209, + 48.663829, + 288 + ], + [ + -122.854254, + 48.663809, + 287.5 + ], + [ + -122.854311, + 48.66379, + 287.4 + ], + [ + -122.854366, + 48.663773, + 287.7 + ], + [ + -122.854412, + 48.663764, + 288.1 + ], + [ + -122.854463, + 48.663762, + 288.8 + ], + [ + -122.854507, + 48.663772, + 289.2 + ], + [ + -122.854536, + 48.663792, + 289.3 + ], + [ + -122.854598, + 48.663789, + 289.4 + ], + [ + -122.854641, + 48.663781, + 289.1 + ], + [ + -122.854683, + 48.663773, + 287.7 + ], + [ + -122.854727, + 48.66377, + 286.2 + ], + [ + -122.854778, + 48.663774, + 285.2 + ], + [ + -122.854803, + 48.663802, + 284.7 + ], + [ + -122.854824, + 48.663829, + 284.3 + ], + [ + -122.854874, + 48.663843, + 283.1 + ], + [ + -122.854935, + 48.66385, + 281.8 + ], + [ + -122.854971, + 48.663867, + 281.4 + ], + [ + -122.855013, + 48.663877, + 281.2 + ], + [ + -122.85507, + 48.66388, + 281 + ], + [ + -122.855113, + 48.663877, + 280.5 + ], + [ + -122.855155, + 48.663877, + 279.7 + ], + [ + -122.8552, + 48.663883, + 278.9 + ], + [ + -122.855249, + 48.663908, + 278.8 + ], + [ + -122.855272, + 48.663932, + 278.9 + ], + [ + -122.85528, + 48.663962, + 279.4 + ], + [ + -122.855312, + 48.663985, + 279.5 + ], + [ + -122.855361, + 48.663982, + 278.9 + ], + [ + -122.855329, + 48.664005, + 279.7 + ], + [ + -122.855265, + 48.664021, + 281 + ], + [ + -122.855236, + 48.664, + 280.8 + ], + [ + -122.855221, + 48.663974, + 280.2 + ], + [ + -122.855219, + 48.663944, + 279.6 + ], + [ + -122.855216, + 48.663913, + 279.2 + ], + [ + -122.855224, + 48.66387, + 278.5 + ], + [ + -122.855239, + 48.663838, + 278 + ], + [ + -122.855242, + 48.66381, + 277.5 + ], + [ + -122.855236, + 48.663779, + 277.1 + ], + [ + -122.855215, + 48.663749, + 276.6 + ], + [ + -122.855208, + 48.663722, + 276.2 + ], + [ + -122.855173, + 48.663696, + 275.8 + ], + [ + -122.855158, + 48.663668, + 275.7 + ], + [ + -122.855125, + 48.663646, + 275.7 + ], + [ + -122.855088, + 48.663618, + 275.9 + ], + [ + -122.855063, + 48.663588, + 275.9 + ], + [ + -122.855059, + 48.663552, + 275.3 + ], + [ + -122.855022, + 48.663539, + 275.6 + ], + [ + -122.855011, + 48.663498, + 275 + ], + [ + -122.855015, + 48.663467, + 274.5 + ], + [ + -122.85503, + 48.66342, + 274.2 + ], + [ + -122.85503, + 48.66338, + 274.2 + ], + [ + -122.855034, + 48.66334, + 274.1 + ], + [ + -122.855032, + 48.663304, + 274 + ], + [ + -122.855039, + 48.663277, + 273.6 + ], + [ + -122.855044, + 48.663249, + 273 + ], + [ + -122.855046, + 48.663217, + 272.2 + ], + [ + -122.855, + 48.663213, + 272.5 + ], + [ + -122.854966, + 48.663188, + 272.1 + ], + [ + -122.854915, + 48.663179, + 271.8 + ], + [ + -122.85487, + 48.663168, + 270.1 + ], + [ + -122.854818, + 48.663173, + 269.7 + ], + [ + -122.854774, + 48.663163, + 270.1 + ], + [ + -122.85477, + 48.66312, + 267.2 + ], + [ + -122.854761, + 48.663088, + 266.5 + ], + [ + -122.85473, + 48.663063, + 266.1 + ], + [ + -122.854702, + 48.663037, + 266 + ], + [ + -122.854701, + 48.663009, + 265.5 + ], + [ + -122.854644, + 48.662987, + 266.1 + ], + [ + -122.854617, + 48.662958, + 265.9 + ], + [ + -122.854577, + 48.662944, + 266.5 + ], + [ + -122.854577, + 48.662912, + 265.3 + ], + [ + -122.854574, + 48.662872, + 264.3 + ], + [ + -122.854575, + 48.662833, + 264.1 + ], + [ + -122.854585, + 48.662802, + 264.4 + ], + [ + -122.854568, + 48.662775, + 264.4 + ], + [ + -122.854521, + 48.662785, + 263.4 + ], + [ + -122.854467, + 48.662785, + 263.9 + ], + [ + -122.854455, + 48.662756, + 263.4 + ], + [ + -122.854423, + 48.662725, + 262.8 + ], + [ + -122.854399, + 48.662698, + 262.8 + ], + [ + -122.854357, + 48.662702, + 262.7 + ], + [ + -122.854319, + 48.662712, + 263.5 + ], + [ + -122.854261, + 48.662708, + 264.8 + ], + [ + -122.854216, + 48.662708, + 266.3 + ], + [ + -122.854158, + 48.662725, + 269 + ], + [ + -122.854112, + 48.662721, + 270.2 + ], + [ + -122.854085, + 48.662693, + 269.2 + ], + [ + -122.854076, + 48.662652, + 266.6 + ], + [ + -122.854081, + 48.662613, + 263.6 + ], + [ + -122.854082, + 48.662583, + 261.8 + ], + [ + -122.854086, + 48.662546, + 261.5 + ], + [ + -122.854087, + 48.662517, + 262.6 + ], + [ + -122.854086, + 48.662474, + 263.1 + ], + [ + -122.854087, + 48.662424, + 261.7 + ], + [ + -122.85409, + 48.662397, + 260.1 + ], + [ + -122.854085, + 48.662363, + 257.6 + ], + [ + -122.854078, + 48.662327, + 254.5 + ], + [ + -122.854074, + 48.662294, + 252 + ], + [ + -122.85407, + 48.662262, + 249.8 + ], + [ + -122.854068, + 48.662228, + 247.6 + ], + [ + -122.854078, + 48.662189, + 245.7 + ], + [ + -122.854116, + 48.662173, + 246 + ], + [ + -122.854153, + 48.662153, + 246.1 + ], + [ + -122.854194, + 48.662136, + 246.6 + ], + [ + -122.854232, + 48.662115, + 246.6 + ], + [ + -122.854275, + 48.662101, + 247.4 + ], + [ + -122.854319, + 48.66209, + 248.4 + ], + [ + -122.854361, + 48.662075, + 248.9 + ], + [ + -122.854407, + 48.662062, + 249.5 + ], + [ + -122.854442, + 48.662038, + 249.2 + ], + [ + -122.854468, + 48.662016, + 248.9 + ], + [ + -122.854503, + 48.661988, + 248.5 + ], + [ + -122.854543, + 48.661972, + 249 + ], + [ + -122.854588, + 48.661965, + 250 + ], + [ + -122.854622, + 48.661988, + 251.8 + ], + [ + -122.854626, + 48.662016, + 252.9 + ], + [ + -122.854595, + 48.662059, + 253.7 + ], + [ + -122.854579, + 48.662094, + 254.8 + ], + [ + -122.854547, + 48.662124, + 255.9 + ], + [ + -122.85451, + 48.662148, + 257 + ], + [ + -122.854469, + 48.662163, + 257 + ], + [ + -122.854435, + 48.662187, + 257.9 + ], + [ + -122.854403, + 48.662211, + 259.2 + ], + [ + -122.854354, + 48.662219, + 258.6 + ], + [ + -122.854315, + 48.66219, + 254.5 + ], + [ + -122.854308, + 48.662145, + 251.1 + ], + [ + -122.854295, + 48.662113, + 248.7 + ], + [ + -122.854318, + 48.662087, + 248.2 + ], + [ + -122.854337, + 48.662045, + 246.8 + ], + [ + -122.854363, + 48.662015, + 246.2 + ], + [ + -122.854398, + 48.661988, + 245.9 + ], + [ + -122.854425, + 48.661962, + 245.6 + ], + [ + -122.854452, + 48.661926, + 244.7 + ], + [ + -122.854478, + 48.661894, + 244 + ], + [ + -122.854509, + 48.661857, + 242.9 + ], + [ + -122.854546, + 48.661839, + 242.9 + ], + [ + -122.854585, + 48.661811, + 242.4 + ], + [ + -122.85461, + 48.661777, + 241.5 + ], + [ + -122.854606, + 48.661746, + 239.8 + ], + [ + -122.854566, + 48.661738, + 238.4 + ], + [ + -122.854579, + 48.661707, + 237.5 + ], + [ + -122.854607, + 48.661679, + 237.2 + ], + [ + -122.854636, + 48.661642, + 236.4 + ], + [ + -122.854659, + 48.661618, + 236 + ], + [ + -122.854685, + 48.661593, + 235.7 + ], + [ + -122.85475, + 48.661575, + 236.3 + ], + [ + -122.854788, + 48.661567, + 236.6 + ], + [ + -122.854809, + 48.661532, + 235.8 + ], + [ + -122.854831, + 48.661503, + 235.4 + ], + [ + -122.854864, + 48.661476, + 235.2 + ], + [ + -122.854898, + 48.66146, + 235.5 + ], + [ + -122.854935, + 48.661436, + 235.7 + ], + [ + -122.85497, + 48.661397, + 235.1 + ], + [ + -122.854978, + 48.66137, + 234.6 + ], + [ + -122.854985, + 48.661342, + 234.3 + ], + [ + -122.855018, + 48.661319, + 234.3 + ], + [ + -122.855033, + 48.661262, + 234 + ], + [ + -122.855037, + 48.661246, + 234.1 + ], + [ + -122.855057, + 48.661217, + 234.2 + ], + [ + -122.855094, + 48.661182, + 234 + ], + [ + -122.855116, + 48.661159, + 233.8 + ], + [ + -122.855134, + 48.661127, + 233.6 + ], + [ + -122.855154, + 48.661102, + 233.4 + ], + [ + -122.855181, + 48.661077, + 232.9 + ], + [ + -122.855208, + 48.661055, + 232.4 + ], + [ + -122.855233, + 48.661033, + 231.6 + ], + [ + -122.855268, + 48.661008, + 230.5 + ], + [ + -122.855284, + 48.660975, + 229.9 + ], + [ + -122.855308, + 48.660952, + 229.1 + ], + [ + -122.85534, + 48.660929, + 228.1 + ], + [ + -122.855382, + 48.660903, + 226.8 + ], + [ + -122.855404, + 48.660879, + 226 + ], + [ + -122.855443, + 48.660849, + 224.3 + ], + [ + -122.855473, + 48.660828, + 222.9 + ], + [ + -122.855541, + 48.66081, + 221.2 + ], + [ + -122.855582, + 48.660793, + 220.5 + ], + [ + -122.855596, + 48.66076, + 219.3 + ], + [ + -122.855613, + 48.660724, + 218.6 + ], + [ + -122.855642, + 48.6607, + 218.4 + ], + [ + -122.855678, + 48.660661, + 217.7 + ], + [ + -122.855707, + 48.660641, + 217 + ], + [ + -122.855705, + 48.660605, + 215.7 + ], + [ + -122.855704, + 48.660574, + 214.9 + ], + [ + -122.855726, + 48.66055, + 214.3 + ], + [ + -122.855749, + 48.660527, + 213.8 + ], + [ + -122.855764, + 48.6605, + 213.6 + ], + [ + -122.855781, + 48.66047, + 213.5 + ], + [ + -122.855783, + 48.660441, + 213.5 + ], + [ + -122.855802, + 48.6604, + 213.2 + ], + [ + -122.855814, + 48.660362, + 212.8 + ], + [ + -122.855836, + 48.66033, + 212.6 + ], + [ + -122.855877, + 48.660321, + 212.5 + ], + [ + -122.855929, + 48.660309, + 212.4 + ], + [ + -122.855957, + 48.660284, + 211.9 + ], + [ + -122.855986, + 48.660247, + 211.3 + ], + [ + -122.856012, + 48.660215, + 210.6 + ], + [ + -122.856045, + 48.660186, + 209.7 + ], + [ + -122.856078, + 48.660166, + 208.9 + ], + [ + -122.856132, + 48.660144, + 208.5 + ], + [ + -122.856182, + 48.660133, + 208.4 + ], + [ + -122.856226, + 48.660112, + 208.4 + ], + [ + -122.856289, + 48.660084, + 208.8 + ], + [ + -122.856326, + 48.660071, + 209.3 + ], + [ + -122.856366, + 48.660065, + 210.1 + ], + [ + -122.856417, + 48.660057, + 210.7 + ], + [ + -122.85646, + 48.660055, + 210.5 + ], + [ + -122.856518, + 48.660054, + 209.1 + ], + [ + -122.856587, + 48.660055, + 206.7 + ], + [ + -122.856635, + 48.660054, + 205.4 + ], + [ + -122.856692, + 48.660054, + 204.8 + ], + [ + -122.856742, + 48.66006, + 205.4 + ], + [ + -122.856785, + 48.660037, + 204.9 + ], + [ + -122.856789, + 48.660071, + 206.3 + ], + [ + -122.856811, + 48.660096, + 207.4 + ], + [ + -122.856786, + 48.660126, + 208.5 + ], + [ + -122.856755, + 48.660153, + 209.2 + ], + [ + -122.856708, + 48.660165, + 209.5 + ], + [ + -122.856659, + 48.660172, + 209.6 + ], + [ + -122.856594, + 48.660176, + 210 + ], + [ + -122.856532, + 48.660175, + 210.9 + ], + [ + -122.856489, + 48.660173, + 211.2 + ], + [ + -122.856449, + 48.660163, + 211 + ], + [ + -122.856405, + 48.660146, + 210.6 + ], + [ + -122.856392, + 48.660114, + 209.9 + ], + [ + -122.856404, + 48.660078, + 210.4 + ], + [ + -122.856415, + 48.660046, + 210.9 + ], + [ + -122.856428, + 48.660012, + 211.3 + ], + [ + -122.856447, + 48.659985, + 211.3 + ], + [ + -122.856473, + 48.659963, + 211.2 + ], + [ + -122.856453, + 48.65993, + 211.4 + ], + [ + -122.856417, + 48.659913, + 211.6 + ], + [ + -122.85641, + 48.659881, + 211.2 + ], + [ + -122.856405, + 48.659842, + 210.2 + ], + [ + -122.856387, + 48.659812, + 209.9 + ], + [ + -122.85637, + 48.659786, + 209.6 + ], + [ + -122.856366, + 48.659759, + 208.9 + ], + [ + -122.856334, + 48.659733, + 208.3 + ], + [ + -122.856292, + 48.659721, + 207.9 + ], + [ + -122.85625, + 48.659714, + 207.6 + ], + [ + -122.856208, + 48.65971, + 207.5 + ], + [ + -122.856167, + 48.659685, + 207 + ], + [ + -122.856134, + 48.659652, + 206.1 + ], + [ + -122.856104, + 48.659626, + 205.5 + ], + [ + -122.856057, + 48.659606, + 205.1 + ], + [ + -122.856011, + 48.659602, + 205.4 + ], + [ + -122.855958, + 48.659599, + 205.8 + ], + [ + -122.855911, + 48.659595, + 206.2 + ], + [ + -122.855867, + 48.659572, + 205.9 + ], + [ + -122.855822, + 48.659562, + 205.5 + ], + [ + -122.855782, + 48.659551, + 205.2 + ], + [ + -122.855727, + 48.659557, + 205.5 + ], + [ + -122.855684, + 48.659559, + 205.5 + ], + [ + -122.855639, + 48.659564, + 205.1 + ], + [ + -122.855592, + 48.65957, + 204.6 + ], + [ + -122.855545, + 48.65957, + 204 + ], + [ + -122.855503, + 48.659581, + 204 + ], + [ + -122.855451, + 48.65959, + 204 + ], + [ + -122.855409, + 48.659569, + 203.5 + ], + [ + -122.855374, + 48.659553, + 202.7 + ], + [ + -122.855324, + 48.659542, + 202.1 + ], + [ + -122.855287, + 48.659555, + 202.9 + ], + [ + -122.855246, + 48.65956, + 202.9 + ], + [ + -122.855202, + 48.659571, + 203 + ], + [ + -122.855163, + 48.659586, + 203.1 + ], + [ + -122.855116, + 48.659607, + 203.1 + ], + [ + -122.855072, + 48.659616, + 202.5 + ], + [ + -122.855021, + 48.659624, + 202.1 + ], + [ + -122.854972, + 48.659635, + 202.1 + ], + [ + -122.854938, + 48.659653, + 202.7 + ], + [ + -122.854904, + 48.65967, + 203.1 + ], + [ + -122.854871, + 48.65969, + 203.3 + ], + [ + -122.854818, + 48.659695, + 201.5 + ], + [ + -122.854772, + 48.6597, + 199.8 + ], + [ + -122.854739, + 48.659678, + 198 + ], + [ + -122.854705, + 48.659654, + 196.2 + ], + [ + -122.854682, + 48.659631, + 195 + ], + [ + -122.854639, + 48.659612, + 194.1 + ], + [ + -122.854592, + 48.659604, + 195.5 + ], + [ + -122.854549, + 48.659593, + 197.3 + ], + [ + -122.854519, + 48.659574, + 198.3 + ], + [ + -122.854486, + 48.659545, + 197.5 + ], + [ + -122.85444, + 48.659532, + 196.8 + ], + [ + -122.854391, + 48.659519, + 196 + ], + [ + -122.854343, + 48.659494, + 195.1 + ], + [ + -122.854304, + 48.659463, + 193.8 + ], + [ + -122.854264, + 48.659454, + 193.3 + ], + [ + -122.854214, + 48.659461, + 193.1 + ], + [ + -122.854172, + 48.659472, + 193.1 + ], + [ + -122.854136, + 48.659487, + 193.2 + ], + [ + -122.854095, + 48.659481, + 192.8 + ], + [ + -122.854068, + 48.659455, + 192.4 + ], + [ + -122.85403, + 48.659439, + 192.5 + ], + [ + -122.853975, + 48.659425, + 192.6 + ], + [ + -122.853932, + 48.659417, + 192.7 + ], + [ + -122.853876, + 48.659412, + 192.4 + ], + [ + -122.853837, + 48.659398, + 191.8 + ], + [ + -122.853795, + 48.659383, + 191.5 + ], + [ + -122.853754, + 48.659364, + 191.5 + ], + [ + -122.853719, + 48.659346, + 192.1 + ], + [ + -122.853688, + 48.659323, + 192.5 + ], + [ + -122.853669, + 48.659293, + 192.2 + ], + [ + -122.853676, + 48.65926, + 191.6 + ], + [ + -122.853688, + 48.65922, + 191 + ], + [ + -122.853664, + 48.659191, + 189.9 + ], + [ + -122.853635, + 48.659163, + 188.6 + ], + [ + -122.853634, + 48.659131, + 187.3 + ], + [ + -122.853624, + 48.659102, + 186.3 + ], + [ + -122.853582, + 48.659102, + 186.5 + ], + [ + -122.853568, + 48.659067, + 185.4 + ], + [ + -122.853536, + 48.659051, + 185.4 + ], + [ + -122.853493, + 48.659032, + 185 + ], + [ + -122.853457, + 48.659018, + 184.7 + ], + [ + -122.853416, + 48.65901, + 184.6 + ], + [ + -122.853387, + 48.658991, + 184.1 + ], + [ + -122.853359, + 48.65897, + 183.7 + ], + [ + -122.853338, + 48.658941, + 183.2 + ], + [ + -122.8533, + 48.658919, + 183.3 + ], + [ + -122.853289, + 48.658885, + 182.9 + ], + [ + -122.853268, + 48.658854, + 182.8 + ], + [ + -122.853229, + 48.658832, + 183.6 + ], + [ + -122.853224, + 48.658802, + 183.5 + ], + [ + -122.853253, + 48.658768, + 182.5 + ], + [ + -122.853276, + 48.658741, + 181.6 + ], + [ + -122.853262, + 48.658711, + 181.7 + ], + [ + -122.853235, + 48.65869, + 181.8 + ], + [ + -122.853187, + 48.658695, + 182.6 + ], + [ + -122.853146, + 48.658692, + 182.8 + ], + [ + -122.853125, + 48.658667, + 182.1 + ], + [ + -122.853116, + 48.658634, + 181.2 + ], + [ + -122.853126, + 48.658605, + 180.1 + ], + [ + -122.853104, + 48.658576, + 179.2 + ], + [ + -122.853068, + 48.658551, + 178.8 + ], + [ + -122.853037, + 48.658521, + 178.2 + ], + [ + -122.852996, + 48.658512, + 178.7 + ], + [ + -122.852943, + 48.658512, + 179.7 + ], + [ + -122.852902, + 48.658501, + 179.9 + ], + [ + -122.852871, + 48.658483, + 179.6 + ], + [ + -122.852829, + 48.65848, + 180.3 + ], + [ + -122.852796, + 48.658461, + 179.7 + ], + [ + -122.852765, + 48.658431, + 178.2 + ], + [ + -122.852732, + 48.658402, + 176.6 + ], + [ + -122.852686, + 48.658389, + 175.9 + ], + [ + -122.852656, + 48.658366, + 174.4 + ], + [ + -122.852627, + 48.658343, + 172.9 + ], + [ + -122.852561, + 48.658331, + 172.5 + ], + [ + -122.852521, + 48.658309, + 171.3 + ], + [ + -122.85249, + 48.658283, + 170.1 + ], + [ + -122.852464, + 48.658261, + 169.3 + ], + [ + -122.852461, + 48.658222, + 168.4 + ], + [ + -122.852435, + 48.658194, + 168.5 + ], + [ + -122.8524, + 48.658161, + 168.8 + ], + [ + -122.852373, + 48.65812, + 168.8 + ], + [ + -122.852377, + 48.658088, + 168.7 + ], + [ + -122.852346, + 48.658061, + 169.3 + ], + [ + -122.852373, + 48.658037, + 169 + ], + [ + -122.852402, + 48.658013, + 168.5 + ], + [ + -122.852463, + 48.658, + 167.7 + ], + [ + -122.852522, + 48.657996, + 167 + ], + [ + -122.852583, + 48.657996, + 166.6 + ], + [ + -122.852638, + 48.657987, + 166.1 + ], + [ + -122.852692, + 48.657988, + 165.1 + ], + [ + -122.852748, + 48.657982, + 164.2 + ], + [ + -122.852792, + 48.657974, + 163.7 + ], + [ + -122.852835, + 48.657961, + 163.2 + ], + [ + -122.852882, + 48.657957, + 162.7 + ], + [ + -122.852924, + 48.657945, + 162.7 + ], + [ + -122.852954, + 48.657919, + 163.1 + ], + [ + -122.852973, + 48.657893, + 163.2 + ], + [ + -122.853022, + 48.657886, + 162.6 + ], + [ + -122.853062, + 48.657872, + 162.5 + ], + [ + -122.853096, + 48.657853, + 162.7 + ], + [ + -122.853145, + 48.657828, + 162.6 + ], + [ + -122.85317, + 48.657814, + 162.2 + ], + [ + -122.853175, + 48.657782, + 162.6 + ], + [ + -122.85322, + 48.657771, + 161.3 + ], + [ + -122.853258, + 48.657744, + 160.2 + ], + [ + -122.853258, + 48.657715, + 160.1 + ], + [ + -122.853289, + 48.657696, + 158.8 + ], + [ + -122.853323, + 48.657675, + 157.4 + ], + [ + -122.853373, + 48.657662, + 155.6 + ], + [ + -122.853385, + 48.657625, + 155.3 + ], + [ + -122.853395, + 48.65758, + 154.9 + ], + [ + -122.853395, + 48.657534, + 154.7 + ], + [ + -122.853397, + 48.657502, + 154.7 + ], + [ + -122.853443, + 48.657507, + 153.8 + ], + [ + -122.85347, + 48.657484, + 153.1 + ], + [ + -122.853497, + 48.657454, + 152.8 + ], + [ + -122.853552, + 48.657439, + 151.8 + ], + [ + -122.853593, + 48.657426, + 150.6 + ], + [ + -122.853611, + 48.657394, + 150.5 + ], + [ + -122.853618, + 48.657364, + 150.5 + ], + [ + -122.853626, + 48.657337, + 150.6 + ], + [ + -122.853648, + 48.657313, + 150.2 + ], + [ + -122.853666, + 48.657285, + 149.8 + ], + [ + -122.85369, + 48.657255, + 149.2 + ], + [ + -122.853724, + 48.657236, + 148.1 + ], + [ + -122.853762, + 48.657197, + 147.1 + ], + [ + -122.853803, + 48.657176, + 146.1 + ], + [ + -122.853835, + 48.657151, + 145.3 + ], + [ + -122.853885, + 48.657152, + 142.9 + ], + [ + -122.85391, + 48.657188, + 141.4 + ], + [ + -122.853939, + 48.657212, + 140.2 + ], + [ + -122.853979, + 48.657218, + 138.4 + ], + [ + -122.854021, + 48.657228, + 136.3 + ], + [ + -122.854059, + 48.657262, + 134.2 + ], + [ + -122.854078, + 48.657288, + 132.9 + ], + [ + -122.854093, + 48.657315, + 131.8 + ], + [ + -122.854105, + 48.657341, + 130.8 + ], + [ + -122.854125, + 48.657377, + 129.5 + ], + [ + -122.854136, + 48.657412, + 128.6 + ], + [ + -122.854143, + 48.65744, + 128 + ], + [ + -122.854101, + 48.657444, + 130 + ], + [ + -122.854058, + 48.657447, + 132.2 + ], + [ + -122.85409, + 48.657467, + 130.6 + ], + [ + -122.854103, + 48.657495, + 129.8 + ], + [ + -122.854113, + 48.657529, + 129.1 + ], + [ + -122.854125, + 48.657559, + 128.5 + ], + [ + -122.854164, + 48.657577, + 127 + ], + [ + -122.854203, + 48.657563, + 125.7 + ], + [ + -122.854165, + 48.657574, + 127 + ], + [ + -122.854194, + 48.657593, + 126.3 + ], + [ + -122.854237, + 48.657621, + 126.2 + ], + [ + -122.854279, + 48.657648, + 126.3 + ], + [ + -122.854304, + 48.657675, + 126.7 + ], + [ + -122.854342, + 48.657703, + 125.5 + ], + [ + -122.854377, + 48.657723, + 124.5 + ], + [ + -122.854421, + 48.657747, + 124.6 + ], + [ + -122.85446, + 48.657735, + 124 + ], + [ + -122.854502, + 48.657757, + 124.6 + ], + [ + -122.85455, + 48.657778, + 125.4 + ], + [ + -122.854597, + 48.657804, + 126.2 + ], + [ + -122.854632, + 48.657827, + 126.5 + ], + [ + -122.854603, + 48.657848, + 126.1 + ], + [ + -122.854574, + 48.657872, + 126.3 + ], + [ + -122.854595, + 48.65792, + 127.5 + ], + [ + -122.854562, + 48.657938, + 128.5 + ], + [ + -122.854609, + 48.657955, + 128.5 + ], + [ + -122.85465, + 48.657952, + 127.7 + ], + [ + -122.854661, + 48.657925, + 127.6 + ], + [ + -122.854649, + 48.657896, + 127.1 + ], + [ + -122.854614, + 48.65788, + 126.6 + ], + [ + -122.854576, + 48.657864, + 126.2 + ], + [ + -122.854532, + 48.657866, + 126.3 + ], + [ + -122.854489, + 48.657887, + 127.6 + ], + [ + -122.85444, + 48.657874, + 128.5 + ], + [ + -122.854385, + 48.657861, + 129.8 + ], + [ + -122.854378, + 48.657827, + 128.8 + ], + [ + -122.854406, + 48.65778, + 125.7 + ], + [ + -122.854431, + 48.657729, + 124.1 + ], + [ + -122.854438, + 48.65769, + 123.2 + ], + [ + -122.854428, + 48.657654, + 122.6 + ], + [ + -122.854408, + 48.657625, + 122.3 + ], + [ + -122.854368, + 48.65761, + 122.6 + ], + [ + -122.854366, + 48.657574, + 122.4 + ], + [ + -122.854341, + 48.657539, + 122.9 + ], + [ + -122.854319, + 48.657513, + 123 + ], + [ + -122.854286, + 48.657483, + 123 + ], + [ + -122.85429, + 48.65745, + 122.6 + ], + [ + -122.854306, + 48.657416, + 122.2 + ], + [ + -122.854314, + 48.657388, + 122 + ], + [ + -122.854347, + 48.657343, + 120.9 + ], + [ + -122.854366, + 48.657312, + 120.1 + ], + [ + -122.854379, + 48.657281, + 119.8 + ], + [ + -122.854391, + 48.657233, + 119.6 + ], + [ + -122.854402, + 48.657188, + 119.1 + ], + [ + -122.854408, + 48.657141, + 118.7 + ], + [ + -122.854407, + 48.657105, + 118.4 + ], + [ + -122.854421, + 48.657079, + 118.1 + ], + [ + -122.854448, + 48.657052, + 117.7 + ], + [ + -122.854477, + 48.65703, + 117.5 + ], + [ + -122.854471, + 48.656993, + 117.8 + ], + [ + -122.854492, + 48.656956, + 117.1 + ], + [ + -122.854525, + 48.656938, + 116.6 + ], + [ + -122.854548, + 48.656912, + 116.4 + ], + [ + -122.854569, + 48.656881, + 116 + ], + [ + -122.854595, + 48.65685, + 115.7 + ], + [ + -122.854609, + 48.656824, + 115.5 + ], + [ + -122.854611, + 48.656785, + 115.2 + ], + [ + -122.854615, + 48.65675, + 115 + ], + [ + -122.854619, + 48.656718, + 114.9 + ], + [ + -122.854631, + 48.656685, + 114.8 + ], + [ + -122.854649, + 48.65666, + 114.7 + ], + [ + -122.854691, + 48.656658, + 114.6 + ], + [ + -122.854752, + 48.656673, + 114.5 + ], + [ + -122.85482, + 48.656664, + 114.6 + ] + ], + "type": "LineString" + }, + "properties": { + "name": "Moran State Park Western Boundary Hike", + "time": "2015-04-18T15:51:49Z" + }, + "type": "Feature" + } + ], + "type": "FeatureCollection" +} diff --git a/ios/app/threestates.geojson b/ios/app/threestates.geojson new file mode 100644 index 0000000000..9b70388782 --- /dev/null +++ b/ios/app/threestates.geojson @@ -0,0 +1,1612 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "geometry": { + "coordinates": [ + [ + [ + -75.80260539153913, + 39.722485154715464 + ], + [ + -75.76669272327231, + 39.722485154715464 + ], + [ + -75.76669272327231, + 39.765510893789376 + ], + [ + -75.73078005500548, + 39.765510893789376 + ], + [ + -75.73078005500548, + 39.79132633723372 + ], + [ + -75.69486738673865, + 39.79132633723372 + ], + [ + -75.69486738673865, + 39.817141780678064 + ], + [ + -75.623042050205, + 39.834352076307624 + ], + [ + -75.47939137713769, + 39.834352076307624 + ], + [ + -75.44347870887087, + 39.80853663286328 + ], + [ + -75.40756604060404, + 39.80853663286328 + ], + [ + -75.40756604060404, + 39.799931485048496 + ], + [ + -75.44347870887087, + 39.79132633723372 + ], + [ + -75.44347870887087, + 39.765510893789376 + ], + [ + -75.47939137713769, + 39.765510893789376 + ], + [ + -75.47939137713769, + 39.69666971127112 + ], + [ + -75.51530404540452, + 39.69666971127112 + ], + [ + -75.51530404540452, + 39.64503882438243 + ], + [ + -75.55121671367135, + 39.64503882438243 + ], + [ + -75.55121671367135, + 39.593407937493744 + ], + [ + -75.51530404540452, + 39.58480278967896 + ], + [ + -75.51530404540452, + 39.541777050605056 + ], + [ + -75.51530404540452, + 39.498751311531144 + ], + [ + -75.55121671367135, + 39.498751311531144 + ], + [ + -75.55121671367135, + 39.429910129012896 + ], + [ + -75.51530404540452, + 39.429910129012896 + ], + [ + -75.51530404540452, + 39.40409468556855 + ], + [ + -75.47939137713769, + 39.39548953775377 + ], + [ + -75.47939137713769, + 39.369674094309424 + ], + [ + -75.44347870887087, + 39.36106894649464 + ], + [ + -75.44347870887087, + 39.335253503050296 + ], + [ + -75.40756604060404, + 39.335253503050296 + ], + [ + -75.40756604060404, + 39.30943805960595 + ], + [ + -75.33574070407039, + 39.27501746834683 + ], + [ + -75.33574070407039, + 39.24920202490249 + ], + [ + -75.29982803580356, + 39.24920202490249 + ], + [ + -75.29982803580356, + 39.206176285828576 + ], + [ + -75.26391536753674, + 39.188965990199016 + ], + [ + -75.26391536753674, + 39.15454539893989 + ], + [ + -75.22800269926991, + 39.15454539893989 + ], + [ + -75.22800269926991, + 39.111519659865984 + ], + [ + -75.19209003100308, + 39.06849392079207 + ], + [ + -75.15617736273626, + 39.05988877297729 + ], + [ + -75.15617736273626, + 38.999652738273824 + ], + [ + -75.12026469446943, + 38.999652738273824 + ], + [ + -75.12026469446943, + 38.965232147014696 + ], + [ + -75.0843520262026, + 38.91360126012601 + ], + [ + -75.0843520262026, + 38.87918066886688 + ], + [ + -75.04843935793578, + 38.87918066886688 + ], + [ + -75.04843935793578, + 38.836154929792976 + ], + [ + -75.01252668966895, + 38.80173433853385 + ], + [ + -75.01252668966895, + 38.78452404290429 + ], + [ + -75.01252668966895, + 38.612421086608656 + ], + [ + -74.97661402140213, + 38.612421086608656 + ], + [ + -74.97661402140213, + 38.44892327812781 + ], + [ + -75.44347870887087, + 38.44892327812781 + ], + [ + -75.44347870887087, + 38.45752842594259 + ], + [ + -75.69486738673865, + 38.45752842594259 + ], + [ + -75.69486738673865, + 38.69847256475647 + ], + [ + -75.73078005500548, + 38.70707771257125 + ], + [ + -75.73078005500548, + 39.145940251125104 + ], + [ + -75.76669272327231, + 39.15454539893989 + ], + [ + -75.76669272327231, + 39.593407937493744 + ], + [ + -75.80260539153913, + 39.60201308530853 + ], + [ + -75.80260539153913, + 39.722485154715464 + ] + ] + ], + "type": "Polygon" + }, + "properties": { + "NAME": "Delaware" + }, + "type": "Feature" + }, + { + "geometry": { + "coordinates": [ + [ + [ + -80.50716493449343, + 40.634630823082304 + ], + [ + -80.50716493449343, + 42.32984494259426 + ], + [ + -80.36351426142612, + 42.34705523822382 + ], + [ + -80.18395092009199, + 42.381475829482945 + ], + [ + -80.0762129152915, + 42.39008097729772 + ], + [ + -80.00438757875786, + 42.42450156855685 + ], + [ + -79.7889115691569, + 42.50194789888988 + ], + [ + -79.75299890089008, + 42.51915819451945 + ], + [ + -79.75299890089008, + 42.00284932563255 + ], + [ + -79.53752289128911, + 42.00284932563255 + ], + [ + -79.50161022302228, + 41.99424417781778 + ], + [ + -79.42978488648863, + 42.00284932563255 + ], + [ + -78.96292019901988, + 42.00284932563255 + ], + [ + -78.92700753075306, + 41.99424417781778 + ], + [ + -78.7115315211521, + 41.99424417781778 + ], + [ + -78.7115315211521, + 42.00284932563255 + ], + [ + -77.92145281928191, + 42.00284932563255 + ], + [ + -77.92145281928191, + 41.99424417781778 + ], + [ + -77.81371481448143, + 41.99424417781778 + ], + [ + -77.74188947794778, + 42.00284932563255 + ], + [ + -77.16728678567856, + 42.00284932563255 + ], + [ + -76.37720808380836, + 42.00284932563255 + ], + [ + -76.37720808380836, + 41.99424417781778 + ], + [ + -76.19764474247422, + 41.99424417781778 + ], + [ + -76.1617320742074, + 42.00284932563255 + ], + [ + -75.87443072807278, + 42.00284932563255 + ], + [ + -75.83851805980596, + 41.99424417781778 + ], + [ + -75.65895471847183, + 41.99424417781778 + ], + [ + -75.623042050205, + 42.00284932563255 + ], + [ + -75.37165337233722, + 42.00284932563255 + ], + [ + -75.33574070407039, + 41.99424417781778 + ], + [ + -75.33574070407039, + 41.951218438743865 + ], + [ + -75.26391536753674, + 41.94261329092909 + ], + [ + -75.26391536753674, + 41.865166960596056 + ], + [ + -75.22800269926991, + 41.865166960596056 + ], + [ + -75.19209003100308, + 41.865166960596056 + ], + [ + -75.19209003100308, + 41.87377210841083 + ], + [ + -75.19209003100308, + 41.865166960596056 + ], + [ + -75.19209003100308, + 41.87377210841083 + ], + [ + -75.15617736273626, + 41.87377210841083 + ], + [ + -75.15617736273626, + 41.84795666496649 + ], + [ + -75.12026469446943, + 41.84795666496649 + ], + [ + -75.12026469446943, + 41.822141221522145 + ], + [ + -75.0843520262026, + 41.822141221522145 + ], + [ + -75.0843520262026, + 41.78772063026302 + ], + [ + -75.12026469446943, + 41.77051033463346 + ], + [ + -75.04843935793578, + 41.77051033463346 + ], + [ + -75.04843935793578, + 41.563986787078704 + ], + [ + -75.01252668966895, + 41.563986787078704 + ], + [ + -75.01252668966895, + 41.51235590019001 + ], + [ + -74.97661402140213, + 41.51235590019001 + ], + [ + -74.97661402140213, + 41.47793530893089 + ], + [ + -74.9407013531353, + 41.47793530893089 + ], + [ + -74.90478868486846, + 41.47793530893089 + ], + [ + -74.90478868486846, + 41.43490956985698 + ], + [ + -74.83296334833481, + 41.44351471767176 + ], + [ + -74.79705068006798, + 41.4263044220422 + ], + [ + -74.72522534353433, + 41.43490956985698 + ], + [ + -74.72522534353433, + 41.37467353515351 + ], + [ + -74.6893126752675, + 41.357463239523945 + ], + [ + -74.76113801180117, + 41.34885809170916 + ], + [ + -74.76113801180117, + 41.32304264826482 + ], + [ + -74.79705068006798, + 41.32304264826482 + ], + [ + -74.79705068006798, + 41.29722720482047 + ], + [ + -74.83296334833481, + 41.29722720482047 + ], + [ + -74.83296334833481, + 41.25420146574657 + ], + [ + -74.86887601660165, + 41.25420146574657 + ], + [ + -74.86887601660165, + 41.176755135413536 + ], + [ + -74.90478868486846, + 41.176755135413536 + ], + [ + -74.90478868486846, + 41.14233454415441 + ], + [ + -74.9407013531353, + 41.14233454415441 + ], + [ + -74.9407013531353, + 41.116519100710065 + ], + [ + -74.97661402140213, + 41.099308805080504 + ], + [ + -74.97661402140213, + 41.09070365726572 + ], + [ + -74.97661402140213, + 41.099308805080504 + ], + [ + -74.97661402140213, + 41.09070365726572 + ], + [ + -75.01252668966895, + 41.07349336163616 + ], + [ + -75.01252668966895, + 41.03907277037703 + ], + [ + -75.0843520262026, + 41.004652179117905 + ], + [ + -75.12026469446943, + 41.004652179117905 + ], + [ + -75.12026469446943, + 40.935810996599656 + ], + [ + -75.0843520262026, + 40.935810996599656 + ], + [ + -75.0843520262026, + 40.892785257525745 + ], + [ + -75.04843935793578, + 40.88418010971097 + ], + [ + -75.04843935793578, + 40.84975951845184 + ], + [ + -75.0843520262026, + 40.84975951845184 + ], + [ + -75.0843520262026, + 40.79812863156315 + ], + [ + -75.12026469446943, + 40.79812863156315 + ], + [ + -75.12026469446943, + 40.77231318811881 + ], + [ + -75.15617736273626, + 40.77231318811881 + ], + [ + -75.19209003100308, + 40.77231318811881 + ], + [ + -75.19209003100308, + 40.56578964056405 + ], + [ + -75.12026469446943, + 40.57439478837883 + ], + [ + -75.0843520262026, + 40.56578964056405 + ], + [ + -75.0843520262026, + 40.53136904930492 + ], + [ + -75.04843935793578, + 40.53136904930492 + ], + [ + -75.04843935793578, + 40.471133014601456 + ], + [ + -75.0843520262026, + 40.471133014601456 + ], + [ + -75.0843520262026, + 40.44531757115711 + ], + [ + -75.04843935793578, + 40.44531757115711 + ], + [ + -75.04843935793578, + 40.4022918320832 + ], + [ + -74.97661402140213, + 40.410896979897984 + ], + [ + -74.97661402140213, + 40.38508153645364 + ], + [ + -74.9407013531353, + 40.38508153645364 + ], + [ + -74.9407013531353, + 40.32484550175017 + ], + [ + -74.86887601660165, + 40.30763520612061 + ], + [ + -74.86887601660165, + 40.2646094670467 + ], + [ + -74.83296334833481, + 40.2646094670467 + ], + [ + -74.83296334833481, + 40.23879402360235 + ], + [ + -74.76113801180117, + 40.22158372797279 + ], + [ + -74.76113801180117, + 40.17855798889888 + ], + [ + -74.72522534353433, + 40.17855798889888 + ], + [ + -74.72522534353433, + 40.135532249824976 + ], + [ + -74.79705068006798, + 40.118321954195416 + ], + [ + -74.83296334833481, + 40.12692710201019 + ], + [ + -74.83296334833481, + 40.09250651075107 + ], + [ + -74.90478868486846, + 40.075296215121504 + ], + [ + -74.97661402140213, + 40.058085919491944 + ], + [ + -74.97661402140213, + 40.0322704760476 + ], + [ + -75.04843935793578, + 40.01506018041803 + ], + [ + -75.04843935793578, + 39.98063958915891 + ], + [ + -75.12026469446943, + 39.97203444134413 + ], + [ + -75.12026469446943, + 39.88598296319631 + ], + [ + -75.19209003100308, + 39.88598296319631 + ], + [ + -75.22800269926991, + 39.851562371937185 + ], + [ + -75.33574070407039, + 39.851562371937185 + ], + [ + -75.37165337233722, + 39.84295722412241 + ], + [ + -75.37165337233722, + 39.817141780678064 + ], + [ + -75.40756604060404, + 39.80853663286328 + ], + [ + -75.40756604060404, + 39.799931485048496 + ], + [ + -75.40756604060404, + 39.80853663286328 + ], + [ + -75.44347870887087, + 39.80853663286328 + ], + [ + -75.47939137713769, + 39.834352076307624 + ], + [ + -75.623042050205, + 39.834352076307624 + ], + [ + -75.69486738673865, + 39.817141780678064 + ], + [ + -75.69486738673865, + 39.79132633723372 + ], + [ + -75.73078005500548, + 39.79132633723372 + ], + [ + -75.73078005500548, + 39.765510893789376 + ], + [ + -75.76669272327231, + 39.765510893789376 + ], + [ + -75.76669272327231, + 39.722485154715464 + ], + [ + -75.80260539153913, + 39.722485154715464 + ], + [ + -76.52085875687567, + 39.722485154715464 + ], + [ + -77.02363611261124, + 39.722485154715464 + ], + [ + -77.84962748274826, + 39.722485154715464 + ], + [ + -78.49605551155113, + 39.722485154715464 + ], + [ + -78.81926952595258, + 39.722485154715464 + ], + [ + -79.46569755475545, + 39.722485154715464 + ], + [ + -80.0762129152915, + 39.722485154715464 + ], + [ + -80.50716493449343, + 39.722485154715464 + ], + [ + -80.50716493449343, + 40.634630823082304 + ] + ] + ], + "type": "Polygon" + }, + "properties": { + "NAME": "Pennsylvania" + }, + "type": "Feature" + }, + { + "geometry": { + "coordinates": [ + [ + [ + -75.15617736273626, + 40.77231318811881 + ], + [ + -75.12026469446943, + 40.77231318811881 + ], + [ + -75.12026469446943, + 40.79812863156315 + ], + [ + -75.0843520262026, + 40.79812863156315 + ], + [ + -75.0843520262026, + 40.84975951845184 + ], + [ + -75.04843935793578, + 40.84975951845184 + ], + [ + -75.04843935793578, + 40.88418010971097 + ], + [ + -75.0843520262026, + 40.892785257525745 + ], + [ + -75.0843520262026, + 40.935810996599656 + ], + [ + -75.12026469446943, + 40.935810996599656 + ], + [ + -75.12026469446943, + 41.004652179117905 + ], + [ + -75.0843520262026, + 41.004652179117905 + ], + [ + -75.01252668966895, + 41.03907277037703 + ], + [ + -75.01252668966895, + 41.07349336163616 + ], + [ + -74.97661402140213, + 41.09070365726572 + ], + [ + -74.97661402140213, + 41.099308805080504 + ], + [ + -74.97661402140213, + 41.09070365726572 + ], + [ + -74.97661402140213, + 41.099308805080504 + ], + [ + -74.9407013531353, + 41.116519100710065 + ], + [ + -74.9407013531353, + 41.14233454415441 + ], + [ + -74.90478868486846, + 41.14233454415441 + ], + [ + -74.90478868486846, + 41.176755135413536 + ], + [ + -74.86887601660165, + 41.176755135413536 + ], + [ + -74.86887601660165, + 41.25420146574657 + ], + [ + -74.83296334833481, + 41.25420146574657 + ], + [ + -74.83296334833481, + 41.29722720482047 + ], + [ + -74.79705068006798, + 41.29722720482047 + ], + [ + -74.79705068006798, + 41.32304264826482 + ], + [ + -74.76113801180117, + 41.32304264826482 + ], + [ + -74.76113801180117, + 41.34885809170916 + ], + [ + -74.6893126752675, + 41.357463239523945 + ], + [ + -74.58157467046702, + 41.29722720482047 + ], + [ + -74.50974933393337, + 41.28001690919091 + ], + [ + -74.50974933393337, + 41.26280661356135 + ], + [ + -74.25836065606559, + 41.14233454415441 + ], + [ + -74.15062265126511, + 41.116519100710065 + ], + [ + -74.07879731473146, + 41.064888213821376 + ], + [ + -74.0069719781978, + 41.047677918191816 + ], + [ + -73.93514664166415, + 41.004652179117905 + ], + [ + -73.89923397339732, + 41.004652179117905 + ], + [ + -73.89923397339732, + 40.92720584878487 + ], + [ + -73.93514664166415, + 40.91860070097009 + ], + [ + -73.93514664166415, + 40.84975951845184 + ], + [ + -73.97105930993098, + 40.84975951845184 + ], + [ + -73.97105930993098, + 40.78952348374837 + ], + [ + -74.0069719781978, + 40.78952348374837 + ], + [ + -74.0069719781978, + 40.712077153415336 + ], + [ + -74.04288464646463, + 40.70347200560055 + ], + [ + -74.04288464646463, + 40.68626170997099 + ], + [ + -74.04288464646463, + 40.651841118711864 + ], + [ + -74.18653531953193, + 40.64323597089708 + ], + [ + -74.18653531953193, + 40.59160508400839 + ], + [ + -74.22244798779876, + 40.59160508400839 + ], + [ + -74.22244798779876, + 40.55718449274927 + ], + [ + -74.25836065606559, + 40.54857934493449 + ], + [ + -74.25836065606559, + 40.47973816241623 + ], + [ + -74.18653531953193, + 40.47973816241623 + ], + [ + -74.07879731473146, + 40.4969484580458 + ], + [ + -73.97105930993098, + 40.522763901490144 + ], + [ + -73.93514664166415, + 40.522763901490144 + ], + [ + -73.89923397339732, + 40.488343310231016 + ], + [ + -73.89923397339732, + 40.23879402360235 + ], + [ + -73.93514664166415, + 40.22158372797279 + ], + [ + -73.93514664166415, + 40.15274254545454 + ], + [ + -73.97105930993098, + 40.12692710201019 + ], + [ + -73.97105930993098, + 40.023665328232816 + ], + [ + -74.0069719781978, + 40.01506018041803 + ], + [ + -74.0069719781978, + 39.82574692849284 + ], + [ + -74.04288464646463, + 39.80853663286328 + ], + [ + -74.04288464646463, + 39.722485154715464 + ], + [ + -74.07879731473146, + 39.705274859085904 + ], + [ + -74.07879731473146, + 39.653643972197216 + ], + [ + -74.22244798779876, + 39.498751311531144 + ], + [ + -74.22244798779876, + 39.4729358680868 + ], + [ + -74.25836065606559, + 39.45572557245724 + ], + [ + -74.25836065606559, + 39.42130498119811 + ], + [ + -74.29427332433241, + 39.37827924212421 + ], + [ + -74.36609866086607, + 39.34385865086508 + ], + [ + -74.36609866086607, + 39.318043207420736 + ], + [ + -74.47383666566655, + 39.300832911791176 + ], + [ + -74.47383666566655, + 39.27501746834683 + ], + [ + -74.50974933393337, + 39.26641232053205 + ], + [ + -74.50974933393337, + 39.240596877087704 + ], + [ + -74.58157467046702, + 39.21478143364336 + ], + [ + -74.58157467046702, + 39.17175569456945 + ], + [ + -74.65340000700068, + 39.128729955495544 + ], + [ + -74.65340000700068, + 39.05988877297729 + ], + [ + -74.6893126752675, + 39.05128362516251 + ], + [ + -74.6893126752675, + 39.016863033903384 + ], + [ + -74.72522534353433, + 39.016863033903384 + ], + [ + -74.72522534353433, + 38.95662699919991 + ], + [ + -74.79705068006798, + 38.93081155575557 + ], + [ + -74.79705068006798, + 38.904996112311224 + ], + [ + -74.83296334833481, + 38.887785816681664 + ], + [ + -74.90478868486846, + 38.87918066886688 + ], + [ + -75.01252668966895, + 38.80173433853385 + ], + [ + -75.01252668966895, + 38.78452404290429 + ], + [ + -75.01252668966895, + 38.80173433853385 + ], + [ + -75.04843935793578, + 38.836154929792976 + ], + [ + -75.04843935793578, + 38.87918066886688 + ], + [ + -75.0843520262026, + 38.87918066886688 + ], + [ + -75.0843520262026, + 38.91360126012601 + ], + [ + -75.12026469446943, + 38.965232147014696 + ], + [ + -75.12026469446943, + 38.999652738273824 + ], + [ + -75.15617736273626, + 38.999652738273824 + ], + [ + -75.15617736273626, + 39.05988877297729 + ], + [ + -75.19209003100308, + 39.06849392079207 + ], + [ + -75.22800269926991, + 39.111519659865984 + ], + [ + -75.22800269926991, + 39.15454539893989 + ], + [ + -75.26391536753674, + 39.15454539893989 + ], + [ + -75.26391536753674, + 39.188965990199016 + ], + [ + -75.29982803580356, + 39.206176285828576 + ], + [ + -75.29982803580356, + 39.24920202490249 + ], + [ + -75.33574070407039, + 39.24920202490249 + ], + [ + -75.33574070407039, + 39.27501746834683 + ], + [ + -75.40756604060404, + 39.30943805960595 + ], + [ + -75.40756604060404, + 39.335253503050296 + ], + [ + -75.44347870887087, + 39.335253503050296 + ], + [ + -75.44347870887087, + 39.36106894649464 + ], + [ + -75.47939137713769, + 39.369674094309424 + ], + [ + -75.47939137713769, + 39.39548953775377 + ], + [ + -75.51530404540452, + 39.40409468556855 + ], + [ + -75.51530404540452, + 39.429910129012896 + ], + [ + -75.55121671367135, + 39.429910129012896 + ], + [ + -75.55121671367135, + 39.498751311531144 + ], + [ + -75.51530404540452, + 39.498751311531144 + ], + [ + -75.51530404540452, + 39.541777050605056 + ], + [ + -75.51530404540452, + 39.58480278967896 + ], + [ + -75.55121671367135, + 39.593407937493744 + ], + [ + -75.55121671367135, + 39.64503882438243 + ], + [ + -75.51530404540452, + 39.64503882438243 + ], + [ + -75.51530404540452, + 39.69666971127112 + ], + [ + -75.47939137713769, + 39.69666971127112 + ], + [ + -75.47939137713769, + 39.765510893789376 + ], + [ + -75.44347870887087, + 39.765510893789376 + ], + [ + -75.44347870887087, + 39.79132633723372 + ], + [ + -75.40756604060404, + 39.799931485048496 + ], + [ + -75.40756604060404, + 39.80853663286328 + ], + [ + -75.37165337233722, + 39.817141780678064 + ], + [ + -75.37165337233722, + 39.84295722412241 + ], + [ + -75.33574070407039, + 39.851562371937185 + ], + [ + -75.22800269926991, + 39.851562371937185 + ], + [ + -75.19209003100308, + 39.88598296319631 + ], + [ + -75.12026469446943, + 39.88598296319631 + ], + [ + -75.12026469446943, + 39.97203444134413 + ], + [ + -75.04843935793578, + 39.98063958915891 + ], + [ + -75.04843935793578, + 40.01506018041803 + ], + [ + -74.97661402140213, + 40.0322704760476 + ], + [ + -74.97661402140213, + 40.058085919491944 + ], + [ + -74.90478868486846, + 40.075296215121504 + ], + [ + -74.83296334833481, + 40.09250651075107 + ], + [ + -74.83296334833481, + 40.12692710201019 + ], + [ + -74.79705068006798, + 40.118321954195416 + ], + [ + -74.72522534353433, + 40.135532249824976 + ], + [ + -74.72522534353433, + 40.17855798889888 + ], + [ + -74.76113801180117, + 40.17855798889888 + ], + [ + -74.76113801180117, + 40.22158372797279 + ], + [ + -74.83296334833481, + 40.23879402360235 + ], + [ + -74.83296334833481, + 40.2646094670467 + ], + [ + -74.86887601660165, + 40.2646094670467 + ], + [ + -74.86887601660165, + 40.30763520612061 + ], + [ + -74.9407013531353, + 40.32484550175017 + ], + [ + -74.9407013531353, + 40.38508153645364 + ], + [ + -74.97661402140213, + 40.38508153645364 + ], + [ + -74.97661402140213, + 40.410896979897984 + ], + [ + -75.04843935793578, + 40.4022918320832 + ], + [ + -75.04843935793578, + 40.44531757115711 + ], + [ + -75.0843520262026, + 40.44531757115711 + ], + [ + -75.0843520262026, + 40.471133014601456 + ], + [ + -75.04843935793578, + 40.471133014601456 + ], + [ + -75.04843935793578, + 40.53136904930492 + ], + [ + -75.0843520262026, + 40.53136904930492 + ], + [ + -75.0843520262026, + 40.56578964056405 + ], + [ + -75.12026469446943, + 40.57439478837883 + ], + [ + -75.19209003100308, + 40.56578964056405 + ], + [ + -75.19209003100308, + 40.77231318811881 + ], + [ + -75.15617736273626, + 40.77231318811881 + ] + ] + ], + "type": "Polygon" + }, + "properties": { + "NAME": "New Jersey" + }, + "type": "Feature" + } + ] +}
\ No newline at end of file diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index 4ef63d4bf8..63e3b516ab 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -1015,7 +1015,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) tapBounds.extend(MGLLatLngFromLocationCoordinate2D(coordinate)); // query for nearby annotations - std::vector<uint32_t> nearbyAnnotations = _mbglMap->getAnnotationsInBounds(tapBounds); + std::vector<uint32_t> nearbyAnnotations = _mbglMap->getAnnotationsInBounds(tapBounds, mbgl::AnnotationType::Point); int32_t newSelectedAnnotationID = -1; @@ -1669,36 +1669,131 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) { if ( ! annotations) return; - std::vector<mbgl::LatLng> latLngs; - latLngs.reserve(annotations.count); - + std::vector<mbgl::LatLng> points; std::vector<std::string> symbols; - symbols.reserve(annotations.count); + + std::vector<mbgl::AnnotationSegments> shapes; + std::vector<mbgl::StyleProperties> shapesProperties; BOOL delegateImplementsSymbolLookup = [self.delegate respondsToSelector:@selector(mapView:symbolNameForAnnotation:)]; + BOOL delegateImplementsAlphaForShape = [self.delegate respondsToSelector:@selector(mapView:alphaForShapeAnnotation:)]; + BOOL delegateImplementsStrokeColorForShape = [self.delegate respondsToSelector:@selector(mapView:strokeColorForShapeAnnotation:)]; + BOOL delegateImplementsFillColorForPolygon = [self.delegate respondsToSelector:@selector(mapView:fillColorForPolygonAnnotation:)]; + BOOL delegateImplementsLineWidthForPolyline = [self.delegate respondsToSelector:@selector(mapView:lineWidthForPolylineAnnotation:)]; for (id <MGLAnnotation> annotation in annotations) { assert([annotation conformsToProtocol:@protocol(MGLAnnotation)]); - latLngs.push_back(MGLLatLngFromLocationCoordinate2D(annotation.coordinate)); + if ([annotation isKindOfClass:[MGLMultiPoint class]]) + { + CGFloat alpha = (delegateImplementsAlphaForShape ? + [self.delegate mapView:self alphaForShapeAnnotation:annotation] : + 1.0); - NSString *symbolName = nil; + UIColor *strokeColor = (delegateImplementsStrokeColorForShape ? + [self.delegate mapView:self strokeColorForShapeAnnotation:annotation] : + [UIColor blackColor]); - if (delegateImplementsSymbolLookup) - { - symbolName = [self.delegate mapView:self symbolNameForAnnotation:annotation]; + assert(strokeColor); + + CGFloat r,g,b,a; + [strokeColor getRed:&r green:&g blue:&b alpha:&a]; + mbgl::Color strokeNativeColor({{ (float)r, (float)g, (float)b, (float)a }}); + + mbgl::StyleProperties shapeProperties; + + if ([annotation isKindOfClass:[MGLPolyline class]]) + { + CGFloat lineWidth = (delegateImplementsLineWidthForPolyline ? + [self.delegate mapView:self lineWidthForPolylineAnnotation:(MGLPolyline *)annotation] : + 3.0); + + mbgl::LineProperties lineProperties; + lineProperties.opacity = alpha; + lineProperties.color = strokeNativeColor; + lineProperties.width = lineWidth; + shapeProperties.set<mbgl::LineProperties>(lineProperties); + + } + else if ([annotation isKindOfClass:[MGLPolygon class]]) + { + UIColor *fillColor = (delegateImplementsFillColorForPolygon ? + [self.delegate mapView:self fillColorForPolygonAnnotation:(MGLPolygon *)annotation] : + [UIColor blueColor]); + + assert(fillColor); + + [fillColor getRed:&r green:&g blue:&b alpha:&a]; + mbgl::Color fillNativeColor({{ (float)r, (float)g, (float)b, (float)a }}); + + mbgl::FillProperties fillProperties; + fillProperties.opacity = alpha; + fillProperties.stroke_color = strokeNativeColor; + fillProperties.fill_color = fillNativeColor; + shapeProperties.set<mbgl::FillProperties>(fillProperties); + } + else + { + [[NSException exceptionWithName:@"MGLUnknownShapeClassException" + reason:[NSString stringWithFormat:@"%@ is an unknown shape class", [annotation class]] + userInfo:nil] raise]; + } + + shapesProperties.push_back(shapeProperties); + + NSUInteger count = [(MGLMultiPoint *)annotation pointCount]; + + CLLocationCoordinate2D *coordinates = (CLLocationCoordinate2D *)malloc(count * sizeof(CLLocationCoordinate2D)); + [(MGLMultiPoint *)annotation getCoordinates:coordinates range:NSMakeRange(0, count)]; + + mbgl::AnnotationSegment shape; + shape.reserve(count); + + for (NSUInteger i = 0; i < count; i++) + { + shape.push_back(mbgl::LatLng(coordinates[i].latitude, coordinates[i].longitude)); + } + + free(coordinates); + + shapes.push_back({{ shape }}); } + else + { + points.push_back(MGLLatLngFromLocationCoordinate2D(annotation.coordinate)); + + NSString *symbolName = nil; - symbols.push_back((symbolName ? [symbolName UTF8String] : "")); + if (delegateImplementsSymbolLookup) + { + symbolName = [self.delegate mapView:self symbolNameForAnnotation:annotation]; + } + + symbols.push_back((symbolName ? [symbolName UTF8String] : "")); + } } - std::vector<uint32_t> annotationIDs = _mbglMap->addPointAnnotations(latLngs, symbols); + if (points.size()) + { + std::vector<uint32_t> pointAnnotationIDs = _mbglMap->addPointAnnotations(points, symbols); - for (size_t i = 0; i < annotationIDs.size(); ++i) + for (size_t i = 0; i < pointAnnotationIDs.size(); ++i) + { + [self.annotationIDsByAnnotation setObject:@{ MGLAnnotationIDKey : @(pointAnnotationIDs[i]) } + forKey:annotations[i]]; + } + } + + if (shapes.size()) { - [self.annotationIDsByAnnotation setObject:@{ MGLAnnotationIDKey : @(annotationIDs[i]) } - forKey:annotations[i]]; + std::vector<uint32_t> shapeAnnotationIDs = _mbglMap->addShapeAnnotations(shapes, shapesProperties); + + for (size_t i = 0; i < shapeAnnotationIDs.size(); ++i) + { + [self.annotationIDsByAnnotation setObject:@{ MGLAnnotationIDKey : @(shapeAnnotationIDs[i]) } + forKey:annotations[i]]; + } } } @@ -1750,6 +1845,8 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) assert([firstAnnotation conformsToProtocol:@protocol(MGLAnnotation)]); + if ([firstAnnotation isKindOfClass:[MGLMultiPoint class]]) return; + if ( ! [self viewportBounds].contains(MGLLatLngFromLocationCoordinate2D(firstAnnotation.coordinate))) return; [self selectAnnotation:firstAnnotation animated:NO]; @@ -1759,6 +1856,8 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) { if ( ! annotation) return; + if ([annotation isKindOfClass:[MGLMultiPoint class]]) return; + if ( ! [self viewportBounds].contains(MGLLatLngFromLocationCoordinate2D(annotation.coordinate))) return; if (annotation == self.selectedAnnotation) return; @@ -1865,12 +1964,12 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) // clean up self.selectedAnnotationCalloutView = nil; self.selectedAnnotation = nil; - } - // notify delegate - if ([self.delegate respondsToSelector:@selector(mapView:didDeselectAnnotation:)]) - { - [self.delegate mapView:self didDeselectAnnotation:annotation]; + // notify delegate + if ([self.delegate respondsToSelector:@selector(mapView:didDeselectAnnotation:)]) + { + [self.delegate mapView:self didDeselectAnnotation:annotation]; + } } } diff --git a/platform/ios/MGLMultiPoint.mm b/platform/ios/MGLMultiPoint.mm new file mode 100644 index 0000000000..ef8a18e493 --- /dev/null +++ b/platform/ios/MGLMultiPoint.mm @@ -0,0 +1,102 @@ +#import "MGLMultiPoint.h" +#import "MGLTypes.h" + +#import <mbgl/util/geo.hpp> + +@implementation MGLMultiPoint +{ + CLLocationCoordinate2D *_coords; + size_t _count; + mbgl::LatLngBounds _bounds; +} + +- (instancetype)initWithCoordinates:(CLLocationCoordinate2D *)coords + count:(NSUInteger)count +{ + self = [super init]; + + if (self) + { + _count = count; + _coords = (CLLocationCoordinate2D *)malloc(_count * sizeof(CLLocationCoordinate2D)); + + for (NSUInteger i = 0; i < _count; i++) + { + _coords[i] = coords[i]; + _bounds.extend(mbgl::LatLng(coords[i].latitude, coords[i].longitude)); + } + } + + return self; +} + +- (void)dealloc +{ + free(_coords); +} + +- (CLLocationCoordinate2D)coordinate +{ + if ([self isMemberOfClass:[MGLMultiPoint class]]) + { + [[NSException exceptionWithName:@"MGLAbstractClassException" + reason:@"MGLMultiPoint is an abstract class" + userInfo:nil] raise]; + } + + assert(_count > 0); + + return CLLocationCoordinate2DMake(_coords[0].latitude, _coords[0].longitude); +} + +- (NSUInteger)pointCount +{ + if ([self isMemberOfClass:[MGLMultiPoint class]]) + { + [[NSException exceptionWithName:@"MGLAbstractClassException" + reason:@"MGLMultiPoint is an abstract class" + userInfo:nil] raise]; + } + + return _count; +} + +- (void)getCoordinates:(CLLocationCoordinate2D *)coords range:(NSRange)range +{ + if ([self isMemberOfClass:[MGLMultiPoint class]]) + { + [[NSException exceptionWithName:@"MGLAbstractClassException" + reason:@"MGLMultiPoint is an abstract class" + userInfo:nil] raise]; + } + + assert(range.location + range.length <= _count); + + NSUInteger index = 0; + + for (NSUInteger i = range.location; i < range.location + range.length; i++) + { + coords[index] = _coords[i]; + index++; + } +} + +- (MGLCoordinateBounds)overlayBounds +{ + return { + CLLocationCoordinate2DMake(_bounds.sw.latitude, _bounds.sw.longitude), + CLLocationCoordinate2DMake(_bounds.ne.longitude, _bounds.ne.longitude) + }; +} + +- (BOOL)intersectsOverlayBounds:(MGLCoordinateBounds)overlayBounds +{ + mbgl::LatLngBounds area( + mbgl::LatLng(overlayBounds.sw.latitude, overlayBounds.sw.longitude), + mbgl::LatLng(overlayBounds.ne.latitude, overlayBounds.ne.longitude) + ); + + return _bounds.intersects(area); +} + +@end diff --git a/platform/ios/MGLMultiPoint_Private.h b/platform/ios/MGLMultiPoint_Private.h new file mode 100644 index 0000000000..a1a70a6778 --- /dev/null +++ b/platform/ios/MGLMultiPoint_Private.h @@ -0,0 +1,8 @@ +#import "MGLMultiPoint.h" + +@interface MGLMultiPoint (Private) + +- (instancetype)initWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSUInteger)count; +- (BOOL)intersectsOverlayBounds:(MGLCoordinateBounds)overlayBounds; + +@end diff --git a/platform/ios/MGLPointAnnotation.m b/platform/ios/MGLPointAnnotation.m new file mode 100644 index 0000000000..13fbba1083 --- /dev/null +++ b/platform/ios/MGLPointAnnotation.m @@ -0,0 +1,7 @@ +#import "MGLPointAnnotation.h" + +@implementation MGLPointAnnotation + +@synthesize coordinate; + +@end diff --git a/platform/ios/MGLPolygon.m b/platform/ios/MGLPolygon.m new file mode 100644 index 0000000000..d3b5f2c2a4 --- /dev/null +++ b/platform/ios/MGLPolygon.m @@ -0,0 +1,15 @@ +#import "MGLPolygon.h" + +#import "MGLMultiPoint_Private.h" + +@implementation MGLPolygon + +@synthesize overlayBounds; + ++ (instancetype)polygonWithCoordinates:(CLLocationCoordinate2D *)coords + count:(NSUInteger)count +{ + return [[self alloc] initWithCoordinates:coords count:count]; +} + +@end diff --git a/platform/ios/MGLPolyline.m b/platform/ios/MGLPolyline.m new file mode 100644 index 0000000000..86d113bd16 --- /dev/null +++ b/platform/ios/MGLPolyline.m @@ -0,0 +1,15 @@ +#import "MGLPolyline.h" + +#import "MGLMultiPoint_Private.h" + +@implementation MGLPolyline + +@synthesize overlayBounds; + ++ (instancetype)polylineWithCoordinates:(CLLocationCoordinate2D *)coords + count:(NSUInteger)count +{ + return [[self alloc] initWithCoordinates:coords count:count]; +} + +@end diff --git a/platform/ios/MGLShape.m b/platform/ios/MGLShape.m new file mode 100644 index 0000000000..e3d92c38c8 --- /dev/null +++ b/platform/ios/MGLShape.m @@ -0,0 +1,14 @@ +#import "MGLShape.h" + +@implementation MGLShape + +- (CLLocationCoordinate2D)coordinate +{ + [[NSException exceptionWithName:@"MGLAbstractClassException" + reason:@"MGLShape is an abstract class" + userInfo:nil] raise]; + + return CLLocationCoordinate2DMake(MAXFLOAT, MAXFLOAT); +} + +@end diff --git a/src/mbgl/map/annotation.cpp b/src/mbgl/map/annotation.cpp index 6df49ec647..c946264593 100644 --- a/src/mbgl/map/annotation.cpp +++ b/src/mbgl/map/annotation.cpp @@ -4,6 +4,7 @@ #include <mbgl/map/live_tile.hpp> #include <mbgl/map/map_data.hpp> #include <mbgl/util/constants.hpp> +#include <mbgl/util/geojsonvt/geojsonvt_convert.hpp> #include <mbgl/util/ptr.hpp> #include <algorithm> @@ -11,35 +12,15 @@ namespace mbgl { -enum class AnnotationType : uint8_t { - Point, - Shape -}; - -using AnnotationSegment = std::vector<LatLng>; -using AnnotationSegments = std::vector<AnnotationSegment>; - -class Annotation : private util::noncopyable { - friend class AnnotationManager; -public: - Annotation(AnnotationType, const AnnotationSegments&); - -private: - LatLng getPoint() const; - LatLngBounds getBounds() const { return bounds; } - -private: - const AnnotationType type = AnnotationType::Point; - const AnnotationSegments geometry; - std::unordered_map<TileID, std::weak_ptr<const LiveTileFeature>, TileID::Hash> tileFeatures; - const LatLngBounds bounds; -}; - -Annotation::Annotation(AnnotationType type_, const AnnotationSegments& geometry_) - : type(type_), +Annotation::Annotation(AnnotationType type_, + const AnnotationSegments& geometry_, + const StyleProperties& styleProperties_) + : styleProperties(styleProperties_), + type(type_), geometry(geometry_), bounds([this] { LatLngBounds bounds_; + assert(type != AnnotationType::Any); if (type == AnnotationType::Point) { bounds_ = { getPoint(), getPoint() }; } else { @@ -67,6 +48,16 @@ AnnotationManager::~AnnotationManager() { // Annotation so we can't destruct the object with just the header file. } +void AnnotationManager::markStaleTiles(std::unordered_set<TileID, TileID::Hash> ids) { + std::lock_guard<std::mutex> lock(mtx); + std::copy(ids.begin(), ids.end(), std::inserter(staleTiles, staleTiles.begin())); +} + +std::unordered_set<TileID, TileID::Hash> AnnotationManager::resetStaleTiles() { + std::lock_guard<std::mutex> lock(mtx); + return std::move(staleTiles); +} + void AnnotationManager::setDefaultPointAnnotationSymbol(const std::string& symbol) { std::lock_guard<std::mutex> lock(mtx); defaultPointAnnotationSymbol = symbol; @@ -77,118 +68,314 @@ uint32_t AnnotationManager::nextID() { } vec2<double> AnnotationManager::projectPoint(const LatLng& point) { + // Clamp to the latitude limits of Mercator. + const double constrainedLatitude = std::fmin(std::fmax(point.latitude, -util::LATITUDE_MAX), util::LATITUDE_MAX); + // Project a coordinate into unit space in a square map. - const double sine = std::sin(point.latitude * M_PI / 180.0); + const double sine = std::sin(constrainedLatitude * M_PI / 180.0); const double x = point.longitude / 360.0 + 0.5; const double y = 0.5 - 0.25 * std::log((1.0 + sine) / (1.0 - sine)) / M_PI; return { x, y }; } -std::pair<std::vector<TileID>, AnnotationIDs> -AnnotationManager::addPointAnnotations(const std::vector<LatLng>& points, - const std::vector<std::string>& symbols, - const MapData& data) { +std::pair<std::unordered_set<TileID, TileID::Hash>, AnnotationIDs> +AnnotationManager::addAnnotations(const AnnotationType type, + const std::vector<AnnotationSegments>& segments, + const std::vector<StyleProperties>& styleProperties, + const AnnotationsProperties& annotationsProperties, + const MapData& data) { std::lock_guard<std::mutex> lock(mtx); + assert(type != AnnotationType::Any); + // We pre-generate tiles to contain each annotation up to the map's max zoom. // We do this for fast rendering without projection conversions on the fly, as well as // to simplify bounding box queries of annotations later. Tiles get invalidated when // annotations are added or removed in order to refresh the map render without // touching the base map underneath. - const uint16_t extent = 4096; + AnnotationIDs annotationIDs; + annotationIDs.reserve((type == AnnotationType::Shape ? + segments.size() : // shapes + segments[0][0].size())); // points + + std::unordered_set<TileID, TileID::Hash> affectedTiles; + + const uint8_t maxZoom = data.transform.getMaxZoom(); + + for (size_t s = 0; s < segments.size(); ++s) { + + if (type == AnnotationType::Point) { - std::vector<uint32_t> annotationIDs; - annotationIDs.reserve(points.size()); + for (size_t l = 0; l < segments[s].size(); ++l) { - std::vector<TileID> affectedTiles; + for (size_t p = 0; p < segments[s][l].size(); ++p) { - for (size_t i = 0; i < points.size(); ++i) { - const uint32_t annotationID = nextID(); + auto& point = segments[s][l][p]; - // track the annotation global ID and its geometry - auto anno_it = annotations.emplace( - annotationID, - std::make_unique<Annotation>(AnnotationType::Point, - AnnotationSegments({ { points[i] } }))); + // projection conversion into unit space + const auto pp = projectPoint(point); + + const uint32_t pointAnnotationID = nextID(); + + // at render time we style the point according to its {sprite} field + std::unordered_map<std::string, std::string> pointFeatureProperties; + const std::string& symbol = annotationsProperties.at("symbols")[p]; + if (symbol.length()) { + pointFeatureProperties.emplace("sprite", symbol); + } else { + pointFeatureProperties.emplace("sprite", defaultPointAnnotationSymbol); + } + + // add individual point tile feature + auto featureAffectedTiles = addTileFeature( + pointAnnotationID, + AnnotationSegments({{ point }}), + std::vector<std::vector<vec2<double>>>({{ pp }}), + AnnotationType::Point, + {{ }}, + pointFeatureProperties, + maxZoom + ); + + std::copy(featureAffectedTiles.begin(), featureAffectedTiles.end(), std::inserter(affectedTiles, affectedTiles.begin())); + + annotationIDs.push_back(pointAnnotationID); + } + } + } else { + + const uint32_t shapeAnnotationID = nextID(); + + // current shape tiles are on-the-fly, so we don't get any "affected tiles" + // and just expire all annotation tiles for shape adds + + addTileFeature( + shapeAnnotationID, + segments[s], + {{ }}, + AnnotationType::Shape, + styleProperties[s], + {{ }}, + maxZoom + ); + + annotationIDs.push_back(shapeAnnotationID); + } + } + + // Tile:IDs that need refreshed and the annotation identifiers held onto by the client. + return std::make_pair(affectedTiles, annotationIDs); +} - const uint8_t maxZoom = data.transform.getMaxZoom(); +std::unordered_set<TileID, TileID::Hash> +AnnotationManager::addTileFeature(const uint32_t annotationID, + const AnnotationSegments& segments, + const std::vector<std::vector<vec2<double>>>& projectedFeature, + const AnnotationType& type, + const StyleProperties& styleProperties, + const std::unordered_map<std::string, std::string>& featureProperties, + const uint8_t maxZoom) { - // side length of map at this zoom + assert(type != AnnotationType::Any); + + // track the annotation global ID and its original geometry + auto anno_it = annotations.emplace(annotationID, + std::make_unique<Annotation>(type, segments, styleProperties)); + + std::unordered_set<TileID, TileID::Hash> affectedTiles; + + if (type == AnnotationType::Shape) { + + orderedShapeAnnotations.push_back(annotationID); + + using namespace mapbox::util::geojsonvt; + + const uint32_t z2 = 1 << maxZoom; + const double baseTolerance = 3; + const uint16_t extent = 4096; + + const double tolerance = baseTolerance / (z2 * extent); + + ProjectedGeometryContainer rings; + + std::vector<LonLat> points; + + for (size_t i = 0; i < segments[0].size(); ++i) { // first segment for now (no holes) + const double constraintedLatitude = std::fmin(std::fmax(segments[0][i].latitude, -util::LATITUDE_MAX), util::LATITUDE_MAX); + points.push_back(LonLat(segments[0][i].longitude, constraintedLatitude)); + } + + ProjectedFeatureType featureType; + + if (styleProperties.is<FillProperties>()) { + featureType = ProjectedFeatureType::Polygon; + + if (points.front().lon != points.back().lon || points.front().lat != points.back().lat) { + points.push_back(LonLat(points.front().lon, points.front().lat)); + } + } else { + featureType = ProjectedFeatureType::LineString; + } + + ProjectedGeometryContainer ring = Convert::project(points, tolerance); + + rings.members.push_back(ring); + + std::vector<ProjectedFeature> features; + + features.push_back(Convert::create(Tags(), featureType, rings)); + + shapeTilers.emplace(annotationID, std::make_unique<GeoJSONVT>(features, maxZoom)); + + } else { + + // side length of map at max zoom uint32_t z2 = 1 << maxZoom; - // projection conversion into unit space - const vec2<double> p = projectPoint(points[i]); + const uint16_t extent = 4096; - uint32_t x = p.x * z2; - uint32_t y = p.y * z2; + uint32_t x = 0; + uint32_t y = 0; for (int8_t z = maxZoom; z >= 0; z--) { - affectedTiles.emplace_back(z, x, y, z); - TileID tileID = affectedTiles.back(); - - // calculate tile coordinate - const Coordinate coordinate(extent * (p.x * z2 - x), extent * (p.y * z2 - y)); - - const GeometryCollection geometries({ { { { coordinate } } } }); - - // at render time we style the annotation according to its {sprite} field - const std::map<std::string, std::string> properties = { - { "sprite", (symbols[i].length() ? symbols[i] : defaultPointAnnotationSymbol) } - }; - - auto feature = - std::make_shared<const LiveTileFeature>(FeatureType::Point, geometries, properties); - - auto tile_it = tiles.find(tileID); - if (tile_it != tiles.end()) { - // - // We have this tile created already. Add this feature to it. - // - // get point layer & add feature - auto layer = - tile_it->second.second->getMutableLayer(layerID); - layer->addFeature(feature); - // record annotation association with tile - tile_it->second.first.insert(annotationID); + + std::unordered_map<TileID, GeometryCollection, TileID::Hash> featureTiles; + + if (type == AnnotationType::Point) { + auto& pp = projectedFeature[0][0]; + + x = pp.x * z2; + y = pp.y * z2; + + const Coordinate coordinate(extent * (pp.x * z2 - x), extent * (pp.y * z2 - y)); + + GeometryCollection geometries = {{ {{ coordinate }} }}; + + featureTiles.emplace(TileID(z, x, y, z), geometries); } else { - // - // We need to create a new tile for this feature. - // - // create point layer & add feature - util::ptr<LiveTileLayer> layer = std::make_shared<LiveTileLayer>(); - layer->addFeature(feature); - // create tile & record annotation association - auto tile_pos = tiles.emplace( - tileID, std::make_pair(std::unordered_set<uint32_t>({ annotationID }), - std::make_unique<LiveTile>())); - // add point layer to tile - tile_pos.first->second.second->addLayer(layerID, layer); + for (size_t l = 0; l < projectedFeature.size(); ++l) { + + std::vector<Coordinate> line; + + for (size_t p = 0; p < projectedFeature[l].size(); ++p) { + + auto& pp = projectedFeature[l][p]; + + x = pp.x * z2; + y = pp.y * z2; + + const Coordinate coordinate(extent * (pp.x * z2 - x), extent * (pp.y * z2 - y)); + + auto tile_it = featureTiles.find(TileID(z, x, y, z)); + + if (tile_it != featureTiles.end()) { + GeometryCollection& geometries = featureTiles.find(TileID(z, x, y, z))->second; + if (geometries.size()) { + geometries.back().push_back(coordinate); + } else { + geometries.push_back({{ coordinate }}); + } + } else { + GeometryCollection geometries = {{ {{ coordinate }} }}; + featureTiles.emplace(TileID(z, x, y, z), geometries); + } + } + } } - // Record annotation association with tile and tile feature. This is used to determine stale tiles, - // as well as to remove the feature from the tile upon annotation deletion. - anno_it.first->second->tileFeatures.emplace( - tileID, std::weak_ptr<const LiveTileFeature>(feature)); + for (auto& featureTile : featureTiles) { + // determine feature type + FeatureType featureType; + if (type == AnnotationType::Point) { + featureType = FeatureType::Point; + } else if (styleProperties.is<LineProperties>()) { + featureType = FeatureType::LineString; + } else if (styleProperties.is<FillProperties>()) { + featureType = FeatureType::Polygon; + } else { + throw std::runtime_error("Invalid feature type"); + } + + // create tile feature + auto feature = std::make_shared<const LiveTileFeature>( + featureType, + featureTile.second, + featureProperties + ); + + // check for tile & create if necessary + auto tile_pos = tiles.emplace(featureTile.first, + std::make_pair(std::unordered_set<uint32_t>({ annotationID }), + std::make_unique<LiveTile>())); + + // check for annotation layer & create if necessary + util::ptr<LiveTileLayer> layer; + std::string layerID = ""; + if (type == AnnotationType::Point) { + layerID = PointLayerID; + } else { + layerID = ShapeLayerID + "." + std::to_string(annotationID); + } + if (tile_pos.second || tile_pos.first->second.second->getMutableLayer(layerID) == nullptr) { + layer = std::make_shared<LiveTileLayer>(); + tile_pos.first->second.second->addLayer(layerID, layer); + } else { + layer = tile_pos.first->second.second->getMutableLayer(layerID); + + // associate annotation with tile + tile_pos.first->second.first.insert(annotationID); + } + + // add feature to layer + layer->addFeature(feature); + + // Record annotation association with tile and tile feature. This is used to determine stale tiles, + // as well as to remove the feature from the tile upon annotation deletion. + anno_it.first->second->tilePointFeatures.emplace(featureTile.first, std::weak_ptr<const LiveTileFeature>(feature)); + + // track affected tile + affectedTiles.insert(featureTile.first); + } // get ready for the next-lower zoom number z2 /= 2; x /= 2; y /= 2; } - - annotationIDs.push_back(annotationID); } - // Tile:IDs that need refreshed and the annotation identifiers held onto by the client. - return std::make_pair(affectedTiles, annotationIDs); + return affectedTiles; +} + +std::pair<std::unordered_set<TileID, TileID::Hash>, AnnotationIDs> +AnnotationManager::addPointAnnotations(const AnnotationSegment& points, + const AnnotationsProperties& annotationsProperties, + const MapData& data) { + return addAnnotations(AnnotationType::Point, + {{ points }}, + {{ }}, + annotationsProperties, + data); } -std::vector<TileID> AnnotationManager::removeAnnotations(const AnnotationIDs& ids, - const MapData& data) { +std::pair<std::unordered_set<TileID, TileID::Hash>, AnnotationIDs> +AnnotationManager::addShapeAnnotations(const std::vector<AnnotationSegments>& shapes, + const std::vector<StyleProperties>& styleProperties, + const AnnotationsProperties& annotationsProperties, + const MapData& data) { + return addAnnotations(AnnotationType::Shape, + shapes, + styleProperties, + annotationsProperties, + data); +} + +std::unordered_set<TileID, TileID::Hash> AnnotationManager::removeAnnotations(const AnnotationIDs& ids, + const MapData& data) { std::lock_guard<std::mutex> lock(mtx); - std::vector<TileID> affectedTiles; + std::unordered_set<TileID, TileID::Hash> affectedTiles; std::vector<uint32_t> z2s; const uint8_t zoomCount = data.transform.getMaxZoom() + 1; @@ -207,25 +394,44 @@ std::vector<TileID> AnnotationManager::removeAnnotations(const AnnotationIDs& id const auto& annotation_it = annotations.find(annotationID); if (annotation_it != annotations.end()) { const auto& annotation = annotation_it->second; - // calculate annotation's affected tile for each zoom - for (uint8_t z = 0; z < zoomCount; ++z) { - latLng = annotation->getPoint(); - p = projectPoint(latLng); - x = z2s[z] * p.x; - y = z2s[z] * p.y; - TileID tid(z, x, y, z); - // erase annotation from tile's list - auto& tileAnnotations = tiles[tid].first; - tileAnnotations.erase(annotationID); - // remove annotation's features from tile - const auto& features_it = annotation->tileFeatures.find(tid); - if (features_it != annotation->tileFeatures.end()) { - const auto& layer = - tiles[tid].second->getMutableLayer(layerID); - layer->removeFeature(features_it->second); - affectedTiles.push_back(tid); + // remove feature(s) from relevant tiles + if (annotation->type == AnnotationType::Point) { + // calculate annotation's affected tile for each zoom + for (uint8_t z = 0; z < zoomCount; ++z) { + latLng = annotation->getPoint(); + p = projectPoint(latLng); + x = z2s[z] * p.x; + y = z2s[z] * p.y; + TileID tid(z, x, y, z); + // erase annotation from tile's list + auto& tileAnnotations = tiles[tid].first; + tileAnnotations.erase(annotationID); + // remove annotation's features from tile + const auto& features_it = annotation->tilePointFeatures.find(tid); + if (features_it != annotation->tilePointFeatures.end()) { + // points share a layer; remove feature + auto layer = tiles[tid].second->getMutableLayer(PointLayerID); + layer->removeFeature(features_it->second); + affectedTiles.insert(tid); + } + } + } else { + // remove shape layer from tiles if relevant + for (auto tile_it = tiles.begin(); tile_it != tiles.end(); ++tile_it) { + if (tile_it->second.first.count(annotationID)) { + tile_it->second.second->removeLayer(ShapeLayerID + "." + std::to_string(annotationID)); + affectedTiles.insert(tile_it->first); + } } + + // clear shape from render order + auto shape_it = std::find(orderedShapeAnnotations.begin(), orderedShapeAnnotations.end(), annotationID); + orderedShapeAnnotations.erase(shape_it); + + // clear shape tiler + shapeTilers.erase(annotationID); } + annotations.erase(annotationID); } } @@ -234,8 +440,18 @@ std::vector<TileID> AnnotationManager::removeAnnotations(const AnnotationIDs& id return affectedTiles; } -std::vector<uint32_t> AnnotationManager::getAnnotationsInBounds(const LatLngBounds& queryBounds, - const MapData& data) const { +const StyleProperties AnnotationManager::getAnnotationStyleProperties(uint32_t annotationID) const { + std::lock_guard<std::mutex> lock(mtx); + + auto anno_it = annotations.find(annotationID); + assert(anno_it != annotations.end()); + + return anno_it->second->styleProperties; +} + +AnnotationIDs AnnotationManager::getAnnotationsInBounds(const LatLngBounds& queryBounds, + const MapData& data, + const AnnotationType& type) const { std::lock_guard<std::mutex> lock(mtx); const uint8_t z = data.transform.getMaxZoom(); @@ -247,7 +463,7 @@ std::vector<uint32_t> AnnotationManager::getAnnotationsInBounds(const LatLngBoun const TileID nwTile(z, swPoint.x * z2, nePoint.y * z2, z); const TileID seTile(z, nePoint.x * z2, swPoint.y * z2, z); - std::vector<uint32_t> matchingAnnotations; + std::unordered_set<uint32_t> matchingAnnotations; for (auto& tile : tiles) { TileID id = tile.first; @@ -255,32 +471,50 @@ std::vector<uint32_t> AnnotationManager::getAnnotationsInBounds(const LatLngBoun if (id.x >= nwTile.x && id.x <= seTile.x && id.y >= nwTile.y && id.y <= seTile.y) { if (id.x > nwTile.x && id.x < seTile.x && id.y > nwTile.y && id.y < seTile.y) { // Trivial accept; this tile is completely inside the query bounds, so - // we'll return all of its annotations. - std::copy(tile.second.first.begin(), tile.second.first.end(), - std::back_inserter(matchingAnnotations)); + // we'll return all of its annotations that match type (if specified). + if (type != AnnotationType::Any) { + std::copy_if(tile.second.first.begin(), tile.second.first.end(), + std::inserter(matchingAnnotations, matchingAnnotations.begin()), + [&](const uint32_t annotationID) -> bool { + const auto it = annotations.find(annotationID); + if (it != annotations.end()) { + return (it->second->type == type); + } else { + return false; + } + }); + } else { + std::copy(tile.second.first.begin(), tile.second.first.end(), + std::inserter(matchingAnnotations, matchingAnnotations.begin())); + } } else { // This tile is intersected by the query bounds. We need to check the // tile's annotations' bounding boxes individually. std::copy_if(tile.second.first.begin(), tile.second.first.end(), - std::back_inserter(matchingAnnotations), + std::inserter(matchingAnnotations, matchingAnnotations.begin()), [&](const uint32_t annotationID) -> bool { const auto it = annotations.find(annotationID); if (it != annotations.end()) { - const LatLngBounds annoBounds = it->second->getBounds(); - return (annoBounds.sw.latitude >= queryBounds.sw.latitude && - annoBounds.ne.latitude <= queryBounds.ne.latitude && - annoBounds.sw.longitude >= queryBounds.sw.longitude && - annoBounds.ne.longitude <= queryBounds.ne.longitude); - } else { - return false; + // check type + if (type != AnnotationType::Any && it->second->type != type) { + return false; + } + + // check bounds + if (it->second->type == AnnotationType::Point) { + return queryBounds.contains(it->second->getPoint()); + } else if (it->second->type == AnnotationType::Shape) { + return queryBounds.intersects(it->second->getBounds()); + } } + return false; }); } } } } - return matchingAnnotations; + return AnnotationIDs(matchingAnnotations.begin(), matchingAnnotations.end()); } LatLngBounds AnnotationManager::getBoundsForAnnotations(const AnnotationIDs& ids) const { @@ -290,7 +524,7 @@ LatLngBounds AnnotationManager::getBoundsForAnnotations(const AnnotationIDs& ids for (auto id : ids) { const auto annotation_it = annotations.find(id); if (annotation_it != annotations.end()) { - bounds.extend(annotation_it->second->getPoint()); + bounds.extend(annotation_it->second->getBounds()); } } @@ -300,13 +534,89 @@ LatLngBounds AnnotationManager::getBoundsForAnnotations(const AnnotationIDs& ids const LiveTile* AnnotationManager::getTile(const TileID& id) { std::lock_guard<std::mutex> lock(mtx); - const auto tile_it = tiles.find(id); - if (tile_it != tiles.end()) { - return tile_it->second.second.get(); + // look up any existing annotation tile + LiveTile *renderTile = nullptr; + const auto tile_lookup_it = tiles.find(id); + if (tile_lookup_it != tiles.end()) { + // it exists and may have annotations already + renderTile = tile_lookup_it->second.second.get(); + } else if (orderedShapeAnnotations.size()) { + // it needs created, but only for on-demand shapes + renderTile = tiles.emplace(id, + std::make_pair(std::unordered_set<uint32_t>(), std::make_unique<LiveTile>()) + ).first->second.second.get(); + } + + if (renderTile != nullptr && orderedShapeAnnotations.size()) { + + // create shape tile layers from GeoJSONVT queries + for (auto& tiler_it : shapeTilers) { + const auto annotationID = tiler_it.first; + const std::string layerID = ShapeLayerID + "." + std::to_string(annotationID); + + // check for existing render layer + auto renderLayer = renderTile->getMutableLayer(layerID); + + if (renderLayer == nullptr) { + // we might need to create a tile layer for this shape + const auto& shapeTile = tiler_it.second->getTile(id.z, id.x, id.y); + + if (shapeTile) { + + // shape exists on this tile; let's make a layer + renderLayer = std::make_shared<LiveTileLayer>(); + + // convert the features and add to render layer + for (auto& shapeFeature : shapeTile.features) { + + using namespace mapbox::util::geojsonvt; + + FeatureType renderType = FeatureType::Unknown; + + if (shapeFeature.type == TileFeatureType::LineString) { + renderType = FeatureType::LineString; + } else if (shapeFeature.type == TileFeatureType::Polygon) { + renderType = FeatureType::Polygon; + } + + assert(renderType != FeatureType::Unknown); + + GeometryCollection renderGeometry; + + for (auto& shapeGeometry : shapeFeature.geometry) { + + std::vector<Coordinate> renderLine; + + auto& shapeRing = shapeGeometry.get<TileRing>(); + + for (auto& shapePoint : shapeRing.points) { + renderLine.emplace_back(shapePoint.x, shapePoint.y); + } + + renderGeometry.push_back(renderLine); + } + + auto renderFeature = std::make_shared<LiveTileFeature>(renderType, renderGeometry); + + renderLayer->addFeature(renderFeature); + } + + // move the layer to the render tile + renderTile->addLayer(layerID, renderLayer); + + // associate the annotation with the tile + auto tile_update_it = tiles.find(id); + assert(tile_update_it != tiles.end()); + tile_update_it->second.first.insert(annotationID); + } + } + } } - return nullptr; + + return renderTile; } -const std::string AnnotationManager::layerID = "com.mapbox.annotations.points"; +const std::string AnnotationManager::PointLayerID = "com.mapbox.annotations.points"; +const std::string AnnotationManager::ShapeLayerID = "com.mapbox.annotations.shape"; } diff --git a/src/mbgl/map/annotation.hpp b/src/mbgl/map/annotation.hpp index 0c9a078e57..213ff608a0 100644 --- a/src/mbgl/map/annotation.hpp +++ b/src/mbgl/map/annotation.hpp @@ -1,8 +1,13 @@ #ifndef MBGL_MAP_ANNOTATIONS #define MBGL_MAP_ANNOTATIONS +#include <mbgl/map/map.hpp> +#include <mbgl/map/geometry_tile.hpp> #include <mbgl/map/tile_id.hpp> +#include <mbgl/style/style_properties.hpp> +#include <mbgl/style/types.hpp> #include <mbgl/util/geo.hpp> +#include <mbgl/util/geojsonvt/geojsonvt.hpp> #include <mbgl/util/noncopyable.hpp> #include <mbgl/util/vec.hpp> @@ -18,35 +23,87 @@ namespace mbgl { class Annotation; class Map; class LiveTile; +class LiveTileFeature; class MapData; -using AnnotationIDs = std::vector<uint32_t>; +using AnnotationsProperties = std::unordered_map<std::string, std::vector<std::string>>; + +using GeoJSONVT = mapbox::util::geojsonvt::GeoJSONVT; + +class Annotation : private util::noncopyable { + friend class AnnotationManager; +public: + Annotation(AnnotationType, const AnnotationSegments&, const StyleProperties&); + +public: + const StyleProperties styleProperties; + +private: + LatLng getPoint() const; + LatLngBounds getBounds() const { return bounds; } + +private: + const AnnotationType type = AnnotationType::Point; + const AnnotationSegments geometry; + std::unordered_map<TileID, std::weak_ptr<const LiveTileFeature>, TileID::Hash> tilePointFeatures; + const LatLngBounds bounds; +}; class AnnotationManager : private util::noncopyable { public: AnnotationManager(); ~AnnotationManager(); + void markStaleTiles(std::unordered_set<TileID, TileID::Hash>); + std::unordered_set<TileID, TileID::Hash> resetStaleTiles(); + void setDefaultPointAnnotationSymbol(const std::string& symbol); - std::pair<std::vector<TileID>, AnnotationIDs> addPointAnnotations( - const std::vector<LatLng>&, const std::vector<std::string>& symbols, const MapData&); - std::vector<TileID> removeAnnotations(const AnnotationIDs&, const MapData&); - AnnotationIDs getAnnotationsInBounds(const LatLngBounds&, const MapData&) const; + std::pair<std::unordered_set<TileID, TileID::Hash>, AnnotationIDs> addPointAnnotations( + const AnnotationSegment&, + const AnnotationsProperties&, + const MapData&); + std::pair<std::unordered_set<TileID, TileID::Hash>, AnnotationIDs> addShapeAnnotations( + const std::vector<AnnotationSegments>&, + const std::vector<StyleProperties>&, + const AnnotationsProperties&, + const MapData&); + std::unordered_set<TileID, TileID::Hash> removeAnnotations(const AnnotationIDs&, const MapData&); + AnnotationIDs getOrderedShapeAnnotations() const { return orderedShapeAnnotations; } + const StyleProperties getAnnotationStyleProperties(uint32_t) const; + AnnotationIDs getAnnotationsInBounds(const LatLngBounds&, const MapData&, const AnnotationType& = AnnotationType::Any) const; LatLngBounds getBoundsForAnnotations(const AnnotationIDs&) const; const LiveTile* getTile(const TileID& id); - static const std::string layerID; + static const std::string PointLayerID; + static const std::string ShapeLayerID; private: inline uint32_t nextID(); static vec2<double> projectPoint(const LatLng& point); + std::pair<std::unordered_set<TileID, TileID::Hash>, AnnotationIDs> addAnnotations( + const AnnotationType, + const std::vector<AnnotationSegments>&, + const std::vector<StyleProperties>&, + const AnnotationsProperties&, + const MapData&); + std::unordered_set<TileID, TileID::Hash> addTileFeature( + const uint32_t annotationID, + const AnnotationSegments&, + const std::vector<std::vector<vec2<double>>>& projectedFeature, + const AnnotationType&, + const StyleProperties&, + const std::unordered_map<std::string, std::string>& featureProperties, + const uint8_t maxZoom); private: mutable std::mutex mtx; std::string defaultPointAnnotationSymbol; std::unordered_map<uint32_t, std::unique_ptr<Annotation>> annotations; + std::vector<uint32_t> orderedShapeAnnotations; std::unordered_map<TileID, std::pair<std::unordered_set<uint32_t>, std::unique_ptr<LiveTile>>, TileID::Hash> tiles; + std::unordered_map<uint32_t, std::unique_ptr<GeoJSONVT>> shapeTilers; + std::unordered_set<TileID, TileID::Hash> staleTiles; uint32_t nextID_ = 0; }; diff --git a/src/mbgl/map/live_tile.cpp b/src/mbgl/map/live_tile.cpp index 06337af184..f7a70f7d46 100644 --- a/src/mbgl/map/live_tile.cpp +++ b/src/mbgl/map/live_tile.cpp @@ -3,7 +3,8 @@ namespace mbgl { -LiveTileFeature::LiveTileFeature(FeatureType type_, GeometryCollection geometries_, std::map<std::string, std::string> properties_) +LiveTileFeature::LiveTileFeature(FeatureType type_, GeometryCollection geometries_, + std::unordered_map<std::string, std::string> properties_) : type(type_), properties(properties_), geometries(geometries_) {} @@ -41,6 +42,10 @@ void LiveTile::addLayer(const std::string& name, util::ptr<LiveTileLayer> layer) layers.emplace(name, std::move(layer)); } +void LiveTile::removeLayer(const std::string& name) { + layers.erase(name); +} + util::ptr<GeometryTileLayer> LiveTile::getLayer(const std::string& name) const { return getMutableLayer(name); } diff --git a/src/mbgl/map/live_tile.hpp b/src/mbgl/map/live_tile.hpp index b13b5a1f66..5b4c2d1c16 100644 --- a/src/mbgl/map/live_tile.hpp +++ b/src/mbgl/map/live_tile.hpp @@ -2,6 +2,7 @@ #define MBGL_MAP_LIVE_TILE #include <map> +#include <unordered_map> #include <mbgl/map/geometry_tile.hpp> @@ -9,7 +10,8 @@ namespace mbgl { class LiveTileFeature : public GeometryTileFeature { public: - LiveTileFeature(FeatureType, GeometryCollection, std::map<std::string, std::string> properties = {{}}); + LiveTileFeature(FeatureType, GeometryCollection, + std::unordered_map<std::string, std::string> properties = {{}}); FeatureType getType() const override { return type; } mapbox::util::optional<Value> getValue(const std::string&) const override; @@ -17,7 +19,7 @@ public: private: FeatureType type = FeatureType::Unknown; - std::map<std::string, std::string> properties; + std::unordered_map<std::string, std::string> properties; GeometryCollection geometries; }; @@ -40,6 +42,7 @@ public: LiveTile(); void addLayer(const std::string&, util::ptr<LiveTileLayer>); + void removeLayer(const std::string&); util::ptr<GeometryTileLayer> getLayer(const std::string&) const override; util::ptr<LiveTileLayer> getMutableLayer(const std::string&) const; diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 47c9472d59..8d5b544191 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -6,6 +6,8 @@ #include <mbgl/util/projection.hpp> #include <mbgl/util/thread.hpp> +#include <unordered_map> + namespace mbgl { Map::Map(View& view, FileSource& fileSource, MapMode mode) @@ -239,8 +241,22 @@ uint32_t Map::addPointAnnotation(const LatLng& point, const std::string& symbol) return addPointAnnotations({ point }, { symbol }).front(); } -std::vector<uint32_t> Map::addPointAnnotations(const std::vector<LatLng>& points, const std::vector<std::string>& symbols) { - auto result = data->annotationManager.addPointAnnotations(points, symbols, *data); +AnnotationIDs Map::addPointAnnotations(const AnnotationSegment& points, + const std::vector<std::string>& symbols) { + AnnotationsProperties properties = { { "symbols", symbols } }; + auto result = data->annotationManager.addPointAnnotations(points, properties, *data); + context->invoke(&MapContext::updateAnnotationTiles, result.first); + return result.second; +} + +uint32_t Map::addShapeAnnotation(const AnnotationSegments& shape, + const StyleProperties& styleProperties) { + return addShapeAnnotations({ shape }, { styleProperties }).front(); +} + +AnnotationIDs Map::addShapeAnnotations(const std::vector<AnnotationSegments>& shapes, + const std::vector<StyleProperties>& styleProperties) { + auto result = data->annotationManager.addShapeAnnotations(shapes, styleProperties, {{}}, *data); context->invoke(&MapContext::updateAnnotationTiles, result.first); return result.second; } @@ -254,8 +270,8 @@ void Map::removeAnnotations(const std::vector<uint32_t>& annotations) { context->invoke(&MapContext::updateAnnotationTiles, result); } -std::vector<uint32_t> Map::getAnnotationsInBounds(const LatLngBounds& bounds) { - return data->annotationManager.getAnnotationsInBounds(bounds, *data); +std::vector<uint32_t> Map::getAnnotationsInBounds(const LatLngBounds& bounds, const AnnotationType& type) { + return data->annotationManager.getAnnotationsInBounds(bounds, *data, type); } LatLngBounds Map::getBoundsForAnnotations(const std::vector<uint32_t>& annotations) { diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp index c349bdd155..bd288a5cda 100644 --- a/src/mbgl/map/map_context.cpp +++ b/src/mbgl/map/map_context.cpp @@ -3,6 +3,7 @@ #include <mbgl/map/view.hpp> #include <mbgl/map/environment.hpp> #include <mbgl/map/still_image.hpp> +#include <mbgl/map/annotation.hpp> #include <mbgl/platform/log.hpp> @@ -12,12 +13,16 @@ #include <mbgl/storage/response.hpp> #include <mbgl/style/style.hpp> +#include <mbgl/style/style_bucket.hpp> +#include <mbgl/style/style_layer.hpp> #include <mbgl/util/uv_detail.hpp> #include <mbgl/util/worker.hpp> #include <mbgl/util/texture_pool.hpp> #include <mbgl/util/exception.hpp> +#include <algorithm> + namespace mbgl { MapContext::MapContext(uv_loop_t* loop, View& view_, FileSource& fileSource, MapData& data_) @@ -112,6 +117,11 @@ void MapContext::loadStyleJSON(const std::string& json, const std::string& base) style->setObserver(this); triggerUpdate(Update::Zoom); + + auto staleTiles = data.annotationManager.resetStaleTiles(); + if (staleTiles.size()) { + updateAnnotationTiles(staleTiles); + } } void MapContext::updateTiles() { @@ -120,15 +130,111 @@ void MapContext::updateTiles() { style->update(data, transformState, *texturePool); } -void MapContext::updateAnnotationTiles(const std::vector<TileID>& ids) { +void MapContext::updateAnnotationTiles(const std::unordered_set<TileID, TileID::Hash>& ids) { assert(Environment::currentlyOn(ThreadType::Map)); + + data.annotationManager.markStaleTiles(ids); + if (!style) return; + + // grab existing, single shape annotations source + const auto& shapeID = AnnotationManager::ShapeLayerID; + + const auto source_it = std::find_if(style->sources.begin(), style->sources.end(), + [&shapeID](util::ptr<Source> source) { + return (source->info.source_id == shapeID); + }); + assert(source_it != style->sources.end()); + source_it->get()->enabled = true; + + // create (if necessary) layers and buckets for each shape + for (const auto &shapeAnnotationID : data.annotationManager.getOrderedShapeAnnotations()) { + const std::string shapeLayerID = shapeID + "." + std::to_string(shapeAnnotationID); + + const auto layer_it = std::find_if(style->layers.begin(), style->layers.end(), + [&shapeLayerID](util::ptr<StyleLayer> layer) { + return (layer->id == shapeLayerID); + }); + + if (layer_it == style->layers.end()) { + // query shape styling + auto& shapeStyle = data.annotationManager.getAnnotationStyleProperties(shapeAnnotationID); + + // apply shape paint properties + ClassProperties paintProperties; + + if (shapeStyle.is<LineProperties>()) { + // opacity + PropertyValue lineOpacity = ConstantFunction<float>(shapeStyle.get<LineProperties>().opacity); + paintProperties.set(PropertyKey::LineOpacity, lineOpacity); + + // line width + PropertyValue lineWidth = ConstantFunction<float>(shapeStyle.get<LineProperties>().width); + paintProperties.set(PropertyKey::LineWidth, lineWidth); + + // stroke color + PropertyValue strokeColor = ConstantFunction<Color>(shapeStyle.get<LineProperties>().color); + paintProperties.set(PropertyKey::LineColor, strokeColor); + } else if (shapeStyle.is<FillProperties>()) { + // opacity + PropertyValue fillOpacity = ConstantFunction<float>(shapeStyle.get<FillProperties>().opacity); + paintProperties.set(PropertyKey::FillOpacity, fillOpacity); + + // fill color + PropertyValue fillColor = ConstantFunction<Color>(shapeStyle.get<FillProperties>().fill_color); + paintProperties.set(PropertyKey::FillColor, fillColor); + + // stroke color + PropertyValue strokeColor = ConstantFunction<Color>(shapeStyle.get<FillProperties>().stroke_color); + paintProperties.set(PropertyKey::FillOutlineColor, strokeColor); + } + + std::map<ClassID, ClassProperties> shapePaints; + shapePaints.emplace(ClassID::Default, std::move(paintProperties)); + + // create shape layer + util::ptr<StyleLayer> shapeLayer = std::make_shared<StyleLayer>(shapeLayerID, std::move(shapePaints)); + shapeLayer->type = (shapeStyle.is<LineProperties>() ? StyleLayerType::Line : StyleLayerType::Fill); + + // add to end of other shape layers just before (last) point layer + style->layers.emplace((style->layers.end() - 2), shapeLayer); + + // create shape bucket & connect to source + util::ptr<StyleBucket> shapeBucket = std::make_shared<StyleBucket>(shapeLayer->type); + shapeBucket->name = shapeLayer->id; + shapeBucket->source_layer = shapeLayer->id; + shapeBucket->source = *source_it; + + // apply line layout properties to bucket + if (shapeStyle.is<LineProperties>()) { + shapeBucket->layout.set(PropertyKey::LineJoin, ConstantFunction<JoinType>(JoinType::Round)); + } + + // connect layer to bucket + shapeLayer->bucket = shapeBucket; + } + } + + // invalidate annotations layer tiles for (const auto &source : style->sources) { if (source->info.type == SourceType::Annotations) { source->invalidateTiles(ids); } } - triggerUpdate(); + + cascadeClasses(); + + triggerUpdate(Update::Classes); + + data.annotationManager.resetStaleTiles(); +} + +void MapContext::cascadeClasses() { + style->cascade(data.getClasses()); +} + +void MapContext::recalculateStyle(TimePoint now) { + style->recalculate(transformState.getNormalizedZoom(), now); } void MapContext::update() { @@ -146,12 +252,12 @@ void MapContext::update() { } if (updated & static_cast<UpdateType>(Update::Classes)) { - style->cascade(data.getClasses()); + cascadeClasses(); } if (updated & static_cast<UpdateType>(Update::Classes) || updated & static_cast<UpdateType>(Update::Zoom)) { - style->recalculate(transformState.getNormalizedZoom(), now); + recalculateStyle(now); } updateTiles(); diff --git a/src/mbgl/map/map_context.hpp b/src/mbgl/map/map_context.hpp index 81e757c4cf..16fdea1820 100644 --- a/src/mbgl/map/map_context.hpp +++ b/src/mbgl/map/map_context.hpp @@ -49,7 +49,7 @@ public: std::string getStyleJSON() const { return styleJSON; } double getTopOffsetPixelsForAnnotationSymbol(const std::string& symbol); - void updateAnnotationTiles(const std::vector<TileID>&); + void updateAnnotationTiles(const std::unordered_set<TileID, TileID::Hash>&); void setSourceTileCacheSize(size_t size); void onLowMemory(); @@ -63,6 +63,10 @@ public: private: void updateTiles(); + // Style-related updates. + void cascadeClasses(); + void recalculateStyle(TimePoint); + // Update the state indicated by the accumulated Update flags, then render. void update(); diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 97adacad6d..7fb015c1da 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -521,11 +521,16 @@ bool Source::update(MapData& data, return allTilesUpdated; } -void Source::invalidateTiles(const std::vector<TileID>& ids) { +void Source::invalidateTiles(const std::unordered_set<TileID, TileID::Hash>& ids) { cache.clear(); - for (auto& id : ids) { - tiles.erase(id); - tile_data.erase(id); + if (ids.size()) { + for (auto& id : ids) { + tiles.erase(id); + tile_data.erase(id); + } + } else { + tiles.clear(); + tile_data.clear(); } updateTilePtrs(); } diff --git a/src/mbgl/map/source.hpp b/src/mbgl/map/source.hpp index be869559b5..aea8939c45 100644 --- a/src/mbgl/map/source.hpp +++ b/src/mbgl/map/source.hpp @@ -17,6 +17,7 @@ #include <forward_list> #include <iosfwd> #include <map> +#include <unordered_set> namespace mbgl { @@ -46,6 +47,7 @@ public: std::string attribution; std::array<float, 3> center = {{0, 0, 0}}; std::array<float, 4> bounds = {{-180, -90, 180, 90}}; + std::string source_id = ""; void parseTileJSONProperties(const rapidjson::Value&); std::string tileURL(const TileID& id, float pixelRatio) const; @@ -86,7 +88,7 @@ public: TexturePool&, bool shouldReparsePartialTiles); - void invalidateTiles(const std::vector<TileID>&); + void invalidateTiles(const std::unordered_set<TileID, TileID::Hash>&); void updateMatrices(const mat4 &projMatrix, const TransformState &transform); void drawClippingMasks(Painter &painter); diff --git a/src/mbgl/style/style_parser.cpp b/src/mbgl/style/style_parser.cpp index 83a113f885..c2aa115fa4 100644 --- a/src/mbgl/style/style_parser.cpp +++ b/src/mbgl/style/style_parser.cpp @@ -36,20 +36,30 @@ void StyleParser::parse(JSVal document) { if (document.HasMember("layers")) { parseLayers(document["layers"]); + // create shape annotations source + const std::string& shapeID = AnnotationManager::ShapeLayerID; + + util::ptr<Source> shapeAnnotationsSource = std::make_shared<Source>(); + sourcesMap.emplace(shapeID, shapeAnnotationsSource); + sources.emplace_back(shapeAnnotationsSource); + shapeAnnotationsSource->info.type = SourceType::Annotations; + shapeAnnotationsSource->info.source_id = shapeID; + // create point annotations layer - // - const std::string& id = AnnotationManager::layerID; + const std::string& pointID = AnnotationManager::PointLayerID; - std::map<ClassID, ClassProperties> paints; - util::ptr<StyleLayer> annotations = std::make_shared<StyleLayer>(id, std::move(paints)); - annotations->type = StyleLayerType::Symbol; - layersMap.emplace(id, std::pair<JSVal, util::ptr<StyleLayer>> { JSVal(id), annotations }); - layers.emplace_back(annotations); + std::map<ClassID, ClassProperties> pointPaints; + util::ptr<StyleLayer> pointAnnotationsLayer = std::make_shared<StyleLayer>(pointID, std::move(pointPaints)); + pointAnnotationsLayer->type = StyleLayerType::Symbol; + layersMap.emplace(pointID, std::pair<JSVal, util::ptr<StyleLayer>> { JSVal(pointID), pointAnnotationsLayer }); + layers.emplace_back(pointAnnotationsLayer); - util::ptr<StyleBucket> pointBucket = std::make_shared<StyleBucket>(annotations->type); - pointBucket->name = annotations->id; - pointBucket->source_layer = annotations->id; + // create point annotations symbol bucket + util::ptr<StyleBucket> pointBucket = std::make_shared<StyleBucket>(pointAnnotationsLayer->type); + pointBucket->name = pointAnnotationsLayer->id; + pointBucket->source_layer = pointAnnotationsLayer->id; + // build up point annotations style rapidjson::Document d; rapidjson::Value iconImage(rapidjson::kObjectType); iconImage.AddMember("icon-image", "{sprite}", d.GetAllocator()); @@ -58,14 +68,14 @@ void StyleParser::parse(JSVal document) { iconOverlap.AddMember("icon-allow-overlap", true, d.GetAllocator()); parseLayout(iconOverlap, pointBucket); - util::ptr<Source> source = std::make_shared<Source>(); - sourcesMap.emplace(id, source); - sources.emplace_back(source); - source->info.type = SourceType::Annotations; - pointBucket->source = source; - annotations->bucket = pointBucket; - // - // end point annotations + // create point annotations source & connect to bucket & layer + util::ptr<Source> pointAnnotationsSource = std::make_shared<Source>(); + sourcesMap.emplace(pointID, pointAnnotationsSource); + sources.emplace_back(pointAnnotationsSource); + pointAnnotationsSource->info.type = SourceType::Annotations; + pointAnnotationsSource->info.source_id = pointID; + pointBucket->source = pointAnnotationsSource; + pointAnnotationsLayer->bucket = pointBucket; } if (document.HasMember("sprite")) { diff --git a/src/mbgl/style/style_properties.cpp b/src/mbgl/style/style_properties.cpp index 29730fb85b..3c5b525c1d 100644 --- a/src/mbgl/style/style_properties.cpp +++ b/src/mbgl/style/style_properties.cpp @@ -1,4 +1,5 @@ #include <mbgl/style/style_properties.hpp> +#include <mbgl/style/piecewisefunction_properties.hpp> namespace mbgl { diff --git a/src/mbgl/util/geojsonvt b/src/mbgl/util/geojsonvt new file mode 160000 +Subproject ed99a6290fa42107a982e7f3675aae49d29026b |