///|
fn main {
  let points = [
    @geo.Point::new(0.0, 0.0),
    @geo.Point::new(4.0, 0.0),
    @geo.Point::new(4.0, 3.0),
    @geo.Point::new(0.0, 3.0),
    @geo.Point::new(2.0, 1.0),
  ]
  let hull = @geo.convex_hull(points)
  let bounds = @geo.Bounds::from_points(points)
  let river = @geo.Polyline::new([
    @geo.Point::new(0.0, 0.0),
    @geo.Point::new(2.0, 1.0),
    @geo.Point::new(5.0, 1.0),
  ])
  let index = @geo.SpatialIndex::new()
  index.insert(@geo.SpatialItem::new(1, hull.bounds()))
  index.insert(@geo.SpatialItem::new(2, river.bounds()))
  let summary = @geo.GeometrySummary::new(
    points.length(),
    1,
    1,
    bounds.union(river.bounds()),
  )
  println("hull_area=\{hull.area()}")
  println("bounds=\{bounds.to_json()}")
  println("contains=\{hull.contains_point(@geo.Point::new(2.0, 1.0))}")
  println("river_distance=\{river.distance_to(@geo.Point::new(4.0, 3.0))}")
  println("query_hits=\{index.query_point(@geo.Point::new(2.0, 1.0)).length()}")
  println("summary=\{summary.to_json()}")
  println("geojson=\{hull.to_geojson()}")
}