Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions public/fixtures/campaign_anavilhanas_archipelago.geojson
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"type": "FeatureCollection",
"name": "Campaign: Anavilhanas Archipelago Monitoring",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{
"type": "Feature",
"id": "anavilhanas-1",
"properties": {
"id": "anavilhanas-1",
"name": "Anavilhanas Archipelago Monitoring",
"campaign": "Anavilhanas Archipelago Monitoring",
"status": "active",
"partner": "ICMBio Brazil",
"acreage": 42000,
"watershed": "Rio Negro Archipelago",
"projectType": "Environmental Monitoring"
},
Comment on lines +9 to +18

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Critical: All fixture feature properties must match the Layer.tsx rendering contract.

Both reviewed fixtures (and likely all seven fixtures mentioned in the PR) use the old property schema instead of the unified schema described in PR objectives. Layer.tsx expects identifier, partners (array), measurement, restorationServices (array) and will crash when calling .join() on undefined or string values.

Apply the schema transformation to each fixture:

  • public/fixtures/campaign_anavilhanas_archipelago.geojson#L9-L18: Transform properties from name/partner/acreage/watershed to identifier/partners[]/measurement+unitOfMeasure/watershedRegion and add restorationServices: []
  • public/fixtures/campaign_solimoes_wetland.geojson#L9-L18: Apply the same transformation (see diff in first per-site comment for exact structure)
📍 Affects 2 files
  • public/fixtures/campaign_anavilhanas_archipelago.geojson#L9-L18 (this comment)
  • public/fixtures/campaign_solimoes_wetland.geojson#L9-L18
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@public/fixtures/campaign_anavilhanas_archipelago.geojson` around lines 9 -
18, The fixture properties use the old schema and must be updated to the unified
schema Layer.tsx expects: replace `name` with `identifier`, convert `partner`
(string) into `partners` (array of strings), split `acreage` into `measurement`
(numeric) and `unitOfMeasure` (e.g., "acres" or "ha"), rename `watershed` to
`watershedRegion`, and add an empty array `restorationServices: []`;
specifically update public/fixtures/campaign_anavilhanas_archipelago.geojson
(lines 9-18) to include identifier, partners[], measurement, unitOfMeasure,
watershedRegion and restorationServices: [] instead of
name/partner/acreage/watershed, and make the identical transformation in
public/fixtures/campaign_solimoes_wetland.geojson (lines 9-18) so both fixtures
conform to Layer.tsx's expected properties (`identifier`, `partners`,
`measurement`, `unitOfMeasure`, `watershedRegion`, `restorationServices`).

"geometry": {
"type": "Polygon",
"coordinates": [
[
[-60.1800, -2.9600],
[-60.1200, -2.9400],
[-60.0800, -2.9700],
[-60.0900, -3.0000],
[-60.1400, -3.0100],
[-60.1800, -2.9900],
[-60.1800, -2.9600]
]
]
}
Comment on lines +19 to +32

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Survey geometry types across all fixture files

fd -e geojson . public/fixtures/ --exec sh -c 'echo "File: {}"; jq -r ".features[].geometry.type" "{}"'

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 641


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find Layer.tsx and inspect geometry handling
fd -e ts -e tsx . -a public src --no-ignore-vcs 2>/dev/null | head -n 200 >/tmp/filelist.txt || true
# But better: locate Layer.tsx directly
LAYER_FILES=$(fd -i -a Layer.tsx . 2>/dev/null || true)
echo "Layer files:"
echo "$LAYER_FILES"

for f in $LAYER_FILES; do
  echo "---- $f (relevant excerpts) ----"
  # Grab lines mentioning geometry, coordinates, Point casting, etc.
  rg -n --hidden --no-ignore-vcs -S "geometry|coordinates|Point|GeoJSON|feature\.geometry" "$f" | head -n 200 || true
done

# Also search for where fixtures are loaded / which component consumes them (optional)
rg -n --hidden --no-ignore-vcs -S "fixtures/|campaign_anavilhanas_archipelago|campaign_solimoes_wetland" . | head -n 200 || true

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 801


Critical: Layer.tsx assumes GeoJSON Point geometry, but multiple fixtures provide Polygon geometries

src/components/Map/Layer.tsx casts feature.geometry to Point and reads coordinates as a point (coordinates[0]/coordinates[1]) to set the Leaflet Circle center. Polygon fixtures violate that contract and will produce incorrect center rendering.

Applies to all Polygon fixtures (not just the two called out):

  • public/fixtures/campaign_encontro_das_aguas.geojson
  • public/fixtures/campaign_taruma_corridor.geojson
  • public/fixtures/campaign_ducke_forest.geojson
  • public/fixtures/campaign_rio_negro_conservation.geojson
  • public/fixtures/campaign_puraquequara_lake.geojson
  • public/fixtures/campaign_anavilhanas_archipelago.geojson
  • public/fixtures/campaign_solimoes_wetland.geojson

Fix: either convert Polygon fixtures to Point (e.g., centroid/representative point) or update Layer.tsx to support Polygon rendering/centroiding. Clarify the intended “polygon map layers” behavior before proceeding.

📍 Affects 2 files
  • public/fixtures/campaign_anavilhanas_archipelago.geojson#L19-L32 (this comment)
  • public/fixtures/campaign_solimoes_wetland.geojson#L19-L31
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@public/fixtures/campaign_anavilhanas_archipelago.geojson` around lines 19 -
32, Layer.tsx currently assumes feature.geometry is a Point and reads
coordinates[0]/[1] to set a Circle center; update it to handle Polygon fixtures
by computing a representative point (centroid or first coordinate) when
geometry.type === "Polygon" and fall back to using coordinates for "Point" so
Circle centers are correct; modify the logic in the component/function that
reads feature.geometry (Layer.tsx) to detect geometry.type and extract center
accordingly (e.g., compute polygon centroid from geometry.coordinates[0] or use
turf.centroid if available), ensure typing reflects Geometry | Polygon handling,
and add tests or safeguards for null/invalid geometry. For the two fixture sites
referenced, update files as follows:
public/fixtures/campaign_anavilhanas_archipelago.geojson (lines 19-32) — no
direct change required to the fixture if Layer.tsx is fixed (do not convert the
Polygon here); public/fixtures/campaign_solimoes_wetland.geojson (lines 19-31) —
same: no fixture changes, fix is in Layer.tsx to support Polygons.

}
]
}
34 changes: 34 additions & 0 deletions public/fixtures/campaign_ducke_forest.geojson
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"type": "FeatureCollection",
"name": "Campaign: Ducke Forest Research",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{
"type": "Feature",
"id": "ducke-1",
"properties": {
"id": "ducke-1",
"name": "Ducke Forest Research",
"campaign": "Ducke Forest Research",
"status": "active",
"partner": "INPA Research Institute",
"acreage": 10000,
"watershed": "Upper Taruma Basin",
"projectType": "Research Station"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[-59.9700, -2.9500],
[-59.9200, -2.9500],
[-59.9200, -2.9900],
[-59.9400, -3.0100],
[-59.9700, -3.0000],
[-59.9700, -2.9500]
]
]
}
}
]
}
35 changes: 35 additions & 0 deletions public/fixtures/campaign_encontro_das_aguas.geojson
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"type": "FeatureCollection",
"name": "Campaign: Encontro das Aguas Reserve",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{
"type": "Feature",
"id": "encontro-1",
"properties": {
"id": "encontro-1",
"name": "Encontro das Aguas Reserve",
"campaign": "Encontro das Aguas Reserve",
"status": "active",
"partner": "Meeting of the Waters Foundation",
"acreage": 31000,
"watershed": "Negro-Solimoes Confluence",
"projectType": "Ecological Reserve"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[-59.9800, -3.0800],
[-59.9200, -3.0800],
[-59.9000, -3.1100],
[-59.9200, -3.1400],
[-59.9600, -3.1400],
[-59.9800, -3.1200],
[-59.9800, -3.0800]
]
]
Comment on lines +21 to +31

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

All 7 exterior polygon rings are wound clockwise — violates RFC 7946 §3.1.6

RFC 7946 §3.1.6 mandates that "a linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise." Applying the shoelace signed-area formula to each fixture confirms every exterior ring has a negative signed area (clockwise). The violation is consistent across all seven files.

For backwards compatibility, parsers SHOULD NOT reject polygons that do not follow the right-hand rule, so current Leaflet/Mapbox rendering will be unaffected. However, strict geospatial backends (PostGIS with ST_IsValid, certain spatial databases, and validation pipelines) do enforce winding order, which matters once the backend endpoints from Issue #206 land and these fixtures are used as reference shapes.

The fix is simply to reverse the interior points of each ring while keeping the closing coordinate:

🔧 Proposed fix for `campaign_encontro_das_aguas.geojson` (apply same reversal pattern to all 7 files)
         "coordinates": [
           [
-            [-59.9800, -3.0800],
-            [-59.9200, -3.0800],
-            [-59.9000, -3.1100],
-            [-59.9200, -3.1400],
-            [-59.9600, -3.1400],
-            [-59.9800, -3.1200],
-            [-59.9800, -3.0800]
+            [-59.9800, -3.0800],
+            [-59.9800, -3.1200],
+            [-59.9600, -3.1400],
+            [-59.9200, -3.1400],
+            [-59.9000, -3.1100],
+            [-59.9200, -3.0800],
+            [-59.9800, -3.0800]
           ]
         ]

You can automate rewinding all seven files at once using the geojson-rewind CLI or the equivalent npm package before this branch is merged.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"coordinates": [
[
[-59.9800, -3.0800],
[-59.9200, -3.0800],
[-59.9000, -3.1100],
[-59.9200, -3.1400],
[-59.9600, -3.1400],
[-59.9800, -3.1200],
[-59.9800, -3.0800]
]
]
"coordinates": [
[
[-59.9800, -3.0800],
[-59.9800, -3.1200],
[-59.9600, -3.1400],
[-59.9200, -3.1400],
[-59.9000, -3.1100],
[-59.9200, -3.0800],
[-59.9800, -3.0800]
]
]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@public/fixtures/campaign_encontro_das_aguas.geojson` around lines 23 - 33,
The polygon exterior ring in the "coordinates" array for
campaign_encontro_das_aguas.geojson is wound clockwise (violates RFC 7946
§3.1.6); fix it by reversing the order of the interior coordinate sequence for
each exterior LinearRing in the "coordinates" arrays (preserve the final closing
coordinate equal to the first), i.e., reverse the array of points inside each
top-level coordinates[0] ring so they become counterclockwise; apply the same
reversal pattern to the other six fixture files (or run a tool like
geojson-rewind) to ensure all exterior rings are CCW.

}
}
]
}
Comment on lines +1 to +35

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for the FeatureProperties type/interface to confirm schema alignment
rg -n --type ts -A 20 "FeatureProperties"

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 2071


🏁 Script executed:

#!/bin/bash
# Search for imports of the campaign fixture file
rg -n "campaign_encontro_das_aguas" --type ts

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 67


🏁 Script executed:

#!/bin/bash
# Search for FeatureProperties interface (excluding QGIS)
rg -n "interface FeatureProperties|type FeatureProperties" --type ts -A 15

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 67


🏁 Script executed:

#!/bin/bash
# Search for ProjectDetailView since it was mentioned as a consumer
rg -n "ProjectDetailView" --type ts -A 10 -B 5

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 67


🏁 Script executed:

#!/bin/bash
# List the overall structure
ls -la src/

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 721


🏁 Script executed:

#!/bin/bash
# Find all TypeScript files to understand project structure
fd -e ts -e tsx src/

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 407


🏁 Script executed:

#!/bin/bash
# Search for "Feature" related type definitions
rg -n "interface.*Feature|type.*Feature" --type ts

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 1051


🏁 Script executed:

#!/bin/bash
# Look for import.meta.glob patterns that might load fixtures
rg -n "import.meta.glob" --type ts

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 181


🏁 Script executed:

#!/bin/bash
# Read the geometry types file
cat -n src/types/geometry.ts

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 432


🏁 Script executed:

#!/bin/bash
# Read the fixture-reader.ts file
cat -n src/data/fixture-reader.ts

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 909


🏁 Script executed:

#!/bin/bash
# Search for Feature type with properties in TypeScript files
rg -n "properties:" --type ts -B 3 -A 3 | head -60

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 700


🏁 Script executed:

#!/bin/bash
# Search for components that use FixtureReader or access fixture data
rg -n "FixtureReader|fixture" --type ts -B 3 -A 3

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 2462


🏁 Script executed:

#!/bin/bash
# Search for components that might access feature properties like "identifier" or "partners"
rg -n "\.properties\.|identifier|partners" --type tsx -B 2 -A 2

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 113


🏁 Script executed:

#!/bin/bash
# Look at the components directory structure
find src/components -type f -name "*.tsx" -o -name "*.ts"

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 284


🏁 Script executed:

#!/bin/bash
# Check Layer.tsx which likely iterates over features
cat -n src/components/Map/Layer.tsx

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 793


🏁 Script executed:

#!/bin/bash
# Check MapContainer.tsx
cat -n src/components/Map/MapContainer.tsx

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 3684


🏁 Script executed:

#!/bin/bash
# Search for any property access on feature objects
rg -n "feature\.properties|\.properties\[" --type ts

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 228


🏁 Script executed:

#!/bin/bash
# Search for detail views or components that might show campaign info
rg -n "Detail|Campaign|campaign" --type ts --type tsx -i

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 113


🏁 Script executed:

#!/bin/bash
# Check what the geojson types define for properties
rg -n "properties" --type ts src/hooks src/components

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 204


🏁 Script executed:

#!/bin/bash
# Search for campaign or detail related files without tsx flag
find src -type f \( -name "*.ts" -o -name "*.tsx" \) | xargs grep -l "campaign\|Detail\|properties" -i

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 188


🏁 Script executed:

#!/bin/bash
# Check if there's a types file for campaign or feature-specific properties
ls -la src/types/

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 313


🏁 Script executed:

#!/bin/bash
# Search for all files that might define property-related interfaces
rg -n "interface.*Properties|type.*Properties" -u

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 150


🏁 Script executed:

#!/bin/bash
# Check the map.ts file for property-related types
cat -n src/types/map.ts

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 3475


🏁 Script executed:

#!/bin/bash
# Check if there are any recent commits that might show schema changes
git log --oneline -20 2>/dev/null | head -20

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 156


🏁 Script executed:

#!/bin/bash
# Show the refactoring commit details
git show 56f21e4 --stat 2>/dev/null

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 7156


🏁 Script executed:

#!/bin/bash
# Show actual changes in that commit
git show 56f21e4 2>/dev/null | head -100

Repository: OpenSourceFellows/map_dashboard_hackathon

Length of output: 3115


Create FeatureProperties TypeScript interface for campaign features

The refactoring commit standardized campaign fixture properties (identifier, partners, measurement, unitOfMeasure, watershedRegion, projectType, restorationServices) but the corresponding TypeScript interface was not created. Without it, these properties will be typed as any from the geojson library's default, making property access unsafe. Define a FeatureProperties interface in src/types/geometry.ts (or a new src/types/campaign.ts) that matches the fixture schema, and apply it to the Feature type used by fixture-reader.ts.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@public/fixtures/campaign_encontro_das_aguas.geojson` around lines 1 - 37,
Define a concrete FeatureProperties interface matching the campaign fixture keys
(identifier: string, partners: string[], measurement: number, unitOfMeasure:
string, watershedRegion: string, projectType: string, restorationServices: any[]
— plus any existing common fields like id, campaign, status) in
src/types/geometry.ts (or new src/types/campaign.ts) and export it as
FeatureProperties; then update the Feature generic usage in fixture-reader.ts
(replace plain geojson.Feature with geojson.Feature<FeatureProperties> or your
exported Feature type) so campaign feature properties are strongly typed and not
inferred as any. Ensure imports/exports are adjusted and any consumers of the
Feature type are updated to use the new typed FeatureProperties.

34 changes: 34 additions & 0 deletions public/fixtures/campaign_puraquequara_lake.geojson
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"type": "FeatureCollection",
"name": "Campaign: Puraquequara Lake Protection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{
"type": "Feature",
"id": "puraquequara-1",
"properties": {
"id": "puraquequara-1",
"name": "Puraquequara Lake Protection",
"campaign": "Puraquequara Lake Protection",
"status": "planning",
"partner": "Manaus Environmental Agency",
"acreage": 7500,
"watershed": "Puraquequara Lake System",
"projectType": "Lake Protection"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[-59.9200, -3.0200],
[-59.8800, -3.0200],
[-59.8700, -3.0500],
[-59.8900, -3.0700],
[-59.9200, -3.0600],
[-59.9200, -3.0200]
]
]
}
}
]
}
34 changes: 34 additions & 0 deletions public/fixtures/campaign_rio_negro_conservation.geojson
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"type": "FeatureCollection",
"name": "Campaign: Rio Negro Conservation",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{
"type": "Feature",
"id": "rio-negro-1",
"properties": {
"id": "rio-negro-1",
"name": "Rio Negro Conservation",
"campaign": "Rio Negro Conservation",
"status": "active",
"partner": "Amazon River Foundation",
"acreage": 18500,
"watershed": "Rio Negro Basin",
"projectType": "River Conservation"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[-60.1200, -3.0500],
[-60.0600, -3.0500],
[-60.0600, -3.0900],
[-60.0800, -3.1100],
[-60.1200, -3.1100],
[-60.1200, -3.0500]
]
]
}
}
]
}
34 changes: 34 additions & 0 deletions public/fixtures/campaign_solimoes_wetland.geojson
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"type": "FeatureCollection",
"name": "Campaign: Solimoes Wetland Restoration",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{
"type": "Feature",
"id": "solimoes-1",
"properties": {
"id": "solimoes-1",
"name": "Solimoes Wetland Restoration",
"campaign": "Solimoes Wetland Restoration",
"status": "active",
"partner": "Wetlands International",
"acreage": 22000,
"watershed": "Solimoes Watershed",
"projectType": "Wetland Restoration"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[-60.0800, -3.1400],
[-60.0200, -3.1400],
[-60.0200, -3.1800],
[-60.0500, -3.2000],
[-60.0800, -3.1900],
[-60.0800, -3.1400]
]
]
}
}
]
}
34 changes: 34 additions & 0 deletions public/fixtures/campaign_taruma_corridor.geojson
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"type": "FeatureCollection",
"name": "Campaign: Taruma Biodiversity Corridor",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{
"type": "Feature",
"id": "taruma-1",
"properties": {
"id": "taruma-1",
"name": "Taruma Biodiversity Corridor",
"campaign": "Taruma Biodiversity Corridor",
"status": "planning",
"partner": "Biodiversity Alliance Brazil",
"acreage": 9800,
"watershed": "Taruma-Acu Basin",
"projectType": "Wildlife Corridor"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[-60.1000, -3.0100],
[-60.0500, -3.0100],
[-60.0500, -3.0500],
[-60.0700, -3.0600],
[-60.1000, -3.0500],
[-60.1000, -3.0100]
]
]
}
}
]
}