Functional Weave
Code in Python

agri.field-area@1.0.0

vectors.json

6,034 bytes · view raw

[
  {
    "name": "a field near Cambridge, about 100 m by 95 m, is just under a hectare",
    "args": [
      [
        {
          "lat": 52.2,
          "lng": 0.12
        },
        {
          "lat": 52.2,
          "lng": 0.1214
        },
        {
          "lat": 52.2009,
          "lng": 0.1214
        },
        {
          "lat": 52.2009,
          "lng": 0.12
        }
      ]
    ],
    "expect": {
      "squareMetres": 9548,
      "hectares": 0.9548,
      "acres": 2.3595
    }
  },
  {
    "name": "the same field walked clockwise has the same area",
    "args": [
      [
        {
          "lat": 52.2,
          "lng": 0.12
        },
        {
          "lat": 52.2009,
          "lng": 0.12
        },
        {
          "lat": 52.2009,
          "lng": 0.1214
        },
        {
          "lat": 52.2,
          "lng": 0.1214
        }
      ]
    ],
    "expect": {
      "squareMetres": 9548,
      "hectares": 0.9548,
      "acres": 2.3595
    }
  },
  {
    "name": "closing the ring with the first point again changes nothing",
    "args": [
      [
        {
          "lat": 52.2,
          "lng": 0.12
        },
        {
          "lat": 52.2,
          "lng": 0.1214
        },
        {
          "lat": 52.2009,
          "lng": 0.1214
        },
        {
          "lat": 52.2009,
          "lng": 0.12
        },
        {
          "lat": 52.2,
          "lng": 0.12
        }
      ]
    ],
    "expect": {
      "squareMetres": 9548,
      "hectares": 0.9548,
      "acres": 2.3595
    }
  },
  {
    "name": "a triangular field in Oxfordshire",
    "args": [
      [
        {
          "lat": 51.5,
          "lng": -1.0
        },
        {
          "lat": 51.505,
          "lng": -1.0
        },
        {
          "lat": 51.5,
          "lng": -0.992
        }
      ]
    ],
    "expect": {
      "squareMetres": 153931,
      "hectares": 15.3931,
      "acres": 38.0372
    }
  },
  {
    "name": "an L-shaped field with six corners",
    "args": [
      [
        {
          "lat": 53.0,
          "lng": -2.0
        },
        {
          "lat": 53.0,
          "lng": -1.997
        },
        {
          "lat": 53.001,
          "lng": -1.997
        },
        {
          "lat": 53.001,
          "lng": -1.9985
        },
        {
          "lat": 53.002,
          "lng": -1.9985
        },
        {
          "lat": 53.002,
          "lng": -2.0
        }
      ]
    ],
    "expect": {
      "squareMetres": 33484,
      "hectares": 3.3484,
      "acres": 8.2741
    }
  },
  {
    "name": "a field across the antimeridian (Chatham Islands side) is measured the short way round",
    "args": [
      [
        {
          "lat": -41.0,
          "lng": 179.9995
        },
        {
          "lat": -41.0,
          "lng": -179.9995
        },
        {
          "lat": -40.999,
          "lng": -179.9995
        },
        {
          "lat": -40.999,
          "lng": 179.9995
        }
      ]
    ],
    "expect": {
      "squareMetres": 9332,
      "hectares": 0.9332,
      "acres": 2.3059
    }
  },
  {
    "name": "the same shape at longitude 0 has the same area",
    "args": [
      [
        {
          "lat": -41.0,
          "lng": -0.0005
        },
        {
          "lat": -41.0,
          "lng": 0.0005
        },
        {
          "lat": -40.999,
          "lng": 0.0005
        },
        {
          "lat": -40.999,
          "lng": -0.0005
        }
      ]
    ],
    "expect": {
      "squareMetres": 9332,
      "hectares": 0.9332,
      "acres": 2.3059
    }
  },
  {
    "name": "a one-degree square on the equator is R² x (pi/180) x sin 1°",
    "args": [
      [
        {
          "lat": 0,
          "lng": 0
        },
        {
          "lat": 0,
          "lng": 1
        },
        {
          "lat": 1,
          "lng": 1
        },
        {
          "lat": 1,
          "lng": 0
        }
      ]
    ],
    "expect": {
      "squareMetres": 12363718145,
      "hectares": 1236371.8145,
      "acres": 3055141.2886
    }
  },
  {
    "name": "points in a straight line enclose nothing",
    "args": [
      [
        {
          "lat": 52.0,
          "lng": 0.0
        },
        {
          "lat": 52.0,
          "lng": 0.001
        },
        {
          "lat": 52.0,
          "lng": 0.002
        }
      ]
    ],
    "expect": {
      "squareMetres": 0,
      "hectares": 0,
      "acres": 0
    }
  },
  {
    "name": "two points are not a boundary",
    "args": [
      [
        {
          "lat": 52.0,
          "lng": 0.0
        },
        {
          "lat": 52.0,
          "lng": 0.001
        }
      ]
    ],
    "expectError": "a boundary needs at least 3 distinct points"
  },
  {
    "name": "three points with a repeat are not a boundary",
    "args": [
      [
        {
          "lat": 52.0,
          "lng": 0.0
        },
        {
          "lat": 52.0,
          "lng": 0.001
        },
        {
          "lat": 52.0,
          "lng": 0.0
        }
      ]
    ],
    "expectError": "a boundary needs at least 3 distinct points"
  },
  {
    "name": "an empty boundary is an error",
    "args": [
      []
    ],
    "expectError": "a boundary needs at least 3 distinct points"
  },
  {
    "name": "a latitude over 90 is an error (latitude and longitude swapped?)",
    "args": [
      [
        {
          "lat": 52.0,
          "lng": 0.0
        },
        {
          "lat": 95.0,
          "lng": 0.001
        },
        {
          "lat": 52.001,
          "lng": 0.0
        }
      ]
    ],
    "expectError": "point 2: latitude must be a finite number from -90 to 90 degrees"
  },
  {
    "name": "a longitude over 180 is an error",
    "args": [
      [
        {
          "lat": 52.0,
          "lng": 0.0
        },
        {
          "lat": 52.0,
          "lng": 181.0
        },
        {
          "lat": 52.001,
          "lng": 0.0
        }
      ]
    ],
    "expectError": "point 2: longitude must be a finite number from -180 to 180 degrees"
  }
]