Simple Features is a pure Go Implementation of the OpenGIS Simple Feature Access Specification

Simple Features

Documentation Build Status Go Report Card Coverage Status

Simple Features is a 2D geometry library that provides Go types that model geometries, as well as algorithms that operate on them.

It's a pure Go Implementation of the OpenGIS Consortium's Simple Feature Access Specification (which can be found here). This is the same specification that GEOS, JTS, and PostGIS implement, so the Simple Features API will be familiar to developers who have used those libraries before.

Table of Contents

Geometry Types

Type Example Description
Point Point is a single location in space.
MultiPoint MultiPoint is collection of points in space.
LineString LineString is curve defined by linear interpolation between a set of control points.
MultiLineString MultiLineString is a collection of LineStrings.
Polygon Polygon is a planar surface geometry that bounds some area. It may have holes.
MultiPolygon Polygon is collection of Polygons (with some constraints on how the Polygons interact with each other).
GeometryCollection GeometryCollection is an unconstrained collection of geometries.
Geometry Geometry holds any type of geometry (Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon, or GeometryCollection). It's the type that the Simple Features library uses when it needs to represent geometries in a generic way.
Envelope Envelope is an axis aligned bounding box typically used to describe the spatial extent of other geometric entities.

Marshalling and Unmarshalling

Simple features supports the following external geometry representation formats:

Format Example Description
WKT POLYGON((0 0,0 1,1 1,1 0,0 0)) Well Known Text is a human readable format for storing geometries. It's often the lowest common denominator geometry format, and is useful for integration with other GIS applications.
WKB Well Known Binary is a machine readable format that is efficient for computers to use (both from a processing and storage space perspective). WKB is a good choice for transferring geometries to and from PostGIS and other databases that support geometric types.
GeoJSON {"type":"Polygon","coordinates":[[[0,0],[0,1],[1,1],[1,0],[0,0]]]} GeoJSON represents geometries in a similar way to WKB, but is based on the JSON format. This makes it ideal to use with web APIs or other situations where JSON would normally be used.

Geometry Algorithms

The following algorithms are supported:

Miscellaneous Algorithms Description
Area Finds the area of the geometry (for Polygons and MultiPolygons).
Centroid Finds the centroid of the geometry.
ConvexHull Finds the convex hull of the geometry.
Distance Finds the shortest distance between two geometries.
Envelope Finds the smallest axis-aligned bounding-box that surrounds the geometry.
ExactEquals Determines if two geometries are structurally equal.
Length Finds the length of the geometry (for LineStrings and MultiLineStrings).
PointOnSurface Finds a point that lies inside the geometry.
Relate Calculates the DE-9IM intersection describing the relationship between two geometries.
Simplify Simplifies a geometry using the Ramer–Douglas–Peucker algorithm.
Set Operations Description
Union Joins the parts from two geometries together.
Intersection Finds the parts of two geometries that are in common.
Difference Finds the parts of a geometry that are not also part of another geometry.
SymmetricDifference Finds the parts of two geometries that are not in common.
Named Spatial Predicates Description
Equals Determines if two geometries are topologically equal.
Intersects Determines if two geometries intersect with each other.
Disjoint Determines if two geometries have no common points.
Contains Determines if one geometry contains another.
CoveredBy Determines if one geometry is covered by another.
Covers Determines if one geometry covers another.
Overlaps Determines if one geometry overlaps another.
Touches Determines if one geometry touches another.
Within Determines if one geometry is within another.
Crosses Determines if one geometry crosses another.

GEOS Wrapper

A GEOS CGO wrapper is also provided, giving access to functionality not yet implemented natively in Go. The wrapper is implemented in a separate package, meaning that library users who don't need this additional functionality don't need to expose themselves to CGO.

Examples

The following examples show some common operations (errors are omitted for brevity).

WKT

Encoding and decoding WKT:

// Unmarshal from WKT
input := "POLYGON((0 0,0 1,1 1,1 0,0 0))"
g, _ := geom.UnmarshalWKT(input)

// Marshal to WKT
output := g.AsText()
fmt.Println(output) // Prints: POLYGON((0 0,0 1,1 1,1 0,0 0))

WKB

Encoding and decoding WKB directly:

// Marshal as WKB
coords := geom.Coordinates{XY: geom.XY{1.5, 2.5}}
pt := geom.NewPoint(coords)
wkb := pt.AsBinary()
fmt.Println(wkb) // Prints: [1 1 0 0 0 0 0 0 0 0 0 248 63 0 0 0 0 0 0 4 64]

// Unmarshal from WKB
fromWKB, _ := geom.UnmarshalWKB(wkb)
fmt.Println(fromWKB.AsText()) // POINT(1.5 2.5)

Encoding and decoding WKB for integration with PostGIS:

db, _ := sql.Open("postgres", "postgres://...")

db.Exec(`
    CREATE TABLE my_table (
        my_geom geometry(geometry, 4326),
        population double precision
    )`,
)

// Insert our geometry and population data into PostGIS via WKB.
coords := geom.Coordinates{XY: geom.XY{-74.0, 40.7}}
nyc := geom.NewPoint(coords)
db.Exec(`
    INSERT INTO my_table
    (my_geom, population)
    VALUES (ST_GeomFromWKB($1, 4326), $2)`,
    nyc, 8.4e6,
)

// Get the geometry and population data back out of PostGIS via WKB.
var location geom.Geometry
var population float64
db.QueryRow(`
    SELECT ST_AsBinary(my_geom), population
    FROM my_table LIMIT 1`,
).Scan(&location, &population)
fmt.Println(location.AsText(), population) // Prints: POINT(-74 40.7) 8.4e+06

GeoJSON

Encoding and decoding GeoJSON directly:

// Unmarshal geometry from GeoJSON.
raw := `{"type":"Point","coordinates":[-74.0,40.7]}`
var g geom.Geometry
json.NewDecoder(strings.NewReader(raw)).Decode(&g)
fmt.Println(g.AsText()) // Prints: POINT(-74 40.7)

// Marshal back to GeoJSON.
enc := json.NewEncoder(os.Stdout)
enc.Encode(g) // Prints: {"type":"Point","coordinates":[-74,40.7]}

Geometries can also be part of larger structs:

type CityPopulation struct {
    Location   geom.Geometry `json:"loc"`
    Population int           `json:"pop"`
}

// Unmarshal geometry from GeoJSON.
raw := `{"loc":{"type":"Point","coordinates":[-74.0,40.7]},"pop":8400000}`
var v CityPopulation
json.NewDecoder(strings.NewReader(raw)).Decode(&v)
fmt.Println(v.Location.AsText()) // Prints: POINT(-74 40.7)
fmt.Println(v.Population)        // Prints: 8400000

// Marshal back to GeoJSON.
enc := json.NewEncoder(os.Stdout)
enc.Encode(v) // Prints: {"loc":{"type":"Point","coordinates":[-74,40.7]},"pop":8400000}
Comments
  • Implement GeometryType

    Implement GeometryType

    See https://postgis.net/docs/GeometryType.html

    This function needs to be implemented both for Geometry, and for each concrete geometry type (e.g. LineString).

  • wkb: add benchmarking script

    wkb: add benchmarking script

    as mentioned in https://github.com/peterstace/simplefeatures/pull/421, this PR adds the benchmarking script used to generate the diffs shown on that PR description.

    I'm opening this as a DRAFT since I'm not happy with the current state of this and would like some feedback about how to make it better before opening it up for merging:

    • the test fixtures are a copy->paste of the ones from wkb_test.go, how best to share these?
    • the decode function is a copy of hexStringToBytes with the t *testing.T removed

    I tried a few things but none felt quite right:

    • create a wkb_util_test.go file which has the hex decoder and the PostGIS/Spatialite fixtures in it
    • create a testdata/xxx file which could be shared.

    What do you think? what's the best way to share these between the wkb_test.go and wkb_bench_test.go files?

    Usage:

    go test -bench=. -count=5 -test.run=none -benchmem geom/wkb_bench_test.go > master.bench
    
    # switch branch
    go test -bench=. -count=5 -test.run=none -benchmem geom/wkb_bench_test.go > pr.bench
    
    # note the count=5 above, the benchstat command requires each file 
    # contains the concatenated output of several runs.
    benchstat master.bench pr.bench
    
  • Allow Envelopes to be optionally empty

    Allow Envelopes to be optionally empty

    Description

    Allow Envelopes to be optionally empty.

    Envelopes now act more like regular geometries, in in the sense that they can be empty or not. This helps to eliminate a large amount of bool checking code outside of the envelope whenever envelopes are used.

    Check List

    Have you:

    • Added unit tests? Yes.

    • Add cmprefimpl tests? (if appropriate?) No, relies on existing.

    Related Issue

    • https://github.com/peterstace/simplefeatures/issues/412

    Benchmark Results

    There are some regressions in multipolygon validation performance:

    Click to expand
    COMPARISON
    name                                                        old time/op    new time/op    delta
    pkg:github.com/peterstace/simplefeatures/geom goos:linux goarch:amd64
    LineEnvelope/0-4                                              2.06ns ±53%    7.09ns ±12%  +243.93%  (p=0.000 n=15+12)
    LineEnvelope/1-4                                              1.06ns ± 5%    6.57ns ± 6%  +519.68%  (p=0.000 n=13+15)
    LineEnvelope/2-4                                              1.32ns ± 4%    7.08ns ± 7%  +438.22%  (p=0.000 n=14+15)
    LineEnvelope/3-4                                              1.17ns ± 3%    6.69ns ± 4%  +471.99%  (p=0.000 n=13+15)
    MarshalWKB/polygon/n=10-4                                      191ns ±14%     187ns ±12%      ~     (p=0.458 n=15+14)
    MarshalWKB/polygon/n=100-4                                     525ns ±27%     539ns ±18%      ~     (p=0.471 n=13+13)
    MarshalWKB/polygon/n=1000-4                                   3.69µs ±37%    3.49µs ±40%      ~     (p=0.652 n=15+14)
    MarshalWKB/polygon/n=10000-4                                  31.7µs ±49%    33.5µs ±55%      ~     (p=0.910 n=14+14)
    UnmarshalWKB/polygon/n=10-4                                    332ns ±33%     318ns ±16%      ~     (p=0.432 n=15+14)
    UnmarshalWKB/polygon/n=100-4                                   668ns ±12%     703ns ±14%      ~     (p=0.123 n=12+13)
    UnmarshalWKB/polygon/n=1000-4                                 4.23µs ±36%    3.92µs ±28%      ~     (p=0.222 n=13+15)
    UnmarshalWKB/polygon/n=10000-4                                40.3µs ±36%    35.7µs ±23%      ~     (p=0.123 n=14+15)
    IntersectsLineStringWithLineString/n=10-4                     1.45µs ± 9%    1.44µs ±15%      ~     (p=0.367 n=12+14)
    IntersectsLineStringWithLineString/n=100-4                    20.7µs ±11%    21.5µs ±27%      ~     (p=0.591 n=14+15)
    IntersectsLineStringWithLineString/n=1000-4                    202µs ±15%     201µs ±13%      ~     (p=0.839 n=14+14)
    IntersectsLineStringWithLineString/n=10000-4                  2.97ms ± 9%    2.97ms ±13%      ~     (p=0.804 n=14+14)
    IntersectsMultiPointWithMultiPoint/n=20-4                      949ns ±14%     937ns ±15%      ~     (p=0.340 n=15+15)
    IntersectsMultiPointWithMultiPoint/n=200-4                    10.6µs ±11%    10.7µs ± 7%      ~     (p=0.488 n=13+14)
    IntersectsMultiPointWithMultiPoint/n=2000-4                    110µs ±18%     105µs ±11%      ~     (p=0.125 n=14+14)
    IntersectsMultiPointWithMultiPoint/n=20000-4                  1.22ms ± 9%    1.20ms ±19%      ~     (p=0.264 n=13+13)
    PolygonSingleRingValidation/n=10-4                            2.45µs ± 7%    2.66µs ±12%    +8.38%  (p=0.001 n=15+14)
    PolygonSingleRingValidation/n=100-4                           32.7µs ±11%    33.8µs ± 7%      ~     (p=0.102 n=15+14)
    PolygonSingleRingValidation/n=1000-4                           384µs ± 9%     402µs ±11%    +4.73%  (p=0.020 n=14+15)
    PolygonSingleRingValidation/n=10000-4                         4.98ms ±10%    5.05ms ±18%      ~     (p=0.829 n=12+15)
    PolygonMultipleRingsValidation/n=4-4                          7.24µs ±13%    7.24µs ±12%      ~     (p=0.949 n=14+15)
    PolygonMultipleRingsValidation/n=36-4                         59.9µs ±11%    62.6µs ±10%    +4.57%  (p=0.050 n=14+14)
    PolygonMultipleRingsValidation/n=400-4                         766µs ± 9%     773µs ± 9%      ~     (p=1.000 n=14+14)
    PolygonMultipleRingsValidation/n=4096-4                       8.73ms ± 8%    9.09ms ±12%      ~     (p=0.125 n=14+14)
    PolygonZigZagRingsValidation/n=10-4                           11.6µs ±18%    11.8µs ± 5%    +1.84%  (p=0.033 n=14+13)
    PolygonZigZagRingsValidation/n=100-4                           133µs ±17%     132µs ± 9%      ~     (p=0.461 n=15+15)
    PolygonZigZagRingsValidation/n=1000-4                         1.44ms ± 9%    1.47ms ± 9%      ~     (p=0.158 n=15+14)
    PolygonZigZagRingsValidation/n=10000-4                        20.0ms ±18%    20.3ms ±31%      ~     (p=0.946 n=14+14)
    PolygonAnnulusValidation/n=10-4                               3.81µs ±15%    3.80µs ± 7%      ~     (p=0.720 n=14+13)
    PolygonAnnulusValidation/n=100-4                              34.0µs ±23%    35.1µs ±11%      ~     (p=0.142 n=15+13)
    PolygonAnnulusValidation/n=1000-4                              541µs ± 5%     565µs ±13%    +4.43%  (p=0.008 n=14+13)
    PolygonAnnulusValidation/n=10000-4                            6.76ms ±13%    6.52ms ± 5%      ~     (p=0.246 n=14+14)
    MultipolygonValidation/n=1-4                                   402ns ± 9%     440ns ± 7%    +9.28%  (p=0.000 n=15+15)
    MultipolygonValidation/n=4-4                                   872ns ± 9%    1121ns ± 7%   +28.50%  (p=0.000 n=14+13)
    MultipolygonValidation/n=16-4                                 3.57µs ±10%    4.47µs ± 6%   +25.16%  (p=0.000 n=14+14)
    MultipolygonValidation/n=64-4                                 15.8µs ± 7%    19.7µs ± 6%   +24.19%  (p=0.000 n=14+14)
    MultipolygonValidation/n=256-4                                 101µs ± 8%     116µs ± 2%   +14.96%  (p=0.000 n=14+11)
    MultipolygonValidation/n=1024-4                                480µs ± 8%     554µs ±17%   +15.40%  (p=0.000 n=15+15)
    MultiPolygonTwoCircles/n=10-4                                 3.81µs ±12%    3.89µs ±26%      ~     (p=0.667 n=14+14)
    MultiPolygonTwoCircles/n=100-4                                37.8µs ±11%    39.8µs ±14%      ~     (p=0.077 n=14+15)
    MultiPolygonTwoCircles/n=1000-4                                394µs ±10%     410µs ±11%      ~     (p=0.072 n=13+13)
    MultiPolygonTwoCircles/n=10000-4                              5.88ms ±20%    6.04ms ±18%      ~     (p=0.186 n=15+14)
    MultiPolygonMultipleTouchingPoints/n=1-4                      4.67µs ±12%    4.88µs ± 7%    +4.44%  (p=0.037 n=15+15)
    MultiPolygonMultipleTouchingPoints/n=10-4                     38.4µs ±13%    37.4µs ± 8%      ~     (p=0.432 n=15+14)
    MultiPolygonMultipleTouchingPoints/n=100-4                     447µs ±12%     443µs ± 7%      ~     (p=0.960 n=13+13)
    MultiPolygonMultipleTouchingPoints/n=1000-4                   5.28ms ±11%    5.08ms ± 3%      ~     (p=0.193 n=14+12)
    WKTParsing/point-4                                            1.76µs ± 8%    1.86µs ±24%      ~     (p=0.223 n=14+14)
    DistancePolygonToPolygonOrdering/n=100_swap=false-4           49.1µs ±14%    50.0µs ± 9%      ~     (p=0.295 n=13+12)
    DistancePolygonToPolygonOrdering/n=100_swap=true-4            49.5µs ±11%    49.5µs ±12%      ~     (p=0.813 n=14+15)
    DistancePolygonToPolygonOrdering/n=1000_swap=false-4           764µs ±10%     767µs ±10%      ~     (p=0.867 n=14+13)
    DistancePolygonToPolygonOrdering/n=1000_swap=true-4            749µs ± 7%     766µs ± 5%      ~     (p=0.145 n=14+12)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=false-4     5.38µs ± 8%    5.54µs ±11%      ~     (p=0.212 n=12+14)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=true-4      5.47µs ±11%    5.58µs ±13%      ~     (p=0.347 n=12+14)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-4    58.9µs ± 9%    60.2µs ±15%      ~     (p=0.496 n=15+13)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-4     60.5µs ±11%    59.2µs ±16%      ~     (p=0.234 n=15+14)
    MultiLineStringIsSimpleManyLineStrings/n=100-4                53.7µs ±17%    54.0µs ±10%      ~     (p=0.567 n=15+15)
    MultiLineStringIsSimpleManyLineStrings/n=1000-4                546µs ±14%     551µs ±13%      ~     (p=0.541 n=14+14)
    pkg:github.com/peterstace/simplefeatures/geos goos:linux goarch:amd64
    IntersectionWithoutValidation/n=10-4                          38.0µs ± 6%    37.1µs ± 5%      ~     (p=0.072 n=13+13)
    IntersectionWithoutValidation/n=100-4                         74.6µs ± 8%    72.7µs ± 5%    -2.59%  (p=0.020 n=14+15)
    IntersectionWithoutValidation/n=1000-4                         328µs ±15%     327µs ±14%      ~     (p=1.000 n=14+15)
    IntersectionWithoutValidation/n=10000-4                       3.03ms ±15%    3.01ms ± 9%      ~     (p=0.914 n=15+14)
    NoOp/n=10-4                                                   3.84µs ± 5%    3.94µs ±13%      ~     (p=0.285 n=13+14)
    NoOp/n=100-4                                                  11.9µs ±10%    11.9µs ± 8%      ~     (p=0.870 n=15+15)
    NoOp/n=1000-4                                                 84.3µs ±12%    82.9µs ±13%      ~     (p=0.561 n=15+14)
    NoOp/n=10000-4                                                 982µs ±19%     979µs ±15%      ~     (p=0.744 n=15+15)
    pkg:github.com/peterstace/simplefeatures/internal/perf goos:linux goarch:amd64
    LineStringIsSimpleCircle/n=10-4                               2.12µs ±17%    2.11µs ±10%      ~     (p=0.717 n=15+13)
    LineStringIsSimpleCircle/n=100-4                              30.1µs ±11%    30.0µs ± 6%      ~     (p=0.982 n=14+14)
    LineStringIsSimpleCircle/n=1000-4                              375µs ±11%     372µs ± 6%      ~     (p=0.874 n=14+14)
    LineStringIsSimpleCircle/n=10000-4                            4.81ms ±19%    4.92ms ±14%      ~     (p=0.201 n=14+15)
    LineStringIsSimpleZigZag/10-4                                 1.83µs ±11%    1.91µs ±12%    +4.03%  (p=0.044 n=13+14)
    LineStringIsSimpleZigZag/100-4                                30.5µs ±13%    29.8µs ± 8%      ~     (p=0.444 n=14+15)
    LineStringIsSimpleZigZag/1000-4                                364µs ±10%     361µs ± 9%      ~     (p=0.367 n=15+15)
    LineStringIsSimpleZigZag/10000-4                              4.93ms ± 7%    5.11ms ±14%      ~     (p=0.270 n=15+14)
    SetOperation/n=4/Go_Intersection-4                            42.8µs ± 5%    44.3µs ±19%      ~     (p=0.847 n=14+15)
    SetOperation/n=4/Go_Difference-4                              43.5µs ± 8%    43.6µs ± 7%      ~     (p=0.960 n=13+13)
    SetOperation/n=4/Go_SymmetricDifference-4                     57.5µs ±11%    59.5µs ±22%      ~     (p=0.310 n=14+15)
    SetOperation/n=4/Go_Union-4                                   45.9µs ± 7%    46.9µs ±16%      ~     (p=0.541 n=14+14)
    SetOperation/n=4/GEOS_Intersection-4                          33.9µs ± 9%    35.4µs ±15%      ~     (p=0.108 n=13+15)
    SetOperation/n=4/GEOS_Difference-4                            34.9µs ± 5%    36.2µs ±12%      ~     (p=0.186 n=13+13)
    SetOperation/n=4/GEOS_SymmetricDifference-4                   50.9µs ± 7%    51.1µs ± 4%      ~     (p=0.856 n=15+13)
    SetOperation/n=4/GEOS_Union-4                                 35.1µs ± 4%    36.3µs ±10%    +3.32%  (p=0.027 n=14+14)
    SetOperation/n=8/Go_Intersection-4                            56.1µs ±13%    57.2µs ±17%      ~     (p=0.591 n=14+15)
    SetOperation/n=8/Go_Difference-4                              56.5µs ±13%    56.5µs ± 8%      ~     (p=0.914 n=14+15)
    SetOperation/n=8/Go_SymmetricDifference-4                     72.9µs ±12%    76.7µs ±35%      ~     (p=0.401 n=14+14)
    SetOperation/n=8/Go_Union-4                                   56.7µs ±11%    57.9µs ±15%      ~     (p=0.331 n=14+15)
    SetOperation/n=8/GEOS_Intersection-4                          43.3µs ± 7%    43.7µs ± 8%      ~     (p=0.652 n=14+15)
    SetOperation/n=8/GEOS_Difference-4                            42.4µs ± 6%    42.3µs ± 6%      ~     (p=0.880 n=15+14)
    SetOperation/n=8/GEOS_SymmetricDifference-4                   59.5µs ± 5%    61.9µs ± 8%    +3.98%  (p=0.018 n=14+15)
    SetOperation/n=8/GEOS_Union-4                                 41.9µs ±11%    41.0µs ±10%      ~     (p=0.158 n=15+14)
    SetOperation/n=16/Go_Intersection-4                           77.5µs ±12%    78.8µs ±16%      ~     (p=0.539 n=15+15)
    SetOperation/n=16/Go_Difference-4                             82.7µs ±14%    79.7µs ±10%      ~     (p=0.112 n=15+14)
    SetOperation/n=16/Go_SymmetricDifference-4                     109µs ± 4%     111µs ±10%      ~     (p=0.374 n=12+14)
    SetOperation/n=16/Go_Union-4                                  84.3µs ± 9%    88.9µs ±13%    +5.50%  (p=0.015 n=13+15)
    SetOperation/n=16/GEOS_Intersection-4                         47.4µs ± 7%    47.3µs ± 4%      ~     (p=0.981 n=15+12)
    SetOperation/n=16/GEOS_Difference-4                           50.1µs ± 7%    51.9µs ± 9%      ~     (p=0.126 n=15+15)
    SetOperation/n=16/GEOS_SymmetricDifference-4                  76.8µs ± 5%    79.9µs ±10%      ~     (p=0.072 n=13+15)
    SetOperation/n=16/GEOS_Union-4                                51.1µs ±10%    52.6µs ±14%      ~     (p=0.126 n=15+15)
    SetOperation/n=32/Go_Intersection-4                            130µs ±10%     141µs ±19%    +8.17%  (p=0.010 n=15+14)
    SetOperation/n=32/Go_Difference-4                              136µs ±10%     141µs ±12%      ~     (p=0.112 n=15+14)
    SetOperation/n=32/Go_SymmetricDifference-4                     188µs ±16%     182µs ± 6%      ~     (p=0.302 n=13+14)
    SetOperation/n=32/Go_Union-4                                   142µs ±14%     145µs ±13%      ~     (p=0.210 n=14+14)
    SetOperation/n=32/GEOS_Intersection-4                         60.0µs ±10%    61.4µs ± 5%      ~     (p=0.088 n=15+13)
    SetOperation/n=32/GEOS_Difference-4                           62.8µs ±12%    64.6µs ± 7%    +2.81%  (p=0.039 n=14+14)
    SetOperation/n=32/GEOS_SymmetricDifference-4                   114µs ±17%     113µs ± 6%      ~     (p=0.902 n=15+15)
    SetOperation/n=32/GEOS_Union-4                                65.4µs ±21%    64.3µs ± 3%      ~     (p=0.541 n=14+14)
    SetOperation/n=64/Go_Intersection-4                            225µs ±10%     218µs ± 6%      ~     (p=0.108 n=15+13)
    SetOperation/n=64/Go_Difference-4                              241µs ±10%     237µs ±13%      ~     (p=0.715 n=15+14)
    SetOperation/n=64/Go_SymmetricDifference-4                     324µs ± 7%     331µs ±14%      ~     (p=0.427 n=14+14)
    SetOperation/n=64/Go_Union-4                                   254µs ±13%     258µs ±13%      ~     (p=0.595 n=15+15)
    SetOperation/n=64/GEOS_Intersection-4                         81.7µs ±17%    82.1µs ±12%      ~     (p=0.451 n=15+14)
    SetOperation/n=64/GEOS_Difference-4                           98.3µs ± 9%    98.6µs ± 9%      ~     (p=0.376 n=14+14)
    SetOperation/n=64/GEOS_SymmetricDifference-4                   188µs ±12%     188µs ± 7%      ~     (p=0.541 n=14+14)
    SetOperation/n=64/GEOS_Union-4                                 104µs ±12%     103µs ± 6%      ~     (p=1.000 n=14+13)
    SetOperation/n=128/Go_Intersection-4                           411µs ±13%     408µs ±13%      ~     (p=0.734 n=14+14)
    SetOperation/n=128/Go_Difference-4                             427µs ±11%     438µs ±17%      ~     (p=0.780 n=14+15)
    SetOperation/n=128/Go_SymmetricDifference-4                    713µs ±60%     585µs ±11%      ~     (p=0.345 n=15+15)
    SetOperation/n=128/Go_Union-4                                  449µs ± 6%     449µs ±10%      ~     (p=0.899 n=12+14)
    SetOperation/n=128/GEOS_Intersection-4                         131µs ±10%     133µs ±11%      ~     (p=0.412 n=15+15)
    SetOperation/n=128/GEOS_Difference-4                           152µs ±11%     156µs ±10%      ~     (p=0.250 n=15+15)
    SetOperation/n=128/GEOS_SymmetricDifference-4                  308µs ± 9%     307µs ± 6%      ~     (p=0.470 n=12+13)
    SetOperation/n=128/GEOS_Union-4                                165µs ±22%     165µs ± 9%      ~     (p=0.202 n=15+15)
    SetOperation/n=256/Go_Intersection-4                           729µs ± 9%     740µs ± 9%      ~     (p=0.458 n=13+14)
    SetOperation/n=256/Go_Difference-4                             793µs ±13%     789µs ± 6%      ~     (p=0.979 n=13+12)
    SetOperation/n=256/Go_SymmetricDifference-4                   1.12ms ± 8%    1.15ms ±11%      ~     (p=0.413 n=15+13)
    SetOperation/n=256/Go_Union-4                                  826µs ± 6%     848µs ±13%      ~     (p=0.186 n=13+13)
    SetOperation/n=256/GEOS_Intersection-4                         207µs ±10%     211µs ± 6%      ~     (p=0.316 n=15+13)
    SetOperation/n=256/GEOS_Difference-4                           268µs ±11%     266µs ± 7%      ~     (p=0.867 n=14+13)
    SetOperation/n=256/GEOS_SymmetricDifference-4                  566µs ±10%     575µs ±10%      ~     (p=0.331 n=15+14)
    SetOperation/n=256/GEOS_Union-4                                284µs ±11%     297µs ±15%      ~     (p=0.089 n=15+15)
    SetOperation/n=512/Go_Intersection-4                          1.46ms ± 7%    1.51ms ±23%      ~     (p=0.541 n=14+14)
    SetOperation/n=512/Go_Difference-4                            1.55ms ± 7%    1.56ms ±13%      ~     (p=0.839 n=14+14)
    SetOperation/n=512/Go_SymmetricDifference-4                   2.15ms ±11%    2.15ms ±11%      ~     (p=0.793 n=13+14)
    SetOperation/n=512/Go_Union-4                                 1.64ms ±15%    1.69ms ±23%      ~     (p=0.451 n=15+14)
    SetOperation/n=512/GEOS_Intersection-4                         360µs ± 6%     382µs ±12%    +6.25%  (p=0.001 n=14+14)
    SetOperation/n=512/GEOS_Difference-4                           444µs ± 9%     454µs ±13%      ~     (p=0.254 n=15+13)
    SetOperation/n=512/GEOS_SymmetricDifference-4                 1.04ms ±10%    1.09ms ± 9%    +4.50%  (p=0.015 n=15+15)
    SetOperation/n=512/GEOS_Union-4                                486µs ± 7%     497µs ± 5%      ~     (p=0.126 n=15+15)
    SetOperation/n=1024/Go_Intersection-4                         2.95ms ±11%    3.01ms ±11%      ~     (p=0.591 n=15+14)
    SetOperation/n=1024/Go_Difference-4                           3.12ms ± 7%    3.16ms ±16%      ~     (p=0.981 n=13+14)
    SetOperation/n=1024/Go_SymmetricDifference-4                  4.41ms ±10%    4.37ms ±11%      ~     (p=0.793 n=13+14)
    SetOperation/n=1024/Go_Union-4                                3.36ms ±20%    3.33ms ±11%      ~     (p=0.910 n=14+14)
    SetOperation/n=1024/GEOS_Intersection-4                        644µs ± 3%     678µs ± 7%    +5.24%  (p=0.000 n=12+15)
    SetOperation/n=1024/GEOS_Difference-4                          872µs ± 3%     949µs ±12%    +8.85%  (p=0.000 n=13+15)
    SetOperation/n=1024/GEOS_SymmetricDifference-4                2.15ms ± 7%    2.31ms ±18%    +7.53%  (p=0.004 n=12+15)
    SetOperation/n=1024/GEOS_Union-4                              1.08ms ±16%    1.11ms ±16%      ~     (p=0.425 n=14+15)
    SetOperation/n=2048/Go_Intersection-4                         6.24ms ± 8%    6.32ms ±12%      ~     (p=0.650 n=14+13)
    SetOperation/n=2048/Go_Difference-4                           6.54ms ±17%    6.80ms ±24%      ~     (p=0.290 n=14+15)
    SetOperation/n=2048/Go_SymmetricDifference-4                  9.00ms ±12%    9.26ms ±16%      ~     (p=0.217 n=15+14)
    SetOperation/n=2048/Go_Union-4                                7.00ms ±12%    6.96ms ±12%      ~     (p=0.914 n=15+14)
    SetOperation/n=2048/GEOS_Intersection-4                       1.39ms ± 8%    1.46ms ±10%    +5.39%  (p=0.002 n=14+15)
    SetOperation/n=2048/GEOS_Difference-4                         1.76ms ±19%    1.81ms ±14%      ~     (p=0.116 n=15+15)
    SetOperation/n=2048/GEOS_SymmetricDifference-4                4.14ms ± 5%    4.47ms ±13%    +8.01%  (p=0.002 n=14+14)
    SetOperation/n=2048/GEOS_Union-4                              1.93ms ±10%    2.08ms ±16%    +7.94%  (p=0.004 n=14+15)
    SetOperation/n=4096/Go_Intersection-4                         13.0ms ± 7%    13.6ms ±10%      ~     (p=0.077 n=14+14)
    SetOperation/n=4096/Go_Difference-4                           14.7ms ±24%    14.3ms ±13%      ~     (p=0.683 n=15+14)
    SetOperation/n=4096/Go_SymmetricDifference-4                  19.2ms ±11%    19.3ms ±11%      ~     (p=1.000 n=15+15)
    SetOperation/n=4096/Go_Union-4                                14.5ms ±15%    14.4ms ±11%      ~     (p=1.000 n=14+15)
    SetOperation/n=4096/GEOS_Intersection-4                       2.55ms ±11%    2.57ms ± 4%      ~     (p=0.494 n=14+12)
    SetOperation/n=4096/GEOS_Difference-4                         3.88ms ±28%    3.72ms ±14%      ~     (p=0.290 n=15+14)
    SetOperation/n=4096/GEOS_SymmetricDifference-4                9.29ms ±13%    9.74ms ±20%      ~     (p=0.102 n=14+15)
    SetOperation/n=4096/GEOS_Union-4                              4.17ms ±11%    4.25ms ±14%      ~     (p=0.376 n=14+14)
    SetOperation/n=8192/Go_Intersection-4                         26.4ms ±14%    27.3ms ±17%      ~     (p=0.217 n=15+15)
    SetOperation/n=8192/Go_Difference-4                           28.5ms ±19%    29.4ms ±15%      ~     (p=0.201 n=14+15)
    SetOperation/n=8192/Go_SymmetricDifference-4                  38.4ms ±17%    38.2ms ±17%      ~     (p=0.880 n=15+14)
    SetOperation/n=8192/Go_Union-4                                28.4ms ± 9%    29.5ms ±20%      ~     (p=0.430 n=14+13)
    SetOperation/n=8192/GEOS_Intersection-4                       5.59ms ±12%    5.94ms ±15%      ~     (p=0.056 n=14+14)
    SetOperation/n=8192/GEOS_Difference-4                         7.32ms ± 8%    7.88ms ±11%    +7.73%  (p=0.010 n=15+14)
    SetOperation/n=8192/GEOS_SymmetricDifference-4                18.1ms ±12%    19.1ms ±12%    +5.83%  (p=0.018 n=15+14)
    SetOperation/n=8192/GEOS_Union-4                              8.35ms ±20%    8.96ms ±14%    +7.31%  (p=0.007 n=14+14)
    SetOperation/n=16384/Go_Intersection-4                        56.0ms ±14%    56.7ms ±11%      ~     (p=0.505 n=14+15)
    SetOperation/n=16384/Go_Difference-4                          61.1ms ±11%    59.3ms ± 8%      ~     (p=0.201 n=13+15)
    SetOperation/n=16384/Go_SymmetricDifference-4                 80.5ms ± 7%    81.1ms ±12%      ~     (p=0.867 n=13+14)
    SetOperation/n=16384/Go_Union-4                               61.9ms ±10%    62.3ms ±10%      ~     (p=0.652 n=14+15)
    SetOperation/n=16384/GEOS_Intersection-4                      11.6ms ± 8%    11.7ms ±14%      ~     (p=1.000 n=12+14)
    SetOperation/n=16384/GEOS_Difference-4                        16.3ms ±22%    16.1ms ± 7%      ~     (p=0.905 n=13+14)
    SetOperation/n=16384/GEOS_SymmetricDifference-4               35.4ms ±12%    37.2ms ±12%    +4.84%  (p=0.029 n=13+15)
    SetOperation/n=16384/GEOS_Union-4                             17.8ms ± 9%    19.4ms ±15%    +9.25%  (p=0.002 n=15+15)
    pkg:github.com/peterstace/simplefeatures/rtree goos:linux goarch:amd64
    Delete/n=100-4                                                19.0µs ± 5%    19.0µs ± 6%      ~     (p=0.958 n=15+14)
    Delete/n=1000-4                                                652µs ± 5%     681µs ±12%    +4.35%  (p=0.009 n=14+15)
    Delete/n=10000-4                                              31.8ms ± 9%    31.6ms ± 6%      ~     (p=0.902 n=15+15)
    Bulk/n=10-4                                                    828ns ±25%    1114ns ±60%   +34.55%  (p=0.001 n=15+15)
    Bulk/n=100-4                                                  13.3µs ±14%    13.7µs ±16%      ~     (p=0.400 n=15+14)
    Bulk/n=1000-4                                                  216µs ±11%     219µs ±13%      ~     (p=0.310 n=15+14)
    Bulk/n=10000-4                                                2.99ms ± 7%    3.00ms ±10%      ~     (p=0.982 n=14+14)
    Bulk/n=100000-4                                               34.7ms ± 3%    36.1ms ± 8%    +4.04%  (p=0.025 n=12+15)
    Insert/n=10-4                                                 1.18µs ±16%    1.22µs ±14%      ~     (p=0.214 n=14+14)
    Insert/n=100-4                                                19.9µs ± 3%    20.7µs ±11%    +3.98%  (p=0.025 n=13+14)
    Insert/n=1000-4                                                436µs ± 6%     439µs ± 7%      ~     (p=0.744 n=15+15)
    Insert/n=10000-4                                              5.35ms ± 5%    5.34ms ± 5%      ~     (p=0.874 n=14+14)
    Insert/n=100000-4                                             62.9ms ±14%    61.0ms ± 6%      ~     (p=0.217 n=15+14)
    RangeSearch/n=10-4                                            15.1ns ± 8%    15.1ns ± 3%      ~     (p=0.991 n=15+13)
    RangeSearch/n=100-4                                           59.2ns ± 4%    59.2ns ± 4%      ~     (p=0.687 n=13+13)
    RangeSearch/n=1000-4                                           218ns ± 7%     223ns ± 6%      ~     (p=0.270 n=14+15)
    RangeSearch/n=10000-4                                          775ns ±10%     778ns ± 9%      ~     (p=0.624 n=15+15)
    RangeSearch/n=100000-4                                        7.40µs ± 6%    7.31µs ± 6%      ~     (p=0.201 n=15+14)
    
    name                                                        old alloc/op   new alloc/op   delta
    pkg:github.com/peterstace/simplefeatures/geom goos:linux goarch:amd64
    LineEnvelope/0-4                                               0.00B          0.00B           ~     (all equal)
    LineEnvelope/1-4                                               0.00B          0.00B           ~     (all equal)
    LineEnvelope/2-4                                               0.00B          0.00B           ~     (all equal)
    LineEnvelope/3-4                                               0.00B          0.00B           ~     (all equal)
    MarshalWKB/polygon/n=10-4                                       232B ± 0%      232B ± 0%      ~     (all equal)
    MarshalWKB/polygon/n=100-4                                    1.83kB ± 0%    1.83kB ± 0%      ~     (all equal)
    MarshalWKB/polygon/n=1000-4                                   16.4kB ± 0%    16.4kB ± 0%      ~     (all equal)
    MarshalWKB/polygon/n=10000-4                                   164kB ± 0%     164kB ± 0%      ~     (all equal)
    UnmarshalWKB/polygon/n=10-4                                     284B ± 0%      284B ± 0%      ~     (all equal)
    UnmarshalWKB/polygon/n=100-4                                  1.90kB ± 0%    1.90kB ± 0%      ~     (all equal)
    UnmarshalWKB/polygon/n=1000-4                                 16.5kB ± 0%    16.5kB ± 0%      ~     (all equal)
    UnmarshalWKB/polygon/n=10000-4                                 164kB ± 0%     164kB ± 0%      ~     (all equal)
    IntersectsLineStringWithLineString/n=10-4                     2.42kB ± 0%    2.42kB ± 0%      ~     (all equal)
    IntersectsLineStringWithLineString/n=100-4                    30.4kB ± 0%    30.4kB ± 0%      ~     (all equal)
    IntersectsLineStringWithLineString/n=1000-4                    205kB ± 0%     205kB ± 0%      ~     (p=1.000 n=15+15)
    IntersectsLineStringWithLineString/n=10000-4                  2.63MB ± 0%    2.63MB ± 0%      ~     (p=0.098 n=15+15)
    IntersectsMultiPointWithMultiPoint/n=20-4                       324B ± 0%      324B ± 0%      ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=200-4                    3.06kB ± 0%    3.07kB ± 0%      ~     (p=0.516 n=15+15)
    IntersectsMultiPointWithMultiPoint/n=2000-4                   49.3kB ± 0%    49.3kB ± 0%      ~     (p=0.351 n=15+15)
    IntersectsMultiPointWithMultiPoint/n=20000-4                   339kB ± 0%     339kB ± 0%      ~     (p=0.319 n=15+15)
    PolygonSingleRingValidation/n=10-4                            2.29kB ± 0%    2.29kB ± 0%      ~     (all equal)
    PolygonSingleRingValidation/n=100-4                           24.4kB ± 0%    24.4kB ± 0%      ~     (all equal)
    PolygonSingleRingValidation/n=1000-4                           140kB ± 0%     140kB ± 0%      ~     (p=1.000 n=15+15)
    PolygonSingleRingValidation/n=10000-4                         1.97MB ± 0%    1.97MB ± 0%      ~     (p=0.200 n=15+15)
    PolygonMultipleRingsValidation/n=4-4                          6.61kB ± 0%    6.61kB ± 0%      ~     (all equal)
    PolygonMultipleRingsValidation/n=36-4                         53.2kB ± 0%    53.2kB ± 0%      ~     (all equal)
    PolygonMultipleRingsValidation/n=400-4                         597kB ± 0%     597kB ± 0%      ~     (p=0.592 n=14+15)
    PolygonMultipleRingsValidation/n=4096-4                       6.28MB ± 0%    6.28MB ± 0%      ~     (p=0.959 n=15+15)
    PolygonZigZagRingsValidation/n=10-4                           9.62kB ± 0%    9.62kB ± 0%      ~     (all equal)
    PolygonZigZagRingsValidation/n=100-4                          88.0kB ± 0%    88.0kB ± 0%      ~     (all equal)
    PolygonZigZagRingsValidation/n=1000-4                          551kB ± 0%     551kB ± 0%      ~     (p=0.288 n=15+15)
    PolygonZigZagRingsValidation/n=10000-4                        7.24MB ± 0%    7.24MB ± 0%      ~     (p=0.959 n=15+15)
    PolygonAnnulusValidation/n=10-4                               4.10kB ± 0%    4.10kB ± 0%      ~     (all equal)
    PolygonAnnulusValidation/n=100-4                              28.4kB ± 0%    28.4kB ± 0%      ~     (all equal)
    PolygonAnnulusValidation/n=1000-4                              379kB ± 0%     379kB ± 0%      ~     (p=0.298 n=13+15)
    PolygonAnnulusValidation/n=10000-4                            3.89MB ± 0%    3.89MB ± 0%      ~     (p=0.425 n=15+14)
    MultipolygonValidation/n=1-4                                    481B ± 0%      481B ± 0%      ~     (all equal)
    MultipolygonValidation/n=4-4                                    980B ± 0%      980B ± 0%      ~     (all equal)
    MultipolygonValidation/n=16-4                                 4.16kB ± 0%    4.16kB ± 0%      ~     (all equal)
    MultipolygonValidation/n=64-4                                 17.0kB ± 0%    17.0kB ± 0%      ~     (all equal)
    MultipolygonValidation/n=256-4                                67.8kB ± 0%    67.8kB ± 0%      ~     (all equal)
    MultipolygonValidation/n=1024-4                                271kB ± 0%     271kB ± 0%      ~     (all equal)
    MultiPolygonTwoCircles/n=10-4                                 5.15kB ± 0%    5.15kB ± 0%      ~     (all equal)
    MultiPolygonTwoCircles/n=100-4                                55.1kB ± 0%    55.1kB ± 0%      ~     (all equal)
    MultiPolygonTwoCircles/n=1000-4                                345kB ± 0%     345kB ± 0%      ~     (p=0.860 n=15+15)
    MultiPolygonTwoCircles/n=10000-4                              4.60MB ± 0%    4.60MB ± 0%      ~     (p=0.364 n=15+15)
    MultiPolygonMultipleTouchingPoints/n=1-4                      4.16kB ± 0%    4.16kB ± 0%      ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=10-4                     23.9kB ± 0%    23.9kB ± 0%      ~     (p=0.200 n=15+15)
    MultiPolygonMultipleTouchingPoints/n=100-4                     182kB ± 0%     182kB ± 0%      ~     (p=0.345 n=14+14)
    MultiPolygonMultipleTouchingPoints/n=1000-4                   2.10MB ± 0%    2.10MB ± 0%      ~     (p=0.300 n=15+15)
    WKTParsing/point-4                                            1.89kB ± 0%    1.89kB ± 0%      ~     (all equal)
    DistancePolygonToPolygonOrdering/n=100_swap=false-4           40.7kB ± 0%    40.7kB ± 0%      ~     (all equal)
    DistancePolygonToPolygonOrdering/n=100_swap=true-4            40.7kB ± 0%    40.7kB ± 0%      ~     (all equal)
    DistancePolygonToPolygonOrdering/n=1000_swap=false-4           369kB ± 0%     369kB ± 0%      ~     (p=0.725 n=15+13)
    DistancePolygonToPolygonOrdering/n=1000_swap=true-4            369kB ± 0%     369kB ± 0%      ~     (p=0.971 n=13+14)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=false-4     5.52kB ± 0%    5.52kB ± 0%      ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=true-4      5.52kB ± 0%    5.52kB ± 0%      ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-4    60.1kB ± 0%    60.1kB ± 0%      ~     (p=0.546 n=15+15)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-4     60.1kB ± 0%    60.1kB ± 0%    +0.00%  (p=0.034 n=12+15)
    MultiLineStringIsSimpleManyLineStrings/n=100-4                59.2kB ± 0%    59.2kB ± 0%      ~     (all equal)
    MultiLineStringIsSimpleManyLineStrings/n=1000-4                491kB ± 0%     491kB ± 0%      ~     (p=0.569 n=15+15)
    pkg:github.com/peterstace/simplefeatures/geos goos:linux goarch:amd64
    IntersectionWithoutValidation/n=10-4                          1.32kB ± 0%    1.32kB ± 0%      ~     (all equal)
    IntersectionWithoutValidation/n=100-4                         6.46kB ± 0%    6.46kB ± 0%      ~     (p=1.000 n=15+15)
    IntersectionWithoutValidation/n=1000-4                        55.1kB ± 0%    55.1kB ± 0%    +0.00%  (p=0.034 n=12+15)
    IntersectionWithoutValidation/n=10000-4                        558kB ± 0%     558kB ± 0%      ~     (p=0.718 n=14+15)
    NoOp/n=10-4                                                     952B ± 0%      952B ± 0%      ~     (all equal)
    NoOp/n=100-4                                                  5.77kB ± 0%    5.77kB ± 0%      ~     (all equal)
    NoOp/n=1000-4                                                 49.5kB ± 0%    49.5kB ± 0%      ~     (all equal)
    NoOp/n=10000-4                                                 492kB ± 0%     492kB ± 0%      ~     (p=0.117 n=13+15)
    pkg:github.com/peterstace/simplefeatures/internal/perf goos:linux goarch:amd64
    LineStringIsSimpleCircle/n=10-4                               1.87kB ± 0%    1.87kB ± 0%      ~     (all equal)
    LineStringIsSimpleCircle/n=100-4                              24.0kB ± 0%    24.0kB ± 0%      ~     (all equal)
    LineStringIsSimpleCircle/n=1000-4                              139kB ± 0%     139kB ± 0%      ~     (all equal)
    LineStringIsSimpleCircle/n=10000-4                            1.97MB ± 0%    1.97MB ± 0%    -0.00%  (p=0.005 n=15+14)
    LineStringIsSimpleZigZag/10-4                                 1.84kB ± 0%    1.84kB ± 0%      ~     (all equal)
    LineStringIsSimpleZigZag/100-4                                24.0kB ± 0%    24.0kB ± 0%      ~     (all equal)
    LineStringIsSimpleZigZag/1000-4                                139kB ± 0%     139kB ± 0%      ~     (p=0.056 n=15+12)
    LineStringIsSimpleZigZag/10000-4                              1.97MB ± 0%    1.97MB ± 0%      ~     (p=0.391 n=15+15)
    SetOperation/n=4/Go_Intersection-4                            20.4kB ± 0%    20.4kB ± 0%      ~     (p=0.348 n=15+15)
    SetOperation/n=4/Go_Difference-4                              21.4kB ± 0%    21.4kB ± 0%      ~     (p=0.865 n=14+14)
    SetOperation/n=4/Go_SymmetricDifference-4                     29.5kB ± 0%    29.5kB ± 0%      ~     (p=0.975 n=15+15)
    SetOperation/n=4/Go_Union-4                                   22.1kB ± 0%    22.1kB ± 0%      ~     (p=0.508 n=15+14)
    SetOperation/n=4/GEOS_Intersection-4                          1.77kB ± 0%    1.77kB ± 0%      ~     (all equal)
    SetOperation/n=4/GEOS_Difference-4                            2.78kB ± 0%    2.78kB ± 0%      ~     (all equal)
    SetOperation/n=4/GEOS_SymmetricDifference-4                   10.8kB ± 0%    10.8kB ± 0%      ~     (all equal)
    SetOperation/n=4/GEOS_Union-4                                 3.21kB ± 0%    3.21kB ± 0%      ~     (all equal)
    SetOperation/n=8/Go_Intersection-4                            27.1kB ± 0%    27.1kB ± 0%      ~     (p=0.175 n=15+15)
    SetOperation/n=8/Go_Difference-4                              27.3kB ± 0%    27.3kB ± 0%      ~     (p=0.381 n=14+15)
    SetOperation/n=8/Go_SymmetricDifference-4                     37.3kB ± 0%    37.3kB ± 0%      ~     (p=0.151 n=15+15)
    SetOperation/n=8/Go_Union-4                                   27.4kB ± 0%    27.4kB ± 0%      ~     (p=0.382 n=15+15)
    SetOperation/n=8/GEOS_Intersection-4                          3.34kB ± 0%    3.34kB ± 0%      ~     (all equal)
    SetOperation/n=8/GEOS_Difference-4                            3.50kB ± 0%    3.50kB ± 0%      ~     (all equal)
    SetOperation/n=8/GEOS_SymmetricDifference-4                   13.3kB ± 0%    13.3kB ± 0%      ~     (all equal)
    SetOperation/n=8/GEOS_Union-4                                 3.62kB ± 0%    3.62kB ± 0%      ~     (all equal)
    SetOperation/n=16/Go_Intersection-4                           37.4kB ± 0%    37.4kB ± 0%      ~     (p=0.510 n=14+15)
    SetOperation/n=16/Go_Difference-4                             40.5kB ± 0%    40.5kB ± 0%      ~     (p=0.279 n=15+15)
    SetOperation/n=16/Go_SymmetricDifference-4                    59.6kB ± 0%    59.6kB ± 0%      ~     (p=0.288 n=15+15)
    SetOperation/n=16/Go_Union-4                                  42.0kB ± 0%    42.0kB ± 0%      ~     (p=0.167 n=14+15)
    SetOperation/n=16/GEOS_Intersection-4                         3.88kB ± 0%    3.88kB ± 0%      ~     (all equal)
    SetOperation/n=16/GEOS_Difference-4                           6.68kB ± 0%    6.68kB ± 0%      ~     (all equal)
    SetOperation/n=16/GEOS_SymmetricDifference-4                  25.3kB ± 0%    25.3kB ± 0%      ~     (all equal)
    SetOperation/n=16/GEOS_Union-4                                8.28kB ± 0%    8.28kB ± 0%      ~     (all equal)
    SetOperation/n=32/Go_Intersection-4                           67.9kB ± 0%    67.9kB ± 0%      ~     (p=0.908 n=11+15)
    SetOperation/n=32/Go_Difference-4                             70.5kB ± 0%    70.5kB ± 0%      ~     (p=0.454 n=15+15)
    SetOperation/n=32/Go_SymmetricDifference-4                     101kB ± 0%     101kB ± 0%      ~     (p=0.736 n=15+15)
    SetOperation/n=32/Go_Union-4                                  71.0kB ± 0%    71.0kB ± 0%      ~     (p=0.220 n=15+14)
    SetOperation/n=32/GEOS_Intersection-4                         8.86kB ± 0%    8.86kB ± 0%      ~     (all equal)
    SetOperation/n=32/GEOS_Difference-4                           10.7kB ± 0%    10.7kB ± 0%      ~     (all equal)
    SetOperation/n=32/GEOS_SymmetricDifference-4                  39.9kB ± 0%    39.9kB ± 0%      ~     (all equal)
    SetOperation/n=32/GEOS_Union-4                                11.5kB ± 0%    11.5kB ± 0%      ~     (all equal)
    SetOperation/n=64/Go_Intersection-4                            113kB ± 0%     113kB ± 0%      ~     (p=0.883 n=14+14)
    SetOperation/n=64/Go_Difference-4                              125kB ± 0%     125kB ± 0%      ~     (p=0.539 n=14+15)
    SetOperation/n=64/Go_SymmetricDifference-4                     191kB ± 0%     191kB ± 0%      ~     (p=0.220 n=15+15)
    SetOperation/n=64/Go_Union-4                                   129kB ± 0%     129kB ± 0%      ~     (p=0.846 n=15+15)
    SetOperation/n=64/GEOS_Intersection-4                         12.6kB ± 0%    12.6kB ± 0%      ~     (all equal)
    SetOperation/n=64/GEOS_Difference-4                           23.5kB ± 0%    23.5kB ± 0%      ~     (all equal)
    SetOperation/n=64/GEOS_SymmetricDifference-4                  87.5kB ± 0%    87.5kB ± 0%      ~     (all equal)
    SetOperation/n=64/GEOS_Union-4                                28.0kB ± 0%    28.0kB ± 0%      ~     (all equal)
    SetOperation/n=128/Go_Intersection-4                           230kB ± 0%     230kB ± 0%      ~     (p=0.175 n=14+15)
    SetOperation/n=128/Go_Difference-4                             242kB ± 0%     242kB ± 0%      ~     (p=0.492 n=15+15)
    SetOperation/n=128/Go_SymmetricDifference-4                    353kB ± 0%     353kB ± 0%      ~     (p=0.064 n=13+11)
    SetOperation/n=128/Go_Union-4                                  244kB ± 0%     244kB ± 0%      ~     (p=0.212 n=15+15)
    SetOperation/n=128/GEOS_Intersection-4                        30.3kB ± 0%    30.3kB ± 0%      ~     (all equal)
    SetOperation/n=128/GEOS_Difference-4                          40.0kB ± 0%    40.0kB ± 0%      ~     (all equal)
    SetOperation/n=128/GEOS_SymmetricDifference-4                  147kB ± 0%     147kB ± 0%      ~     (p=0.607 n=15+15)
    SetOperation/n=128/GEOS_Union-4                               43.1kB ± 0%    43.1kB ± 0%      ~     (all equal)
    SetOperation/n=256/Go_Intersection-4                           417kB ± 0%     417kB ± 0%      ~     (p=0.505 n=15+15)
    SetOperation/n=256/Go_Difference-4                             466kB ± 0%     466kB ± 0%      ~     (p=0.128 n=15+15)
    SetOperation/n=256/Go_SymmetricDifference-4                    722kB ± 0%     722kB ± 0%    +0.00%  (p=0.038 n=15+15)
    SetOperation/n=256/Go_Union-4                                  477kB ± 0%     477kB ± 0%      ~     (p=0.071 n=14+15)
    SetOperation/n=256/GEOS_Intersection-4                        48.2kB ± 0%    48.2kB ± 0%      ~     (all equal)
    SetOperation/n=256/GEOS_Difference-4                          92.6kB ± 0%    92.6kB ± 0%      ~     (all equal)
    SetOperation/n=256/GEOS_SymmetricDifference-4                  341kB ± 0%     341kB ± 0%      ~     (p=0.521 n=15+14)
    SetOperation/n=256/GEOS_Union-4                                106kB ± 0%     106kB ± 0%      ~     (all equal)
    SetOperation/n=512/Go_Intersection-4                           858kB ± 0%     858kB ± 0%      ~     (p=0.659 n=14+15)
    SetOperation/n=512/Go_Difference-4                             905kB ± 0%     905kB ± 0%      ~     (p=0.161 n=15+15)
    SetOperation/n=512/Go_SymmetricDifference-4                   1.33MB ± 0%    1.33MB ± 0%    +0.00%  (p=0.002 n=15+15)
    SetOperation/n=512/Go_Union-4                                  926kB ± 0%     926kB ± 0%      ~     (p=0.095 n=15+15)
    SetOperation/n=512/GEOS_Intersection-4                         115kB ± 0%     115kB ± 0%      ~     (p=0.165 n=15+15)
    SetOperation/n=512/GEOS_Difference-4                           159kB ± 0%     159kB ± 0%      ~     (p=0.070 n=15+13)
    SetOperation/n=512/GEOS_SymmetricDifference-4                  577kB ± 0%     577kB ± 0%      ~     (p=0.594 n=14+15)
    SetOperation/n=512/GEOS_Union-4                                171kB ± 0%     171kB ± 0%      ~     (p=0.601 n=15+15)
    SetOperation/n=1024/Go_Intersection-4                         1.58MB ± 0%    1.58MB ± 0%      ~     (p=0.168 n=14+15)
    SetOperation/n=1024/Go_Difference-4                           1.77MB ± 0%    1.77MB ± 0%      ~     (p=0.493 n=15+15)
    SetOperation/n=1024/Go_SymmetricDifference-4                  2.80MB ± 0%    2.80MB ± 0%      ~     (p=0.691 n=14+15)
    SetOperation/n=1024/Go_Union-4                                1.83MB ± 0%    1.83MB ± 0%      ~     (p=0.337 n=14+15)
    SetOperation/n=1024/GEOS_Intersection-4                        189kB ± 0%     189kB ± 0%      ~     (all equal)
    SetOperation/n=1024/GEOS_Difference-4                          369kB ± 0%     369kB ± 0%      ~     (p=0.133 n=13+15)
    SetOperation/n=1024/GEOS_SymmetricDifference-4                1.38MB ± 0%    1.38MB ± 0%      ~     (p=0.356 n=15+15)
    SetOperation/n=1024/GEOS_Union-4                               415kB ± 0%     415kB ± 0%      ~     (p=0.596 n=15+15)
    SetOperation/n=2048/Go_Intersection-4                         3.64MB ± 0%    3.64MB ± 0%      ~     (p=0.113 n=15+15)
    SetOperation/n=2048/Go_Difference-4                           3.87MB ± 0%    3.87MB ± 0%      ~     (p=0.512 n=15+15)
    SetOperation/n=2048/Go_SymmetricDifference-4                  5.63MB ± 0%    5.63MB ± 0%      ~     (p=0.087 n=14+15)
    SetOperation/n=2048/Go_Union-4                                3.95MB ± 0%    3.95MB ± 0%      ~     (p=0.477 n=15+14)
    SetOperation/n=2048/GEOS_Intersection-4                        460kB ± 0%     460kB ± 0%      ~     (p=0.355 n=15+13)
    SetOperation/n=2048/GEOS_Difference-4                          648kB ± 0%     648kB ± 0%      ~     (p=0.544 n=15+15)
    SetOperation/n=2048/GEOS_SymmetricDifference-4                2.32MB ± 0%    2.32MB ± 0%      ~     (p=0.518 n=15+15)
    SetOperation/n=2048/GEOS_Union-4                               689kB ± 0%     689kB ± 0%      ~     (p=0.501 n=14+15)
    SetOperation/n=4096/Go_Intersection-4                         6.82MB ± 0%    6.82MB ± 0%      ~     (p=0.121 n=15+13)
    SetOperation/n=4096/Go_Difference-4                           7.54MB ± 0%    7.54MB ± 0%      ~     (p=0.104 n=15+15)
    SetOperation/n=4096/Go_SymmetricDifference-4                  11.6MB ± 0%    11.6MB ± 0%      ~     (p=0.519 n=15+15)
    SetOperation/n=4096/Go_Union-4                                7.79MB ± 0%    7.79MB ± 0%      ~     (p=0.653 n=15+15)
    SetOperation/n=4096/GEOS_Intersection-4                        755kB ± 0%     755kB ± 0%    +0.00%  (p=0.034 n=15+15)
    SetOperation/n=4096/GEOS_Difference-4                         1.45MB ± 0%    1.45MB ± 0%      ~     (p=0.161 n=13+15)
    SetOperation/n=4096/GEOS_SymmetricDifference-4                5.34MB ± 0%    5.34MB ± 0%      ~     (p=0.801 n=14+15)
    SetOperation/n=4096/GEOS_Union-4                              1.63MB ± 0%    1.63MB ± 0%      ~     (p=0.339 n=15+14)
    SetOperation/n=8192/Go_Intersection-4                         14.9MB ± 0%    14.9MB ± 0%      ~     (p=0.889 n=15+14)
    SetOperation/n=8192/Go_Difference-4                           15.8MB ± 0%    15.8MB ± 0%      ~     (p=0.237 n=15+15)
    SetOperation/n=8192/Go_SymmetricDifference-4                  22.7MB ± 0%    22.7MB ± 0%      ~     (p=0.442 n=15+15)
    SetOperation/n=8192/Go_Union-4                                16.1MB ± 0%    16.1MB ± 0%      ~     (p=0.412 n=15+15)
    SetOperation/n=8192/GEOS_Intersection-4                       1.76MB ± 0%    1.76MB ± 0%      ~     (p=0.092 n=15+13)
    SetOperation/n=8192/GEOS_Difference-4                         2.47MB ± 0%    2.47MB ± 0%      ~     (p=0.958 n=15+15)
    SetOperation/n=8192/GEOS_SymmetricDifference-4                9.01MB ± 0%    9.01MB ± 0%      ~     (p=0.748 n=15+15)
    SetOperation/n=8192/GEOS_Union-4                              2.66MB ± 0%    2.66MB ± 0%      ~     (p=0.427 n=14+13)
    SetOperation/n=16384/Go_Intersection-4                        27.9MB ± 0%    27.9MB ± 0%      ~     (p=0.559 n=15+15)
    SetOperation/n=16384/Go_Difference-4                          31.0MB ± 0%    31.0MB ± 0%      ~     (p=0.720 n=15+15)
    SetOperation/n=16384/Go_SymmetricDifference-4                 47.3MB ± 0%    47.3MB ± 0%      ~     (p=0.755 n=15+14)
    SetOperation/n=16384/Go_Union-4                               32.0MB ± 0%    32.0MB ± 0%      ~     (p=0.370 n=14+15)
    SetOperation/n=16384/GEOS_Intersection-4                      2.92MB ± 0%    2.92MB ± 0%      ~     (p=0.315 n=15+15)
    SetOperation/n=16384/GEOS_Difference-4                        5.68MB ± 0%    5.68MB ± 0%      ~     (p=0.501 n=13+13)
    SetOperation/n=16384/GEOS_SymmetricDifference-4               21.1MB ± 0%    21.1MB ± 0%      ~     (p=0.183 n=15+15)
    SetOperation/n=16384/GEOS_Union-4                             6.45MB ± 0%    6.45MB ± 0%      ~     (p=0.469 n=15+14)
    pkg:github.com/peterstace/simplefeatures/rtree goos:linux goarch:amd64
    Delete/n=100-4                                                  712B ± 0%      712B ± 0%      ~     (all equal)
    Delete/n=1000-4                                               26.1kB ± 0%    26.1kB ± 0%      ~     (all equal)
    Delete/n=10000-4                                               412kB ± 0%     412kB ± 0%      ~     (all equal)
    Bulk/n=10-4                                                   1.46kB ± 0%    1.46kB ± 0%      ~     (all equal)
    Bulk/n=100-4                                                  19.9kB ± 0%    19.9kB ± 0%      ~     (all equal)
    Bulk/n=1000-4                                                 98.2kB ± 0%    98.2kB ± 0%      ~     (p=1.000 n=15+15)
    Bulk/n=10000-4                                                1.57MB ± 0%    1.57MB ± 0%      ~     (p=0.105 n=14+14)
    Bulk/n=100000-4                                               20.4MB ± 0%    20.4MB ± 0%      ~     (p=0.269 n=13+15)
    Insert/n=10-4                                                 1.44kB ± 0%    1.44kB ± 0%      ~     (all equal)
    Insert/n=100-4                                                13.5kB ± 0%    13.5kB ± 0%      ~     (all equal)
    Insert/n=1000-4                                                132kB ± 0%     132kB ± 0%    -0.00%  (p=0.003 n=15+12)
    Insert/n=10000-4                                              1.34MB ± 0%    1.34MB ± 0%      ~     (p=0.486 n=15+15)
    Insert/n=100000-4                                             13.5MB ± 0%    13.5MB ± 0%      ~     (p=0.125 n=15+15)
    RangeSearch/n=10-4                                             0.00B          0.00B           ~     (all equal)
    RangeSearch/n=100-4                                            0.00B          0.00B           ~     (all equal)
    RangeSearch/n=1000-4                                           0.00B          0.00B           ~     (all equal)
    RangeSearch/n=10000-4                                          0.00B          0.00B           ~     (all equal)
    RangeSearch/n=100000-4                                         0.00B          0.00B           ~     (all equal)
    
    name                                                        old allocs/op  new allocs/op  delta
    pkg:github.com/peterstace/simplefeatures/geom goos:linux goarch:amd64
    LineEnvelope/0-4                                                0.00           0.00           ~     (all equal)
    LineEnvelope/1-4                                                0.00           0.00           ~     (all equal)
    LineEnvelope/2-4                                                0.00           0.00           ~     (all equal)
    LineEnvelope/3-4                                                0.00           0.00           ~     (all equal)
    MarshalWKB/polygon/n=10-4                                       6.00 ± 0%      6.00 ± 0%      ~     (all equal)
    MarshalWKB/polygon/n=100-4                                      6.00 ± 0%      6.00 ± 0%      ~     (all equal)
    MarshalWKB/polygon/n=1000-4                                     6.00 ± 0%      6.00 ± 0%      ~     (all equal)
    MarshalWKB/polygon/n=10000-4                                    6.00 ± 0%      6.00 ± 0%      ~     (all equal)
    UnmarshalWKB/polygon/n=10-4                                     7.00 ± 0%      7.00 ± 0%      ~     (all equal)
    UnmarshalWKB/polygon/n=100-4                                    7.00 ± 0%      7.00 ± 0%      ~     (all equal)
    UnmarshalWKB/polygon/n=1000-4                                   7.00 ± 0%      7.00 ± 0%      ~     (all equal)
    UnmarshalWKB/polygon/n=10000-4                                  7.00 ± 0%      7.00 ± 0%      ~     (all equal)
    IntersectsLineStringWithLineString/n=10-4                       9.00 ± 0%      9.00 ± 0%      ~     (all equal)
    IntersectsLineStringWithLineString/n=100-4                      73.0 ± 0%      73.0 ± 0%      ~     (all equal)
    IntersectsLineStringWithLineString/n=1000-4                      345 ± 0%       345 ± 0%      ~     (all equal)
    IntersectsLineStringWithLineString/n=10000-4                   5.46k ± 0%     5.46k ± 0%      ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=20-4                       1.00 ± 0%      1.00 ± 0%      ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=200-4                      7.00 ± 0%      7.00 ± 0%      ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=2000-4                     6.00 ± 0%      6.00 ± 0%      ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=20000-4                    11.0 ± 0%      11.0 ± 0%      ~     (all equal)
    PolygonSingleRingValidation/n=10-4                              12.0 ± 0%      12.0 ± 0%      ~     (all equal)
    PolygonSingleRingValidation/n=100-4                             76.0 ± 0%      76.0 ± 0%      ~     (all equal)
    PolygonSingleRingValidation/n=1000-4                             348 ± 0%       348 ± 0%      ~     (all equal)
    PolygonSingleRingValidation/n=10000-4                          5.47k ± 0%     5.47k ± 0%      ~     (all equal)
    PolygonMultipleRingsValidation/n=4-4                            42.0 ± 0%      42.0 ± 0%      ~     (all equal)
    PolygonMultipleRingsValidation/n=36-4                            316 ± 0%       316 ± 0%      ~     (all equal)
    PolygonMultipleRingsValidation/n=400-4                         3.48k ± 0%     3.48k ± 0%      ~     (all equal)
    PolygonMultipleRingsValidation/n=4096-4                        36.2k ± 0%     36.2k ± 0%      ~     (all equal)
    PolygonZigZagRingsValidation/n=10-4                             41.0 ± 0%      41.0 ± 0%      ~     (all equal)
    PolygonZigZagRingsValidation/n=100-4                             233 ± 0%       233 ± 0%      ~     (all equal)
    PolygonZigZagRingsValidation/n=1000-4                          1.05k ± 0%     1.05k ± 0%      ~     (all equal)
    PolygonZigZagRingsValidation/n=10000-4                         16.4k ± 0%     16.4k ± 0%      ~     (all equal)
    PolygonAnnulusValidation/n=10-4                                 22.0 ± 0%      22.0 ± 0%      ~     (all equal)
    PolygonAnnulusValidation/n=100-4                                76.0 ± 0%      76.0 ± 0%      ~     (all equal)
    PolygonAnnulusValidation/n=1000-4                              1.00k ± 0%     1.00k ± 0%      ~     (all equal)
    PolygonAnnulusValidation/n=10000-4                             10.3k ± 0%     10.3k ± 0%      ~     (all equal)
    MultipolygonValidation/n=1-4                                    8.00 ± 0%      8.00 ± 0%      ~     (all equal)
    MultipolygonValidation/n=4-4                                    11.0 ± 0%      11.0 ± 0%      ~     (all equal)
    MultipolygonValidation/n=16-4                                   27.0 ± 0%      27.0 ± 0%      ~     (all equal)
    MultipolygonValidation/n=64-4                                   91.0 ± 0%      91.0 ± 0%      ~     (all equal)
    MultipolygonValidation/n=256-4                                   347 ± 0%       347 ± 0%      ~     (all equal)
    MultipolygonValidation/n=1024-4                                1.37k ± 0%     1.37k ± 0%      ~     (all equal)
    MultiPolygonTwoCircles/n=10-4                                   29.0 ± 0%      29.0 ± 0%      ~     (all equal)
    MultiPolygonTwoCircles/n=100-4                                   157 ± 0%       157 ± 0%      ~     (all equal)
    MultiPolygonTwoCircles/n=1000-4                                  701 ± 0%       701 ± 0%      ~     (all equal)
    MultiPolygonTwoCircles/n=10000-4                               10.9k ± 0%     10.9k ± 0%      ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=1-4                        51.0 ± 0%      51.0 ± 0%      ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=10-4                        298 ± 0%       298 ± 0%      ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=100-4                     2.62k ± 0%     2.62k ± 0%      ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=1000-4                    26.7k ± 0%     26.7k ± 0%      ~     (p=0.250 n=15+15)
    WKTParsing/point-4                                              22.0 ± 0%      22.0 ± 0%      ~     (all equal)
    DistancePolygonToPolygonOrdering/n=100_swap=false-4              234 ± 0%       234 ± 0%      ~     (all equal)
    DistancePolygonToPolygonOrdering/n=100_swap=true-4               234 ± 0%       234 ± 0%      ~     (all equal)
    DistancePolygonToPolygonOrdering/n=1000_swap=false-4           2.10k ± 0%     2.10k ± 0%      ~     (all equal)
    DistancePolygonToPolygonOrdering/n=1000_swap=true-4            2.10k ± 0%     2.10k ± 0%      ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=false-4       13.0 ± 0%      13.0 ± 0%      ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=true-4        13.0 ± 0%      13.0 ± 0%      ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-4      77.0 ± 0%      77.0 ± 0%      ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-4       77.0 ± 0%      77.0 ± 0%      ~     (all equal)
    MultiLineStringIsSimpleManyLineStrings/n=100-4                   371 ± 0%       371 ± 0%      ~     (all equal)
    MultiLineStringIsSimpleManyLineStrings/n=1000-4                3.34k ± 0%     3.34k ± 0%      ~     (all equal)
    pkg:github.com/peterstace/simplefeatures/geos goos:linux goarch:amd64
    IntersectionWithoutValidation/n=10-4                            48.0 ± 0%      48.0 ± 0%      ~     (all equal)
    IntersectionWithoutValidation/n=100-4                           48.0 ± 0%      48.0 ± 0%      ~     (all equal)
    IntersectionWithoutValidation/n=1000-4                          48.0 ± 0%      48.0 ± 0%      ~     (all equal)
    IntersectionWithoutValidation/n=10000-4                         48.0 ± 0%      48.0 ± 0%      ~     (all equal)
    NoOp/n=10-4                                                     33.0 ± 0%      33.0 ± 0%      ~     (all equal)
    NoOp/n=100-4                                                    33.0 ± 0%      33.0 ± 0%      ~     (all equal)
    NoOp/n=1000-4                                                   33.0 ± 0%      33.0 ± 0%      ~     (all equal)
    NoOp/n=10000-4                                                  33.0 ± 0%      33.0 ± 0%      ~     (all equal)
    pkg:github.com/peterstace/simplefeatures/internal/perf goos:linux goarch:amd64
    LineStringIsSimpleCircle/n=10-4                                 7.00 ± 0%      7.00 ± 0%      ~     (all equal)
    LineStringIsSimpleCircle/n=100-4                                71.0 ± 0%      71.0 ± 0%      ~     (all equal)
    LineStringIsSimpleCircle/n=1000-4                                343 ± 0%       343 ± 0%      ~     (all equal)
    LineStringIsSimpleCircle/n=10000-4                             5.46k ± 0%     5.46k ± 0%      ~     (all equal)
    LineStringIsSimpleZigZag/10-4                                   7.00 ± 0%      7.00 ± 0%      ~     (all equal)
    LineStringIsSimpleZigZag/100-4                                  71.0 ± 0%      71.0 ± 0%      ~     (all equal)
    LineStringIsSimpleZigZag/1000-4                                  343 ± 0%       343 ± 0%      ~     (all equal)
    LineStringIsSimpleZigZag/10000-4                               5.46k ± 0%     5.46k ± 0%      ~     (all equal)
    SetOperation/n=4/Go_Intersection-4                               276 ± 0%       276 ± 0%      ~     (all equal)
    SetOperation/n=4/Go_Difference-4                                 280 ± 0%       280 ± 0%      ~     (all equal)
    SetOperation/n=4/Go_SymmetricDifference-4                        378 ± 0%       378 ± 0%      ~     (all equal)
    SetOperation/n=4/Go_Union-4                                      287 ± 0%       287 ± 0%      ~     (all equal)
    SetOperation/n=4/GEOS_Intersection-4                            52.0 ± 0%      52.0 ± 0%      ~     (all equal)
    SetOperation/n=4/GEOS_Difference-4                              55.0 ± 0%      55.0 ± 0%      ~     (all equal)
    SetOperation/n=4/GEOS_SymmetricDifference-4                      148 ± 0%       148 ± 0%      ~     (all equal)
    SetOperation/n=4/GEOS_Union-4                                   56.0 ± 0%      56.0 ± 0%      ~     (all equal)
    SetOperation/n=8/Go_Intersection-4                               292 ± 0%       293 ± 0%    +0.21%  (p=0.001 n=13+15)
    SetOperation/n=8/Go_Difference-4                                 293 ± 0%       293 ± 0%      ~     (p=1.000 n=15+15)
    SetOperation/n=8/Go_SymmetricDifference-4                        397 ± 0%       397 ± 0%      ~     (p=0.450 n=15+15)
    SetOperation/n=8/Go_Union-4                                      298 ± 0%       298 ± 0%      ~     (all equal)
    SetOperation/n=8/GEOS_Intersection-4                            56.0 ± 0%      56.0 ± 0%      ~     (all equal)
    SetOperation/n=8/GEOS_Difference-4                              56.0 ± 0%      56.0 ± 0%      ~     (all equal)
    SetOperation/n=8/GEOS_SymmetricDifference-4                      152 ± 0%       152 ± 0%      ~     (all equal)
    SetOperation/n=8/GEOS_Union-4                                   56.0 ± 0%      56.0 ± 0%      ~     (all equal)
    SetOperation/n=16/Go_Intersection-4                              306 ± 0%       306 ± 0%      ~     (all equal)
    SetOperation/n=16/Go_Difference-4                                316 ± 0%       316 ± 0%      ~     (all equal)
    SetOperation/n=16/Go_SymmetricDifference-4                       445 ± 0%       445 ± 0%      ~     (all equal)
    SetOperation/n=16/Go_Union-4                                     325 ± 0%       325 ± 0%      ~     (all equal)
    SetOperation/n=16/GEOS_Intersection-4                           56.0 ± 0%      56.0 ± 0%      ~     (all equal)
    SetOperation/n=16/GEOS_Difference-4                             64.0 ± 0%      64.0 ± 0%      ~     (all equal)
    SetOperation/n=16/GEOS_SymmetricDifference-4                     185 ± 0%       185 ± 0%      ~     (all equal)
    SetOperation/n=16/GEOS_Union-4                                  68.0 ± 0%      68.0 ± 0%      ~     (all equal)
    SetOperation/n=32/Go_Intersection-4                              357 ± 0%       357 ± 0%      ~     (all equal)
    SetOperation/n=32/Go_Difference-4                                363 ± 0%       363 ± 0%      ~     (all equal)
    SetOperation/n=32/Go_SymmetricDifference-4                       516 ± 0%       516 ± 0%      ~     (all equal)
    SetOperation/n=32/Go_Union-4                                     368 ± 0%       368 ± 0%      ~     (all equal)
    SetOperation/n=32/GEOS_Intersection-4                           68.0 ± 0%      68.0 ± 0%      ~     (all equal)
    SetOperation/n=32/GEOS_Difference-4                             72.0 ± 0%      72.0 ± 0%      ~     (all equal)
    SetOperation/n=32/GEOS_SymmetricDifference-4                     216 ± 0%       216 ± 0%      ~     (all equal)
    SetOperation/n=32/GEOS_Union-4                                  72.0 ± 0%      72.0 ± 0%      ~     (all equal)
    SetOperation/n=64/Go_Intersection-4                              398 ± 0%       398 ± 0%      ~     (p=0.070 n=15+13)
    SetOperation/n=64/Go_Difference-4                                432 ± 0%       432 ± 0%      ~     (p=0.100 n=15+15)
    SetOperation/n=64/Go_SymmetricDifference-4                       683 ± 0%       683 ± 0%      ~     (all equal)
    SetOperation/n=64/Go_Union-4                                     445 ± 0%       445 ± 0%      ~     (p=0.084 n=15+14)
    SetOperation/n=64/GEOS_Intersection-4                           72.0 ± 0%      72.0 ± 0%      ~     (all equal)
    SetOperation/n=64/GEOS_Difference-4                              104 ± 0%       104 ± 0%      ~     (all equal)
    SetOperation/n=64/GEOS_SymmetricDifference-4                     345 ± 0%       345 ± 0%      ~     (all equal)
    SetOperation/n=64/GEOS_Union-4                                   112 ± 0%       112 ± 0%      ~     (all equal)
    SetOperation/n=128/Go_Intersection-4                             572 ± 0%       572 ± 0%      ~     (all equal)
    SetOperation/n=128/Go_Difference-4                               598 ± 0%       598 ± 0%      ~     (all equal)
    SetOperation/n=128/Go_SymmetricDifference-4                      946 ± 0%       946 ± 0%      ~     (all equal)
    SetOperation/n=128/Go_Union-4                                    603 ± 0%       603 ± 0%      ~     (all equal)
    SetOperation/n=128/GEOS_Intersection-4                           112 ± 0%       112 ± 0%      ~     (all equal)
    SetOperation/n=128/GEOS_Difference-4                             136 ± 0%       136 ± 0%      ~     (all equal)
    SetOperation/n=128/GEOS_SymmetricDifference-4                    473 ± 0%       473 ± 0%      ~     (all equal)
    SetOperation/n=128/GEOS_Union-4                                  136 ± 0%       136 ± 0%      ~     (all equal)
    SetOperation/n=256/Go_Intersection-4                             731 ± 0%       731 ± 0%      ~     (all equal)
    SetOperation/n=256/Go_Difference-4                               861 ± 0%       861 ± 0%      ~     (all equal)
    SetOperation/n=256/Go_SymmetricDifference-4                    1.59k ± 0%     1.59k ± 0%      ~     (all equal)
    SetOperation/n=256/Go_Union-4                                    890 ± 0%       890 ± 0%      ~     (all equal)
    SetOperation/n=256/GEOS_Intersection-4                           136 ± 0%       136 ± 0%      ~     (all equal)
    SetOperation/n=256/GEOS_Difference-4                             264 ± 0%       264 ± 0%      ~     (all equal)
    SetOperation/n=256/GEOS_SymmetricDifference-4                    985 ± 0%       985 ± 0%      ~     (all equal)
    SetOperation/n=256/GEOS_Union-4                                  288 ± 0%       288 ± 0%      ~     (all equal)
    SetOperation/n=512/Go_Intersection-4                           1.40k ± 0%     1.40k ± 0%      ~     (all equal)
    SetOperation/n=512/Go_Difference-4                             1.51k ± 0%     1.51k ± 0%    +0.04%  (p=0.003 n=14+15)
    SetOperation/n=512/Go_SymmetricDifference-4                    2.62k ± 0%     2.63k ± 0%    +0.02%  (p=0.014 n=12+15)
    SetOperation/n=512/Go_Union-4                                  1.51k ± 0%     1.51k ± 0%    +0.03%  (p=0.017 n=15+15)
    SetOperation/n=512/GEOS_Intersection-4                           288 ± 0%       288 ± 0%      ~     (all equal)
    SetOperation/n=512/GEOS_Difference-4                             392 ± 0%       392 ± 0%      ~     (all equal)
    SetOperation/n=512/GEOS_SymmetricDifference-4                  1.50k ± 0%     1.50k ± 0%      ~     (all equal)
    SetOperation/n=512/GEOS_Union-4                                  392 ± 0%       392 ± 0%      ~     (all equal)
    SetOperation/n=1024/Go_Intersection-4                          2.03k ± 0%     2.03k ± 0%      ~     (all equal)
    SetOperation/n=1024/Go_Difference-4                            2.54k ± 0%     2.54k ± 0%      ~     (all equal)
    SetOperation/n=1024/Go_SymmetricDifference-4                   5.20k ± 0%     5.20k ± 0%      ~     (all equal)
    SetOperation/n=1024/Go_Union-4                                 2.64k ± 0%     2.64k ± 0%      ~     (all equal)
    SetOperation/n=1024/GEOS_Intersection-4                          392 ± 0%       392 ± 0%      ~     (all equal)
    SetOperation/n=1024/GEOS_Difference-4                            904 ± 0%       904 ± 0%      ~     (all equal)
    SetOperation/n=1024/GEOS_SymmetricDifference-4                 3.54k ± 0%     3.54k ± 0%      ~     (all equal)
    SetOperation/n=1024/GEOS_Union-4                                 992 ± 0%       992 ± 0%      ~     (all equal)
    SetOperation/n=2048/Go_Intersection-4                          4.69k ± 0%     4.69k ± 0%      ~     (all equal)
    SetOperation/n=2048/Go_Difference-4                            5.12k ± 0%     5.12k ± 0%      ~     (all equal)
    SetOperation/n=2048/Go_SymmetricDifference-4                   9.31k ± 0%     9.31k ± 0%      ~     (all equal)
    SetOperation/n=2048/Go_Union-4                                 5.12k ± 0%     5.12k ± 0%      ~     (all equal)
    SetOperation/n=2048/GEOS_Intersection-4                          992 ± 0%       992 ± 0%      ~     (all equal)
    SetOperation/n=2048/GEOS_Difference-4                          1.42k ± 0%     1.42k ± 0%      ~     (all equal)
    SetOperation/n=2048/GEOS_SymmetricDifference-4                 5.59k ± 0%     5.59k ± 0%      ~     (all equal)
    SetOperation/n=2048/GEOS_Union-4                               1.42k ± 0%     1.42k ± 0%      ~     (all equal)
    SetOperation/n=4096/Go_Intersection-4                          7.17k ± 0%     7.17k ± 0%      ~     (p=0.115 n=14+15)
    SetOperation/n=4096/Go_Difference-4                            9.22k ± 0%     9.22k ± 0%      ~     (p=0.074 n=12+15)
    SetOperation/n=4096/Go_SymmetricDifference-4                   19.6k ± 0%     19.6k ± 0%      ~     (p=1.000 n=15+15)
    SetOperation/n=4096/Go_Union-4                                 9.57k ± 0%     9.57k ± 0%      ~     (all equal)
    SetOperation/n=4096/GEOS_Intersection-4                        1.42k ± 0%     1.42k ± 0%      ~     (all equal)
    SetOperation/n=4096/GEOS_Difference-4                          3.46k ± 0%     3.46k ± 0%      ~     (all equal)
    SetOperation/n=4096/GEOS_SymmetricDifference-4                 13.8k ± 0%     13.8k ± 0%      ~     (all equal)
    SetOperation/n=4096/GEOS_Union-4                               3.81k ± 0%     3.81k ± 0%      ~     (all equal)
    SetOperation/n=8192/Go_Intersection-4                          17.8k ± 0%     17.8k ± 0%      ~     (p=0.710 n=15+15)
    SetOperation/n=8192/Go_Difference-4                            19.5k ± 0%     19.5k ± 0%      ~     (p=1.000 n=15+15)
    SetOperation/n=8192/Go_SymmetricDifference-4                   36.0k ± 0%     36.0k ± 0%      ~     (p=0.567 n=14+15)
    SetOperation/n=8192/Go_Union-4                                 19.5k ± 0%     19.5k ± 0%      ~     (p=0.525 n=15+15)
    SetOperation/n=8192/GEOS_Intersection-4                        3.81k ± 0%     3.81k ± 0%      ~     (all equal)
    SetOperation/n=8192/GEOS_Difference-4                          5.51k ± 0%     5.51k ± 0%      ~     (all equal)
    SetOperation/n=8192/GEOS_SymmetricDifference-4                 22.0k ± 0%     22.0k ± 0%      ~     (all equal)
    SetOperation/n=8192/GEOS_Union-4                               5.51k ± 0%     5.51k ± 0%      ~     (all equal)
    SetOperation/n=16384/Go_Intersection-4                         27.7k ± 0%     27.7k ± 0%      ~     (p=0.281 n=15+15)
    SetOperation/n=16384/Go_Difference-4                           35.9k ± 0%     35.9k ± 0%      ~     (p=0.641 n=15+15)
    SetOperation/n=16384/Go_SymmetricDifference-4                  76.9k ± 0%     76.9k ± 0%      ~     (p=0.809 n=15+15)
    SetOperation/n=16384/Go_Union-4                                37.2k ± 0%     37.2k ± 0%      ~     (p=0.670 n=12+15)
    SetOperation/n=16384/GEOS_Intersection-4                       5.51k ± 0%     5.51k ± 0%      ~     (all equal)
    SetOperation/n=16384/GEOS_Difference-4                         13.7k ± 0%     13.7k ± 0%      ~     (all equal)
    SetOperation/n=16384/GEOS_SymmetricDifference-4                54.7k ± 0%     54.7k ± 0%      ~     (all equal)
    SetOperation/n=16384/GEOS_Union-4                              15.1k ± 0%     15.1k ± 0%      ~     (all equal)
    pkg:github.com/peterstace/simplefeatures/rtree goos:linux goarch:amd64
    Delete/n=100-4                                                  65.0 ± 0%      65.0 ± 0%      ~     (all equal)
    Delete/n=1000-4                                                  480 ± 0%       480 ± 0%      ~     (all equal)
    Delete/n=10000-4                                               7.62k ± 0%     7.62k ± 0%      ~     (all equal)
    Bulk/n=10-4                                                     6.00 ± 0%      6.00 ± 0%      ~     (all equal)
    Bulk/n=100-4                                                    70.0 ± 0%      70.0 ± 0%      ~     (all equal)
    Bulk/n=1000-4                                                    342 ± 0%       342 ± 0%      ~     (all equal)
    Bulk/n=10000-4                                                 5.46k ± 0%     5.46k ± 0%      ~     (all equal)
    Bulk/n=100000-4                                                71.0k ± 0%     71.0k ± 0%      ~     (all equal)
    Insert/n=10-4                                                   5.00 ± 0%      5.00 ± 0%      ~     (all equal)
    Insert/n=100-4                                                  47.0 ± 0%      47.0 ± 0%      ~     (all equal)
    Insert/n=1000-4                                                  457 ± 0%       457 ± 0%      ~     (all equal)
    Insert/n=10000-4                                               4.65k ± 0%     4.65k ± 0%      ~     (all equal)
    Insert/n=100000-4                                              46.8k ± 0%     46.8k ± 0%      ~     (p=0.084 n=15+14)
    RangeSearch/n=10-4                                              0.00           0.00           ~     (all equal)
    RangeSearch/n=100-4                                             0.00           0.00           ~     (all equal)
    RangeSearch/n=1000-4                                            0.00           0.00           ~     (all equal)
    RangeSearch/n=10000-4                                           0.00           0.00           ~     (all equal)
    RangeSearch/n=100000-4                                          0.00           0.00           ~     (all equal)
    
    
    
  • Add Tiny Well-Known Binary decoder and encoder.

    Add Tiny Well-Known Binary decoder and encoder.

    Description

    Add Tiny Well-Known Binary decoding and encoding capability with unit tests.

    Check List

    Have you:

    • Added unit tests? Yes

    • Add cmprefimpl tests? No

    • Updated release notes? No

    Related Issue

    Implements https://github.com/peterstace/simplefeatures/issues/54

  • Investigate possible bug in validation algorithm

    Investigate possible bug in validation algorithm

    GEOS has emitted the attached WKBs, and simplefeatures as reporting them as invalid. There are two possibilities:

    • GEOS is emitting invalid WKBs
    • Simplefeatures is giving a false positive for detecting invalid geometries.

    The task here is to investigate to see which of the two cases we are looking at. possible_validation_bug.txt

  • Reverse: choose between libgeos and PostGIS behaviour

    Reverse: choose between libgeos and PostGIS behaviour

    There is some behavioral difference in the Reverse operation between PostGIS and libgeos.

    E.g. for MULTILINESTRING((8 4,6 1,3 9,0 2),(5 3,4 8,1 2,9 8)):

    PostGIS gives: MULTILINESTRING((0 2,3 9,6 1,8 4),(9 8,1 2,4 8,5 3)) Libgeos gives: MULTILINESTRING((9 8,1 2,4 8,5 3),(0 2,3 9,6 1,8 4))

    The current behaviour simplefeatures has implemented is the PostGIS behaviour. We need to decide if we wish to keep this behaviour, or if we wish to switch to libgeos behaviour.

  • Add IsCW, IsCCW to Polygon, MultiPolygon, Geometry, GeometryCollection

    Add IsCW, IsCCW to Polygon, MultiPolygon, Geometry, GeometryCollection

    Description

    Adds IsCW and IsCCW methods.

    Note I have defined certain behaviours for empty and inconsistent geometries. In particular, points, empty and zero area rings are defined to be both CW and CCW. That is, these things will return true from the new methods.

    Check List

    Have you:

    • Added unit tests? yes

    • Add cmprefimpl tests? (if appropriate?) no

    • Updated release notes? (if appropriate?) no

    Related Issue

    https://github.com/peterstace/simplefeatures/issues/382

  • GEOS: Wrap Make Valid

    GEOS: Wrap Make Valid

    Description

    • Wraps the GEOSMakeValid_r function from GEOS.

    Check List

    Have you:

    • Added unit tests? Yes, just to confirm that the wrapping is working. Doesn't actually do extensive tests of the functionality.

    • Add cmprefimpl tests? (if appropriate?) N/A

    • Updated release notes? (if appropriate?) Yes.

    Related Issue

    • https://github.com/peterstace/simplefeatures/issues/430

    Benchmark Results

    N/A

  • Add NaN/Inf Checks

    Add NaN/Inf Checks

    Description

    NaNs and Infs in geometries will cause unexpected issues with arithmetic operations. In most of the algorithms, float64s are treated as idealised real numbers. For the most part, this works ok for float64 values that are not NaN or Inf. It breaks pretty badly for NaN and Inf values though.

    High Level Change Overview

    • Geometries now have all of their coordinates checked for NaN and infinities when they are constructed. Most geometries are constructed from other geometries, so changes were only needed to Point and LineString.
    • Geometries are created based either on coordinates from existing geometries, or calculations based on existing geometries. When these new geometries are constructed, they don't always have their coordinates checked. This is because the NaN/Infinity checks only block user-supplied NaNs and Infinities. Error handling gets out of hand if we recheck NaN and infinities each time (e.g. when accessing the start point of LineString, it's not sensible to check the first coordinate to see if it's valid when constructing that point, since validation would have already occurred when the LineString was constructed). Similar logic holds for calculated geometries, e.g. centroid.
    • Envelopes now have their coordinates checked. From an abstraction perspective, Envelopes are very similar to geometries, so should have similar NaN/Infinity behaviour. As a result, a few envelope methods now return errors.

    Breaking Changes

    • The NewEnvelope function now returns (Envelope, error) rather than error.
    • Envelope's ExtendToIncludeXY method now returns (Envelope, error) rather than error.
    • Envelope's ExpandBy method was removed.
    • The NewLineString function now returns an error if any of the X or Y values in its input sequence are NaN or an Infinity.
    • The NewPoint function now returns (Point, error) rather than Point.
    • XY's AsPoint method now returns (Point, error) rather than Point.
    • The OmitEmpty validation option now has implications when constructing Point and MultiPoint types.

    Check List

    Have you:

    • Added unit tests? Yes.

    • Add cmprefimpl tests? (if appropriate?) N/A

    Related Issue

    • https://github.com/peterstace/simplefeatures/issues/396

    Benchmark Results

    There are a few minor blips, but I think that has more to do with an inappropriate p-value cutoff.

    Click to expand
    COMPARISON
    name                                                        old time/op    new time/op    delta
    pkg:github.com/peterstace/simplefeatures/geom goos:linux goarch:amd64
    LineEnvelope/0-4                                              1.85ns ±50%    2.05ns ±49%    ~     (p=0.170 n=15+15)
    LineEnvelope/1-4                                              1.06ns ± 3%    1.05ns ± 4%    ~     (p=0.667 n=14+14)
    LineEnvelope/2-4                                              1.34ns ± 7%    1.31ns ± 3%    ~     (p=0.074 n=15+13)
    LineEnvelope/3-4                                              1.18ns ± 4%    1.18ns ± 3%    ~     (p=0.838 n=15+14)
    MarshalWKB/polygon/n=10-4                                      192ns ± 8%     194ns ±12%    ~     (p=0.674 n=13+15)
    MarshalWKB/polygon/n=100-4                                     542ns ±19%     561ns ±14%    ~     (p=0.178 n=14+14)
    MarshalWKB/polygon/n=1000-4                                   3.86µs ±37%    4.38µs ±68%    ~     (p=0.603 n=14+14)
    MarshalWKB/polygon/n=10000-4                                  30.6µs ±29%    33.9µs ±51%    ~     (p=0.621 n=15+14)
    UnmarshalWKB/polygon/n=10-4                                    316ns ±23%     313ns ±14%    ~     (p=0.901 n=13+15)
    UnmarshalWKB/polygon/n=100-4                                   683ns ±31%     697ns ±20%    ~     (p=0.478 n=13+12)
    UnmarshalWKB/polygon/n=1000-4                                 3.85µs ±29%    4.71µs ±83%    ~     (p=0.436 n=15+15)
    UnmarshalWKB/polygon/n=10000-4                                40.3µs ±40%    39.1µs ±33%    ~     (p=0.880 n=14+15)
    IntersectsLineStringWithLineString/n=10-4                     1.43µs ± 8%    1.49µs ±21%    ~     (p=0.340 n=12+13)
    IntersectsLineStringWithLineString/n=100-4                    20.7µs ± 7%    21.3µs ± 8%    ~     (p=0.104 n=14+14)
    IntersectsLineStringWithLineString/n=1000-4                    195µs ± 8%     198µs ± 5%    ~     (p=0.201 n=15+14)
    IntersectsLineStringWithLineString/n=10000-4                  2.96ms ±16%    3.03ms ±13%    ~     (p=0.270 n=14+15)
    IntersectsMultiPointWithMultiPoint/n=20-4                      926ns ± 5%     937ns ± 7%    ~     (p=0.661 n=15+15)
    IntersectsMultiPointWithMultiPoint/n=200-4                    10.4µs ± 4%    10.5µs ± 8%    ~     (p=0.659 n=15+13)
    IntersectsMultiPointWithMultiPoint/n=2000-4                    103µs ± 7%     104µs ± 8%    ~     (p=0.813 n=14+15)
    IntersectsMultiPointWithMultiPoint/n=20000-4                  1.18ms ± 9%    1.17ms ±11%    ~     (p=0.545 n=13+13)
    PolygonSingleRingValidation/n=10-4                            2.42µs ±11%    2.38µs ± 6%    ~     (p=0.579 n=14+14)
    PolygonSingleRingValidation/n=100-4                           32.5µs ± 6%    32.7µs ± 6%    ~     (p=0.793 n=14+13)
    PolygonSingleRingValidation/n=1000-4                           386µs ± 7%     392µs ± 9%    ~     (p=0.486 n=15+15)
    PolygonSingleRingValidation/n=10000-4                         4.95ms ±11%    4.97ms ±17%    ~     (p=0.583 n=14+13)
    PolygonMultipleRingsValidation/n=4-4                          6.67µs ± 7%    6.87µs ± 8%  +2.95%  (p=0.027 n=14+15)
    PolygonMultipleRingsValidation/n=36-4                         58.0µs ±12%    57.4µs ± 8%    ~     (p=0.964 n=15+13)
    PolygonMultipleRingsValidation/n=400-4                         727µs ± 9%     744µs ± 5%  +2.43%  (p=0.038 n=13+14)
    PolygonMultipleRingsValidation/n=4096-4                       8.64ms ± 8%    8.54ms ± 6%    ~     (p=0.595 n=15+15)
    PolygonZigZagRingsValidation/n=10-4                           11.2µs ± 9%    11.2µs ±12%    ~     (p=1.000 n=13+13)
    PolygonZigZagRingsValidation/n=100-4                           126µs ± 5%     129µs ± 7%    ~     (p=0.186 n=14+15)
    PolygonZigZagRingsValidation/n=1000-4                         1.41ms ± 6%    1.46ms ±12%    ~     (p=0.233 n=15+15)
    PolygonZigZagRingsValidation/n=10000-4                        18.5ms ± 4%    19.1ms ±11%  +3.38%  (p=0.006 n=13+14)
    PolygonAnnulusValidation/n=10-4                               3.65µs ± 6%    3.81µs ±15%    ~     (p=0.166 n=13+15)
    PolygonAnnulusValidation/n=100-4                              33.3µs ±12%    33.6µs ±14%    ~     (p=0.786 n=15+13)
    PolygonAnnulusValidation/n=1000-4                              551µs ± 8%     533µs ± 5%    ~     (p=0.061 n=14+13)
    PolygonAnnulusValidation/n=10000-4                            6.38ms ± 8%    6.35ms ± 5%    ~     (p=0.914 n=15+14)
    MultipolygonValidation/n=1-4                                   399ns ±16%     391ns ±17%    ~     (p=0.259 n=14+13)
    MultipolygonValidation/n=4-4                                   891ns ± 9%     916ns ±30%    ~     (p=0.277 n=12+15)
    MultipolygonValidation/n=16-4                                 3.55µs ±11%    3.49µs ± 9%    ~     (p=0.427 n=14+14)
    MultipolygonValidation/n=64-4                                 16.3µs ± 9%    16.7µs ±12%    ~     (p=0.302 n=13+14)
    MultipolygonValidation/n=256-4                                 101µs ± 8%     102µs ± 8%    ~     (p=0.400 n=14+15)
    MultipolygonValidation/n=1024-4                                479µs ± 6%     470µs ±10%    ~     (p=0.202 n=15+15)
    MultiPolygonTwoCircles/n=10-4                                 3.58µs ± 8%    3.56µs ±10%    ~     (p=0.586 n=12+14)
    MultiPolygonTwoCircles/n=100-4                                37.7µs ±12%    37.5µs ± 8%    ~     (p=0.920 n=13+13)
    MultiPolygonTwoCircles/n=1000-4                                387µs ±10%     396µs ±10%    ~     (p=0.201 n=14+15)
    MultiPolygonTwoCircles/n=10000-4                              5.60ms ±11%    5.73ms ±16%    ~     (p=0.603 n=14+14)
    MultiPolygonMultipleTouchingPoints/n=1-4                      4.81µs ± 7%    4.80µs ±11%    ~     (p=0.775 n=15+15)
    MultiPolygonMultipleTouchingPoints/n=10-4                     37.6µs ± 9%    41.1µs ±39%    ~     (p=0.062 n=14+14)
    MultiPolygonMultipleTouchingPoints/n=100-4                     438µs ± 4%     443µs ± 8%    ~     (p=0.456 n=12+15)
    MultiPolygonMultipleTouchingPoints/n=1000-4                   5.03ms ± 7%    5.20ms ± 8%  +3.23%  (p=0.020 n=15+14)
    WKTParsing/point-4                                            1.79µs ±22%    1.81µs ±14%    ~     (p=0.503 n=13+13)
    DistancePolygonToPolygonOrdering/n=100_swap=false-4           47.9µs ± 7%    47.0µs ± 4%    ~     (p=0.252 n=14+12)
    DistancePolygonToPolygonOrdering/n=100_swap=true-4            48.9µs ±14%    48.5µs ± 6%    ~     (p=1.000 n=14+13)
    DistancePolygonToPolygonOrdering/n=1000_swap=false-4           742µs ± 3%     766µs ±13%    ~     (p=0.081 n=13+13)
    DistancePolygonToPolygonOrdering/n=1000_swap=true-4            742µs ± 8%     759µs ± 6%    ~     (p=0.081 n=15+15)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=false-4     5.78µs ±22%    5.52µs ±16%    ~     (p=0.169 n=13+14)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=true-4      5.42µs ± 7%    5.43µs ± 9%    ~     (p=0.928 n=15+13)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-4    59.1µs ± 8%    58.9µs ±12%    ~     (p=0.591 n=14+15)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-4     58.6µs ±14%    60.3µs ±11%  +2.89%  (p=0.039 n=14+14)
    MultiLineStringIsSimpleManyLineStrings/n=100-4                52.6µs ±12%    57.8µs ±32%    ~     (p=0.088 n=13+15)
    MultiLineStringIsSimpleManyLineStrings/n=1000-4                563µs ±16%     565µs ±17%    ~     (p=1.000 n=15+15)
    pkg:github.com/peterstace/simplefeatures/geos goos:linux goarch:amd64
    IntersectionWithoutValidation/n=10-4                          39.1µs ± 6%    37.9µs ± 5%  -3.11%  (p=0.033 n=14+15)
    IntersectionWithoutValidation/n=100-4                         74.7µs ± 5%    73.4µs ± 7%    ~     (p=0.077 n=14+14)
    IntersectionWithoutValidation/n=1000-4                         334µs ± 9%     339µs ±11%    ~     (p=0.210 n=14+14)
    IntersectionWithoutValidation/n=10000-4                       3.01ms ±15%    3.04ms ± 7%    ~     (p=0.496 n=13+15)
    NoOp/n=10-4                                                   4.00µs ± 6%    3.93µs ± 3%    ~     (p=0.356 n=15+13)
    NoOp/n=100-4                                                  11.9µs ±11%    12.3µs ±20%    ~     (p=0.539 n=15+15)
    NoOp/n=1000-4                                                 83.9µs ± 7%    81.0µs ± 4%  -3.48%  (p=0.012 n=14+13)
    NoOp/n=10000-4                                                 958µs ±12%     962µs ± 9%    ~     (p=0.715 n=15+14)
    pkg:github.com/peterstace/simplefeatures/internal/perf goos:linux goarch:amd64
    LineStringIsSimpleCircle/n=10-4                               2.17µs ±14%    2.03µs ± 5%  -6.36%  (p=0.008 n=15+12)
    LineStringIsSimpleCircle/n=100-4                              30.9µs ±11%    30.4µs ±15%    ~     (p=0.400 n=14+15)
    LineStringIsSimpleCircle/n=1000-4                              371µs ± 5%     380µs ±10%    ~     (p=0.295 n=12+13)
    LineStringIsSimpleCircle/n=10000-4                            4.79ms ±12%    4.98ms ±18%    ~     (p=0.400 n=14+15)
    LineStringIsSimpleZigZag/10-4                                 1.90µs ±11%    1.86µs ± 7%    ~     (p=0.447 n=15+13)
    LineStringIsSimpleZigZag/100-4                                31.2µs ±15%    30.4µs ± 6%    ~     (p=0.618 n=13+15)
    LineStringIsSimpleZigZag/1000-4                                355µs ± 5%     363µs ± 5%  +2.08%  (p=0.020 n=14+15)
    LineStringIsSimpleZigZag/10000-4                              4.82ms ± 3%    4.96ms ± 8%    ~     (p=0.070 n=15+14)
    SetOperation/n=4/Go_Intersection-4                            42.7µs ±10%    43.9µs ±10%    ~     (p=0.137 n=14+14)
    SetOperation/n=4/Go_Difference-4                              42.9µs ± 4%    43.2µs ± 9%    ~     (p=0.830 n=14+13)
    SetOperation/n=4/Go_SymmetricDifference-4                     55.8µs ± 5%    56.3µs ± 7%    ~     (p=0.591 n=15+14)
    SetOperation/n=4/Go_Union-4                                   44.7µs ± 3%    46.3µs ±14%    ~     (p=0.100 n=13+15)
    SetOperation/n=4/GEOS_Intersection-4                          34.3µs ± 6%    34.2µs ± 1%    ~     (p=0.723 n=15+10)
    SetOperation/n=4/GEOS_Difference-4                            35.6µs ± 6%    35.3µs ± 6%    ~     (p=0.591 n=15+14)
    SetOperation/n=4/GEOS_SymmetricDifference-4                   49.7µs ± 7%    52.3µs ±10%  +5.14%  (p=0.003 n=14+15)
    SetOperation/n=4/GEOS_Union-4                                 35.3µs ± 7%    35.6µs ± 4%    ~     (p=0.072 n=13+13)
    SetOperation/n=8/Go_Intersection-4                            52.9µs ± 3%    55.2µs ±16%    ~     (p=0.118 n=12+14)
    SetOperation/n=8/Go_Difference-4                              54.5µs ±10%    56.3µs ±24%    ~     (p=0.362 n=13+13)
    SetOperation/n=8/Go_SymmetricDifference-4                     73.5µs ±18%    71.6µs ± 7%    ~     (p=0.683 n=15+13)
    SetOperation/n=8/Go_Union-4                                   56.9µs ± 9%    57.5µs ± 7%    ~     (p=0.461 n=15+15)
    SetOperation/n=8/GEOS_Intersection-4                          42.9µs ± 6%    43.8µs ± 7%    ~     (p=0.142 n=13+15)
    SetOperation/n=8/GEOS_Difference-4                            42.6µs ± 4%    43.0µs ± 4%    ~     (p=0.254 n=13+15)
    SetOperation/n=8/GEOS_SymmetricDifference-4                   59.9µs ± 7%    60.1µs ± 7%    ~     (p=0.747 n=15+14)
    SetOperation/n=8/GEOS_Union-4                                 40.6µs ± 3%    41.5µs ± 5%  +2.23%  (p=0.037 n=12+15)
    SetOperation/n=16/Go_Intersection-4                           76.7µs ±14%    75.3µs ± 4%    ~     (p=0.905 n=14+13)
    SetOperation/n=16/Go_Difference-4                             80.5µs ± 7%    80.8µs ±16%    ~     (p=0.470 n=14+15)
    SetOperation/n=16/Go_SymmetricDifference-4                     108µs ± 4%     110µs ±11%    ~     (p=0.980 n=12+14)
    SetOperation/n=16/Go_Union-4                                  84.0µs ± 7%    84.8µs ± 7%    ~     (p=0.377 n=14+15)
    SetOperation/n=16/GEOS_Intersection-4                         47.9µs ± 6%    47.5µs ± 5%    ~     (p=0.539 n=15+15)
    SetOperation/n=16/GEOS_Difference-4                           50.8µs ± 8%    49.4µs ± 4%    ~     (p=0.051 n=15+14)
    SetOperation/n=16/GEOS_SymmetricDifference-4                  76.8µs ± 4%    79.8µs ± 7%  +3.84%  (p=0.044 n=14+14)
    SetOperation/n=16/GEOS_Union-4                                51.1µs ± 9%    51.3µs ± 8%    ~     (p=0.667 n=14+14)
    SetOperation/n=32/Go_Intersection-4                            129µs ± 6%     130µs ± 6%    ~     (p=0.618 n=13+15)
    SetOperation/n=32/Go_Difference-4                              136µs ± 6%     135µs ± 8%    ~     (p=0.561 n=14+15)
    SetOperation/n=32/Go_SymmetricDifference-4                     183µs ± 6%     180µs ± 8%    ~     (p=0.451 n=14+15)
    SetOperation/n=32/Go_Union-4                                   141µs ± 7%     140µs ± 6%    ~     (p=0.685 n=13+14)
    SetOperation/n=32/GEOS_Intersection-4                         59.4µs ± 7%    58.5µs ± 4%    ~     (p=0.390 n=13+13)
    SetOperation/n=32/GEOS_Difference-4                           63.3µs ± 9%    61.1µs ± 4%  -3.49%  (p=0.019 n=15+13)
    SetOperation/n=32/GEOS_SymmetricDifference-4                   111µs ±11%     109µs ± 6%    ~     (p=0.607 n=14+13)
    SetOperation/n=32/GEOS_Union-4                                62.6µs ± 5%    62.5µs ± 4%    ~     (p=0.983 n=15+14)
    SetOperation/n=64/Go_Intersection-4                            222µs ±12%     216µs ± 9%    ~     (p=0.354 n=14+15)
    SetOperation/n=64/Go_Difference-4                              233µs ± 8%     230µs ± 6%    ~     (p=0.482 n=14+14)
    SetOperation/n=64/Go_SymmetricDifference-4                     316µs ± 7%     316µs ± 9%    ~     (p=0.964 n=15+13)
    SetOperation/n=64/Go_Union-4                                   248µs ± 7%     243µs ±10%    ~     (p=0.231 n=14+12)
    SetOperation/n=64/GEOS_Intersection-4                         78.7µs ± 4%    79.7µs ± 4%    ~     (p=0.294 n=15+13)
    SetOperation/n=64/GEOS_Difference-4                           95.4µs ± 7%    96.8µs ± 6%    ~     (p=0.178 n=14+14)
    SetOperation/n=64/GEOS_SymmetricDifference-4                   183µs ± 7%     186µs ± 7%    ~     (p=0.302 n=13+14)
    SetOperation/n=64/GEOS_Union-4                                 102µs ±12%     104µs ± 8%    ~     (p=0.063 n=14+15)
    SetOperation/n=128/Go_Intersection-4                           400µs ± 5%     414µs ±11%    ~     (p=0.146 n=14+15)
    SetOperation/n=128/Go_Difference-4                             425µs ± 7%     444µs ±13%  +4.36%  (p=0.045 n=15+15)
    SetOperation/n=128/Go_SymmetricDifference-4                    561µs ± 7%     563µs ± 5%    ~     (p=0.525 n=13+15)
    SetOperation/n=128/Go_Union-4                                  447µs ±12%     449µs ±11%    ~     (p=0.511 n=14+14)
    SetOperation/n=128/GEOS_Intersection-4                         131µs ±13%     132µs ± 9%    ~     (p=0.652 n=14+15)
    SetOperation/n=128/GEOS_Difference-4                           149µs ±11%     152µs ±10%    ~     (p=0.105 n=13+14)
    SetOperation/n=128/GEOS_SymmetricDifference-4                  299µs ± 6%     315µs ±20%    ~     (p=0.123 n=15+14)
    SetOperation/n=128/GEOS_Union-4                                156µs ± 6%     158µs ±10%    ~     (p=0.856 n=13+15)
    SetOperation/n=256/Go_Intersection-4                           731µs ± 7%     736µs ± 9%    ~     (p=0.683 n=15+14)
    SetOperation/n=256/Go_Difference-4                             787µs ± 6%     792µs ± 8%    ~     (p=0.839 n=14+14)
    SetOperation/n=256/Go_SymmetricDifference-4                   1.10ms ± 8%    1.12ms ±12%    ~     (p=0.217 n=12+15)
    SetOperation/n=256/Go_Union-4                                  818µs ± 6%     826µs ±12%    ~     (p=0.943 n=15+12)
    SetOperation/n=256/GEOS_Intersection-4                         205µs ±12%     199µs ± 5%    ~     (p=0.914 n=15+14)
    SetOperation/n=256/GEOS_Difference-4                           260µs ± 7%     259µs ± 6%    ~     (p=0.650 n=13+14)
    SetOperation/n=256/GEOS_SymmetricDifference-4                  556µs ± 5%     547µs ± 9%    ~     (p=0.110 n=12+13)
    SetOperation/n=256/GEOS_Union-4                                276µs ± 6%     277µs ± 4%    ~     (p=0.821 n=15+13)
    SetOperation/n=512/Go_Intersection-4                          1.53ms ±16%    1.47ms ±10%    ~     (p=0.201 n=14+15)
    SetOperation/n=512/Go_Difference-4                            1.60ms ±11%    1.55ms ±15%  -3.33%  (p=0.037 n=15+14)
    SetOperation/n=512/Go_SymmetricDifference-4                   2.15ms ± 6%    2.13ms ± 7%    ~     (p=0.496 n=13+15)
    SetOperation/n=512/Go_Union-4                                 1.61ms ± 7%    1.65ms ±18%    ~     (p=0.874 n=14+14)
    SetOperation/n=512/GEOS_Intersection-4                         358µs ± 6%     357µs ± 5%    ~     (p=0.983 n=14+15)
    SetOperation/n=512/GEOS_Difference-4                           437µs ±11%     428µs ± 5%    ~     (p=0.983 n=14+15)
    SetOperation/n=512/GEOS_SymmetricDifference-4                 1.06ms ±14%    1.05ms ±15%    ~     (p=0.847 n=15+14)
    SetOperation/n=512/GEOS_Union-4                                479µs ± 7%     470µs ± 4%    ~     (p=0.235 n=15+13)
    SetOperation/n=1024/Go_Intersection-4                         2.89ms ±10%    2.85ms ±10%    ~     (p=0.400 n=14+15)
    SetOperation/n=1024/Go_Difference-4                           3.13ms ±11%    3.08ms ± 8%    ~     (p=0.595 n=14+12)
    SetOperation/n=1024/Go_SymmetricDifference-4                  4.27ms ± 5%    4.34ms ± 5%    ~     (p=0.085 n=13+14)
    SetOperation/n=1024/Go_Union-4                                3.25ms ± 9%    3.17ms ± 7%    ~     (p=0.137 n=14+14)
    SetOperation/n=1024/GEOS_Intersection-4                        655µs ± 8%     659µs ± 9%    ~     (p=0.715 n=14+15)
    SetOperation/n=1024/GEOS_Difference-4                          885µs ± 3%     876µs ± 5%    ~     (p=0.294 n=13+15)
    SetOperation/n=1024/GEOS_SymmetricDifference-4                2.16ms ± 7%    2.19ms ±18%    ~     (p=0.747 n=14+15)
    SetOperation/n=1024/GEOS_Union-4                              1.01ms ± 8%    1.05ms ±12%    ~     (p=0.077 n=14+14)
    SetOperation/n=2048/Go_Intersection-4                         5.95ms ±12%    6.11ms ± 8%    ~     (p=0.126 n=15+15)
    SetOperation/n=2048/Go_Difference-4                           6.55ms ±14%    6.52ms ± 9%    ~     (p=0.902 n=15+15)
    SetOperation/n=2048/Go_SymmetricDifference-4                  9.01ms ±13%    8.99ms ±10%    ~     (p=0.781 n=12+14)
    SetOperation/n=2048/Go_Union-4                                7.22ms ±14%    7.03ms ±19%    ~     (p=0.164 n=14+14)
    SetOperation/n=2048/GEOS_Intersection-4                       1.36ms ± 6%    1.37ms ± 7%    ~     (p=0.402 n=14+13)
    SetOperation/n=2048/GEOS_Difference-4                         1.68ms ± 3%    1.69ms ± 8%    ~     (p=0.516 n=12+15)
    SetOperation/n=2048/GEOS_SymmetricDifference-4                4.15ms ±14%    4.14ms ±12%    ~     (p=0.847 n=15+14)
    SetOperation/n=2048/GEOS_Union-4                              1.91ms ±10%    1.96ms ±10%    ~     (p=0.158 n=14+15)
    SetOperation/n=4096/Go_Intersection-4                         12.8ms ±12%    12.8ms ±16%    ~     (p=0.839 n=14+14)
    SetOperation/n=4096/Go_Difference-4                           13.4ms ± 7%    13.7ms ±12%    ~     (p=0.367 n=15+15)
    SetOperation/n=4096/Go_SymmetricDifference-4                  18.9ms ± 9%    18.3ms ±10%    ~     (p=0.217 n=14+15)
    SetOperation/n=4096/Go_Union-4                                15.0ms ±18%    14.0ms ± 6%  -6.60%  (p=0.041 n=15+13)
    SetOperation/n=4096/GEOS_Intersection-4                       2.49ms ± 3%    2.55ms ±12%    ~     (p=0.185 n=13+14)
    SetOperation/n=4096/GEOS_Difference-4                         3.60ms ± 8%    3.57ms ±14%    ~     (p=0.539 n=15+15)
    SetOperation/n=4096/GEOS_SymmetricDifference-4                9.02ms ±15%    8.99ms ± 7%    ~     (p=0.902 n=15+15)
    SetOperation/n=4096/GEOS_Union-4                              4.11ms ±11%    4.05ms ± 8%    ~     (p=0.440 n=13+15)
    SetOperation/n=8192/Go_Intersection-4                         25.8ms ± 8%    25.4ms ± 4%    ~     (p=0.374 n=14+12)
    SetOperation/n=8192/Go_Difference-4                           27.4ms ±14%    26.7ms ± 4%    ~     (p=0.259 n=14+13)
    SetOperation/n=8192/Go_SymmetricDifference-4                  42.5ms ±90%    36.6ms ±11%    ~     (p=0.098 n=13+12)
    SetOperation/n=8192/Go_Union-4                                28.8ms ±13%    27.9ms ± 7%    ~     (p=0.141 n=13+14)
    SetOperation/n=8192/GEOS_Intersection-4                       5.48ms ± 8%    5.44ms ± 6%    ~     (p=0.867 n=12+15)
    SetOperation/n=8192/GEOS_Difference-4                         7.14ms ±10%    6.97ms ± 4%    ~     (p=0.155 n=13+14)
    SetOperation/n=8192/GEOS_SymmetricDifference-4                17.6ms ± 7%    17.4ms ± 9%    ~     (p=0.519 n=14+13)
    SetOperation/n=8192/GEOS_Union-4                              8.05ms ± 8%    8.37ms ±16%  +3.98%  (p=0.041 n=15+13)
    SetOperation/n=16384/Go_Intersection-4                        52.7ms ± 6%    54.3ms ±10%    ~     (p=0.254 n=13+15)
    SetOperation/n=16384/Go_Difference-4                          57.9ms ±12%    60.7ms ±24%    ~     (p=0.401 n=14+14)
    SetOperation/n=16384/Go_SymmetricDifference-4                 77.5ms ±13%    76.7ms ± 7%    ~     (p=0.685 n=13+14)
    SetOperation/n=16384/Go_Union-4                               62.2ms ±20%    60.4ms ±11%    ~     (p=0.430 n=13+14)
    SetOperation/n=16384/GEOS_Intersection-4                      11.3ms ±16%    10.8ms ± 7%    ~     (p=0.239 n=14+13)
    SetOperation/n=16384/GEOS_Difference-4                        15.6ms ±11%    15.2ms ±13%    ~     (p=0.425 n=15+14)
    SetOperation/n=16384/GEOS_SymmetricDifference-4               34.4ms ± 5%    34.6ms ± 6%    ~     (p=0.545 n=13+13)
    SetOperation/n=16384/GEOS_Union-4                             17.7ms ± 8%    17.4ms ± 8%    ~     (p=0.494 n=14+12)
    pkg:github.com/peterstace/simplefeatures/rtree goos:linux goarch:amd64
    Delete/n=100-4                                                19.2µs ± 7%    19.1µs ± 6%    ~     (p=0.574 n=12+13)
    Delete/n=1000-4                                                651µs ± 4%     659µs ± 4%    ~     (p=0.146 n=14+15)
    Delete/n=10000-4                                              30.9ms ± 4%    31.7ms ± 8%    ~     (p=0.158 n=15+14)
    Bulk/n=10-4                                                    887ns ±28%    1052ns ±70%    ~     (p=0.259 n=13+14)
    Bulk/n=100-4                                                  14.1µs ±23%    13.2µs ± 9%    ~     (p=0.263 n=15+15)
    Bulk/n=1000-4                                                  220µs ±10%     216µs ± 7%    ~     (p=0.427 n=14+14)
    Bulk/n=10000-4                                                2.95ms ± 3%    3.01ms ± 6%    ~     (p=0.225 n=12+13)
    Bulk/n=100000-4                                               34.7ms ± 4%    34.9ms ± 4%    ~     (p=0.511 n=14+14)
    Insert/n=10-4                                                 1.21µs ±16%    1.18µs ±18%    ~     (p=0.141 n=13+14)
    Insert/n=100-4                                                20.0µs ±10%    19.8µs ± 7%    ~     (p=0.503 n=12+13)
    Insert/n=1000-4                                                438µs ± 8%     437µs ± 4%    ~     (p=0.920 n=13+13)
    Insert/n=10000-4                                              5.44ms ±10%    5.34ms ± 9%    ~     (p=0.496 n=15+13)
    Insert/n=100000-4                                             61.4ms ± 7%    60.7ms ± 5%    ~     (p=0.533 n=15+14)
    RangeSearch/n=10-4                                            15.2ns ± 4%    14.9ns ± 2%  -2.16%  (p=0.019 n=14+14)
    RangeSearch/n=100-4                                           59.2ns ± 4%    59.2ns ± 2%    ~     (p=0.933 n=13+14)
    RangeSearch/n=1000-4                                           221ns ± 4%     221ns ± 4%    ~     (p=0.815 n=15+15)
    RangeSearch/n=10000-4                                          776ns ± 8%     769ns ± 4%    ~     (p=0.847 n=15+14)
    RangeSearch/n=100000-4                                        7.47µs ± 8%    7.49µs ± 5%    ~     (p=0.652 n=14+15)
    
    name                                                        old alloc/op   new alloc/op   delta
    pkg:github.com/peterstace/simplefeatures/geom goos:linux goarch:amd64
    LineEnvelope/0-4                                               0.00B          0.00B         ~     (all equal)
    LineEnvelope/1-4                                               0.00B          0.00B         ~     (all equal)
    LineEnvelope/2-4                                               0.00B          0.00B         ~     (all equal)
    LineEnvelope/3-4                                               0.00B          0.00B         ~     (all equal)
    MarshalWKB/polygon/n=10-4                                       232B ± 0%      232B ± 0%    ~     (all equal)
    MarshalWKB/polygon/n=100-4                                    1.83kB ± 0%    1.83kB ± 0%    ~     (all equal)
    MarshalWKB/polygon/n=1000-4                                   16.4kB ± 0%    16.4kB ± 0%    ~     (all equal)
    MarshalWKB/polygon/n=10000-4                                   164kB ± 0%     164kB ± 0%    ~     (all equal)
    UnmarshalWKB/polygon/n=10-4                                     284B ± 0%      284B ± 0%    ~     (all equal)
    UnmarshalWKB/polygon/n=100-4                                  1.90kB ± 0%    1.90kB ± 0%    ~     (all equal)
    UnmarshalWKB/polygon/n=1000-4                                 16.5kB ± 0%    16.5kB ± 0%    ~     (all equal)
    UnmarshalWKB/polygon/n=10000-4                                 164kB ± 0%     164kB ± 0%    ~     (all equal)
    IntersectsLineStringWithLineString/n=10-4                     2.42kB ± 0%    2.42kB ± 0%    ~     (all equal)
    IntersectsLineStringWithLineString/n=100-4                    30.4kB ± 0%    30.4kB ± 0%    ~     (all equal)
    IntersectsLineStringWithLineString/n=1000-4                    205kB ± 0%     205kB ± 0%    ~     (p=0.897 n=15+15)
    IntersectsLineStringWithLineString/n=10000-4                  2.63MB ± 0%    2.63MB ± 0%    ~     (p=0.097 n=14+15)
    IntersectsMultiPointWithMultiPoint/n=20-4                       324B ± 0%      324B ± 0%    ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=200-4                    3.06kB ± 0%    3.07kB ± 0%    ~     (p=0.272 n=15+15)
    IntersectsMultiPointWithMultiPoint/n=2000-4                   49.3kB ± 0%    49.3kB ± 0%    ~     (p=0.378 n=15+15)
    IntersectsMultiPointWithMultiPoint/n=20000-4                   339kB ± 0%     339kB ± 0%    ~     (p=0.519 n=15+15)
    PolygonSingleRingValidation/n=10-4                            2.29kB ± 0%    2.29kB ± 0%    ~     (all equal)
    PolygonSingleRingValidation/n=100-4                           24.4kB ± 0%    24.4kB ± 0%    ~     (all equal)
    PolygonSingleRingValidation/n=1000-4                           140kB ± 0%     140kB ± 0%    ~     (p=0.623 n=14+14)
    PolygonSingleRingValidation/n=10000-4                         1.97MB ± 0%    1.97MB ± 0%    ~     (p=1.000 n=15+14)
    PolygonMultipleRingsValidation/n=4-4                          6.61kB ± 0%    6.61kB ± 0%    ~     (all equal)
    PolygonMultipleRingsValidation/n=36-4                         53.2kB ± 0%    53.2kB ± 0%    ~     (all equal)
    PolygonMultipleRingsValidation/n=400-4                         597kB ± 0%     597kB ± 0%    ~     (p=0.396 n=13+15)
    PolygonMultipleRingsValidation/n=4096-4                       6.28MB ± 0%    6.28MB ± 0%    ~     (p=0.621 n=13+15)
    PolygonZigZagRingsValidation/n=10-4                           9.62kB ± 0%    9.62kB ± 0%    ~     (all equal)
    PolygonZigZagRingsValidation/n=100-4                          88.0kB ± 0%    88.0kB ± 0%    ~     (all equal)
    PolygonZigZagRingsValidation/n=1000-4                          551kB ± 0%     551kB ± 0%    ~     (p=0.756 n=15+15)
    PolygonZigZagRingsValidation/n=10000-4                        7.24MB ± 0%    7.24MB ± 0%    ~     (p=0.926 n=15+15)
    PolygonAnnulusValidation/n=10-4                               4.10kB ± 0%    4.10kB ± 0%    ~     (all equal)
    PolygonAnnulusValidation/n=100-4                              28.4kB ± 0%    28.4kB ± 0%    ~     (all equal)
    PolygonAnnulusValidation/n=1000-4                              379kB ± 0%     379kB ± 0%    ~     (p=0.208 n=15+15)
    PolygonAnnulusValidation/n=10000-4                            3.89MB ± 0%    3.89MB ± 0%    ~     (p=0.557 n=15+15)
    MultipolygonValidation/n=1-4                                    481B ± 0%      481B ± 0%    ~     (all equal)
    MultipolygonValidation/n=4-4                                    980B ± 0%      980B ± 0%    ~     (all equal)
    MultipolygonValidation/n=16-4                                 4.16kB ± 0%    4.16kB ± 0%    ~     (all equal)
    MultipolygonValidation/n=64-4                                 17.0kB ± 0%    17.0kB ± 0%    ~     (all equal)
    MultipolygonValidation/n=256-4                                67.8kB ± 0%    67.8kB ± 0%    ~     (all equal)
    MultipolygonValidation/n=1024-4                                271kB ± 0%     271kB ± 0%    ~     (all equal)
    MultiPolygonTwoCircles/n=10-4                                 5.15kB ± 0%    5.15kB ± 0%    ~     (all equal)
    MultiPolygonTwoCircles/n=100-4                                55.1kB ± 0%    55.1kB ± 0%    ~     (all equal)
    MultiPolygonTwoCircles/n=1000-4                                345kB ± 0%     345kB ± 0%    ~     (p=0.375 n=15+15)
    MultiPolygonTwoCircles/n=10000-4                              4.60MB ± 0%    4.60MB ± 0%    ~     (p=0.359 n=15+15)
    MultiPolygonMultipleTouchingPoints/n=1-4                      4.16kB ± 0%    4.16kB ± 0%    ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=10-4                     23.9kB ± 0%    23.9kB ± 0%    ~     (p=0.542 n=15+15)
    MultiPolygonMultipleTouchingPoints/n=100-4                     182kB ± 0%     182kB ± 0%    ~     (p=0.372 n=15+15)
    MultiPolygonMultipleTouchingPoints/n=1000-4                   2.10MB ± 0%    2.10MB ± 0%    ~     (p=0.512 n=15+15)
    WKTParsing/point-4                                            1.89kB ± 0%    1.89kB ± 0%    ~     (all equal)
    DistancePolygonToPolygonOrdering/n=100_swap=false-4           40.7kB ± 0%    40.7kB ± 0%    ~     (all equal)
    DistancePolygonToPolygonOrdering/n=100_swap=true-4            40.7kB ± 0%    40.7kB ± 0%    ~     (all equal)
    DistancePolygonToPolygonOrdering/n=1000_swap=false-4           369kB ± 0%     369kB ± 0%    ~     (p=0.138 n=14+14)
    DistancePolygonToPolygonOrdering/n=1000_swap=true-4            369kB ± 0%     369kB ± 0%  +0.00%  (p=0.024 n=15+15)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=false-4     5.52kB ± 0%    5.52kB ± 0%    ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=true-4      5.52kB ± 0%    5.52kB ± 0%    ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-4    60.1kB ± 0%    60.1kB ± 0%    ~     (p=0.159 n=15+13)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-4     60.1kB ± 0%    60.1kB ± 0%    ~     (p=0.768 n=15+15)
    MultiLineStringIsSimpleManyLineStrings/n=100-4                59.2kB ± 0%    59.2kB ± 0%    ~     (all equal)
    MultiLineStringIsSimpleManyLineStrings/n=1000-4                491kB ± 0%     491kB ± 0%    ~     (p=0.117 n=15+15)
    pkg:github.com/peterstace/simplefeatures/geos goos:linux goarch:amd64
    IntersectionWithoutValidation/n=10-4                          1.32kB ± 0%    1.32kB ± 0%    ~     (all equal)
    IntersectionWithoutValidation/n=100-4                         6.46kB ± 0%    6.46kB ± 0%  -0.01%  (p=0.026 n=15+13)
    IntersectionWithoutValidation/n=1000-4                        55.1kB ± 0%    55.1kB ± 0%    ~     (p=1.077 n=12+14)
    IntersectionWithoutValidation/n=10000-4                        558kB ± 0%     558kB ± 0%    ~     (p=0.799 n=14+13)
    NoOp/n=10-4                                                     952B ± 0%      952B ± 0%    ~     (all equal)
    NoOp/n=100-4                                                  5.77kB ± 0%    5.77kB ± 0%    ~     (all equal)
    NoOp/n=1000-4                                                 49.5kB ± 0%    49.5kB ± 0%    ~     (all equal)
    NoOp/n=10000-4                                                 492kB ± 0%     492kB ± 0%    ~     (p=0.807 n=15+14)
    pkg:github.com/peterstace/simplefeatures/internal/perf goos:linux goarch:amd64
    LineStringIsSimpleCircle/n=10-4                               1.87kB ± 0%    1.87kB ± 0%    ~     (all equal)
    LineStringIsSimpleCircle/n=100-4                              24.0kB ± 0%    24.0kB ± 0%    ~     (all equal)
    LineStringIsSimpleCircle/n=1000-4                              139kB ± 0%     139kB ± 0%    ~     (p=0.115 n=14+15)
    LineStringIsSimpleCircle/n=10000-4                            1.97MB ± 0%    1.97MB ± 0%    ~     (p=0.106 n=13+13)
    LineStringIsSimpleZigZag/10-4                                 1.84kB ± 0%    1.84kB ± 0%    ~     (all equal)
    LineStringIsSimpleZigZag/100-4                                24.0kB ± 0%    24.0kB ± 0%    ~     (all equal)
    LineStringIsSimpleZigZag/1000-4                                139kB ± 0%     139kB ± 0%    ~     (all equal)
    LineStringIsSimpleZigZag/10000-4                              1.97MB ± 0%    1.97MB ± 0%    ~     (p=0.930 n=14+13)
    SetOperation/n=4/Go_Intersection-4                            20.4kB ± 0%    20.4kB ± 0%    ~     (p=0.545 n=15+15)
    SetOperation/n=4/Go_Difference-4                              21.4kB ± 0%    21.4kB ± 0%    ~     (p=0.270 n=15+15)
    SetOperation/n=4/Go_SymmetricDifference-4                     29.5kB ± 0%    29.5kB ± 0%    ~     (p=0.754 n=14+15)
    SetOperation/n=4/Go_Union-4                                   22.1kB ± 0%    22.1kB ± 0%    ~     (p=1.000 n=15+15)
    SetOperation/n=4/GEOS_Intersection-4                          1.77kB ± 0%    1.77kB ± 0%    ~     (all equal)
    SetOperation/n=4/GEOS_Difference-4                            2.78kB ± 0%    2.78kB ± 0%    ~     (all equal)
    SetOperation/n=4/GEOS_SymmetricDifference-4                   10.8kB ± 0%    10.8kB ± 0%    ~     (all equal)
    SetOperation/n=4/GEOS_Union-4                                 3.21kB ± 0%    3.21kB ± 0%    ~     (all equal)
    SetOperation/n=8/Go_Intersection-4                            27.1kB ± 0%    27.1kB ± 0%    ~     (p=0.545 n=15+15)
    SetOperation/n=8/Go_Difference-4                              27.3kB ± 0%    27.3kB ± 0%  +0.02%  (p=0.012 n=15+15)
    SetOperation/n=8/Go_SymmetricDifference-4                     37.3kB ± 0%    37.3kB ± 0%  -0.01%  (p=0.035 n=15+15)
    SetOperation/n=8/Go_Union-4                                   27.4kB ± 0%    27.4kB ± 0%    ~     (p=0.587 n=15+15)
    SetOperation/n=8/GEOS_Intersection-4                          3.34kB ± 0%    3.34kB ± 0%    ~     (all equal)
    SetOperation/n=8/GEOS_Difference-4                            3.50kB ± 0%    3.50kB ± 0%    ~     (all equal)
    SetOperation/n=8/GEOS_SymmetricDifference-4                   13.3kB ± 0%    13.3kB ± 0%    ~     (all equal)
    SetOperation/n=8/GEOS_Union-4                                 3.62kB ± 0%    3.62kB ± 0%    ~     (all equal)
    SetOperation/n=16/Go_Intersection-4                           37.4kB ± 0%    37.4kB ± 0%    ~     (p=0.252 n=15+15)
    SetOperation/n=16/Go_Difference-4                             40.5kB ± 0%    40.5kB ± 0%    ~     (p=0.992 n=15+15)
    SetOperation/n=16/Go_SymmetricDifference-4                    59.6kB ± 0%    59.6kB ± 0%    ~     (p=0.751 n=15+15)
    SetOperation/n=16/Go_Union-4                                  42.0kB ± 0%    42.0kB ± 0%    ~     (p=0.771 n=15+14)
    SetOperation/n=16/GEOS_Intersection-4                         3.88kB ± 0%    3.88kB ± 0%    ~     (all equal)
    SetOperation/n=16/GEOS_Difference-4                           6.68kB ± 0%    6.68kB ± 0%    ~     (all equal)
    SetOperation/n=16/GEOS_SymmetricDifference-4                  25.3kB ± 0%    25.3kB ± 0%    ~     (all equal)
    SetOperation/n=16/GEOS_Union-4                                8.28kB ± 0%    8.28kB ± 0%    ~     (all equal)
    SetOperation/n=32/Go_Intersection-4                           67.9kB ± 0%    67.9kB ± 0%    ~     (p=0.625 n=14+14)
    SetOperation/n=32/Go_Difference-4                             70.5kB ± 0%    70.5kB ± 0%    ~     (p=0.798 n=15+15)
    SetOperation/n=32/Go_SymmetricDifference-4                     101kB ± 0%     101kB ± 0%    ~     (p=0.878 n=15+15)
    SetOperation/n=32/Go_Union-4                                  71.0kB ± 0%    71.0kB ± 0%    ~     (p=0.616 n=15+15)
    SetOperation/n=32/GEOS_Intersection-4                         8.86kB ± 0%    8.86kB ± 0%    ~     (all equal)
    SetOperation/n=32/GEOS_Difference-4                           10.7kB ± 0%    10.7kB ± 0%    ~     (all equal)
    SetOperation/n=32/GEOS_SymmetricDifference-4                  39.9kB ± 0%    39.9kB ± 0%    ~     (all equal)
    SetOperation/n=32/GEOS_Union-4                                11.5kB ± 0%    11.5kB ± 0%    ~     (all equal)
    SetOperation/n=64/Go_Intersection-4                            113kB ± 0%     113kB ± 0%    ~     (p=0.751 n=15+15)
    SetOperation/n=64/Go_Difference-4                              125kB ± 0%     125kB ± 0%    ~     (p=0.492 n=15+15)
    SetOperation/n=64/Go_SymmetricDifference-4                     191kB ± 0%     191kB ± 0%    ~     (p=0.894 n=15+15)
    SetOperation/n=64/Go_Union-4                                   129kB ± 0%     129kB ± 0%  +0.01%  (p=0.015 n=15+14)
    SetOperation/n=64/GEOS_Intersection-4                         12.6kB ± 0%    12.6kB ± 0%    ~     (all equal)
    SetOperation/n=64/GEOS_Difference-4                           23.5kB ± 0%    23.5kB ± 0%    ~     (all equal)
    SetOperation/n=64/GEOS_SymmetricDifference-4                  87.5kB ± 0%    87.5kB ± 0%    ~     (all equal)
    SetOperation/n=64/GEOS_Union-4                                28.0kB ± 0%    28.0kB ± 0%    ~     (all equal)
    SetOperation/n=128/Go_Intersection-4                           230kB ± 0%     230kB ± 0%    ~     (p=0.290 n=14+14)
    SetOperation/n=128/Go_Difference-4                             242kB ± 0%     242kB ± 0%    ~     (p=0.547 n=13+15)
    SetOperation/n=128/Go_SymmetricDifference-4                    353kB ± 0%     353kB ± 0%    ~     (p=0.645 n=15+15)
    SetOperation/n=128/Go_Union-4                                  244kB ± 0%     244kB ± 0%    ~     (p=0.383 n=15+15)
    SetOperation/n=128/GEOS_Intersection-4                        30.3kB ± 0%    30.3kB ± 0%    ~     (all equal)
    SetOperation/n=128/GEOS_Difference-4                          40.0kB ± 0%    40.0kB ± 0%    ~     (all equal)
    SetOperation/n=128/GEOS_SymmetricDifference-4                  147kB ± 0%     147kB ± 0%    ~     (p=0.329 n=15+15)
    SetOperation/n=128/GEOS_Union-4                               43.1kB ± 0%    43.1kB ± 0%    ~     (all equal)
    SetOperation/n=256/Go_Intersection-4                           417kB ± 0%     417kB ± 0%    ~     (p=0.383 n=15+15)
    SetOperation/n=256/Go_Difference-4                             466kB ± 0%     466kB ± 0%    ~     (p=0.069 n=15+15)
    SetOperation/n=256/Go_SymmetricDifference-4                    722kB ± 0%     722kB ± 0%  -0.00%  (p=0.011 n=15+12)
    SetOperation/n=256/Go_Union-4                                  477kB ± 0%     477kB ± 0%  -0.00%  (p=0.038 n=15+14)
    SetOperation/n=256/GEOS_Intersection-4                        48.2kB ± 0%    48.2kB ± 0%    ~     (all equal)
    SetOperation/n=256/GEOS_Difference-4                          92.6kB ± 0%    92.6kB ± 0%    ~     (all equal)
    SetOperation/n=256/GEOS_SymmetricDifference-4                  341kB ± 0%     341kB ± 0%    ~     (p=0.795 n=15+15)
    SetOperation/n=256/GEOS_Union-4                                106kB ± 0%     106kB ± 0%    ~     (p=1.000 n=15+15)
    SetOperation/n=512/Go_Intersection-4                           858kB ± 0%     858kB ± 0%    ~     (p=0.448 n=12+15)
    SetOperation/n=512/Go_Difference-4                             905kB ± 0%     905kB ± 0%    ~     (p=0.588 n=15+15)
    SetOperation/n=512/Go_SymmetricDifference-4                   1.33MB ± 0%    1.33MB ± 0%    ~     (p=0.690 n=15+15)
    SetOperation/n=512/Go_Union-4                                  926kB ± 0%     926kB ± 0%    ~     (p=0.631 n=15+15)
    SetOperation/n=512/GEOS_Intersection-4                         115kB ± 0%     115kB ± 0%    ~     (p=0.752 n=15+15)
    SetOperation/n=512/GEOS_Difference-4                           159kB ± 0%     159kB ± 0%  +0.00%  (p=0.011 n=13+15)
    SetOperation/n=512/GEOS_SymmetricDifference-4                  577kB ± 0%     577kB ± 0%    ~     (p=0.501 n=15+15)
    SetOperation/n=512/GEOS_Union-4                                171kB ± 0%     171kB ± 0%    ~     (p=0.251 n=15+15)
    SetOperation/n=1024/Go_Intersection-4                         1.58MB ± 0%    1.58MB ± 0%    ~     (p=0.574 n=15+15)
    SetOperation/n=1024/Go_Difference-4                           1.77MB ± 0%    1.77MB ± 0%    ~     (p=1.000 n=15+15)
    SetOperation/n=1024/Go_SymmetricDifference-4                  2.80MB ± 0%    2.80MB ± 0%    ~     (p=0.175 n=14+15)
    SetOperation/n=1024/Go_Union-4                                1.83MB ± 0%    1.83MB ± 0%    ~     (p=0.406 n=14+15)
    SetOperation/n=1024/GEOS_Intersection-4                        189kB ± 0%     189kB ± 0%    ~     (p=0.333 n=15+15)
    SetOperation/n=1024/GEOS_Difference-4                          369kB ± 0%     369kB ± 0%    ~     (p=0.616 n=15+14)
    SetOperation/n=1024/GEOS_SymmetricDifference-4                1.38MB ± 0%    1.38MB ± 0%    ~     (p=0.845 n=15+15)
    SetOperation/n=1024/GEOS_Union-4                               415kB ± 0%     415kB ± 0%    ~     (p=0.603 n=15+13)
    SetOperation/n=2048/Go_Intersection-4                         3.64MB ± 0%    3.64MB ± 0%    ~     (p=0.821 n=14+15)
    SetOperation/n=2048/Go_Difference-4                           3.87MB ± 0%    3.87MB ± 0%    ~     (p=0.603 n=15+15)
    SetOperation/n=2048/Go_SymmetricDifference-4                  5.63MB ± 0%    5.63MB ± 0%    ~     (p=0.821 n=14+15)
    SetOperation/n=2048/Go_Union-4                                3.95MB ± 0%    3.95MB ± 0%    ~     (p=0.134 n=15+15)
    SetOperation/n=2048/GEOS_Intersection-4                        460kB ± 0%     460kB ± 0%  -0.00%  (p=0.024 n=14+12)
    SetOperation/n=2048/GEOS_Difference-4                          648kB ± 0%     648kB ± 0%    ~     (p=0.215 n=11+14)
    SetOperation/n=2048/GEOS_SymmetricDifference-4                2.32MB ± 0%    2.32MB ± 0%    ~     (p=0.075 n=15+15)
    SetOperation/n=2048/GEOS_Union-4                               689kB ± 0%     689kB ± 0%    ~     (p=0.091 n=15+15)
    SetOperation/n=4096/Go_Intersection-4                         6.82MB ± 0%    6.82MB ± 0%    ~     (p=0.496 n=13+14)
    SetOperation/n=4096/Go_Difference-4                           7.54MB ± 0%    7.54MB ± 0%    ~     (p=0.588 n=15+15)
    SetOperation/n=4096/Go_SymmetricDifference-4                  11.6MB ± 0%    11.6MB ± 0%    ~     (p=0.271 n=15+15)
    SetOperation/n=4096/Go_Union-4                                7.79MB ± 0%    7.79MB ± 0%    ~     (p=0.767 n=15+15)
    SetOperation/n=4096/GEOS_Intersection-4                        755kB ± 0%     755kB ± 0%    ~     (p=0.751 n=15+15)
    SetOperation/n=4096/GEOS_Difference-4                         1.45MB ± 0%    1.45MB ± 0%    ~     (p=0.884 n=10+15)
    SetOperation/n=4096/GEOS_SymmetricDifference-4                5.34MB ± 0%    5.34MB ± 0%    ~     (p=0.943 n=15+15)
    SetOperation/n=4096/GEOS_Union-4                              1.63MB ± 0%    1.63MB ± 0%    ~     (p=0.257 n=14+15)
    SetOperation/n=8192/Go_Intersection-4                         14.9MB ± 0%    14.9MB ± 0%    ~     (p=0.512 n=14+15)
    SetOperation/n=8192/Go_Difference-4                           15.8MB ± 0%    15.8MB ± 0%    ~     (p=0.370 n=14+15)
    SetOperation/n=8192/Go_SymmetricDifference-4                  22.7MB ± 0%    22.7MB ± 0%    ~     (p=0.205 n=15+15)
    SetOperation/n=8192/Go_Union-4                                16.1MB ± 0%    16.1MB ± 0%    ~     (p=0.811 n=13+15)
    SetOperation/n=8192/GEOS_Intersection-4                       1.76MB ± 0%    1.76MB ± 0%    ~     (p=0.470 n=15+15)
    SetOperation/n=8192/GEOS_Difference-4                         2.47MB ± 0%    2.47MB ± 0%    ~     (p=0.328 n=15+14)
    SetOperation/n=8192/GEOS_SymmetricDifference-4                9.01MB ± 0%    9.01MB ± 0%    ~     (p=0.468 n=14+15)
    SetOperation/n=8192/GEOS_Union-4                              2.66MB ± 0%    2.66MB ± 0%    ~     (p=0.344 n=14+15)
    SetOperation/n=16384/Go_Intersection-4                        27.9MB ± 0%    27.9MB ± 0%    ~     (p=0.735 n=15+15)
    SetOperation/n=16384/Go_Difference-4                          31.0MB ± 0%    31.0MB ± 0%    ~     (p=0.992 n=15+15)
    SetOperation/n=16384/Go_SymmetricDifference-4                 47.3MB ± 0%    47.3MB ± 0%    ~     (p=0.878 n=15+15)
    SetOperation/n=16384/Go_Union-4                               32.0MB ± 0%    32.0MB ± 0%    ~     (p=0.142 n=15+14)
    SetOperation/n=16384/GEOS_Intersection-4                      2.92MB ± 0%    2.92MB ± 0%  -0.00%  (p=0.029 n=14+12)
    SetOperation/n=16384/GEOS_Difference-4                        5.68MB ± 0%    5.68MB ± 0%    ~     (p=0.215 n=15+14)
    SetOperation/n=16384/GEOS_SymmetricDifference-4               21.1MB ± 0%    21.1MB ± 0%    ~     (p=0.235 n=14+15)
    SetOperation/n=16384/GEOS_Union-4                             6.45MB ± 0%    6.45MB ± 0%    ~     (p=0.121 n=15+15)
    pkg:github.com/peterstace/simplefeatures/rtree goos:linux goarch:amd64
    Delete/n=100-4                                                  712B ± 0%      712B ± 0%    ~     (all equal)
    Delete/n=1000-4                                               26.1kB ± 0%    26.1kB ± 0%    ~     (all equal)
    Delete/n=10000-4                                               412kB ± 0%     412kB ± 0%    ~     (p=0.700 n=15+15)
    Bulk/n=10-4                                                   1.46kB ± 0%    1.46kB ± 0%    ~     (all equal)
    Bulk/n=100-4                                                  19.9kB ± 0%    19.9kB ± 0%    ~     (all equal)
    Bulk/n=1000-4                                                 98.2kB ± 0%    98.2kB ± 0%    ~     (p=0.521 n=15+15)
    Bulk/n=10000-4                                                1.57MB ± 0%    1.57MB ± 0%    ~     (p=0.790 n=14+14)
    Bulk/n=100000-4                                               20.4MB ± 0%    20.4MB ± 0%    ~     (p=0.431 n=15+15)
    Insert/n=10-4                                                 1.44kB ± 0%    1.44kB ± 0%    ~     (all equal)
    Insert/n=100-4                                                13.5kB ± 0%    13.5kB ± 0%    ~     (all equal)
    Insert/n=1000-4                                                132kB ± 0%     132kB ± 0%    ~     (p=0.740 n=14+14)
    Insert/n=10000-4                                              1.34MB ± 0%    1.34MB ± 0%    ~     (p=0.440 n=14+15)
    Insert/n=100000-4                                             13.5MB ± 0%    13.5MB ± 0%    ~     (p=0.311 n=12+15)
    RangeSearch/n=10-4                                             0.00B          0.00B         ~     (all equal)
    RangeSearch/n=100-4                                            0.00B          0.00B         ~     (all equal)
    RangeSearch/n=1000-4                                           0.00B          0.00B         ~     (all equal)
    RangeSearch/n=10000-4                                          0.00B          0.00B         ~     (all equal)
    RangeSearch/n=100000-4                                         0.00B          0.00B         ~     (all equal)
    
    name                                                        old allocs/op  new allocs/op  delta
    pkg:github.com/peterstace/simplefeatures/geom goos:linux goarch:amd64
    LineEnvelope/0-4                                                0.00           0.00         ~     (all equal)
    LineEnvelope/1-4                                                0.00           0.00         ~     (all equal)
    LineEnvelope/2-4                                                0.00           0.00         ~     (all equal)
    LineEnvelope/3-4                                                0.00           0.00         ~     (all equal)
    MarshalWKB/polygon/n=10-4                                       6.00 ± 0%      6.00 ± 0%    ~     (all equal)
    MarshalWKB/polygon/n=100-4                                      6.00 ± 0%      6.00 ± 0%    ~     (all equal)
    MarshalWKB/polygon/n=1000-4                                     6.00 ± 0%      6.00 ± 0%    ~     (all equal)
    MarshalWKB/polygon/n=10000-4                                    6.00 ± 0%      6.00 ± 0%    ~     (all equal)
    UnmarshalWKB/polygon/n=10-4                                     7.00 ± 0%      7.00 ± 0%    ~     (all equal)
    UnmarshalWKB/polygon/n=100-4                                    7.00 ± 0%      7.00 ± 0%    ~     (all equal)
    UnmarshalWKB/polygon/n=1000-4                                   7.00 ± 0%      7.00 ± 0%    ~     (all equal)
    UnmarshalWKB/polygon/n=10000-4                                  7.00 ± 0%      7.00 ± 0%    ~     (all equal)
    IntersectsLineStringWithLineString/n=10-4                       9.00 ± 0%      9.00 ± 0%    ~     (all equal)
    IntersectsLineStringWithLineString/n=100-4                      73.0 ± 0%      73.0 ± 0%    ~     (all equal)
    IntersectsLineStringWithLineString/n=1000-4                      345 ± 0%       345 ± 0%    ~     (all equal)
    IntersectsLineStringWithLineString/n=10000-4                   5.46k ± 0%     5.46k ± 0%    ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=20-4                       1.00 ± 0%      1.00 ± 0%    ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=200-4                      7.00 ± 0%      7.00 ± 0%    ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=2000-4                     6.00 ± 0%      6.00 ± 0%    ~     (all equal)
    IntersectsMultiPointWithMultiPoint/n=20000-4                    11.0 ± 0%      11.0 ± 0%    ~     (all equal)
    PolygonSingleRingValidation/n=10-4                              12.0 ± 0%      12.0 ± 0%    ~     (all equal)
    PolygonSingleRingValidation/n=100-4                             76.0 ± 0%      76.0 ± 0%    ~     (all equal)
    PolygonSingleRingValidation/n=1000-4                             348 ± 0%       348 ± 0%    ~     (all equal)
    PolygonSingleRingValidation/n=10000-4                          5.47k ± 0%     5.47k ± 0%    ~     (all equal)
    PolygonMultipleRingsValidation/n=4-4                            42.0 ± 0%      42.0 ± 0%    ~     (all equal)
    PolygonMultipleRingsValidation/n=36-4                            316 ± 0%       316 ± 0%    ~     (all equal)
    PolygonMultipleRingsValidation/n=400-4                         3.48k ± 0%     3.48k ± 0%    ~     (all equal)
    PolygonMultipleRingsValidation/n=4096-4                        36.2k ± 0%     36.2k ± 0%    ~     (all equal)
    PolygonZigZagRingsValidation/n=10-4                             41.0 ± 0%      41.0 ± 0%    ~     (all equal)
    PolygonZigZagRingsValidation/n=100-4                             233 ± 0%       233 ± 0%    ~     (all equal)
    PolygonZigZagRingsValidation/n=1000-4                          1.05k ± 0%     1.05k ± 0%    ~     (all equal)
    PolygonZigZagRingsValidation/n=10000-4                         16.4k ± 0%     16.4k ± 0%    ~     (all equal)
    PolygonAnnulusValidation/n=10-4                                 22.0 ± 0%      22.0 ± 0%    ~     (all equal)
    PolygonAnnulusValidation/n=100-4                                76.0 ± 0%      76.0 ± 0%    ~     (all equal)
    PolygonAnnulusValidation/n=1000-4                              1.00k ± 0%     1.00k ± 0%    ~     (all equal)
    PolygonAnnulusValidation/n=10000-4                             10.3k ± 0%     10.3k ± 0%    ~     (all equal)
    MultipolygonValidation/n=1-4                                    8.00 ± 0%      8.00 ± 0%    ~     (all equal)
    MultipolygonValidation/n=4-4                                    11.0 ± 0%      11.0 ± 0%    ~     (all equal)
    MultipolygonValidation/n=16-4                                   27.0 ± 0%      27.0 ± 0%    ~     (all equal)
    MultipolygonValidation/n=64-4                                   91.0 ± 0%      91.0 ± 0%    ~     (all equal)
    MultipolygonValidation/n=256-4                                   347 ± 0%       347 ± 0%    ~     (all equal)
    MultipolygonValidation/n=1024-4                                1.37k ± 0%     1.37k ± 0%    ~     (all equal)
    MultiPolygonTwoCircles/n=10-4                                   29.0 ± 0%      29.0 ± 0%    ~     (all equal)
    MultiPolygonTwoCircles/n=100-4                                   157 ± 0%       157 ± 0%    ~     (all equal)
    MultiPolygonTwoCircles/n=1000-4                                  701 ± 0%       701 ± 0%    ~     (all equal)
    MultiPolygonTwoCircles/n=10000-4                               10.9k ± 0%     10.9k ± 0%    ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=1-4                        51.0 ± 0%      51.0 ± 0%    ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=10-4                        298 ± 0%       298 ± 0%    ~     (all equal)
    MultiPolygonMultipleTouchingPoints/n=100-4                     2.61k ± 0%     2.61k ± 0%    ~     (p=1.000 n=15+15)
    MultiPolygonMultipleTouchingPoints/n=1000-4                    26.7k ± 0%     26.7k ± 0%    ~     (p=0.938 n=15+15)
    WKTParsing/point-4                                              22.0 ± 0%      22.0 ± 0%    ~     (all equal)
    DistancePolygonToPolygonOrdering/n=100_swap=false-4              234 ± 0%       234 ± 0%    ~     (all equal)
    DistancePolygonToPolygonOrdering/n=100_swap=true-4               234 ± 0%       234 ± 0%    ~     (all equal)
    DistancePolygonToPolygonOrdering/n=1000_swap=false-4           2.10k ± 0%     2.10k ± 0%    ~     (all equal)
    DistancePolygonToPolygonOrdering/n=1000_swap=true-4            2.10k ± 0%     2.10k ± 0%    ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=false-4       13.0 ± 0%      13.0 ± 0%    ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=100_swap=true-4        13.0 ± 0%      13.0 ± 0%    ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-4      77.0 ± 0%      77.0 ± 0%    ~     (all equal)
    IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-4       77.0 ± 0%      77.0 ± 0%    ~     (all equal)
    MultiLineStringIsSimpleManyLineStrings/n=100-4                   371 ± 0%       371 ± 0%    ~     (all equal)
    MultiLineStringIsSimpleManyLineStrings/n=1000-4                3.34k ± 0%     3.34k ± 0%    ~     (all equal)
    pkg:github.com/peterstace/simplefeatures/geos goos:linux goarch:amd64
    IntersectionWithoutValidation/n=10-4                            48.0 ± 0%      48.0 ± 0%    ~     (all equal)
    IntersectionWithoutValidation/n=100-4                           48.0 ± 0%      48.0 ± 0%    ~     (all equal)
    IntersectionWithoutValidation/n=1000-4                          48.0 ± 0%      48.0 ± 0%    ~     (all equal)
    IntersectionWithoutValidation/n=10000-4                         48.0 ± 0%      48.0 ± 0%    ~     (all equal)
    NoOp/n=10-4                                                     33.0 ± 0%      33.0 ± 0%    ~     (all equal)
    NoOp/n=100-4                                                    33.0 ± 0%      33.0 ± 0%    ~     (all equal)
    NoOp/n=1000-4                                                   33.0 ± 0%      33.0 ± 0%    ~     (all equal)
    NoOp/n=10000-4                                                  33.0 ± 0%      33.0 ± 0%    ~     (all equal)
    pkg:github.com/peterstace/simplefeatures/internal/perf goos:linux goarch:amd64
    LineStringIsSimpleCircle/n=10-4                                 7.00 ± 0%      7.00 ± 0%    ~     (all equal)
    LineStringIsSimpleCircle/n=100-4                                71.0 ± 0%      71.0 ± 0%    ~     (all equal)
    LineStringIsSimpleCircle/n=1000-4                                343 ± 0%       343 ± 0%    ~     (all equal)
    LineStringIsSimpleCircle/n=10000-4                             5.46k ± 0%     5.46k ± 0%    ~     (all equal)
    LineStringIsSimpleZigZag/10-4                                   7.00 ± 0%      7.00 ± 0%    ~     (all equal)
    LineStringIsSimpleZigZag/100-4                                  71.0 ± 0%      71.0 ± 0%    ~     (all equal)
    LineStringIsSimpleZigZag/1000-4                                  343 ± 0%       343 ± 0%    ~     (all equal)
    LineStringIsSimpleZigZag/10000-4                               5.46k ± 0%     5.46k ± 0%    ~     (all equal)
    SetOperation/n=4/Go_Intersection-4                               276 ± 0%       276 ± 0%    ~     (all equal)
    SetOperation/n=4/Go_Difference-4                                 280 ± 0%       280 ± 0%    ~     (all equal)
    SetOperation/n=4/Go_SymmetricDifference-4                        378 ± 0%       378 ± 0%    ~     (all equal)
    SetOperation/n=4/Go_Union-4                                      287 ± 0%       287 ± 0%    ~     (all equal)
    SetOperation/n=4/GEOS_Intersection-4                            52.0 ± 0%      52.0 ± 0%    ~     (all equal)
    SetOperation/n=4/GEOS_Difference-4                              55.0 ± 0%      55.0 ± 0%    ~     (all equal)
    SetOperation/n=4/GEOS_SymmetricDifference-4                      148 ± 0%       148 ± 0%    ~     (all equal)
    SetOperation/n=4/GEOS_Union-4                                   56.0 ± 0%      56.0 ± 0%    ~     (all equal)
    SetOperation/n=8/Go_Intersection-4                               292 ± 0%       292 ± 0%    ~     (p=1.000 n=15+15)
    SetOperation/n=8/Go_Difference-4                                 293 ± 0%       294 ± 0%    ~     (p=0.264 n=15+15)
    SetOperation/n=8/Go_SymmetricDifference-4                        397 ± 0%       397 ± 0%  -0.08%  (p=0.034 n=15+14)
    SetOperation/n=8/Go_Union-4                                      298 ± 0%       298 ± 0%  +0.13%  (p=0.034 n=12+15)
    SetOperation/n=8/GEOS_Intersection-4                            56.0 ± 0%      56.0 ± 0%    ~     (all equal)
    SetOperation/n=8/GEOS_Difference-4                              56.0 ± 0%      56.0 ± 0%    ~     (all equal)
    SetOperation/n=8/GEOS_SymmetricDifference-4                      152 ± 0%       152 ± 0%    ~     (all equal)
    SetOperation/n=8/GEOS_Union-4                                   56.0 ± 0%      56.0 ± 0%    ~     (all equal)
    SetOperation/n=16/Go_Intersection-4                              306 ± 0%       306 ± 0%    ~     (all equal)
    SetOperation/n=16/Go_Difference-4                                316 ± 0%       316 ± 0%    ~     (all equal)
    SetOperation/n=16/Go_SymmetricDifference-4                       445 ± 0%       445 ± 0%    ~     (all equal)
    SetOperation/n=16/Go_Union-4                                     325 ± 0%       325 ± 0%    ~     (all equal)
    SetOperation/n=16/GEOS_Intersection-4                           56.0 ± 0%      56.0 ± 0%    ~     (all equal)
    SetOperation/n=16/GEOS_Difference-4                             64.0 ± 0%      64.0 ± 0%    ~     (all equal)
    SetOperation/n=16/GEOS_SymmetricDifference-4                     185 ± 0%       185 ± 0%    ~     (all equal)
    SetOperation/n=16/GEOS_Union-4                                  68.0 ± 0%      68.0 ± 0%    ~     (all equal)
    SetOperation/n=32/Go_Intersection-4                              357 ± 0%       357 ± 0%    ~     (all equal)
    SetOperation/n=32/Go_Difference-4                                363 ± 0%       363 ± 0%    ~     (all equal)
    SetOperation/n=32/Go_SymmetricDifference-4                       516 ± 0%       516 ± 0%    ~     (all equal)
    SetOperation/n=32/Go_Union-4                                     368 ± 0%       368 ± 0%    ~     (all equal)
    SetOperation/n=32/GEOS_Intersection-4                           68.0 ± 0%      68.0 ± 0%    ~     (all equal)
    SetOperation/n=32/GEOS_Difference-4                             72.0 ± 0%      72.0 ± 0%    ~     (all equal)
    SetOperation/n=32/GEOS_SymmetricDifference-4                     216 ± 0%       216 ± 0%    ~     (all equal)
    SetOperation/n=32/GEOS_Union-4                                  72.0 ± 0%      72.0 ± 0%    ~     (all equal)
    SetOperation/n=64/Go_Intersection-4                              398 ± 0%       398 ± 0%    ~     (all equal)
    SetOperation/n=64/Go_Difference-4                                432 ± 0%       432 ± 0%    ~     (p=0.084 n=15+14)
    SetOperation/n=64/Go_SymmetricDifference-4                       683 ± 0%       683 ± 0%    ~     (all equal)
    SetOperation/n=64/Go_Union-4                                     445 ± 0%       445 ± 0%    ~     (all equal)
    SetOperation/n=64/GEOS_Intersection-4                           72.0 ± 0%      72.0 ± 0%    ~     (all equal)
    SetOperation/n=64/GEOS_Difference-4                              104 ± 0%       104 ± 0%    ~     (all equal)
    SetOperation/n=64/GEOS_SymmetricDifference-4                     345 ± 0%       345 ± 0%    ~     (all equal)
    SetOperation/n=64/GEOS_Union-4                                   112 ± 0%       112 ± 0%    ~     (all equal)
    SetOperation/n=128/Go_Intersection-4                             572 ± 0%       572 ± 0%    ~     (all equal)
    SetOperation/n=128/Go_Difference-4                               598 ± 0%       598 ± 0%    ~     (all equal)
    SetOperation/n=128/Go_SymmetricDifference-4                      946 ± 0%       946 ± 0%    ~     (all equal)
    SetOperation/n=128/Go_Union-4                                    603 ± 0%       603 ± 0%    ~     (all equal)
    SetOperation/n=128/GEOS_Intersection-4                           112 ± 0%       112 ± 0%    ~     (all equal)
    SetOperation/n=128/GEOS_Difference-4                             136 ± 0%       136 ± 0%    ~     (all equal)
    SetOperation/n=128/GEOS_SymmetricDifference-4                    473 ± 0%       473 ± 0%    ~     (all equal)
    SetOperation/n=128/GEOS_Union-4                                  136 ± 0%       136 ± 0%    ~     (all equal)
    SetOperation/n=256/Go_Intersection-4                             731 ± 0%       731 ± 0%    ~     (all equal)
    SetOperation/n=256/Go_Difference-4                               861 ± 0%       861 ± 0%    ~     (all equal)
    SetOperation/n=256/Go_SymmetricDifference-4                    1.59k ± 0%     1.59k ± 0%    ~     (all equal)
    SetOperation/n=256/Go_Union-4                                    890 ± 0%       890 ± 0%    ~     (all equal)
    SetOperation/n=256/GEOS_Intersection-4                           136 ± 0%       136 ± 0%    ~     (all equal)
    SetOperation/n=256/GEOS_Difference-4                             264 ± 0%       264 ± 0%    ~     (all equal)
    SetOperation/n=256/GEOS_SymmetricDifference-4                    985 ± 0%       985 ± 0%    ~     (all equal)
    SetOperation/n=256/GEOS_Union-4                                  288 ± 0%       288 ± 0%    ~     (all equal)
    SetOperation/n=512/Go_Intersection-4                           1.40k ± 0%     1.40k ± 0%    ~     (all equal)
    SetOperation/n=512/Go_Difference-4                             1.51k ± 0%     1.51k ± 0%    ~     (p=1.000 n=15+15)
    SetOperation/n=512/Go_SymmetricDifference-4                    2.62k ± 0%     2.62k ± 0%    ~     (all equal)
    SetOperation/n=512/Go_Union-4                                  1.51k ± 0%     1.51k ± 0%    ~     (p=0.700 n=15+15)
    SetOperation/n=512/GEOS_Intersection-4                           288 ± 0%       288 ± 0%    ~     (all equal)
    SetOperation/n=512/GEOS_Difference-4                             392 ± 0%       392 ± 0%    ~     (all equal)
    SetOperation/n=512/GEOS_SymmetricDifference-4                  1.50k ± 0%     1.50k ± 0%    ~     (all equal)
    SetOperation/n=512/GEOS_Union-4                                  392 ± 0%       392 ± 0%    ~     (all equal)
    SetOperation/n=1024/Go_Intersection-4                          2.03k ± 0%     2.03k ± 0%    ~     (all equal)
    SetOperation/n=1024/Go_Difference-4                            2.54k ± 0%     2.54k ± 0%    ~     (all equal)
    SetOperation/n=1024/Go_SymmetricDifference-4                   5.20k ± 0%     5.20k ± 0%    ~     (all equal)
    SetOperation/n=1024/Go_Union-4                                 2.64k ± 0%     2.64k ± 0%    ~     (all equal)
    SetOperation/n=1024/GEOS_Intersection-4                          392 ± 0%       392 ± 0%    ~     (all equal)
    SetOperation/n=1024/GEOS_Difference-4                            904 ± 0%       904 ± 0%    ~     (all equal)
    SetOperation/n=1024/GEOS_SymmetricDifference-4                 3.54k ± 0%     3.54k ± 0%    ~     (all equal)
    SetOperation/n=1024/GEOS_Union-4                                 992 ± 0%       992 ± 0%    ~     (all equal)
    SetOperation/n=2048/Go_Intersection-4                          4.69k ± 0%     4.69k ± 0%    ~     (all equal)
    SetOperation/n=2048/Go_Difference-4                            5.12k ± 0%     5.12k ± 0%    ~     (all equal)
    SetOperation/n=2048/Go_SymmetricDifference-4                   9.31k ± 0%     9.31k ± 0%    ~     (all equal)
    SetOperation/n=2048/Go_Union-4                                 5.12k ± 0%     5.12k ± 0%    ~     (all equal)
    SetOperation/n=2048/GEOS_Intersection-4                          992 ± 0%       992 ± 0%    ~     (all equal)
    SetOperation/n=2048/GEOS_Difference-4                          1.42k ± 0%     1.42k ± 0%    ~     (all equal)
    SetOperation/n=2048/GEOS_SymmetricDifference-4                 5.59k ± 0%     5.59k ± 0%    ~     (all equal)
    SetOperation/n=2048/GEOS_Union-4                               1.42k ± 0%     1.42k ± 0%    ~     (all equal)
    SetOperation/n=4096/Go_Intersection-4                          7.17k ± 0%     7.17k ± 0%    ~     (all equal)
    SetOperation/n=4096/Go_Difference-4                            9.22k ± 0%     9.22k ± 0%    ~     (p=0.056 n=15+12)
    SetOperation/n=4096/Go_SymmetricDifference-4                   19.6k ± 0%     19.6k ± 0%    ~     (p=1.000 n=15+15)
    SetOperation/n=4096/Go_Union-4                                 9.57k ± 0%     9.57k ± 0%    ~     (all equal)
    SetOperation/n=4096/GEOS_Intersection-4                        1.42k ± 0%     1.42k ± 0%    ~     (all equal)
    SetOperation/n=4096/GEOS_Difference-4                          3.46k ± 0%     3.46k ± 0%    ~     (all equal)
    SetOperation/n=4096/GEOS_SymmetricDifference-4                 13.8k ± 0%     13.8k ± 0%    ~     (all equal)
    SetOperation/n=4096/GEOS_Union-4                               3.81k ± 0%     3.81k ± 0%    ~     (all equal)
    SetOperation/n=8192/Go_Intersection-4                          17.8k ± 0%     17.8k ± 0%    ~     (p=0.739 n=15+15)
    SetOperation/n=8192/Go_Difference-4                            19.5k ± 0%     19.5k ± 0%    ~     (p=0.462 n=15+15)
    SetOperation/n=8192/Go_SymmetricDifference-4                   36.0k ± 0%     36.0k ± 0%    ~     (p=0.107 n=15+15)
    SetOperation/n=8192/Go_Union-4                                 19.5k ± 0%     19.5k ± 0%    ~     (p=1.000 n=15+15)
    SetOperation/n=8192/GEOS_Intersection-4                        3.81k ± 0%     3.81k ± 0%    ~     (all equal)
    SetOperation/n=8192/GEOS_Difference-4                          5.51k ± 0%     5.51k ± 0%    ~     (all equal)
    SetOperation/n=8192/GEOS_SymmetricDifference-4                 22.0k ± 0%     22.0k ± 0%    ~     (all equal)
    SetOperation/n=8192/GEOS_Union-4                               5.51k ± 0%     5.51k ± 0%    ~     (all equal)
    SetOperation/n=16384/Go_Intersection-4                         27.7k ± 0%     27.7k ± 0%    ~     (p=0.412 n=15+15)
    SetOperation/n=16384/Go_Difference-4                           35.9k ± 0%     35.9k ± 0%    ~     (p=0.356 n=15+9)
    SetOperation/n=16384/Go_SymmetricDifference-4                  76.9k ± 0%     76.9k ± 0%    ~     (p=1.000 n=15+15)
    SetOperation/n=16384/Go_Union-4                                37.2k ± 0%     37.2k ± 0%    ~     (p=0.706 n=14+14)
    SetOperation/n=16384/GEOS_Intersection-4                       5.51k ± 0%     5.51k ± 0%    ~     (all equal)
    SetOperation/n=16384/GEOS_Difference-4                         13.7k ± 0%     13.7k ± 0%    ~     (all equal)
    SetOperation/n=16384/GEOS_SymmetricDifference-4                54.7k ± 0%     54.7k ± 0%    ~     (p=0.700 n=15+15)
    SetOperation/n=16384/GEOS_Union-4                              15.1k ± 0%     15.1k ± 0%    ~     (all equal)
    pkg:github.com/peterstace/simplefeatures/rtree goos:linux goarch:amd64
    Delete/n=100-4                                                  65.0 ± 0%      65.0 ± 0%    ~     (all equal)
    Delete/n=1000-4                                                  480 ± 0%       480 ± 0%    ~     (all equal)
    Delete/n=10000-4                                               7.62k ± 0%     7.62k ± 0%    ~     (all equal)
    Bulk/n=10-4                                                     6.00 ± 0%      6.00 ± 0%    ~     (all equal)
    Bulk/n=100-4                                                    70.0 ± 0%      70.0 ± 0%    ~     (all equal)
    Bulk/n=1000-4                                                    342 ± 0%       342 ± 0%    ~     (all equal)
    Bulk/n=10000-4                                                 5.46k ± 0%     5.46k ± 0%    ~     (all equal)
    Bulk/n=100000-4                                                71.0k ± 0%     71.0k ± 0%    ~     (all equal)
    Insert/n=10-4                                                   5.00 ± 0%      5.00 ± 0%    ~     (all equal)
    Insert/n=100-4                                                  47.0 ± 0%      47.0 ± 0%    ~     (all equal)
    Insert/n=1000-4                                                  457 ± 0%       457 ± 0%    ~     (all equal)
    Insert/n=10000-4                                               4.65k ± 0%     4.65k ± 0%    ~     (all equal)
    Insert/n=100000-4                                              46.8k ± 0%     46.8k ± 0%    ~     (all equal)
    RangeSearch/n=10-4                                              0.00           0.00         ~     (all equal)
    RangeSearch/n=100-4                                             0.00           0.00         ~     (all equal)
    RangeSearch/n=1000-4                                            0.00           0.00         ~     (all equal)
    RangeSearch/n=10000-4                                           0.00           0.00         ~     (all equal)
    RangeSearch/n=100000-4                                          0.00           0.00         ~     (all equal)
    
    
  • Implement the json.Unmarshaller interface for each concrete geometry

    Implement the json.Unmarshaller interface for each concrete geometry

    Currently, the json.Unmarshaller interface is only satisfied by the Geometry and GeometryCollection types.

    The concrete geometry types (Point, LineString etc) should also implement this interface.

  • Alter Internal Structure Of MultiPoint

    Alter Internal Structure Of MultiPoint

    Description

    • Alters the internals of MultiPoint to keep a slice of Point rather than a Sequency and a BitSet indicating empty points.

    • This gives MultiPoint consistency with the other Multi* geometries (MultiLineString and MultiPolygon).

    • It's also going to make implementing NaN and Inf checks easier later (see the linked ticket).

    Check List

    Have you:

    • Added unit tests? N/A, relies on existing.

    • Add cmprefimpl tests? (if appropriate?) N/A, relies on existing.

    Related Issue

    • Part of https://github.com/peterstace/simplefeatures/issues/396

    Benchmark Results

    • Please paste benchmark results here. The benchmarks can be run using the run_benchmarks.sh script.

    TODO

    Click to expand
    PASTE BENCHMARKS HERE
    
  • Make the `rtree` package internal

    Make the `rtree` package internal

    The rtree package is exposed publically, making it part of the module interface contract. This reduces the amount of flexibility with changing the interface and implementation of that package. We can modify the package's interface without breaking users by first making it internal. This assumes that users aren't already using the rtree package, which I think is a reasonable assumption.

  • Investigate proper GeoJSON winding order

    Investigate proper GeoJSON winding order

    Right now, no normalisation takes place when marshalling GeoJSON. Should ring orientation be normalised? Needs a bit of investigation and thought about what implications this could have.

  • Make polygon construction easier

    Make polygon construction easier

    If a user has some input coordinates, it is quite onerous to get a polygon object.

    For example, the following program has a hardcoded list of coordinates, constructs a polygon from those coordinates, and then calculates the centroid of the polygon.

    func main() {
        coords := []float64{
            144.9324481856214,
            -37.80831791530031,
            151.1946474301501,
            -33.85326738062629,
            153.011491595451,
            -27.465643838083587,
            130.84533948192757,
            -12.45094813855576,
            115.8443383313529,
            -31.96739822401411,
            144.9324481856214,
            -37.80831791530031,
        }
        seq := geom.NewSequence(coords, geom.DimXY)
        ring, err := geom.NewLineString(seq)
        if err != nil {
            log.Fatalf("could not build ring: %v", err)
        }
        poly, err := geom.NewPolygon([]geom.LineString{ring})
        if err != nil {
            log.Fatalf("could not build polygon: %v", err)
        }
    
        log.Printf("Center: %v", poly.Centroid().AsText())
    }
    

    It would be nice if there were alternate (easier/terser) ways to create geometry objects. Potentially this could live in a separate package (named gbuild in this example, but that's just a placeholder). For example, it might look like this:

    func main() {
        coords := []float64{
            144.9324481856214,
            -37.80831791530031,
            151.1946474301501,
            -33.85326738062629,
            153.011491595451,
            -27.465643838083587,
            130.84533948192757,
            -12.45094813855576,
            115.8443383313529,
            -31.96739822401411,
            144.9324481856214,
            -37.80831791530031,
        }
        poly, err := gbuild.PolygonFromCoords([][]float64{coords})
            log.Fatalf("could not build polygon: %v", err)
        }
    
        log.Printf("Center: %v", poly.Centroid().AsText())
    }
    
  • Don't use trigonometry when sorting half edge records radially

    Don't use trigonometry when sorting half edge records radially

    In doublyConnectedEdgeList's fixVertex method, trigonometry is used to sort edges radially. Specifically, we use the math.Atan2 function to calculate the angle of each edge, and then sort the edges via their angle.

    Some alternate approaches are described here: https://stackoverflow.com/questions/6989100/sort-points-in-clockwise-order. These approaches may be better because they don't rely on trigonometry. Using regular multiplication/addition may be more numerically stable for angles that are extremely close together.

  • Revisit boundary behaviour in DCEL algorithm

    Revisit boundary behaviour in DCEL algorithm

    There are two parts that should be revisited:

    • Should the boundary for vertex records flip between internal/boundary in cases where multiple polygons (in a geometry collection) share an edge?

    • The modelling for boundary/interior/exterior is complicated. Can we use a tri-state enum instead?

Data access layer for PostgreSQL, CockroachDB, MySQL, SQLite and MongoDB with ORM-like features.
Data access layer for PostgreSQL, CockroachDB, MySQL, SQLite and MongoDB with ORM-like features.

upper/db is a productive data access layer (DAL) for Go that provides agnostic tools to work with different data sources

Jan 3, 2023
Go implementation of the XDG Base Directory Specification and XDG user directories

xdg Provides an implementation of the XDG Base Directory Specification. The specification defines a set of standard paths for storing application file

Jan 5, 2023
Package notify provides an implementation of the Gnome DBus Notifications Specification.

go-notify Package notify provides an implementation of the Gnome DBus Notifications Specification. Examples Display a simple notification. ntf := noti

Dec 27, 2022
Go implementation of the XDG Base Directory Specification and XDG user directories

xdg Provides an implementation of the XDG Base Directory Specification. The specification defines a set of standard paths for storing application file

Dec 23, 2022
A specification compliant implementation of RFC7636 - Proof Key for Code Exchange (PKCE) for Go

pkce implements the client side of RFC 7636 "Proof Key for Code Exchange by OAuth Public Clients" (PKCE) to enable the generation of cryptographically secure and specification compliant code verifiers and code challenges

Dec 20, 2022
rpCheckup is an AWS resource policy security checkup tool that identifies public, external account access, intra-org account access, and private resources.
rpCheckup is an AWS resource policy security checkup tool that identifies public, external account access, intra-org     account access, and private resources.

rpCheckup - Catch AWS resource policy backdoors like Endgame rpCheckup is an AWS resource policy security checkup tool that identifies public, externa

Dec 26, 2022
A cloud native Identity & Access Proxy / API (IAP) and Access Control Decision API

Heimdall Heimdall is inspired by Ory's OAthkeeper, tries however to resolve the functional limitations of that product by also building on a more mode

Jan 6, 2023
Smart.go is a pure Golang library to access disk low-level S.M.A.R.T. information

Smart.go is a pure Golang library to access disk low-level S.M.A.R.T. information. Smart.go tries to match functionality provided by smartctl but with golang API.

Dec 27, 2022
An efficient and feature complete Hystrix like Go implementation of the circuit breaker pattern.
An efficient and feature complete Hystrix like Go implementation of the circuit breaker pattern.

Circuit Circuit is an efficient and feature complete Hystrix like Go implementation of the circuit breaker pattern. Learn more about the problems Hyst

Dec 28, 2022
TritonHTTP - A simple web server that implements a subset of the HTTP/1.1 protocol specification

TritonHTTP Spec Summary Here we provide a concise summary of the TritonHTTP spec. You should read the spec doc for more details and clarifications. HT

Nov 5, 2022
easyssh-proxy provides a simple implementation of some SSH protocol features in Go

easyssh-proxy easyssh-proxy provides a simple implementation of some SSH protocol features in Go. Feature This project is forked from easyssh but add

Dec 30, 2022
A standalone, specification-compliant, OAuth2 server written in Golang.
A standalone, specification-compliant,  OAuth2 server written in Golang.

Go OAuth2 Server This service implements OAuth 2.0 specification. Excerpts from the specification are included in this README file to describe differe

Dec 28, 2022
A STOMP Client package for go developers, supporting all STOMP specification levels.

stompngo - A STOMP 1.0, 1.1 and 1.2 Client Package Features Full support of STOMP protocols: Protocol Level 1.0 Protocol Level 1.1 Protocol Level 1.2

Oct 19, 2022
A diff tool for OpenAPI Specification 3

OpenAPI Diff This is a diff tool for OpenAPI Spec 3. It can be used in two ways: Generate a diff report in YAML, Text/Markdown or HTML from the cmd-li

Jan 5, 2023
A set of tests to check compliance with the Prometheus Remote Write specification

Prometheus Remote Write Compliance Test This repo contains a set of tests to check compliance with the Prometheus Remote Write specification. The test

Dec 4, 2022
A set of tests to check compliance with the Prometheus Remote Write specification

Prometheus Compliance Tests This repo contains code to test compliance with various Prometheus standards. PromQL The promql directory contains code to

Dec 4, 2022
rpc/v2 support for JSON-RPC 2.0 Specification.

rpc rpc/v2 support for JSON-RPC 2.0 Specification. gorilla/rpc is a foundation for RPC over HTTP services, providing access to the exported methods of

Jul 4, 2021
Common Expression Language -- specification and binary representation

The Common Expression Language (CEL) implements common semantics for expression evaluation, enabling different applications to more easily interoperate.

Jan 8, 2023
Open Source runtime scanner for Linux containers (LXD), It performs security audit checks based on CIS Linux containers Benchmark specification
Open Source runtime scanner for Linux containers (LXD), It performs security audit checks based on CIS Linux containers  Benchmark specification

lxd-probe Scan your Linux container runtime !! Lxd-Probe is an open source audit scanner who perform audit check on a linux container manager and outp

Dec 26, 2022
Composable OpenAPI Specification (aka Swagger)
Composable OpenAPI Specification (aka Swagger)

compoas Library for building, composing and serving OpenAPI Specification (aka Swagger). Features This lib provides: golang structs which reflect Open

Jun 1, 2022