diff --git a/app/Http/Controllers/MarkerController.php b/app/Http/Controllers/MarkerController.php index 8ee4265c..70c251c9 100644 --- a/app/Http/Controllers/MarkerController.php +++ b/app/Http/Controllers/MarkerController.php @@ -7,6 +7,7 @@ use App\Models\Map; use App\Models\Marker; use App\Models\MarkerLocation; +use App\Parsers\Files\GeoJSONParser; use App\Parsers\Files\GPXParser; use Carbon\Carbon; use MatanYadaev\EloquentSpatial\Objects\Point; @@ -324,7 +325,7 @@ public function storeInBulkFromFile(Request $request, Map $map) $request->validate([ 'file' => [ 'required', - File::types(['gpx']) + File::types(['gpx', 'geojson']) ->max(1024 * 3) ], ]); @@ -334,6 +335,8 @@ public function storeInBulkFromFile(Request $request, Map $map) if (Str::contains($fileMimeType, 'gpx')) { $parser = new GPXParser(); + } elseif (Str::contains($fileMimeType, 'json')) { + $parser = new GeoJSONParser(); } else { return response()->json(['error' => 'File type not supported'], 422); } diff --git a/app/Parsers/Files/FIleParser.php b/app/Parsers/Files/FIleParser.php index 92b4f41b..34436346 100644 --- a/app/Parsers/Files/FIleParser.php +++ b/app/Parsers/Files/FIleParser.php @@ -19,4 +19,12 @@ abstract public function parseFile(string $filepath): array; * @return array{category_name?: string, description?: string, link?: string, created_at?: string, updated_at?: string, meta: array, lat?: float, lng?: float, elevation?: float, locations?: array} */ abstract public function parseMarkersFromFile(string $filepath): array; + + /** + * Parse the map details from the file. + * + * @param string $filepath + * @return array{title?: string, description?: string} + */ + abstract public function parseMapDetailsFromFile(string $filepath): array; } diff --git a/app/Parsers/Files/GPXParser.php b/app/Parsers/Files/GPXParser.php index 2bb25744..ce4a1445 100644 --- a/app/Parsers/Files/GPXParser.php +++ b/app/Parsers/Files/GPXParser.php @@ -4,12 +4,6 @@ class GPXParser extends FIleParser { - /** - * Parse the GPX file. - * - * @param string $filepath - * @return array - */ public function parseFile(string $filepath): array { return [ @@ -135,12 +129,6 @@ public function parseMarkersFromFile(string $filepath): array return $markers; } - /** - * Parse the map details, like the name, description, author, etc. - * - * @param string $filepath - * @return array - */ public function parseMapDetailsFromFile(string $filepath): array { $xml = simplexml_load_file($filepath); @@ -153,6 +141,9 @@ public function parseMapDetailsFromFile(string $filepath): array $mapDetails = $array['metadata']; } - return $mapDetails; + return [ + 'title' => $mapDetails['name'] ?? null, + 'description' => $mapDetails['desc'] ?? null, + ]; } } diff --git a/app/Parsers/Files/GeoJSONParser.php b/app/Parsers/Files/GeoJSONParser.php new file mode 100644 index 00000000..cf02b561 --- /dev/null +++ b/app/Parsers/Files/GeoJSONParser.php @@ -0,0 +1,79 @@ + $this->parseMapDetailsFromFile($filepath), + 'markers' => $this->parseMarkersFromFile($filepath), + ]; + } + + public function parseMarkersFromFile(string $filepath): array + { + $json = file_get_contents($filepath); + $data = json_decode($json, true); + + $markers = []; + + if (isset($data['features'])) { + foreach ($data['features'] as $feature) { + // Depending on the type of geometry, the coordinates can be in different places + // If its just a point, the coordinates are in the first level of the geometry object + if ($feature['geometry']['type'] === 'Point') { + $markers[] = [ + 'lat' => $feature['geometry']['coordinates'][1], + 'lng' => $feature['geometry']['coordinates'][0], + 'category_name' => $feature['properties']['name'] ?? 'Feature', + 'description' => $feature['properties']['description'] ?? null, + 'link' => $feature['properties']['link'] ?? null, + 'elevation' => $feature['properties']['elevation'] ?? null, + 'created_at' => $feature['properties']['time'] ?? null, + 'updated_at' => $feature['properties']['time'] ?? null, + 'meta' => $feature['properties'], + ]; + } elseif ($feature['geometry']['type'] === 'LineString') { + // Else if its a lineString, we have to add it to markers.locations for each coordinate + + $locations = []; + + $pointers = 0; + foreach ($feature['geometry']['coordinates'] as $coordinate) { + $locations[] = [ + 'lat' => $coordinate[1], + 'lng' => $coordinate[0], + 'elevation' => $coordinate[2] ?? null, + + // There may be a coordTimes array in the properties, which we can use to set the created_at and updated_at + 'created_at' => $feature['properties']['coordTimes'][$pointers] ?? null, + 'updated_at' => $feature['properties']['coordTimes'][$pointers] ?? null, + ]; + } + + $markers[] = [ + 'category_name' => $feature['properties']['name'] ?? 'Feature', + 'description' => $feature['properties']['description'] ?? null, + 'link' => $feature['properties']['link'] ?? null, + 'created_at' => $feature['properties']['time'] ?? null, + 'updated_at' => $feature['properties']['time'] ?? null, + 'meta' => $feature['properties'], + 'locations' => $locations, + ]; + } + } + } + + return $markers; + } + + public function parseMapDetailsFromFile(string $filepath): array + { + return [ + 'name' => pathinfo($filepath, PATHINFO_FILENAME), + 'description' => 'A map of ' . pathinfo($filepath, PATHINFO_FILENAME), + ]; + } +} diff --git a/tests/Unit/MarkerTest.php b/tests/Unit/MarkerTest.php index 271a97a8..67a2b991 100644 --- a/tests/Unit/MarkerTest.php +++ b/tests/Unit/MarkerTest.php @@ -454,6 +454,57 @@ public function testCreateMarkerInBulkWithGpxFile() $this->assertEquals(11, $map->markers()->whereNotNull('meta->number')->count()); } + public function testCreateMarkerInBulkWithGeoJSONFile() + { + $this->withoutExceptionHandling(); + + // Skip any dispatched jobs + $this->expectsJobs([ + FillMissingMarkerElevation::class, + FillMissingLocationGeocodes::class, + ]); + + // We need to clean up the database before we start + DB::table('markers')->delete(); + DB::table('marker_locations')->delete(); + + $map = new \App\Models\Map(); + $map->users_can_create_markers = 'yes'; + $map->options = ['links' => 'optional']; + $map->save(); + + $user = User::factory()->create(); + + /** + * @var \Illuminate\Contracts\Auth\Authenticatable + */ + $user = $user->givePermissionTo('create markers in bulk'); + + $this->actingAs($user, 'api'); + + $geojson = file_get_contents(base_path('tests/fixtures/ashland.geojson')); + + $file = UploadedFile::fake()->createWithContent('ashland.geojson', $geojson); + + $response = $this->postJson('/api/maps/' . $map->uuid . '/markers/file', ['file' => $file]); + $response->assertStatus(200); + + // The ashland DB file shoulda add 11 , 25 wpt, so we should have 36 markers + $this->assertEquals(36, $map->markers()->count()); + + // The DB file adds 348 trkpt, so we should have 348 locations + 25 wpt + $this->assertEquals(373, $map->markerLocations()->count()); + + // 271 of the locations should have an elevation - note its normal this one is lower than the GPX one, some of the elevations were lost in the conversion to GeoJSON + $this->assertEquals(265, $map->markerLocations()->whereNotNull('elevation')->count()); + + // 267 should have created_at and updated_at on 2002-04-21 (any time) + $this->assertEquals(267, $map->markerLocations()->whereDate('marker_locations.created_at', '2002-04-21')->whereDate('marker_locations.updated_at', '2002-04-21')->count()); + + // The others should have todays date + $this->assertEquals(106, $map->markerLocations()->whereDate('marker_locations.created_at', now()->toDateString())->whereDate('marker_locations.updated_at', now()->toDateString())->count()); + } + /** * A basic test example. * diff --git a/tests/fixtures/ashland.geojson b/tests/fixtures/ashland.geojson new file mode 100644 index 00000000..3220acd8 --- /dev/null +++ b/tests/fixtures/ashland.geojson @@ -0,0 +1,2472 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "name": "ASP QUARRY", + "desc": "Quarry Route in Ashland" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.475141, + 42.233167 + ], + [ + -71.477802, + 42.231813 + ], + [ + -71.479332, + 42.2325 + ], + [ + -71.478509, + 42.235003 + ], + [ + -71.476585, + 42.23663 + ], + [ + -71.474188, + 42.236069 + ], + [ + -71.47375, + 42.234782 + ], + [ + -71.472736, + 42.233651 + ], + [ + -71.472161, + 42.232583 + ], + [ + -71.472123, + 42.231611 + ], + [ + -71.474505, + 42.230551 + ], + [ + -71.475523, + 42.229304 + ], + [ + -71.476897, + 42.229743 + ], + [ + -71.477775, + 42.231129 + ], + [ + -71.476559, + 42.232236 + ], + [ + -71.475043, + 42.233133 + ], + [ + -71.473395, + 42.234393 + ], + [ + -71.473494, + 42.234427 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "ASP RESERV", + "desc": "Reservoir ASP" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.477197, + 42.225212 + ], + [ + -71.475798, + 42.226611 + ], + [ + -71.477173, + 42.228311 + ], + [ + -71.474977, + 42.22915 + ], + [ + -71.474195, + 42.230248 + ], + [ + -71.472386, + 42.23108 + ], + [ + -71.470825, + 42.230825 + ], + [ + -71.47051, + 42.231444 + ], + [ + -71.46921, + 42.232913 + ], + [ + -71.469197, + 42.233814 + ], + [ + -71.470424, + 42.23422 + ], + [ + -71.470748, + 42.233816 + ], + [ + -71.472166, + 42.235371 + ], + [ + -71.470456, + 42.236272 + ], + [ + -71.4681, + 42.236755 + ], + [ + -71.467932, + 42.236183 + ], + [ + -71.466962, + 42.237428 + ], + [ + -71.468046, + 42.237873 + ], + [ + -71.469098, + 42.23749 + ], + [ + -71.469905, + 42.238301 + ], + [ + -71.468992, + 42.238501 + ], + [ + -71.466047, + 42.241302 + ], + [ + -71.463884, + 42.241781 + ], + [ + -71.464208, + 42.242639 + ], + [ + -71.463527, + 42.242581 + ], + [ + -71.463655, + 42.243371 + ], + [ + -71.465419, + 42.242612 + ], + [ + -71.466919, + 42.243769 + ], + [ + -71.464597, + 42.245152 + ], + [ + -71.465785, + 42.245775 + ], + [ + -71.464966, + 42.247161 + ], + [ + -71.458931, + 42.24657 + ], + [ + -71.46088, + 42.240585 + ], + [ + -71.466855, + 42.233432 + ], + [ + -71.470731, + 42.230899 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "ASP ROAD", + "desc": "Road ASP" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.475639, + 42.246102 + ], + [ + -71.470279, + 42.244165 + ], + [ + -71.470182, + 42.244167 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "ASP ROAD2", + "desc": "ASP Road2" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.486544, + 42.241075 + ], + [ + -71.482075, + 42.233428 + ], + [ + -71.478445, + 42.231093 + ], + [ + -71.476415, + 42.232469 + ], + [ + -71.476415, + 42.232469 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "CLINTONSTREET", + "desc": "Clinton Street" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.493087, + 42.237965 + ], + [ + -71.487405, + 42.231532 + ], + [ + -71.484958, + 42.230937 + ], + [ + -71.477746, + 42.22623 + ], + [ + -71.471448, + 42.223808 + ], + [ + -71.471451, + 42.22388 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "LAP 1", + "desc": "Braxton's First Lap", + "time": "2002-04-21T14:29:56Z", + "coordTimes": [ + "2002-04-21T14:29:56Z", + "2002-04-21T14:30:16Z", + "2002-04-21T14:30:26Z", + "2002-04-21T14:30:36Z", + "2002-04-21T14:30:46Z", + "2002-04-21T14:30:56Z", + "2002-04-21T14:31:06Z", + "2002-04-21T14:31:16Z", + "2002-04-21T14:31:26Z", + "2002-04-21T14:31:36Z", + "2002-04-21T14:31:46Z", + "2002-04-21T14:31:56Z", + "2002-04-21T14:32:06Z", + "2002-04-21T14:32:16Z", + "2002-04-21T14:32:26Z", + "2002-04-21T14:32:36Z", + "2002-04-21T14:32:46Z", + "2002-04-21T14:32:56Z", + "2002-04-21T14:33:06Z", + "2002-04-21T14:33:16Z", + "2002-04-21T14:33:26Z", + "2002-04-21T14:33:36Z", + "2002-04-21T14:33:46Z", + "2002-04-21T14:33:56Z", + "2002-04-21T14:34:06Z", + "2002-04-21T14:34:16Z", + "2002-04-21T14:34:26Z", + "2002-04-21T14:34:36Z", + "2002-04-21T14:34:46Z", + "2002-04-21T14:34:56Z", + "2002-04-21T14:35:06Z", + "2002-04-21T14:35:16Z", + "2002-04-21T14:35:26Z", + "2002-04-21T14:35:36Z", + "2002-04-21T14:35:46Z", + "2002-04-21T14:35:56Z", + "2002-04-21T14:36:06Z", + "2002-04-21T14:36:16Z", + "2002-04-21T14:36:26Z", + "2002-04-21T14:36:36Z", + "2002-04-21T14:36:46Z", + "2002-04-21T14:36:56Z", + "2002-04-21T14:37:06Z", + "2002-04-21T14:37:16Z", + "2002-04-21T14:37:26Z", + "2002-04-21T14:37:36Z", + "2002-04-21T14:37:46Z", + "2002-04-21T14:37:56Z", + "2002-04-21T14:38:06Z", + "2002-04-21T14:38:16Z", + "2002-04-21T14:38:26Z", + "2002-04-21T14:38:36Z", + "2002-04-21T14:38:46Z", + "2002-04-21T14:38:56Z", + "2002-04-21T14:39:06Z", + "2002-04-21T14:39:16Z", + "2002-04-21T14:39:26Z", + "2002-04-21T14:39:36Z", + "2002-04-21T14:39:46Z", + "2002-04-21T14:39:56Z", + "2002-04-21T14:40:06Z", + "2002-04-21T14:40:16Z", + "2002-04-21T14:40:26Z", + "2002-04-21T14:40:36Z", + "2002-04-21T14:40:46Z", + "2002-04-21T14:40:56Z", + "2002-04-21T14:41:06Z", + "2002-04-21T14:41:16Z", + "2002-04-21T14:41:26Z", + "2002-04-21T14:41:36Z", + "2002-04-21T14:41:46Z", + "2002-04-21T14:41:56Z", + "2002-04-21T14:42:06Z", + "2002-04-21T14:42:16Z", + "2002-04-21T14:42:26Z", + "2002-04-21T14:42:36Z", + "2002-04-21T14:42:46Z", + "2002-04-21T14:42:56Z", + "2002-04-21T14:43:06Z" + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.468811, + 42.244642, + 65.50708 + ], + [ + -71.46879, + 42.244642, + 67.429688 + ], + [ + -71.46879, + 42.24462, + 68.390869 + ], + [ + -71.468811, + 42.244685, + 70.313477 + ], + [ + -71.469197, + 42.244663, + 71.274902 + ], + [ + -71.469541, + 42.244384, + 71.755493 + ], + [ + -71.469884, + 42.244127, + 72.236206 + ], + [ + -71.470506, + 42.244148, + 71.274902 + ], + [ + -71.470206, + 42.244792, + 69.832886 + ], + [ + -71.470013, + 42.245371, + 72.236206 + ], + [ + -71.470184, + 42.245994, + 74.639526 + ], + [ + -71.47027, + 42.246594, + 78.965454 + ], + [ + -71.469798, + 42.247067, + 79.446045 + ], + [ + -71.468961, + 42.247474, + 78.004028 + ], + [ + -71.46806, + 42.247732, + 78.004028 + ], + [ + -71.467352, + 42.247646, + 78.004028 + ], + [ + -71.467073, + 42.247174, + 77.523438 + ], + [ + -71.466794, + 42.24668, + 78.004028 + ], + [ + -71.466343, + 42.24653, + 78.484741 + ], + [ + -71.466, + 42.247024, + 78.965454 + ], + [ + -71.465356, + 42.247496, + 77.042847 + ], + [ + -71.464713, + 42.247303, + 76.562134 + ], + [ + -71.463919, + 42.247195, + 76.081421 + ], + [ + -71.463189, + 42.247109, + 75.120239 + ], + [ + -71.46246, + 42.247024, + 74.639526 + ], + [ + -71.461794, + 42.246959, + 73.678223 + ], + [ + -71.462181, + 42.246959, + 73.197632 + ], + [ + -71.462867, + 42.247024, + 73.197632 + ], + [ + -71.463597, + 42.247109, + 73.197632 + ], + [ + -71.464305, + 42.247174, + 73.197632 + ], + [ + -71.46497, + 42.24726, + 73.678223 + ], + [ + -71.465571, + 42.247388, + 74.158813 + ], + [ + -71.466172, + 42.247517, + 73.678223 + ], + [ + -71.466515, + 42.24741, + 75.60083 + ], + [ + -71.466665, + 42.247152, + 76.562134 + ], + [ + -71.466751, + 42.246959, + 76.081421 + ], + [ + -71.466751, + 42.24668, + 76.562134 + ], + [ + -71.466644, + 42.246122, + 76.562134 + ], + [ + -71.466537, + 42.245436, + 78.484741 + ], + [ + -71.466515, + 42.244728, + 78.484741 + ], + [ + -71.466622, + 42.244041, + 78.484741 + ], + [ + -71.466773, + 42.243762, + 78.484741 + ], + [ + -71.466944, + 42.243783, + 80.407471 + ], + [ + -71.467052, + 42.243719, + 80.888184 + ], + [ + -71.467137, + 42.243655, + 81.368774 + ], + [ + -71.467245, + 42.243633, + 80.407471 + ], + [ + -71.46733, + 42.24359, + 80.407471 + ], + [ + -71.467373, + 42.243569, + 80.407471 + ], + [ + -71.467416, + 42.243526, + 80.407471 + ], + [ + -71.467309, + 42.24344, + 81.849365 + ], + [ + -71.466794, + 42.243311, + 81.368774 + ], + [ + -71.466172, + 42.242968, + 81.368774 + ], + [ + -71.465871, + 42.242775, + 80.888184 + ], + [ + -71.4657, + 42.242453, + 81.368774 + ], + [ + -71.465721, + 42.24211, + 81.849365 + ], + [ + -71.465914, + 42.241917, + 81.849365 + ], + [ + -71.466193, + 42.241724, + 80.407471 + ], + [ + -71.466515, + 42.241423, + 80.407471 + ], + [ + -71.467052, + 42.241209, + 79.926636 + ], + [ + -71.467566, + 42.241101, + 79.446045 + ], + [ + -71.46791, + 42.240908, + 79.446045 + ], + [ + -71.468232, + 42.240801, + 79.926636 + ], + [ + -71.468554, + 42.240736, + 81.368774 + ], + [ + -71.468875, + 42.240672, + 81.849365 + ], + [ + -71.46924, + 42.240629, + 81.849365 + ], + [ + -71.469584, + 42.240694, + 82.810791 + ], + [ + -71.469841, + 42.240822, + 82.810791 + ], + [ + -71.47012, + 42.240908, + 86.175293 + ], + [ + -71.470377, + 42.241037, + 87.136597 + ], + [ + -71.470656, + 42.241209, + 88.098022 + ], + [ + -71.470957, + 42.24138, + 89.059326 + ], + [ + -71.470935, + 42.241616, + 93.385132 + ], + [ + -71.470957, + 42.241917, + 94.827148 + ], + [ + -71.471021, + 42.242303, + 94.346558 + ], + [ + -71.470935, + 42.242968, + 93.385132 + ], + [ + -71.471171, + 42.243612, + 93.385132 + ], + [ + -71.471107, + 42.244148, + 93.385132 + ], + [ + -71.470914, + 42.244277, + 93.865845 + ], + [ + -71.470592, + 42.244277, + 95.307739 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "LAP 2", + "desc": "Braxton's Second Lap", + "time": "2002-04-21T14:43:06Z", + "coordTimes": [ + "2002-04-21T14:43:06Z", + "2002-04-21T14:43:16Z", + "2002-04-21T14:43:26Z", + "2002-04-21T14:43:36Z", + "2002-04-21T14:43:46Z", + "2002-04-21T14:43:56Z", + "2002-04-21T14:44:06Z", + "2002-04-21T14:44:16Z", + "2002-04-21T14:44:26Z", + "2002-04-21T14:44:36Z", + "2002-04-21T14:44:46Z", + "2002-04-21T14:44:56Z", + "2002-04-21T14:45:06Z", + "2002-04-21T14:45:16Z", + "2002-04-21T14:45:26Z", + "2002-04-21T14:45:36Z", + "2002-04-21T14:45:46Z", + "2002-04-21T14:45:56Z", + "2002-04-21T14:46:06Z", + "2002-04-21T14:46:16Z", + "2002-04-21T14:46:26Z", + "2002-04-21T14:46:36Z", + "2002-04-21T14:46:46Z", + "2002-04-21T14:46:56Z", + "2002-04-21T14:47:06Z", + "2002-04-21T14:47:16Z", + "2002-04-21T14:47:26Z", + "2002-04-21T14:47:36Z", + "2002-04-21T14:47:46Z", + "2002-04-21T14:47:56Z", + "2002-04-21T14:48:06Z", + "2002-04-21T14:48:16Z", + "2002-04-21T14:48:26Z", + "2002-04-21T14:48:36Z", + "2002-04-21T14:48:46Z", + "2002-04-21T14:48:56Z", + "2002-04-21T14:49:06Z", + "2002-04-21T14:49:16Z", + "2002-04-21T14:49:26Z", + "2002-04-21T14:49:36Z", + "2002-04-21T14:49:46Z", + "2002-04-21T14:49:56Z", + "2002-04-21T14:50:06Z", + "2002-04-21T14:50:16Z", + "2002-04-21T14:50:26Z", + "2002-04-21T14:50:36Z", + "2002-04-21T14:50:46Z", + "2002-04-21T14:50:56Z", + "2002-04-21T14:51:06Z", + "2002-04-21T14:51:16Z", + "2002-04-21T14:51:26Z", + "2002-04-21T14:51:36Z", + "2002-04-21T14:51:46Z", + "2002-04-21T14:51:56Z", + "2002-04-21T14:52:06Z", + "2002-04-21T14:52:16Z", + "2002-04-21T14:52:26Z", + "2002-04-21T14:52:36Z", + "2002-04-21T14:52:46Z", + "2002-04-21T14:52:56Z", + "2002-04-21T14:53:06Z", + "2002-04-21T14:53:16Z", + "2002-04-21T14:53:26Z", + "2002-04-21T14:53:36Z", + "2002-04-21T14:53:46Z", + "2002-04-21T14:53:56Z", + "2002-04-21T14:54:06Z", + "2002-04-21T14:54:16Z", + "2002-04-21T14:54:26Z", + "2002-04-21T14:54:36Z", + "2002-04-21T14:54:46Z", + "2002-04-21T14:54:56Z", + "2002-04-21T14:55:06Z", + "2002-04-21T14:55:16Z", + "2002-04-21T14:55:26Z", + "2002-04-21T14:55:36Z", + "2002-04-21T14:55:46Z", + "2002-04-21T14:55:56Z", + "2002-04-21T14:56:06Z", + "2002-04-21T14:56:16Z", + "2002-04-21T14:56:26Z" + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.470592, + 42.244277, + 95.307739 + ], + [ + -71.470292, + 42.24447, + 95.307739 + ], + [ + -71.470099, + 42.244771, + 97.711182 + ], + [ + -71.46997, + 42.245049, + 99.153076 + ], + [ + -71.469948, + 42.245371, + 99.633789 + ], + [ + -71.470034, + 42.2458, + 99.633789 + ], + [ + -71.470099, + 42.246251, + 99.153076 + ], + [ + -71.470034, + 42.246745, + 98.672485 + ], + [ + -71.469498, + 42.247174, + 96.749878 + ], + [ + -71.46879, + 42.247474, + 93.865845 + ], + [ + -71.468039, + 42.24771, + 92.42395 + ], + [ + -71.467502, + 42.247667, + 91.943237 + ], + [ + -71.46733, + 42.247303, + 91.462524 + ], + [ + -71.467137, + 42.247024, + 92.904541 + ], + [ + -71.466837, + 42.246809, + 94.827148 + ], + [ + -71.466472, + 42.246788, + 94.827148 + ], + [ + -71.466172, + 42.24726, + 94.827148 + ], + [ + -71.465271, + 42.247474, + 92.42395 + ], + [ + -71.464906, + 42.247109, + 91.462524 + ], + [ + -71.464262, + 42.247045, + 90.02063 + ], + [ + -71.463618, + 42.246981, + 88.578735 + ], + [ + -71.462996, + 42.246938, + 87.136597 + ], + [ + -71.462417, + 42.246873, + 86.175293 + ], + [ + -71.461945, + 42.246809, + 85.213989 + ], + [ + -71.462417, + 42.246852, + 85.213989 + ], + [ + -71.463039, + 42.246916, + 84.733398 + ], + [ + -71.463661, + 42.247002, + 84.252686 + ], + [ + -71.464283, + 42.247088, + 83.771973 + ], + [ + -71.464863, + 42.247152, + 83.771973 + ], + [ + -71.465421, + 42.247303, + 82.810791 + ], + [ + -71.465957, + 42.24741, + 83.291382 + ], + [ + -71.466408, + 42.247453, + 84.733398 + ], + [ + -71.46673, + 42.247388, + 85.213989 + ], + [ + -71.466923, + 42.24726, + 84.733398 + ], + [ + -71.467052, + 42.247088, + 84.733398 + ], + [ + -71.467073, + 42.246852, + 85.213989 + ], + [ + -71.467052, + 42.246444, + 85.213989 + ], + [ + -71.46703, + 42.245886, + 85.213989 + ], + [ + -71.467159, + 42.245286, + 85.69458 + ], + [ + -71.467352, + 42.244599, + 84.733398 + ], + [ + -71.467438, + 42.24447, + 84.252686 + ], + [ + -71.467545, + 42.24447, + 84.252686 + ], + [ + -71.467652, + 42.244406, + 84.252686 + ], + [ + -71.467738, + 42.244277, + 84.252686 + ], + [ + -71.467824, + 42.244148, + 84.252686 + ], + [ + -71.467888, + 42.24402, + 85.213989 + ], + [ + -71.46791, + 42.243869, + 85.69458 + ], + [ + -71.467867, + 42.243719, + 87.136597 + ], + [ + -71.467588, + 42.243526, + 87.136597 + ], + [ + -71.467245, + 42.243354, + 86.656006 + ], + [ + -71.46688, + 42.243161, + 86.656006 + ], + [ + -71.466515, + 42.242968, + 86.656006 + ], + [ + -71.465828, + 42.241874, + 86.656006 + ], + [ + -71.466022, + 42.241638, + 86.175293 + ], + [ + -71.466472, + 42.241466, + 86.175293 + ], + [ + -71.466966, + 42.241209, + 86.175293 + ], + [ + -71.467395, + 42.24093, + 85.69458 + ], + [ + -71.467781, + 42.240672, + 84.252686 + ], + [ + -71.468124, + 42.240479, + 82.810791 + ], + [ + -71.468403, + 42.240372, + 81.849365 + ], + [ + -71.468661, + 42.240264, + 81.849365 + ], + [ + -71.468897, + 42.2402, + 80.407471 + ], + [ + -71.469133, + 42.240157, + 78.965454 + ], + [ + -71.469412, + 42.240136, + 78.965454 + ], + [ + -71.469734, + 42.240093, + 79.926636 + ], + [ + -71.470013, + 42.240114, + 80.888184 + ], + [ + -71.47027, + 42.240243, + 82.810791 + ], + [ + -71.47042, + 42.240372, + 84.733398 + ], + [ + -71.470592, + 42.240479, + 85.69458 + ], + [ + -71.470764, + 42.240651, + 87.136597 + ], + [ + -71.470978, + 42.240844, + 88.578735 + ], + [ + -71.471214, + 42.240994, + 90.981934 + ], + [ + -71.471107, + 42.24123, + 92.42395 + ], + [ + -71.471021, + 42.241466, + 92.42395 + ], + [ + -71.471043, + 42.241702, + 92.42395 + ], + [ + -71.471064, + 42.242024, + 92.904541 + ], + [ + -71.471128, + 42.242668, + 92.42395 + ], + [ + -71.471407, + 42.243161, + 92.42395 + ], + [ + -71.471386, + 42.243505, + 92.904541 + ], + [ + -71.471021, + 42.243805, + 92.42395 + ], + [ + -71.470571, + 42.243912, + 92.42395 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "LAP 3", + "desc": "Braxton's Third Lap", + "time": "2002-04-21T14:56:26Z", + "coordTimes": [ + "2002-04-21T14:56:26Z", + "2002-04-21T14:56:36Z", + "2002-04-21T14:56:46Z", + "2002-04-21T14:56:56Z", + "2002-04-21T14:57:06Z", + "2002-04-21T14:57:16Z", + "2002-04-21T14:57:26Z", + "2002-04-21T14:57:36Z", + "2002-04-21T14:57:46Z", + "2002-04-21T14:57:56Z", + "2002-04-21T14:58:06Z", + "2002-04-21T14:58:16Z", + "2002-04-21T14:58:26Z", + "2002-04-21T14:58:36Z", + "2002-04-21T14:58:46Z", + "2002-04-21T14:58:56Z", + "2002-04-21T14:59:06Z", + "2002-04-21T14:59:16Z", + "2002-04-21T14:59:26Z", + "2002-04-21T14:59:36Z", + "2002-04-21T14:59:46Z", + "2002-04-21T14:59:56Z", + "2002-04-21T15:00:06Z", + "2002-04-21T15:00:17Z", + "2002-04-21T15:00:27Z", + "2002-04-21T15:00:38Z", + "2002-04-21T15:00:49Z", + "2002-04-21T15:01:00Z", + "2002-04-21T15:01:10Z", + "2002-04-21T15:01:21Z", + "2002-04-21T15:01:32Z", + "2002-04-21T15:01:42Z", + "2002-04-21T15:01:52Z", + "2002-04-21T15:02:02Z", + "2002-04-21T15:02:12Z", + "2002-04-21T15:02:22Z", + "2002-04-21T15:02:32Z", + "2002-04-21T15:02:42Z", + "2002-04-21T15:02:52Z", + "2002-04-21T15:03:02Z", + "2002-04-21T15:03:12Z", + "2002-04-21T15:03:22Z", + "2002-04-21T15:03:32Z", + "2002-04-21T15:03:42Z", + "2002-04-21T15:03:52Z", + "2002-04-21T15:04:02Z" + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.470571, + 42.243912, + 92.42395 + ], + [ + -71.470034, + 42.243934, + 92.42395 + ], + [ + -71.469691, + 42.244298, + 92.904541 + ], + [ + -71.470206, + 42.245607, + 91.943237 + ], + [ + -71.470356, + 42.246144, + 90.501343 + ], + [ + -71.47042, + 42.246723, + 90.02063 + ], + [ + -71.470077, + 42.247303, + 88.578735 + ], + [ + -71.46939, + 42.24771, + 87.617188 + ], + [ + -71.468554, + 42.247989, + 85.69458 + ], + [ + -71.46776, + 42.248096, + 85.69458 + ], + [ + -71.467116, + 42.248096, + 85.69458 + ], + [ + -71.466923, + 42.247732, + 86.175293 + ], + [ + -71.466644, + 42.247431, + 86.175293 + ], + [ + -71.4663, + 42.247195, + 86.656006 + ], + [ + -71.465979, + 42.247603, + 85.213989 + ], + [ + -71.465206, + 42.248011, + 82.810791 + ], + [ + -71.46482, + 42.247624, + 82.330078 + ], + [ + -71.464155, + 42.247496, + 80.888184 + ], + [ + -71.46349, + 42.24741, + 79.446045 + ], + [ + -71.462846, + 42.247303, + 78.004028 + ], + [ + -71.462224, + 42.247217, + 76.081421 + ], + [ + -71.461816, + 42.247109, + 75.120239 + ], + [ + -71.462352, + 42.247152, + 74.158813 + ], + [ + -71.462975, + 42.247195, + 73.678223 + ], + [ + -71.463618, + 42.24726, + 73.678223 + ], + [ + -71.464198, + 42.247303, + 73.678223 + ], + [ + -71.464777, + 42.247345, + 73.197632 + ], + [ + -71.465335, + 42.247431, + 72.236206 + ], + [ + -71.465871, + 42.247517, + 71.755493 + ], + [ + -71.466215, + 42.247453, + 71.755493 + ], + [ + -71.4663, + 42.247281, + 72.236206 + ], + [ + -71.466429, + 42.247131, + 74.158813 + ], + [ + -71.466537, + 42.246959, + 76.081421 + ], + [ + -71.466601, + 42.246723, + 77.523438 + ], + [ + -71.466601, + 42.246401, + 77.042847 + ], + [ + -71.466579, + 42.2458, + 76.562134 + ], + [ + -71.466687, + 42.245286, + 76.562134 + ], + [ + -71.466923, + 42.244685, + 75.60083 + ], + [ + -71.467545, + 42.244599, + 74.639526 + ], + [ + -71.467996, + 42.244663, + 74.158813 + ], + [ + -71.468296, + 42.244685, + 74.158813 + ], + [ + -71.468489, + 42.244749, + 74.639526 + ], + [ + -71.468639, + 42.244813, + 76.562134 + ], + [ + -71.46879, + 42.244835, + 78.004028 + ], + [ + -71.468854, + 42.244728, + 79.926636 + ], + [ + -71.468897, + 42.244642, + 80.407471 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "OLIVE STREET", + "desc": "Olive Street" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.476375, + 42.245711 + ], + [ + -71.476454, + 42.242756 + ], + [ + -71.477592, + 42.239633 + ], + [ + -71.479715, + 42.238147 + ], + [ + -71.481121, + 42.234442 + ], + [ + -71.484958, + 42.230937 + ], + [ + -71.487297, + 42.226311 + ], + [ + -71.487251, + 42.226384 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "RT135 ASP", + "desc": "RT135 ASP" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.493169, + 42.238 + ], + [ + -71.475746, + 42.246158 + ], + [ + -71.47455, + 42.247805 + ], + [ + -71.471273, + 42.252054 + ], + [ + -71.468872, + 42.253871 + ], + [ + -71.467092, + 42.255494 + ], + [ + -71.461229, + 42.256845 + ], + [ + -71.461276, + 42.256808 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "VIL RUNNING", + "desc": "Vil running", + "time": "2002-04-21T14:14:37Z", + "coordTimes": [ + "2002-04-21T14:14:37Z", + "2002-04-21T14:14:41Z", + "2002-04-21T14:14:45Z", + "2002-04-21T14:14:56Z", + "2002-04-21T14:15:22Z", + "2002-04-21T14:15:41Z", + "2002-04-21T14:15:49Z", + "2002-04-21T14:15:54Z", + "2002-04-21T14:15:56Z", + "2002-04-21T14:16:23Z", + "2002-04-21T14:16:45Z", + "2002-04-21T14:17:10Z", + "2002-04-21T14:17:15Z", + "2002-04-21T14:17:34Z", + "2002-04-21T14:17:53Z", + "2002-04-21T14:17:56Z", + "2002-04-21T14:18:04Z", + "2002-04-21T14:18:09Z", + "2002-04-21T14:18:15Z", + "2002-04-21T14:18:17Z", + "2002-04-21T14:18:34Z", + "2002-04-21T14:18:35Z", + "2002-04-21T14:18:37Z", + "2002-04-21T14:18:45Z", + "2002-04-21T14:18:51Z", + "2002-04-21T14:18:56Z", + "2002-04-21T14:19:12Z", + "2002-04-21T14:19:46Z", + "2002-04-21T14:20:07Z", + "2002-04-21T14:20:15Z", + "2002-04-21T14:20:18Z", + "2002-04-21T14:20:23Z", + "2002-04-21T14:20:47Z", + "2002-04-21T14:20:57Z", + "2002-04-21T14:21:00Z", + "2002-04-21T14:21:04Z", + "2002-04-21T14:21:06Z", + "2002-04-21T14:21:08Z", + "2002-04-21T14:21:13Z", + "2002-04-21T14:21:18Z", + "2002-04-21T14:21:32Z", + "2002-04-21T14:21:34Z", + "2002-04-21T14:21:40Z", + "2002-04-21T14:21:58Z", + "2002-04-21T14:22:26Z", + "2002-04-21T14:22:35Z", + "2002-04-21T14:22:40Z", + "2002-04-21T14:22:42Z", + "2002-04-21T14:22:51Z", + "2002-04-21T14:23:05Z", + "2002-04-21T14:23:10Z", + "2002-04-21T14:23:13Z", + "2002-04-21T14:23:45Z", + "2002-04-21T14:24:35Z", + "2002-04-21T14:26:08Z", + "2002-04-21T14:26:19Z", + "2002-04-21T14:26:41Z", + "2002-04-21T14:26:57Z", + "2002-04-21T14:27:08Z" + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -71.46894, + 42.244771, + 76.562134 + ], + [ + -71.468961, + 42.244771, + 76.081421 + ], + [ + -71.469047, + 42.244706, + 76.562134 + ], + [ + -71.46939, + 42.244384, + 78.004028 + ], + [ + -71.470356, + 42.243805, + 76.081421 + ], + [ + -71.469905, + 42.244663, + 76.081421 + ], + [ + -71.469734, + 42.244899, + 76.081421 + ], + [ + -71.469669, + 42.245092, + 76.081421 + ], + [ + -71.469669, + 42.245178, + 76.081421 + ], + [ + -71.469862, + 42.246294, + 76.081421 + ], + [ + -71.469777, + 42.247152, + 78.484741 + ], + [ + -71.468489, + 42.247581, + 78.484741 + ], + [ + -71.468232, + 42.247646, + 78.484741 + ], + [ + -71.467373, + 42.247624, + 78.004028 + ], + [ + -71.466665, + 42.247174, + 78.004028 + ], + [ + -71.466601, + 42.247131, + 78.004028 + ], + [ + -71.466472, + 42.246873, + 78.484741 + ], + [ + -71.466451, + 42.246766, + 78.484741 + ], + [ + -71.466193, + 42.246594, + 78.484741 + ], + [ + -71.46615, + 42.24653, + 78.484741 + ], + [ + -71.465571, + 42.245564, + 76.562134 + ], + [ + -71.465571, + 42.245564, + 76.081421 + ], + [ + -71.465571, + 42.245522, + 75.60083 + ], + [ + -71.465421, + 42.245178, + 74.639526 + ], + [ + -71.465528, + 42.244921, + 74.639526 + ], + [ + -71.465657, + 42.244706, + 74.158813 + ], + [ + -71.465828, + 42.244105, + 73.678223 + ], + [ + -71.46615, + 42.242861, + 68.390869 + ], + [ + -71.467373, + 42.242839, + 71.755493 + ], + [ + -71.46718, + 42.242925, + 75.60083 + ], + [ + -71.467094, + 42.242947, + 76.081421 + ], + [ + -71.467094, + 42.243054, + 76.562134 + ], + [ + -71.465764, + 42.242453, + 77.042847 + ], + [ + -71.465399, + 42.242281, + 77.042847 + ], + [ + -71.465399, + 42.242217, + 77.042847 + ], + [ + -71.465399, + 42.242067, + 77.042847 + ], + [ + -71.465421, + 42.242024, + 77.042847 + ], + [ + -71.465442, + 42.242002, + 77.042847 + ], + [ + -71.465592, + 42.241852, + 77.042847 + ], + [ + -71.465807, + 42.241638, + 77.523438 + ], + [ + -71.466408, + 42.241294, + 77.523438 + ], + [ + -71.466472, + 42.241123, + 77.523438 + ], + [ + -71.466601, + 42.240801, + 78.004028 + ], + [ + -71.467288, + 42.240543, + 76.562134 + ], + [ + -71.468296, + 42.240071, + 76.562134 + ], + [ + -71.468596, + 42.2399, + 75.120239 + ], + [ + -71.46894, + 42.239943, + 75.120239 + ], + [ + -71.469069, + 42.239943, + 75.120239 + ], + [ + -71.469197, + 42.239814, + 75.120239 + ], + [ + -71.469584, + 42.239728, + 73.678223 + ], + [ + -71.469777, + 42.239749, + 73.678223 + ], + [ + -71.469884, + 42.239792, + 73.678223 + ], + [ + -71.470485, + 42.240243, + 73.678223 + ], + [ + -71.471879, + 42.241359, + 74.639526 + ], + [ + -71.470785, + 42.244341, + 75.60083 + ], + [ + -71.470463, + 42.244427, + 75.60083 + ], + [ + -71.469455, + 42.244427, + 57.816528 + ], + [ + -71.468897, + 42.244728, + 65.50708 + ], + [ + -71.468704, + 42.24462, + 63.584351 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "AQUADUCT", + "desc": "Aquaduct", + "type": "Dam", + "sym": "Dam" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.461807, + 42.24695 + ] + } + }, + { + "type": "Feature", + "properties": { + "desc": "Ashland", + "type": "Populated Place", + "sym": "City (Medium)" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.46336, + 42.26109, + 57.3024 + ] + } + }, + { + "type": "Feature", + "properties": { + "desc": "Ashland Junior High School", + "type": "School", + "sym": "School" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.47503, + 42.25165 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "FISH3", + "desc": "Ashland Reservoir", + "type": "Reservoir", + "sym": "Fishing Area" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.463566, + 42.244814 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "FISH4", + "desc": "Ashland Reservoir", + "type": "Reservoir", + "sym": "Fishing Area" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.464372, + 42.240618 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "FISH2", + "desc": "Ashland Reservoir", + "type": "Reservoir", + "sym": "Fishing Area" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.466227, + 42.237228 + ] + } + }, + { + "type": "Feature", + "properties": { + "desc": "Ashland Reservoir", + "type": "Reservoir", + "sym": "Waypoint" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.4578, + 42.24998, + 66.7512 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "FISH", + "desc": "Ashland Reservoir", + "type": "Reservoir", + "sym": "Fishing Area" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.470591, + 42.234756 + ] + } + }, + { + "type": "Feature", + "properties": { + "desc": "Ashland Reservoir Dam", + "type": "Dam", + "sym": "Dam" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.4578, + 42.24998 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "BEACH", + "desc": "Beach", + "type": "Beach", + "sym": "Picnic Area" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.466233, + 42.244198 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "BROOK", + "desc": "Brook", + "type": "Brook", + "sym": "Fishing Area" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.475453, + 42.230185 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "BUILDING", + "desc": "Building", + "type": "Dot", + "time": "2002-04-21T20:12:01Z", + "sym": "Building" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.465658, + 42.244674, + 74.40168 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "CAMPGROUND", + "desc": "Campground", + "type": "Campground", + "sym": "Campground" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.472931, + 42.238813 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "ENTRANCE", + "desc": "Entrance", + "type": "Building", + "sym": "Building" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.470428, + 42.244234 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "HILL", + "desc": "Hill", + "type": "Summit", + "sym": "Summit" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.466084, + 42.242238 + ] + } + }, + { + "type": "Feature", + "properties": { + "desc": "Magunco Hill", + "type": "Summit", + "sym": "Summit" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.4828, + 42.24998, + 124.968 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "PARKING 2", + "desc": "Overflow Parking", + "type": "Parking", + "sym": "Parking Area" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.467984, + 42.247466 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "PARKING", + "desc": "Parking", + "type": "Parking", + "sym": "Parking Area" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.4685, + 42.245149 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "QUARYBUILD", + "desc": "Quarry Building", + "type": "Building", + "sym": "Building" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.476243, + 42.231594 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "RESERVOIR", + "desc": "Reservoir", + "type": "Dam", + "sym": "Dam" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.469693, + 42.235352 + ] + } + }, + { + "type": "Feature", + "properties": { + "desc": "Romeos Shopping Center", + "type": "Locale", + "sym": "City (Small)" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.46614, + 42.2547 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "ROUT135ASP", + "desc": "Route 135 ASP", + "type": "Road", + "sym": "Truck Stop" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.487579, + 42.240261 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "STREAM", + "desc": "Stream", + "type": "Stream", + "sym": "Crossing" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.466977, + 42.24402 + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "TRANSITION", + "desc": "The Transition area\r\nThe race started and finished here, and each racer passed through here twice during the race to switch from running to biking, and from biking back to running.", + "type": "Dot", + "time": "2002-04-21T20:12:01Z", + "sym": "RV Park" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.468539, + 42.244646, + 92.6592 + ] + } + }, + { + "type": "Feature", + "properties": { + "desc": "Zachary Hill", + "type": "Summit", + "sym": "Summit" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -71.47669, + 42.23554, + 128.016 + ] + } + } + ] +} \ No newline at end of file