From 23fe82e9cc4ed099458687aec86f2123ce6aedaf Mon Sep 17 00:00:00 2001 From: thisisaaronland Date: Mon, 9 May 2022 11:17:38 -0700 Subject: [PATCH] update vendor deps; recompile data --- data/galleries.json | 2 +- data/gates.json | 2 +- go.mod | 12 +- go.sum | 78 +- vendor/github.com/paulmach/orb/CHANGELOG.md | 91 ++ vendor/github.com/paulmach/orb/README.md | 25 +- .../paulmach/orb/encoding/wkt/README.md | 17 + .../paulmach/orb/encoding/wkt/unmarshal.go | 318 +++++ .../paulmach/orb/encoding/wkt/wkt.go | 134 ++ .../github.com/paulmach/orb/geojson/README.md | 46 + .../paulmach/orb/geojson/feature.go | 5 +- .../orb/geojson/feature_collection.go | 13 +- .../paulmach/orb/geojson/geometry.go | 52 +- .../github.com/paulmach/orb/geojson/json.go | 74 ++ .../sfomuseum/go-edtf/deprecated.go | 42 + .../sfomuseum/go-edtf/level0/tests.go | 6 + vendor/github.com/twpayne/go-geom/.gitignore | 2 - .../github.com/twpayne/go-geom/.golangci.yml | 112 -- .../github.com/twpayne/go-geom/INTERNALS.md | 119 -- vendor/github.com/twpayne/go-geom/LICENSE | 23 - vendor/github.com/twpayne/go-geom/Makefile | 54 - vendor/github.com/twpayne/go-geom/README.md | 75 -- vendor/github.com/twpayne/go-geom/bounds.go | 178 --- .../github.com/twpayne/go-geom/derived.gen.go | 314 ----- .../go-geom/encoding/geojson/geojson.go | 630 --------- .../twpayne/go-geom/encoding/wkt/.gitignore | 1 - .../twpayne/go-geom/encoding/wkt/encode.go | 251 ---- .../twpayne/go-geom/encoding/wkt/lex.go | 540 -------- .../go-geom/encoding/wkt/lex_errors.go | 70 - .../twpayne/go-geom/encoding/wkt/lex_stack.go | 128 -- .../twpayne/go-geom/encoding/wkt/lex_types.go | 54 - .../twpayne/go-geom/encoding/wkt/wkt.gen.go | 1166 ----------------- .../twpayne/go-geom/encoding/wkt/wkt.go | 71 - .../twpayne/go-geom/encoding/wkt/wkt.y | 742 ----------- vendor/github.com/twpayne/go-geom/flat.go | 428 ------ vendor/github.com/twpayne/go-geom/geom.go | 251 ---- .../twpayne/go-geom/geometrycollection.go | 169 --- vendor/github.com/twpayne/go-geom/go.mod | 12 - vendor/github.com/twpayne/go-geom/go.sum | 88 -- .../github.com/twpayne/go-geom/linearring.go | 60 - .../github.com/twpayne/go-geom/linestring.go | 99 -- .../twpayne/go-geom/multilinestring.go | 88 -- .../github.com/twpayne/go-geom/multipoint.go | 160 --- .../twpayne/go-geom/multipolygon.go | 115 -- vendor/github.com/twpayne/go-geom/point.go | 120 -- vendor/github.com/twpayne/go-geom/polygon.go | 87 -- .../whosonfirst/go-ioutil/readseekcloser.go | 10 +- vendor/github.com/whosonfirst/go-reader/fs.go | 54 +- .../github.com/whosonfirst/go-reader/go.mod | 2 +- .../github.com/whosonfirst/go-reader/go.sum | 38 +- .../go-whosonfirst-export/v2/go.mod | 6 +- .../go-whosonfirst-export/v2/go.sum | 58 +- .../go-whosonfirst-feature/alt/alt.go | 34 + .../geometry/geometry.go | 27 + .../go-whosonfirst-feature/geometry/type.go | 17 + .../properties/belongsto.go | 18 + .../properties/source.go | 32 + .../go-whosonfirst-geojson-v2/README.md | 16 +- .../go-whosonfirst-geojson-v2/go.mod | 8 +- .../go-whosonfirst-geojson-v2/go.sum | 13 - .../whosonfirst/go-whosonfirst-spr/v2/go.mod | 8 +- .../whosonfirst/go-whosonfirst-spr/v2/go.sum | 74 +- .../whosonfirst/go-whosonfirst-spr/v2/spr.go | 4 +- .../go-whosonfirst-spr/v2/whosonfirst.go | 343 +++++ .../go-whosonfirst-spr/v2/whosonfirst_alt.go | 218 +++ .../README.md | 13 +- .../doc.go | 2 + .../go.mod | 10 +- .../go.sum | 128 +- .../index.go | 101 +- .../go-whosonfirst-sqlite-features/README.md | 19 +- .../go-whosonfirst-sqlite-features/doc.go | 2 + .../features.go | 7 +- .../go-whosonfirst-sqlite-features/go.mod | 5 +- .../go-whosonfirst-sqlite-features/go.sum | 125 +- .../tables/ancestors.go | 52 +- .../tables/concordances.go | 55 +- .../tables/error.go | 48 + .../tables/geojson.go | 70 +- .../tables/geometries.go | 74 +- .../tables/geometry.go | 167 --- .../tables/names.go | 65 +- .../tables/properties.go | 55 +- .../tables/rtree.go | 123 +- .../tables/search.go | 76 +- .../tables/spr.go | 87 +- .../tables/supersedes.go | 45 +- .../tables/tables.go | 18 +- .../go-whosonfirst-sqlite-index/v3/.gitignore | 3 + .../go-whosonfirst-sqlite-index/v3/LICENSE | 27 + .../go-whosonfirst-sqlite-index/v3/Makefile | 2 + .../go-whosonfirst-sqlite-index/v3/README.md | 54 + .../go-whosonfirst-sqlite-index/v3/doc.go | 4 + .../go-whosonfirst-sqlite-index/v3/go.mod | 9 + .../go-whosonfirst-sqlite-index/v3/go.sum | 26 + .../go-whosonfirst-sqlite-index/v3/index.go | 193 +++ vendor/modules.txt | 29 +- 97 files changed, 2598 insertions(+), 7200 deletions(-) create mode 100644 vendor/github.com/paulmach/orb/CHANGELOG.md create mode 100644 vendor/github.com/paulmach/orb/encoding/wkt/README.md create mode 100644 vendor/github.com/paulmach/orb/encoding/wkt/unmarshal.go create mode 100644 vendor/github.com/paulmach/orb/encoding/wkt/wkt.go create mode 100644 vendor/github.com/paulmach/orb/geojson/json.go create mode 100644 vendor/github.com/sfomuseum/go-edtf/deprecated.go delete mode 100644 vendor/github.com/twpayne/go-geom/.gitignore delete mode 100644 vendor/github.com/twpayne/go-geom/.golangci.yml delete mode 100644 vendor/github.com/twpayne/go-geom/INTERNALS.md delete mode 100644 vendor/github.com/twpayne/go-geom/LICENSE delete mode 100644 vendor/github.com/twpayne/go-geom/Makefile delete mode 100644 vendor/github.com/twpayne/go-geom/README.md delete mode 100644 vendor/github.com/twpayne/go-geom/bounds.go delete mode 100644 vendor/github.com/twpayne/go-geom/derived.gen.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/geojson/geojson.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/.gitignore delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/encode.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/lex.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/lex_errors.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/lex_stack.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/lex_types.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.gen.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.go delete mode 100644 vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.y delete mode 100644 vendor/github.com/twpayne/go-geom/flat.go delete mode 100644 vendor/github.com/twpayne/go-geom/geom.go delete mode 100644 vendor/github.com/twpayne/go-geom/geometrycollection.go delete mode 100644 vendor/github.com/twpayne/go-geom/go.mod delete mode 100644 vendor/github.com/twpayne/go-geom/go.sum delete mode 100644 vendor/github.com/twpayne/go-geom/linearring.go delete mode 100644 vendor/github.com/twpayne/go-geom/linestring.go delete mode 100644 vendor/github.com/twpayne/go-geom/multilinestring.go delete mode 100644 vendor/github.com/twpayne/go-geom/multipoint.go delete mode 100644 vendor/github.com/twpayne/go-geom/multipolygon.go delete mode 100644 vendor/github.com/twpayne/go-geom/point.go delete mode 100644 vendor/github.com/twpayne/go-geom/polygon.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-feature/alt/alt.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-feature/geometry/geometry.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-feature/geometry/type.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-feature/properties/belongsto.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-feature/properties/source.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/whosonfirst.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/whosonfirst_alt.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/doc.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/doc.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/error.go delete mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geometry.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/.gitignore create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/LICENSE create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/Makefile create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/README.md create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/doc.go create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/go.mod create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/go.sum create mode 100644 vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/index.go diff --git a/data/galleries.json b/data/galleries.json index 82d32a1..a0359e4 100644 --- a/data/galleries.json +++ b/data/galleries.json @@ -1 +1 @@ -[{"wof:id":1729813695,"sfomuseum:id":77,"map_id":"1D","wof:name":"1D Alley Gallery","edtf:inception":"2021~","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813697,"sfomuseum:id":79,"map_id":"1A","wof:name":"1A Student Art South","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813699,"sfomuseum:id":80,"map_id":"2D","wof:name":"2D Sky Terrace Platform","edtf:inception":"2020~","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813731,"sfomuseum:id":38,"map_id":"K07","wof:name":"AML Aviation Museum Ceiling 07","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":0},{"wof:id":1729813741,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729813733,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813745,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729813735,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729813747,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":0},{"wof:id":1729813737,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729792775,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792767,"sfomuseum:id":67,"map_id":"D14","wof:name":"D-14 Kids’ Spot","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813739,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729792781,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792777,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792783,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2020-~05","edtf:cessation":"2020-01-13","mz:is_current":0},{"wof:id":1729792769,"sfomuseum:id":58,"map_id":"2A","wof:name":"2A Boomerang Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792795,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2020-~05","edtf:cessation":"2020-02-02","mz:is_current":0},{"wof:id":1729792779,"sfomuseum:id":37,"map_id":"3D","wof:name":"3D Terminal 3 Hub","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792787,"sfomuseum:id":19,"map_id":"4B","wof:name":"4B International North Wall","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729837321,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729837317,"sfomuseum:id":72,"map_id":"B15","wof:name":"B-15 Harvey Milk Temporary Wall Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792789,"sfomuseum:id":59,"map_id":"","wof:name":"A-07 International Central Vitrine","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1360392583,"sfomuseum:id":25,"map_id":"3F","wof:name":"3F Gate 87a","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360392585,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360392587,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360392589,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1746403233,"sfomuseum:id":86,"map_id":"4A","wof:name":"4A International North Cases","edtf:inception":"","edtf:cessation":"","mz:is_current":1},{"wof:id":1360392591,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360392593,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"1987~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1745882453,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882459,"sfomuseum:id":80,"map_id":"2D","wof:name":"2D Sky Terrace Platform","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882461,"sfomuseum:id":81,"map_id":"D16","wof:name":"D-16 Sky Terrace Wall","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882475,"sfomuseum:id":40,"map_id":"1J","wof:name":"1J Terminal One Lower Gallery","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882463,"sfomuseum:id":77,"map_id":"1D","wof:name":"1D Alley Gallery","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1360521553,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1745882479,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882465,"sfomuseum:id":72,"map_id":"HM02","wof:name":"HM02 Harvey Milk Temporary Wall Gallery","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":0},{"wof:id":1360521555,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1745882485,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1360521557,"sfomuseum:id":10,"map_id":"D05","wof:name":"D-05 Central South Connector","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1745882467,"sfomuseum:id":74,"map_id":"HM01","wof:name":"HM01 Central Photo Wall","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882489,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882495,"sfomuseum:id":68,"map_id":"3K","wof:name":"3K Aviation Photographs","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1360521559,"sfomuseum:id":10,"map_id":"D05","wof:name":"D-05 Central South Connector","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1745882507,"sfomuseum:id":70,"map_id":"4E","wof:name":"4E Video Arts Gallery","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745887097,"sfomuseum:id":85,"map_id":"4D","wof:name":"4D International South Cases","edtf:inception":"2021-05-29","edtf:cessation":"","mz:is_current":1},{"wof:id":1745882497,"sfomuseum:id":60,"map_id":"3J","wof:name":"3J Photographs","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1360516117,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516119,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516121,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516123,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516125,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516133,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"1981-01-01","edtf:cessation":"1983~","mz:is_current":0},{"wof:id":1360516135,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"1981~","edtf:cessation":"1981~","mz:is_current":0},{"wof:id":1360516127,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516137,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516129,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"1983~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360516139,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516141,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516143,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516145,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516147,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"1985~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360541561,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541563,"sfomuseum:id":30,"map_id":"K04A","wof:name":"AML Aviation Museum Gallery 04a","edtf:inception":"2000-12-01","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541555,"sfomuseum:id":26,"map_id":"","wof:name":"D-08 International Garage Passageway","edtf:inception":"1997-11-01","edtf:cessation":"1998-03-01","mz:is_current":0},{"wof:id":1360541567,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541553,"sfomuseum:id":4,"map_id":"","wof:name":"E-01 Children’s Art Gallery #2","edtf:inception":"1990-12-16","edtf:cessation":"1998-12-17","mz:is_current":0},{"wof:id":1360541557,"sfomuseum:id":27,"map_id":"AML 01","wof:name":"AML 01 Aviation Museum Gallery 01","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516151,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541569,"sfomuseum:id":38,"map_id":"K07","wof:name":"AML Aviation Museum Ceiling 07","edtf:inception":"2000-11-22","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541559,"sfomuseum:id":28,"map_id":"AML 02","wof:name":"AML 02 Aviation Museum Gallery 02","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516153,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516157,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516155,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516161,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516159,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"1991~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360541571,"sfomuseum:id":41,"map_id":"AML 04B","wof:name":"AML 04B Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2000-12-03","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541573,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541575,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2004-02-17","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516163,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516165,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541615,"sfomuseum:id":30,"map_id":"","wof:name":"K-4A Aviation Museum Gallery 04a","edtf:inception":"2006~","edtf:cessation":"2010-09-20","mz:is_current":0},{"wof:id":1360516169,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541577,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516171,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"1991-06-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360541625,"sfomuseum:id":38,"map_id":"K07","wof:name":"AML Aviation Museum Ceiling 07","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516181,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516173,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516183,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541627,"sfomuseum:id":38,"map_id":"K07","wof:name":"AML Aviation Museum Ceiling 07","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516175,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541629,"sfomuseum:id":38,"map_id":"K07","wof:name":"AML Aviation Museum Ceiling 07","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516187,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516177,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516179,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2002-04-07","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541631,"sfomuseum:id":38,"map_id":"AML 07","wof:name":"AML 07 Aviation Museum Ceiling 07","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516189,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541633,"sfomuseum:id":31,"map_id":"AML 05","wof:name":"AML 05 Aviation Museum Gallery 05a-d","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541641,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516191,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541635,"sfomuseum:id":31,"map_id":"AML 05","wof:name":"AML 05 Aviation Museum Gallery 05a-d","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541643,"sfomuseum:id":29,"map_id":"","wof:name":"K-03 Aviation Museum Gallery 03","edtf:inception":"2006~","edtf:cessation":"2010-01-29","mz:is_current":0},{"wof:id":1360516193,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541639,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541645,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541647,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516195,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541649,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516197,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516199,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516201,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516205,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2010~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1159157037,"sfomuseum:id":20,"map_id":"","wof:name":"G-02 International North Cases","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541651,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516207,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1159157039,"sfomuseum:id":17,"map_id":"","wof:name":"A-02 International South Cases","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541653,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516209,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541657,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541659,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516211,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1159157041,"sfomuseum:id":59,"map_id":"","wof:name":"A-07 International Central Vitrine","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157045,"sfomuseum:id":19,"map_id":"4B","wof:name":"4B International North Wall","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516213,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516215,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"1996~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157047,"sfomuseum:id":18,"map_id":"4C","wof:name":"4C International South Wall","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516217,"sfomuseum:id":16,"map_id":"B03","wof:name":"B-03 Gate 36","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541661,"sfomuseum:id":27,"map_id":"AML 01","wof:name":"AML 01 Aviation Museum Gallery 01","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1159157049,"sfomuseum:id":51,"map_id":"3L","wof:name":"3L Terminal 3 Connector Arrival Level","edtf:inception":"2017~","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1360541663,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516219,"sfomuseum:id":16,"map_id":"B03","wof:name":"B-03 Gate 36","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541665,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541669,"sfomuseum:id":42,"map_id":"AML 06","wof:name":"AML 06 Aviation Museum Gallery 06a-e","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541667,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516223,"sfomuseum:id":16,"map_id":"","wof:name":"B-03 Gate 36","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1159157051,"sfomuseum:id":60,"map_id":"3J","wof:name":"3J Photographs","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516225,"sfomuseum:id":16,"map_id":"B03","wof:name":"B-03 Gate 36","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1159157053,"sfomuseum:id":2,"map_id":"3C","wof:name":"3C North Connector","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516227,"sfomuseum:id":16,"map_id":"B03","wof:name":"B-03 Gate 36","edtf:inception":"1990~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157055,"sfomuseum:id":37,"map_id":"3D","wof:name":"3D Terminal 3 Hub","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516229,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541671,"sfomuseum:id":42,"map_id":"AML 06","wof:name":"AML 06 Aviation Museum Gallery 06a-e","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541675,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1159157057,"sfomuseum:id":3,"map_id":"3E","wof:name":"3E Gate 76","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541677,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157059,"sfomuseum:id":25,"map_id":"3F","wof:name":"3F Gate 87a","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541679,"sfomuseum:id":62,"map_id":"AML 04","wof:name":"AML 04 Aviation Museum Gallery 04","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516231,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541681,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516233,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516235,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541683,"sfomuseum:id":62,"map_id":"AML 04","wof:name":"AML 04 Aviation Museum Gallery 04","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516237,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360541685,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157063,"sfomuseum:id":64,"map_id":"3A","wof:name":"3A E Plaza Meet and Greet","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541687,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1159157065,"sfomuseum:id":6,"map_id":"","wof:name":"D-01 Central North Connector","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541689,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1159157067,"sfomuseum:id":58,"map_id":"2A","wof:name":"2A Boomerang Gallery","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157069,"sfomuseum:id":67,"map_id":"2B","wof:name":"2B Kids’ Spot","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516241,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"1988~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360516243,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516245,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1159157071,"sfomuseum:id":66,"map_id":"2C","wof:name":"2C Kids’ Spot","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516247,"sfomuseum:id":69,"map_id":"B06","wof:name":"B-06 Kids’ Spot","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1159157073,"sfomuseum:id":63,"map_id":"1K","wof:name":"1K Entrance Lobby C Meet and Greet","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541693,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516249,"sfomuseum:id":64,"map_id":"E05","wof:name":"E-05 E Plaza Meet and Greet","edtf:inception":"2015~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1159157075,"sfomuseum:id":40,"map_id":"1J","wof:name":"1J Terminal One Lower Gallery","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541695,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157077,"sfomuseum:id":16,"map_id":"","wof:name":"B-03 Gate 36","edtf:inception":"2017~","edtf:cessation":"2019-07-22","mz:is_current":0},{"wof:id":1360541697,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541699,"sfomuseum:id":41,"map_id":"AML 04B","wof:name":"AML 04B Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516251,"sfomuseum:id":67,"map_id":"D14","wof:name":"D-14 Kids’ Spot","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1159157081,"sfomuseum:id":69,"map_id":"","wof:name":"B-06 Kids’ Spot","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360516253,"sfomuseum:id":67,"map_id":"D14","wof:name":"D-14 Kids’ Spot","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516255,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541701,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541703,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516259,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516261,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516263,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516265,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516267,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"1983~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360516271,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516269,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"1983~","edtf:cessation":"1983~","mz:is_current":0},{"wof:id":1360516273,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516277,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516279,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516281,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516283,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516285,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516287,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516435,"sfomuseum:id":39,"map_id":"A05","wof:name":"A-05 Terminal One Lower Gallery","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516439,"sfomuseum:id":39,"map_id":"A05","wof:name":"A-05 Terminal One Lower Gallery","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516441,"sfomuseum:id":39,"map_id":"","wof:name":"A-05 Terminal One Lower Gallery","edtf:inception":"2014~","edtf:cessation":"2016-08-19","mz:is_current":0},{"wof:id":1360516443,"sfomuseum:id":13,"map_id":"","wof:name":"C-03 Entrance Lobby C","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516445,"sfomuseum:id":13,"map_id":"C03","wof:name":"C-03 Entrance Lobby C","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516447,"sfomuseum:id":13,"map_id":"C03","wof:name":"C-03 Entrance Lobby C","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516449,"sfomuseum:id":13,"map_id":"C03","wof:name":"C-03 Entrance Lobby C","edtf:inception":"2014~","edtf:cessation":"2016-03-31","mz:is_current":0},{"wof:id":1360516451,"sfomuseum:id":5,"map_id":"","wof:name":"E-02 Gate 62 Cultural Wall","edtf:inception":"1988~","edtf:cessation":"1997-03-21","mz:is_current":0},{"wof:id":1360516453,"sfomuseum:id":24,"map_id":"","wof:name":"B-04 Entrance Lobby B","edtf:inception":"2000~","edtf:cessation":"2001-11-26","mz:is_current":0},{"wof:id":1360516457,"sfomuseum:id":23,"map_id":"","wof:name":"D-06 Kids’ Spot","edtf:inception":"2011~","edtf:cessation":"2011-12-01","mz:is_current":0},{"wof:id":1360516459,"sfomuseum:id":14,"map_id":"","wof:name":"B-01 Gate 20","edtf:inception":"2000~","edtf:cessation":"2001-06-15","mz:is_current":0},{"wof:id":1360516461,"sfomuseum:id":11,"map_id":"","wof:name":"C-01 Aquarium","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516463,"sfomuseum:id":11,"map_id":"C01","wof:name":"C-01 Aquarium","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516465,"sfomuseum:id":11,"map_id":"C01","wof:name":"C-01 Aquarium","edtf:inception":"2011~","edtf:cessation":"2013-10-31","mz:is_current":0},{"wof:id":1360516467,"sfomuseum:id":10,"map_id":"","wof:name":"D-05 Central South Connector","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516469,"sfomuseum:id":10,"map_id":"D05","wof:name":"D-05 Central South Connector","edtf:inception":"2011~","edtf:cessation":"2012-04-30","mz:is_current":0},{"wof:id":1360516471,"sfomuseum:id":9,"map_id":"D04","wof:name":"D-04 Central Gallery","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516475,"sfomuseum:id":9,"map_id":"D04","wof:name":"D-04 Central Gallery","edtf:inception":"2011~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516477,"sfomuseum:id":34,"map_id":"A03","wof:name":"A-03 Entrance Lobby A","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516479,"sfomuseum:id":34,"map_id":"A03","wof:name":"A-03 Entrance Lobby A","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516483,"sfomuseum:id":34,"map_id":"A03","wof:name":"A-03 Entrance Lobby A","edtf:inception":"2014~","edtf:cessation":"2015-09-22","mz:is_current":0},{"wof:id":1360516485,"sfomuseum:id":1,"map_id":"","wof:name":"F-01 Gate 68 Children’s Art Gallery","edtf:inception":"2000~","edtf:cessation":"2002-01-15","mz:is_current":0},{"wof:id":1360516487,"sfomuseum:id":48,"map_id":"","wof:name":"F-08 Gate 81","edtf:inception":"1988~","edtf:cessation":"1990-10-01","mz:is_current":0},{"wof:id":1360516489,"sfomuseum:id":46,"map_id":"","wof:name":"F-07 Gate 74","edtf:inception":"1988~","edtf:cessation":"1990-12-15","mz:is_current":0},{"wof:id":1360516493,"sfomuseum:id":45,"map_id":"","wof:name":"F-06 Gate 72","edtf:inception":"1988~","edtf:cessation":"1990-08-06","mz:is_current":0},{"wof:id":1360516495,"sfomuseum:id":50,"map_id":"","wof:name":"D-11 Central Wall (Duty Free)","edtf:inception":"1988~","edtf:cessation":"1998-02-01","mz:is_current":0},{"wof:id":1360516497,"sfomuseum:id":49,"map_id":"","wof:name":"D-10 Central Cases (Currency Exchange)","edtf:inception":"1988~","edtf:cessation":"1991-12-19","mz:is_current":0},{"wof:id":1360516499,"sfomuseum:id":8,"map_id":"","wof:name":"D-03 Central Concourse","edtf:inception":"1988~","edtf:cessation":"1996-12-30","mz:is_current":0},{"wof:id":1360516501,"sfomuseum:id":8,"map_id":"D03","wof:name":"D-03 Central Concourse","edtf:inception":"2011~","edtf:cessation":"2013~","mz:is_current":0},{"wof:id":1360516481,"sfomuseum:id":34,"map_id":"","wof:name":"A-03 Entrance Lobby A","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1159157867,"sfomuseum:id":10,"map_id":"","wof:name":"D-05 Central South Connector","edtf:inception":"1983-07-13","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157865,"sfomuseum:id":9,"map_id":"","wof:name":"D-04 Central Gallery","edtf:inception":"1983-12-15","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157869,"sfomuseum:id":12,"map_id":"","wof:name":"C-02 Gate 40 Gallery","edtf:inception":"1996-01-01","edtf:cessation":"1999-01-25","mz:is_current":0},{"wof:id":1159157873,"sfomuseum:id":13,"map_id":"","wof:name":"C-03 Entrance Lobby C","edtf:inception":"1988-08-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157875,"sfomuseum:id":24,"map_id":"B04","wof:name":"B-04 Entrance Lobby B","edtf:inception":"1997-01-29","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157877,"sfomuseum:id":15,"map_id":"","wof:name":"B-02 Gate 26","edtf:inception":"1988-07-01","edtf:cessation":"1998-10-31","mz:is_current":0},{"wof:id":1159157879,"sfomuseum:id":5,"map_id":"","wof:name":"E-02 Gate 62 Cultural Wall","edtf:inception":"1985-05-29","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157881,"sfomuseum:id":1,"map_id":"","wof:name":"F-01 Gate 68 Children’s Art Gallery","edtf:inception":"1988-07-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157883,"sfomuseum:id":34,"map_id":"","wof:name":"A-03 Entrance Lobby A","edtf:inception":"1990-09-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157885,"sfomuseum:id":7,"map_id":"","wof:name":"D-02 Central Fountain Gallery","edtf:inception":"1991-06-01","edtf:cessation":"1997-04-10","mz:is_current":0},{"wof:id":1159157887,"sfomuseum:id":21,"map_id":"","wof:name":"D-07 International Customs Area","edtf:inception":"1992-05-01","edtf:cessation":"1998-06-02","mz:is_current":0},{"wof:id":1159157891,"sfomuseum:id":11,"map_id":"","wof:name":"C-01 Aquarium","edtf:inception":"1995-11-13","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157893,"sfomuseum:id":23,"map_id":"","wof:name":"D-06 Kids’ Spot","edtf:inception":"1997-08-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157895,"sfomuseum:id":14,"map_id":"","wof:name":"B-01 Gate 20","edtf:inception":"1995-12-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157897,"sfomuseum:id":32,"map_id":"","wof:name":"E-03 Entrance Lobby E","edtf:inception":"1998-10-16","edtf:cessation":"1999-01-29","mz:is_current":0},{"wof:id":1159157905,"sfomuseum:id":43,"map_id":"","wof:name":"D-09 Central South","edtf:inception":"2001-12-10","edtf:cessation":"2002-09-25","mz:is_current":0},{"wof:id":1159157909,"sfomuseum:id":39,"map_id":"","wof:name":"A-05 Terminal One Lower Gallery","edtf:inception":"2000-07-15","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1159157911,"sfomuseum:id":8,"map_id":"","wof:name":"D-03 Central Concourse","edtf:inception":"1987-07-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157915,"sfomuseum:id":49,"map_id":"","wof:name":"D-10 Central Cases (Currency Exchange)","edtf:inception":"1987-09-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157917,"sfomuseum:id":50,"map_id":"","wof:name":"D-11 Central Wall (Duty Free)","edtf:inception":"1987-09-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157919,"sfomuseum:id":45,"map_id":"","wof:name":"F-06 Gate 72","edtf:inception":"1987-05-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157921,"sfomuseum:id":46,"map_id":"","wof:name":"F-07 Gate 74","edtf:inception":"1987-05-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157923,"sfomuseum:id":47,"map_id":"","wof:name":"A-06 Gate 08","edtf:inception":"1987-04-01","edtf:cessation":"1987-12-31","mz:is_current":0},{"wof:id":1159157927,"sfomuseum:id":48,"map_id":"","wof:name":"F-08 Gate 81","edtf:inception":"1987-09-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157929,"sfomuseum:id":44,"map_id":"","wof:name":"E-04 Gate 61 Cultural Wall","edtf:inception":"1988-01-01","edtf:cessation":"1998-06-30","mz:is_current":0},{"wof:id":1159157931,"sfomuseum:id":53,"map_id":"","wof:name":"B-05 Boarding Lobby","edtf:inception":"2003-09-24","edtf:cessation":"2016-10-28","mz:is_current":0},{"wof:id":1159157937,"sfomuseum:id":68,"map_id":"F12","wof:name":"F-12 Student Art","edtf:inception":"2017-04-06","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157939,"sfomuseum:id":70,"map_id":"G03","wof:name":"G-03 Video Arts Gallery","edtf:inception":"2017-09-07","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1477855613,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855625,"sfomuseum:id":67,"map_id":"D14","wof:name":"D-14 Kids’ Spot","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855627,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855653,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2019-07-23","edtf:cessation":"2019-10-28","mz:is_current":0},{"wof:id":1477855661,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2015-01-20","edtf:cessation":"","mz:is_current":0},{"wof:id":1477855663,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855725,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855727,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855729,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855731,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855787,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855821,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855823,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2002-04-07","edtf:cessation":"","mz:is_current":0},{"wof:id":1477855825,"sfomuseum:id":64,"map_id":"E05","wof:name":"E-05 E Plaza Meet and Greet","edtf:inception":"2019-07-23","edtf:cessation":"2019-10-17","mz:is_current":0},{"wof:id":1477855831,"sfomuseum:id":68,"map_id":"F12","wof:name":"F-12 Aviation Photographs","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855929,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855931,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855933,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855939,"sfomuseum:id":38,"map_id":"AML 07","wof:name":"AML 07 Aviation Museum Ceiling 07","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855941,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855943,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855945,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855947,"sfomuseum:id":28,"map_id":"AML 02","wof:name":"AML 02 Aviation Museum Gallery 02","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855949,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855951,"sfomuseum:id":29,"map_id":"","wof:name":"K-03 Aviation Museum Gallery 03","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855955,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855957,"sfomuseum:id":70,"map_id":"G03","wof:name":"G-03 Video Arts Gallery","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855959,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855961,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1729813677,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1729813679,"sfomuseum:id":68,"map_id":"F12","wof:name":"F-12 Student Art","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813681,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813683,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813685,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729813687,"sfomuseum:id":71,"map_id":"1E","wof:name":"1E Mid-Pier Gallery","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1729813691,"sfomuseum:id":72,"map_id":"B15","wof:name":"B-15 Harvey Milk Temporary Wall Gallery","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1729813693,"sfomuseum:id":74,"map_id":"B08","wof:name":"B-08 Central Photo Wall","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813701,"sfomuseum:id":81,"map_id":"2D","wof:name":"2D Sky Terrace Wall","edtf:inception":"2020~","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792771,"sfomuseum:id":2,"map_id":"3C","wof:name":"3C North Connector","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792765,"sfomuseum:id":66,"map_id":"2C","wof:name":"2C Kids’ Spot","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792793,"sfomuseum:id":70,"map_id":"G03","wof:name":"G-03 Video Arts Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792785,"sfomuseum:id":18,"map_id":"4C","wof:name":"4C International South Wall","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729837315,"sfomuseum:id":71,"map_id":"B12","wof:name":"B-12 Mid-Pier Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729837319,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1745882455,"sfomuseum:id":67,"map_id":"2B","wof:name":"2B Kids’ Spot","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882471,"sfomuseum:id":79,"map_id":"1A","wof:name":"B-14 Student Art South","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882457,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882473,"sfomuseum:id":71,"map_id":"B12","wof:name":"B-12 Mid-Pier Gallery","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882477,"sfomuseum:id":63,"map_id":"1K","wof:name":"1K Entrance Lobby C Meet and Greet","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882483,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882481,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882491,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882493,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882501,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882503,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882509,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":0},{"wof:id":1745885813,"sfomuseum:id":91,"map_id":"1F","wof:name":"1F Kids’ Spot/Tree Town","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745887101,"sfomuseum:id":93,"map_id":"HM04","wof:name":"HM04 Harvey Milk Temporary Wall 2","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745887099,"sfomuseum:id":92,"map_id":"1C","wof:name":"1C Kids’ Spot","edtf:inception":"2021-05-25","edtf:cessation":"","mz:is_current":1},{"wof:id":1745887111,"sfomuseum:id":55,"map_id":"AML 08","wof:name":"AML 08 Aviation Museum Perimeter 08","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":0},{"wof:id":1745882499,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":1},{"wof:id":1175727175,"sfomuseum:id":65,"map_id":"3B","wof:name":"3B Kid’s Spot Boarding Area E","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0}] +[{"wof:id":1159157039,"sfomuseum:id":17,"map_id":"","wof:name":"A-02 International South Cases","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157041,"sfomuseum:id":59,"map_id":"","wof:name":"A-07 International Central Vitrine","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157045,"sfomuseum:id":19,"map_id":"4B","wof:name":"4B International North Wall","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157047,"sfomuseum:id":18,"map_id":"4C","wof:name":"4C International South Wall","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157049,"sfomuseum:id":51,"map_id":"3L","wof:name":"3L Terminal 3 Connector Arrival Level","edtf:inception":"2017~","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1159157051,"sfomuseum:id":60,"map_id":"3J","wof:name":"3J Photographs","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157063,"sfomuseum:id":64,"map_id":"3A","wof:name":"3A E Plaza Meet and Greet","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157053,"sfomuseum:id":2,"map_id":"3C","wof:name":"3C North Connector","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157037,"sfomuseum:id":20,"map_id":"","wof:name":"G-02 International North Cases","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157065,"sfomuseum:id":6,"map_id":"","wof:name":"D-01 Central North Connector","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157055,"sfomuseum:id":37,"map_id":"3D","wof:name":"3D Terminal 3 Hub","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157067,"sfomuseum:id":58,"map_id":"2A","wof:name":"2A Boomerang Gallery","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157057,"sfomuseum:id":3,"map_id":"3E","wof:name":"3E Gate 76","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157069,"sfomuseum:id":67,"map_id":"2B","wof:name":"2B Kids’ Spot","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157071,"sfomuseum:id":66,"map_id":"2C","wof:name":"2C Kids’ Spot","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157059,"sfomuseum:id":25,"map_id":"3F","wof:name":"3F Gate 87a","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157073,"sfomuseum:id":63,"map_id":"1K","wof:name":"1K Entrance Lobby C Meet and Greet","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157075,"sfomuseum:id":40,"map_id":"1J","wof:name":"1J Terminal One Lower Gallery","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157077,"sfomuseum:id":16,"map_id":"","wof:name":"B-03 Gate 36","edtf:inception":"2017~","edtf:cessation":"2019-07-22","mz:is_current":0},{"wof:id":1159157081,"sfomuseum:id":69,"map_id":"","wof:name":"B-06 Kids’ Spot","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157865,"sfomuseum:id":9,"map_id":"","wof:name":"D-04 Central Gallery","edtf:inception":"1983-12-15","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157867,"sfomuseum:id":10,"map_id":"","wof:name":"D-05 Central South Connector","edtf:inception":"1983-07-13","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157873,"sfomuseum:id":13,"map_id":"","wof:name":"C-03 Entrance Lobby C","edtf:inception":"1988-08-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157869,"sfomuseum:id":12,"map_id":"","wof:name":"C-02 Gate 40 Gallery","edtf:inception":"1996-01-01","edtf:cessation":"1999-01-25","mz:is_current":0},{"wof:id":1159157877,"sfomuseum:id":15,"map_id":"","wof:name":"B-02 Gate 26","edtf:inception":"1988-07-01","edtf:cessation":"1998-10-31","mz:is_current":0},{"wof:id":1159157879,"sfomuseum:id":5,"map_id":"","wof:name":"E-02 Gate 62 Cultural Wall","edtf:inception":"1985-05-29","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157881,"sfomuseum:id":1,"map_id":"","wof:name":"F-01 Gate 68 Children’s Art Gallery","edtf:inception":"1988-07-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157883,"sfomuseum:id":34,"map_id":"","wof:name":"A-03 Entrance Lobby A","edtf:inception":"1990-09-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157885,"sfomuseum:id":7,"map_id":"","wof:name":"D-02 Central Fountain Gallery","edtf:inception":"1991-06-01","edtf:cessation":"1997-04-10","mz:is_current":0},{"wof:id":1159157875,"sfomuseum:id":24,"map_id":"B04","wof:name":"B-04 Entrance Lobby B","edtf:inception":"1997-01-29","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157887,"sfomuseum:id":21,"map_id":"","wof:name":"D-07 International Customs Area","edtf:inception":"1992-05-01","edtf:cessation":"1998-06-02","mz:is_current":0},{"wof:id":1159157905,"sfomuseum:id":43,"map_id":"","wof:name":"D-09 Central South","edtf:inception":"2001-12-10","edtf:cessation":"2002-09-25","mz:is_current":0},{"wof:id":1159157891,"sfomuseum:id":11,"map_id":"","wof:name":"C-01 Aquarium","edtf:inception":"1995-11-13","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157909,"sfomuseum:id":39,"map_id":"","wof:name":"A-05 Terminal One Lower Gallery","edtf:inception":"2000-07-15","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1159157893,"sfomuseum:id":23,"map_id":"","wof:name":"D-06 Kids’ Spot","edtf:inception":"1997-08-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157895,"sfomuseum:id":14,"map_id":"","wof:name":"B-01 Gate 20","edtf:inception":"1995-12-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1159157897,"sfomuseum:id":32,"map_id":"","wof:name":"E-03 Entrance Lobby E","edtf:inception":"1998-10-16","edtf:cessation":"1999-01-29","mz:is_current":0},{"wof:id":1159157911,"sfomuseum:id":8,"map_id":"","wof:name":"D-03 Central Concourse","edtf:inception":"1987-07-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157915,"sfomuseum:id":49,"map_id":"","wof:name":"D-10 Central Cases (Currency Exchange)","edtf:inception":"1987-09-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157917,"sfomuseum:id":50,"map_id":"","wof:name":"D-11 Central Wall (Duty Free)","edtf:inception":"1987-09-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157919,"sfomuseum:id":45,"map_id":"","wof:name":"F-06 Gate 72","edtf:inception":"1987-05-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157921,"sfomuseum:id":46,"map_id":"","wof:name":"F-07 Gate 74","edtf:inception":"1987-05-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157923,"sfomuseum:id":47,"map_id":"","wof:name":"A-06 Gate 08","edtf:inception":"1987-04-01","edtf:cessation":"1987-12-31","mz:is_current":0},{"wof:id":1159157927,"sfomuseum:id":48,"map_id":"","wof:name":"F-08 Gate 81","edtf:inception":"1987-09-01","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1159157929,"sfomuseum:id":44,"map_id":"","wof:name":"E-04 Gate 61 Cultural Wall","edtf:inception":"1988-01-01","edtf:cessation":"1998-06-30","mz:is_current":0},{"wof:id":1159157931,"sfomuseum:id":53,"map_id":"","wof:name":"B-05 Boarding Lobby","edtf:inception":"2003-09-24","edtf:cessation":"2016-10-28","mz:is_current":0},{"wof:id":1159157939,"sfomuseum:id":70,"map_id":"G03","wof:name":"G-03 Video Arts Gallery","edtf:inception":"2017-09-07","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1159157937,"sfomuseum:id":68,"map_id":"3K","wof:name":"3K Aviation Photographs","edtf:inception":"2017-04-06","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1745882453,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882463,"sfomuseum:id":77,"map_id":"1D","wof:name":"1D Alley Gallery","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882455,"sfomuseum:id":67,"map_id":"2B","wof:name":"2B Kids’ Spot","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882473,"sfomuseum:id":71,"map_id":"1E","wof:name":"1E Mid-Pier Gallery","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882475,"sfomuseum:id":40,"map_id":"1J","wof:name":"1J Terminal One Lower Gallery","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882477,"sfomuseum:id":63,"map_id":"1K","wof:name":"1K Entrance Lobby C Meet and Greet","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882465,"sfomuseum:id":72,"map_id":"HM02","wof:name":"HM02 Harvey Milk Temporary Wall Gallery","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882483,"sfomuseum:id":3,"map_id":"3E","wof:name":"3E Gate 76","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882491,"sfomuseum:id":51,"map_id":"3L","wof:name":"3L Terminal 3 Connector Arrival Level","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882485,"sfomuseum:id":37,"map_id":"3D","wof:name":"3D Terminal 3 Hub","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882493,"sfomuseum:id":51,"map_id":"3L","wof:name":"3L Terminal 3 Connector Arrival Level","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882489,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882495,"sfomuseum:id":68,"map_id":"3K","wof:name":"3K Aviation Photographs","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882497,"sfomuseum:id":60,"map_id":"3J","wof:name":"3J Photographs","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882499,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882501,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882503,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882507,"sfomuseum:id":70,"map_id":"4E","wof:name":"4E Video Arts Gallery","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745887099,"sfomuseum:id":92,"map_id":"1C","wof:name":"1C Kids’ Spot","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882509,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745887101,"sfomuseum:id":93,"map_id":"HM04","wof:name":"HM04 Harvey Milk Temporary Wall 2","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745885813,"sfomuseum:id":91,"map_id":"1F","wof:name":"1F Kids’ Spot/Tree Town","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1763594987,"sfomuseum:id":84,"map_id":"HM03","wof:name":"HM03 Sterile Connector","edtf:inception":"","edtf:cessation":"","mz:is_current":1},{"wof:id":1745882457,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1763595187,"sfomuseum:id":41,"map_id":"AML 04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1745882459,"sfomuseum:id":80,"map_id":"2D","wof:name":"2D Sky Terrace Platform","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1763588491,"sfomuseum:id":80,"map_id":"2D","wof:name":"2D Sky Terrace Platform","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588489,"sfomuseum:id":67,"map_id":"2B","wof:name":"2B Kids’ Spot","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588497,"sfomuseum:id":72,"map_id":"HM02","wof:name":"HM02 Harvey Milk Temporary Wall Gallery","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588505,"sfomuseum:id":71,"map_id":"1E","wof:name":"1E Mid-Pier Gallery","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588499,"sfomuseum:id":74,"map_id":"HM01","wof:name":"HM01 Central Photo Wall","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588513,"sfomuseum:id":40,"map_id":"1J","wof:name":"1J Terminal One Lower Gallery","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588507,"sfomuseum:id":92,"map_id":"1C","wof:name":"1C Kids’ Spot","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763601211,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1763588509,"sfomuseum:id":93,"map_id":"HM04","wof:name":"HM04 Harvey Milk Temporary Wall 2","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588523,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588527,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588531,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588545,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588517,"sfomuseum:id":91,"map_id":"1F","wof:name":"1F Kids’ Spot/Tree Town","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588551,"sfomuseum:id":85,"map_id":"4D","wof:name":"4D International South Cases","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588533,"sfomuseum:id":60,"map_id":"3J","wof:name":"3J Photographs","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588549,"sfomuseum:id":70,"map_id":"4E","wof:name":"4E Video Arts Gallery","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588519,"sfomuseum:id":2,"map_id":"3C","wof:name":"3C North Connector","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588535,"sfomuseum:id":68,"map_id":"3K","wof:name":"3K Aviation Photographs","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588537,"sfomuseum:id":51,"map_id":"3L","wof:name":"3L Terminal 3 Connector Arrival Level","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588553,"sfomuseum:id":86,"map_id":"4A","wof:name":"4A International North Cases","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588539,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1360392583,"sfomuseum:id":25,"map_id":"3F","wof:name":"3F Gate 87a","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1175727175,"sfomuseum:id":65,"map_id":"3B","wof:name":"3B Kid’s Spot Boarding Area E","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360392585,"sfomuseum:id":25,"map_id":"3F","wof:name":"3F Gate 87a","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360392587,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360392589,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360392591,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360392593,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"1987~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360516119,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516117,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516133,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"1981-01-01","edtf:cessation":"1983~","mz:is_current":0},{"wof:id":1360516135,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"1981~","edtf:cessation":"1981~","mz:is_current":0},{"wof:id":1360516137,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516139,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516141,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516143,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516145,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516147,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"1985~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360516151,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516155,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516157,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516159,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"1991~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516161,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516163,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516165,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516153,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516169,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516121,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516123,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516171,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"1991-06-01","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516173,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516127,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516175,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516125,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516129,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"1983~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360516177,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516179,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2002-04-07","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516181,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516183,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516187,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516189,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360521553,"sfomuseum:id":6,"map_id":"","wof:name":"D-01 Central North Connector","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360521559,"sfomuseum:id":10,"map_id":"D05","wof:name":"D-05 Central South Connector","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360521557,"sfomuseum:id":10,"map_id":"","wof:name":"D-05 Central South Connector","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360521555,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516191,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516193,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516195,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516201,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516197,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516199,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516205,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2010~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516207,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516209,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516211,"sfomuseum:id":63,"map_id":"1K","wof:name":"1K Entrance Lobby C Meet and Greet","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516213,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516215,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"1996~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516223,"sfomuseum:id":16,"map_id":"","wof:name":"B-03 Gate 36","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516219,"sfomuseum:id":16,"map_id":"B03","wof:name":"B-03 Gate 36","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516225,"sfomuseum:id":16,"map_id":"B03","wof:name":"B-03 Gate 36","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516227,"sfomuseum:id":16,"map_id":"B03","wof:name":"B-03 Gate 36","edtf:inception":"1990~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516229,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516217,"sfomuseum:id":16,"map_id":"","wof:name":"B-03 Gate 36","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516233,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516231,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516235,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516243,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516237,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516245,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516249,"sfomuseum:id":64,"map_id":"3A","wof:name":"3A E Plaza Meet and Greet","edtf:inception":"2015~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516247,"sfomuseum:id":69,"map_id":"","wof:name":"B-06 Kids’ Spot","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516251,"sfomuseum:id":67,"map_id":"2B","wof:name":"2B Kids’ Spot","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516261,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516241,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"1988~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360516263,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516253,"sfomuseum:id":67,"map_id":"D14","wof:name":"D-14 Kids’ Spot","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516265,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516267,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"1983~","edtf:cessation":"1988~","mz:is_current":0},{"wof:id":1360516255,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516259,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516269,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"1983~","edtf:cessation":"1983~","mz:is_current":0},{"wof:id":1360516273,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516271,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516277,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516281,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360516279,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516283,"sfomuseum:id":20,"map_id":"","wof:name":"G-02 International North Cases","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516285,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516287,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516439,"sfomuseum:id":39,"map_id":"","wof:name":"A-05 Terminal One Lower Gallery","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516441,"sfomuseum:id":39,"map_id":"","wof:name":"A-05 Terminal One Lower Gallery","edtf:inception":"2014~","edtf:cessation":"2016-08-19","mz:is_current":0},{"wof:id":1360516443,"sfomuseum:id":13,"map_id":"","wof:name":"C-03 Entrance Lobby C","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516445,"sfomuseum:id":13,"map_id":"","wof:name":"C-03 Entrance Lobby C","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516447,"sfomuseum:id":13,"map_id":"C03","wof:name":"C-03 Entrance Lobby C","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516449,"sfomuseum:id":13,"map_id":"C03","wof:name":"C-03 Entrance Lobby C","edtf:inception":"2014~","edtf:cessation":"2016-03-31","mz:is_current":0},{"wof:id":1360516451,"sfomuseum:id":5,"map_id":"","wof:name":"E-02 Gate 62 Cultural Wall","edtf:inception":"1988~","edtf:cessation":"1997-03-21","mz:is_current":0},{"wof:id":1360516453,"sfomuseum:id":24,"map_id":"","wof:name":"B-04 Entrance Lobby B","edtf:inception":"2000~","edtf:cessation":"2001-11-26","mz:is_current":0},{"wof:id":1360516457,"sfomuseum:id":23,"map_id":"","wof:name":"D-06 Kids’ Spot","edtf:inception":"2011~","edtf:cessation":"2011-12-01","mz:is_current":0},{"wof:id":1360516435,"sfomuseum:id":39,"map_id":"","wof:name":"A-05 Terminal One Lower Gallery","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516463,"sfomuseum:id":11,"map_id":"C01","wof:name":"C-01 Aquarium","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516461,"sfomuseum:id":11,"map_id":"","wof:name":"C-01 Aquarium","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516459,"sfomuseum:id":14,"map_id":"","wof:name":"B-01 Gate 20","edtf:inception":"2000~","edtf:cessation":"2001-06-15","mz:is_current":0},{"wof:id":1360516465,"sfomuseum:id":11,"map_id":"C01","wof:name":"C-01 Aquarium","edtf:inception":"2011~","edtf:cessation":"2013-10-31","mz:is_current":0},{"wof:id":1360516467,"sfomuseum:id":10,"map_id":"","wof:name":"D-05 Central South Connector","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516471,"sfomuseum:id":9,"map_id":"","wof:name":"D-04 Central Gallery","edtf:inception":"1988~","edtf:cessation":"2000~","mz:is_current":0},{"wof:id":1360516475,"sfomuseum:id":9,"map_id":"D04","wof:name":"D-04 Central Gallery","edtf:inception":"2011~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516477,"sfomuseum:id":34,"map_id":"","wof:name":"A-03 Entrance Lobby A","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360516469,"sfomuseum:id":10,"map_id":"D05","wof:name":"D-05 Central South Connector","edtf:inception":"2011~","edtf:cessation":"2012-04-30","mz:is_current":0},{"wof:id":1360516479,"sfomuseum:id":34,"map_id":"A03","wof:name":"A-03 Entrance Lobby A","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360516481,"sfomuseum:id":34,"map_id":"","wof:name":"A-03 Entrance Lobby A","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360516493,"sfomuseum:id":45,"map_id":"","wof:name":"F-06 Gate 72","edtf:inception":"1988~","edtf:cessation":"1990-08-06","mz:is_current":0},{"wof:id":1360516483,"sfomuseum:id":34,"map_id":"A03","wof:name":"A-03 Entrance Lobby A","edtf:inception":"2014~","edtf:cessation":"2015-09-22","mz:is_current":0},{"wof:id":1360516495,"sfomuseum:id":50,"map_id":"","wof:name":"D-11 Central Wall (Duty Free)","edtf:inception":"1988~","edtf:cessation":"1998-02-01","mz:is_current":0},{"wof:id":1360516485,"sfomuseum:id":1,"map_id":"","wof:name":"F-01 Gate 68 Children’s Art Gallery","edtf:inception":"2000~","edtf:cessation":"2002-01-15","mz:is_current":0},{"wof:id":1360516497,"sfomuseum:id":49,"map_id":"","wof:name":"D-10 Central Cases (Currency Exchange)","edtf:inception":"1988~","edtf:cessation":"1991-12-19","mz:is_current":0},{"wof:id":1360516487,"sfomuseum:id":48,"map_id":"","wof:name":"F-08 Gate 81","edtf:inception":"1988~","edtf:cessation":"1990-10-01","mz:is_current":0},{"wof:id":1360516499,"sfomuseum:id":8,"map_id":"","wof:name":"D-03 Central Concourse","edtf:inception":"1988~","edtf:cessation":"1996-12-30","mz:is_current":0},{"wof:id":1360516489,"sfomuseum:id":46,"map_id":"","wof:name":"F-07 Gate 74","edtf:inception":"1988~","edtf:cessation":"1990-12-15","mz:is_current":0},{"wof:id":1360516501,"sfomuseum:id":8,"map_id":"","wof:name":"D-03 Central Concourse","edtf:inception":"2011~","edtf:cessation":"2013~","mz:is_current":0},{"wof:id":1360541555,"sfomuseum:id":26,"map_id":"","wof:name":"D-08 International Garage Passageway","edtf:inception":"1997-11-01","edtf:cessation":"1998-03-01","mz:is_current":0},{"wof:id":1360541553,"sfomuseum:id":4,"map_id":"","wof:name":"E-01 Children’s Art Gallery #2","edtf:inception":"1990-12-16","edtf:cessation":"1998-12-17","mz:is_current":0},{"wof:id":1360541557,"sfomuseum:id":27,"map_id":"AML 01","wof:name":"AML 01 Aviation Museum Gallery 01","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541559,"sfomuseum:id":28,"map_id":"AML 02","wof:name":"AML 02 Aviation Museum Gallery 02","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541561,"sfomuseum:id":29,"map_id":"","wof:name":"K-03 Aviation Museum Gallery 03","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541563,"sfomuseum:id":30,"map_id":"","wof:name":"K-4A Aviation Museum Gallery 04a","edtf:inception":"2000-12-01","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541567,"sfomuseum:id":31,"map_id":"AML 05","wof:name":"AML 05 Aviation Museum Gallery 05a-d","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541569,"sfomuseum:id":38,"map_id":"AML 07","wof:name":"AML 07 Aviation Museum Ceiling 07","edtf:inception":"2000-11-22","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541573,"sfomuseum:id":42,"map_id":"AML 06","wof:name":"AML 06 Aviation Museum Gallery 06a-e","edtf:inception":"2000-11-20","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541577,"sfomuseum:id":62,"map_id":"AML 04","wof:name":"AML 04 Aviation Museum Gallery 04","edtf:inception":"2000~","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541571,"sfomuseum:id":41,"map_id":"AML 04B","wof:name":"AML 04B Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2000-12-03","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541575,"sfomuseum:id":55,"map_id":"AML 08","wof:name":"AML 08 Aviation Museum Perimeter 08","edtf:inception":"2004-02-17","edtf:cessation":"2006~","mz:is_current":0},{"wof:id":1360541615,"sfomuseum:id":30,"map_id":"","wof:name":"K-4A Aviation Museum Gallery 04a","edtf:inception":"2006~","edtf:cessation":"2010-09-20","mz:is_current":0},{"wof:id":1360541625,"sfomuseum:id":38,"map_id":"AML 07","wof:name":"AML 07 Aviation Museum Ceiling 07","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541627,"sfomuseum:id":38,"map_id":"K07","wof:name":"AML Aviation Museum Ceiling 07","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541629,"sfomuseum:id":38,"map_id":"K07","wof:name":"AML Aviation Museum Ceiling 07","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541633,"sfomuseum:id":31,"map_id":"AML 05","wof:name":"AML 05 Aviation Museum Gallery 05a-d","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541631,"sfomuseum:id":38,"map_id":"AML 07","wof:name":"AML 07 Aviation Museum Ceiling 07","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541635,"sfomuseum:id":31,"map_id":"AML 05","wof:name":"AML 05 Aviation Museum Gallery 05a-d","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541639,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541641,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541643,"sfomuseum:id":29,"map_id":"","wof:name":"K-03 Aviation Museum Gallery 03","edtf:inception":"2006~","edtf:cessation":"2010-01-29","mz:is_current":0},{"wof:id":1360541645,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541647,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541649,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541651,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541653,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541657,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541659,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541663,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541665,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541661,"sfomuseum:id":27,"map_id":"AML 01","wof:name":"AML 01 Aviation Museum Gallery 01","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541667,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541671,"sfomuseum:id":42,"map_id":"AML 06","wof:name":"AML 06 Aviation Museum Gallery 06a-e","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541669,"sfomuseum:id":42,"map_id":"AML 06","wof:name":"AML 06 Aviation Museum Gallery 06a-e","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541675,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541677,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541681,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541679,"sfomuseum:id":62,"map_id":"AML 04","wof:name":"AML 04 Aviation Museum Gallery 04","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541683,"sfomuseum:id":62,"map_id":"AML 04","wof:name":"AML 04 Aviation Museum Gallery 04","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541685,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541687,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541689,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541693,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541695,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2017~","edtf:cessation":"2019-07-23","mz:is_current":0},{"wof:id":1360541697,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2006~","edtf:cessation":"2011~","mz:is_current":0},{"wof:id":1360541699,"sfomuseum:id":41,"map_id":"AML 04B","wof:name":"AML 04B Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2011~","edtf:cessation":"2014~","mz:is_current":0},{"wof:id":1360541701,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1360541703,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2014~","edtf:cessation":"2017~","mz:is_current":0},{"wof:id":1477855627,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855625,"sfomuseum:id":67,"map_id":"D14","wof:name":"D-14 Kids’ Spot","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855653,"sfomuseum:id":6,"map_id":"D01","wof:name":"D-01 Central North Connector","edtf:inception":"2019-07-23","edtf:cessation":"2019-10-28","mz:is_current":0},{"wof:id":1477855661,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2015-01-20","edtf:cessation":"","mz:is_current":0},{"wof:id":1477855663,"sfomuseum:id":40,"map_id":"C05","wof:name":"C-05 Terminal One Lower Gallery","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855725,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855731,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855727,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855729,"sfomuseum:id":3,"map_id":"F03","wof:name":"F-03 Gate 76","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855787,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855821,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855825,"sfomuseum:id":64,"map_id":"E05","wof:name":"E-05 E Plaza Meet and Greet","edtf:inception":"2019-07-23","edtf:cessation":"2019-10-17","mz:is_current":0},{"wof:id":1477855831,"sfomuseum:id":68,"map_id":"F12","wof:name":"F-12 Aviation Photographs","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855823,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2002-04-07","edtf:cessation":"","mz:is_current":0},{"wof:id":1477855613,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855931,"sfomuseum:id":19,"map_id":"G01","wof:name":"G-01 International North Wall","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855933,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855939,"sfomuseum:id":38,"map_id":"AML 07","wof:name":"AML 07 Aviation Museum Ceiling 07","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855929,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855941,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855945,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855947,"sfomuseum:id":28,"map_id":"AML 02","wof:name":"AML 02 Aviation Museum Gallery 02","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855943,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855949,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855951,"sfomuseum:id":29,"map_id":"","wof:name":"K-03 Aviation Museum Gallery 03","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855955,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855957,"sfomuseum:id":70,"map_id":"G03","wof:name":"G-03 Video Arts Gallery","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855961,"sfomuseum:id":20,"map_id":"G02","wof:name":"G-02 International North Cases","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1477855959,"sfomuseum:id":17,"map_id":"A02","wof:name":"A-02 International South Cases","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1729813677,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1729813679,"sfomuseum:id":68,"map_id":"F12","wof:name":"F-12 Student Art","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813681,"sfomuseum:id":51,"map_id":"F09","wof:name":"F-09 Terminal 3 Connector Arrival Level","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813683,"sfomuseum:id":60,"map_id":"F11","wof:name":"F-11 Photographs","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813685,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813687,"sfomuseum:id":71,"map_id":"1E","wof:name":"1E Mid-Pier Gallery","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1729813691,"sfomuseum:id":72,"map_id":"HM02","wof:name":"HM02 Harvey Milk Temporary Wall Gallery","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1729813693,"sfomuseum:id":74,"map_id":"B08","wof:name":"B-08 Central Photo Wall","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813695,"sfomuseum:id":77,"map_id":"1D","wof:name":"1D Alley Gallery","edtf:inception":"2021~","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813697,"sfomuseum:id":79,"map_id":"1A","wof:name":"1A Student Art South","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813699,"sfomuseum:id":80,"map_id":"2D","wof:name":"2D Sky Terrace Platform","edtf:inception":"2020~","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813701,"sfomuseum:id":81,"map_id":"2D","wof:name":"2D Sky Terrace Wall","edtf:inception":"2020~","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813741,"sfomuseum:id":27,"map_id":"K01","wof:name":"AML Aviation Museum Gallery 01","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729813745,"sfomuseum:id":31,"map_id":"K05","wof:name":"AML Aviation Museum Gallery 05a-d","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729813747,"sfomuseum:id":29,"map_id":"K03","wof:name":"AML Aviation Museum Gallery 03","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":0},{"wof:id":1729792765,"sfomuseum:id":66,"map_id":"2C","wof:name":"2C Kids’ Spot","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792767,"sfomuseum:id":67,"map_id":"2B","wof:name":"2B Kids’ Spot","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792769,"sfomuseum:id":58,"map_id":"2A","wof:name":"2A Boomerang Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792771,"sfomuseum:id":2,"map_id":"3C","wof:name":"3C North Connector","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792775,"sfomuseum:id":25,"map_id":"3F","wof:name":"3F Gate 87a","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792777,"sfomuseum:id":3,"map_id":"3E","wof:name":"3E Gate 76","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792779,"sfomuseum:id":37,"map_id":"3D","wof:name":"3D Terminal 3 Hub","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792781,"sfomuseum:id":65,"map_id":"E06","wof:name":"E-06 Kid’s Spot Boarding Area E","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792783,"sfomuseum:id":17,"map_id":"","wof:name":"A-02 International South Cases","edtf:inception":"2020-~05","edtf:cessation":"2020-01-13","mz:is_current":0},{"wof:id":1729792785,"sfomuseum:id":18,"map_id":"4C","wof:name":"4C International South Wall","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792787,"sfomuseum:id":19,"map_id":"4B","wof:name":"4B International North Wall","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792793,"sfomuseum:id":70,"map_id":"4E","wof:name":"4E Video Arts Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792789,"sfomuseum:id":59,"map_id":"","wof:name":"A-07 International Central Vitrine","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729837315,"sfomuseum:id":71,"map_id":"1E","wof:name":"1E Mid-Pier Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729792795,"sfomuseum:id":20,"map_id":"","wof:name":"G-02 International North Cases","edtf:inception":"2020-~05","edtf:cessation":"2020-02-02","mz:is_current":0},{"wof:id":1729837321,"sfomuseum:id":63,"map_id":"C04","wof:name":"C-04 Entrance Lobby C Meet and Greet","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729837317,"sfomuseum:id":72,"map_id":"B15","wof:name":"B-15 Harvey Milk Temporary Wall Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729837319,"sfomuseum:id":40,"map_id":"1J","wof:name":"1J Terminal One Lower Gallery","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813731,"sfomuseum:id":38,"map_id":"K07","wof:name":"AML Aviation Museum Ceiling 07","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":0},{"wof:id":1729813733,"sfomuseum:id":55,"map_id":"K08","wof:name":"AML Aviation Museum Perimeter 08","edtf:inception":"2020-~05","edtf:cessation":"2021-05-25","mz:is_current":0},{"wof:id":1729813735,"sfomuseum:id":42,"map_id":"K06","wof:name":"AML Aviation Museum Gallery 06a-e","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729813737,"sfomuseum:id":62,"map_id":"K04","wof:name":"AML Aviation Museum Gallery 04","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1729813739,"sfomuseum:id":28,"map_id":"K02","wof:name":"AML Aviation Museum Gallery 02","edtf:inception":"2020-~05","edtf:cessation":"..","mz:is_current":1},{"wof:id":1746403233,"sfomuseum:id":86,"map_id":"4A","wof:name":"4A International North Cases","edtf:inception":"","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882471,"sfomuseum:id":79,"map_id":"1A","wof:name":"1A Student Art South","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882479,"sfomuseum:id":2,"map_id":"F02","wof:name":"F-02 North Connector","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882467,"sfomuseum:id":74,"map_id":"HM01","wof:name":"HM01 Central Photo Wall","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882461,"sfomuseum:id":81,"map_id":"2D","wof:name":"2D Sky Terrace Wall","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745882481,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745887097,"sfomuseum:id":85,"map_id":"4D","wof:name":"4D International South Cases","edtf:inception":"2021-05-29","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1745887111,"sfomuseum:id":55,"map_id":"AML 08","wof:name":"AML 08 Aviation Museum Perimeter 08","edtf:inception":"2021-05-25","edtf:cessation":"..","mz:is_current":0},{"wof:id":1763594989,"sfomuseum:id":90,"map_id":"2F","wof:name":"2F Pre-Security Connector/Zuber","edtf:inception":"","edtf:cessation":"","mz:is_current":1},{"wof:id":1763594985,"sfomuseum:id":83,"map_id":"2E","wof:name":"2E Kadish Gallery","edtf:inception":"","edtf:cessation":"","mz:is_current":1},{"wof:id":1763595133,"sfomuseum:id":64,"map_id":"3A","wof:name":"E-05 E Plaza Meet and Greet","edtf:inception":"2021-10","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1763595139,"sfomuseum:id":64,"map_id":"3A","wof:name":"E-05 E Plaza Meet and Greet","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763595185,"sfomuseum:id":41,"map_id":"AML 04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2021-05-25","edtf:cessation":"2021-11-09","mz:is_current":0},{"wof:id":1763588487,"sfomuseum:id":58,"map_id":"D12","wof:name":"D-12 Wall Case","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588485,"sfomuseum:id":66,"map_id":"D13","wof:name":"D-13 Kids’ Spot","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588495,"sfomuseum:id":81,"map_id":"2D","wof:name":"2D Sky Terrace Wall","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588501,"sfomuseum:id":77,"map_id":"1D","wof:name":"1D Alley Gallery","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588503,"sfomuseum:id":79,"map_id":"1A","wof:name":"1A Student Art South","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588515,"sfomuseum:id":63,"map_id":"1K","wof:name":"1K Entrance Lobby C Meet and Greet","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763601213,"sfomuseum:id":41,"map_id":"K04B","wof:name":"AML Aviation Museum Gallery 04b Special Collections Room","edtf:inception":"2019-07-23","edtf:cessation":"2020-~05","mz:is_current":0},{"wof:id":1763588521,"sfomuseum:id":25,"map_id":"F04","wof:name":"F-04 Gate 87a","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588541,"sfomuseum:id":59,"map_id":"A07","wof:name":"A-07 International Central Case","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588525,"sfomuseum:id":37,"map_id":"F05","wof:name":"F-05 Terminal 3 Hub","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1},{"wof:id":1763588543,"sfomuseum:id":18,"map_id":"A01","wof:name":"A-01 International South Wall","edtf:inception":"2021-11-09","edtf:cessation":"..","mz:is_current":1}] diff --git a/data/gates.json b/data/gates.json index 5c25c83..a2bb167 100644 --- a/data/gates.json +++ b/data/gates.json @@ -1 +1 @@ -[{"wof:id":1159157603,"wof:name":"A10A","mz:is_current":0},{"wof:id":1159157605,"wof:name":"A11B","mz:is_current":0},{"wof:id":1159157607,"wof:name":"A12","mz:is_current":0},{"wof:id":1159157609,"wof:name":"A2","mz:is_current":0},{"wof:id":1159157641,"wof:name":"A4","mz:is_current":0},{"wof:id":1159157611,"wof:name":"A3A","mz:is_current":0},{"wof:id":1159157621,"wof:name":"G95","mz:is_current":0},{"wof:id":1159157633,"wof:name":"A9","mz:is_current":0},{"wof:id":1159157631,"wof:name":"A8","mz:is_current":0},{"wof:id":1159157623,"wof:name":"G91","mz:is_current":0},{"wof:id":1159157625,"wof:name":"B22","mz:is_current":0},{"wof:id":1159157643,"wof:name":"A5B","mz:is_current":0},{"wof:id":1159157613,"wof:name":"A1","mz:is_current":0},{"wof:id":1159157645,"wof:name":"F79","mz:is_current":0},{"wof:id":1159157635,"wof:name":"A6","mz:is_current":0},{"wof:id":1159157639,"wof:name":"A7","mz:is_current":0},{"wof:id":1159157615,"wof:name":"G101A","mz:is_current":0},{"wof:id":1159157617,"wof:name":"A1A","mz:is_current":0},{"wof:id":1159157627,"wof:name":"A11","mz:is_current":0},{"wof:id":1159157647,"wof:name":"E63","mz:is_current":0},{"wof:id":1159157629,"wof:name":"A11A","mz:is_current":0},{"wof:id":1159157649,"wof:name":"D53","mz:is_current":0},{"wof:id":1159157651,"wof:name":"D58B","mz:is_current":0},{"wof:id":1159157681,"wof:name":"G99B","mz:is_current":0},{"wof:id":1159157653,"wof:name":"E65","mz:is_current":0},{"wof:id":1159157657,"wof:name":"G96","mz:is_current":0},{"wof:id":1159157683,"wof:name":"G97","mz:is_current":0},{"wof:id":1159157659,"wof:name":"F73","mz:is_current":0},{"wof:id":1159157685,"wof:name":"G100","mz:is_current":0},{"wof:id":1159157687,"wof:name":"G98","mz:is_current":0},{"wof:id":1159157689,"wof:name":"F84B","mz:is_current":0},{"wof:id":1159157671,"wof:name":"F86","mz:is_current":0},{"wof:id":1159157675,"wof:name":"F87","mz:is_current":0},{"wof:id":1159157677,"wof:name":"G102","mz:is_current":0},{"wof:id":1159157679,"wof:name":"G99A","mz:is_current":0},{"wof:id":1159157661,"wof:name":"C44","mz:is_current":0},{"wof:id":1159157667,"wof:name":"A1B","mz:is_current":0},{"wof:id":1159157663,"wof:name":"C46","mz:is_current":0},{"wof:id":1159157669,"wof:name":"F73A","mz:is_current":0},{"wof:id":1159157665,"wof:name":"F89","mz:is_current":0},{"wof:id":1159157693,"wof:name":"F84D","mz:is_current":0},{"wof:id":1159157695,"wof:name":"F84C","mz:is_current":0},{"wof:id":1159157703,"wof:name":"D51A","mz:is_current":0},{"wof:id":1159157701,"wof:name":"D50A","mz:is_current":0},{"wof:id":1159157697,"wof:name":"F74","mz:is_current":0},{"wof:id":1159157711,"wof:name":"C42","mz:is_current":0},{"wof:id":1159157705,"wof:name":"D51B","mz:is_current":0},{"wof:id":1159157713,"wof:name":"B25","mz:is_current":0},{"wof:id":1159157707,"wof:name":"C45B","mz:is_current":0},{"wof:id":1159157699,"wof:name":"E68","mz:is_current":0},{"wof:id":1159157715,"wof:name":"B24","mz:is_current":0},{"wof:id":1159157717,"wof:name":"A3","mz:is_current":0},{"wof:id":1159157719,"wof:name":"G101B","mz:is_current":0},{"wof:id":1159157741,"wof:name":"F90","mz:is_current":0},{"wof:id":1159157731,"wof:name":"F70A","mz:is_current":0},{"wof:id":1159157751,"wof:name":"F88","mz:is_current":0},{"wof:id":1159157753,"wof:name":"C47","mz:is_current":0},{"wof:id":1159157755,"wof:name":"C45A","mz:is_current":0},{"wof:id":1159157733,"wof:name":"E67","mz:is_current":0},{"wof:id":1159157747,"wof:name":"C41","mz:is_current":0},{"wof:id":1159157743,"wof:name":"C48","mz:is_current":0},{"wof:id":1159157735,"wof:name":"E65A","mz:is_current":0},{"wof:id":1159157757,"wof:name":"F81","mz:is_current":0},{"wof:id":1159157737,"wof:name":"E64A","mz:is_current":0},{"wof:id":1159157749,"wof:name":"F85","mz:is_current":0},{"wof:id":1159157759,"wof:name":"E69","mz:is_current":0},{"wof:id":1159157739,"wof:name":"F77C","mz:is_current":0},{"wof:id":1159157721,"wof:name":"F70","mz:is_current":0},{"wof:id":1159157725,"wof:name":"F71B","mz:is_current":0},{"wof:id":1159157723,"wof:name":"F71A","mz:is_current":0},{"wof:id":1159157729,"wof:name":"F76","mz:is_current":0},{"wof:id":1159157783,"wof:name":"F75","mz:is_current":0},{"wof:id":1159157761,"wof:name":"F82","mz:is_current":0},{"wof:id":1159157791,"wof:name":"D58A","mz:is_current":0},{"wof:id":1159157793,"wof:name":"D55","mz:is_current":0},{"wof:id":1159157785,"wof:name":"E64","mz:is_current":0},{"wof:id":1159157787,"wof:name":"E67A","mz:is_current":0},{"wof:id":1159157795,"wof:name":"D56B","mz:is_current":0},{"wof:id":1159157789,"wof:name":"E66","mz:is_current":0},{"wof:id":1159157765,"wof:name":"E60","mz:is_current":0},{"wof:id":1159157767,"wof:name":"E61","mz:is_current":0},{"wof:id":1159157769,"wof:name":"F77B","mz:is_current":0},{"wof:id":1159157771,"wof:name":"E62","mz:is_current":0},{"wof:id":1159157797,"wof:name":"D56A","mz:is_current":0},{"wof:id":1159157773,"wof:name":"D59","mz:is_current":0},{"wof:id":1159157801,"wof:name":"D57","mz:is_current":0},{"wof:id":1159157775,"wof:name":"G93","mz:is_current":0},{"wof:id":1159157803,"wof:name":"C43","mz:is_current":0},{"wof:id":1159157777,"wof:name":"G94","mz:is_current":0},{"wof:id":1159157779,"wof:name":"G92","mz:is_current":0},{"wof:id":1159157807,"wof:name":"A3B","mz:is_current":0},{"wof:id":1159157809,"wof:name":"B26","mz:is_current":0},{"wof:id":1159157841,"wof:name":"G99X","mz:is_current":0},{"wof:id":1159157831,"wof:name":"D54B","mz:is_current":0},{"wof:id":1159157811,"wof:name":"B27","mz:is_current":0},{"wof:id":1159157805,"wof:name":"A5","mz:is_current":0},{"wof:id":1159157837,"wof:name":"F84A","mz:is_current":0},{"wof:id":1159157833,"wof:name":"D54A","mz:is_current":0},{"wof:id":1159157813,"wof:name":"B23","mz:is_current":0},{"wof:id":1159157845,"wof:name":"C42A","mz:is_current":0},{"wof:id":1159157839,"wof:name":"D50B","mz:is_current":0},{"wof:id":1159157843,"wof:name":"A3X","mz:is_current":0},{"wof:id":1159157815,"wof:name":"G99","mz:is_current":0},{"wof:id":1159157847,"wof:name":"F77A","mz:is_current":0},{"wof:id":1159157819,"wof:name":"C48A","mz:is_current":0},{"wof:id":1159157849,"wof:name":"F87A","mz:is_current":0},{"wof:id":1159157851,"wof:name":"E62A","mz:is_current":0},{"wof:id":1159157855,"wof:name":"F78","mz:is_current":0},{"wof:id":1159157857,"wof:name":"C40","mz:is_current":0},{"wof:id":1159157861,"wof:name":"F83","mz:is_current":0},{"wof:id":1159157859,"wof:name":"B28","mz:is_current":0},{"wof:id":1159157821,"wof:name":"F80","mz:is_current":0},{"wof:id":1159157827,"wof:name":"G101","mz:is_current":0},{"wof:id":1159157823,"wof:name":"A10","mz:is_current":0},{"wof:id":1159157825,"wof:name":"F72","mz:is_current":0},{"wof:id":1159157829,"wof:name":"D52","mz:is_current":0},{"wof:id":1746415351,"wof:name":"C10T","mz:is_current":1},{"wof:id":1746415371,"wof:name":"A7T","mz:is_current":1},{"wof:id":1746415365,"wof:name":"A1T","mz:is_current":1},{"wof:id":1746415381,"wof:name":"A13S","mz:is_current":1},{"wof:id":1746415373,"wof:name":"B27V","mz:is_current":1},{"wof:id":1746415367,"wof:name":"G11R","mz:is_current":1},{"wof:id":1746415383,"wof:name":"G104","mz:is_current":1},{"wof:id":1746415353,"wof:name":"A1V","mz:is_current":1},{"wof:id":1746415375,"wof:name":"F15L","mz:is_current":1},{"wof:id":1746415385,"wof:name":"G13S","mz:is_current":1},{"wof:id":1746415355,"wof:name":"E13T","mz:is_current":1},{"wof:id":1746415369,"wof:name":"B23V","mz:is_current":1},{"wof:id":1746415387,"wof:name":"G103","mz:is_current":1},{"wof:id":1746415379,"wof:name":"F15N","mz:is_current":1},{"wof:id":1746415357,"wof:name":"G13R","mz:is_current":1},{"wof:id":1746415393,"wof:name":"G14T","mz:is_current":1},{"wof:id":1746415405,"wof:name":"F15K","mz:is_current":1},{"wof:id":1746415421,"wof:name":"E3K","mz:is_current":1},{"wof:id":1746415411,"wof:name":"C4R","mz:is_current":1},{"wof:id":1746415397,"wof:name":"G12T","mz:is_current":1},{"wof:id":1746415423,"wof:name":"A4T","mz:is_current":1},{"wof:id":1746415415,"wof:name":"E11U","mz:is_current":1},{"wof:id":1746415407,"wof:name":"G105","mz:is_current":1},{"wof:id":1746415399,"wof:name":"A6R","mz:is_current":1},{"wof:id":1746415417,"wof:name":"E13K","mz:is_current":1},{"wof:id":1746415409,"wof:name":"E11V","mz:is_current":1},{"wof:id":1746415425,"wof:name":"A14T","mz:is_current":1},{"wof:id":1376996231,"wof:name":"B28","mz:is_current":0},{"wof:id":1477855621,"wof:name":"D50A","mz:is_current":0},{"wof:id":1477855623,"wof:name":"D58B","mz:is_current":0},{"wof:id":1477855631,"wof:name":"D57","mz:is_current":0},{"wof:id":1477855615,"wof:name":"D52","mz:is_current":0},{"wof:id":1477855633,"wof:name":"D59","mz:is_current":0},{"wof:id":1477855617,"wof:name":"D51A","mz:is_current":0},{"wof:id":1477855635,"wof:name":"D53","mz:is_current":0},{"wof:id":1477855619,"wof:name":"D51B","mz:is_current":0},{"wof:id":1477855639,"wof:name":"D50B","mz:is_current":0},{"wof:id":1477855637,"wof:name":"D54A","mz:is_current":0},{"wof:id":1477855641,"wof:name":"D54B","mz:is_current":0},{"wof:id":1477855643,"wof:name":"D55","mz:is_current":0},{"wof:id":1477855645,"wof:name":"D56A","mz:is_current":0},{"wof:id":1477855649,"wof:name":"D56B","mz:is_current":0},{"wof:id":1477855671,"wof:name":"C45","mz:is_current":0},{"wof:id":1477855651,"wof:name":"D58A","mz:is_current":0},{"wof:id":1477855673,"wof:name":"C47","mz:is_current":0},{"wof:id":1477855675,"wof:name":"C45A","mz:is_current":0},{"wof:id":1477855677,"wof:name":"C48","mz:is_current":0},{"wof:id":1477855679,"wof:name":"C41","mz:is_current":0},{"wof:id":1477855681,"wof:name":"C42","mz:is_current":0},{"wof:id":1477855685,"wof:name":"C45B","mz:is_current":0},{"wof:id":1477855687,"wof:name":"C46","mz:is_current":0},{"wof:id":1477855689,"wof:name":"C44","mz:is_current":0},{"wof:id":1477855691,"wof:name":"C43","mz:is_current":0},{"wof:id":1477855693,"wof:name":"C42A","mz:is_current":0},{"wof:id":1477855697,"wof:name":"C40","mz:is_current":0},{"wof:id":1477855695,"wof:name":"C48A","mz:is_current":0},{"wof:id":1477855711,"wof:name":"F74","mz:is_current":0},{"wof:id":1477855713,"wof:name":"F84C","mz:is_current":0},{"wof:id":1477855715,"wof:name":"F71A","mz:is_current":0},{"wof:id":1477855705,"wof:name":"F77","mz:is_current":0},{"wof:id":1477855717,"wof:name":"F76","mz:is_current":0},{"wof:id":1477855709,"wof:name":"F84D","mz:is_current":0},{"wof:id":1477855707,"wof:name":"F84","mz:is_current":0},{"wof:id":1477855741,"wof:name":"F90","mz:is_current":0},{"wof:id":1477855733,"wof:name":"F81","mz:is_current":0},{"wof:id":1477855743,"wof:name":"F77B","mz:is_current":0},{"wof:id":1477855721,"wof:name":"F71B","mz:is_current":0},{"wof:id":1477855735,"wof:name":"F88","mz:is_current":0},{"wof:id":1477855723,"wof:name":"F70","mz:is_current":0},{"wof:id":1477855747,"wof:name":"F72","mz:is_current":0},{"wof:id":1477855745,"wof:name":"F82","mz:is_current":0},{"wof:id":1477855749,"wof:name":"F80","mz:is_current":0},{"wof:id":1477855739,"wof:name":"F85","mz:is_current":0},{"wof:id":1477855751,"wof:name":"F73A","mz:is_current":0},{"wof:id":1477855761,"wof:name":"F83","mz:is_current":0},{"wof:id":1477855753,"wof:name":"F89","mz:is_current":0},{"wof:id":1477855757,"wof:name":"F73","mz:is_current":0},{"wof:id":1477855763,"wof:name":"F75","mz:is_current":0},{"wof:id":1477855759,"wof:name":"F84B","mz:is_current":0},{"wof:id":1477855765,"wof:name":"F79","mz:is_current":0},{"wof:id":1477855767,"wof:name":"F87A","mz:is_current":0},{"wof:id":1477855771,"wof:name":"F78","mz:is_current":0},{"wof:id":1477855775,"wof:name":"F87","mz:is_current":0},{"wof:id":1477855769,"wof:name":"F77A","mz:is_current":0},{"wof:id":1477855781,"wof:name":"F70A","mz:is_current":0},{"wof:id":1477855777,"wof:name":"F86","mz:is_current":0},{"wof:id":1477855779,"wof:name":"F77C","mz:is_current":0},{"wof:id":1477855783,"wof:name":"F84A","mz:is_current":0},{"wof:id":1477855789,"wof:name":"E68","mz:is_current":0},{"wof:id":1477855793,"wof:name":"E69","mz:is_current":0},{"wof:id":1477855811,"wof:name":"E63","mz:is_current":0},{"wof:id":1477855797,"wof:name":"E60","mz:is_current":0},{"wof:id":1477855795,"wof:name":"E61","mz:is_current":0},{"wof:id":1477855813,"wof:name":"E62A","mz:is_current":0},{"wof:id":1477855799,"wof:name":"E65","mz:is_current":0},{"wof:id":1477855815,"wof:name":"E67","mz:is_current":0},{"wof:id":1477855817,"wof:name":"E64A","mz:is_current":0},{"wof:id":1477855819,"wof:name":"E65A","mz:is_current":0},{"wof:id":1477881719,"wof:name":"B6","mz:is_current":0},{"wof:id":1477855837,"wof:name":"A11A","mz:is_current":0},{"wof:id":1477855839,"wof:name":"A11","mz:is_current":0},{"wof:id":1477855851,"wof:name":"A10","mz:is_current":0},{"wof:id":1477855855,"wof:name":"A3B","mz:is_current":0},{"wof:id":1477855801,"wof:name":"E66","mz:is_current":0},{"wof:id":1477855853,"wof:name":"A1B","mz:is_current":0},{"wof:id":1477855803,"wof:name":"E67A","mz:is_current":0},{"wof:id":1477855805,"wof:name":"E64","mz:is_current":0},{"wof:id":1477855859,"wof:name":"A5B","mz:is_current":0},{"wof:id":1477855857,"wof:name":"A5","mz:is_current":0},{"wof:id":1477855807,"wof:name":"E62","mz:is_current":0},{"wof:id":1477881723,"wof:name":"B8","mz:is_current":0},{"wof:id":1477881721,"wof:name":"B7","mz:is_current":0},{"wof:id":1477881727,"wof:name":"B12","mz:is_current":0},{"wof:id":1477881725,"wof:name":"B9","mz:is_current":0},{"wof:id":1477881731,"wof:name":"B13","mz:is_current":0},{"wof:id":1477855861,"wof:name":"A4","mz:is_current":0},{"wof:id":1477855865,"wof:name":"A10A","mz:is_current":0},{"wof:id":1477881733,"wof:name":"B14","mz:is_current":0},{"wof:id":1477881735,"wof:name":"B17","mz:is_current":0},{"wof:id":1477881737,"wof:name":"B18","mz:is_current":0},{"wof:id":1477855867,"wof:name":"A2","mz:is_current":0},{"wof:id":1477855869,"wof:name":"A12","mz:is_current":0},{"wof:id":1477855871,"wof:name":"A11B","mz:is_current":0},{"wof:id":1477855873,"wof:name":"A3X","mz:is_current":0},{"wof:id":1477855843,"wof:name":"A1A","mz:is_current":0},{"wof:id":1477855841,"wof:name":"A1","mz:is_current":0},{"wof:id":1477855847,"wof:name":"A3A","mz:is_current":0},{"wof:id":1477855883,"wof:name":"A8","mz:is_current":0},{"wof:id":1477855849,"wof:name":"A3","mz:is_current":0},{"wof:id":1477855875,"wof:name":"A9","mz:is_current":0},{"wof:id":1477855877,"wof:name":"A7","mz:is_current":0},{"wof:id":1477855891,"wof:name":"G101A","mz:is_current":0},{"wof:id":1477855893,"wof:name":"G101B","mz:is_current":0},{"wof:id":1477855895,"wof:name":"G101","mz:is_current":0},{"wof:id":1477855897,"wof:name":"G96","mz:is_current":0},{"wof:id":1477855901,"wof:name":"G97","mz:is_current":0},{"wof:id":1477855879,"wof:name":"A6","mz:is_current":0},{"wof:id":1477855905,"wof:name":"G100","mz:is_current":0},{"wof:id":1477855907,"wof:name":"G99B","mz:is_current":0},{"wof:id":1477855903,"wof:name":"G98","mz:is_current":0},{"wof:id":1477855911,"wof:name":"G94","mz:is_current":0},{"wof:id":1477855915,"wof:name":"G99X","mz:is_current":0},{"wof:id":1477855919,"wof:name":"G99","mz:is_current":0},{"wof:id":1477855909,"wof:name":"G92","mz:is_current":0},{"wof:id":1477855913,"wof:name":"G93","mz:is_current":0},{"wof:id":1477855923,"wof:name":"G102","mz:is_current":0},{"wof:id":1477855921,"wof:name":"G99A","mz:is_current":0},{"wof:id":1477855887,"wof:name":"G91","mz:is_current":0},{"wof:id":1477855889,"wof:name":"G95","mz:is_current":0},{"wof:id":1477921767,"wof:name":"D59B","mz:is_current":0},{"wof:id":1477921765,"wof:name":"D59A","mz:is_current":0},{"wof:id":1477921769,"wof:name":"D59C","mz:is_current":0},{"wof:id":1477921771,"wof:name":"F76A","mz:is_current":0},{"wof:id":1477921773,"wof:name":"F76B","mz:is_current":0},{"wof:id":1477930283,"wof:name":"A2","mz:is_current":0},{"wof:id":1477930281,"wof:name":"A1","mz:is_current":0},{"wof:id":1477930287,"wof:name":"A3","mz:is_current":0},{"wof:id":1477930289,"wof:name":"A4","mz:is_current":0},{"wof:id":1477930291,"wof:name":"A5","mz:is_current":0},{"wof:id":1477930295,"wof:name":"A6","mz:is_current":0},{"wof:id":1477930299,"wof:name":"A8","mz:is_current":0},{"wof:id":1477930297,"wof:name":"A7","mz:is_current":0},{"wof:id":1477930301,"wof:name":"A9","mz:is_current":0},{"wof:id":1477930313,"wof:name":"A14","mz:is_current":0},{"wof:id":1477930303,"wof:name":"A10","mz:is_current":0},{"wof:id":1477930315,"wof:name":"A15","mz:is_current":0},{"wof:id":1477930305,"wof:name":"A11","mz:is_current":0},{"wof:id":1477930307,"wof:name":"A12","mz:is_current":0},{"wof:id":1477930319,"wof:name":"C3","mz:is_current":0},{"wof:id":1477930317,"wof:name":"C2","mz:is_current":0},{"wof:id":1477930333,"wof:name":"C9","mz:is_current":0},{"wof:id":1477930321,"wof:name":"C4","mz:is_current":0},{"wof:id":1477930331,"wof:name":"C8","mz:is_current":0},{"wof:id":1477930323,"wof:name":"C5","mz:is_current":0},{"wof:id":1477930335,"wof:name":"C10","mz:is_current":0},{"wof:id":1477930325,"wof:name":"C6","mz:is_current":0},{"wof:id":1477930337,"wof:name":"C11","mz:is_current":0},{"wof:id":1477930309,"wof:name":"A13","mz:is_current":0},{"wof:id":1477930327,"wof:name":"C7","mz:is_current":0},{"wof:id":1477930351,"wof:name":"D6","mz:is_current":0},{"wof:id":1477930339,"wof:name":"D1","mz:is_current":0},{"wof:id":1477930371,"wof:name":"D16","mz:is_current":0},{"wof:id":1477930353,"wof:name":"D7","mz:is_current":0},{"wof:id":1477930373,"wof:name":"D17","mz:is_current":0},{"wof:id":1477930355,"wof:name":"D8","mz:is_current":0},{"wof:id":1477930375,"wof:name":"D18","mz:is_current":0},{"wof:id":1477930361,"wof:name":"D11","mz:is_current":0},{"wof:id":1477930377,"wof:name":"E1","mz:is_current":0},{"wof:id":1477930357,"wof:name":"D9","mz:is_current":0},{"wof:id":1477930379,"wof:name":"E2","mz:is_current":0},{"wof:id":1477930359,"wof:name":"D10","mz:is_current":0},{"wof:id":1477930363,"wof:name":"D12","mz:is_current":0},{"wof:id":1477930367,"wof:name":"D14","mz:is_current":0},{"wof:id":1477930341,"wof:name":"D2","mz:is_current":0},{"wof:id":1477930369,"wof:name":"D15","mz:is_current":0},{"wof:id":1477930343,"wof:name":"D3","mz:is_current":0},{"wof:id":1477930381,"wof:name":"E3","mz:is_current":0},{"wof:id":1477930385,"wof:name":"E4","mz:is_current":0},{"wof:id":1477930345,"wof:name":"D4","mz:is_current":0},{"wof:id":1477930387,"wof:name":"E5","mz:is_current":0},{"wof:id":1477930349,"wof:name":"D5","mz:is_current":0},{"wof:id":1477930389,"wof:name":"E6","mz:is_current":0},{"wof:id":1477930411,"wof:name":"F3","mz:is_current":0},{"wof:id":1477930415,"wof:name":"F4","mz:is_current":0},{"wof:id":1477930413,"wof:name":"F3A","mz:is_current":0},{"wof:id":1477930403,"wof:name":"E12","mz:is_current":0},{"wof:id":1477930421,"wof:name":"F5","mz:is_current":0},{"wof:id":1477930423,"wof:name":"F6","mz:is_current":0},{"wof:id":1477930417,"wof:name":"F5","mz:is_current":0},{"wof:id":1477930427,"wof:name":"F8","mz:is_current":0},{"wof:id":1477930429,"wof:name":"F9","mz:is_current":0},{"wof:id":1477930391,"wof:name":"E7","mz:is_current":0},{"wof:id":1477930395,"wof:name":"E9","mz:is_current":0},{"wof:id":1477930393,"wof:name":"E8","mz:is_current":0},{"wof:id":1477930397,"wof:name":"E10","mz:is_current":0},{"wof:id":1477930399,"wof:name":"E11","mz:is_current":0},{"wof:id":1477930405,"wof:name":"E13","mz:is_current":0},{"wof:id":1477930425,"wof:name":"F7","mz:is_current":0},{"wof:id":1477930407,"wof:name":"F1","mz:is_current":0},{"wof:id":1477930441,"wof:name":"F14","mz:is_current":0},{"wof:id":1477930409,"wof:name":"F2","mz:is_current":0},{"wof:id":1477930443,"wof:name":"F15","mz:is_current":0},{"wof:id":1477930445,"wof:name":"F16","mz:is_current":0},{"wof:id":1477930431,"wof:name":"F10","mz:is_current":0},{"wof:id":1477930449,"wof:name":"F18","mz:is_current":0},{"wof:id":1477930447,"wof:name":"F17","mz:is_current":0},{"wof:id":1477930433,"wof:name":"F11","mz:is_current":0},{"wof:id":1477930439,"wof:name":"F13","mz:is_current":0},{"wof:id":1477930461,"wof:name":"G1","mz:is_current":0},{"wof:id":1477930435,"wof:name":"F12","mz:is_current":0},{"wof:id":1477930463,"wof:name":"G2","mz:is_current":0},{"wof:id":1477930475,"wof:name":"G7","mz:is_current":0},{"wof:id":1477930465,"wof:name":"G3","mz:is_current":0},{"wof:id":1477930477,"wof:name":"G8","mz:is_current":0},{"wof:id":1477930467,"wof:name":"G4","mz:is_current":0},{"wof:id":1477930471,"wof:name":"G6","mz:is_current":0},{"wof:id":1477930469,"wof:name":"G5","mz:is_current":0},{"wof:id":1477930451,"wof:name":"F19","mz:is_current":0},{"wof:id":1477930479,"wof:name":"G9","mz:is_current":0},{"wof:id":1477930453,"wof:name":"F20","mz:is_current":0},{"wof:id":1477930457,"wof:name":"F21","mz:is_current":0},{"wof:id":1477930459,"wof:name":"F22","mz:is_current":0},{"wof:id":1477930483,"wof:name":"G11","mz:is_current":0},{"wof:id":1477930481,"wof:name":"G10","mz:is_current":0},{"wof:id":1477930487,"wof:name":"G13","mz:is_current":0},{"wof:id":1477930485,"wof:name":"G12","mz:is_current":0},{"wof:id":1477930489,"wof:name":"G14","mz:is_current":0},{"wof:id":1360832519,"wof:name":"C45","mz:is_current":0},{"wof:id":1360832521,"wof:name":"F84","mz:is_current":0},{"wof:id":1360832523,"wof:name":"F77","mz:is_current":0},{"wof:id":1729792393,"wof:name":"D1","mz:is_current":0},{"wof:id":1729792399,"wof:name":"D3","mz:is_current":0},{"wof:id":1729792397,"wof:name":"D2","mz:is_current":0},{"wof:id":1729792401,"wof:name":"D4","mz:is_current":0},{"wof:id":1729792403,"wof:name":"D5","mz:is_current":0},{"wof:id":1729792405,"wof:name":"D6","mz:is_current":0},{"wof:id":1729792407,"wof:name":"D7","mz:is_current":0},{"wof:id":1729792409,"wof:name":"D8","mz:is_current":0},{"wof:id":1729792421,"wof:name":"D14","mz:is_current":0},{"wof:id":1729792423,"wof:name":"D15","mz:is_current":0},{"wof:id":1729792425,"wof:name":"D16","mz:is_current":0},{"wof:id":1729792411,"wof:name":"D9","mz:is_current":0},{"wof:id":1729792427,"wof:name":"D17","mz:is_current":0},{"wof:id":1729792415,"wof:name":"D11","mz:is_current":0},{"wof:id":1729792417,"wof:name":"D10","mz:is_current":0},{"wof:id":1729792419,"wof:name":"D12","mz:is_current":0},{"wof:id":1729792439,"wof:name":"B6","mz:is_current":0},{"wof:id":1729792429,"wof:name":"D18","mz:is_current":0},{"wof:id":1729792441,"wof:name":"B7","mz:is_current":0},{"wof:id":1729792443,"wof:name":"B8","mz:is_current":0},{"wof:id":1729792445,"wof:name":"B9","mz:is_current":0},{"wof:id":1729792447,"wof:name":"B12","mz:is_current":0},{"wof:id":1729792451,"wof:name":"B13","mz:is_current":0},{"wof:id":1729792455,"wof:name":"B17","mz:is_current":0},{"wof:id":1729792453,"wof:name":"B14","mz:is_current":0},{"wof:id":1729792457,"wof:name":"B18","mz:is_current":0},{"wof:id":1745882101,"wof:name":"D6","mz:is_current":1},{"wof:id":1745882093,"wof:name":"D2","mz:is_current":1},{"wof:id":1745882095,"wof:name":"D3","mz:is_current":1},{"wof:id":1745882103,"wof:name":"D7","mz:is_current":1},{"wof:id":1745882105,"wof:name":"D9","mz:is_current":1},{"wof:id":1745882097,"wof:name":"D4","mz:is_current":1},{"wof:id":1745882107,"wof:name":"D8","mz:is_current":1},{"wof:id":1745882089,"wof:name":"D1","mz:is_current":1},{"wof:id":1745882099,"wof:name":"D5","mz:is_current":1},{"wof:id":1729792481,"wof:name":"C11","mz:is_current":0},{"wof:id":1729792471,"wof:name":"C6","mz:is_current":0},{"wof:id":1729792475,"wof:name":"C8","mz:is_current":0},{"wof:id":1745882111,"wof:name":"D11","mz:is_current":1},{"wof:id":1729792477,"wof:name":"C9","mz:is_current":0},{"wof:id":1729792479,"wof:name":"C10","mz:is_current":0},{"wof:id":1745882113,"wof:name":"D10","mz:is_current":1},{"wof:id":1745882115,"wof:name":"D12","mz:is_current":1},{"wof:id":1745882117,"wof:name":"D14","mz:is_current":1},{"wof:id":1745882123,"wof:name":"D17","mz:is_current":1},{"wof:id":1745882121,"wof:name":"D16","mz:is_current":1},{"wof:id":1745882119,"wof:name":"D15","mz:is_current":1},{"wof:id":1745882125,"wof:name":"D18","mz:is_current":1},{"wof:id":1729792461,"wof:name":"C2","mz:is_current":0},{"wof:id":1729792463,"wof:name":"C4","mz:is_current":0},{"wof:id":1729792465,"wof:name":"C3","mz:is_current":0},{"wof:id":1729792469,"wof:name":"C5","mz:is_current":0},{"wof:id":1729792491,"wof:name":"F5","mz:is_current":0},{"wof:id":1729792493,"wof:name":"E1","mz:is_current":0},{"wof:id":1729792495,"wof:name":"E2","mz:is_current":0},{"wof:id":1729792501,"wof:name":"F2","mz:is_current":0},{"wof:id":1729792497,"wof:name":"E3","mz:is_current":0},{"wof:id":1729792499,"wof:name":"F1","mz:is_current":0},{"wof:id":1729792505,"wof:name":"F3","mz:is_current":0},{"wof:id":1729792507,"wof:name":"F4","mz:is_current":0},{"wof:id":1729792509,"wof:name":"F3A","mz:is_current":0},{"wof:id":1729792511,"wof:name":"F5","mz:is_current":0},{"wof:id":1729792515,"wof:name":"F7","mz:is_current":0},{"wof:id":1729792513,"wof:name":"F6","mz:is_current":0},{"wof:id":1745882141,"wof:name":"B6","mz:is_current":1},{"wof:id":1729792519,"wof:name":"F9","mz:is_current":0},{"wof:id":1729792517,"wof:name":"F8","mz:is_current":0},{"wof:id":1745882143,"wof:name":"B7","mz:is_current":1},{"wof:id":1745882147,"wof:name":"B8","mz:is_current":1},{"wof:id":1745882149,"wof:name":"B9","mz:is_current":1},{"wof:id":1745882151,"wof:name":"B12","mz:is_current":1},{"wof:id":1745882161,"wof:name":"B10","mz:is_current":1},{"wof:id":1745882153,"wof:name":"B13","mz:is_current":1},{"wof:id":1745882165,"wof:name":"B25","mz:is_current":1},{"wof:id":1745882169,"wof:name":"B24","mz:is_current":1},{"wof:id":1745882167,"wof:name":"B11","mz:is_current":1},{"wof:id":1745882155,"wof:name":"B14","mz:is_current":1},{"wof:id":1729792531,"wof:name":"F14","mz:is_current":0},{"wof:id":1745882157,"wof:name":"B17","mz:is_current":1},{"wof:id":1745882159,"wof:name":"B18","mz:is_current":1},{"wof:id":1729792535,"wof:name":"F16","mz:is_current":0},{"wof:id":1729792537,"wof:name":"F17","mz:is_current":0},{"wof:id":1729792533,"wof:name":"F15","mz:is_current":0},{"wof:id":1745882171,"wof:name":"B26","mz:is_current":1},{"wof:id":1745882173,"wof:name":"B22","mz:is_current":1},{"wof:id":1729792523,"wof:name":"F10","mz:is_current":0},{"wof:id":1729792525,"wof:name":"F11","mz:is_current":0},{"wof:id":1745882175,"wof:name":"B21","mz:is_current":1},{"wof:id":1729792527,"wof:name":"F13","mz:is_current":0},{"wof:id":1745882177,"wof:name":"B19","mz:is_current":1},{"wof:id":1745882179,"wof:name":"B20","mz:is_current":1},{"wof:id":1729792529,"wof:name":"F12","mz:is_current":0},{"wof:id":1745882191,"wof:name":"B15","mz:is_current":1},{"wof:id":1729792541,"wof:name":"F18","mz:is_current":0},{"wof:id":1745882183,"wof:name":"B4","mz:is_current":1},{"wof:id":1745882193,"wof:name":"B27","mz:is_current":1},{"wof:id":1729792473,"wof:name":"C7","mz:is_current":0},{"wof:id":1729792543,"wof:name":"F19","mz:is_current":0},{"wof:id":1745882185,"wof:name":"B23","mz:is_current":1},{"wof:id":1745882187,"wof:name":"B16","mz:is_current":1},{"wof:id":1745882197,"wof:name":"C2","mz:is_current":1},{"wof:id":1729792545,"wof:name":"F20","mz:is_current":0},{"wof:id":1745882189,"wof:name":"B3","mz:is_current":1},{"wof:id":1729792547,"wof:name":"F21","mz:is_current":0},{"wof:id":1729792549,"wof:name":"F22","mz:is_current":0},{"wof:id":1729792553,"wof:name":"E4","mz:is_current":0},{"wof:id":1729792555,"wof:name":"E5","mz:is_current":0},{"wof:id":1729792559,"wof:name":"E6","mz:is_current":0},{"wof:id":1745882201,"wof:name":"C4","mz:is_current":1},{"wof:id":1729792571,"wof:name":"E12","mz:is_current":0},{"wof:id":1729792573,"wof:name":"E13","mz:is_current":0},{"wof:id":1745882203,"wof:name":"C3","mz:is_current":1},{"wof:id":1745882205,"wof:name":"C5","mz:is_current":1},{"wof:id":1745882207,"wof:name":"C6","mz:is_current":1},{"wof:id":1745882209,"wof:name":"C7","mz:is_current":1},{"wof:id":1729792561,"wof:name":"E7","mz:is_current":0},{"wof:id":1729792565,"wof:name":"E9","mz:is_current":0},{"wof:id":1729792563,"wof:name":"E8","mz:is_current":0},{"wof:id":1729792569,"wof:name":"E11","mz:is_current":0},{"wof:id":1745882211,"wof:name":"C8","mz:is_current":1},{"wof:id":1745882213,"wof:name":"C9","mz:is_current":1},{"wof:id":1745882215,"wof:name":"C10","mz:is_current":1},{"wof:id":1745882219,"wof:name":"C11","mz:is_current":1},{"wof:id":1729792591,"wof:name":"A6","mz:is_current":0},{"wof:id":1729792595,"wof:name":"A10","mz:is_current":0},{"wof:id":1729792597,"wof:name":"A9","mz:is_current":0},{"wof:id":1729792583,"wof:name":"A2","mz:is_current":0},{"wof:id":1729792599,"wof:name":"A8","mz:is_current":0},{"wof:id":1729792587,"wof:name":"A5","mz:is_current":0},{"wof:id":1729792585,"wof:name":"A4","mz:is_current":0},{"wof:id":1729792589,"wof:name":"A7","mz:is_current":0},{"wof:id":1729792567,"wof:name":"E10","mz:is_current":0},{"wof:id":1745882231,"wof:name":"B2","mz:is_current":1},{"wof:id":1745882229,"wof:name":"B1","mz:is_current":1},{"wof:id":1745882239,"wof:name":"F5","mz:is_current":0},{"wof:id":1745882241,"wof:name":"E1","mz:is_current":1},{"wof:id":1729792601,"wof:name":"A12","mz:is_current":0},{"wof:id":1745882243,"wof:name":"E2","mz:is_current":1},{"wof:id":1745882247,"wof:name":"F1","mz:is_current":1},{"wof:id":1729792613,"wof:name":"A2","mz:is_current":0},{"wof:id":1745882251,"wof:name":"F3","mz:is_current":1},{"wof:id":1745882245,"wof:name":"E3","mz:is_current":1},{"wof:id":1745882249,"wof:name":"F2","mz:is_current":1},{"wof:id":1745882255,"wof:name":"F4","mz:is_current":1},{"wof:id":1729792615,"wof:name":"A3","mz:is_current":0},{"wof:id":1745882257,"wof:name":"F3A","mz:is_current":1},{"wof:id":1729792619,"wof:name":"A5","mz:is_current":0},{"wof:id":1729792617,"wof:name":"A4","mz:is_current":0},{"wof:id":1745882259,"wof:name":"F5","mz:is_current":1},{"wof:id":1745882261,"wof:name":"F6","mz:is_current":1},{"wof:id":1729792603,"wof:name":"A11","mz:is_current":0},{"wof:id":1745882263,"wof:name":"F8","mz:is_current":1},{"wof:id":1729792605,"wof:name":"A3","mz:is_current":0},{"wof:id":1745882267,"wof:name":"F9","mz:is_current":1},{"wof:id":1745882265,"wof:name":"F7","mz:is_current":1},{"wof:id":1729792607,"wof:name":"A1","mz:is_current":0},{"wof:id":1729792609,"wof:name":"A1","mz:is_current":0},{"wof:id":1745882269,"wof:name":"F10","mz:is_current":1},{"wof:id":1729792621,"wof:name":"A6","mz:is_current":0},{"wof:id":1729792623,"wof:name":"A8","mz:is_current":0},{"wof:id":1729792627,"wof:name":"A9","mz:is_current":0},{"wof:id":1729792625,"wof:name":"A7","mz:is_current":0},{"wof:id":1729792631,"wof:name":"A10","mz:is_current":0},{"wof:id":1729792633,"wof:name":"A11","mz:is_current":0},{"wof:id":1729792635,"wof:name":"A12","mz:is_current":0},{"wof:id":1729792637,"wof:name":"A13","mz:is_current":0},{"wof:id":1729792639,"wof:name":"A14","mz:is_current":0},{"wof:id":1745882275,"wof:name":"F13","mz:is_current":1},{"wof:id":1745882273,"wof:name":"F11","mz:is_current":1},{"wof:id":1745882277,"wof:name":"F12","mz:is_current":1},{"wof:id":1745882279,"wof:name":"F14","mz:is_current":1},{"wof:id":1745882281,"wof:name":"F15","mz:is_current":1},{"wof:id":1745882283,"wof:name":"F16","mz:is_current":1},{"wof:id":1745882285,"wof:name":"F17","mz:is_current":1},{"wof:id":1745882287,"wof:name":"F18","mz:is_current":1},{"wof:id":1729792641,"wof:name":"A15","mz:is_current":0},{"wof:id":1729792651,"wof:name":"G2","mz:is_current":0},{"wof:id":1729792653,"wof:name":"G3","mz:is_current":0},{"wof:id":1729792655,"wof:name":"G4","mz:is_current":0},{"wof:id":1729792649,"wof:name":"G1","mz:is_current":0},{"wof:id":1729792657,"wof:name":"G5","mz:is_current":0},{"wof:id":1729792659,"wof:name":"G6","mz:is_current":0},{"wof:id":1745882291,"wof:name":"F19","mz:is_current":1},{"wof:id":1745882301,"wof:name":"E4","mz:is_current":1},{"wof:id":1745882303,"wof:name":"E5","mz:is_current":1},{"wof:id":1745882305,"wof:name":"E6","mz:is_current":1},{"wof:id":1745882309,"wof:name":"E7","mz:is_current":1},{"wof:id":1745882293,"wof:name":"F20","mz:is_current":1},{"wof:id":1729792661,"wof:name":"G7","mz:is_current":0},{"wof:id":1745882295,"wof:name":"F21","mz:is_current":1},{"wof:id":1729792663,"wof:name":"G10","mz:is_current":0},{"wof:id":1745882297,"wof:name":"F22","mz:is_current":1},{"wof:id":1729792667,"wof:name":"G8","mz:is_current":0},{"wof:id":1729792669,"wof:name":"G11","mz:is_current":0},{"wof:id":1729792671,"wof:name":"G9","mz:is_current":0},{"wof:id":1729792677,"wof:name":"G14","mz:is_current":0},{"wof:id":1729792673,"wof:name":"G12","mz:is_current":0},{"wof:id":1729792675,"wof:name":"G13","mz:is_current":0},{"wof:id":1745882311,"wof:name":"E8","mz:is_current":1},{"wof:id":1745882313,"wof:name":"E9","mz:is_current":1},{"wof:id":1745882315,"wof:name":"E10","mz:is_current":1},{"wof:id":1745882317,"wof:name":"E11","mz:is_current":1},{"wof:id":1745882319,"wof:name":"E12","mz:is_current":1},{"wof:id":1745882321,"wof:name":"E13","mz:is_current":1},{"wof:id":1745882339,"wof:name":"A2","mz:is_current":0},{"wof:id":1745882341,"wof:name":"A4","mz:is_current":0},{"wof:id":1745882345,"wof:name":"A5","mz:is_current":0},{"wof:id":1745882347,"wof:name":"A7","mz:is_current":0},{"wof:id":1745882349,"wof:name":"A6","mz:is_current":0},{"wof:id":1729792723,"wof:name":"B10","mz:is_current":0},{"wof:id":1729792727,"wof:name":"B11","mz:is_current":0},{"wof:id":1729792725,"wof:name":"B25","mz:is_current":0},{"wof:id":1745882363,"wof:name":"A3","mz:is_current":1},{"wof:id":1729792729,"wof:name":"B24","mz:is_current":0},{"wof:id":1745882371,"wof:name":"A3","mz:is_current":0},{"wof:id":1745882373,"wof:name":"A4","mz:is_current":1},{"wof:id":1745882367,"wof:name":"A1","mz:is_current":1},{"wof:id":1745882365,"wof:name":"A1","mz:is_current":0},{"wof:id":1745882375,"wof:name":"A5","mz:is_current":1},{"wof:id":1745882369,"wof:name":"A2","mz:is_current":1},{"wof:id":1745882353,"wof:name":"A9","mz:is_current":0},{"wof:id":1745882351,"wof:name":"A10","mz:is_current":0},{"wof:id":1745882355,"wof:name":"A8","mz:is_current":0},{"wof:id":1745882357,"wof:name":"A12","mz:is_current":0},{"wof:id":1745882359,"wof:name":"A11","mz:is_current":0},{"wof:id":1729792741,"wof:name":"B21","mz:is_current":0},{"wof:id":1729792743,"wof:name":"B19","mz:is_current":0},{"wof:id":1729792745,"wof:name":"B20","mz:is_current":0},{"wof:id":1729792733,"wof:name":"B26","mz:is_current":0},{"wof:id":1745882381,"wof:name":"A8","mz:is_current":1},{"wof:id":1729792747,"wof:name":"B5","mz:is_current":1},{"wof:id":1729792731,"wof:name":"C1","mz:is_current":1},{"wof:id":1729792735,"wof:name":"B1","mz:is_current":0},{"wof:id":1729792749,"wof:name":"B4","mz:is_current":0},{"wof:id":1745882383,"wof:name":"A7","mz:is_current":1},{"wof:id":1745882385,"wof:name":"A9","mz:is_current":1},{"wof:id":1729792739,"wof:name":"B22","mz:is_current":0},{"wof:id":1729792751,"wof:name":"B23","mz:is_current":0},{"wof:id":1745882389,"wof:name":"A12","mz:is_current":1},{"wof:id":1745882387,"wof:name":"A10","mz:is_current":1},{"wof:id":1729792759,"wof:name":"B3","mz:is_current":0},{"wof:id":1729792757,"wof:name":"B2","mz:is_current":0},{"wof:id":1729792753,"wof:name":"B16","mz:is_current":0},{"wof:id":1745882377,"wof:name":"A6","mz:is_current":1},{"wof:id":1729792761,"wof:name":"B15","mz:is_current":0},{"wof:id":1729792763,"wof:name":"B27","mz:is_current":0},{"wof:id":1745882393,"wof:name":"A13","mz:is_current":1},{"wof:id":1745882391,"wof:name":"A11","mz:is_current":1},{"wof:id":1745882405,"wof:name":"G1","mz:is_current":1},{"wof:id":1745882407,"wof:name":"G2","mz:is_current":1},{"wof:id":1745882409,"wof:name":"G3","mz:is_current":1},{"wof:id":1745882411,"wof:name":"G4","mz:is_current":1},{"wof:id":1745882395,"wof:name":"A14","mz:is_current":1},{"wof:id":1745882417,"wof:name":"G6","mz:is_current":1},{"wof:id":1745882413,"wof:name":"G5","mz:is_current":1},{"wof:id":1745882399,"wof:name":"A15","mz:is_current":1},{"wof:id":1745882419,"wof:name":"G7","mz:is_current":1},{"wof:id":1745882421,"wof:name":"G10","mz:is_current":1},{"wof:id":1745882425,"wof:name":"G11","mz:is_current":1},{"wof:id":1745882423,"wof:name":"G8","mz:is_current":1},{"wof:id":1745882427,"wof:name":"G9","mz:is_current":1},{"wof:id":1745882435,"wof:name":"G14","mz:is_current":1},{"wof:id":1745882431,"wof:name":"G13","mz:is_current":1},{"wof:id":1745882429,"wof:name":"G12","mz:is_current":1},{"wof:id":1746415337,"wof:name":"C10R","mz:is_current":1},{"wof:id":1746415339,"wof:name":"A13R","mz:is_current":1},{"wof:id":1746415343,"wof:name":"G12S","mz:is_current":1},{"wof:id":1746415347,"wof:name":"F15M","mz:is_current":1},{"wof:id":1746415345,"wof:name":"G12V","mz:is_current":1},{"wof:id":1746415349,"wof:name":"C4U","mz:is_current":1},{"wof:id":1746415361,"wof:name":"A13V","mz:is_current":1},{"wof:id":1746415363,"wof:name":"E10V","mz:is_current":1},{"wof:id":1746415391,"wof:name":"A4R","mz:is_current":1},{"wof:id":1746415389,"wof:name":"A6S","mz:is_current":1},{"wof:id":1746415401,"wof:name":"E3T","mz:is_current":1},{"wof:id":1746415403,"wof:name":"B20S","mz:is_current":1},{"wof:id":1746415419,"wof:name":"E10U","mz:is_current":1}] +[{"wof:id":1746415399,"wof:name":"A6R","mz:is_current":1},{"wof:id":1745882257,"wof:name":"F3A","mz:is_current":0},{"wof:id":1745882261,"wof:name":"F6","mz:is_current":0},{"wof:id":1745882273,"wof:name":"F11","mz:is_current":0},{"wof:id":1746415401,"wof:name":"E3T","mz:is_current":1},{"wof:id":1745882265,"wof:name":"F7","mz:is_current":0},{"wof:id":1745882277,"wof:name":"F12","mz:is_current":0},{"wof:id":1746415411,"wof:name":"C4R","mz:is_current":1},{"wof:id":1746415403,"wof:name":"B20S","mz:is_current":1},{"wof:id":1745882279,"wof:name":"F14","mz:is_current":0},{"wof:id":1745882267,"wof:name":"F9","mz:is_current":0},{"wof:id":1746415415,"wof:name":"E11U","mz:is_current":1},{"wof:id":1746415405,"wof:name":"F15K","mz:is_current":1},{"wof:id":1745882283,"wof:name":"F16","mz:is_current":0},{"wof:id":1746415417,"wof:name":"E13K","mz:is_current":1},{"wof:id":1746415421,"wof:name":"E3K","mz:is_current":1},{"wof:id":1746415407,"wof:name":"G105","mz:is_current":1},{"wof:id":1745882285,"wof:name":"F17","mz:is_current":0},{"wof:id":1746415419,"wof:name":"E10U","mz:is_current":1},{"wof:id":1746415423,"wof:name":"A4T","mz:is_current":1},{"wof:id":1746415409,"wof:name":"E11V","mz:is_current":1},{"wof:id":1745882287,"wof:name":"F18","mz:is_current":0},{"wof:id":1745882293,"wof:name":"F20","mz:is_current":0},{"wof:id":1746415425,"wof:name":"A14T","mz:is_current":1},{"wof:id":1745882303,"wof:name":"E5","mz:is_current":0},{"wof:id":1745882297,"wof:name":"F22","mz:is_current":0},{"wof:id":1745882309,"wof:name":"E7","mz:is_current":0},{"wof:id":1745882321,"wof:name":"E13","mz:is_current":0},{"wof:id":1745882311,"wof:name":"E8","mz:is_current":0},{"wof:id":1745882313,"wof:name":"E9","mz:is_current":0},{"wof:id":1745882315,"wof:name":"E10","mz:is_current":0},{"wof:id":1745882341,"wof:name":"A4","mz:is_current":0},{"wof:id":1745882351,"wof:name":"A10","mz:is_current":0},{"wof:id":1745882317,"wof:name":"E11","mz:is_current":0},{"wof:id":1745882339,"wof:name":"A2","mz:is_current":0},{"wof:id":1745882345,"wof:name":"A5","mz:is_current":0},{"wof:id":1745882353,"wof:name":"A9","mz:is_current":0},{"wof:id":1745882319,"wof:name":"E12","mz:is_current":0},{"wof:id":1745882355,"wof:name":"A8","mz:is_current":0},{"wof:id":1745882365,"wof:name":"A1","mz:is_current":0},{"wof:id":1745882347,"wof:name":"A7","mz:is_current":0},{"wof:id":1745882373,"wof:name":"A4","mz:is_current":0},{"wof:id":1745882357,"wof:name":"A12","mz:is_current":0},{"wof:id":1745882367,"wof:name":"A1","mz:is_current":0},{"wof:id":1745882375,"wof:name":"A5","mz:is_current":0},{"wof:id":1745882349,"wof:name":"A6","mz:is_current":0},{"wof:id":1745882359,"wof:name":"A11","mz:is_current":0},{"wof:id":1745882369,"wof:name":"A2","mz:is_current":0},{"wof:id":1745882395,"wof:name":"A14","mz:is_current":0},{"wof:id":1745882381,"wof:name":"A8","mz:is_current":0},{"wof:id":1745882385,"wof:name":"A9","mz:is_current":0},{"wof:id":1745882411,"wof:name":"G4","mz:is_current":0},{"wof:id":1745882421,"wof:name":"G10","mz:is_current":0},{"wof:id":1745882387,"wof:name":"A10","mz:is_current":0},{"wof:id":1745882413,"wof:name":"G5","mz:is_current":0},{"wof:id":1745882405,"wof:name":"G1","mz:is_current":0},{"wof:id":1745882423,"wof:name":"G8","mz:is_current":0},{"wof:id":1745882389,"wof:name":"A12","mz:is_current":0},{"wof:id":1745882417,"wof:name":"G6","mz:is_current":0},{"wof:id":1745882407,"wof:name":"G2","mz:is_current":0},{"wof:id":1745882425,"wof:name":"G11","mz:is_current":0},{"wof:id":1745882435,"wof:name":"G14","mz:is_current":0},{"wof:id":1745882409,"wof:name":"G3","mz:is_current":0},{"wof:id":1745882427,"wof:name":"G9","mz:is_current":0},{"wof:id":1763588135,"wof:name":"D4","mz:is_current":1},{"wof:id":1763588141,"wof:name":"D7","mz:is_current":1},{"wof:id":1763588137,"wof:name":"D5","mz:is_current":1},{"wof:id":1763588143,"wof:name":"D9","mz:is_current":1},{"wof:id":1763588139,"wof:name":"D6","mz:is_current":1},{"wof:id":1763588145,"wof:name":"D8","mz:is_current":1},{"wof:id":1763588157,"wof:name":"D16","mz:is_current":1},{"wof:id":1763588161,"wof:name":"D17","mz:is_current":1},{"wof:id":1763588147,"wof:name":"D11","mz:is_current":1},{"wof:id":1763588159,"wof:name":"D15","mz:is_current":1},{"wof:id":1763588163,"wof:name":"D18","mz:is_current":1},{"wof:id":1763588149,"wof:name":"D10","mz:is_current":1},{"wof:id":1763588185,"wof:name":"B12","mz:is_current":1},{"wof:id":1763588191,"wof:name":"B13","mz:is_current":1},{"wof:id":1763588189,"wof:name":"B9","mz:is_current":1},{"wof:id":1763588193,"wof:name":"B14","mz:is_current":1},{"wof:id":1763588201,"wof:name":"B25","mz:is_current":1},{"wof:id":1763588127,"wof:name":"D2","mz:is_current":1},{"wof:id":1763588195,"wof:name":"B17","mz:is_current":1},{"wof:id":1763588203,"wof:name":"B11","mz:is_current":1},{"wof:id":1763588129,"wof:name":"D1","mz:is_current":1},{"wof:id":1763588179,"wof:name":"B6","mz:is_current":1},{"wof:id":1763588197,"wof:name":"B18","mz:is_current":1},{"wof:id":1763588207,"wof:name":"B24","mz:is_current":1},{"wof:id":1763588215,"wof:name":"B4","mz:is_current":1},{"wof:id":1763588221,"wof:name":"B23","mz:is_current":1},{"wof:id":1763588199,"wof:name":"B10","mz:is_current":1},{"wof:id":1763588209,"wof:name":"B26","mz:is_current":1},{"wof:id":1763588217,"wof:name":"B27","mz:is_current":1},{"wof:id":1763588225,"wof:name":"B19","mz:is_current":1},{"wof:id":1763588235,"wof:name":"C2","mz:is_current":1},{"wof:id":1763588219,"wof:name":"B21","mz:is_current":1},{"wof:id":1763588243,"wof:name":"C5","mz:is_current":1},{"wof:id":1763588237,"wof:name":"C4","mz:is_current":1},{"wof:id":1763588227,"wof:name":"B16","mz:is_current":1},{"wof:id":1763588245,"wof:name":"C6","mz:is_current":1},{"wof:id":1763588229,"wof:name":"B20","mz:is_current":1},{"wof:id":1763588239,"wof:name":"C3","mz:is_current":1},{"wof:id":1763588247,"wof:name":"C8","mz:is_current":1},{"wof:id":1763588255,"wof:name":"C11","mz:is_current":1},{"wof:id":1763588267,"wof:name":"B2","mz:is_current":1},{"wof:id":1763588273,"wof:name":"F5","mz:is_current":1},{"wof:id":1763588249,"wof:name":"C7","mz:is_current":1},{"wof:id":1763588279,"wof:name":"E2","mz:is_current":1},{"wof:id":1763588281,"wof:name":"E3","mz:is_current":1},{"wof:id":1763588297,"wof:name":"F6","mz:is_current":1},{"wof:id":1763588303,"wof:name":"F9","mz:is_current":1},{"wof:id":1763588311,"wof:name":"F12","mz:is_current":1},{"wof:id":1763588283,"wof:name":"F1","mz:is_current":1},{"wof:id":1763588305,"wof:name":"F10","mz:is_current":1},{"wof:id":1763588299,"wof:name":"F8","mz:is_current":1},{"wof:id":1763588315,"wof:name":"F14","mz:is_current":1},{"wof:id":1763588307,"wof:name":"F11","mz:is_current":1},{"wof:id":1763588285,"wof:name":"F3","mz:is_current":1},{"wof:id":1763588317,"wof:name":"F15","mz:is_current":1},{"wof:id":1763588333,"wof:name":"F22","mz:is_current":1},{"wof:id":1763588323,"wof:name":"F18","mz:is_current":1},{"wof:id":1763588287,"wof:name":"F2","mz:is_current":1},{"wof:id":1763588325,"wof:name":"F19","mz:is_current":1},{"wof:id":1763588319,"wof:name":"F16","mz:is_current":1},{"wof:id":1763588289,"wof:name":"F4","mz:is_current":1},{"wof:id":1763588337,"wof:name":"E4","mz:is_current":1},{"wof:id":1763588345,"wof:name":"E8","mz:is_current":1},{"wof:id":1763588351,"wof:name":"E9","mz:is_current":1},{"wof:id":1763588347,"wof:name":"E10","mz:is_current":1},{"wof:id":1763588353,"wof:name":"E11","mz:is_current":1},{"wof:id":1763588355,"wof:name":"E12","mz:is_current":1},{"wof:id":1763588357,"wof:name":"E13","mz:is_current":1},{"wof:id":1763588373,"wof:name":"A11","mz:is_current":1},{"wof:id":1763588383,"wof:name":"A7","mz:is_current":1},{"wof:id":1763588327,"wof:name":"F20","mz:is_current":1},{"wof:id":1763588375,"wof:name":"A10","mz:is_current":1},{"wof:id":1763588387,"wof:name":"A2","mz:is_current":1},{"wof:id":1763588329,"wof:name":"F21","mz:is_current":1},{"wof:id":1763588377,"wof:name":"A4","mz:is_current":1},{"wof:id":1763588393,"wof:name":"A3","mz:is_current":1},{"wof:id":1763588405,"wof:name":"A2","mz:is_current":1},{"wof:id":1763588411,"wof:name":"A6","mz:is_current":1},{"wof:id":1763588379,"wof:name":"A9","mz:is_current":1},{"wof:id":1763588395,"wof:name":"A5","mz:is_current":1},{"wof:id":1763588407,"wof:name":"A4","mz:is_current":1},{"wof:id":1763588413,"wof:name":"A8","mz:is_current":1},{"wof:id":1763588425,"wof:name":"A14","mz:is_current":1},{"wof:id":1763588397,"wof:name":"A12","mz:is_current":1},{"wof:id":1763588409,"wof:name":"A5","mz:is_current":1},{"wof:id":1763588415,"wof:name":"A7","mz:is_current":1},{"wof:id":1763588427,"wof:name":"A15","mz:is_current":1},{"wof:id":1763588399,"wof:name":"A3","mz:is_current":1},{"wof:id":1763588429,"wof:name":"A11","mz:is_current":1},{"wof:id":1763588417,"wof:name":"A9","mz:is_current":1},{"wof:id":1763588437,"wof:name":"G1","mz:is_current":1},{"wof:id":1763588443,"wof:name":"G3","mz:is_current":1},{"wof:id":1763588451,"wof:name":"G7","mz:is_current":1},{"wof:id":1763588419,"wof:name":"A12","mz:is_current":1},{"wof:id":1763588447,"wof:name":"G5","mz:is_current":1},{"wof:id":1763588461,"wof:name":"G9","mz:is_current":1},{"wof:id":1763588453,"wof:name":"G10","mz:is_current":1},{"wof:id":1763588463,"wof:name":"G12","mz:is_current":1},{"wof:id":1763588483,"wof:name":"B5","mz:is_current":1},{"wof:id":1763588455,"wof:name":"G8","mz:is_current":1},{"wof:id":1763588465,"wof:name":"G13","mz:is_current":1},{"wof:id":1763588459,"wof:name":"G11","mz:is_current":1},{"wof:id":1763588467,"wof:name":"G14","mz:is_current":1},{"wof:id":1159157611,"wof:name":"A3A","mz:is_current":0},{"wof:id":1159157607,"wof:name":"A12","mz:is_current":0},{"wof:id":1159157613,"wof:name":"A1","mz:is_current":0},{"wof:id":1159157623,"wof:name":"G91","mz:is_current":0},{"wof:id":1159157609,"wof:name":"A2","mz:is_current":0},{"wof:id":1159157615,"wof:name":"G101A","mz:is_current":0},{"wof:id":1159157633,"wof:name":"A9","mz:is_current":0},{"wof:id":1159157625,"wof:name":"B22","mz:is_current":0},{"wof:id":1159157643,"wof:name":"A5B","mz:is_current":0},{"wof:id":1159157617,"wof:name":"A1A","mz:is_current":0},{"wof:id":1159157635,"wof:name":"A6","mz:is_current":0},{"wof:id":1159157627,"wof:name":"A11","mz:is_current":0},{"wof:id":1159157645,"wof:name":"F79","mz:is_current":0},{"wof:id":1159157639,"wof:name":"A7","mz:is_current":0},{"wof:id":1159157629,"wof:name":"A11A","mz:is_current":0},{"wof:id":1159157653,"wof:name":"E65","mz:is_current":0},{"wof:id":1159157681,"wof:name":"G99B","mz:is_current":0},{"wof:id":1159157647,"wof:name":"E63","mz:is_current":0},{"wof:id":1159157671,"wof:name":"F86","mz:is_current":0},{"wof:id":1159157663,"wof:name":"C46","mz:is_current":0},{"wof:id":1159157683,"wof:name":"G97","mz:is_current":0},{"wof:id":1159157649,"wof:name":"D53","mz:is_current":0},{"wof:id":1159157665,"wof:name":"F89","mz:is_current":0},{"wof:id":1159157675,"wof:name":"F87","mz:is_current":0},{"wof:id":1159157693,"wof:name":"F84D","mz:is_current":0},{"wof:id":1159157669,"wof:name":"F73A","mz:is_current":0},{"wof:id":1159157685,"wof:name":"G100","mz:is_current":0},{"wof:id":1159157677,"wof:name":"G102","mz:is_current":0},{"wof:id":1159157697,"wof:name":"F74","mz:is_current":0},{"wof:id":1159157679,"wof:name":"G99A","mz:is_current":0},{"wof:id":1159157701,"wof:name":"D50A","mz:is_current":0},{"wof:id":1159157687,"wof:name":"G98","mz:is_current":0},{"wof:id":1159157699,"wof:name":"E68","mz:is_current":0},{"wof:id":1159157705,"wof:name":"D51B","mz:is_current":0},{"wof:id":1159157707,"wof:name":"C45B","mz:is_current":0},{"wof:id":1159157711,"wof:name":"C42","mz:is_current":0},{"wof:id":1159157731,"wof:name":"F70A","mz:is_current":0},{"wof:id":1159157723,"wof:name":"F71A","mz:is_current":0},{"wof:id":1159157715,"wof:name":"B24","mz:is_current":0},{"wof:id":1159157741,"wof:name":"F90","mz:is_current":0},{"wof:id":1159157725,"wof:name":"F71B","mz:is_current":0},{"wof:id":1159157717,"wof:name":"A3","mz:is_current":0},{"wof:id":1159157733,"wof:name":"E67","mz:is_current":0},{"wof:id":1159157743,"wof:name":"C48","mz:is_current":0},{"wof:id":1159157735,"wof:name":"E65A","mz:is_current":0},{"wof:id":1159157729,"wof:name":"F76","mz:is_current":0},{"wof:id":1159157737,"wof:name":"E64A","mz:is_current":0},{"wof:id":1159157747,"wof:name":"C41","mz:is_current":0},{"wof:id":1159157719,"wof:name":"G101B","mz:is_current":0},{"wof:id":1159157739,"wof:name":"F77C","mz:is_current":0},{"wof:id":1159157753,"wof:name":"C47","mz:is_current":0},{"wof:id":1159157755,"wof:name":"C45A","mz:is_current":0},{"wof:id":1159157749,"wof:name":"F85","mz:is_current":0},{"wof:id":1159157773,"wof:name":"D59","mz:is_current":0},{"wof:id":1159157759,"wof:name":"E69","mz:is_current":0},{"wof:id":1159157775,"wof:name":"G93","mz:is_current":0},{"wof:id":1159157765,"wof:name":"E60","mz:is_current":0},{"wof:id":1159157793,"wof:name":"D55","mz:is_current":0},{"wof:id":1159157767,"wof:name":"E61","mz:is_current":0},{"wof:id":1159157795,"wof:name":"D56B","mz:is_current":0},{"wof:id":1159157783,"wof:name":"F75","mz:is_current":0},{"wof:id":1159157769,"wof:name":"F77B","mz:is_current":0},{"wof:id":1159157777,"wof:name":"G94","mz:is_current":0},{"wof:id":1159157797,"wof:name":"D56A","mz:is_current":0},{"wof:id":1159157785,"wof:name":"E64","mz:is_current":0},{"wof:id":1159157803,"wof:name":"C43","mz:is_current":0},{"wof:id":1159157789,"wof:name":"E66","mz:is_current":0},{"wof:id":1159157811,"wof:name":"B27","mz:is_current":0},{"wof:id":1159157821,"wof:name":"F80","mz:is_current":0},{"wof:id":1159157805,"wof:name":"A5","mz:is_current":0},{"wof:id":1159157815,"wof:name":"G99","mz:is_current":0},{"wof:id":1159157831,"wof:name":"D54B","mz:is_current":0},{"wof:id":1159157823,"wof:name":"A10","mz:is_current":0},{"wof:id":1159157807,"wof:name":"A3B","mz:is_current":0},{"wof:id":1159157819,"wof:name":"C48A","mz:is_current":0},{"wof:id":1159157833,"wof:name":"D54A","mz:is_current":0},{"wof:id":1159157825,"wof:name":"F72","mz:is_current":0},{"wof:id":1159157809,"wof:name":"B26","mz:is_current":0},{"wof:id":1159157843,"wof:name":"A3X","mz:is_current":0},{"wof:id":1159157827,"wof:name":"G101","mz:is_current":0},{"wof:id":1159157837,"wof:name":"F84A","mz:is_current":0},{"wof:id":1159157851,"wof:name":"E62A","mz:is_current":0},{"wof:id":1159157847,"wof:name":"F77A","mz:is_current":0},{"wof:id":1159157849,"wof:name":"F87A","mz:is_current":0},{"wof:id":1159157829,"wof:name":"D52","mz:is_current":0},{"wof:id":1159157855,"wof:name":"F78","mz:is_current":0},{"wof:id":1159157839,"wof:name":"D50B","mz:is_current":0},{"wof:id":1376996231,"wof:name":"B28","mz:is_current":0},{"wof:id":1477855621,"wof:name":"D50A","mz:is_current":0},{"wof:id":1477855623,"wof:name":"D58B","mz:is_current":0},{"wof:id":1477855615,"wof:name":"D52","mz:is_current":0},{"wof:id":1477855617,"wof:name":"D51A","mz:is_current":0},{"wof:id":1477855619,"wof:name":"D51B","mz:is_current":0},{"wof:id":1477855631,"wof:name":"D57","mz:is_current":0},{"wof:id":1477855633,"wof:name":"D59","mz:is_current":0},{"wof:id":1477855635,"wof:name":"D53","mz:is_current":0},{"wof:id":1477855637,"wof:name":"D54A","mz:is_current":0},{"wof:id":1477855639,"wof:name":"D50B","mz:is_current":0},{"wof:id":1477855643,"wof:name":"D55","mz:is_current":0},{"wof:id":1477855641,"wof:name":"D54B","mz:is_current":0},{"wof:id":1477855645,"wof:name":"D56A","mz:is_current":0},{"wof:id":1477855649,"wof:name":"D56B","mz:is_current":0},{"wof:id":1477855651,"wof:name":"D58A","mz:is_current":0},{"wof:id":1477855671,"wof:name":"C45","mz:is_current":0},{"wof:id":1477855673,"wof:name":"C47","mz:is_current":0},{"wof:id":1477855679,"wof:name":"C41","mz:is_current":0},{"wof:id":1477855675,"wof:name":"C45A","mz:is_current":0},{"wof:id":1477855677,"wof:name":"C48","mz:is_current":0},{"wof:id":1477855681,"wof:name":"C42","mz:is_current":0},{"wof:id":1477855691,"wof:name":"C43","mz:is_current":0},{"wof:id":1477855693,"wof:name":"C42A","mz:is_current":0},{"wof:id":1477855695,"wof:name":"C48A","mz:is_current":0},{"wof:id":1477855697,"wof:name":"C40","mz:is_current":0},{"wof:id":1477855705,"wof:name":"F77","mz:is_current":0},{"wof:id":1477855707,"wof:name":"F84","mz:is_current":0},{"wof:id":1477855709,"wof:name":"F84D","mz:is_current":0},{"wof:id":1477855711,"wof:name":"F74","mz:is_current":0},{"wof:id":1477855713,"wof:name":"F84C","mz:is_current":0},{"wof:id":1477855715,"wof:name":"F71A","mz:is_current":0},{"wof:id":1477855717,"wof:name":"F76","mz:is_current":0},{"wof:id":1477855721,"wof:name":"F71B","mz:is_current":0},{"wof:id":1477855723,"wof:name":"F70","mz:is_current":0},{"wof:id":1477855733,"wof:name":"F81","mz:is_current":0},{"wof:id":1477855735,"wof:name":"F88","mz:is_current":0},{"wof:id":1477855739,"wof:name":"F85","mz:is_current":0},{"wof:id":1477855741,"wof:name":"F90","mz:is_current":0},{"wof:id":1477855743,"wof:name":"F77B","mz:is_current":0},{"wof:id":1477855745,"wof:name":"F82","mz:is_current":0},{"wof:id":1477855747,"wof:name":"F72","mz:is_current":0},{"wof:id":1477855749,"wof:name":"F80","mz:is_current":0},{"wof:id":1477855685,"wof:name":"C45B","mz:is_current":0},{"wof:id":1477855761,"wof:name":"F83","mz:is_current":0},{"wof:id":1477855763,"wof:name":"F75","mz:is_current":0},{"wof:id":1477855765,"wof:name":"F79","mz:is_current":0},{"wof:id":1477855767,"wof:name":"F87A","mz:is_current":0},{"wof:id":1477855769,"wof:name":"F77A","mz:is_current":0},{"wof:id":1477855771,"wof:name":"F78","mz:is_current":0},{"wof:id":1477855775,"wof:name":"F87","mz:is_current":0},{"wof:id":1477855777,"wof:name":"F86","mz:is_current":0},{"wof:id":1477855779,"wof:name":"F77C","mz:is_current":0},{"wof:id":1477855781,"wof:name":"F70A","mz:is_current":0},{"wof:id":1477855783,"wof:name":"F84A","mz:is_current":0},{"wof:id":1477855789,"wof:name":"E68","mz:is_current":0},{"wof:id":1360832519,"wof:name":"C45","mz:is_current":0},{"wof:id":1477855793,"wof:name":"E69","mz:is_current":0},{"wof:id":1477855795,"wof:name":"E61","mz:is_current":0},{"wof:id":1477855797,"wof:name":"E60","mz:is_current":0},{"wof:id":1477855799,"wof:name":"E65","mz:is_current":0},{"wof:id":1360832521,"wof:name":"F84","mz:is_current":0},{"wof:id":1360832523,"wof:name":"F77","mz:is_current":0},{"wof:id":1477855801,"wof:name":"E66","mz:is_current":0},{"wof:id":1477855803,"wof:name":"E67A","mz:is_current":0},{"wof:id":1477855807,"wof:name":"E62","mz:is_current":0},{"wof:id":1477855811,"wof:name":"E63","mz:is_current":0},{"wof:id":1477855805,"wof:name":"E64","mz:is_current":0},{"wof:id":1477855813,"wof:name":"E62A","mz:is_current":0},{"wof:id":1477855815,"wof:name":"E67","mz:is_current":0},{"wof:id":1477855819,"wof:name":"E65A","mz:is_current":0},{"wof:id":1477855837,"wof:name":"A11A","mz:is_current":0},{"wof:id":1477855839,"wof:name":"A11","mz:is_current":0},{"wof:id":1477855687,"wof:name":"C46","mz:is_current":0},{"wof:id":1477855689,"wof:name":"C44","mz:is_current":0},{"wof:id":1477855853,"wof:name":"A1B","mz:is_current":0},{"wof:id":1477855851,"wof:name":"A10","mz:is_current":0},{"wof:id":1477855855,"wof:name":"A3B","mz:is_current":0},{"wof:id":1477855857,"wof:name":"A5","mz:is_current":0},{"wof:id":1477855859,"wof:name":"A5B","mz:is_current":0},{"wof:id":1477855865,"wof:name":"A10A","mz:is_current":0},{"wof:id":1477855861,"wof:name":"A4","mz:is_current":0},{"wof:id":1477855817,"wof:name":"E64A","mz:is_current":0},{"wof:id":1477855867,"wof:name":"A2","mz:is_current":0},{"wof:id":1477855871,"wof:name":"A11B","mz:is_current":0},{"wof:id":1477855869,"wof:name":"A12","mz:is_current":0},{"wof:id":1477855873,"wof:name":"A3X","mz:is_current":0},{"wof:id":1477855879,"wof:name":"A6","mz:is_current":0},{"wof:id":1477855875,"wof:name":"A9","mz:is_current":0},{"wof:id":1477855877,"wof:name":"A7","mz:is_current":0},{"wof:id":1477855883,"wof:name":"A8","mz:is_current":0},{"wof:id":1477855887,"wof:name":"G91","mz:is_current":0},{"wof:id":1477855889,"wof:name":"G95","mz:is_current":0},{"wof:id":1477855891,"wof:name":"G101A","mz:is_current":0},{"wof:id":1477855893,"wof:name":"G101B","mz:is_current":0},{"wof:id":1477855895,"wof:name":"G101","mz:is_current":0},{"wof:id":1477855751,"wof:name":"F73A","mz:is_current":0},{"wof:id":1477855897,"wof:name":"G96","mz:is_current":0},{"wof:id":1477855753,"wof:name":"F89","mz:is_current":0},{"wof:id":1477855759,"wof:name":"F84B","mz:is_current":0},{"wof:id":1477855901,"wof:name":"G97","mz:is_current":0},{"wof:id":1477855757,"wof:name":"F73","mz:is_current":0},{"wof:id":1477855911,"wof:name":"G94","mz:is_current":0},{"wof:id":1477855913,"wof:name":"G93","mz:is_current":0},{"wof:id":1477855903,"wof:name":"G98","mz:is_current":0},{"wof:id":1477855915,"wof:name":"G99X","mz:is_current":0},{"wof:id":1477855905,"wof:name":"G100","mz:is_current":0},{"wof:id":1477855919,"wof:name":"G99","mz:is_current":0},{"wof:id":1477855907,"wof:name":"G99B","mz:is_current":0},{"wof:id":1477855909,"wof:name":"G92","mz:is_current":0},{"wof:id":1477855921,"wof:name":"G99A","mz:is_current":0},{"wof:id":1477855923,"wof:name":"G102","mz:is_current":0},{"wof:id":1477855841,"wof:name":"A1","mz:is_current":0},{"wof:id":1477855843,"wof:name":"A1A","mz:is_current":0},{"wof:id":1477855847,"wof:name":"A3A","mz:is_current":0},{"wof:id":1477881719,"wof:name":"B6","mz:is_current":0},{"wof:id":1477855849,"wof:name":"A3","mz:is_current":0},{"wof:id":1477881721,"wof:name":"B7","mz:is_current":0},{"wof:id":1477881723,"wof:name":"B8","mz:is_current":0},{"wof:id":1477881725,"wof:name":"B9","mz:is_current":0},{"wof:id":1477881727,"wof:name":"B12","mz:is_current":0},{"wof:id":1477881731,"wof:name":"B13","mz:is_current":0},{"wof:id":1477881733,"wof:name":"B14","mz:is_current":0},{"wof:id":1477881735,"wof:name":"B17","mz:is_current":0},{"wof:id":1477881737,"wof:name":"B18","mz:is_current":0},{"wof:id":1477921765,"wof:name":"D59A","mz:is_current":0},{"wof:id":1477921767,"wof:name":"D59B","mz:is_current":0},{"wof:id":1477921771,"wof:name":"F76A","mz:is_current":0},{"wof:id":1477921769,"wof:name":"D59C","mz:is_current":0},{"wof:id":1477930281,"wof:name":"A1","mz:is_current":0},{"wof:id":1477930283,"wof:name":"A2","mz:is_current":0},{"wof:id":1477930287,"wof:name":"A3","mz:is_current":0},{"wof:id":1477930289,"wof:name":"A4","mz:is_current":0},{"wof:id":1477930295,"wof:name":"A6","mz:is_current":0},{"wof:id":1477921773,"wof:name":"F76B","mz:is_current":0},{"wof:id":1477930291,"wof:name":"A5","mz:is_current":0},{"wof:id":1477930297,"wof:name":"A7","mz:is_current":0},{"wof:id":1477930303,"wof:name":"A10","mz:is_current":0},{"wof:id":1477930299,"wof:name":"A8","mz:is_current":0},{"wof:id":1477930305,"wof:name":"A11","mz:is_current":0},{"wof:id":1477930301,"wof:name":"A9","mz:is_current":0},{"wof:id":1477930313,"wof:name":"A14","mz:is_current":0},{"wof:id":1477930307,"wof:name":"A12","mz:is_current":0},{"wof:id":1477930309,"wof:name":"A13","mz:is_current":0},{"wof:id":1477930319,"wof:name":"C3","mz:is_current":0},{"wof:id":1477930321,"wof:name":"C4","mz:is_current":0},{"wof:id":1477930323,"wof:name":"C5","mz:is_current":0},{"wof:id":1477930325,"wof:name":"C6","mz:is_current":0},{"wof:id":1477930327,"wof:name":"C7","mz:is_current":0},{"wof:id":1477930331,"wof:name":"C8","mz:is_current":0},{"wof:id":1477930335,"wof:name":"C10","mz:is_current":0},{"wof:id":1477930315,"wof:name":"A15","mz:is_current":0},{"wof:id":1477930337,"wof:name":"C11","mz:is_current":0},{"wof:id":1477930333,"wof:name":"C9","mz:is_current":0},{"wof:id":1477930317,"wof:name":"C2","mz:is_current":0},{"wof:id":1477930339,"wof:name":"D1","mz:is_current":0},{"wof:id":1477930341,"wof:name":"D2","mz:is_current":0},{"wof:id":1477930343,"wof:name":"D3","mz:is_current":0},{"wof:id":1477930351,"wof:name":"D6","mz:is_current":0},{"wof:id":1477930345,"wof:name":"D4","mz:is_current":0},{"wof:id":1477930353,"wof:name":"D7","mz:is_current":0},{"wof:id":1477930349,"wof:name":"D5","mz:is_current":0},{"wof:id":1477930355,"wof:name":"D8","mz:is_current":0},{"wof:id":1477930359,"wof:name":"D10","mz:is_current":0},{"wof:id":1477930357,"wof:name":"D9","mz:is_current":0},{"wof:id":1477930361,"wof:name":"D11","mz:is_current":0},{"wof:id":1477930363,"wof:name":"D12","mz:is_current":0},{"wof:id":1477930369,"wof:name":"D15","mz:is_current":0},{"wof:id":1477930367,"wof:name":"D14","mz:is_current":0},{"wof:id":1477930371,"wof:name":"D16","mz:is_current":0},{"wof:id":1477930373,"wof:name":"D17","mz:is_current":0},{"wof:id":1477930381,"wof:name":"E3","mz:is_current":0},{"wof:id":1477930387,"wof:name":"E5","mz:is_current":0},{"wof:id":1477930385,"wof:name":"E4","mz:is_current":0},{"wof:id":1477930389,"wof:name":"E6","mz:is_current":0},{"wof:id":1477930375,"wof:name":"D18","mz:is_current":0},{"wof:id":1477930377,"wof:name":"E1","mz:is_current":0},{"wof:id":1477930379,"wof:name":"E2","mz:is_current":0},{"wof:id":1477930391,"wof:name":"E7","mz:is_current":0},{"wof:id":1477930393,"wof:name":"E8","mz:is_current":0},{"wof:id":1477930395,"wof:name":"E9","mz:is_current":0},{"wof:id":1477930397,"wof:name":"E10","mz:is_current":0},{"wof:id":1477930399,"wof:name":"E11","mz:is_current":0},{"wof:id":1477930403,"wof:name":"E12","mz:is_current":0},{"wof:id":1477930405,"wof:name":"E13","mz:is_current":0},{"wof:id":1477930407,"wof:name":"F1","mz:is_current":0},{"wof:id":1477930409,"wof:name":"F2","mz:is_current":0},{"wof:id":1477930421,"wof:name":"F5","mz:is_current":0},{"wof:id":1477930411,"wof:name":"F3","mz:is_current":0},{"wof:id":1477930413,"wof:name":"F3A","mz:is_current":0},{"wof:id":1477930415,"wof:name":"F4","mz:is_current":0},{"wof:id":1477930417,"wof:name":"F5","mz:is_current":0},{"wof:id":1477930423,"wof:name":"F6","mz:is_current":0},{"wof:id":1477930425,"wof:name":"F7","mz:is_current":0},{"wof:id":1477930429,"wof:name":"F9","mz:is_current":0},{"wof:id":1477930441,"wof:name":"F14","mz:is_current":0},{"wof:id":1477930427,"wof:name":"F8","mz:is_current":0},{"wof:id":1477930451,"wof:name":"F19","mz:is_current":0},{"wof:id":1477930453,"wof:name":"F20","mz:is_current":0},{"wof:id":1477930443,"wof:name":"F15","mz:is_current":0},{"wof:id":1477930445,"wof:name":"F16","mz:is_current":0},{"wof:id":1477930447,"wof:name":"F17","mz:is_current":0},{"wof:id":1477930457,"wof:name":"F21","mz:is_current":0},{"wof:id":1477930459,"wof:name":"F22","mz:is_current":0},{"wof:id":1477930449,"wof:name":"F18","mz:is_current":0},{"wof:id":1477930461,"wof:name":"G1","mz:is_current":0},{"wof:id":1477930463,"wof:name":"G2","mz:is_current":0},{"wof:id":1477930465,"wof:name":"G3","mz:is_current":0},{"wof:id":1477930469,"wof:name":"G5","mz:is_current":0},{"wof:id":1477930471,"wof:name":"G6","mz:is_current":0},{"wof:id":1477930475,"wof:name":"G7","mz:is_current":0},{"wof:id":1477930477,"wof:name":"G8","mz:is_current":0},{"wof:id":1477930481,"wof:name":"G10","mz:is_current":0},{"wof:id":1477930479,"wof:name":"G9","mz:is_current":0},{"wof:id":1477930483,"wof:name":"G11","mz:is_current":0},{"wof:id":1477930467,"wof:name":"G4","mz:is_current":0},{"wof:id":1477930487,"wof:name":"G13","mz:is_current":0},{"wof:id":1477930485,"wof:name":"G12","mz:is_current":0},{"wof:id":1477930489,"wof:name":"G14","mz:is_current":0},{"wof:id":1477930431,"wof:name":"F10","mz:is_current":0},{"wof:id":1477930433,"wof:name":"F11","mz:is_current":0},{"wof:id":1477930435,"wof:name":"F12","mz:is_current":0},{"wof:id":1477930439,"wof:name":"F13","mz:is_current":0},{"wof:id":1729792401,"wof:name":"D4","mz:is_current":0},{"wof:id":1729792393,"wof:name":"D1","mz:is_current":0},{"wof:id":1729792403,"wof:name":"D5","mz:is_current":0},{"wof:id":1729792397,"wof:name":"D2","mz:is_current":0},{"wof:id":1729792405,"wof:name":"D6","mz:is_current":0},{"wof:id":1729792407,"wof:name":"D7","mz:is_current":0},{"wof:id":1729792399,"wof:name":"D3","mz:is_current":0},{"wof:id":1729792409,"wof:name":"D8","mz:is_current":0},{"wof:id":1729792415,"wof:name":"D11","mz:is_current":0},{"wof:id":1729792411,"wof:name":"D9","mz:is_current":0},{"wof:id":1729792417,"wof:name":"D10","mz:is_current":0},{"wof:id":1729792421,"wof:name":"D14","mz:is_current":0},{"wof:id":1729792423,"wof:name":"D15","mz:is_current":0},{"wof:id":1729792425,"wof:name":"D16","mz:is_current":0},{"wof:id":1729792439,"wof:name":"B6","mz:is_current":0},{"wof:id":1729792427,"wof:name":"D17","mz:is_current":0},{"wof:id":1729792441,"wof:name":"B7","mz:is_current":0},{"wof:id":1729792443,"wof:name":"B8","mz:is_current":0},{"wof:id":1729792429,"wof:name":"D18","mz:is_current":0},{"wof:id":1729792445,"wof:name":"B9","mz:is_current":0},{"wof:id":1729792447,"wof:name":"B12","mz:is_current":0},{"wof:id":1729792461,"wof:name":"C2","mz:is_current":0},{"wof:id":1729792451,"wof:name":"B13","mz:is_current":0},{"wof:id":1729792463,"wof:name":"C4","mz:is_current":0},{"wof:id":1729792453,"wof:name":"B14","mz:is_current":0},{"wof:id":1729792455,"wof:name":"B17","mz:is_current":0},{"wof:id":1729792465,"wof:name":"C3","mz:is_current":0},{"wof:id":1729792471,"wof:name":"C6","mz:is_current":0},{"wof:id":1729792457,"wof:name":"B18","mz:is_current":0},{"wof:id":1729792469,"wof:name":"C5","mz:is_current":0},{"wof:id":1729792473,"wof:name":"C7","mz:is_current":0},{"wof:id":1729792475,"wof:name":"C8","mz:is_current":0},{"wof:id":1729792477,"wof:name":"C9","mz:is_current":0},{"wof:id":1729792479,"wof:name":"C10","mz:is_current":0},{"wof:id":1729792491,"wof:name":"F5","mz:is_current":0},{"wof:id":1729792419,"wof:name":"D12","mz:is_current":0},{"wof:id":1729792493,"wof:name":"E1","mz:is_current":0},{"wof:id":1729792481,"wof:name":"C11","mz:is_current":0},{"wof:id":1729792501,"wof:name":"F2","mz:is_current":0},{"wof:id":1729792495,"wof:name":"E2","mz:is_current":0},{"wof:id":1729792505,"wof:name":"F3","mz:is_current":0},{"wof:id":1729792497,"wof:name":"E3","mz:is_current":0},{"wof:id":1729792507,"wof:name":"F4","mz:is_current":0},{"wof:id":1729792499,"wof:name":"F1","mz:is_current":0},{"wof:id":1729792509,"wof:name":"F3A","mz:is_current":0},{"wof:id":1729792511,"wof:name":"F5","mz:is_current":0},{"wof:id":1729792513,"wof:name":"F6","mz:is_current":0},{"wof:id":1729792515,"wof:name":"F7","mz:is_current":0},{"wof:id":1729792519,"wof:name":"F9","mz:is_current":0},{"wof:id":1729792523,"wof:name":"F10","mz:is_current":0},{"wof:id":1729792531,"wof:name":"F14","mz:is_current":0},{"wof:id":1729792525,"wof:name":"F11","mz:is_current":0},{"wof:id":1729792517,"wof:name":"F8","mz:is_current":0},{"wof:id":1729792527,"wof:name":"F13","mz:is_current":0},{"wof:id":1729792533,"wof:name":"F15","mz:is_current":0},{"wof:id":1729792535,"wof:name":"F16","mz:is_current":0},{"wof:id":1729792529,"wof:name":"F12","mz:is_current":0},{"wof:id":1729792537,"wof:name":"F17","mz:is_current":0},{"wof:id":1729792541,"wof:name":"F18","mz:is_current":0},{"wof:id":1729792543,"wof:name":"F19","mz:is_current":0},{"wof:id":1729792545,"wof:name":"F20","mz:is_current":0},{"wof:id":1729792547,"wof:name":"F21","mz:is_current":0},{"wof:id":1729792549,"wof:name":"F22","mz:is_current":0},{"wof:id":1729792553,"wof:name":"E4","mz:is_current":0},{"wof:id":1729792555,"wof:name":"E5","mz:is_current":0},{"wof:id":1729792559,"wof:name":"E6","mz:is_current":0},{"wof:id":1729792561,"wof:name":"E7","mz:is_current":0},{"wof:id":1729792563,"wof:name":"E8","mz:is_current":0},{"wof:id":1729792565,"wof:name":"E9","mz:is_current":0},{"wof:id":1729792567,"wof:name":"E10","mz:is_current":0},{"wof:id":1729792569,"wof:name":"E11","mz:is_current":0},{"wof:id":1729792571,"wof:name":"E12","mz:is_current":0},{"wof:id":1729792573,"wof:name":"E13","mz:is_current":0},{"wof:id":1729792583,"wof:name":"A2","mz:is_current":0},{"wof:id":1729792591,"wof:name":"A6","mz:is_current":0},{"wof:id":1729792585,"wof:name":"A4","mz:is_current":0},{"wof:id":1729792595,"wof:name":"A10","mz:is_current":0},{"wof:id":1729792599,"wof:name":"A8","mz:is_current":0},{"wof:id":1729792587,"wof:name":"A5","mz:is_current":0},{"wof:id":1729792597,"wof:name":"A9","mz:is_current":0},{"wof:id":1729792589,"wof:name":"A7","mz:is_current":0},{"wof:id":1729792601,"wof:name":"A12","mz:is_current":0},{"wof:id":1729792603,"wof:name":"A11","mz:is_current":0},{"wof:id":1729792605,"wof:name":"A3","mz:is_current":0},{"wof:id":1729792607,"wof:name":"A1","mz:is_current":0},{"wof:id":1729792609,"wof:name":"A1","mz:is_current":0},{"wof:id":1729792621,"wof:name":"A6","mz:is_current":0},{"wof:id":1729792613,"wof:name":"A2","mz:is_current":0},{"wof:id":1729792623,"wof:name":"A8","mz:is_current":0},{"wof:id":1729792615,"wof:name":"A3","mz:is_current":0},{"wof:id":1729792625,"wof:name":"A7","mz:is_current":0},{"wof:id":1729792617,"wof:name":"A4","mz:is_current":0},{"wof:id":1729792627,"wof:name":"A9","mz:is_current":0},{"wof:id":1729792619,"wof:name":"A5","mz:is_current":0},{"wof:id":1729792631,"wof:name":"A10","mz:is_current":0},{"wof:id":1729792633,"wof:name":"A11","mz:is_current":0},{"wof:id":1729792635,"wof:name":"A12","mz:is_current":0},{"wof:id":1729792637,"wof:name":"A13","mz:is_current":0},{"wof:id":1729792639,"wof:name":"A14","mz:is_current":0},{"wof:id":1729792649,"wof:name":"G1","mz:is_current":0},{"wof:id":1729792651,"wof:name":"G2","mz:is_current":0},{"wof:id":1729792653,"wof:name":"G3","mz:is_current":0},{"wof:id":1729792657,"wof:name":"G5","mz:is_current":0},{"wof:id":1729792641,"wof:name":"A15","mz:is_current":0},{"wof:id":1729792655,"wof:name":"G4","mz:is_current":0},{"wof:id":1729792659,"wof:name":"G6","mz:is_current":0},{"wof:id":1729792661,"wof:name":"G7","mz:is_current":0},{"wof:id":1729792663,"wof:name":"G10","mz:is_current":0},{"wof:id":1729792667,"wof:name":"G8","mz:is_current":0},{"wof:id":1729792673,"wof:name":"G12","mz:is_current":0},{"wof:id":1729792669,"wof:name":"G11","mz:is_current":0},{"wof:id":1729792675,"wof:name":"G13","mz:is_current":0},{"wof:id":1729792677,"wof:name":"G14","mz:is_current":0},{"wof:id":1729792671,"wof:name":"G9","mz:is_current":0},{"wof:id":1729792723,"wof:name":"B10","mz:is_current":0},{"wof:id":1729792725,"wof:name":"B25","mz:is_current":0},{"wof:id":1729792727,"wof:name":"B11","mz:is_current":0},{"wof:id":1729792729,"wof:name":"B24","mz:is_current":0},{"wof:id":1729792731,"wof:name":"C1","mz:is_current":1},{"wof:id":1729792733,"wof:name":"B26","mz:is_current":0},{"wof:id":1729792735,"wof:name":"B1","mz:is_current":0},{"wof:id":1729792739,"wof:name":"B22","mz:is_current":0},{"wof:id":1729792741,"wof:name":"B21","mz:is_current":0},{"wof:id":1729792743,"wof:name":"B19","mz:is_current":0},{"wof:id":1729792745,"wof:name":"B20","mz:is_current":0},{"wof:id":1729792747,"wof:name":"B5","mz:is_current":1},{"wof:id":1729792749,"wof:name":"B4","mz:is_current":0},{"wof:id":1729792751,"wof:name":"B23","mz:is_current":0},{"wof:id":1729792753,"wof:name":"B16","mz:is_current":0},{"wof:id":1729792757,"wof:name":"B2","mz:is_current":0},{"wof:id":1729792759,"wof:name":"B3","mz:is_current":0},{"wof:id":1729792761,"wof:name":"B15","mz:is_current":0},{"wof:id":1729792763,"wof:name":"B27","mz:is_current":0},{"wof:id":1745882089,"wof:name":"D1","mz:is_current":0},{"wof:id":1745882093,"wof:name":"D2","mz:is_current":0},{"wof:id":1745882095,"wof:name":"D3","mz:is_current":0},{"wof:id":1745882097,"wof:name":"D4","mz:is_current":0},{"wof:id":1745882099,"wof:name":"D5","mz:is_current":0},{"wof:id":1745882101,"wof:name":"D6","mz:is_current":0},{"wof:id":1745882103,"wof:name":"D7","mz:is_current":0},{"wof:id":1745882105,"wof:name":"D9","mz:is_current":0},{"wof:id":1745882111,"wof:name":"D11","mz:is_current":0},{"wof:id":1745882107,"wof:name":"D8","mz:is_current":0},{"wof:id":1745882113,"wof:name":"D10","mz:is_current":0},{"wof:id":1745882115,"wof:name":"D12","mz:is_current":0},{"wof:id":1745882117,"wof:name":"D14","mz:is_current":0},{"wof:id":1745882119,"wof:name":"D15","mz:is_current":0},{"wof:id":1745882121,"wof:name":"D16","mz:is_current":0},{"wof:id":1745882123,"wof:name":"D17","mz:is_current":0},{"wof:id":1745882125,"wof:name":"D18","mz:is_current":0},{"wof:id":1745882141,"wof:name":"B6","mz:is_current":0},{"wof:id":1745882143,"wof:name":"B7","mz:is_current":0},{"wof:id":1745882147,"wof:name":"B8","mz:is_current":0},{"wof:id":1745882149,"wof:name":"B9","mz:is_current":0},{"wof:id":1745882151,"wof:name":"B12","mz:is_current":0},{"wof:id":1745882153,"wof:name":"B13","mz:is_current":0},{"wof:id":1745882155,"wof:name":"B14","mz:is_current":0},{"wof:id":1745882157,"wof:name":"B17","mz:is_current":0},{"wof:id":1745882159,"wof:name":"B18","mz:is_current":0},{"wof:id":1745882161,"wof:name":"B10","mz:is_current":0},{"wof:id":1745882171,"wof:name":"B26","mz:is_current":0},{"wof:id":1745882165,"wof:name":"B25","mz:is_current":0},{"wof:id":1745882173,"wof:name":"B22","mz:is_current":0},{"wof:id":1745882167,"wof:name":"B11","mz:is_current":0},{"wof:id":1745882175,"wof:name":"B21","mz:is_current":0},{"wof:id":1745882177,"wof:name":"B19","mz:is_current":0},{"wof:id":1745882169,"wof:name":"B24","mz:is_current":0},{"wof:id":1745882179,"wof:name":"B20","mz:is_current":0},{"wof:id":1745882183,"wof:name":"B4","mz:is_current":0},{"wof:id":1745882185,"wof:name":"B23","mz:is_current":0},{"wof:id":1745882187,"wof:name":"B16","mz:is_current":0},{"wof:id":1745882189,"wof:name":"B3","mz:is_current":0},{"wof:id":1746415337,"wof:name":"C10R","mz:is_current":1},{"wof:id":1745882191,"wof:name":"B15","mz:is_current":0},{"wof:id":1746415339,"wof:name":"A13R","mz:is_current":1},{"wof:id":1745882193,"wof:name":"B27","mz:is_current":0},{"wof:id":1745882197,"wof:name":"C2","mz:is_current":0},{"wof:id":1746415343,"wof:name":"G12S","mz:is_current":1},{"wof:id":1746415345,"wof:name":"G12V","mz:is_current":1},{"wof:id":1746415347,"wof:name":"F15M","mz:is_current":1},{"wof:id":1746415349,"wof:name":"C4U","mz:is_current":1},{"wof:id":1745882201,"wof:name":"C4","mz:is_current":0},{"wof:id":1745882203,"wof:name":"C3","mz:is_current":0},{"wof:id":1745882205,"wof:name":"C5","mz:is_current":0},{"wof:id":1746415351,"wof:name":"C10T","mz:is_current":1},{"wof:id":1745882207,"wof:name":"C6","mz:is_current":0},{"wof:id":1746415353,"wof:name":"A1V","mz:is_current":1},{"wof:id":1745882209,"wof:name":"C7","mz:is_current":0},{"wof:id":1746415355,"wof:name":"E13T","mz:is_current":1},{"wof:id":1746415357,"wof:name":"G13R","mz:is_current":1},{"wof:id":1745882213,"wof:name":"C9","mz:is_current":0},{"wof:id":1745882211,"wof:name":"C8","mz:is_current":0},{"wof:id":1745882219,"wof:name":"C11","mz:is_current":0},{"wof:id":1745882215,"wof:name":"C10","mz:is_current":0},{"wof:id":1746415361,"wof:name":"A13V","mz:is_current":1},{"wof:id":1746415363,"wof:name":"E10V","mz:is_current":1},{"wof:id":1746415365,"wof:name":"A1T","mz:is_current":1},{"wof:id":1746415367,"wof:name":"G11R","mz:is_current":1},{"wof:id":1746415369,"wof:name":"B23V","mz:is_current":1},{"wof:id":1745882229,"wof:name":"B1","mz:is_current":1},{"wof:id":1745882231,"wof:name":"B2","mz:is_current":0},{"wof:id":1745882239,"wof:name":"F5","mz:is_current":0},{"wof:id":1745882241,"wof:name":"E1","mz:is_current":0},{"wof:id":1746415371,"wof:name":"A7T","mz:is_current":1},{"wof:id":1745882243,"wof:name":"E2","mz:is_current":0},{"wof:id":1746415373,"wof:name":"B27V","mz:is_current":1},{"wof:id":1746415375,"wof:name":"F15L","mz:is_current":1},{"wof:id":1745882245,"wof:name":"E3","mz:is_current":0},{"wof:id":1746415381,"wof:name":"A13S","mz:is_current":1},{"wof:id":1745882247,"wof:name":"F1","mz:is_current":0},{"wof:id":1746415379,"wof:name":"F15N","mz:is_current":1},{"wof:id":1746415383,"wof:name":"G104","mz:is_current":1},{"wof:id":1745882249,"wof:name":"F2","mz:is_current":0},{"wof:id":1746415385,"wof:name":"G13S","mz:is_current":1},{"wof:id":1746415387,"wof:name":"G103","mz:is_current":1},{"wof:id":1746415389,"wof:name":"A6S","mz:is_current":1},{"wof:id":1746415391,"wof:name":"A4R","mz:is_current":1},{"wof:id":1745882251,"wof:name":"F3","mz:is_current":0},{"wof:id":1746415393,"wof:name":"G14T","mz:is_current":1},{"wof:id":1745882255,"wof:name":"F4","mz:is_current":0},{"wof:id":1746415397,"wof:name":"G12T","mz:is_current":1},{"wof:id":1745882263,"wof:name":"F8","mz:is_current":0},{"wof:id":1745882259,"wof:name":"F5","mz:is_current":0},{"wof:id":1745882275,"wof:name":"F13","mz:is_current":0},{"wof:id":1745882269,"wof:name":"F10","mz:is_current":0},{"wof:id":1745882281,"wof:name":"F15","mz:is_current":0},{"wof:id":1745882291,"wof:name":"F19","mz:is_current":0},{"wof:id":1745882295,"wof:name":"F21","mz:is_current":0},{"wof:id":1745882301,"wof:name":"E4","mz:is_current":0},{"wof:id":1745882305,"wof:name":"E6","mz:is_current":0},{"wof:id":1745882371,"wof:name":"A3","mz:is_current":0},{"wof:id":1745882377,"wof:name":"A6","mz:is_current":0},{"wof:id":1745882363,"wof:name":"A3","mz:is_current":0},{"wof:id":1745882391,"wof:name":"A11","mz:is_current":0},{"wof:id":1745882393,"wof:name":"A13","mz:is_current":0},{"wof:id":1745882399,"wof:name":"A15","mz:is_current":0},{"wof:id":1745882383,"wof:name":"A7","mz:is_current":0},{"wof:id":1745882431,"wof:name":"G13","mz:is_current":0},{"wof:id":1745882419,"wof:name":"G7","mz:is_current":0},{"wof:id":1745882429,"wof:name":"G12","mz:is_current":0},{"wof:id":1763588153,"wof:name":"D12","mz:is_current":1},{"wof:id":1763588131,"wof:name":"D3","mz:is_current":1},{"wof:id":1763588155,"wof:name":"D14","mz:is_current":1},{"wof:id":1763588181,"wof:name":"B7","mz:is_current":1},{"wof:id":1763588183,"wof:name":"B8","mz:is_current":1},{"wof:id":1763588211,"wof:name":"B15","mz:is_current":1},{"wof:id":1763588231,"wof:name":"B3","mz:is_current":1},{"wof:id":1763588213,"wof:name":"B22","mz:is_current":1},{"wof:id":1763588251,"wof:name":"C9","mz:is_current":1},{"wof:id":1763588253,"wof:name":"C10","mz:is_current":1},{"wof:id":1763588275,"wof:name":"E1","mz:is_current":1},{"wof:id":1763588291,"wof:name":"F3A","mz:is_current":1},{"wof:id":1763588293,"wof:name":"F5","mz:is_current":1},{"wof:id":1763588301,"wof:name":"F7","mz:is_current":1},{"wof:id":1763588309,"wof:name":"F13","mz:is_current":1},{"wof:id":1763588321,"wof:name":"F17","mz:is_current":1},{"wof:id":1763588339,"wof:name":"E5","mz:is_current":1},{"wof:id":1763588343,"wof:name":"E7","mz:is_current":1},{"wof:id":1763588341,"wof:name":"E6","mz:is_current":1},{"wof:id":1763588381,"wof:name":"A6","mz:is_current":1},{"wof:id":1763588389,"wof:name":"A1","mz:is_current":1},{"wof:id":1763588391,"wof:name":"A8","mz:is_current":1},{"wof:id":1763588401,"wof:name":"A1","mz:is_current":1},{"wof:id":1763588431,"wof:name":"A10","mz:is_current":1},{"wof:id":1763588423,"wof:name":"A13","mz:is_current":1},{"wof:id":1763588441,"wof:name":"G2","mz:is_current":1},{"wof:id":1763588445,"wof:name":"G4","mz:is_current":1},{"wof:id":1763588449,"wof:name":"G6","mz:is_current":1},{"wof:id":1159157603,"wof:name":"A10A","mz:is_current":0},{"wof:id":1159157605,"wof:name":"A11B","mz:is_current":0},{"wof:id":1159157621,"wof:name":"G95","mz:is_current":0},{"wof:id":1159157641,"wof:name":"A4","mz:is_current":0},{"wof:id":1159157651,"wof:name":"D58B","mz:is_current":0},{"wof:id":1159157657,"wof:name":"G96","mz:is_current":0},{"wof:id":1159157659,"wof:name":"F73","mz:is_current":0},{"wof:id":1159157631,"wof:name":"A8","mz:is_current":0},{"wof:id":1159157695,"wof:name":"F84C","mz:is_current":0},{"wof:id":1159157667,"wof:name":"A1B","mz:is_current":0},{"wof:id":1159157661,"wof:name":"C44","mz:is_current":0},{"wof:id":1159157689,"wof:name":"F84B","mz:is_current":0},{"wof:id":1159157703,"wof:name":"D51A","mz:is_current":0},{"wof:id":1159157713,"wof:name":"B25","mz:is_current":0},{"wof:id":1159157721,"wof:name":"F70","mz:is_current":0},{"wof:id":1159157751,"wof:name":"F88","mz:is_current":0},{"wof:id":1159157761,"wof:name":"F82","mz:is_current":0},{"wof:id":1159157757,"wof:name":"F81","mz:is_current":0},{"wof:id":1159157771,"wof:name":"E62","mz:is_current":0},{"wof:id":1159157791,"wof:name":"D58A","mz:is_current":0},{"wof:id":1159157787,"wof:name":"E67A","mz:is_current":0},{"wof:id":1159157801,"wof:name":"D57","mz:is_current":0},{"wof:id":1159157779,"wof:name":"G92","mz:is_current":0},{"wof:id":1159157813,"wof:name":"B23","mz:is_current":0},{"wof:id":1159157841,"wof:name":"G99X","mz:is_current":0},{"wof:id":1159157845,"wof:name":"C42A","mz:is_current":0},{"wof:id":1159157857,"wof:name":"C40","mz:is_current":0},{"wof:id":1159157859,"wof:name":"B28","mz:is_current":0},{"wof:id":1159157861,"wof:name":"F83","mz:is_current":0}] diff --git a/go.mod b/go.mod index 2eae6d3..cb38fd7 100644 --- a/go.mod +++ b/go.mod @@ -5,17 +5,17 @@ go 1.16 require ( github.com/aaronland/go-roster v0.0.2 github.com/aaronland/go-sqlite v0.1.1 - github.com/paulmach/orb v0.5.0 + github.com/paulmach/orb v0.6.0 github.com/sfomuseum/go-sfomuseum-reader v0.0.2 github.com/sfomuseum/go-sfomuseum-writer v0.2.7 github.com/tidwall/gjson v1.14.1 - github.com/whosonfirst/go-reader v0.10.0 - github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.2 - github.com/whosonfirst/go-whosonfirst-feature v0.0.20 + github.com/whosonfirst/go-reader v0.11.0 + github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.3 + github.com/whosonfirst/go-whosonfirst-feature v0.0.23 github.com/whosonfirst/go-whosonfirst-id v0.0.4 github.com/whosonfirst/go-whosonfirst-iterate/v2 v2.0.2 - github.com/whosonfirst/go-whosonfirst-sqlite-features v0.9.4 - github.com/whosonfirst/go-whosonfirst-sqlite-features-index v1.4.6 + github.com/whosonfirst/go-whosonfirst-sqlite-features v0.10.0 + github.com/whosonfirst/go-whosonfirst-sqlite-features-index v1.5.0 github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1 github.com/whosonfirst/go-whosonfirst-uri v1.2.0 github.com/whosonfirst/go-writer v0.8.0 diff --git a/go.sum b/go.sum index 2764d92..f33053f 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,5 @@ -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= github.com/aaronland/go-artisanal-integers v0.1.0/go.mod h1:00F0qOpuZZkzWiSSEQYk6Ul1Oc5kwgcYgsfYRmuR+wY= github.com/aaronland/go-artisanal-integers v0.1.1 h1:bLQmWqcqgPT1NOJFwJtZZ9O/QTnttO54ODiWIVuOW1Y= @@ -32,7 +26,6 @@ github.com/aaronland/go-pool v1.0.0/go.mod h1:5EzZAfp1v2N+EyyGQ3868fxNxBL5+b4OUm github.com/aaronland/go-roster v0.0.1/go.mod h1:AcovpxlG1XxJxX2Fjqlm63fEIBhCjEIBV4lP87FZDmI= github.com/aaronland/go-roster v0.0.2 h1:2Fu7v4VQLRLRL/Zgr6R9S5JxsW75Ab/K88QtMVX532s= github.com/aaronland/go-roster v0.0.2/go.mod h1:AcovpxlG1XxJxX2Fjqlm63fEIBhCjEIBV4lP87FZDmI= -github.com/aaronland/go-sqlite v0.1.0/go.mod h1:/Q4BWbsdgHtQY+99oxaeCj4TwGc8qyAN8CUyF2JK0xg= github.com/aaronland/go-sqlite v0.1.1 h1:bqObBiGw3K01Nq9Zt2NtFTESHSoNVd5ZaLc+FYVivhI= github.com/aaronland/go-sqlite v0.1.1/go.mod h1:EoqGJ9v4WGF9Gwln7g6b0ANsIED2sBit7p4VMtnD/yU= github.com/aaronland/go-string v0.1.1/go.mod h1:2aMIWdTqk63jZsaLLy+p9dsB1MDRqx4sHYoLtkwyYUo= @@ -53,17 +46,13 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aws/aws-lambda-go v1.9.0/go.mod h1:zUsUQhAUjYzR8AuduJPCfhBuKWUaDbQiPOG+ouzmE1A= github.com/aws/aws-lambda-go v1.10.0/go.mod h1:zUsUQhAUjYzR8AuduJPCfhBuKWUaDbQiPOG+ouzmE1A= -github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/g8rswimmer/error-chain v1.0.0 h1:WnwnunlvqtGPHVHmBfbmUyAgrtag8Y6nNpwLWmtSYOQ= @@ -78,16 +67,12 @@ github.com/go-ini/ini v1.42.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3I github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce h1:prjrVgOk2Yg6w+PflHoszQNLTUh4kaByUcEWM/9uin4= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874 h1:em+tTnzgU7N22woTBMcSJAOW7tRHAkK597W+MD/CpK8= github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= @@ -96,35 +81,26 @@ github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/geohash v0.10.0 h1:9w1HchfDfdeLc+jFEf/04D27KP7E2QmpDu52wPbJWRE= github.com/mmcloughlin/geohash v0.10.0/go.mod h1:oNZxQo5yWJh0eMQEP/8hwQuVx9Z9tjwFUqcTB1SmG0c= github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/ory/dockertest/v3 v3.6.0/go.mod h1:4ZOpj8qBUmh8fcBSVzkH2bws2s91JdGvHUqan4GHEuQ= github.com/paulmach/go.geojson v1.4.0 h1:5x5moCkCtDo5x8af62P9IOAYGQcYHtxz2QJ3x1DoCgY= github.com/paulmach/go.geojson v1.4.0/go.mod h1:YaKx1hKpWF+T2oj2lFJPsW/t1Q5e1jQI61eoQSTwpIs= github.com/paulmach/orb v0.4.0/go.mod h1:FkcWtplUAIVqAuhAOV2d3rpbnQyliDOjOcLW9dUrfdU= -github.com/paulmach/orb v0.5.0 h1:sNhJV5ML+mv1F077ljOck/9inorF4ahDO8iNNpHbKHY= github.com/paulmach/orb v0.5.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= +github.com/paulmach/orb v0.6.0 h1:QqsQkeYM3zzr3ANUHWBoo8zvK1CATO4G9pYmKoCAgnM= +github.com/paulmach/orb v0.6.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= github.com/paulmach/protoscan v0.2.1-0.20210522164731-4e53c6875432/go.mod h1:2sV+uZ/oQh66m4XJVZm5iqUZ62BN88Ex1E+TTS0nLzI= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -136,8 +112,9 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sfomuseum/go-edtf v0.2.2/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= github.com/sfomuseum/go-edtf v0.2.3/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= -github.com/sfomuseum/go-edtf v0.3.1 h1:22DEXVvGhnpF7PD4dvpgKH0/oD8u9I+a4cXCwy1x2f4= github.com/sfomuseum/go-edtf v0.3.1/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= +github.com/sfomuseum/go-edtf v1.0.0 h1:pU76aSrBgRTaKK/RzEESYDU+YcGNbBk/XKwEMr4qXmE= +github.com/sfomuseum/go-edtf v1.0.0/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= github.com/sfomuseum/go-flags v0.7.0/go.mod h1:ML3DTNbF9xnjExSdS/9FtVLjIUhRU5gm/ehzISv+t2w= github.com/sfomuseum/go-sfomuseum-export/v2 v2.3.6 h1:EF3N7AyGTDxo/yoXFhLnY/I0qH/g5DjVS1QMzasxOf8= github.com/sfomuseum/go-sfomuseum-export/v2 v2.3.6/go.mod h1:WWJDFbaouciMMx7+70FkC/iyxum9ElV8TvcBPNDOgLE= @@ -148,12 +125,10 @@ github.com/sfomuseum/go-sfomuseum-reader v0.0.2/go.mod h1:ixmpeo1E4fHGiXPBxC+DQ1 github.com/sfomuseum/go-sfomuseum-writer v0.2.7 h1:ng+8lN13O7ckCJI5hZR4tDSvgYV3nNAAgTLiT76nkds= github.com/sfomuseum/go-sfomuseum-writer v0.2.7/go.mod h1:hqk8Tgx/NTDskkSHRohbAX/cJ7gmrRDGd4DIof4Q7pA= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/skelterjohn/geom v0.0.0-20180103142417-96f3e8a219c5 h1:qQF/q/+xaKD4CAVz3zfuvpij8U4ihSGIhHfOROI4NFc= github.com/skelterjohn/geom v0.0.0-20180103142417-96f3e8a219c5/go.mod h1:w8cQIijHlvvZM7afYlixPThHAdD+AkRFw3Mb9yQ2Y+I= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -167,10 +142,8 @@ github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1H github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= @@ -184,18 +157,15 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.4 h1:cuiLzLnaMeBhRmEv00Lpk3tkYrcxpmbU81tAY4Dw0tc= github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= -github.com/twpayne/go-geom v1.4.1 h1:LeivFqaGBRfyg0XJJ9pkudcptwhSSrYN9KZUW6HcgdA= -github.com/twpayne/go-geom v1.4.1/go.mod h1:k/zktXdL+qnA6OgKsdEGUTA17jbQ2ZPTUa3CCySuGpE= -github.com/twpayne/go-kml v1.5.2/go.mod h1:kz8jAiIz6FIdU2Zjce9qGlVtgFYES9vt7BTPBHf5jl4= -github.com/twpayne/go-polyline v1.0.0/go.mod h1:ICh24bcLYBX8CknfvNPKqoTbe+eg+MX1NPyJmSBo7pU= -github.com/twpayne/go-waypoint v0.0.0-20200706203930-b263a7f6e4e8/go.mod h1:qj5pHncxKhu9gxtZEYWypA/z097sxhFlbTyOyt9gcnU= github.com/whosonfirst/algnhsa v0.1.0/go.mod h1:swLBXxaVTv3s6dJLhekdQCuCTshUew+xHjptRC21RG0= github.com/whosonfirst/go-ioutil v1.0.0/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= -github.com/whosonfirst/go-ioutil v1.0.1 h1:xITnQgEGdG+Qlph7jPY5htL7UpPSm2wEw1WiUlKTWPc= github.com/whosonfirst/go-ioutil v1.0.1/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= +github.com/whosonfirst/go-ioutil v1.0.2 h1:+GJPfa42OFn5A+5yJSc5jQTQIkNV3/MhYyg4pavdrC8= +github.com/whosonfirst/go-ioutil v1.0.2/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= github.com/whosonfirst/go-reader v0.9.1/go.mod h1:YNcxm9xr0++Jz4nXWZjtQ/RRVq0fCjq1CwJdmJgfOh8= -github.com/whosonfirst/go-reader v0.10.0 h1:RHQPNEqurYbI1N0SrqpUMMo0O4KTa5JSZi/sYGMtxig= github.com/whosonfirst/go-reader v0.10.0/go.mod h1:YNcxm9xr0++Jz4nXWZjtQ/RRVq0fCjq1CwJdmJgfOh8= +github.com/whosonfirst/go-reader v0.11.0 h1:CCk4sOMqP58zyVzcf2Q/FuBW5MW5CxSaNt6/Tek1LuI= +github.com/whosonfirst/go-reader v0.11.0/go.mod h1:sj+z1x90XEBy/QBy5nuBa7EGntGAC2QhbAW1Y1QZ5nM= github.com/whosonfirst/go-reader-http v0.3.0/go.mod h1:lxrCTVQlcysPs+P9USTB/QeedtZjd4olIdms5nGMkXs= github.com/whosonfirst/go-rfc-5646 v0.1.0 h1:HNFPAem6v5De61PXLgbGzx9tfNOP83AAkVvm9WAddJY= github.com/whosonfirst/go-rfc-5646 v0.1.0/go.mod h1:JZj//FV9YeV3fkyOY/82V53EMLQXwRwNPuQIGs8BUmo= @@ -203,19 +173,18 @@ github.com/whosonfirst/go-whosonfirst-cli v0.1.0/go.mod h1:Edy+amD+fMq1QS1yxB3u8 github.com/whosonfirst/go-whosonfirst-crawl v0.2.1 h1:nNG7r7/4MaII/NM8Df2oqgfgVNBDoIKlseleoX1vw1Q= github.com/whosonfirst/go-whosonfirst-crawl v0.2.1/go.mod h1:MTD1TCgAkXlAtysPU98ylrz9Y5+ZCfRrsrBnRyiH/t8= github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.1/go.mod h1:ZT5g5W34H4ymvxkSQXNJ+DPSl61J+u/5/uS9QxRLiPw= -github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.2 h1:7VK59x+khENOtu9V0qfpObAHbfFq6j67k/GFTzbjC+0= -github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.2/go.mod h1:ruEZ8HfXvc+krTXc4SdykS/c/benSEXSQekfZ+rnFjI= -github.com/whosonfirst/go-whosonfirst-feature v0.0.20 h1:6sMgbNvM9/PEFHB5LyDajdlCaYNT/1Uf4bxCIlUFFAE= -github.com/whosonfirst/go-whosonfirst-feature v0.0.20/go.mod h1:nCozCejA/5uCPLZjsSXOv6CLnm63U+QQJtkCafXIdBY= +github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.3 h1:Hxk0Uymr+20bd4uMPi8zPgoUmI6rjZG5+3rFnVbxrDU= +github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.3/go.mod h1:mMwqJGX9q/xpokzEcejfTVjsVlO8LMfN+519MRL1pEU= +github.com/whosonfirst/go-whosonfirst-feature v0.0.23 h1:/oklJJRMF5a75D7tYKueh1nQRBcejqZ2cnr0CdakYiQ= +github.com/whosonfirst/go-whosonfirst-feature v0.0.23/go.mod h1:3cvRigFFG2a99M64lZzfy5amHacWu8Os5fXZdGjPnLM= github.com/whosonfirst/go-whosonfirst-flags v0.2.0/go.mod h1:ECd0AJJZIlybmjTGB9z+CPz9pSiMTwxur7fPKmDnoqI= github.com/whosonfirst/go-whosonfirst-flags v0.4.2/go.mod h1:kewFjxBiE00SqjjIanm5DPI81SYvx93wVb3ogwV/PMk= github.com/whosonfirst/go-whosonfirst-flags v0.4.3 h1:ef6IkgvYADL4kc750sl6i5hkReNq0Z6upLcqpK2CHLY= github.com/whosonfirst/go-whosonfirst-flags v0.4.3/go.mod h1:pL17Ryo60FH8RYaQRgfu5XnxhrNRK3x+rn03TYD6Gc8= github.com/whosonfirst/go-whosonfirst-format v0.3.7 h1:SkiUt2s0LqvH5JP7586+Rz7SgKwtRoFt7aGfWFFemoI= github.com/whosonfirst/go-whosonfirst-format v0.3.7/go.mod h1:lMBIXCnD9ZA+wCNtu6XFYoq5DTfnEALO8k6OkEn11MM= +github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.3 h1:EaLfTJqWj7q3bVCNil+F9QtVylxiyWNlo09ZEUDtf+E= github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.3/go.mod h1:R3GximAGJWLCITU2eh3I5Vtyze/usjOl5LTGQCDI89Y= -github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4 h1:5FVbXC6PvohoxFAd2fXanmERwFjz9ExJIoj4mC+AAwM= -github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4/go.mod h1:nlnmDlcm3OjkKBihOIGdzWW8fSpR+ubD3JUSXLLG5y4= github.com/whosonfirst/go-whosonfirst-hash v0.1.0 h1:FpnclPIb+8M1uhSXfl3z8nYcG/3O59vgfkdV+m0hQpA= github.com/whosonfirst/go-whosonfirst-hash v0.1.0/go.mod h1:1ZdCFZTnQt5bwnsj2daB9yHilKOKToVh+Tyj/Z8TbUk= github.com/whosonfirst/go-whosonfirst-id v0.0.3/go.mod h1:JuDIBvv0gzygE83XjX8Ym7JnX6OTO1X1efikSwTh8Ic= @@ -235,15 +204,17 @@ github.com/whosonfirst/go-whosonfirst-placetypes v0.3.0/go.mod h1:ez0VFkGFbgT2/z github.com/whosonfirst/go-whosonfirst-pool v0.1.0/go.mod h1:6LeQYv7hVK16LVevMuOuaLRfgI3JDtaoVxaMMVqRS38= github.com/whosonfirst/go-whosonfirst-sources v0.1.0 h1:JuKLa6KWke22jBfJ1pM9WQHoz1/3pbDv2C+aR+THPPQ= github.com/whosonfirst/go-whosonfirst-sources v0.1.0/go.mod h1:EUMHyGzUmqPPxlMmOp+28BFeoBdxxE0HCKRd67lkqGM= -github.com/whosonfirst/go-whosonfirst-spr/v2 v2.0.0 h1:UQ1n/uODS50mckZpXYe5GKm8XwoUUC1jRcNN8oiW2uc= github.com/whosonfirst/go-whosonfirst-spr/v2 v2.0.0/go.mod h1:tveSSFDn8XoiCeAMarSCn769lA6e3Y0/Qi8S19Jz7Gw= -github.com/whosonfirst/go-whosonfirst-sqlite-features v0.9.3/go.mod h1:kBFrT6COGzqA15Hyunh43JucZKjFWHC/HyFHCemhra8= -github.com/whosonfirst/go-whosonfirst-sqlite-features v0.9.4 h1:SjYtnUTksGvzs8idtiOPZx3/g6h01Ze0mh8jENC/DjQ= -github.com/whosonfirst/go-whosonfirst-sqlite-features v0.9.4/go.mod h1:A8x/U3cHwrJKDGciiQX+clpPy/EWVL+xR36OExE9j34= -github.com/whosonfirst/go-whosonfirst-sqlite-features-index v1.4.6 h1:b/7dX+2IVBLkukOp4thlA+fGViXqxl5rQZhn80qB+b8= -github.com/whosonfirst/go-whosonfirst-sqlite-features-index v1.4.6/go.mod h1:PsIx1wstPufNYFFbC5Ia5JJaLbfGuQaSLXNHPsk/ui8= +github.com/whosonfirst/go-whosonfirst-spr/v2 v2.2.0 h1:mAk0Vl2BDW1pweD0a54spNGpK70GSnjPBVqJDSi/Dbk= +github.com/whosonfirst/go-whosonfirst-spr/v2 v2.2.0/go.mod h1:3P6fiSVGtIbM3UcyaVMs4i1N6Hi88GmTsdouuXzlr78= +github.com/whosonfirst/go-whosonfirst-sqlite-features v0.10.0 h1:H+nxoG/RBezVRigRt0nKF6bCE/CXp5uRe0Y7/VpESW0= +github.com/whosonfirst/go-whosonfirst-sqlite-features v0.10.0/go.mod h1:OYgpbMAxP4g2LiHpbI8ObeOUMZHZb+tqZ58/HDDdfgY= +github.com/whosonfirst/go-whosonfirst-sqlite-features-index v1.5.0 h1:hTqZpcOZ+KpbDENCH+XX+kcIuceiw4k25G8K6ojS7ig= +github.com/whosonfirst/go-whosonfirst-sqlite-features-index v1.5.0/go.mod h1:tX5ic+8yza7M+lp84Y8fvnSC70k6YRStCtL+G7Bna7w= github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1 h1:NII/w0HnA5AGjRvwZJIgrEhNq2igiaVRjvVwJ5KejhQ= github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1/go.mod h1:dZxoAGOI9dnX95fV3eM4BCoFs+Rzzzc7tmTvhNNbiVM= +github.com/whosonfirst/go-whosonfirst-sqlite-index/v3 v3.0.0 h1:XezVmysv7nfskEBXqhTQDHMegANDlr7xUdLLVPdb6tk= +github.com/whosonfirst/go-whosonfirst-sqlite-index/v3 v3.0.0/go.mod h1:lMCFs+pi80lM1ZyCYczXzCzXOazc4vJYKAsVpaGdTt8= github.com/whosonfirst/go-whosonfirst-uri v0.2.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= github.com/whosonfirst/go-whosonfirst-uri v1.0.1/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= github.com/whosonfirst/go-whosonfirst-uri v1.1.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= @@ -267,7 +238,6 @@ go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6m golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -277,7 +247,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -288,10 +257,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -304,7 +271,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -324,8 +290,6 @@ gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/vendor/github.com/paulmach/orb/CHANGELOG.md b/vendor/github.com/paulmach/orb/CHANGELOG.md new file mode 100644 index 0000000..70520bf --- /dev/null +++ b/vendor/github.com/paulmach/orb/CHANGELOG.md @@ -0,0 +1,91 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [v0.6.0](https://github.com/paulmach/orb/compare/v0.5.0...v0.6.0) - 2022-05-04 + +### Added + +- geo: add correctly spelled LengthHaversine by [@paulmach](https://github.com/paulmach) in https://github.com/paulmach/orb/pull/97 +- geojson: add support for "external" json encoders/decoders by [@paulmach](https://github.com/paulmach) in https://github.com/paulmach/orb/pull/98 +- Add ewkb encoding/decoding support by [@paulmach](https://github.com/paulmach) in https://github.com/paulmach/orb/pull/88 + +## [v0.5.0](https://github.com/paulmach/orb/compare/v0.4.0...v0.5.0) - 2022-04-06 + +### Added + +- encoding/mvt: stable marshalling by [@travisgrigsby](https://github.com/travisgrigsby) in https://github.com/paulmach/orb/pull/93 +- encoding/mvt: support mvt marshal for GeometryCollection by [@dadadamarine](https://github.com/dadadamarine) in https://github.com/paulmach/orb/pull/89 + +### Fixed + +- quadtree: fix cleanup of nodes during removal by [@paulmach](https://github.com/paulmach) in https://github.com/paulmach/orb/pull/94 + +### Other + +- encoding/wkt: various code improvements by [@paulmach](https://github.com/paulmach) in https://github.com/paulmach/orb/pull/95 +- update protoscan to 0.2.1 by [@paulmach](https://github.com/paulmach) in https://github.com/paulmach/orb/pull/83 + +## [v0.4.0](https://github.com/paulmach/orb/compare/v0.3.0...v0.4.0) - 2021-11-11 + +### Added + +- geo: Add functions to calculate points based on distance and bearing by [@thzinc](https://github.com/thzinc) in https://github.com/paulmach/orb/pull/76 + +### Fixed + +- encoding/mvt: avoid reflect nil value by [@nicklasaven](https://github.com/nicklasaven) in https://github.com/paulmach/orb/pull/78 + +## [v0.3.0](https://github.com/paulmach/orb/compare/v0.2.2...v0.3.0) - 2021-10-16 + +### Changed + +- quadtree: sort KNearest results closest first by [@paulmach](https://github.com/paulmach) in https://github.com/paulmach/orb/pull/75 +- ring: require >=4 points to return true when calling Closed() by [@missinglink](https://github.com/missinglink) in https://github.com/paulmach/orb/pull/70 + +### Fixed + +- encoding/mvt: verify tile coord does not overflow for z > 20 by [@paulmach](https://github.com/paulmach) in https://github.com/paulmach/orb/pull/74 +- quadtree: Address panic-ing quadtree.Matching(…) method when finding no closest node by [@willsalz](https://github.com/willsalz) in https://github.com/paulmach/orb/pull/73 + +## [v0.2.2](https://github.com/paulmach/orb/compare/v0.2.1...v0.2.2) - 2021-06-05 + +### Fixed + +- Dependency resolution problems in some cases, issue https://github.com/paulmach/orb/issues/65, pr https://github.com/paulmach/orb/pull/66 + +## [v0.2.1](https://github.com/paulmach/orb/compare/v0.2.0...v0.2.1) - 2021-01-16 + +### Changed + +- encoding/mvt: upgrade protoscan v0.1 -> v0.2 [`ad31566`](https://github.com/paulmach/orb/commit/ad31566942027c1cd30dd341f35123fb54676599) +- encoding/mvt: remove github.com/pkg/errors as a dependency [`d2e235`](https://github.com/paulmach/orb/commit/d2e23529a295a0d973cc787ad2742cb6ccbd5306) + +## v0.2.0 - 2021-01-16 + +### Breaking Changes + +- Foreign Members in Feature Collections + + Extra attributes in a feature collection object will now be put into `featureCollection.ExtraMembers`. + Similarly, stuff in `ExtraMembers will be marshalled into the feature collection base. + The break happens if you were decoding these foreign members using something like + + ```go + type MyFeatureCollection struct { + geojson.FeatureCollection + Title string `json:"title"` + } + ``` + + **The above will no longer work** in this release and it never supported marshalling. See https://github.com/paulmach/orb/pull/56 for more details. + +- Features with nil/missing geometry will no longer return an errors + + Previously missing or invalid geometry in a feature collection would return a `ErrInvalidGeometry` error. + However missing geometry is compliant with [section 3.2](https://tools.ietf.org/html/rfc7946#section-3.2) of the spec. + See https://github.com/paulmach/orb/issues/38 and https://github.com/paulmach/orb/pull/58 for more details. + +### Changed + +- encoding/mvt: faster unmarshalling for Mapbox Vector Tiles (MVT) see https://github.com/paulmach/orb/pull/57 diff --git a/vendor/github.com/paulmach/orb/README.md b/vendor/github.com/paulmach/orb/README.md index b9b9eab..8d0e515 100644 --- a/vendor/github.com/paulmach/orb/README.md +++ b/vendor/github.com/paulmach/orb/README.md @@ -107,6 +107,10 @@ for _, f := range fc { } ``` +The library supports third party "encoding/json" replacements +such [github.com/json-iterator/go](https://github.com/json-iterator/go). +See the [geojson](geojson) readme for more details. + ## Mapbox Vector Tiles The [encoding/mvt](encoding/mvt) sub-package implements Marshalling and @@ -140,34 +144,35 @@ data, err := layers.Marshal() // this data is NOT gzipped. data, err := layers.MarshalGzipped() ``` -## Decoding WKB from a database query +## Decoding WKB/EWKB from a database query -Geometries are usually returned from databases in WKB format. The [encoding/wkb](encoding/wkb) +Geometries are usually returned from databases in WKB or EWKB format. The [encoding/ewkb](encoding/ewkb) sub-package offers helpers to "scan" the data into the base types directly. For example: ```go +db.Exec( + "INSERT INTO postgis_table (point_column) VALUES (ST_GeomFromEWKB(?))", + ewkb.Value(orb.Point{1, 2}, 4326), +) + row := db.QueryRow("SELECT ST_AsBinary(point_column) FROM postgis_table") var p orb.Point -err := row.Scan(wkb.Scanner(&p)) - -db.Exec("INSERT INTO table (point_column) VALUES (ST_GeomFromWKB(?))", wkb.Value(p)) +err := row.Scan(ewkb.Scanner(&p)) ``` -Scanning directly from MySQL columns is supported. By default MySQL returns geometry -data as WKB but prefixed with a 4 byte SRID. To support this, if the data is not -valid WKB, the code will strip the first 4 bytes, the SRID, and try again. -This works for most use cases. +For more information see the readme in the [encoding/ewkb](encoding/ewkb) package. ## List of sub-package utilities - [`clip`](clip) - clipping geometry to a bounding box - [`encoding/mvt`](encoding/mvt) - encoded and decoding from [Mapbox Vector Tiles](https://www.mapbox.com/vector-tiles/) - [`encoding/wkb`](encoding/wkb) - well-known binary as well as helpers to decode from the database queries +- [`encoding/ewkb`](encoding/ewkb) - extended well-known binary format that includes the SRID - [`encoding/wkt`](encoding/wkt) - well-known text encoding - [`geojson`](geojson) - working with geojson and the types in this package -- [`maptile`](maptile) - working with mercator map tiles +- [`maptile`](maptile) - working with mercator map tiles and quadkeys - [`project`](project) - project geometries between geo and planar contexts - [`quadtree`](quadtree) - quadtree implementation using the types in this package - [`resample`](resample) - resample points in a line string geometry diff --git a/vendor/github.com/paulmach/orb/encoding/wkt/README.md b/vendor/github.com/paulmach/orb/encoding/wkt/README.md new file mode 100644 index 0000000..a8f7dcb --- /dev/null +++ b/vendor/github.com/paulmach/orb/encoding/wkt/README.md @@ -0,0 +1,17 @@ +# encoding/wkt [![Godoc Reference](https://pkg.go.dev/badge/github.com/paulmach/orb)](https://pkg.go.dev/github.com/paulmach/orb/encoding/wkt) + +This package provides encoding and decoding of [WKT](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) +data. The interface is defined as: + +```go +func MarshalString(orb.Geometry) string + +func Unmarshal(string) (orb.Geometry, error) +func UnmarshalPoint(string) (orb.Point, err error) +func UnmarshalMultiPoint(string) (orb.MultiPoint, err error) +func UnmarshalLineString(string) (orb.LineString, err error) +func UnmarshalMultiLineString(string) (orb.MultiLineString, err error) +func UnmarshalPolygon(string) (orb.Polygon, err error) +func UnmarshalMultiPolygon(string) (orb.MultiPolygon, err error) +func UnmarshalCollection(string) (orb.Collection, err error) +``` diff --git a/vendor/github.com/paulmach/orb/encoding/wkt/unmarshal.go b/vendor/github.com/paulmach/orb/encoding/wkt/unmarshal.go new file mode 100644 index 0000000..de259fd --- /dev/null +++ b/vendor/github.com/paulmach/orb/encoding/wkt/unmarshal.go @@ -0,0 +1,318 @@ +package wkt + +import ( + "errors" + "strconv" + "strings" + + "github.com/paulmach/orb" +) + +var ( + // ErrNotWKT is returned when unmarshalling WKT and the data is not valid. + ErrNotWKT = errors.New("wkt: invalid data") + + // ErrIncorrectGeometry is returned when unmarshalling WKT data into the wrong type. + // For example, unmarshaling linestring data into a point. + ErrIncorrectGeometry = errors.New("wkt: incorrect geometry") + + // ErrUnsupportedGeometry is returned when geometry type is not supported by this lib. + ErrUnsupportedGeometry = errors.New("wkt: unsupported geometry") +) + +// UnmarshalPoint returns the point represented by the wkt string. +// Will return ErrIncorrectGeometry if the wkt is not a point. +func UnmarshalPoint(s string) (p orb.Point, err error) { + geom, err := Unmarshal(s) + if err != nil { + return orb.Point{}, err + } + g, ok := geom.(orb.Point) + if !ok { + return orb.Point{}, ErrIncorrectGeometry + } + return g, nil +} + +// UnmarshalMultiPoint returns the multi-point represented by the wkt string. +// Will return ErrIncorrectGeometry if the wkt is not a multi-point. +func UnmarshalMultiPoint(s string) (p orb.MultiPoint, err error) { + geom, err := Unmarshal(s) + if err != nil { + return nil, err + } + + g, ok := geom.(orb.MultiPoint) + if !ok { + return nil, ErrIncorrectGeometry + } + return g, nil +} + +// UnmarshalLineString returns the linestring represented by the wkt string. +// Will return ErrIncorrectGeometry if the wkt is not a linestring. +func UnmarshalLineString(s string) (p orb.LineString, err error) { + geom, err := Unmarshal(s) + if err != nil { + return nil, err + } + g, ok := geom.(orb.LineString) + if !ok { + return nil, ErrIncorrectGeometry + } + return g, nil +} + +// UnmarshalMultiLineString returns the multi-linestring represented by the wkt string. +// Will return ErrIncorrectGeometry if the wkt is not a multi-linestring. +func UnmarshalMultiLineString(s string) (p orb.MultiLineString, err error) { + geom, err := Unmarshal(s) + if err != nil { + return nil, err + } + g, ok := geom.(orb.MultiLineString) + if !ok { + return nil, ErrIncorrectGeometry + } + return g, nil +} + +// UnmarshalPolygon returns the polygon represented by the wkt string. +// Will return ErrIncorrectGeometry if the wkt is not a polygon. +func UnmarshalPolygon(s string) (p orb.Polygon, err error) { + geom, err := Unmarshal(s) + if err != nil { + return nil, err + } + g, ok := geom.(orb.Polygon) + if !ok { + return nil, ErrIncorrectGeometry + } + return g, nil +} + +// UnmarshalMultiPolygon returns the multi-polygon represented by the wkt string. +// Will return ErrIncorrectGeometry if the wkt is not a multi-polygon. +func UnmarshalMultiPolygon(s string) (p orb.MultiPolygon, err error) { + geom, err := Unmarshal(s) + if err != nil { + return nil, err + } + g, ok := geom.(orb.MultiPolygon) + if !ok { + return nil, ErrIncorrectGeometry + } + return g, nil +} + +// UnmarshalCollection returns the geometry collection represented by the wkt string. +// Will return ErrIncorrectGeometry if the wkt is not a geometry collection. +func UnmarshalCollection(s string) (p orb.Collection, err error) { + geom, err := Unmarshal(s) + if err != nil { + return orb.Collection{}, err + } + g, ok := geom.(orb.Collection) + if !ok { + return nil, ErrIncorrectGeometry + } + return g, nil +} + +// trimSpaceBrackets trim space and brackets +func trimSpaceBrackets(s string) string { + s = strings.Trim(s, " ") + if s[0] == '(' { + s = s[1:] + } + if s[len(s)-1] == ')' { + s = s[:len(s)-1] + } + + return strings.Trim(s, " ") +} + +// parsePoint pase point by (x y) +func parsePoint(s string) (p orb.Point, err error) { + ps := strings.Split(s, " ") + if len(ps) != 2 { + return orb.Point{}, ErrNotWKT + } + + x, err := strconv.ParseFloat(ps[0], 64) + if err != nil { + return orb.Point{}, err + } + + y, err := strconv.ParseFloat(ps[1], 64) + if err != nil { + return orb.Point{}, err + } + + return orb.Point{x, y}, nil +} + +// splitGeometryCollection split GEOMETRYCOLLECTION to more geometry +func splitGeometryCollection(s string) (r []string) { + r = make([]string, 0) + stack := make([]rune, 0) + l := len(s) + for i, v := range s { + if !strings.Contains(string(stack), "(") { + stack = append(stack, v) + continue + } + if v >= 'A' && v < 'Z' { + t := string(stack) + r = append(r, t[:len(t)-1]) + stack = make([]rune, 0) + stack = append(stack, v) + continue + } + if i == l-1 { + r = append(r, string(stack)) + continue + } + stack = append(stack, v) + } + return +} + +// Unmarshal return a geometry by parsing the WKT string. +func Unmarshal(s string) (geom orb.Geometry, err error) { + s = strings.ToUpper(strings.Trim(s, " ")) + switch { + case strings.Contains(s, "GEOMETRYCOLLECTION"): + if s == "GEOMETRYCOLLECTION EMPTY" { + return orb.Collection{}, nil + } + s = strings.Replace(s, "GEOMETRYCOLLECTION", "", -1) + c := orb.Collection{} + ms := splitGeometryCollection(s) + if len(ms) == 0 { + return nil, err + } + for _, v := range ms { + if len(v) == 0 { + continue + } + g, err := Unmarshal(v) + if err != nil { + return nil, err + } + c = append(c, g) + } + geom = c + + case strings.Contains(s, "MULTIPOINT"): + if s == "MULTIPOINT EMPTY" { + return orb.MultiPoint{}, nil + } + s = strings.Replace(s, "MULTIPOINT", "", -1) + s = trimSpaceBrackets(s) + ps := strings.Split(s, ",") + mp := orb.MultiPoint{} + for _, p := range ps { + tp, err := parsePoint(trimSpaceBrackets(p)) + if err != nil { + return nil, err + } + mp = append(mp, tp) + } + geom = mp + + case strings.Contains(s, "POINT"): + s = strings.Replace(s, "POINT", "", -1) + tp, err := parsePoint(trimSpaceBrackets(s)) + if err != nil { + return nil, err + } + geom = tp + + case strings.Contains(s, "MULTILINESTRING"): + if s == "MULTILINESTRING EMPTY" { + return orb.MultiLineString{}, nil + } + s = strings.Replace(s, "MULTILINESTRING", "", -1) + ml := orb.MultiLineString{} + for _, l := range strings.Split(trimSpaceBrackets(s), "),(") { + tl := orb.LineString{} + for _, p := range strings.Split(trimSpaceBrackets(l), ",") { + tp, err := parsePoint(trimSpaceBrackets(p)) + if err != nil { + return nil, err + } + tl = append(tl, tp) + } + ml = append(ml, tl) + } + geom = ml + + case strings.Contains(s, "LINESTRING"): + if s == "LINESTRING EMPTY" { + return orb.LineString{}, nil + } + s = strings.Replace(s, "LINESTRING", "", -1) + s = trimSpaceBrackets(s) + ps := strings.Split(s, ",") + ls := orb.LineString{} + for _, p := range ps { + tp, err := parsePoint(trimSpaceBrackets(p)) + if err != nil { + return nil, err + } + ls = append(ls, tp) + } + geom = ls + + case strings.Contains(s, "MULTIPOLYGON"): + if s == "MULTIPOLYGON EMPTY" { + return orb.MultiPolygon{}, nil + } + s = strings.Replace(s, "MULTIPOLYGON", "", -1) + mpol := orb.MultiPolygon{} + for _, ps := range strings.Split(trimSpaceBrackets(s), ")),((") { + pol := orb.Polygon{} + for _, ls := range strings.Split(trimSpaceBrackets(ps), "),(") { + ring := orb.Ring{} + for _, p := range strings.Split(ls, ",") { + tp, err := parsePoint(trimSpaceBrackets(p)) + if err != nil { + return nil, err + } + ring = append(ring, tp) + } + pol = append(pol, ring) + } + mpol = append(mpol, pol) + } + geom = mpol + + case strings.Contains(s, "POLYGON"): + if s == "POLYGON EMPTY" { + return orb.Polygon{}, nil + } + s = strings.Replace(s, "POLYGON", "", -1) + s = trimSpaceBrackets(s) + + rs := strings.Split(s, "),(") + pol := make(orb.Polygon, 0, len(rs)) + for _, r := range rs { + ps := strings.Split(trimSpaceBrackets(r), ",") + ring := orb.Ring{} + for _, p := range ps { + tp, err := parsePoint(trimSpaceBrackets(p)) + if err != nil { + return nil, err + } + ring = append(ring, tp) + } + pol = append(pol, ring) + } + geom = pol + default: + return nil, ErrUnsupportedGeometry + } + + return +} diff --git a/vendor/github.com/paulmach/orb/encoding/wkt/wkt.go b/vendor/github.com/paulmach/orb/encoding/wkt/wkt.go new file mode 100644 index 0000000..758d3be --- /dev/null +++ b/vendor/github.com/paulmach/orb/encoding/wkt/wkt.go @@ -0,0 +1,134 @@ +package wkt + +import ( + "bytes" + "fmt" + + "github.com/paulmach/orb" +) + +// Marshal returns a WKT representation of the geometry. +func Marshal(g orb.Geometry) []byte { + buf := bytes.NewBuffer(nil) + + wkt(buf, g) + return buf.Bytes() +} + +// MarshalString returns a WKT representation of the geometry as a string. +func MarshalString(g orb.Geometry) string { + buf := bytes.NewBuffer(nil) + + wkt(buf, g) + return buf.String() +} + +func wkt(buf *bytes.Buffer, geom orb.Geometry) { + switch g := geom.(type) { + case orb.Point: + fmt.Fprintf(buf, "POINT(%g %g)", g[0], g[1]) + case orb.MultiPoint: + if len(g) == 0 { + buf.Write([]byte(`MULTIPOINT EMPTY`)) + return + } + + buf.Write([]byte(`MULTIPOINT(`)) + for i, p := range g { + if i != 0 { + buf.WriteByte(',') + } + + fmt.Fprintf(buf, "(%g %g)", p[0], p[1]) + } + buf.WriteByte(')') + case orb.LineString: + if len(g) == 0 { + buf.Write([]byte(`LINESTRING EMPTY`)) + return + } + + buf.Write([]byte(`LINESTRING`)) + writeLineString(buf, g) + case orb.MultiLineString: + if len(g) == 0 { + buf.Write([]byte(`MULTILINESTRING EMPTY`)) + return + } + + buf.Write([]byte(`MULTILINESTRING(`)) + for i, ls := range g { + if i != 0 { + buf.WriteByte(',') + } + writeLineString(buf, ls) + } + buf.WriteByte(')') + case orb.Ring: + wkt(buf, orb.Polygon{g}) + case orb.Polygon: + if len(g) == 0 { + buf.Write([]byte(`POLYGON EMPTY`)) + return + } + + buf.Write([]byte(`POLYGON(`)) + for i, r := range g { + if i != 0 { + buf.WriteByte(',') + } + writeLineString(buf, orb.LineString(r)) + } + buf.WriteByte(')') + case orb.MultiPolygon: + if len(g) == 0 { + buf.Write([]byte(`MULTIPOLYGON EMPTY`)) + return + } + + buf.Write([]byte(`MULTIPOLYGON(`)) + for i, p := range g { + if i != 0 { + buf.WriteByte(',') + } + buf.WriteByte('(') + for j, r := range p { + if j != 0 { + buf.WriteByte(',') + } + writeLineString(buf, orb.LineString(r)) + } + buf.WriteByte(')') + } + buf.WriteByte(')') + case orb.Collection: + if len(g) == 0 { + buf.Write([]byte(`GEOMETRYCOLLECTION EMPTY`)) + return + } + buf.Write([]byte(`GEOMETRYCOLLECTION(`)) + for i, c := range g { + if i != 0 { + buf.WriteByte(',') + } + wkt(buf, c) + } + buf.WriteByte(')') + case orb.Bound: + wkt(buf, g.ToPolygon()) + default: + panic("unsupported type") + } +} + +func writeLineString(buf *bytes.Buffer, ls orb.LineString) { + buf.WriteByte('(') + for i, p := range ls { + if i != 0 { + buf.WriteByte(',') + } + + fmt.Fprintf(buf, "%g %g", p[0], p[1]) + } + buf.WriteByte(')') +} diff --git a/vendor/github.com/paulmach/orb/geojson/README.md b/vendor/github.com/paulmach/orb/geojson/README.md index 64fd35c..2a5c8c7 100644 --- a/vendor/github.com/paulmach/orb/geojson/README.md +++ b/vendor/github.com/paulmach/orb/geojson/README.md @@ -66,6 +66,52 @@ fc.ExtraMembers["timestamp"] // == "2020-06-15T01:02:03Z" // base featureCollection object. ``` +## Performance + +For performance critical applications, consider a +third party replacement of "encoding/json" like [github.com/json-iterator/go](https://github.com/json-iterator/go) + +This can be enabled with something like this: + +```go +import ( + jsoniter "github.com/json-iterator/go" + "github.com/paulmach/orb" +) + +var c = jsoniter.Config{ + EscapeHTML: true, + SortMapKeys: false, + MarshalFloatWith6Digits: true, +}.Froze() + +CustomJSONMarshaler = c +CustomJSONUnmarshaler = c +``` + +The above change can have dramatic performance implications, see the benchmarks below +on a 100k feature collection file: + +``` +benchmark old ns/op new ns/op delta +BenchmarkFeatureMarshalJSON-12 2694543 733480 -72.78% +BenchmarkFeatureUnmarshalJSON-12 5383825 2738183 -49.14% +BenchmarkGeometryMarshalJSON-12 210107 62789 -70.12% +BenchmarkGeometryUnmarshalJSON-12 691472 144689 -79.08% + +benchmark old allocs new allocs delta +BenchmarkFeatureMarshalJSON-12 7818 2316 -70.38% +BenchmarkFeatureUnmarshalJSON-12 23047 31946 +38.61% +BenchmarkGeometryMarshalJSON-12 2 3 +50.00% +BenchmarkGeometryUnmarshalJSON-12 2042 18 -99.12% + +benchmark old bytes new bytes delta +BenchmarkFeatureMarshalJSON-12 794088 490251 -38.26% +BenchmarkFeatureUnmarshalJSON-12 766354 1068497 +39.43% +BenchmarkGeometryMarshalJSON-12 24787 18650 -24.76% +BenchmarkGeometryUnmarshalJSON-12 79784 51374 -35.61% +``` + ## Feature Properties GeoJSON features can have properties of any type. This can cause issues in a statically typed diff --git a/vendor/github.com/paulmach/orb/geojson/feature.go b/vendor/github.com/paulmach/orb/geojson/feature.go index ce4e2c8..7230678 100644 --- a/vendor/github.com/paulmach/orb/geojson/feature.go +++ b/vendor/github.com/paulmach/orb/geojson/feature.go @@ -1,7 +1,6 @@ package geojson import ( - "encoding/json" "fmt" "github.com/paulmach/orb" @@ -50,7 +49,7 @@ func (f Feature) MarshalJSON() ([]byte, error) { jf.Properties = nil } - return json.Marshal(jf) + return marshalJSON(jf) } // UnmarshalFeature decodes the data into a GeoJSON feature. @@ -69,7 +68,7 @@ func UnmarshalFeature(data []byte) (*Feature, error) { // into the orb.Geometry types. func (f *Feature) UnmarshalJSON(data []byte) error { jf := &jsonFeature{} - err := json.Unmarshal(data, &jf) + err := unmarshalJSON(data, &jf) if err != nil { return err } diff --git a/vendor/github.com/paulmach/orb/geojson/feature_collection.go b/vendor/github.com/paulmach/orb/geojson/feature_collection.go index b0c4fe3..113c8ee 100644 --- a/vendor/github.com/paulmach/orb/geojson/feature_collection.go +++ b/vendor/github.com/paulmach/orb/geojson/feature_collection.go @@ -7,7 +7,6 @@ json.Unmarshaler interfaces as well as helper functions such as package geojson import ( - "encoding/json" "fmt" ) @@ -63,7 +62,7 @@ func (fc FeatureCollection) MarshalJSON() ([]byte, error) { tmp["features"] = fc.Features } - return json.Marshal(tmp) + return marshalJSON(tmp) } // UnmarshalJSON decodes the data into a GeoJSON feature collection. @@ -71,7 +70,7 @@ func (fc FeatureCollection) MarshalJSON() ([]byte, error) { func (fc *FeatureCollection) UnmarshalJSON(data []byte) error { tmp := make(map[string]nocopyRawMessage, 4) - err := json.Unmarshal(data, &tmp) + err := unmarshalJSON(data, &tmp) if err != nil { return err } @@ -80,17 +79,17 @@ func (fc *FeatureCollection) UnmarshalJSON(data []byte) error { for key, value := range tmp { switch key { case "type": - err := json.Unmarshal(value, &fc.Type) + err := unmarshalJSON(value, &fc.Type) if err != nil { return err } case "bbox": - err := json.Unmarshal(value, &fc.BBox) + err := unmarshalJSON(value, &fc.BBox) if err != nil { return err } case "features": - err := json.Unmarshal(value, &fc.Features) + err := unmarshalJSON(value, &fc.Features) if err != nil { return err } @@ -100,7 +99,7 @@ func (fc *FeatureCollection) UnmarshalJSON(data []byte) error { } var val interface{} - err := json.Unmarshal(value, &val) + err := unmarshalJSON(value, &val) if err != nil { return err } diff --git a/vendor/github.com/paulmach/orb/geojson/geometry.go b/vendor/github.com/paulmach/orb/geojson/geometry.go index 9259e38..4574cd0 100644 --- a/vendor/github.com/paulmach/orb/geojson/geometry.go +++ b/vendor/github.com/paulmach/orb/geojson/geometry.go @@ -1,8 +1,8 @@ package geojson import ( - "encoding/json" "errors" + "github.com/paulmach/orb" ) @@ -85,14 +85,15 @@ func (g Geometry) MarshalJSON() ([]byte, error) { ng.Geometries = g.Geometries ng.Type = orb.Collection{}.GeoJSONType() } - return json.Marshal(ng) + + return marshalJSON(ng) } // UnmarshalGeometry decodes the data into a GeoJSON feature. // Alternately one can call json.Unmarshal(g) directly for the same result. func UnmarshalGeometry(data []byte) (*Geometry, error) { g := &Geometry{} - err := json.Unmarshal(data, g) + err := unmarshalJSON(data, g) if err != nil { return nil, err } @@ -103,7 +104,7 @@ func UnmarshalGeometry(data []byte) (*Geometry, error) { // UnmarshalJSON will unmarshal the correct geometry from the json structure. func (g *Geometry) UnmarshalJSON(data []byte) error { jg := &jsonGeometry{} - err := json.Unmarshal(data, jg) + err := unmarshalJSON(data, jg) if err != nil { return err } @@ -111,27 +112,27 @@ func (g *Geometry) UnmarshalJSON(data []byte) error { switch jg.Type { case "Point": p := orb.Point{} - err = json.Unmarshal(jg.Coordinates, &p) + err = unmarshalJSON(jg.Coordinates, &p) g.Coordinates = p case "MultiPoint": mp := orb.MultiPoint{} - err = json.Unmarshal(jg.Coordinates, &mp) + err = unmarshalJSON(jg.Coordinates, &mp) g.Coordinates = mp case "LineString": ls := orb.LineString{} - err = json.Unmarshal(jg.Coordinates, &ls) + err = unmarshalJSON(jg.Coordinates, &ls) g.Coordinates = ls case "MultiLineString": mls := orb.MultiLineString{} - err = json.Unmarshal(jg.Coordinates, &mls) + err = unmarshalJSON(jg.Coordinates, &mls) g.Coordinates = mls case "Polygon": p := orb.Polygon{} - err = json.Unmarshal(jg.Coordinates, &p) + err = unmarshalJSON(jg.Coordinates, &p) g.Coordinates = p case "MultiPolygon": mp := orb.MultiPolygon{} - err = json.Unmarshal(jg.Coordinates, &mp) + err = unmarshalJSON(jg.Coordinates, &mp) g.Coordinates = mp case "GeometryCollection": g.Geometries = jg.Geometries @@ -154,13 +155,13 @@ func (p Point) Geometry() orb.Geometry { // MarshalJSON will convert the Point into a GeoJSON Point geometry. func (p Point) MarshalJSON() ([]byte, error) { - return json.Marshal(Geometry{Coordinates: orb.Point(p)}) + return marshalJSON(Geometry{Coordinates: orb.Point(p)}) } // UnmarshalJSON will unmarshal the GeoJSON Point geometry. func (p *Point) UnmarshalJSON(data []byte) error { g := &Geometry{} - err := json.Unmarshal(data, &g) + err := unmarshalJSON(data, &g) if err != nil { return err } @@ -184,13 +185,13 @@ func (mp MultiPoint) Geometry() orb.Geometry { // MarshalJSON will convert the MultiPoint into a GeoJSON MultiPoint geometry. func (mp MultiPoint) MarshalJSON() ([]byte, error) { - return json.Marshal(Geometry{Coordinates: orb.MultiPoint(mp)}) + return marshalJSON(Geometry{Coordinates: orb.MultiPoint(mp)}) } // UnmarshalJSON will unmarshal the GeoJSON MultiPoint geometry. func (mp *MultiPoint) UnmarshalJSON(data []byte) error { g := &Geometry{} - err := json.Unmarshal(data, &g) + err := unmarshalJSON(data, &g) if err != nil { return err } @@ -214,13 +215,13 @@ func (ls LineString) Geometry() orb.Geometry { // MarshalJSON will convert the LineString into a GeoJSON LineString geometry. func (ls LineString) MarshalJSON() ([]byte, error) { - return json.Marshal(Geometry{Coordinates: orb.LineString(ls)}) + return marshalJSON(Geometry{Coordinates: orb.LineString(ls)}) } // UnmarshalJSON will unmarshal the GeoJSON MultiPoint geometry. func (ls *LineString) UnmarshalJSON(data []byte) error { g := &Geometry{} - err := json.Unmarshal(data, &g) + err := unmarshalJSON(data, &g) if err != nil { return err } @@ -244,13 +245,13 @@ func (mls MultiLineString) Geometry() orb.Geometry { // MarshalJSON will convert the MultiLineString into a GeoJSON MultiLineString geometry. func (mls MultiLineString) MarshalJSON() ([]byte, error) { - return json.Marshal(Geometry{Coordinates: orb.MultiLineString(mls)}) + return marshalJSON(Geometry{Coordinates: orb.MultiLineString(mls)}) } // UnmarshalJSON will unmarshal the GeoJSON MultiPoint geometry. func (mls *MultiLineString) UnmarshalJSON(data []byte) error { g := &Geometry{} - err := json.Unmarshal(data, &g) + err := unmarshalJSON(data, &g) if err != nil { return err } @@ -274,13 +275,13 @@ func (p Polygon) Geometry() orb.Geometry { // MarshalJSON will convert the Polygon into a GeoJSON Polygon geometry. func (p Polygon) MarshalJSON() ([]byte, error) { - return json.Marshal(Geometry{Coordinates: orb.Polygon(p)}) + return marshalJSON(Geometry{Coordinates: orb.Polygon(p)}) } // UnmarshalJSON will unmarshal the GeoJSON Polygon geometry. func (p *Polygon) UnmarshalJSON(data []byte) error { g := &Geometry{} - err := json.Unmarshal(data, &g) + err := unmarshalJSON(data, &g) if err != nil { return err } @@ -304,13 +305,13 @@ func (mp MultiPolygon) Geometry() orb.Geometry { // MarshalJSON will convert the MultiPolygon into a GeoJSON MultiPolygon geometry. func (mp MultiPolygon) MarshalJSON() ([]byte, error) { - return json.Marshal(Geometry{Coordinates: orb.MultiPolygon(mp)}) + return marshalJSON(Geometry{Coordinates: orb.MultiPolygon(mp)}) } // UnmarshalJSON will unmarshal the GeoJSON MultiPolygon geometry. func (mp *MultiPolygon) UnmarshalJSON(data []byte) error { g := &Geometry{} - err := json.Unmarshal(data, &g) + err := unmarshalJSON(data, &g) if err != nil { return err } @@ -335,10 +336,3 @@ type jsonGeometryMarshall struct { Coordinates orb.Geometry `json:"coordinates,omitempty"` Geometries []*Geometry `json:"geometries,omitempty"` } - -type nocopyRawMessage []byte - -func (m *nocopyRawMessage) UnmarshalJSON(data []byte) error { - *m = data - return nil -} diff --git a/vendor/github.com/paulmach/orb/geojson/json.go b/vendor/github.com/paulmach/orb/geojson/json.go new file mode 100644 index 0000000..7b8d654 --- /dev/null +++ b/vendor/github.com/paulmach/orb/geojson/json.go @@ -0,0 +1,74 @@ +package geojson + +import "encoding/json" + +// CustomJSONMarshaler can be set to have the code use a different +// json marshaler than the default in the standard library. +// One use case in enabling `github.com/json-iterator/go` +// with something like this: +// +// import ( +// jsoniter "github.com/json-iterator/go" +// "github.com/paulmach/orb" +// ) +// +// var c = jsoniter.Config{ +// EscapeHTML: true, +// SortMapKeys: false, +// MarshalFloatWith6Digits: true, +// }.Froze() +// +// orb.CustomJSONMarshaler = c +// orb.CustomJSONUnmarshaler = c +// +// Note that any errors encountered during marshaling will be different. +var CustomJSONMarshaler interface { + Marshal(v interface{}) ([]byte, error) +} = nil + +// CustomJSONUnmarshaler can be set to have the code use a different +// json unmarshaler than the default in the standard library. +// One use case in enabling `github.com/json-iterator/go` +// with something like this: +// +// import ( +// jsoniter "github.com/json-iterator/go" +// "github.com/paulmach/orb" +// ) +// +// var c = jsoniter.Config{ +// EscapeHTML: true, +// SortMapKeys: false, +// MarshalFloatWith6Digits: true, +// }.Froze() +// +// orb.CustomJSONMarshaler = c +// orb.CustomJSONUnmarshaler = c +// +// Note that any errors encountered during unmarshaling will be different. +var CustomJSONUnmarshaler interface { + Unmarshal(data []byte, v interface{}) error +} = nil + +func marshalJSON(v interface{}) ([]byte, error) { + if CustomJSONMarshaler == nil { + return json.Marshal(v) + } + + return CustomJSONMarshaler.Marshal(v) +} + +func unmarshalJSON(data []byte, v interface{}) error { + if CustomJSONUnmarshaler == nil { + return json.Unmarshal(data, v) + } + + return CustomJSONUnmarshaler.Unmarshal(data, v) +} + +type nocopyRawMessage []byte + +func (m *nocopyRawMessage) UnmarshalJSON(data []byte) error { + *m = data + return nil +} diff --git a/vendor/github.com/sfomuseum/go-edtf/deprecated.go b/vendor/github.com/sfomuseum/go-edtf/deprecated.go new file mode 100644 index 0000000..80de99a --- /dev/null +++ b/vendor/github.com/sfomuseum/go-edtf/deprecated.go @@ -0,0 +1,42 @@ +package edtf + +import ( + "fmt" +) + +var deprecated map[string]string + +func init() { + + deprecated = map[string]string{ + OPEN_2012: OPEN, + UNSPECIFIED_2012: UNSPECIFIED, + } + +} + +// IsDeprecated returns a boolean flag indicating whether 'str' is considered a deprecated EDTF value. +func IsDeprecated(str string) bool { + + for test, _ := range deprecated { + + if str == test { + return true + } + } + + return false +} + +// ReplaceDeprecated returns the current value for 'old'. +func ReplaceDeprecated(old string) (string, error) { + + new, ok := deprecated[old] + + if !ok { + err := fmt.Errorf("Unknown or unsupported EDTF string '%s' : %v", old, deprecated) + return "", err + } + + return new, nil +} diff --git a/vendor/github.com/sfomuseum/go-edtf/level0/tests.go b/vendor/github.com/sfomuseum/go-edtf/level0/tests.go index 3ed2814..9dc1faa 100644 --- a/vendor/github.com/sfomuseum/go-edtf/level0/tests.go +++ b/vendor/github.com/sfomuseum/go-edtf/level0/tests.go @@ -44,6 +44,12 @@ var Tests map[string]map[string]*tests.TestResult = map[string]map[string]*tests EndLowerTimeRFC3339: "1985-04-12T23:20:30Z", EndUpperTimeRFC3339: "1985-04-12T23:20:30Z", }), + "2021-12-10T01:29:00Z": tests.NewTestResult(tests.TestResultOptions{ + StartLowerTimeRFC3339: "2021-12-10T01:29:00Z", + StartUpperTimeRFC3339: "2021-12-10T01:29:00Z", + EndLowerTimeRFC3339: "2021-12-10T01:29:00Z", + EndUpperTimeRFC3339: "2021-12-10T01:29:00Z", + }), "2021-10-10T00:24:00Z": tests.NewTestResult(tests.TestResultOptions{ StartLowerTimeRFC3339: "2021-10-10T00:24:00Z", StartUpperTimeRFC3339: "2021-10-10T00:24:00Z", diff --git a/vendor/github.com/twpayne/go-geom/.gitignore b/vendor/github.com/twpayne/go-geom/.gitignore deleted file mode 100644 index 73fba36..0000000 --- a/vendor/github.com/twpayne/go-geom/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/bin -/coverage.out diff --git a/vendor/github.com/twpayne/go-geom/.golangci.yml b/vendor/github.com/twpayne/go-geom/.golangci.yml deleted file mode 100644 index a6fec80..0000000 --- a/vendor/github.com/twpayne/go-geom/.golangci.yml +++ /dev/null @@ -1,112 +0,0 @@ -linters: - enable: - - asciicheck - - bodyclose - - deadcode - - depguard - - dogsled - - dupl - - durationcheck - - errcheck - - errorlint - - exportloopref - - forbidigo - - forcetypeassert - - gci - - godot - - gochecknoinits - - gocritic - - goerr113 - - gofmt - - gofumpt - - goimports - - gomoddirectives - - gomodguard - - goprintffuncname - - gosec - - gosimple - - govet - - ifshort - - importas - - ineffassign - - makezero - - misspell - - nakedret - - nilerr - - noctx - - nolintlint - - prealloc - - predeclared - - promlinter - - revive - - rowserrcheck - - sqlclosecheck - - staticcheck - - structcheck - - stylecheck - - tagliatelle - - thelper - - tparallel - - typecheck - - unconvert - - unparam - - unused - - varcheck - - wastedassign - - whitespace - disable: - - cyclop - - exhaustive - - exhaustivestruct - - funlen - - gochecknoglobals - - gocognit - - goconst - - gocyclo - - godox - - goheader - - godox - - gomnd - - lll - - nlreturn - - nestif - - paralleltest - - testpackage - - wrapcheck - - wsl - -linters-settings: - goimports: - local-prefixes: github.com/twpayne/go-geom - -issues: - exclude-rules: - - linters: - - dupl - - scopelint - path: "_test\\.go" - - linters: - - godot - path: "^bigxy/" - - linters: - - gocritic - path: "_example_test\\.go$" - - linters: - - godot - path: "^sorting/" - - linters: - - godot - path: "^transform/" - - linters: - - gocritic - - godot - path: "^xy/" - - linters: - - godot - path: "^xyz/" - - linters: - - goerr113 - text: "do not define dynamic errors, use wrapped static errors instead" - - linters: - - forbidigo - path: "^internal/cmd/" \ No newline at end of file diff --git a/vendor/github.com/twpayne/go-geom/INTERNALS.md b/vendor/github.com/twpayne/go-geom/INTERNALS.md deleted file mode 100644 index 8e15301..0000000 --- a/vendor/github.com/twpayne/go-geom/INTERNALS.md +++ /dev/null @@ -1,119 +0,0 @@ -# `go-geom` Internals - - -## Introduction - -`go-geom` attempts to implement efficient, standards-compatible OGC-style -geometries for Go. This document describes some of the key ideas required to -understand its implementation. - -`go-geom` is an evolution of the techniques developed for the [OpenLayers 3 -geometry library](http://openlayers.org/en/master/apidoc/ol.geom.html), -designed to efficiently handle large geometries in a resource-constrained, -garbage-collected environment, but adapted to the Go programming language and -its type system. - - -## Type flexibility - -There are three priniciple 2D geometry types: `Point`s, `LineString`s, and -`Polygon`s. - -OGC extends these three into collections of the principle types: `MultiPoint`, -`MultiLineString`, and `MultiPolygon`. This gives 3 geometry types * 2 -multi-or-not-multi = 6 combinations. - -On top of this, there are multiple combinations of dimensions, e.g. 2D (XY), 3D -(XYZ), 2D varying over time/distance (XYM), and 3D varying over time/distance -(XYZM). - -3 geometry types * 2 multi-or-not-multi * 4 different dimensionalities = 24 -distinct types. - -Go has neither generics, nor macros, nor a rich type system. `go-geom` attempts -to manage this combinatorial explosion while maintaining an idiomatic Go API, -implementation efficiency. and high runtime performance. - - -## Structural similarity - -`go-geom` exploits structural similarity between different geometry types to -share code. Consider: - -0. A `Point` consists of a single coordinate. This single coordinate is a - `geom.Coord`. - -1. A `LineString`, `LinearRing`, and `MultiPoint` consist of a collection of - coordinates. They all have different semantics (a `LineString` is ordered, -a `LinearRing` is ordered and closed, a `MultiPoint` is neither ordered nor -closed) yet all share a similar underlying structure. - -2. A `Polygon` and a `MultiLineString` are a collection of collections of - coordinates. Again, the semantics vary: a `Polygon` is a weakly ordered -collection of `LinearRing`s (the first `LinearRing` is the outer boundary, -subsequent `LinearRing`s are inner boundaries (holes)). A `MultiLineString` is -an unordered collection of `LineString`s. - -3. A `MultiPolygon` is an unordered collection of `Polygon`s. - -`go-geom` makes these structural similarities explicit: - -0. A `Point` is a `geom.Coord`, also known as `geom0`. - -1. `LineString`s, `LinearRing`s, and and `MultiPoint`s are `[]geom.Coord`, also - known as `geom1`. - -2. `Polygon`s and `MultiLineString`s are `[][]geom.Coord`, also known as - `geom2`. - -3. `MultiPolygon`s are `[][][]geom.Coord`, also known as `geom3`. - -Under the hood, `go-geom` uses Go's structural composition to share common -code. For example, `LineString`s, `LinearRing`s, and `MultiPoint`s all embed a -single anonymous `geom1`. - -The hierarchy of embedding is: - - geom0 - +- geom1 - +- geom2 - +- geom3 - -Note that `geom2` and `geom3` independently embed `geom1`. Despite their -numerical ordering, `geom2` and `geom3` are separate branches of the geometry -tree. - -We can exploit these structural similarities to share code. For example, -calculating the bounds of a geometry only involves finding the minimum and -maximum values in each dimension, which can be found by iterating over all -coordinates in the geometry. The semantic meaning of these coordinates - -whether they're points on a line, or points on a polygon inner or outer -boundary, or something else - does not matter. Therefore, as long as we can -treat any geometry as a collection of coordinates, we can use the same code to -calculate bounds across all geometry types. - -Similarly, we can exploit higher-level similarities. For example, the "length" -of a `MultiLineString` is the sum of the lengths of its component -`LineString`s, and the "length" (perimeter) of a `Polygon` is the sum of the -lengths (perimeters) of its component `LinearRing`s. - - -## Efficient - -At the time of writing (2016), CPUs are fast, cache hits are quite fast, cache -misses are slow, memory is very slow, and garbage collection takes an eternity. - -Typical geometry libraries use multiple levels of nested arrays, e.g. a -`[][][]float64` for a polygon. This requires multiple levels of indirection to -access a single coordinate value, and as different sub-arrays might be stored -in different parts of memory, is more likely to lead to cache miss. - -In contrast, `go-geom` packs all the coordinates for a geometry, whatever its -structure, into a single `[]float64`. The underlying array is stored in a -single blob of memory. Most operations do a linear scan over the array, which -is particularly cache friendly. There are also fewer objects for the garbage -collector to manage. - -Parts of the underlying array can be shared between multitple objects. For -example, retrieving the outer ring of a `Polygon` returns a `LinearRing` that -references the coordinates of the `Polygon`. No coordinate data are copied. diff --git a/vendor/github.com/twpayne/go-geom/LICENSE b/vendor/github.com/twpayne/go-geom/LICENSE deleted file mode 100644 index 3bc8155..0000000 --- a/vendor/github.com/twpayne/go-geom/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2013, Tom Payne -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/vendor/github.com/twpayne/go-geom/Makefile b/vendor/github.com/twpayne/go-geom/Makefile deleted file mode 100644 index 6fc510d..0000000 --- a/vendor/github.com/twpayne/go-geom/Makefile +++ /dev/null @@ -1,54 +0,0 @@ -GOLANGCI_LINT_VERSION=1.40.1 - -.PHONY: all -all: test lint - -.PHONY: test -test: - go test ./... - -.PHONY: coverage.out -coverage.out: - go test -covermode=count --coverprofile=$@ ./... - -.PHONY: lint -lint: - ./bin/golangci-lint run - -.PHONY: format -format: - find . -name \*.go | xargs bin/gofumports -local github.com/twpayne/go-geom -w - -.PHONY: generate -generate: - PATH=$$PATH:$(shell pwd)/bin go generate ./... - -.PHONY: install-tools -install-tools: ensure-goderive ensure-gofumports ensure-golangci-lint ensure-goyacc - -.PHONY: ensure-goderive -ensure-goderive: - if [ ! -x bin/goderive ] ; then \ - mkdir -p bin ; \ - ( cd $$(mktemp -d) && go mod init tmp && GOBIN=$(shell pwd)/bin go get github.com/awalterschulze/goderive ) ; \ - fi - -.PHONY: ensure-gofumports -ensure-gofumports: - if [ ! -x bin/gofumports ] ; then \ - mkdir -p bin ; \ - ( cd $$(mktemp -d) && go mod init tmp && GOBIN=$(shell pwd)/bin go get mvdan.cc/gofumpt/gofumports ) ; \ - fi - -.PHONY: ensure-golangci-lint -ensure-golangci-lint: - if [ ! -x bin/golangci-lint ] || ( ./bin/golangci-lint --version | grep -Fqv "version ${GOLANGCI_LINT_VERSION}" ) ; then \ - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- v${GOLANGCI_LINT_VERSION} ; \ - fi - -.PHONY: ensure-goyacc -ensure-goyacc: - if [ ! -x bin/goyacc ] ; then \ - mkdir -p bin ; \ - ( cd $$(mktemp -d) && go mod init tmp && GOBIN=$(shell pwd)/bin go get golang.org/x/tools/cmd/goyacc ) ; \ - fi diff --git a/vendor/github.com/twpayne/go-geom/README.md b/vendor/github.com/twpayne/go-geom/README.md deleted file mode 100644 index 7ca719f..0000000 --- a/vendor/github.com/twpayne/go-geom/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# go-geom - -[![PkgGoDev](https://pkg.go.dev/badge/github.com/twpayne/go-geom)](https://pkg.go.dev/github.com/twpayne/go-geom) -[![Go Report Card](https://goreportcard.com/badge/github.com/twpayne/go-geom)](https://goreportcard.com/report/github.com/twpayne/go-geom) - -Package `geom` implements efficient geometry types for geospatial applications. - -## Key features - -* OpenGeo Consortium-style geometries. -* Support for 2D and 3D geometries, measures (time and/or distance), and - unlimited extra dimensions. -* Encoding and decoding of common geometry formats (GeoJSON, KML, WKB, and - others) including [`sql.Scanner`](https://pkg.go.dev/database/sql#Scanner) and - [`driver.Value`](https://pkg.go.dev/database/sql/driver#Value) interface - implementations for easy database integration. -* [2D](https://pkg.go.dev/github.com/twpayne/go-geom/xy) and - [3D](https://pkg.go.dev/github.com/twpayne/go-geom/xyz) topology functions. -* Efficient, cache-friendly [internal representation](INTERNALS.md). -* Optional protection against malicious or malformed inputs. - -## Examples - -* [PostGIS, EWKB, and GeoJSON](https://github.com/twpayne/go-geom/tree/master/examples/postgis). - -## Detailed features - -### Geometry types - -* [Point](https://pkg.go.dev/github.com/twpayne/go-geom#Point) -* [LineString](https://pkg.go.dev/github.com/twpayne/go-geom#LineString) -* [Polygon](https://pkg.go.dev/github.com/twpayne/go-geom#Polygon) -* [MultiPoint](https://pkg.go.dev/github.com/twpayne/go-geom#MultiPoint) -* [MultiLineString](https://pkg.go.dev/github.com/twpayne/go-geom#MultiLineString) -* [MultiPolygon](https://pkg.go.dev/github.com/twpayne/go-geom#MultiPolygon) -* [GeometryCollection](https://pkg.go.dev/github.com/twpayne/go-geom#GeometryCollection) - -### Encoding and decoding - -* [GeoJSON](https://pkg.go.dev/github.com/twpayne/go-geom/encoding/geojson) -* [IGC](https://pkg.go.dev/github.com/twpayne/go-geom/encoding/igc) -* [KML](https://pkg.go.dev/github.com/twpayne/go-geom/encoding/kml) (encoding only) -* [WKB](https://pkg.go.dev/github.com/twpayne/go-geom/encoding/wkb) -* [EWKB](https://pkg.go.dev/github.com/twpayne/go-geom/encoding/ewkb) -* [WKT](https://pkg.go.dev/github.com/twpayne/go-geom/encoding/wkt) (encoding only) -* [WKB Hex](https://pkg.go.dev/github.com/twpayne/go-geom/encoding/wkbhex) -* [EWKB Hex](https://pkg.go.dev/github.com/twpayne/go-geom/encoding/ewkbhex) - -### Geometry functions - -* [XY](https://pkg.go.dev/github.com/twpayne/go-geom/xy) 2D geometry functions -* [XYZ](https://pkg.go.dev/github.com/twpayne/go-geom/xyz) 3D geometry functions - -## Protection against malicious or malformed inputs - -The WKB and EWKB formats encode geometry sizes, and memory is allocated for -those geometries. If the input is malicious or malformed, the memory allocation -can be very large, leading to a memory starvation denial-of-service attack -against the server. For example, a client might send a `MultiPoint` with header -indicating that it contains 2^32-1 points. This will result in the server -reading that geometry to allocate 2 × `sizeof(float64)` × (2^32-1) = 64GB of -memory to store those points. By default, malicious or malformed input -protection is disabled, but can be enabled by setting positive values for -`wkbcommon.MaxGeometryElements`. - -## Related libraries - -* [github.com/twpayne/go-gpx](https://github.com/twpayne/go-gpx) GPX encoding and decoding -* [github.com/twpayne/go-kml](https://github.com/twpayne/go-kml) KML encoding -* [github.com/twpayne/go-polyline](https://github.com/twpayne/go-polyline) Google Maps Polyline encoding and decoding -* [github.com/twpayne/go-vali](https://github.com/twpayne/go-vali) IGC validation - -## License - -BSD-2-Clause \ No newline at end of file diff --git a/vendor/github.com/twpayne/go-geom/bounds.go b/vendor/github.com/twpayne/go-geom/bounds.go deleted file mode 100644 index ab43980..0000000 --- a/vendor/github.com/twpayne/go-geom/bounds.go +++ /dev/null @@ -1,178 +0,0 @@ -package geom - -import "math" - -// A Bounds represents a multi-dimensional bounding box. -type Bounds struct { - layout Layout - min Coord - max Coord -} - -// NewBounds creates a new Bounds. -func NewBounds(layout Layout) *Bounds { - stride := layout.Stride() - min, max := make(Coord, stride), make(Coord, stride) - for i := 0; i < stride; i++ { - min[i], max[i] = math.Inf(1), math.Inf(-1) - } - return &Bounds{ - layout: layout, - min: min, - max: max, - } -} - -// Clone returns a deep copy of b. -func (b *Bounds) Clone() *Bounds { - return deriveCloneBounds(b) -} - -// Extend extends b to include geometry g. -func (b *Bounds) Extend(g T) *Bounds { - b.extendLayout(g.Layout()) - if b.layout == XYZM && g.Layout() == XYM { - return b.extendXYZMFlatCoordsWithXYM(g.FlatCoords(), 0, len(g.FlatCoords())) - } - return b.extendFlatCoords(g.FlatCoords(), 0, len(g.FlatCoords()), g.Stride()) -} - -// IsEmpty returns true if b is empty. -func (b *Bounds) IsEmpty() bool { - if b.layout == NoLayout { - return true - } - for i, stride := 0, b.layout.Stride(); i < stride; i++ { - if b.max[i] < b.min[i] { - return true - } - } - return false -} - -// Layout returns b's layout. -func (b *Bounds) Layout() Layout { - return b.layout -} - -// Max returns the maximum value in dimension dim. -func (b *Bounds) Max(dim int) float64 { - return b.max[dim] -} - -// Min returns the minimum value in dimension dim. -func (b *Bounds) Min(dim int) float64 { - return b.min[dim] -} - -// Overlaps returns true if b overlaps b2 in layout. -func (b *Bounds) Overlaps(layout Layout, b2 *Bounds) bool { - for i, stride := 0, layout.Stride(); i < stride; i++ { - if b.min[i] > b2.max[i] || b.max[i] < b2.min[i] { - return false - } - } - return true -} - -// Polygon returns b as a two-dimensional Polygon. -func (b *Bounds) Polygon() *Polygon { - if b.IsEmpty() { - return NewPolygonFlat(XY, nil, nil) - } - x1, y1 := b.min[0], b.min[1] - x2, y2 := b.max[0], b.max[1] - flatCoords := []float64{ - x1, y1, - x1, y2, - x2, y2, - x2, y1, - x1, y1, - } - return NewPolygonFlat(XY, flatCoords, []int{len(flatCoords)}) -} - -// Set sets the minimum and maximum values. args must be an even number of -// values: the first half are the minimum values for each dimension and the -// second half are the maximum values for each dimension. If necessary, the -// layout of b will be extended to cover all the supplied dimensions implied by -// args. -func (b *Bounds) Set(args ...float64) *Bounds { - if len(args)&1 != 0 { - panic("geom: even number of arguments required") - } - stride := len(args) / 2 - b.extendStride(stride) - for i := 0; i < stride; i++ { - b.min[i], b.max[i] = args[i], args[i+stride] - } - return b -} - -// SetCoords sets the minimum and maximum values of the Bounds. -func (b *Bounds) SetCoords(min, max Coord) *Bounds { - b.min = Coord(make([]float64, b.layout.Stride())) - b.max = Coord(make([]float64, b.layout.Stride())) - for i := 0; i < b.layout.Stride(); i++ { - b.min[i] = math.Min(min[i], max[i]) - b.max[i] = math.Max(min[i], max[i]) - } - return b -} - -// OverlapsPoint determines if the bounding box overlaps the point (point is -// within or on the border of the bounds). -func (b *Bounds) OverlapsPoint(layout Layout, point Coord) bool { - for i, stride := 0, layout.Stride(); i < stride; i++ { - if b.min[i] > point[i] || b.max[i] < point[i] { - return false - } - } - return true -} - -func (b *Bounds) extendFlatCoords(flatCoords []float64, offset, end, stride int) *Bounds { - b.extendStride(stride) - for i := offset; i < end; i += stride { - for j := 0; j < stride; j++ { - b.min[j] = math.Min(b.min[j], flatCoords[i+j]) - b.max[j] = math.Max(b.max[j], flatCoords[i+j]) - } - } - return b -} - -func (b *Bounds) extendLayout(layout Layout) { - switch { - case b.layout == XYZ && layout == XYM: - b.min = append(b.min, math.Inf(1)) - b.max = append(b.max, math.Inf(-1)) - b.layout = XYZM - case b.layout == XYM && (layout == XYZ || layout == XYZM): - b.min = append(b.min[:2], math.Inf(1), b.min[2]) - b.max = append(b.max[:2], math.Inf(-1), b.max[2]) - b.layout = XYZM - case b.layout < layout: - b.extendStride(layout.Stride()) - b.layout = layout - } -} - -func (b *Bounds) extendStride(stride int) { - for s := b.layout.Stride(); s < stride; s++ { - b.min = append(b.min, math.Inf(1)) - b.max = append(b.max, math.Inf(-1)) - } -} - -func (b *Bounds) extendXYZMFlatCoordsWithXYM(flatCoords []float64, offset, end int) *Bounds { - for i := offset; i < end; i += 3 { - b.min[0] = math.Min(b.min[0], flatCoords[i+0]) - b.max[0] = math.Max(b.max[0], flatCoords[i+0]) - b.min[1] = math.Min(b.min[1], flatCoords[i+1]) - b.max[1] = math.Max(b.max[1], flatCoords[i+1]) - b.min[3] = math.Min(b.min[3], flatCoords[i+2]) - b.max[3] = math.Max(b.max[3], flatCoords[i+2]) - } - return b -} diff --git a/vendor/github.com/twpayne/go-geom/derived.gen.go b/vendor/github.com/twpayne/go-geom/derived.gen.go deleted file mode 100644 index 44fda31..0000000 --- a/vendor/github.com/twpayne/go-geom/derived.gen.go +++ /dev/null @@ -1,314 +0,0 @@ -// Code generated by goderive DO NOT EDIT. - -package geom - -// deriveCloneBounds returns a clone of the src parameter. -func deriveCloneBounds(src *Bounds) *Bounds { - if src == nil { - return nil - } - dst := new(Bounds) - deriveDeepCopy(dst, src) - return dst -} - -// deriveCloneCoord returns a clone of the src parameter. -func deriveCloneCoord(src Coord) Coord { - if src == nil { - return nil - } - dst := make(Coord, len(src)) - deriveDeepCopy_(dst, src) - return dst -} - -// deriveCloneLinearRing returns a clone of the src parameter. -func deriveCloneLinearRing(src *LinearRing) *LinearRing { - if src == nil { - return nil - } - dst := new(LinearRing) - deriveDeepCopy_1(dst, src) - return dst -} - -// deriveCloneLineString returns a clone of the src parameter. -func deriveCloneLineString(src *LineString) *LineString { - if src == nil { - return nil - } - dst := new(LineString) - deriveDeepCopy_2(dst, src) - return dst -} - -// deriveCloneMultiLineString returns a clone of the src parameter. -func deriveCloneMultiLineString(src *MultiLineString) *MultiLineString { - if src == nil { - return nil - } - dst := new(MultiLineString) - deriveDeepCopy_3(dst, src) - return dst -} - -// deriveCloneMultiPoint returns a clone of the src parameter. -func deriveCloneMultiPoint(src *MultiPoint) *MultiPoint { - if src == nil { - return nil - } - dst := new(MultiPoint) - deriveDeepCopy_4(dst, src) - return dst -} - -// deriveCloneMultiPolygon returns a clone of the src parameter. -func deriveCloneMultiPolygon(src *MultiPolygon) *MultiPolygon { - if src == nil { - return nil - } - dst := new(MultiPolygon) - deriveDeepCopy_5(dst, src) - return dst -} - -// deriveClonePoint returns a clone of the src parameter. -func deriveClonePoint(src *Point) *Point { - if src == nil { - return nil - } - dst := new(Point) - deriveDeepCopy_6(dst, src) - return dst -} - -// deriveClonePolygon returns a clone of the src parameter. -func deriveClonePolygon(src *Polygon) *Polygon { - if src == nil { - return nil - } - dst := new(Polygon) - deriveDeepCopy_7(dst, src) - return dst -} - -// deriveDeepCopy recursively copies the contents of src into dst. -func deriveDeepCopy(dst, src *Bounds) { - dst.layout = src.layout - if src.min == nil { - dst.min = nil - } else { - if dst.min != nil { - if len(src.min) > len(dst.min) { - if cap(dst.min) >= len(src.min) { - dst.min = (dst.min)[:len(src.min)] - } else { - dst.min = make([]float64, len(src.min)) - } - } else if len(src.min) < len(dst.min) { - dst.min = (dst.min)[:len(src.min)] - } - } else { - dst.min = make([]float64, len(src.min)) - } - copy(dst.min, src.min) - } - if src.max == nil { - dst.max = nil - } else { - if dst.max != nil { - if len(src.max) > len(dst.max) { - if cap(dst.max) >= len(src.max) { - dst.max = (dst.max)[:len(src.max)] - } else { - dst.max = make([]float64, len(src.max)) - } - } else if len(src.max) < len(dst.max) { - dst.max = (dst.max)[:len(src.max)] - } - } else { - dst.max = make([]float64, len(src.max)) - } - copy(dst.max, src.max) - } -} - -// deriveDeepCopy_ recursively copies the contents of src into dst. -func deriveDeepCopy_(dst, src Coord) { - copy(dst, src) -} - -// deriveDeepCopy_1 recursively copies the contents of src into dst. -func deriveDeepCopy_1(dst, src *LinearRing) { - func() { - field := new(geom1) - deriveDeepCopy_8(field, &src.geom1) - dst.geom1 = *field - }() -} - -// deriveDeepCopy_2 recursively copies the contents of src into dst. -func deriveDeepCopy_2(dst, src *LineString) { - func() { - field := new(geom1) - deriveDeepCopy_8(field, &src.geom1) - dst.geom1 = *field - }() -} - -// deriveDeepCopy_3 recursively copies the contents of src into dst. -func deriveDeepCopy_3(dst, src *MultiLineString) { - func() { - field := new(geom2) - deriveDeepCopy_9(field, &src.geom2) - dst.geom2 = *field - }() -} - -// deriveDeepCopy_4 recursively copies the contents of src into dst. -func deriveDeepCopy_4(dst, src *MultiPoint) { - func() { - field := new(geom2) - deriveDeepCopy_9(field, &src.geom2) - dst.geom2 = *field - }() -} - -// deriveDeepCopy_5 recursively copies the contents of src into dst. -func deriveDeepCopy_5(dst, src *MultiPolygon) { - func() { - field := new(geom3) - deriveDeepCopy_10(field, &src.geom3) - dst.geom3 = *field - }() -} - -// deriveDeepCopy_6 recursively copies the contents of src into dst. -func deriveDeepCopy_6(dst, src *Point) { - func() { - field := new(geom0) - deriveDeepCopy_11(field, &src.geom0) - dst.geom0 = *field - }() -} - -// deriveDeepCopy_7 recursively copies the contents of src into dst. -func deriveDeepCopy_7(dst, src *Polygon) { - func() { - field := new(geom2) - deriveDeepCopy_9(field, &src.geom2) - dst.geom2 = *field - }() -} - -// deriveDeepCopy_8 recursively copies the contents of src into dst. -func deriveDeepCopy_8(dst, src *geom1) { - func() { - field := new(geom0) - deriveDeepCopy_11(field, &src.geom0) - dst.geom0 = *field - }() -} - -// deriveDeepCopy_9 recursively copies the contents of src into dst. -func deriveDeepCopy_9(dst, src *geom2) { - func() { - field := new(geom1) - deriveDeepCopy_8(field, &src.geom1) - dst.geom1 = *field - }() - if src.ends == nil { - dst.ends = nil - } else { - if dst.ends != nil { - if len(src.ends) > len(dst.ends) { - if cap(dst.ends) >= len(src.ends) { - dst.ends = (dst.ends)[:len(src.ends)] - } else { - dst.ends = make([]int, len(src.ends)) - } - } else if len(src.ends) < len(dst.ends) { - dst.ends = (dst.ends)[:len(src.ends)] - } - } else { - dst.ends = make([]int, len(src.ends)) - } - copy(dst.ends, src.ends) - } -} - -// deriveDeepCopy_10 recursively copies the contents of src into dst. -func deriveDeepCopy_10(dst, src *geom3) { - func() { - field := new(geom1) - deriveDeepCopy_8(field, &src.geom1) - dst.geom1 = *field - }() - if src.endss == nil { - dst.endss = nil - } else { - if dst.endss != nil { - if len(src.endss) > len(dst.endss) { - if cap(dst.endss) >= len(src.endss) { - dst.endss = (dst.endss)[:len(src.endss)] - } else { - dst.endss = make([][]int, len(src.endss)) - } - } else if len(src.endss) < len(dst.endss) { - dst.endss = (dst.endss)[:len(src.endss)] - } - } else { - dst.endss = make([][]int, len(src.endss)) - } - deriveDeepCopy_12(dst.endss, src.endss) - } -} - -// deriveDeepCopy_11 recursively copies the contents of src into dst. -func deriveDeepCopy_11(dst, src *geom0) { - dst.layout = src.layout - dst.stride = src.stride - if src.flatCoords == nil { - dst.flatCoords = nil - } else { - if dst.flatCoords != nil { - if len(src.flatCoords) > len(dst.flatCoords) { - if cap(dst.flatCoords) >= len(src.flatCoords) { - dst.flatCoords = (dst.flatCoords)[:len(src.flatCoords)] - } else { - dst.flatCoords = make([]float64, len(src.flatCoords)) - } - } else if len(src.flatCoords) < len(dst.flatCoords) { - dst.flatCoords = (dst.flatCoords)[:len(src.flatCoords)] - } - } else { - dst.flatCoords = make([]float64, len(src.flatCoords)) - } - copy(dst.flatCoords, src.flatCoords) - } - dst.srid = src.srid -} - -// deriveDeepCopy_12 recursively copies the contents of src into dst. -func deriveDeepCopy_12(dst, src [][]int) { - for src_i, src_value := range src { - if src_value == nil { - dst[src_i] = nil - } else { - if dst[src_i] != nil { - if len(src_value) > len(dst[src_i]) { - if cap(dst[src_i]) >= len(src_value) { - dst[src_i] = (dst[src_i])[:len(src_value)] - } else { - dst[src_i] = make([]int, len(src_value)) - } - } else if len(src_value) < len(dst[src_i]) { - dst[src_i] = (dst[src_i])[:len(src_value)] - } - } else { - dst[src_i] = make([]int, len(src_value)) - } - copy(dst[src_i], src_value) - } - } -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/geojson/geojson.go b/vendor/github.com/twpayne/go-geom/encoding/geojson/geojson.go deleted file mode 100644 index 80b5e1e..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/geojson/geojson.go +++ /dev/null @@ -1,630 +0,0 @@ -// Package geojson implements GeoJSON encoding and decoding. -package geojson - -import ( - "bytes" - "encoding/json" - "fmt" - "reflect" - "strconv" - - geom "github.com/twpayne/go-geom" -) - -var nullGeometry = []byte("null") - -// DefaultLayout is the default layout for empty geometries. -// FIXME This should be Codec-specific, not global. -var DefaultLayout = geom.XY - -// ErrDimensionalityTooLow is returned when the dimensionality is too low. -type ErrDimensionalityTooLow int - -func (e ErrDimensionalityTooLow) Error() string { - return fmt.Sprintf("geojson: dimensionality too low (%d)", int(e)) -} - -// ErrUnsupportedType is returned when the type is unsupported. -type ErrUnsupportedType string - -func (e ErrUnsupportedType) Error() string { - return fmt.Sprintf("geojson: unsupported type: %s", string(e)) -} - -// CRS is a deprecated field but still populated in some programs (e.g. PostGIS). -// See https://geojson.org/geojson-spec for original specification of CRS. -type CRS struct { - Type string `json:"type"` - Properties map[string]interface{} `json:"properties"` -} - -// A Geometry is a geometry in GeoJSON format. -type Geometry struct { - Type string `json:"type"` - BBox *json.RawMessage `json:"bbox,omitempty"` - CRS *CRS `json:"crs,omitempty"` - Coordinates *json.RawMessage `json:"coordinates,omitempty"` - Geometries *json.RawMessage `json:"geometries,omitempty"` -} - -// A Feature is a GeoJSON Feature. -type Feature struct { - ID string - BBox *geom.Bounds - Geometry geom.T - Properties map[string]interface{} -} - -type geojsonFeature struct { - Type string `json:"type"` - ID string `json:"id,omitempty"` - BBox []float64 `json:"bbox,omitempty"` - Geometry *Geometry `json:"geometry"` - Properties map[string]interface{} `json:"properties"` -} - -// A FeatureCollection is a GeoJSON FeatureCollection. -type FeatureCollection struct { - BBox *geom.Bounds - Features []*Feature -} - -type geojsonFeatureCollection struct { - Type string `json:"type"` - BBox []float64 `json:"bbox,omitempty"` - Features []*Feature `json:"features"` -} - -func guessLayout0(coords0 []float64) (geom.Layout, error) { - switch n := len(coords0); n { - case 0, 1: - return geom.NoLayout, ErrDimensionalityTooLow(len(coords0)) - case 2: - return geom.XY, nil - case 3: - return geom.XYZ, nil - case 4: - return geom.XYZM, nil - default: - return geom.Layout(n), nil - } -} - -func guessLayout1(coords1 []geom.Coord) (geom.Layout, error) { - if len(coords1) == 0 { - return DefaultLayout, nil - } - return guessLayout0(coords1[0]) -} - -func guessLayout2(coords2 [][]geom.Coord) (geom.Layout, error) { - if len(coords2) == 0 { - return DefaultLayout, nil - } - return guessLayout1(coords2[0]) -} - -func guessLayout3(coords3 [][][]geom.Coord) (geom.Layout, error) { - if len(coords3) == 0 { - return DefaultLayout, nil - } - return guessLayout2(coords3[0]) -} - -// Decode decodes g to a geometry. -func (g *Geometry) Decode() (geom.T, error) { - if g == nil { - return nil, nil - } - switch g.Type { - case "Point": - if g.Coordinates == nil { - return geom.NewPointEmpty(geom.NoLayout), nil - } - var coords geom.Coord - if err := json.Unmarshal(*g.Coordinates, &coords); err != nil { - return nil, err - } - if len(coords) == 0 { - return geom.NewPointEmpty(DefaultLayout), nil - } - layout, err := guessLayout0(coords) - if err != nil { - return nil, err - } - return geom.NewPoint(layout).SetCoords(coords) - case "LineString": - if g.Coordinates == nil { - return geom.NewLineString(geom.NoLayout), nil - } - var coords []geom.Coord - if err := json.Unmarshal(*g.Coordinates, &coords); err != nil { - return nil, err - } - layout, err := guessLayout1(coords) - if err != nil { - return nil, err - } - return geom.NewLineString(layout).SetCoords(coords) - case "Polygon": - if g.Coordinates == nil { - return geom.NewPolygon(geom.NoLayout), nil - } - var coords [][]geom.Coord - if err := json.Unmarshal(*g.Coordinates, &coords); err != nil { - return nil, err - } - layout, err := guessLayout2(coords) - if err != nil { - return nil, err - } - return geom.NewPolygon(layout).SetCoords(coords) - case "MultiPoint": - if g.Coordinates == nil { - return geom.NewMultiPoint(geom.NoLayout), nil - } - var coords []geom.Coord - if err := json.Unmarshal(*g.Coordinates, &coords); err != nil { - return nil, err - } - layout, err := guessLayout1(coords) - if err != nil { - return nil, err - } - return geom.NewMultiPoint(layout).SetCoords(coords) - case "MultiLineString": - if g.Coordinates == nil { - return geom.NewMultiLineString(geom.NoLayout), nil - } - var coords [][]geom.Coord - if err := json.Unmarshal(*g.Coordinates, &coords); err != nil { - return nil, err - } - layout, err := guessLayout2(coords) - if err != nil { - return nil, err - } - return geom.NewMultiLineString(layout).SetCoords(coords) - case "MultiPolygon": - if g.Coordinates == nil { - return geom.NewMultiPolygon(geom.NoLayout), nil - } - var coords [][][]geom.Coord - if err := json.Unmarshal(*g.Coordinates, &coords); err != nil { - return nil, err - } - layout, err := guessLayout3(coords) - if err != nil { - return nil, err - } - return geom.NewMultiPolygon(layout).SetCoords(coords) - case "GeometryCollection": - var geometries []Geometry - if g.Geometries != nil { - err := json.Unmarshal(*g.Geometries, &geometries) - if err != nil { - return nil, err - } - } - geoms := make([]geom.T, len(geometries)) - for i, subGeometry := range geometries { - var err error - geoms[i], err = subGeometry.Decode() - if err != nil { - return nil, err - } - } - gc := geom.NewGeometryCollection() - if err := gc.Push(geoms...); err != nil { - return nil, err - } - return gc, nil - default: - return nil, ErrUnsupportedType(g.Type) - } -} - -// EncodeGeometryOption applies extra metadata to the Geometry GeoJSON encoding. -type EncodeGeometryOption struct { - onGeometryHandler func(*Geometry, geom.T, ...EncodeGeometryOption) error - onFloat64Handler func(interface{}) interface{} -} - -// nestedFloat64WithMaxDecimalDigits is a wrapper around any nested array -// of float64s that will marshal into JSON with the maximum JSON digits. -type nestedFloat64WithMaxDecimalDigits struct { - obj interface{} - maxDecimalDigits int -} - -// MarshalJSON implements the json.Marshaller interface. -func (c *nestedFloat64WithMaxDecimalDigits) MarshalJSON() ([]byte, error) { - return c.marshalJSON([]byte{}, reflect.ValueOf(c.obj)) -} - -// marshalJSON is a helper routine that recurses down slices of float64s, -// appending float64 to a JSON list structure. -func (c *nestedFloat64WithMaxDecimalDigits) marshalJSON( - buf []byte, val reflect.Value, -) ([]byte, error) { - switch val.Kind() { - case reflect.Slice: - buf = append(buf, '[') - for i := 0; i < val.Len(); i++ { - if i > 0 { - buf = append(buf, ',') - } - var err error - buf, err = c.marshalJSON(buf, val.Index(i)) - if err != nil { - return nil, err - } - } - buf = append(buf, ']') - case reflect.Float64: - buf = strconv.AppendFloat(buf, val.Interface().(float64), 'f', c.maxDecimalDigits, 64) - if c.maxDecimalDigits > 0 { - buf = bytes.TrimRight(bytes.TrimRight(buf, "0"), ".") - } - default: - return nil, fmt.Errorf("unknown type of coord: %T", val) - } - return buf, nil -} - -// encodeJSONFloat64WithMaxDecimalDigits is an option implementation that converts slices of float64s -// to round to the maxDecimalDigits if necessary. -func encodeJSONFloat64WithMaxDecimalDigits(maxDecimalDigits int) func(interface{}) interface{} { - return func(obj interface{}) interface{} { - return &nestedFloat64WithMaxDecimalDigits{obj: obj, maxDecimalDigits: maxDecimalDigits} - } -} - -// EncodeGeometryWithBBox adds a bbox field to the Geometry GeoJSON encoding. -func EncodeGeometryWithBBox() EncodeGeometryOption { - return EncodeGeometryOption{ - onGeometryHandler: func(g *Geometry, t geom.T, opts ...EncodeGeometryOption) error { - bounds := t.Bounds() - if t.Empty() { - bounds = geom.NewBounds(t.Layout()) - } - bbox, err := encodeBBox(bounds) - if err != nil { - return err - } - var coords json.RawMessage - var bboxIn interface{} = bbox - for _, opt := range opts { - if opt.onFloat64Handler != nil { - bboxIn = opt.onFloat64Handler(bboxIn) - } - } - coords, err = json.Marshal(bboxIn) - if err != nil { - return err - } - g.BBox = &coords - return nil - }, - } -} - -// EncodeGeometryWithCRS adds the crs field to the Geometry GeoJSON encoding. -func EncodeGeometryWithCRS(crs *CRS) EncodeGeometryOption { - return EncodeGeometryOption{ - onGeometryHandler: func(g *Geometry, t geom.T, opts ...EncodeGeometryOption) error { - var err error - g.CRS = crs - return err - }, - } -} - -// EncodeGeometryWithMaxDecimalDigits encodes the Geometry with maximum decimal digits -// in the JSON representation. -func EncodeGeometryWithMaxDecimalDigits(maxDecimalDigits int) EncodeGeometryOption { - return EncodeGeometryOption{ - onFloat64Handler: encodeJSONFloat64WithMaxDecimalDigits(maxDecimalDigits), - } -} - -// Encode encodes g as a GeoJSON geometry. -func Encode(g geom.T, opts ...EncodeGeometryOption) (*Geometry, error) { - if g == nil { - return nil, nil - } - ret, err := encode(g, opts...) - if err != nil { - return nil, err - } - for _, opt := range opts { - if opt.onGeometryHandler != nil { - if err := opt.onGeometryHandler(ret, g, opts...); err != nil { - return nil, err - } - } - } - return ret, nil -} - -// encode encodes the geometry assuming it is not nil. -func encode(g geom.T, opts ...EncodeGeometryOption) (*Geometry, error) { - if g == nil { - return nil, nil - } - switch g := g.(type) { - case *geom.Point: - var coords json.RawMessage - var coordsIn interface{} - if !g.Empty() { - coordsIn = g.Coords() - } else { - coordsIn = []geom.Coord{} - } - for _, opt := range opts { - if opt.onFloat64Handler != nil { - coordsIn = opt.onFloat64Handler(coordsIn) - } - } - var err error - coords, err = json.Marshal(coordsIn) - if err != nil { - return nil, err - } - return &Geometry{ - Type: "Point", - Coordinates: &coords, - }, nil - case *geom.LineString: - var coords json.RawMessage - var coordsIn interface{} = g.Coords() - for _, opt := range opts { - if opt.onFloat64Handler != nil { - coordsIn = opt.onFloat64Handler(coordsIn) - } - } - coords, err := json.Marshal(coordsIn) - if err != nil { - return nil, err - } - return &Geometry{ - Type: "LineString", - Coordinates: &coords, - }, nil - case *geom.Polygon: - var coords json.RawMessage - var coordsIn interface{} = g.Coords() - for _, opt := range opts { - if opt.onFloat64Handler != nil { - coordsIn = opt.onFloat64Handler(coordsIn) - } - } - coords, err := json.Marshal(coordsIn) - if err != nil { - return nil, err - } - return &Geometry{ - Type: "Polygon", - Coordinates: &coords, - }, nil - case *geom.MultiPoint: - var coords json.RawMessage - var coordsIn interface{} = g.Coords() - for _, opt := range opts { - if opt.onFloat64Handler != nil { - coordsIn = opt.onFloat64Handler(coordsIn) - } - } - coords, err := json.Marshal(coordsIn) - if err != nil { - return nil, err - } - return &Geometry{ - Type: "MultiPoint", - Coordinates: &coords, - }, nil - case *geom.MultiLineString: - var coords json.RawMessage - var coordsIn interface{} = g.Coords() - for _, opt := range opts { - if opt.onFloat64Handler != nil { - coordsIn = opt.onFloat64Handler(coordsIn) - } - } - coords, err := json.Marshal(coordsIn) - if err != nil { - return nil, err - } - return &Geometry{ - Type: "MultiLineString", - Coordinates: &coords, - }, nil - case *geom.MultiPolygon: - var coords json.RawMessage - var coordsIn interface{} = g.Coords() - for _, opt := range opts { - if opt.onFloat64Handler != nil { - coordsIn = opt.onFloat64Handler(coordsIn) - } - } - coords, err := json.Marshal(coordsIn) - if err != nil { - return nil, err - } - return &Geometry{ - Type: "MultiPolygon", - Coordinates: &coords, - }, nil - case *geom.GeometryCollection: - var marshalledGeometries json.RawMessage - geometries := make([]*Geometry, len(g.Geoms())) - for i, subGeometry := range g.Geoms() { - var err error - geometries[i], err = encode(subGeometry, opts...) - if err != nil { - return nil, err - } - } - marshalledGeometries, err := json.Marshal(geometries) - if err != nil { - return nil, err - } - return &Geometry{ - Type: "GeometryCollection", - Geometries: &marshalledGeometries, - }, nil - default: - return nil, geom.ErrUnsupportedType{Value: g} - } -} - -// Marshal marshals an arbitrary geometry to a []byte. -func Marshal(g geom.T, opts ...EncodeGeometryOption) ([]byte, error) { - if g == nil { - return nullGeometry, nil - } - geojson, err := Encode(g, opts...) - if err != nil { - return nil, err - } - return json.Marshal(geojson) -} - -// Unmarshal unmarshalls a []byte to an arbitrary geometry. -func Unmarshal(data []byte, g *geom.T) error { - if bytes.Equal(data, nullGeometry) { - *g = nil - return nil - } - gg := &Geometry{} - if err := json.Unmarshal(data, gg); err != nil { - return err - } - if gg == nil { - *g = nil - return nil - } - var err error - *g, err = gg.Decode() - return err -} - -// decodeBBox decodes bb into a Bounds. -func decodeBBox(bb []float64) (*geom.Bounds, error) { - var layout geom.Layout - switch l := len(bb); l { - case 4: - layout = geom.XY - case 6: - layout = geom.XYZ - default: - return nil, ErrDimensionalityTooLow(l) - } - - return geom.NewBounds(layout).Set(bb...), nil -} - -// encodeBBox encodes b as a GeoJson Bounding Box. -func encodeBBox(b *geom.Bounds) ([]float64, error) { - switch l := b.Layout(); l { - case geom.XY, geom.XYM: - return []float64{b.Min(0), b.Min(1), b.Max(0), b.Max(1)}, nil - case geom.XYZ, geom.XYZM: - return []float64{ - b.Min(0), b.Min(1), b.Min(2), - b.Max(0), b.Max(1), b.Max(2), - }, nil - default: - return []float64{}, ErrUnsupportedType(rune(l)) - } -} - -// MarshalJSON implements json.Marshaler.MarshalJSON. -func (f *Feature) MarshalJSON() ([]byte, error) { - geometry, err := Encode(f.Geometry) - if err != nil { - return nil, err - } - - var bounds []float64 - if f.BBox != nil { - bounds, err = encodeBBox(f.BBox) - if err != nil { - return nil, err - } - } - - return json.Marshal(&geojsonFeature{ - ID: f.ID, - Type: "Feature", - BBox: bounds, - Geometry: geometry, - Properties: f.Properties, - }) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON. -func (f *Feature) UnmarshalJSON(data []byte) error { - var gf geojsonFeature - if err := json.Unmarshal(data, &gf); err != nil { - return err - } - if gf.Type != "Feature" { - return ErrUnsupportedType(gf.Type) - } - f.ID = gf.ID - var err error - if gf.BBox != nil { - f.BBox, err = decodeBBox(gf.BBox) - } - if err != nil { - return err - } - f.Geometry, err = gf.Geometry.Decode() - if err != nil { - return err - } - f.Properties = gf.Properties - return nil -} - -// MarshalJSON implements json.Marshaler.MarshalJSON. -func (fc *FeatureCollection) MarshalJSON() ([]byte, error) { - gfc := &geojsonFeatureCollection{ - Type: "FeatureCollection", - Features: fc.Features, - } - - if fc.BBox != nil { - bounds, err := encodeBBox(fc.BBox) - if err != nil { - return nil, err - } - gfc.BBox = bounds - } - - if gfc.Features == nil { - gfc.Features = []*Feature{} - } - return json.Marshal(gfc) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON. -func (fc *FeatureCollection) UnmarshalJSON(data []byte) error { - var gfc geojsonFeatureCollection - if err := json.Unmarshal(data, &gfc); err != nil { - return err - } - var err error - if gfc.BBox != nil { - fc.BBox, err = decodeBBox(gfc.BBox) - if err != nil { - return err - } - } - if gfc.Type != "FeatureCollection" { - return ErrUnsupportedType(gfc.Type) - } - fc.Features = gfc.Features - return nil -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/.gitignore b/vendor/github.com/twpayne/go-geom/encoding/wkt/.gitignore deleted file mode 100644 index 2652053..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/.gitignore +++ /dev/null @@ -1 +0,0 @@ -y.output diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/encode.go b/vendor/github.com/twpayne/go-geom/encoding/wkt/encode.go deleted file mode 100644 index f982609..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/encode.go +++ /dev/null @@ -1,251 +0,0 @@ -package wkt - -import ( - "strconv" - "strings" - - "github.com/twpayne/go-geom" -) - -// Encode translates a geometry to the corresponding WKT. -func (e *Encoder) Encode(g geom.T) (string, error) { - sb := &strings.Builder{} - if err := e.write(sb, g); err != nil { - return "", err - } - return sb.String(), nil -} - -func (e *Encoder) write(sb *strings.Builder, g geom.T) error { - var typeString string - switch g := g.(type) { - case *geom.Point: - typeString = tPoint - case *geom.LineString, *geom.LinearRing: - typeString = tLineString - case *geom.Polygon: - typeString = tPolygon - case *geom.MultiPoint: - typeString = tMultiPoint - case *geom.MultiLineString: - typeString = tMultiLineString - case *geom.MultiPolygon: - typeString = tMultiPolygon - case *geom.GeometryCollection: - typeString = tGeometryCollection - default: - return geom.ErrUnsupportedType{Value: g} - } - layout := g.Layout() - switch layout { - case geom.NoLayout: - // Special case for empty GeometryCollections - if g, ok := g.(*geom.GeometryCollection); !ok || !g.Empty() { - return geom.ErrUnsupportedLayout(layout) - } - case geom.XY: - case geom.XYZ: - typeString += tZ - case geom.XYM: - typeString += tM - case geom.XYZM: - typeString += tZm - default: - return geom.ErrUnsupportedLayout(layout) - } - if _, err := sb.WriteString(typeString); err != nil { - return err - } - switch g := g.(type) { - case *geom.Point: - if g.Empty() { - return e.writeEMPTY(sb) - } - return e.writeFlatCoords0(sb, g.FlatCoords(), layout.Stride()) - case *geom.LineString: - if g.Empty() { - return e.writeEMPTY(sb) - } - return e.writeFlatCoords1(sb, g.FlatCoords(), layout.Stride()) - case *geom.LinearRing: - if g.Empty() { - return e.writeEMPTY(sb) - } - return e.writeFlatCoords1(sb, g.FlatCoords(), layout.Stride()) - case *geom.Polygon: - if g.Empty() { - return e.writeEMPTY(sb) - } - return e.writeFlatCoords2(sb, g.FlatCoords(), 0, g.Ends(), layout.Stride()) - case *geom.MultiPoint: - if g.NumPoints() == 0 { - return e.writeEMPTY(sb) - } - return e.writeFlatCoords1Ends(sb, g.FlatCoords(), 0, g.Ends()) - case *geom.MultiLineString: - if g.NumLineStrings() == 0 { - return e.writeEMPTY(sb) - } - return e.writeFlatCoords2(sb, g.FlatCoords(), 0, g.Ends(), layout.Stride()) - case *geom.MultiPolygon: - if g.NumPolygons() == 0 { - return e.writeEMPTY(sb) - } - return e.writeFlatCoords3(sb, g.FlatCoords(), g.Endss(), layout.Stride()) - case *geom.GeometryCollection: - if g.NumGeoms() == 0 { - return e.writeEMPTY(sb) - } - if _, err := sb.WriteRune('('); err != nil { - return err - } - for i, g := range g.Geoms() { - if i != 0 { - if _, err := sb.WriteString(", "); err != nil { - return err - } - } - if err := e.write(sb, g); err != nil { - return err - } - } - _, err := sb.WriteRune(')') - return err - } - return nil -} - -func (e *Encoder) writeCoord(sb *strings.Builder, coord []float64) error { - for i, x := range coord { - if i != 0 { - if _, err := sb.WriteRune(' '); err != nil { - return err - } - } - coordStr := strconv.FormatFloat(x, 'f', e.maxDecimalDigits, 64) - if e.maxDecimalDigits > 0 { - coordStr = strings.TrimRight(strings.TrimRight(coordStr, "0"), ".") - } - if _, err := sb.WriteString(coordStr); err != nil { - return err - } - } - return nil -} - -//nolint:interfacer -func (e *Encoder) writeEMPTY(sb *strings.Builder) error { - _, err := sb.WriteString(tEmpty) - return err -} - -func (e *Encoder) writeFlatCoords0(sb *strings.Builder, flatCoords []float64, stride int) error { - if _, err := sb.WriteRune('('); err != nil { - return err - } - if err := e.writeCoord(sb, flatCoords[:stride]); err != nil { - return err - } - _, err := sb.WriteRune(')') - return err -} - -func (e *Encoder) writeFlatCoords1(sb *strings.Builder, flatCoords []float64, stride int) error { - if _, err := sb.WriteRune('('); err != nil { - return err - } - for i, n := 0, len(flatCoords); i < n; i += stride { - if i != 0 { - if _, err := sb.WriteString(", "); err != nil { - return err - } - } - if err := e.writeCoord(sb, flatCoords[i:i+stride]); err != nil { - return err - } - } - _, err := sb.WriteRune(')') - return err -} - -func (e *Encoder) writeFlatCoords1Ends( - sb *strings.Builder, flatCoords []float64, start int, ends []int, -) error { - if _, err := sb.WriteRune('('); err != nil { - return err - } - for i, end := range ends { - if i != 0 { - if _, err := sb.WriteString(", "); err != nil { - return err - } - } - if end <= start { - if err := e.writeEMPTY(sb); err != nil { - return err - } - } else { - if err := e.writeCoord(sb, flatCoords[start:end]); err != nil { - return err - } - } - start = end - } - _, err := sb.WriteRune(')') - return err -} - -func (e *Encoder) writeFlatCoords2( - sb *strings.Builder, flatCoords []float64, start int, ends []int, stride int, -) error { - if _, err := sb.WriteRune('('); err != nil { - return err - } - for i, end := range ends { - if i != 0 { - if _, err := sb.WriteString(", "); err != nil { - return err - } - } - if end <= start { - if err := e.writeEMPTY(sb); err != nil { - return err - } - } else { - if err := e.writeFlatCoords1(sb, flatCoords[start:end], stride); err != nil { - return err - } - } - start = end - } - _, err := sb.WriteRune(')') - return err -} - -func (e *Encoder) writeFlatCoords3( - sb *strings.Builder, flatCoords []float64, endss [][]int, stride int, -) error { - if _, err := sb.WriteRune('('); err != nil { - return err - } - start := 0 - for i, ends := range endss { - if i != 0 { - if _, err := sb.WriteString(", "); err != nil { - return err - } - } - if len(ends) == 0 { - if err := e.writeEMPTY(sb); err != nil { - return err - } - } else { - if err := e.writeFlatCoords2(sb, flatCoords, start, ends, stride); err != nil { - return err - } - start = ends[len(ends)-1] - } - } - _, err := sb.WriteRune(')') - return err -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/lex.go b/vendor/github.com/twpayne/go-geom/encoding/wkt/lex.go deleted file mode 100644 index b2cc91e..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/lex.go +++ /dev/null @@ -1,540 +0,0 @@ -package wkt - -import ( - "fmt" - "strconv" - "strings" - "unicode" - - "github.com/twpayne/go-geom" -) - -// Constant expected by parser when lexer reaches EOF. -const eof = 0 - -// We define a base type geometry as a geometry type keyword without a type suffix. -// For example, POINT is a base type and POINTZ is not. -// -// The layout of the geometry is determined by the first geometry type keyword if it is a M, Z, or ZM variant. -// If it is a base type geometry, the layout is determined by the number of coordinates in the first point. -// If it is a geometrycollection, the type is the type of the first geometry in the collection. -// -// Edge cases involving geometrycollections: -// 1. GEOMETRYCOLLECTION (no type suffix) is allowed to be of type M. Normally a geometry without a type suffix -// is only allowed to be XY, XYZ, or XYZM. -// 2. A base type empty geometry (e.g. POINT EMPTY) in a GEOMETRYCOLLECTIONM, GEOMETRYCOLLECTIONZ, GEOMETRYCOLLECTIONZM -// is permitted and takes on the type of the collection. Normally, such a geometry is XY. -// 3. As a consequence of 1. and 2., special care must be given to parsing base geometry types inside a XYM -// geometrycollection since a base geometry type is permitted inside a GEOMETRYCOLECTIONM only if it is empty. -// For example, GEOMETRYCOLLECTION M (POINT EMPTY) should parse while GEOMETRYCOLLECTION M (POINT(0 0 0)) shouldn't. - -// lexPos is a struct for keeping track of both the actual and human-readable lexed position in the string. -type lexPos struct { - wktPos int - lineNum int - lineStart int - linePos int -} - -// advanceOne advances a lexPos by one position on the same line. -func (lp *lexPos) advanceOne() { - lp.wktPos++ - lp.linePos++ -} - -// advanceLine advances a lexPos by a newline. -func (lp *lexPos) advanceLine() { - lp.wktPos++ - lp.lineNum++ - lp.lineStart = lp.wktPos - lp.linePos = 0 -} - -// wktLex is the lexer for lexing WKT tokens. -type wktLex struct { - wkt string - curPos lexPos - lastPos lexPos - ret geom.T - lytStack layoutStack - lastErr error -} - -// newWKTLex returns a pointer to a newly created wktLex. -func newWKTLex(wkt string) *wktLex { - return &wktLex{wkt: wkt, lytStack: makeLayoutStack()} -} - -// Lex lexes a token from the input. -func (l *wktLex) Lex(yylval *wktSymType) int { - // Skip leading spaces. - l.trimLeft() - l.lastPos = l.curPos - - // Lex a token. - switch c := l.peek(); c { - case eof: - return eof - case '(', ')', ',': - return int(l.next()) - default: - switch { - case unicode.IsLetter(c): - return l.keyword() - case isValidFirstNumRune(c): - return l.num(yylval) - default: - l.next() - l.setLexError("character") - return eof - } - } -} - -// keyword lexes a string keyword. -func (l *wktLex) keyword() int { - var b strings.Builder - - for { - c := l.peek() - if !unicode.IsLetter(c) { - break - } - // Add the uppercase letter to the string builder. - b.WriteRune(unicode.ToUpper(l.next())) - } - - // Check for extra dimensions for geometry types. - if b.String() != "EMPTY" { - l.trimLeft() - if unicode.ToUpper(l.peek()) == 'Z' { - l.next() - b.WriteRune('Z') - } - if unicode.ToUpper(l.peek()) == 'M' { - l.next() - b.WriteRune('M') - } - } - - ret := keywordToken(b.String()) - if ret == eof { - l.setLexError("keyword") - } - - return ret -} - -// num lexes a number. -func (l *wktLex) num(yylval *wktSymType) int { - var b strings.Builder - - for { - c := l.peek() - if !isNumRune(c) { - break - } - b.WriteRune(l.next()) - } - - fl, err := strconv.ParseFloat(b.String(), 64) - if err != nil { - l.setLexError("number") - return eof - } - yylval.coord = fl - return NUM -} - -// peek returns the next rune to be read. -func (l *wktLex) peek() rune { - if l.curPos.wktPos == len(l.wkt) { - return eof - } - return rune(l.wkt[l.curPos.wktPos]) -} - -// next returns the next rune to be read and advances the curPos counter. -func (l *wktLex) next() rune { - c := l.peek() - if c != eof { - if c == '\n' { - l.curPos.advanceLine() - } else { - l.curPos.advanceOne() - } - } - return c -} - -// trimLeft increments the curPos counter until the next rune to be read is no longer a whitespace character. -func (l *wktLex) trimLeft() { - for { - c := l.peek() - if c == eof || !unicode.IsSpace(c) { - break - } - l.next() - } -} - -// validateStrideAndSetDefaultLayoutIfNoLayout validates whether a stride is consistent with the currently parsed -// layout and sets the layout with the default layout for that stride if no layout has been determined yet. -func (l *wktLex) validateStrideAndSetDefaultLayoutIfNoLayout(stride int) bool { - if !isValidStrideForLayout(stride, l.curLayout()) { - l.setIncorrectStrideError(stride, "") - return false - } - l.setLayoutIfNoLayout(defaultLayoutForStride(stride)) - return true -} - -// validateNonEmptyGeometryAllowed validates whether a non-empty geometry is allowed given the currently -// parsed layout. It is used to handle the edge case where a GEOMETRYCOLLECTIONM may have base type -// geometries only if they are empty. -func (l *wktLex) validateNonEmptyGeometryAllowed() bool { - if l.nextScannedPointMustBeEmpty() { - if l.curLayout() != geom.XYM { - panic("nextPointMustBeEmpty is true but layout is not XYM") - } - l.setIncorrectUsageOfBaseTypeInsteadOfMVariantInGeometryCollectionError() - return false - } - return true -} - -// validateAndSetLayoutIfNoLayout validates whether a newly parsed layout is compatible with the currently parsed -// layout and sets the layout if the current layout is unknown. -func (l *wktLex) validateAndSetLayoutIfNoLayout(layout geom.Layout) bool { - if !isCompatibleLayout(l.curLayout(), layout) { - l.setIncorrectLayoutError(layout, "") - return false - } - l.setLayoutIfNoLayout(layout) - return true -} - -// validateBaseGeometryTypeAllowed validates whether a base geometry type is permitted based on the parsed layout. -func (l *wktLex) validateBaseGeometryTypeAllowed() bool { - // Base type geometry are permitted in GEOMETRYCOLLECTIONM, GEOMETRYCOLLECTIONZ, GEOMETRYCOLLECTIONZM. - // The stride of the coordinates/whether EMPTY is allowed will be validated later. - if !l.currentlyInBaseTypeCollection() { - // A base type is only permitted in a GEOMETRYCOLLECTIONM if it is EMPTY. We require an EMPTY instead of - // coordinates follow this base type keyword. - if l.curLayout() == geom.XYM { - l.lytStack.setTopNextPointMustBeEmpty(true) - } - return true - } - - // At the top level, a base geometry type is permitted. In a base type GEOMETRYCOLLECTION, a base type geometry - // is only not permitted if the parsed layout is XYM. - switch l.curLayout() { - case geom.XYM: - if l.lytStack.atTopLevel() { - panic("base geometry check for XYM layout should not happen at top level") - } - l.setIncorrectUsageOfBaseTypeInsteadOfMVariantInGeometryCollectionError() - return false - default: - return true - } -} - -// validateBaseTypeEmptyAllowed validates whether a base type EMPTY is permitted based on the parsed layout. -func (l *wktLex) validateBaseTypeEmptyAllowed() bool { - // EMPTY is always permitted in a non-base type collection. - if !l.currentlyInBaseTypeCollection() { - // A base type EMPTY geometry is the only permitted base type geometry in a GEOMETRYCOLLECTIONM - // and we have now finished reading one. - if l.curLayout() == geom.XYM { - l.lytStack.setTopNextPointMustBeEmpty(false) - } - return true - } - - // In a base type collection (or at the top level), EMPTY can only be XY. - switch l.curLayout() { - case geom.NoLayout: - l.setLayoutIfNoLayout(geom.XY) - fallthrough - case geom.XY: - return true - default: - l.setIncorrectLayoutError(geom.XY, "EMPTY is XY layout in base geometry type") - return false - } -} - -// validateAndPushLayoutStackFrame validates that a given layout is valid and pushes a frame to the layout stack. -func (l *wktLex) validateAndPushLayoutStackFrame(layout geom.Layout) bool { - // Check that the new layout is compatible with the previous one. - // Note a base type GEOMETRYCOLLECTION is permitted inside every layout. - if layout != geom.NoLayout && !isCompatibleLayout(l.curLayout(), layout) { - l.setIncorrectLayoutError(layout, "") - return false - } - l.lytStack.push(layout) - return true -} - -// validateAndPopLayoutStackFrame pops a frame from the layout stack and validates that the type is valid. -func (l *wktLex) validateAndPopLayoutStackFrame() bool { - poppedLayout := l.lytStack.pop() - // Update the outer context with the type we parsed in the inner context. - if !isCompatibleLayout(l.curLayout(), poppedLayout) { - // This should never happen. Any layout incompatibility should error at the point it's discovered. - panic("uncaught layout incompatibility") - } - l.setLayoutIfNoLayout(poppedLayout) - return true -} - -// validateLayoutStackAtEnd returns whether the layout stack is in the expected state at the end of parsing. -func (l *wktLex) validateLayoutStackAtEnd() bool { - l.lytStack.assertNoGeometryCollectionFramesLeft() - return true -} - -func (l *wktLex) isValidPoint(flatCoords []float64) bool { - switch stride := len(flatCoords); stride { - case 1: - l.setParseError("not enough coordinates", "each point needs at least 2 coords") - return false - case 2, 3, 4: - return l.validateStrideAndSetDefaultLayoutIfNoLayout(stride) - default: - l.setParseError("too many coordinates", "each point can have at most 4 coords") - return false - } -} - -func (l *wktLex) isValidLineString(flatCoords []float64) bool { - stride := l.curLayout().Stride() - if len(flatCoords) < 2*stride { - l.setParseError("non-empty linestring with only one point", "minimum number of points is 2") - return false - } - return true -} - -func (l *wktLex) isValidPolygonRing(flatCoords []float64) bool { - stride := l.curLayout().Stride() - if len(flatCoords) < 4*stride { - l.setParseError("polygon ring doesn't have enough points", "minimum number of points is 4") - return false - } - for i := 0; i < stride; i++ { - if flatCoords[i] != flatCoords[len(flatCoords)-stride+i] { - l.setParseError("polygon ring not closed", "ensure first and last point are the same") - return false - } - } - return true -} - -// setLayoutIfNoLayout sets the parsed layout if no layout has been determined yet. -func (l *wktLex) setLayoutIfNoLayout(layout geom.Layout) { - if l.curLayout() == geom.NoLayout { - l.lytStack.setTopLayout(layout) - } -} - -// setIncorrectUsageOfBaseTypeInsteadOfMVariantInGeometryCollectionError sets the error when a -// base type geometry is used in a base type GEOMETRYCOLLECTION when the parsed layout is XYM. -func (l *wktLex) setIncorrectUsageOfBaseTypeInsteadOfMVariantInGeometryCollectionError() { - l.setIncorrectLayoutError( - geom.NoLayout, - "the M variant is required for non-empty XYM geometries in GEOMETRYCOLLECTIONs", - ) -} - -// setIncorrectStrideError sets the error when a newly parsed stride doesn't match the currently parsed layout. -func (l *wktLex) setIncorrectStrideError(incorrectStride int, hint string) { - problem := fmt.Sprintf("mixed dimensionality, parsed layout is %s so expecting %d coords but got %d coords", - layoutName(l.curLayout()), l.curLayout().Stride(), incorrectStride) - l.setParseError(problem, hint) -} - -// setIncorrectLayoutError sets the error when a newly parsed layout doesn't match the currently parsed layout. -func (l *wktLex) setIncorrectLayoutError(incorrectLayout geom.Layout, hint string) { - problem := fmt.Sprintf("mixed dimensionality, parsed layout is %s but encountered layout of %s", - layoutName(l.curLayout()), layoutName(incorrectLayout)) - l.setParseError(problem, hint) -} - -// curLayout returns the currently parsed layout. -func (l *wktLex) curLayout() geom.Layout { - return l.lytStack.topLayout() -} - -// currentlyInBaseTypeCollection returns whether we are currently scanning inside a base type GEOMETRYCOLLECTION. -func (l *wktLex) currentlyInBaseTypeCollection() bool { - return l.lytStack.topInBaseTypeCollection() -} - -// nextScannedPointMustBeEmpty returns whether the next scanned point must be empty. -func (l *wktLex) nextScannedPointMustBeEmpty() bool { - return l.lytStack.topNextPointMustBeEmpty() -} - -// setLexError is called by Lex when a lexing (tokenizing) error is detected. -func (l *wktLex) setLexError(expectedTokType string) { - l.Error(fmt.Sprintf("invalid %s", expectedTokType)) -} - -// setParseError is called when a context-sensitive error is detected during parsing. -// The generated wktParse function can only catch context-free errors. -func (l *wktLex) setParseError(problem string, hint string) { - l.setSyntaxError(problem, hint) -} - -// Error is called by wktParse if an error is encountered during parsing (takes place after lexing). -func (l *wktLex) Error(s string) { - l.setSyntaxError(strings.TrimPrefix(s, "syntax error: "), "") -} - -// setSyntaxError is called when a syntax error occurs. -func (l *wktLex) setSyntaxError(problem string, hint string) { - l.setError(&SyntaxError{ - wkt: l.wkt, - problem: problem, - lineNum: l.lastPos.lineNum + 1, - lineStart: l.lastPos.lineStart, - linePos: l.lastPos.linePos, - hint: hint, - }) -} - -// setError sets the lastErr field of the wktLex object with the given error. -func (l *wktLex) setError(err error) { - // Lex errors take precedence. - if l.lastErr == nil { - l.lastErr = err - } -} - -// isValidFirstNumRune returns whether a rune is valid as the first rune in a number (coordinate). -func isValidFirstNumRune(r rune) bool { - switch r { - // PostGIS doesn't seem to accept numbers with a leading '+'. - case '+': - return false - // Scientific notation number must have a number before the e. - // Checking this case explicitly helps disambiguate between a number and a keyword. - case 'e', 'E': - return false - default: - return isNumRune(r) - } -} - -// isNumRune returns whether a rune could potentially be a part of a number (coordinate). -func isNumRune(r rune) bool { - switch r { - case '-', '.', 'e', 'E', '+': - return true - default: - return unicode.IsDigit(r) - } -} - -// keywordsMap defines a map from strings to tokens. -var keywordsMap = map[string]int{ - "EMPTY": EMPTY, - "POINT": POINT, "POINTM": POINTM, "POINTZ": POINTZ, "POINTZM": POINTZM, - "LINESTRING": LINESTRING, "LINESTRINGM": LINESTRINGM, "LINESTRINGZ": LINESTRINGZ, "LINESTRINGZM": LINESTRINGZM, - "POLYGON": POLYGON, "POLYGONM": POLYGONM, "POLYGONZ": POLYGONZ, "POLYGONZM": POLYGONZM, - "MULTIPOINT": MULTIPOINT, "MULTIPOINTM": MULTIPOINTM, "MULTIPOINTZ": MULTIPOINTZ, "MULTIPOINTZM": MULTIPOINTZM, - "MULTILINESTRING": MULTILINESTRING, "MULTILINESTRINGM": MULTILINESTRINGM, - "MULTILINESTRINGZ": MULTILINESTRINGZ, "MULTILINESTRINGZM": MULTILINESTRINGZM, - "MULTIPOLYGON": MULTIPOLYGON, "MULTIPOLYGONM": MULTIPOLYGONM, - "MULTIPOLYGONZ": MULTIPOLYGONZ, "MULTIPOLYGONZM": MULTIPOLYGONZM, - "GEOMETRYCOLLECTION": GEOMETRYCOLLECTION, "GEOMETRYCOLLECTIONM": GEOMETRYCOLLECTIONM, - "GEOMETRYCOLLECTIONZ": GEOMETRYCOLLECTIONZ, "GEOMETRYCOLLECTIONZM": GEOMETRYCOLLECTIONZM, -} - -// keywordToken returns the yacc token for a WKT keyword. -func keywordToken(tokStr string) int { - tok, ok := keywordsMap[strings.ToUpper(tokStr)] - if !ok { - return eof - } - return tok -} - -// isValidStrideForLayout returns whether a stride is consistent with a parsed layout. -// It is used for ensuring points have the right number of coordinates for the parsed layout. -func isValidStrideForLayout(stride int, layout geom.Layout) bool { - switch layout { - case geom.NoLayout: - return true - case geom.XY: - return stride == 2 - case geom.XYM: - return stride == 3 - case geom.XYZ: - return stride == 3 - case geom.XYZM: - return stride == 4 - default: - // This should never happen. - panic(fmt.Sprintf("unknown geom.Layout %d", layout)) - } -} - -// defaultLayoutForStride returns the default layout for a base type geometry with the given stride. -func defaultLayoutForStride(stride int) geom.Layout { - switch stride { - case 2: - return geom.XY - case 3: - return geom.XYZ - case 4: - return geom.XYZM - default: - // This should never happen. - panic(fmt.Sprintf("unsupported stride %d", stride)) - } -} - -// isCompatibleLayout returns whether a second layout is compatible with the first layout. -// It is used for ensuring the layout of each nested geometry is consistent with the previously parsed layout. -func isCompatibleLayout(outerLayout geom.Layout, innerLayout geom.Layout) bool { - assertValidLayout(outerLayout) - assertValidLayout(innerLayout) - if outerLayout != innerLayout && outerLayout != geom.NoLayout { - return false - } - return true -} - -// layoutName returns the string representation of each layout. -func layoutName(layout geom.Layout) string { - switch layout { - // geom.NoLayout is used when a base type geometry is read. - case geom.NoLayout: - return "not XYM" - case geom.XY: - return "XY" - case geom.XYM: - return "XYM" - case geom.XYZ: - return "XYZ" - case geom.XYZM: - return "XYZM" - default: - // This should never happen. - panic(fmt.Sprintf("unknown geom.Layout %d", layout)) - } -} - -// assertValidLayout asserts that a given layout is valid and panics if it is not. -func assertValidLayout(layout geom.Layout) { - switch layout { - case geom.NoLayout, geom.XY, geom.XYM, geom.XYZ, geom.XYZM: - return - default: - panic(fmt.Sprintf("unknown geom.Layout %d", layout)) - } -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_errors.go b/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_errors.go deleted file mode 100644 index bf9055f..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_errors.go +++ /dev/null @@ -1,70 +0,0 @@ -package wkt - -import ( - "fmt" - "strings" -) - -// SyntaxError is an error that occurs during parsing of a WKT string. -type SyntaxError struct { - wkt string - problem string - lineNum int - lineStart int - linePos int - hint string -} - -// Error generates a detailed syntax error message with line and pos numbers as well as a snippet of -// the erroneous input. -func (e *SyntaxError) Error() string { - // These constants define the maximum number of characters of the line to show on each side of the cursor. - const ( - leftPadding = 30 - rightPadding = 30 - ) - - // Print the problem along with line and pos number. - err := fmt.Sprintf("syntax error: %s at line %d, pos %d\n", e.problem, e.lineNum, e.linePos) - - // Find the position of the end of the line. - lineEnd := strings.IndexRune(e.wkt[e.lineStart:], '\n') - if lineEnd == -1 { - lineEnd = len(e.wkt) - } else { - lineEnd += e.lineStart - } - - // Prepend the line with the line number. - strLinePrefix := fmt.Sprintf("LINE %d: ", e.lineNum) - strLineSuffix := "\n" - - // Trim the start and end of the line as needed. - snipPos := e.linePos - snipStart := e.lineStart - leftMin := e.lineStart + e.linePos - leftPadding - if snipStart < leftMin { - snipPos -= leftMin - snipStart - snipStart = leftMin - strLinePrefix += "..." - } - snipEnd := lineEnd - rightMax := e.lineStart + e.linePos + rightPadding - if snipEnd > rightMax { - snipEnd = rightMax - strLineSuffix = "..." + strLineSuffix - } - - // Print a cursor pointing to the token where the problem occurred. - snippet := e.wkt[snipStart:snipEnd] - snippet = strings.ReplaceAll(snippet, "\t", " ") - err += strLinePrefix + snippet + strLineSuffix - err += fmt.Sprintf("%s^", strings.Repeat(" ", len(strLinePrefix)+snipPos)) - - // Print a hint, if applicable. - if e.hint != "" { - err += fmt.Sprintf("\nHINT: %s", e.hint) - } - - return err -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_stack.go b/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_stack.go deleted file mode 100644 index 52fcab8..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_stack.go +++ /dev/null @@ -1,128 +0,0 @@ -package wkt - -import ( - "fmt" - - "github.com/twpayne/go-geom" -) - -// layoutStackObj is a stack object used in the layout parsing stack. -type layoutStackObj struct { - // layout is the currently parsed geometry type. - layout geom.Layout - // inBaseTypeCollection is a bool where true means we are at the top-level or in a base type GEOMETRYCOLLECTION. - inBaseTypeCollection bool - // nextPointMustBeEmpty is a bool where true means the next scanned point must be EMPTY. It is used to handle - // the edge case where a base type geometry is allowed in a GEOMETRYCOLLECTIONM but only if it is EMPTY. - nextPointMustBeEmpty bool -} - -// layoutStack is a stack used for parsing the geometry type. An initial frame is pushed for the top level context. -// After that, a frame is pushed for each (nested) geometrycollection is encountered and it is popped when we -// finish scanning that geometrycollection. The initial frame should never be popped off. -type layoutStack struct { - data []layoutStackObj -} - -// makeLayoutStack returns a newly created layoutStack. An initial frame is pushed for the top level context. -func makeLayoutStack() layoutStack { - return layoutStack{ - data: []layoutStackObj{{layout: geom.NoLayout, inBaseTypeCollection: true}}, - } -} - -// push constructs a layoutStackObj for a layout and pushes it onto the layout stack. -func (s *layoutStack) push(layout geom.Layout) { - // inBaseTypeCollection inherits from outer context. - stackObj := layoutStackObj{ - layout: layout, - inBaseTypeCollection: s.topInBaseTypeCollection(), - } - - switch layout { - case geom.NoLayout: - stackObj.layout = s.topLayout() - case geom.XYM, geom.XYZ, geom.XYZM: - stackObj.inBaseTypeCollection = false - default: - // This should never happen. - panic(fmt.Sprintf("unknown geom.Layout %d", layout)) - } - - s.data = append(s.data, stackObj) -} - -// pop pops a layoutStackObj from the layout stack and returns its layout. -func (s *layoutStack) pop() geom.Layout { - s.assertNotEmpty() - if s.atTopLevel() { - panic("top level stack frame should never be popped") - } - curTopLayout := s.topLayout() - s.data = s.data[:len(s.data)-1] - return curTopLayout -} - -// top returns a pointer to the layoutStackObj currently at the top of the stack. -func (s *layoutStack) top() *layoutStackObj { - s.assertNotEmpty() - return &s.data[len(s.data)-1] -} - -// topLayout returns the layout field of the topmost layoutStackObj. -func (s *layoutStack) topLayout() geom.Layout { - return s.top().layout -} - -// topLayout returns the inBaseTypeCollection field of the topmost layoutStackObj. -func (s *layoutStack) topInBaseTypeCollection() bool { - return s.top().inBaseTypeCollection -} - -// topLayout returns the nextPointMustBeEmpty field of the topmost layoutStackObj. -func (s *layoutStack) topNextPointMustBeEmpty() bool { - return s.top().nextPointMustBeEmpty -} - -// setTopLayout sets the layout field of the topmost layoutStackObj. -func (s *layoutStack) setTopLayout(layout geom.Layout) { - switch layout { - case geom.XY, geom.XYM, geom.XYZ, geom.XYZM: - s.top().layout = layout - case geom.NoLayout: - panic("setTopLayout should not be called with geom.NoLayout") - default: - // This should never happen. - panic(fmt.Sprintf("unknown geom.Layout %d", layout)) - } -} - -// setTopNextPointMustBeEmpty sets the nextPointMustBeEmpty field of the topmost layoutStackObj. -func (s *layoutStack) setTopNextPointMustBeEmpty(nextPointMustBeEmpty bool) { - if s.topLayout() != geom.XYM { - panic("setTopNextPointMustBeEmpty called for non-XYM geometry collection") - } - s.top().nextPointMustBeEmpty = nextPointMustBeEmpty -} - -// assertNotEmpty checks that the stack is not empty and panics if it is. -func (s *layoutStack) assertNotEmpty() { - // Layout stack should never be empty. - if len(s.data) == 0 { - panic("layout stack is empty") - } -} - -// assertNoGeometryCollectionFramesLeft checks that no frames corresponding to geometrycollections are left on the stack. -func (s *layoutStack) assertNoGeometryCollectionFramesLeft() { - // The initial stack frame should be the only one remaining at the end. - if !s.atTopLevel() { - panic("layout stack still has geometrycollection frames") - } -} - -// atTopLevel returns whether or not the stack has only the first frame which represents that we are currently -// not inside a geometrycollection. -func (s *layoutStack) atTopLevel() bool { - return len(s.data) == 1 -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_types.go b/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_types.go deleted file mode 100644 index 532e529..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/lex_types.go +++ /dev/null @@ -1,54 +0,0 @@ -package wkt - -type geomFlatCoordsRepr struct { - flatCoords []float64 - ends []int -} - -func makeGeomFlatCoordsRepr(flatCoords []float64) geomFlatCoordsRepr { - return geomFlatCoordsRepr{flatCoords: flatCoords, ends: []int{len(flatCoords)}} -} - -func appendGeomFlatCoordsReprs(p1 geomFlatCoordsRepr, p2 geomFlatCoordsRepr) geomFlatCoordsRepr { - if len(p1.ends) > 0 { - p1LastEnd := p1.ends[len(p1.ends)-1] - for i := range p2.ends { - p2.ends[i] += p1LastEnd - } - } - return geomFlatCoordsRepr{flatCoords: append(p1.flatCoords, p2.flatCoords...), ends: append(p1.ends, p2.ends...)} -} - -type multiPolygonFlatCoordsRepr struct { - flatCoords []float64 - endss [][]int -} - -func makeMultiPolygonFlatCoordsRepr(p geomFlatCoordsRepr) multiPolygonFlatCoordsRepr { - if p.flatCoords == nil { - return multiPolygonFlatCoordsRepr{flatCoords: nil, endss: [][]int{nil}} - } - return multiPolygonFlatCoordsRepr{flatCoords: p.flatCoords, endss: [][]int{p.ends}} -} - -func appendMultiPolygonFlatCoordsRepr( - p1 multiPolygonFlatCoordsRepr, p2 multiPolygonFlatCoordsRepr, -) multiPolygonFlatCoordsRepr { - p1LastEndsLastEnd := 0 - for i := len(p1.endss) - 1; i >= 0; i-- { - if len(p1.endss[i]) > 0 { - p1LastEndsLastEnd = p1.endss[i][len(p1.endss[i])-1] - break - } - } - if p1LastEndsLastEnd > 0 { - for i := range p2.endss { - for j := range p2.endss[i] { - p2.endss[i][j] += p1LastEndsLastEnd - } - } - } - return multiPolygonFlatCoordsRepr{ - flatCoords: append(p1.flatCoords, p2.flatCoords...), endss: append(p1.endss, p2.endss...), - } -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.gen.go b/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.gen.go deleted file mode 100644 index 0832845..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.gen.go +++ /dev/null @@ -1,1166 +0,0 @@ -// Code generated by goyacc -l -o wkt.gen.go -p wkt wkt.y. DO NOT EDIT. - -package wkt - -import ( - __yyfmt__ "fmt" - - "github.com/twpayne/go-geom" -) - -type wktSymType struct { - yys int - str string - geom geom.T - coord float64 - coordList []float64 - flatRepr geomFlatCoordsRepr - multiPolyFlatRepr multiPolygonFlatCoordsRepr - geomList []geom.T - geomCollect *geom.GeometryCollection -} - -const ( - POINT = 57346 - POINTM = 57347 - POINTZ = 57348 - POINTZM = 57349 - LINESTRING = 57350 - LINESTRINGM = 57351 - LINESTRINGZ = 57352 - LINESTRINGZM = 57353 - POLYGON = 57354 - POLYGONM = 57355 - POLYGONZ = 57356 - POLYGONZM = 57357 - MULTIPOINT = 57358 - MULTIPOINTM = 57359 - MULTIPOINTZ = 57360 - MULTIPOINTZM = 57361 - MULTILINESTRING = 57362 - MULTILINESTRINGM = 57363 - MULTILINESTRINGZ = 57364 - MULTILINESTRINGZM = 57365 - MULTIPOLYGON = 57366 - MULTIPOLYGONM = 57367 - MULTIPOLYGONZ = 57368 - MULTIPOLYGONZM = 57369 - GEOMETRYCOLLECTION = 57370 - GEOMETRYCOLLECTIONM = 57371 - GEOMETRYCOLLECTIONZ = 57372 - GEOMETRYCOLLECTIONZM = 57373 - EMPTY = 57374 - NUM = 57375 -) - -var wktToknames = [...]string{ - "$end", - "error", - "$unk", - "POINT", - "POINTM", - "POINTZ", - "POINTZM", - "LINESTRING", - "LINESTRINGM", - "LINESTRINGZ", - "LINESTRINGZM", - "POLYGON", - "POLYGONM", - "POLYGONZ", - "POLYGONZM", - "MULTIPOINT", - "MULTIPOINTM", - "MULTIPOINTZ", - "MULTIPOINTZM", - "MULTILINESTRING", - "MULTILINESTRINGM", - "MULTILINESTRINGZ", - "MULTILINESTRINGZM", - "MULTIPOLYGON", - "MULTIPOLYGONM", - "MULTIPOLYGONZ", - "MULTIPOLYGONZM", - "GEOMETRYCOLLECTION", - "GEOMETRYCOLLECTIONM", - "GEOMETRYCOLLECTIONZ", - "GEOMETRYCOLLECTIONZM", - "EMPTY", - "NUM", - "'('", - "')'", - "','", -} - -var wktStatenames = [...]string{} - -const ( - wktEofCode = 1 - wktErrCode = 2 - wktInitialStackSize = 16 -) - -var wktExca = [...]int{ - -1, 1, - 1, -1, - -2, 0, -} - -const wktPrivate = 57344 - -const wktLast = 218 - -var wktAct = [...]int{ - 66, 2, 116, 126, 131, 106, 65, 111, 128, 121, - 60, 57, 137, 118, 155, 156, 61, 70, 58, 101, - 75, 114, 81, 63, 87, 69, 63, 64, 104, 63, - 61, 63, 90, 63, 62, 63, 107, 68, 63, 61, - 72, 84, 77, 61, 83, 78, 89, 108, 59, 94, - 58, 67, 153, 154, 71, 92, 74, 97, 80, 61, - 86, 151, 152, 93, 149, 150, 147, 148, 145, 146, - 143, 144, 141, 142, 139, 140, 57, 102, 138, 57, - 61, 97, 58, 27, 113, 109, 26, 25, 70, 63, - 24, 70, 23, 22, 136, 63, 56, 21, 123, 133, - 20, 63, 19, 18, 17, 95, 124, 16, 15, 14, - 13, 12, 134, 11, 99, 10, 1, 91, 119, 135, - 88, 85, 130, 125, 129, 132, 127, 82, 79, 120, - 115, 122, 117, 76, 73, 110, 103, 112, 105, 100, - 98, 96, 9, 8, 7, 57, 6, 57, 5, 102, - 4, 161, 113, 70, 160, 70, 163, 63, 165, 164, - 162, 63, 158, 133, 123, 63, 3, 0, 0, 0, - 0, 0, 124, 159, 0, 0, 134, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 0, 0, 157, 129, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, -} - -var wktPact = [...]int{ - 186, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 16, 27, 27, 16, 27, 27, 16, 27, 27, -16, - 11, -16, 7, -16, -2, 21, 27, 27, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 24, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 24, -1000, -1000, -1000, - 16, -1000, -1000, -1000, -1000, 48, -1000, -1000, 48, -1000, - -1000, -16, -1000, -1000, -16, -1000, -1000, -16, -1000, -1000, - -16, -1000, 186, -1000, -1000, -23, 45, -1000, 39, -1000, - 37, -1000, -1000, 35, -1000, -1000, -1000, -1000, -1000, -1000, - 33, -1000, -1000, -1000, -1000, 31, -1000, -1000, -1000, -1000, - 29, -1000, -1000, -1000, -1000, 26, -1000, -1000, -1000, -1000, - 17, -1000, -1000, -1000, -1000, -21, -1000, -1000, -1000, -1000, - 24, -1000, 16, -1000, 48, -1000, 48, -1000, -16, -1000, - -16, -1000, -16, -1000, -16, -1000, 186, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -} - -var wktPgo = [...]int{ - 0, 1, 166, 150, 148, 146, 144, 143, 142, 36, - 21, 10, 141, 47, 85, 140, 6, 13, 19, 139, - 8, 5, 138, 137, 28, 7, 136, 135, 134, 133, - 132, 131, 2, 9, 130, 129, 128, 127, 126, 125, - 3, 4, 123, 122, 121, 120, 119, 117, 116, 115, - 113, 111, 110, 109, 108, 107, 104, 103, 102, 100, - 97, 93, 92, 90, 87, 86, 83, 0, -} - -var wktR1 = [...]int{ - 0, 48, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 49, 49, 50, 51, 51, 51, 3, 3, - 3, 52, 52, 53, 54, 54, 54, 4, 4, 4, - 55, 55, 56, 57, 57, 57, 5, 5, 5, 5, - 58, 59, 59, 59, 6, 6, 6, 6, 60, 61, - 61, 61, 7, 7, 7, 7, 62, 63, 63, 63, - 8, 8, 8, 47, 46, 46, 64, 64, 65, 66, - 66, 66, 67, 44, 45, 43, 43, 42, 42, 40, - 41, 38, 38, 39, 39, 36, 37, 34, 34, 35, - 35, 32, 33, 30, 30, 31, 31, 28, 29, 26, - 26, 27, 27, 24, 25, 22, 22, 23, 23, 21, - 21, 20, 19, 19, 18, 17, 16, 15, 15, 14, - 13, 12, 12, 9, 10, 11, -} - -var wktR2 = [...]int{ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, - 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 3, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 3, 3, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 3, 1, 1, 1, 3, 3, 1, 3, - 1, 2, 1, 1, 1, 1, -} - -var wktChk = [...]int{ - -1000, -48, -1, -2, -3, -4, -5, -6, -7, -8, - -49, -50, -51, -52, -53, -54, -55, -56, -57, -58, - -59, -60, -61, -62, -63, -64, -65, -66, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, -14, -67, 34, -9, - -11, 32, -10, -11, -17, -16, -67, -9, -10, -20, - -67, -9, -10, -28, -9, -67, -29, -10, 34, -36, - -9, -67, -37, -10, 34, -44, -9, -67, -45, -10, - 34, -47, 34, -9, -10, -13, -12, 33, -15, -13, - -19, -18, -16, -26, -24, -22, -21, -9, -13, -14, - -27, -25, -23, -21, -10, -34, -32, -30, -17, -9, - -35, -33, -31, -17, -10, -42, -40, -38, -20, -9, - -43, -41, -39, -20, -10, -46, -1, 35, 33, 35, - 36, 35, 36, 35, 36, 35, 36, 35, 36, 35, - 36, 35, 36, 35, 36, 35, 36, -13, -18, -24, - -25, -32, -33, -40, -41, -1, -} - -var wktDef = [...]int{ - 0, -2, 1, 2, 3, 4, 5, 6, 7, 8, - 0, 12, 13, 0, 21, 22, 0, 30, 31, 0, - 0, 0, 0, 0, 0, 0, 66, 67, 14, 15, - 16, 17, 23, 24, 25, 26, 32, 33, 34, 35, - 40, 41, 42, 43, 48, 49, 50, 51, 56, 57, - 58, 59, 68, 69, 70, 71, 9, 0, 72, 10, - 123, 125, 11, 124, 18, 115, 0, 19, 20, 27, - 0, 28, 29, 36, 38, 0, 37, 39, 0, 44, - 46, 0, 45, 47, 0, 52, 54, 0, 53, 55, - 0, 60, 0, 61, 62, 0, 120, 122, 0, 118, - 0, 113, 114, 0, 100, 103, 105, 106, 109, 110, - 0, 102, 104, 107, 108, 0, 88, 91, 93, 94, - 0, 90, 92, 95, 96, 0, 78, 79, 81, 82, - 0, 76, 80, 83, 84, 0, 65, 119, 121, 116, - 0, 111, 0, 97, 0, 98, 0, 85, 0, 86, - 0, 73, 0, 74, 0, 63, 0, 117, 112, 99, - 101, 87, 89, 77, 75, 64, -} - -var wktTok1 = [...]int{ - 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 34, 35, 3, 3, 36, -} - -var wktTok2 = [...]int{ - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, -} - -var wktTok3 = [...]int{ - 0, -} - -var wktErrorMessages = [...]struct { - state int - token int - msg string -}{} - -/* parser for yacc output */ - -var ( - wktDebug = 0 - wktErrorVerbose = true -) - -type wktLexer interface { - Lex(lval *wktSymType) int - Error(s string) -} - -type wktParser interface { - Parse(wktLexer) int - Lookahead() int -} - -type wktParserImpl struct { - lval wktSymType - stack [wktInitialStackSize]wktSymType - char int -} - -func (p *wktParserImpl) Lookahead() int { - return p.char -} - -func wktNewParser() wktParser { - return &wktParserImpl{} -} - -const wktFlag = -1000 - -func wktTokname(c int) string { - if c >= 1 && c-1 < len(wktToknames) { - if wktToknames[c-1] != "" { - return wktToknames[c-1] - } - } - return __yyfmt__.Sprintf("tok-%v", c) -} - -func wktStatname(s int) string { - if s >= 0 && s < len(wktStatenames) { - if wktStatenames[s] != "" { - return wktStatenames[s] - } - } - return __yyfmt__.Sprintf("state-%v", s) -} - -func wktErrorMessage(state, lookAhead int) string { - const TOKSTART = 4 - - if !wktErrorVerbose { - return "syntax error" - } - - for _, e := range wktErrorMessages { - if e.state == state && e.token == lookAhead { - return "syntax error: " + e.msg - } - } - - res := "syntax error: unexpected " + wktTokname(lookAhead) - - // To match Bison, suggest at most four expected tokens. - expected := make([]int, 0, 4) - - // Look for shiftable tokens. - base := wktPact[state] - for tok := TOKSTART; tok-1 < len(wktToknames); tok++ { - if n := base + tok; n >= 0 && n < wktLast && wktChk[wktAct[n]] == tok { - if len(expected) == cap(expected) { - return res - } - expected = append(expected, tok) - } - } - - if wktDef[state] == -2 { - i := 0 - for wktExca[i] != -1 || wktExca[i+1] != state { - i += 2 - } - - // Look for tokens that we accept or reduce. - for i += 2; wktExca[i] >= 0; i += 2 { - tok := wktExca[i] - if tok < TOKSTART || wktExca[i+1] == 0 { - continue - } - if len(expected) == cap(expected) { - return res - } - expected = append(expected, tok) - } - - // If the default action is to accept or reduce, give up. - if wktExca[i+1] != 0 { - return res - } - } - - for i, tok := range expected { - if i == 0 { - res += ", expecting " - } else { - res += " or " - } - res += wktTokname(tok) - } - return res -} - -func wktlex1(lex wktLexer, lval *wktSymType) (char, token int) { - token = 0 - char = lex.Lex(lval) - if char <= 0 { - token = wktTok1[0] - goto out - } - if char < len(wktTok1) { - token = wktTok1[char] - goto out - } - if char >= wktPrivate { - if char < wktPrivate+len(wktTok2) { - token = wktTok2[char-wktPrivate] - goto out - } - } - for i := 0; i < len(wktTok3); i += 2 { - token = wktTok3[i+0] - if token == char { - token = wktTok3[i+1] - goto out - } - } - -out: - if token == 0 { - token = wktTok2[1] /* unknown char */ - } - if wktDebug >= 3 { - __yyfmt__.Printf("lex %s(%d)\n", wktTokname(token), uint(char)) - } - return char, token -} - -func wktParse(wktlex wktLexer) int { - return wktNewParser().Parse(wktlex) -} - -func (wktrcvr *wktParserImpl) Parse(wktlex wktLexer) int { - var wktn int - var wktVAL wktSymType - var wktDollar []wktSymType - _ = wktDollar // silence set and not used - wktS := wktrcvr.stack[:] - - Nerrs := 0 /* number of errors */ - Errflag := 0 /* error recovery flag */ - wktstate := 0 - wktrcvr.char = -1 - wkttoken := -1 // wktrcvr.char translated into internal numbering - defer func() { - // Make sure we report no lookahead when not parsing. - wktstate = -1 - wktrcvr.char = -1 - wkttoken = -1 - }() - wktp := -1 - goto wktstack - -ret0: - return 0 - -ret1: - return 1 - -wktstack: - /* put a state and value onto the stack */ - if wktDebug >= 4 { - __yyfmt__.Printf("char %v in %v\n", wktTokname(wkttoken), wktStatname(wktstate)) - } - - wktp++ - if wktp >= len(wktS) { - nyys := make([]wktSymType, len(wktS)*2) - copy(nyys, wktS) - wktS = nyys - } - wktS[wktp] = wktVAL - wktS[wktp].yys = wktstate - -wktnewstate: - wktn = wktPact[wktstate] - if wktn <= wktFlag { - goto wktdefault /* simple state */ - } - if wktrcvr.char < 0 { - wktrcvr.char, wkttoken = wktlex1(wktlex, &wktrcvr.lval) - } - wktn += wkttoken - if wktn < 0 || wktn >= wktLast { - goto wktdefault - } - wktn = wktAct[wktn] - if wktChk[wktn] == wkttoken { /* valid shift */ - wktrcvr.char = -1 - wkttoken = -1 - wktVAL = wktrcvr.lval - wktstate = wktn - if Errflag > 0 { - Errflag-- - } - goto wktstack - } - -wktdefault: - /* default state action */ - wktn = wktDef[wktstate] - if wktn == -2 { - if wktrcvr.char < 0 { - wktrcvr.char, wkttoken = wktlex1(wktlex, &wktrcvr.lval) - } - - /* look through exception table */ - xi := 0 - for { - if wktExca[xi+0] == -1 && wktExca[xi+1] == wktstate { - break - } - xi += 2 - } - for xi += 2; ; xi += 2 { - wktn = wktExca[xi+0] - if wktn < 0 || wktn == wkttoken { - break - } - } - wktn = wktExca[xi+1] - if wktn < 0 { - goto ret0 - } - } - if wktn == 0 { - /* error ... attempt to resume parsing */ - switch Errflag { - case 0: /* brand new error */ - wktlex.Error(wktErrorMessage(wktstate, wkttoken)) - Nerrs++ - if wktDebug >= 1 { - __yyfmt__.Printf("%s", wktStatname(wktstate)) - __yyfmt__.Printf(" saw %s\n", wktTokname(wkttoken)) - } - fallthrough - - case 1, 2: /* incompletely recovered error ... try again */ - Errflag = 3 - - /* find a state where "error" is a legal shift action */ - for wktp >= 0 { - wktn = wktPact[wktS[wktp].yys] + wktErrCode - if wktn >= 0 && wktn < wktLast { - wktstate = wktAct[wktn] /* simulate a shift of "error" */ - if wktChk[wktstate] == wktErrCode { - goto wktstack - } - } - - /* the current p has no shift on "error", pop stack */ - if wktDebug >= 2 { - __yyfmt__.Printf("error recovery pops state %d\n", wktS[wktp].yys) - } - wktp-- - } - /* there is no state on the stack with an error shift ... abort */ - goto ret1 - - case 3: /* no shift yet; clobber input char */ - if wktDebug >= 2 { - __yyfmt__.Printf("error recovery discards %s\n", wktTokname(wkttoken)) - } - if wkttoken == wktEofCode { - goto ret1 - } - wktrcvr.char = -1 - wkttoken = -1 - goto wktnewstate /* try again in the same state */ - } - } - - /* reduction by production wktn */ - if wktDebug >= 2 { - __yyfmt__.Printf("reduce %v in:\n\t%v\n", wktn, wktStatname(wktstate)) - } - - wktnt := wktn - wktpt := wktp - _ = wktpt // guard against "declared and not used" - - wktp -= wktR2[wktn] - // wktp is now the index of $0. Perform the default action. Iff the - // reduced production is ε, $1 is possibly out of range. - if wktp+1 >= len(wktS) { - nyys := make([]wktSymType, len(wktS)*2) - copy(nyys, wktS) - wktS = nyys - } - wktVAL = wktS[wktp+1] - - /* consult goto table to find next state */ - wktn = wktR1[wktn] - wktg := wktPgo[wktn] - wktj := wktg + wktS[wktp].yys + 1 - - if wktj >= wktLast { - wktstate = wktAct[wktg] - } else { - wktstate = wktAct[wktj] - if wktChk[wktstate] != -wktn { - wktstate = wktAct[wktg] - } - } - // dummy call; replaced with literal code - switch wktnt { - - case 1: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateLayoutStackAtEnd() - if !ok { - return 1 - } - wktlex.(*wktLex).ret = wktDollar[1].geom - } - case 8: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndPopLayoutStackFrame() - if !ok { - return 1 - } - err := wktDollar[1].geomCollect.SetLayout(wktlex.(*wktLex).curLayout()) - if err != nil { - wktlex.(*wktLex).setError(err) - return 1 - } - wktVAL.geom = wktDollar[1].geomCollect - } - case 9: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewPointFlat(wktlex.(*wktLex).curLayout(), wktDollar[2].coordList) - } - case 10: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewPointEmpty(wktlex.(*wktLex).curLayout()) - } - case 11: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewPointEmpty(wktlex.(*wktLex).curLayout()) - } - case 14: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - case 15: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } - case 16: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } - case 17: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - case 18: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewLineStringFlat(wktlex.(*wktLex).curLayout(), wktDollar[2].coordList) - } - case 19: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewLineString(wktlex.(*wktLex).curLayout()) - } - case 20: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewLineString(wktlex.(*wktLex).curLayout()) - } - case 23: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - case 24: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } - case 25: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } - case 26: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - case 27: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewPolygonFlat(wktlex.(*wktLex).curLayout(), wktDollar[2].flatRepr.flatCoords, wktDollar[2].flatRepr.ends) - } - case 28: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewPolygon(wktlex.(*wktLex).curLayout()) - } - case 29: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewPolygon(wktlex.(*wktLex).curLayout()) - } - case 32: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - case 33: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } - case 34: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } - case 35: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - case 36: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiPointFlat( - wktlex.(*wktLex).curLayout(), wktDollar[2].flatRepr.flatCoords, geom.NewMultiPointFlatOptionWithEnds(wktDollar[2].flatRepr.ends), - ) - } - case 37: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiPointFlat( - wktlex.(*wktLex).curLayout(), wktDollar[2].flatRepr.flatCoords, geom.NewMultiPointFlatOptionWithEnds(wktDollar[2].flatRepr.ends), - ) - } - case 38: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiPoint(wktlex.(*wktLex).curLayout()) - } - case 39: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiPoint(wktlex.(*wktLex).curLayout()) - } - case 40: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - case 41: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } - case 42: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } - case 43: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - case 44: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiLineStringFlat(wktlex.(*wktLex).curLayout(), wktDollar[2].flatRepr.flatCoords, wktDollar[2].flatRepr.ends) - } - case 45: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiLineStringFlat(wktlex.(*wktLex).curLayout(), wktDollar[2].flatRepr.flatCoords, wktDollar[2].flatRepr.ends) - } - case 46: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiLineString(wktlex.(*wktLex).curLayout()) - } - case 47: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiLineString(wktlex.(*wktLex).curLayout()) - } - case 48: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - case 49: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } - case 50: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } - case 51: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - case 52: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiPolygonFlat(wktlex.(*wktLex).curLayout(), wktDollar[2].multiPolyFlatRepr.flatCoords, wktDollar[2].multiPolyFlatRepr.endss) - } - case 53: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiPolygonFlat(wktlex.(*wktLex).curLayout(), wktDollar[2].multiPolyFlatRepr.flatCoords, wktDollar[2].multiPolyFlatRepr.endss) - } - case 54: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiPolygon(wktlex.(*wktLex).curLayout()) - } - case 55: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geom = geom.NewMultiPolygon(wktlex.(*wktLex).curLayout()) - } - case 56: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - case 57: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } - case 58: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } - case 59: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - case 60: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - newCollection := geom.NewGeometryCollection() - err := newCollection.Push(wktDollar[2].geomList...) - if err != nil { - wktlex.(*wktLex).setError(err) - return 1 - } - wktVAL.geomCollect = newCollection - } - case 61: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geomCollect = geom.NewGeometryCollection() - } - case 62: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.geomCollect = geom.NewGeometryCollection() - } - case 63: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.geomList = wktDollar[2].geomList - } - case 64: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.geomList = append(wktDollar[1].geomList, wktDollar[3].geom) - } - case 65: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.geomList = []geom.T{wktDollar[1].geom} - } - case 68: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndPushLayoutStackFrame(geom.NoLayout) - if !ok { - return 1 - } - } - case 69: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndPushLayoutStackFrame(geom.XYM) - if !ok { - return 1 - } - } - case 70: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndPushLayoutStackFrame(geom.XYZ) - if !ok { - return 1 - } - } - case 71: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateAndPushLayoutStackFrame(geom.XYZM) - if !ok { - return 1 - } - } - case 72: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateNonEmptyGeometryAllowed() - if !ok { - return 1 - } - } - case 73: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.multiPolyFlatRepr = wktDollar[2].multiPolyFlatRepr - } - case 74: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.multiPolyFlatRepr = wktDollar[2].multiPolyFlatRepr - } - case 75: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.multiPolyFlatRepr = appendMultiPolygonFlatCoordsRepr(wktDollar[1].multiPolyFlatRepr, wktDollar[3].multiPolyFlatRepr) - } - case 77: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.multiPolyFlatRepr = appendMultiPolygonFlatCoordsRepr(wktDollar[1].multiPolyFlatRepr, wktDollar[3].multiPolyFlatRepr) - } - case 79: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.multiPolyFlatRepr = makeMultiPolygonFlatCoordsRepr(wktDollar[1].flatRepr) - } - case 80: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.multiPolyFlatRepr = makeMultiPolygonFlatCoordsRepr(wktDollar[1].flatRepr) - } - case 82: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.flatRepr = makeGeomFlatCoordsRepr(wktDollar[1].coordList) - } - case 84: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.flatRepr = makeGeomFlatCoordsRepr(wktDollar[1].coordList) - } - case 85: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = wktDollar[2].flatRepr - } - case 86: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = wktDollar[2].flatRepr - } - case 87: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = appendGeomFlatCoordsReprs(wktDollar[1].flatRepr, wktDollar[3].flatRepr) - } - case 89: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = appendGeomFlatCoordsReprs(wktDollar[1].flatRepr, wktDollar[3].flatRepr) - } - case 91: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.flatRepr = makeGeomFlatCoordsRepr(wktDollar[1].coordList) - } - case 92: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.flatRepr = makeGeomFlatCoordsRepr(wktDollar[1].coordList) - } - case 97: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = wktDollar[2].flatRepr - } - case 98: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = wktDollar[2].flatRepr - } - case 99: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = appendGeomFlatCoordsReprs(wktDollar[1].flatRepr, wktDollar[3].flatRepr) - } - case 101: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = appendGeomFlatCoordsReprs(wktDollar[1].flatRepr, wktDollar[3].flatRepr) - } - case 103: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.flatRepr = makeGeomFlatCoordsRepr(wktDollar[1].coordList) - } - case 104: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.flatRepr = makeGeomFlatCoordsRepr(wktDollar[1].coordList) - } - case 111: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = wktDollar[2].flatRepr - } - case 112: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.flatRepr = appendGeomFlatCoordsReprs(wktDollar[1].flatRepr, wktDollar[3].flatRepr) - } - case 114: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - if !wktlex.(*wktLex).isValidPolygonRing(wktDollar[1].coordList) { - return 1 - } - wktVAL.flatRepr = makeGeomFlatCoordsRepr(wktDollar[1].coordList) - } - case 115: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - if !wktlex.(*wktLex).isValidLineString(wktDollar[1].coordList) { - return 1 - } - } - case 116: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.coordList = wktDollar[2].coordList - } - case 117: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.coordList = append(wktDollar[1].coordList, wktDollar[3].coordList...) - } - case 119: - wktDollar = wktS[wktpt-3 : wktpt+1] - { - wktVAL.coordList = wktDollar[2].coordList - } - case 120: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - if !wktlex.(*wktLex).isValidPoint(wktDollar[1].coordList) { - return 1 - } - } - case 121: - wktDollar = wktS[wktpt-2 : wktpt+1] - { - wktVAL.coordList = append(wktDollar[1].coordList, wktDollar[2].coord) - } - case 122: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.coordList = []float64{wktDollar[1].coord} - } - case 123: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - ok := wktlex.(*wktLex).validateBaseTypeEmptyAllowed() - if !ok { - return 1 - } - } - case 125: - wktDollar = wktS[wktpt-1 : wktpt+1] - { - wktVAL.coordList = []float64(nil) - } - } - goto wktstack /* stack new state and value */ -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.go b/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.go deleted file mode 100644 index 24066c4..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.go +++ /dev/null @@ -1,71 +0,0 @@ -//go:generate goyacc -l -o wkt.gen.go -p wkt wkt.y -// TODO remove the following line if https://github.com/golang/tools/pull/304 is accepted -//go:generate sed -i -e "s/wktErrorVerbose = false/wktErrorVerbose = true/" wkt.gen.go -//go:generate gofumports -w wkt.gen.go - -// Package wkt implements Well Known Text encoding and decoding. -package wkt - -import ( - "errors" - - "github.com/twpayne/go-geom" -) - -const ( - tPoint = "POINT " - tMultiPoint = "MULTIPOINT " - tLineString = "LINESTRING " - tMultiLineString = "MULTILINESTRING " - tPolygon = "POLYGON " - tMultiPolygon = "MULTIPOLYGON " - tGeometryCollection = "GEOMETRYCOLLECTION " - tZ = "Z " - tM = "M " - tZm = "ZM " - tEmpty = "EMPTY" -) - -// ErrBraceMismatch is returned when braces do not match. -var ErrBraceMismatch = errors.New("wkt: brace mismatch") - -// Encoder encodes WKT based on specified parameters. -type Encoder struct { - maxDecimalDigits int -} - -// NewEncoder returns a new encoder with the given options set. -func NewEncoder(applyOptFns ...EncodeOption) *Encoder { - encoder := &Encoder{ - maxDecimalDigits: -1, - } - for _, applyOptFn := range applyOptFns { - applyOptFn(encoder) - } - return encoder -} - -// An EncodeOption is an encoder option. -type EncodeOption func(*Encoder) - -// EncodeOptionWithMaxDecimalDigits sets the maximum decimal digits to encode. -func EncodeOptionWithMaxDecimalDigits(maxDecimalDigits int) EncodeOption { - return func(e *Encoder) { - e.maxDecimalDigits = maxDecimalDigits - } -} - -// Marshal translates a geometry to the corresponding WKT. -func Marshal(g geom.T, applyOptFns ...EncodeOption) (string, error) { - return NewEncoder(applyOptFns...).Encode(g) -} - -// Unmarshal translates a WKT to the corresponding geometry. -func Unmarshal(wkt string) (geom.T, error) { - wktlex := newWKTLex(wkt) - wktParse(wktlex) - if wktlex.lastErr != nil { - return nil, wktlex.lastErr - } - return wktlex.ret, nil -} diff --git a/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.y b/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.y deleted file mode 100644 index b7fb71c..0000000 --- a/vendor/github.com/twpayne/go-geom/encoding/wkt/wkt.y +++ /dev/null @@ -1,742 +0,0 @@ -%{ - -package wkt - -import "github.com/twpayne/go-geom" - -%} - -%union { - str string - geom geom.T - coord float64 - coordList []float64 - flatRepr geomFlatCoordsRepr - multiPolyFlatRepr multiPolygonFlatCoordsRepr - geomList []geom.T - geomCollect *geom.GeometryCollection -} - -// Tokens -%token POINT POINTM POINTZ POINTZM -%token LINESTRING LINESTRINGM LINESTRINGZ LINESTRINGZM -%token POLYGON POLYGONM POLYGONZ POLYGONZM -%token MULTIPOINT MULTIPOINTM MULTIPOINTZ MULTIPOINTZM -%token MULTILINESTRING MULTILINESTRINGM MULTILINESTRINGZ MULTILINESTRINGZM -%token MULTIPOLYGON MULTIPOLYGONM MULTIPOLYGONZ MULTIPOLYGONZM -%token GEOMETRYCOLLECTION GEOMETRYCOLLECTIONM GEOMETRYCOLLECTIONZ GEOMETRYCOLLECTIONZM -%token EMPTY -%token NUM - -// Geometries -%type geometry -%type point linestring polygon multipoint multilinestring multipolygon -%type geometry_collection - -// Empty representations -%type empty_in_base_type -%type empty_in_non_base_type -%type flat_coords_empty - -// Points -%type flat_coords -%type flat_coords_point -%type flat_coords_point_with_parens - -// LineStrings -%type flat_coords_point_list -%type flat_coords_point_list_with_parens -%type flat_coords_linestring - -// Polygons -%type flat_coords_polygon_ring -%type flat_coords_polygon_ring_list -%type flat_coords_polygon_ring_list_with_parens - -// MultiPoints -%type multipoint_point -%type multipoint_base_type_point -%type multipoint_non_base_type_point - -%type multipoint_base_type_point_flat_repr -%type multipoint_non_base_point_flat_repr -%type multipoint_base_type_point_list -%type multipoint_non_base_type_point_list -%type multipoint_base_type_point_list_with_parens -%type multipoint_non_base_type_point_list_with_parens - -// MultiLineStrings -%type multilinestring_base_type_linestring -%type multilinestring_non_base_type_linestring - -%type multilinestring_base_type_linestring_flat_repr -%type multilinestring_non_base_type_linestring_flat_repr -%type multilinestring_base_type_linestring_list -%type multilinestring_non_base_type_linestring_list -%type multilinestring_base_type_linestring_list_with_parens -%type multilinestring_non_base_type_linestring_list_with_parens - -// MultiPolygons -%type multipolygon_base_type_polygon -%type multipolygon_non_base_type_polygon - -%type multipolygon_base_type_polygon_multi_poly_repr -%type multipolygon_non_base_type_polygon_multi_poly_repr -%type multipolygon_base_type_polygon_list -%type multipolygon_non_base_type_polygon_list -%type multipolygon_base_type_polygon_list_with_parens -%type multipolygon_non_base_type_polygon_list_with_parens - -// GeometryCollections -%type geometry_list -%type geometry_list_with_parens - -%% - -start: - geometry - { - ok := wktlex.(*wktLex).validateLayoutStackAtEnd() - if !ok { - return 1 - } - wktlex.(*wktLex).ret = $1 - } - -geometry: - point -| linestring -| polygon -| multipoint -| multilinestring -| multipolygon -| geometry_collection - { - ok := wktlex.(*wktLex).validateAndPopLayoutStackFrame() - if !ok { - return 1 - } - err := $1.SetLayout(wktlex.(*wktLex).curLayout()) - if err != nil { - wktlex.(*wktLex).setError(err) - return 1 - } - $$ = $1 - } - -point: - point_type flat_coords_point_with_parens - { - $$ = geom.NewPointFlat(wktlex.(*wktLex).curLayout(), $2) - } -| point_base_type empty_in_base_type - { - $$ = geom.NewPointEmpty(wktlex.(*wktLex).curLayout()) - } -| point_non_base_type empty_in_non_base_type - { - $$ = geom.NewPointEmpty(wktlex.(*wktLex).curLayout()) - } - -point_type: - point_base_type -| point_non_base_type - -point_base_type: - POINT - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - -point_non_base_type: - POINTM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } -| POINTZ - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } -| POINTZM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - -linestring: - linestring_type flat_coords_linestring - { - $$ = geom.NewLineStringFlat(wktlex.(*wktLex).curLayout(), $2) - } -| linestring_base_type empty_in_base_type - { - $$ = geom.NewLineString(wktlex.(*wktLex).curLayout()) - } -| linestring_non_base_type empty_in_non_base_type - { - $$ = geom.NewLineString(wktlex.(*wktLex).curLayout()) - } - -linestring_type: - linestring_base_type -| linestring_non_base_type - -linestring_base_type: - LINESTRING - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - -linestring_non_base_type: - LINESTRINGM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } -| LINESTRINGZ - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } -| LINESTRINGZM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - -polygon: - polygon_type flat_coords_polygon_ring_list_with_parens - { - $$ = geom.NewPolygonFlat(wktlex.(*wktLex).curLayout(), $2.flatCoords, $2.ends) - } -| polygon_base_type empty_in_base_type - { - $$ = geom.NewPolygon(wktlex.(*wktLex).curLayout()) - } -| polygon_non_base_type empty_in_non_base_type - { - $$ = geom.NewPolygon(wktlex.(*wktLex).curLayout()) - } - -polygon_type: - polygon_base_type -| polygon_non_base_type - -polygon_base_type: - POLYGON - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - -polygon_non_base_type: - POLYGONM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } -| POLYGONZ - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } -| POLYGONZM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - -multipoint: - multipoint_base_type multipoint_base_type_point_list_with_parens - { - $$ = geom.NewMultiPointFlat( - wktlex.(*wktLex).curLayout(), $2.flatCoords, geom.NewMultiPointFlatOptionWithEnds($2.ends), - ) - } -| multipoint_non_base_type multipoint_non_base_type_point_list_with_parens - { - $$ = geom.NewMultiPointFlat( - wktlex.(*wktLex).curLayout(), $2.flatCoords, geom.NewMultiPointFlatOptionWithEnds($2.ends), - ) - } -| multipoint_base_type empty_in_base_type - { - $$ = geom.NewMultiPoint(wktlex.(*wktLex).curLayout()) - } -| multipoint_non_base_type empty_in_non_base_type - { - $$ = geom.NewMultiPoint(wktlex.(*wktLex).curLayout()) - } - -multipoint_base_type: - MULTIPOINT - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - -multipoint_non_base_type: - MULTIPOINTM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } -| MULTIPOINTZ - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } -| MULTIPOINTZM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - -multilinestring: - multilinestring_base_type multilinestring_base_type_linestring_list_with_parens - { - $$ = geom.NewMultiLineStringFlat(wktlex.(*wktLex).curLayout(), $2.flatCoords, $2.ends) - } -| multilinestring_non_base_type multilinestring_non_base_type_linestring_list_with_parens - { - $$ = geom.NewMultiLineStringFlat(wktlex.(*wktLex).curLayout(), $2.flatCoords, $2.ends) - } -| multilinestring_base_type empty_in_base_type - { - $$ = geom.NewMultiLineString(wktlex.(*wktLex).curLayout()) - } -| multilinestring_non_base_type empty_in_non_base_type - { - $$ = geom.NewMultiLineString(wktlex.(*wktLex).curLayout()) - } - -multilinestring_base_type: - MULTILINESTRING - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - -multilinestring_non_base_type: - MULTILINESTRINGM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } -| MULTILINESTRINGZ - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } -| MULTILINESTRINGZM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - -multipolygon: - multipolygon_base_type multipolygon_base_type_polygon_list_with_parens - { - $$ = geom.NewMultiPolygonFlat(wktlex.(*wktLex).curLayout(), $2.flatCoords, $2.endss) - } -| multipolygon_non_base_type multipolygon_non_base_type_polygon_list_with_parens - { - $$ = geom.NewMultiPolygonFlat(wktlex.(*wktLex).curLayout(), $2.flatCoords, $2.endss) - } -| multipolygon_base_type empty_in_base_type - { - $$ = geom.NewMultiPolygon(wktlex.(*wktLex).curLayout()) - } -| multipolygon_non_base_type empty_in_non_base_type - { - $$ = geom.NewMultiPolygon(wktlex.(*wktLex).curLayout()) - } - -multipolygon_base_type: - MULTIPOLYGON - { - ok := wktlex.(*wktLex).validateBaseGeometryTypeAllowed() - if !ok { - return 1 - } - } - -multipolygon_non_base_type: - MULTIPOLYGONM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYM) - if !ok { - return 1 - } - } -| MULTIPOLYGONZ - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZ) - if !ok { - return 1 - } - } -| MULTIPOLYGONZM - { - ok := wktlex.(*wktLex).validateAndSetLayoutIfNoLayout(geom.XYZM) - if !ok { - return 1 - } - } - -geometry_collection: - geometry_collection_type geometry_list_with_parens - { - newCollection := geom.NewGeometryCollection() - err := newCollection.Push($2...) - if err != nil { - wktlex.(*wktLex).setError(err) - return 1 - } - $$ = newCollection - } -| geometry_collection_base_type empty_in_base_type - { - $$ = geom.NewGeometryCollection() - } -| geometry_collection_non_base_type empty_in_non_base_type - { - $$ = geom.NewGeometryCollection() - } - -geometry_list_with_parens: - '(' geometry_list ')' - { - $$ = $2 - } - -geometry_list: - geometry_list ',' geometry - { - $$ = append($1, $3) - } -| geometry - { - $$ = []geom.T{$1} - } - -geometry_collection_type: - geometry_collection_base_type -| geometry_collection_non_base_type - -geometry_collection_base_type: - GEOMETRYCOLLECTION - { - ok := wktlex.(*wktLex).validateAndPushLayoutStackFrame(geom.NoLayout) - if !ok { - return 1 - } - } - -geometry_collection_non_base_type: - GEOMETRYCOLLECTIONM - { - ok := wktlex.(*wktLex).validateAndPushLayoutStackFrame(geom.XYM) - if !ok { - return 1 - } - } -| GEOMETRYCOLLECTIONZ - { - ok := wktlex.(*wktLex).validateAndPushLayoutStackFrame(geom.XYZ) - if !ok { - return 1 - } - } -| GEOMETRYCOLLECTIONZM - { - ok := wktlex.(*wktLex).validateAndPushLayoutStackFrame(geom.XYZM) - if !ok { - return 1 - } - } - -geometry_opening_lparen: - '(' - { - ok := wktlex.(*wktLex).validateNonEmptyGeometryAllowed() - if !ok { - return 1 - } - } - -multipolygon_base_type_polygon_list_with_parens: - geometry_opening_lparen multipolygon_base_type_polygon_list ')' - { - $$ = $2 - } - -multipolygon_non_base_type_polygon_list_with_parens: - '(' multipolygon_non_base_type_polygon_list ')' - { - $$ = $2 - } - -multipolygon_non_base_type_polygon_list: - multipolygon_non_base_type_polygon_list ',' multipolygon_non_base_type_polygon_multi_poly_repr - { - $$ = appendMultiPolygonFlatCoordsRepr($1, $3) - } -| multipolygon_non_base_type_polygon_multi_poly_repr - -multipolygon_base_type_polygon_list: - multipolygon_base_type_polygon_list ',' multipolygon_base_type_polygon_multi_poly_repr - { - $$ = appendMultiPolygonFlatCoordsRepr($1, $3) - } -| multipolygon_base_type_polygon_multi_poly_repr - -multipolygon_base_type_polygon_multi_poly_repr: - multipolygon_base_type_polygon - { - $$ = makeMultiPolygonFlatCoordsRepr($1) - } - -multipolygon_non_base_type_polygon_multi_poly_repr: - multipolygon_non_base_type_polygon - { - $$ = makeMultiPolygonFlatCoordsRepr($1) - } - -multipolygon_base_type_polygon: - flat_coords_polygon_ring_list_with_parens -| empty_in_base_type - { - $$ = makeGeomFlatCoordsRepr($1) - } - -multipolygon_non_base_type_polygon: - flat_coords_polygon_ring_list_with_parens -| empty_in_non_base_type - { - $$ = makeGeomFlatCoordsRepr($1) - } - -multilinestring_base_type_linestring_list_with_parens: - geometry_opening_lparen multilinestring_base_type_linestring_list ')' - { - $$ = $2 - } - -multilinestring_non_base_type_linestring_list_with_parens: - '(' multilinestring_non_base_type_linestring_list ')' - { - $$ = $2 - } - -multilinestring_base_type_linestring_list: - multilinestring_base_type_linestring_list ',' multilinestring_base_type_linestring_flat_repr - { - $$ = appendGeomFlatCoordsReprs($1, $3) - } -| multilinestring_base_type_linestring_flat_repr - -multilinestring_non_base_type_linestring_list: - multilinestring_non_base_type_linestring_list ',' multilinestring_non_base_type_linestring_flat_repr - { - $$ = appendGeomFlatCoordsReprs($1, $3) - } -| multilinestring_non_base_type_linestring_flat_repr - -multilinestring_base_type_linestring_flat_repr: - multilinestring_base_type_linestring - { - $$ = makeGeomFlatCoordsRepr($1) - } - -multilinestring_non_base_type_linestring_flat_repr: - multilinestring_non_base_type_linestring - { - $$ = makeGeomFlatCoordsRepr($1) - } - -multilinestring_base_type_linestring: - flat_coords_linestring -| empty_in_base_type - -multilinestring_non_base_type_linestring: - flat_coords_linestring -| empty_in_non_base_type - -multipoint_base_type_point_list_with_parens: - geometry_opening_lparen multipoint_base_type_point_list ')' - { - $$ = $2 - } - -multipoint_non_base_type_point_list_with_parens: - '(' multipoint_non_base_type_point_list ')' - { - $$ = $2 - } - -multipoint_base_type_point_list: - multipoint_base_type_point_list ',' multipoint_base_type_point_flat_repr - { - $$ = appendGeomFlatCoordsReprs($1, $3) - } -| multipoint_base_type_point_flat_repr - -multipoint_non_base_type_point_list: - multipoint_non_base_type_point_list ',' multipoint_non_base_point_flat_repr - { - $$ = appendGeomFlatCoordsReprs($1, $3) - } -| multipoint_non_base_point_flat_repr - -multipoint_base_type_point_flat_repr: - multipoint_base_type_point - { - $$ = makeGeomFlatCoordsRepr($1) - } - -multipoint_non_base_point_flat_repr: - multipoint_non_base_type_point - { - $$ = makeGeomFlatCoordsRepr($1) - } - -multipoint_base_type_point: - multipoint_point -| empty_in_base_type - -multipoint_non_base_type_point: - multipoint_point -| empty_in_non_base_type -multipoint_point: - flat_coords_point -| flat_coords_point_with_parens - -flat_coords_polygon_ring_list_with_parens: - geometry_opening_lparen flat_coords_polygon_ring_list ')' - { - $$ = $2 - } - -flat_coords_polygon_ring_list: - flat_coords_polygon_ring_list ',' flat_coords_polygon_ring - { - $$ = appendGeomFlatCoordsReprs($1, $3) - } -| flat_coords_polygon_ring - -flat_coords_polygon_ring: - flat_coords_point_list_with_parens - { - if !wktlex.(*wktLex).isValidPolygonRing($1) { - return 1 - } - $$ = makeGeomFlatCoordsRepr($1) - } - -flat_coords_linestring: - flat_coords_point_list_with_parens - { - if !wktlex.(*wktLex).isValidLineString($1) { - return 1 - } - } - -flat_coords_point_list_with_parens: - geometry_opening_lparen flat_coords_point_list ')' - { - $$ = $2 - } - -flat_coords_point_list: - flat_coords_point_list ',' flat_coords_point - { - $$ = append($1, $3...) - } -| flat_coords_point - -flat_coords_point_with_parens: - geometry_opening_lparen flat_coords_point ')' - { - $$ = $2 - } - -flat_coords_point: - flat_coords - { - if !wktlex.(*wktLex).isValidPoint($1) { - return 1 - } - } - -flat_coords: - flat_coords NUM - { - $$ = append($1, $2) - } -| NUM - { - $$ = []float64{$1} - } - -empty_in_base_type: - flat_coords_empty - { - ok := wktlex.(*wktLex).validateBaseTypeEmptyAllowed() - if !ok { - return 1 - } - } - -empty_in_non_base_type: - flat_coords_empty - -flat_coords_empty: - EMPTY - { - $$ = []float64(nil) - } diff --git a/vendor/github.com/twpayne/go-geom/flat.go b/vendor/github.com/twpayne/go-geom/flat.go deleted file mode 100644 index 995070c..0000000 --- a/vendor/github.com/twpayne/go-geom/flat.go +++ /dev/null @@ -1,428 +0,0 @@ -package geom - -import "math" - -type geom0 struct { - layout Layout - stride int - flatCoords []float64 - srid int -} - -type geom1 struct { - geom0 -} - -type geom2 struct { - geom1 - ends []int -} - -type geom3 struct { - geom1 - endss [][]int -} - -// Bounds returns the bounds of g. -func (g *geom0) Bounds() *Bounds { - return NewBounds(g.layout).extendFlatCoords(g.flatCoords, 0, len(g.flatCoords), g.stride) -} - -// Coords returns all the coordinates in g, i.e. a single coordinate. -func (g *geom0) Coords() Coord { - return inflate0(g.flatCoords, 0, len(g.flatCoords), g.stride) -} - -// Empty returns true if g contains no coordinates. -func (g *geom0) Empty() bool { - return len(g.flatCoords) == 0 -} - -// Ends returns the end indexes of sub-structures of g, i.e. an empty slice. -func (g *geom0) Ends() []int { - return nil -} - -// Endss returns the end indexes of sub-sub-structures of g, i.e. an empty -// slice. -func (g *geom0) Endss() [][]int { - return nil -} - -// FlatCoords returns the flat coordinates of g. -func (g *geom0) FlatCoords() []float64 { - return g.flatCoords -} - -// Layout returns g's layout. -func (g *geom0) Layout() Layout { - return g.layout -} - -// NumCoords returns the number of coordinates in g, i.e. 1. -func (g *geom0) NumCoords() int { - return 1 -} - -// Reserve reserves space in g for n coordinates. -func (g *geom0) Reserve(n int) { - if cap(g.flatCoords) < n*g.stride { - fcs := make([]float64, len(g.flatCoords), n*g.stride) - copy(fcs, g.flatCoords) - g.flatCoords = fcs - } -} - -// SRID returns g's SRID. -func (g *geom0) SRID() int { - return g.srid -} - -func (g *geom0) setCoords(coords0 []float64) error { - var err error - g.flatCoords, err = deflate0(nil, coords0, g.stride) - return err -} - -// Stride returns g's stride. -func (g *geom0) Stride() int { - return g.stride -} - -func (g *geom0) verify() error { - if g.stride != g.layout.Stride() { - return errStrideLayoutMismatch - } - if g.stride == 0 { - if len(g.flatCoords) != 0 { - return errNonEmptyFlatCoords - } - return nil - } - if len(g.flatCoords) != g.stride { - return errLengthStrideMismatch - } - return nil -} - -// Coord returns the ith coord of g. -func (g *geom1) Coord(i int) Coord { - return g.flatCoords[i*g.stride : (i+1)*g.stride] -} - -// Coords unpacks and returns all of g's coordinates. -func (g *geom1) Coords() []Coord { - return inflate1(g.flatCoords, 0, len(g.flatCoords), g.stride) -} - -// NumCoords returns the number of coordinates in g. -func (g *geom1) NumCoords() int { - return len(g.flatCoords) / g.stride -} - -// Reverse reverses the order of g's coordinates. -func (g *geom1) Reverse() { - reverse1(g.flatCoords, 0, len(g.flatCoords), g.stride) -} - -func (g *geom1) setCoords(coords1 []Coord) error { - var err error - g.flatCoords, err = deflate1(nil, coords1, g.stride) - return err -} - -func (g *geom1) verify() error { - if g.stride != g.layout.Stride() { - return errStrideLayoutMismatch - } - if g.stride == 0 { - if len(g.flatCoords) != 0 { - return errNonEmptyFlatCoords - } - } else { - if len(g.flatCoords)%g.stride != 0 { - return errLengthStrideMismatch - } - } - return nil -} - -// Coords returns all of g's coordinates. -func (g *geom2) Coords() [][]Coord { - return inflate2(g.flatCoords, 0, g.ends, g.stride) -} - -// Ends returns the end indexes of all sub-structures in g. -func (g *geom2) Ends() []int { - return g.ends -} - -// Reverse reverses the order of coordinates for each sub-structure in g. -func (g *geom2) Reverse() { - reverse2(g.flatCoords, 0, g.ends, g.stride) -} - -func (g *geom2) setCoords(coords2 [][]Coord) error { - var err error - g.flatCoords, g.ends, err = deflate2(nil, nil, coords2, g.stride) - return err -} - -func (g *geom2) verify() error { - if g.stride != g.layout.Stride() { - return errStrideLayoutMismatch - } - if g.stride == 0 { - if len(g.flatCoords) != 0 { - return errNonEmptyFlatCoords - } - if len(g.ends) != 0 { - return errNonEmptyEnds - } - return nil - } - if len(g.flatCoords)%g.stride != 0 { - return errLengthStrideMismatch - } - offset := 0 - for _, end := range g.ends { - if end%g.stride != 0 { - return errMisalignedEnd - } - if end < offset { - return errOutOfOrderEnd - } - offset = end - } - if offset != len(g.flatCoords) { - return errIncorrectEnd - } - return nil -} - -// Coords returns all the coordinates in g. -func (g *geom3) Coords() [][][]Coord { - return inflate3(g.flatCoords, 0, g.endss, g.stride) -} - -// Endss returns a list of all the sub-sub-structures in g. -func (g *geom3) Endss() [][]int { - return g.endss -} - -// Reverse reverses the order of coordinates for each sub-sub-structure in g. -func (g *geom3) Reverse() { - reverse3(g.flatCoords, 0, g.endss, g.stride) -} - -func (g *geom3) setCoords(coords3 [][][]Coord) error { - var err error - g.flatCoords, g.endss, err = deflate3(nil, nil, coords3, g.stride) - return err -} - -func (g *geom3) verify() error { - if g.stride != g.layout.Stride() { - return errStrideLayoutMismatch - } - if g.stride == 0 { - if len(g.flatCoords) != 0 { - return errNonEmptyFlatCoords - } - if len(g.endss) != 0 { - return errNonEmptyEndss - } - return nil - } - if len(g.flatCoords)%g.stride != 0 { - return errLengthStrideMismatch - } - offset := 0 - for _, ends := range g.endss { - for _, end := range ends { - if end%g.stride != 0 { - return errMisalignedEnd - } - if end < offset { - return errOutOfOrderEnd - } - offset = end - } - } - if offset != len(g.flatCoords) { - return errIncorrectEnd - } - return nil -} - -func doubleArea1(flatCoords []float64, offset, end, stride int) float64 { - var doubleArea float64 - for i := offset + stride; i < end; i += stride { - doubleArea += (flatCoords[i+1] - flatCoords[i+1-stride]) * (flatCoords[i] + flatCoords[i-stride]) - } - return doubleArea -} - -func doubleArea2(flatCoords []float64, offset int, ends []int, stride int) float64 { - var doubleArea float64 - for i, end := range ends { - da := doubleArea1(flatCoords, offset, end, stride) - if i == 0 { - doubleArea = da - } else { - doubleArea -= da - } - offset = end - } - return doubleArea -} - -func doubleArea3(flatCoords []float64, offset int, endss [][]int, stride int) float64 { - var doubleArea float64 - for _, ends := range endss { - doubleArea += doubleArea2(flatCoords, offset, ends, stride) - offset = ends[len(ends)-1] - } - return doubleArea -} - -func deflate0(flatCoords []float64, c Coord, stride int) ([]float64, error) { - if len(c) != stride { - return nil, ErrStrideMismatch{Got: len(c), Want: stride} - } - flatCoords = append(flatCoords, c...) - return flatCoords, nil -} - -func deflate1(flatCoords []float64, coords1 []Coord, stride int) ([]float64, error) { - for _, c := range coords1 { - var err error - flatCoords, err = deflate0(flatCoords, c, stride) - if err != nil { - return nil, err - } - } - return flatCoords, nil -} - -func deflate2( - flatCoords []float64, ends []int, coords2 [][]Coord, stride int, -) ([]float64, []int, error) { - for _, coords1 := range coords2 { - var err error - flatCoords, err = deflate1(flatCoords, coords1, stride) - if err != nil { - return nil, nil, err - } - ends = append(ends, len(flatCoords)) - } - return flatCoords, ends, nil -} - -func deflate3( - flatCoords []float64, endss [][]int, coords3 [][][]Coord, stride int, -) ([]float64, [][]int, error) { - for _, coords2 := range coords3 { - var err error - var ends []int - flatCoords, ends, err = deflate2(flatCoords, ends, coords2, stride) - if err != nil { - return nil, nil, err - } - endss = append(endss, ends) - } - return flatCoords, endss, nil -} - -func inflate0(flatCoords []float64, offset, end, stride int) Coord { - if offset+stride != end { - panic("geom: stride mismatch") - } - c := make([]float64, stride) - copy(c, flatCoords[offset:end]) - return c -} - -func inflate1(flatCoords []float64, offset, end, stride int) []Coord { - coords1 := make([]Coord, (end-offset)/stride) - for i := range coords1 { - coords1[i] = inflate0(flatCoords, offset, offset+stride, stride) - offset += stride - } - return coords1 -} - -func inflate2(flatCoords []float64, offset int, ends []int, stride int) [][]Coord { - coords2 := make([][]Coord, len(ends)) - for i := range coords2 { - end := ends[i] - coords2[i] = inflate1(flatCoords, offset, end, stride) - offset = end - } - return coords2 -} - -func inflate3(flatCoords []float64, offset int, endss [][]int, stride int) [][][]Coord { - coords3 := make([][][]Coord, len(endss)) - for i := range coords3 { - ends := endss[i] - coords3[i] = inflate2(flatCoords, offset, ends, stride) - if len(ends) > 0 { - offset = ends[len(ends)-1] - } - } - return coords3 -} - -func length1(flatCoords []float64, offset, end, stride int) float64 { - var length float64 - for i := offset + stride; i < end; i += stride { - dx := flatCoords[i] - flatCoords[i-stride] - dy := flatCoords[i+1] - flatCoords[i+1-stride] - length += math.Sqrt(dx*dx + dy*dy) - } - return length -} - -func length2(flatCoords []float64, offset int, ends []int, stride int) float64 { - var length float64 - for _, end := range ends { - length += length1(flatCoords, offset, end, stride) - offset = end - } - return length -} - -func length3(flatCoords []float64, offset int, endss [][]int, stride int) float64 { - var length float64 - for _, ends := range endss { - length += length2(flatCoords, offset, ends, stride) - offset = ends[len(ends)-1] - } - return length -} - -func reverse1(flatCoords []float64, offset, end, stride int) { - for i, j := offset+stride, end; i <= j; i, j = i+stride, j-stride { - for k := 0; k < stride; k++ { - flatCoords[i-stride+k], flatCoords[j-stride+k] = flatCoords[j-stride+k], flatCoords[i-stride+k] - } - } -} - -func reverse2(flatCoords []float64, offset int, ends []int, stride int) { - for _, end := range ends { - reverse1(flatCoords, offset, end, stride) - offset = end - } -} - -func reverse3(flatCoords []float64, offset int, endss [][]int, stride int) { - for _, ends := range endss { - if len(ends) == 0 { - continue - } - reverse2(flatCoords, offset, ends, stride) - offset = ends[len(ends)-1] - } -} diff --git a/vendor/github.com/twpayne/go-geom/geom.go b/vendor/github.com/twpayne/go-geom/geom.go deleted file mode 100644 index 33038f7..0000000 --- a/vendor/github.com/twpayne/go-geom/geom.go +++ /dev/null @@ -1,251 +0,0 @@ -// Package geom implements efficient geometry types for geospatial -// applications. -package geom - -//go:generate goderive . - -import ( - "errors" - "fmt" - "math" -) - -// A Layout describes the meaning of an N-dimensional coordinate. Layout(N) for -// N > 4 is a valid layout, in which case the first dimensions are interpreted -// to be X, Y, Z, and M and extra dimensions have no special meaning. M values -// are considered part of a linear referencing system (e.g. classical time or -// distance along a path). 1-dimensional layouts are not supported. -type Layout int - -const ( - // NoLayout is an unknown layout. - NoLayout Layout = iota - // XY is a 2D layout (X and Y). - XY - // XYZ is 3D layout (X, Y, and Z). - XYZ - // XYM is a 2D layout with an M value. - XYM - // XYZM is a 3D layout with an M value. - XYZM -) - -// An ErrLayoutMismatch is returned when geometries with different layouts -// cannot be combined. -type ErrLayoutMismatch struct { - Got Layout - Want Layout -} - -func (e ErrLayoutMismatch) Error() string { - return fmt.Sprintf("geom: layout mismatch, got %s, want %s", e.Got, e.Want) -} - -// An ErrStrideMismatch is returned when the stride does not match the expected -// stride. -type ErrStrideMismatch struct { - Got int - Want int -} - -func (e ErrStrideMismatch) Error() string { - return fmt.Sprintf("geom: stride mismatch, got %d, want %d", e.Got, e.Want) -} - -// An ErrUnsupportedLayout is returned when the requested layout is not -// supported. -type ErrUnsupportedLayout Layout - -func (e ErrUnsupportedLayout) Error() string { - return fmt.Sprintf("geom: unsupported layout %s", Layout(e)) -} - -// An ErrUnsupportedType is returned when the requested type is not supported. -type ErrUnsupportedType struct { - Value interface{} -} - -func (e ErrUnsupportedType) Error() string { - return fmt.Sprintf("geom: unsupported type %T", e.Value) -} - -// A Coord represents an N-dimensional coordinate. -type Coord []float64 - -// Clone returns a deep copy of c. -func (c Coord) Clone() Coord { - return deriveCloneCoord(c) -} - -// X returns the x coordinate of c. X is assumed to be the first ordinate. -func (c Coord) X() float64 { - return c[0] -} - -// Y returns the y coordinate of c. Y is assumed to be the second ordinate. -func (c Coord) Y() float64 { - return c[1] -} - -// Set copies the ordinate data from the other coord to this coord. -func (c Coord) Set(other Coord) { - copy(c, other) -} - -// Equal compares that all ordinates are the same in this and the other coords. -// It is assumed that this coord and other coord both have the same (provided) -// layout. -func (c Coord) Equal(layout Layout, other Coord) bool { - numOrds := len(c) - - if layout.Stride() < numOrds { - numOrds = layout.Stride() - } - - if (len(c) < layout.Stride() || len(other) < layout.Stride()) && len(c) != len(other) { - return false - } - - for i := 0; i < numOrds; i++ { - if math.IsNaN(c[i]) || math.IsNaN(other[i]) { - if !math.IsNaN(c[i]) || !math.IsNaN(other[i]) { - return false - } - } else if c[i] != other[i] { - return false - } - } - - return true -} - -// T is a generic interface implemented by all geometry types. -type T interface { - Layout() Layout - Stride() int - Bounds() *Bounds - FlatCoords() []float64 - Ends() []int - Endss() [][]int - SRID() int - Empty() bool -} - -// MIndex returns the index of the M dimension, or -1 if the l does not have an -// M dimension. -func (l Layout) MIndex() int { - switch l { - case NoLayout, XY, XYZ: - return -1 - case XYM: - return 2 - case XYZM: - return 3 - default: - return 3 - } -} - -// Stride returns l's number of dimensions. -func (l Layout) Stride() int { - switch l { - case NoLayout: - return 0 - case XY: - return 2 - case XYZ: - return 3 - case XYM: - return 3 - case XYZM: - return 4 - default: - return int(l) - } -} - -// String returns a human-readable string representing l. -func (l Layout) String() string { - switch l { - case NoLayout: - return "NoLayout" - case XY: - return "XY" - case XYZ: - return "XYZ" - case XYM: - return "XYM" - case XYZM: - return "XYZM" - default: - return fmt.Sprintf("Layout(%d)", int(l)) - } -} - -// ZIndex returns the index of l's Z dimension, or -1 if l does not have a Z -// dimension. -func (l Layout) ZIndex() int { - switch l { - case NoLayout, XY, XYM: - return -1 - default: - return 2 - } -} - -// SetSRID sets the SRID of an arbitrary geometry. -func SetSRID(g T, srid int) (T, error) { - switch g := g.(type) { - case *Point: - return g.SetSRID(srid), nil - case *LineString: - return g.SetSRID(srid), nil - case *LinearRing: - return g.SetSRID(srid), nil - case *Polygon: - return g.SetSRID(srid), nil - case *MultiPoint: - return g.SetSRID(srid), nil - case *MultiLineString: - return g.SetSRID(srid), nil - case *MultiPolygon: - return g.SetSRID(srid), nil - case *GeometryCollection: - return g.SetSRID(srid), nil - default: - return g, &ErrUnsupportedType{ - Value: g, - } - } -} - -// TransformInPlace replaces all coordinates in g using f. -func TransformInPlace(g T, f func(Coord)) T { - var ( - flatCoords = g.FlatCoords() - stride = g.Stride() - ) - for i, n := 0, len(flatCoords); i < n; i += stride { - f(flatCoords[i : i+stride]) - } - return g -} - -// Must panics if err is not nil, otherwise it returns g. -func Must(g T, err error) T { - if err != nil { - panic(err) - } - return g -} - -var ( - errIncorrectEnd = errors.New("geom: incorrect end") - errLengthStrideMismatch = errors.New("geom: length/stride mismatch") - errMisalignedEnd = errors.New("geom: misaligned end") - errNonEmptyEnds = errors.New("geom: non-empty ends") - errNonEmptyEndss = errors.New("geom: non-empty endss") - errNonEmptyFlatCoords = errors.New("geom: non-empty flatCoords") - errOutOfOrderEnd = errors.New("geom: out-of-order end") - errStrideLayoutMismatch = errors.New("geom: stride/layout mismatch") -) diff --git a/vendor/github.com/twpayne/go-geom/geometrycollection.go b/vendor/github.com/twpayne/go-geom/geometrycollection.go deleted file mode 100644 index 3b7244b..0000000 --- a/vendor/github.com/twpayne/go-geom/geometrycollection.go +++ /dev/null @@ -1,169 +0,0 @@ -package geom - -// A GeometryCollection is a collection of arbitrary geometries with the same -// SRID. -type GeometryCollection struct { - layout Layout - geoms []T - srid int -} - -// NewGeometryCollection returns a new empty GeometryCollection. -func NewGeometryCollection() *GeometryCollection { - return &GeometryCollection{} -} - -// Geom returns the ith geometry in g. -func (g *GeometryCollection) Geom(i int) T { - return g.geoms[i] -} - -// Geoms returns the geometries in g. -func (g *GeometryCollection) Geoms() []T { - return g.geoms -} - -// Layout returns the smallest layout that covers all of the layouts in g's -// geometries. -func (g *GeometryCollection) Layout() Layout { - if g.layout != NoLayout { - return g.layout - } - maxLayout := NoLayout - for _, g := range g.geoms { - switch l := g.Layout(); l { - case XYZ: - if maxLayout == XYM { - maxLayout = XYZM - } else if l > maxLayout { - maxLayout = l - } - case XYM: - if maxLayout == XYZ { - maxLayout = XYZM - } else if l > maxLayout { - maxLayout = l - } - default: - if l > maxLayout { - maxLayout = l - } - } - } - return maxLayout -} - -// NumGeoms returns the number of geometries in g. -func (g *GeometryCollection) NumGeoms() int { - return len(g.geoms) -} - -// Stride returns the stride of g's layout. -func (g *GeometryCollection) Stride() int { - return g.Layout().Stride() -} - -// Bounds returns the bounds of all the geometries in g. -func (g *GeometryCollection) Bounds() *Bounds { - // FIXME this needs work for mixing layouts, e.g. XYZ and XYM - b := NewBounds(g.Layout()) - for _, g := range g.geoms { - b = b.Extend(g) - } - return b -} - -// Empty returns true if the collection is empty. -// This can return true if the GeometryCollection contains multiple Geometry objects -// which are all empty. -func (g *GeometryCollection) Empty() bool { - for _, g := range g.geoms { - if !g.Empty() { - return false - } - } - return true -} - -// FlatCoords panics. -func (g *GeometryCollection) FlatCoords() []float64 { - panic("FlatCoords() called on a GeometryCollection") -} - -// Ends panics. -func (g *GeometryCollection) Ends() []int { - panic("Ends() called on a GeometryCollection") -} - -// Endss panics. -func (g *GeometryCollection) Endss() [][]int { - panic("Endss() called on a GeometryCollection") -} - -// SRID returns g's SRID. -func (g *GeometryCollection) SRID() int { - return g.srid -} - -// MustPush pushes gs to g. It panics on any error. -func (g *GeometryCollection) MustPush(gs ...T) *GeometryCollection { - if err := g.Push(gs...); err != nil { - panic(err) - } - return g -} - -// CheckLayout checks all geometries in the collection match the given -// layout. -func (g *GeometryCollection) CheckLayout(layout Layout) error { - if layout != NoLayout { - for _, geom := range g.geoms { - if geomLayout := geom.Layout(); geomLayout != layout { - return ErrLayoutMismatch{ - Got: layout, - Want: geomLayout, - } - } - } - } - return nil -} - -// MustSetLayout sets g's layout. It panics on any error. -func (g *GeometryCollection) MustSetLayout(layout Layout) *GeometryCollection { - if err := g.SetLayout(layout); err != nil { - panic(err) - } - return g -} - -// Push appends geometries. -func (g *GeometryCollection) Push(gs ...T) error { - if g.layout != NoLayout { - for _, geom := range gs { - if geomLayout := geom.Layout(); geomLayout != g.layout { - return ErrLayoutMismatch{ - Got: geomLayout, - Want: g.layout, - } - } - } - } - g.geoms = append(g.geoms, gs...) - return nil -} - -// SetLayout sets g's layout. -func (g *GeometryCollection) SetLayout(layout Layout) error { - if err := g.CheckLayout(layout); err != nil { - return err - } - g.layout = layout - return nil -} - -// SetSRID sets g's SRID and the SRID of all its elements. -func (g *GeometryCollection) SetSRID(srid int) *GeometryCollection { - g.srid = srid - return g -} diff --git a/vendor/github.com/twpayne/go-geom/go.mod b/vendor/github.com/twpayne/go-geom/go.mod deleted file mode 100644 index 4db41ab..0000000 --- a/vendor/github.com/twpayne/go-geom/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/twpayne/go-geom - -require ( - github.com/DATA-DOG/go-sqlmock v1.3.2 - github.com/google/go-cmp v0.4.0 // indirect - github.com/lib/pq v1.8.0 - github.com/ory/dockertest/v3 v3.6.0 - github.com/stretchr/testify v1.6.1 - github.com/twpayne/go-kml v1.5.2 -) - -go 1.13 diff --git a/vendor/github.com/twpayne/go-geom/go.sum b/vendor/github.com/twpayne/go-geom/go.sum deleted file mode 100644 index c3ffdca..0000000 --- a/vendor/github.com/twpayne/go-geom/go.sum +++ /dev/null @@ -1,88 +0,0 @@ -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/DATA-DOG/go-sqlmock v1.3.2 h1:2L2f5t3kKnCLxnClDD/PrDfExFFa1wjESgxHG/B1ibo= -github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c= -github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 h1:NmTXa/uVnDyp0TY5MKi197+3HWcnYWfnHGyaFthlnGw= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/ory/dockertest/v3 v3.6.0 h1:I6KNJ6izxGduLACQii2SP/g7GN0JM9Xfaik6aAVaw6Y= -github.com/ory/dockertest/v3 v3.6.0/go.mod h1:4ZOpj8qBUmh8fcBSVzkH2bws2s91JdGvHUqan4GHEuQ= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/twpayne/go-kml v1.5.2 h1:rFMw2/EwgkVssGS2MT6YfWSPZz6BgcJkLxQ53jnE8rQ= -github.com/twpayne/go-kml v1.5.2/go.mod h1:kz8jAiIz6FIdU2Zjce9qGlVtgFYES9vt7BTPBHf5jl4= -github.com/twpayne/go-polyline v1.0.0/go.mod h1:ICh24bcLYBX8CknfvNPKqoTbe+eg+MX1NPyJmSBo7pU= -github.com/twpayne/go-waypoint v0.0.0-20200706203930-b263a7f6e4e8/go.mod h1:qj5pHncxKhu9gxtZEYWypA/z097sxhFlbTyOyt9gcnU= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823 h1:Ypyv6BNJh07T1pUSrehkLemqPKXhus2MkfktJ91kRh4= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9 h1:N19i1HjUnR7TF7rMt8O4p3dLvqvmYyzB6ifMFmrbY50= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/vendor/github.com/twpayne/go-geom/linearring.go b/vendor/github.com/twpayne/go-geom/linearring.go deleted file mode 100644 index 44fb7ab..0000000 --- a/vendor/github.com/twpayne/go-geom/linearring.go +++ /dev/null @@ -1,60 +0,0 @@ -package geom - -// A LinearRing is a linear ring. -type LinearRing struct { - geom1 -} - -// NewLinearRing returns a new LinearRing with no coordinates. -func NewLinearRing(layout Layout) *LinearRing { - return NewLinearRingFlat(layout, nil) -} - -// NewLinearRingFlat returns a new LinearRing with the given flat coordinates. -func NewLinearRingFlat(layout Layout, flatCoords []float64) *LinearRing { - g := new(LinearRing) - g.layout = layout - g.stride = layout.Stride() - g.flatCoords = flatCoords - return g -} - -// Area returns the the area. -func (g *LinearRing) Area() float64 { - return doubleArea1(g.flatCoords, 0, len(g.flatCoords), g.stride) / 2 -} - -// Clone returns a deep copy. -func (g *LinearRing) Clone() *LinearRing { - return deriveCloneLinearRing(g) -} - -// Length returns the length of the perimeter. -func (g *LinearRing) Length() float64 { - return length1(g.flatCoords, 0, len(g.flatCoords), g.stride) -} - -// MustSetCoords sets the coordinates and panics if there is any error. -func (g *LinearRing) MustSetCoords(coords []Coord) *LinearRing { - Must(g.SetCoords(coords)) - return g -} - -// SetCoords sets the coordinates. -func (g *LinearRing) SetCoords(coords []Coord) (*LinearRing, error) { - if err := g.setCoords(coords); err != nil { - return nil, err - } - return g, nil -} - -// SetSRID sets the SRID of g. -func (g *LinearRing) SetSRID(srid int) *LinearRing { - g.srid = srid - return g -} - -// Swap swaps the values of g and g2. -func (g *LinearRing) Swap(g2 *LinearRing) { - *g, *g2 = *g2, *g -} diff --git a/vendor/github.com/twpayne/go-geom/linestring.go b/vendor/github.com/twpayne/go-geom/linestring.go deleted file mode 100644 index 2c7ea90..0000000 --- a/vendor/github.com/twpayne/go-geom/linestring.go +++ /dev/null @@ -1,99 +0,0 @@ -package geom - -// A LineString represents a single, unbroken line, linearly interpreted -// between zero or more control points. -type LineString struct { - geom1 -} - -// NewLineString returns a new LineString with layout l and no control points. -func NewLineString(l Layout) *LineString { - return NewLineStringFlat(l, nil) -} - -// NewLineStringFlat returns a new LineString with layout l and control points -// flatCoords. -func NewLineStringFlat(layout Layout, flatCoords []float64) *LineString { - g := new(LineString) - g.layout = layout - g.stride = layout.Stride() - g.flatCoords = flatCoords - return g -} - -// Area returns the area of g, i.e. zero. -func (g *LineString) Area() float64 { - return 0 -} - -// Clone returns a copy of g that does not alias g. -func (g *LineString) Clone() *LineString { - return deriveCloneLineString(g) -} - -// Interpolate returns the index and delta of val in dimension dim. -func (g *LineString) Interpolate(val float64, dim int) (int, float64) { - n := len(g.flatCoords) - if n == 0 { - panic("geom: empty linestring") - } - if val <= g.flatCoords[dim] { - return 0, 0 - } - if g.flatCoords[n-g.stride+dim] <= val { - return (n - 1) / g.stride, 0 - } - low := 0 - high := n / g.stride - for low < high { - mid := (low + high) / 2 - if val < g.flatCoords[mid*g.stride+dim] { - high = mid - } else { - low = mid + 1 - } - } - low-- - val0 := g.flatCoords[low*g.stride+dim] - if val == val0 { - return low, 0 - } - val1 := g.flatCoords[(low+1)*g.stride+dim] - return low, (val - val0) / (val1 - val0) -} - -// Length returns the length of g. -func (g *LineString) Length() float64 { - return length1(g.flatCoords, 0, len(g.flatCoords), g.stride) -} - -// MustSetCoords is like SetCoords but it panics on any error. -func (g *LineString) MustSetCoords(coords []Coord) *LineString { - Must(g.SetCoords(coords)) - return g -} - -// SetCoords sets the coordinates of g. -func (g *LineString) SetCoords(coords []Coord) (*LineString, error) { - if err := g.setCoords(coords); err != nil { - return nil, err - } - return g, nil -} - -// SetSRID sets the SRID of g. -func (g *LineString) SetSRID(srid int) *LineString { - g.srid = srid - return g -} - -// SubLineString returns a LineString from starts at index start and stops at -// index stop of g. The returned LineString aliases g. -func (g *LineString) SubLineString(start, stop int) *LineString { - return NewLineStringFlat(g.layout, g.flatCoords[start*g.stride:stop*g.stride]) -} - -// Swap swaps the values of g and g2. -func (g *LineString) Swap(g2 *LineString) { - *g, *g2 = *g2, *g -} diff --git a/vendor/github.com/twpayne/go-geom/multilinestring.go b/vendor/github.com/twpayne/go-geom/multilinestring.go deleted file mode 100644 index 645f74d..0000000 --- a/vendor/github.com/twpayne/go-geom/multilinestring.go +++ /dev/null @@ -1,88 +0,0 @@ -package geom - -// A MultiLineString is a collection of LineStrings. -type MultiLineString struct { - geom2 -} - -// NewMultiLineString returns a new MultiLineString with no LineStrings. -func NewMultiLineString(layout Layout) *MultiLineString { - return NewMultiLineStringFlat(layout, nil, nil) -} - -// NewMultiLineStringFlat returns a new MultiLineString with the given flat coordinates. -func NewMultiLineStringFlat(layout Layout, flatCoords []float64, ends []int) *MultiLineString { - g := new(MultiLineString) - g.layout = layout - g.stride = layout.Stride() - g.flatCoords = flatCoords - g.ends = ends - return g -} - -// Area returns the area of g, i.e. 0. -func (g *MultiLineString) Area() float64 { - return 0 -} - -// Clone returns a deep copy. -func (g *MultiLineString) Clone() *MultiLineString { - return deriveCloneMultiLineString(g) -} - -// Length returns the sum of the length of the LineStrings. -func (g *MultiLineString) Length() float64 { - return length2(g.flatCoords, 0, g.ends, g.stride) -} - -// LineString returns the ith LineString. -func (g *MultiLineString) LineString(i int) *LineString { - offset := 0 - if i > 0 { - offset = g.ends[i-1] - } - if offset == g.ends[i] { - return NewLineString(g.layout) - } - return NewLineStringFlat(g.layout, g.flatCoords[offset:g.ends[i]]) -} - -// MustSetCoords sets the coordinates and panics on any error. -func (g *MultiLineString) MustSetCoords(coords [][]Coord) *MultiLineString { - Must(g.SetCoords(coords)) - return g -} - -// NumLineStrings returns the number of LineStrings. -func (g *MultiLineString) NumLineStrings() int { - return len(g.ends) -} - -// Push appends a LineString. -func (g *MultiLineString) Push(ls *LineString) error { - if ls.layout != g.layout { - return ErrLayoutMismatch{Got: ls.layout, Want: g.layout} - } - g.flatCoords = append(g.flatCoords, ls.flatCoords...) - g.ends = append(g.ends, len(g.flatCoords)) - return nil -} - -// SetCoords sets the coordinates. -func (g *MultiLineString) SetCoords(coords [][]Coord) (*MultiLineString, error) { - if err := g.setCoords(coords); err != nil { - return nil, err - } - return g, nil -} - -// SetSRID sets the SRID of g. -func (g *MultiLineString) SetSRID(srid int) *MultiLineString { - g.srid = srid - return g -} - -// Swap swaps the values of g and g2. -func (g *MultiLineString) Swap(g2 *MultiLineString) { - *g, *g2 = *g2, *g -} diff --git a/vendor/github.com/twpayne/go-geom/multipoint.go b/vendor/github.com/twpayne/go-geom/multipoint.go deleted file mode 100644 index 68c82d6..0000000 --- a/vendor/github.com/twpayne/go-geom/multipoint.go +++ /dev/null @@ -1,160 +0,0 @@ -package geom - -// A MultiPoint is a collection of Points. -type MultiPoint struct { - // To represent an MultiPoint that allows EMPTY elements, e.g. - // MULTIPOINT ( EMPTY, POINT(1.0 1.0), EMPTY), we have to allow - // record ends. If there is an empty point, ends[i] == ends[i-1]. - geom2 -} - -// NewMultiPoint returns a new, empty, MultiPoint. -func NewMultiPoint(layout Layout) *MultiPoint { - return NewMultiPointFlat(layout, nil) -} - -// NewMultiPointFlatOption represents an option that can be passed into -// NewMultiPointFlat. -type NewMultiPointFlatOption func(*MultiPoint) - -// NewMultiPointFlatOptionWithEnds allows passing ends to NewMultiPointFlat, -// which allows the representation of empty points. -func NewMultiPointFlatOptionWithEnds(ends []int) NewMultiPointFlatOption { - return func(mp *MultiPoint) { - mp.ends = ends - } -} - -// NewMultiPointFlat returns a new MultiPoint with the given flat coordinates. -// Assumes no points are empty by default. Use `NewMultiPointFlatOptionWithEnds` -// to specify empty points. -func NewMultiPointFlat( - layout Layout, flatCoords []float64, opts ...NewMultiPointFlatOption, -) *MultiPoint { - g := new(MultiPoint) - g.layout = layout - g.stride = layout.Stride() - g.flatCoords = flatCoords - for _, opt := range opts { - opt(g) - } - // If no ends are provided, assume all points are non empty. - if g.ends == nil && len(g.flatCoords) > 0 { - numCoords := 0 - if g.stride > 0 { - numCoords = len(flatCoords) / g.stride - } - g.ends = make([]int, numCoords) - for i := 0; i < numCoords; i++ { - g.ends[i] = (i + 1) * g.stride - } - } - return g -} - -// Area returns the area of g, i.e. zero. -func (g *MultiPoint) Area() float64 { - return 0 -} - -// Clone returns a deep copy. -func (g *MultiPoint) Clone() *MultiPoint { - return deriveCloneMultiPoint(g) -} - -// Length returns zero. -func (g *MultiPoint) Length() float64 { - return 0 -} - -// MustSetCoords sets the coordinates and panics on any error. -func (g *MultiPoint) MustSetCoords(coords []Coord) *MultiPoint { - Must(g.SetCoords(coords)) - return g -} - -// Coord returns the ith coord of g. -func (g *MultiPoint) Coord(i int) Coord { - before := 0 - if i > 0 { - before = g.ends[i-1] - } - if g.ends[i] == before { - return nil - } - return g.flatCoords[before:g.ends[i]] -} - -// SetCoords sets the coordinates. -func (g *MultiPoint) SetCoords(coords []Coord) (*MultiPoint, error) { - g.flatCoords = nil - g.ends = nil - for _, c := range coords { - if c != nil { - var err error - g.flatCoords, err = deflate0(g.flatCoords, c, g.stride) - if err != nil { - return nil, err - } - } - g.ends = append(g.ends, len(g.flatCoords)) - } - return g, nil -} - -// Coords unpacks and returns all of g's coordinates. -func (g *MultiPoint) Coords() []Coord { - coords1 := make([]Coord, len(g.ends)) - offset := 0 - prevEnd := 0 - for i, end := range g.ends { - if end != prevEnd { - coords1[i] = inflate0(g.flatCoords, offset, offset+g.stride, g.stride) - offset += g.stride - } - prevEnd = end - } - return coords1 -} - -// NumCoords returns the number of coordinates in g. -func (g *MultiPoint) NumCoords() int { - return len(g.ends) -} - -// SetSRID sets the SRID of g. -func (g *MultiPoint) SetSRID(srid int) *MultiPoint { - g.srid = srid - return g -} - -// NumPoints returns the number of Points. -func (g *MultiPoint) NumPoints() int { - return len(g.ends) -} - -// Point returns the ith Point. -func (g *MultiPoint) Point(i int) *Point { - coord := g.Coord(i) - if coord == nil { - return NewPointEmpty(g.layout) - } - return NewPointFlat(g.layout, coord) -} - -// Push appends a point. -func (g *MultiPoint) Push(p *Point) error { - if p.layout != g.layout { - return ErrLayoutMismatch{Got: p.layout, Want: g.layout} - } - if !p.Empty() { - g.flatCoords = append(g.flatCoords, p.flatCoords...) - } - g.ends = append(g.ends, len(g.flatCoords)) - return nil -} - -// Swap swaps the values of g and g2. -func (g *MultiPoint) Swap(g2 *MultiPoint) { - *g, *g2 = *g2, *g -} diff --git a/vendor/github.com/twpayne/go-geom/multipolygon.go b/vendor/github.com/twpayne/go-geom/multipolygon.go deleted file mode 100644 index b9c8ca6..0000000 --- a/vendor/github.com/twpayne/go-geom/multipolygon.go +++ /dev/null @@ -1,115 +0,0 @@ -package geom - -// A MultiPolygon is a collection of Polygons. -type MultiPolygon struct { - geom3 -} - -// NewMultiPolygon returns a new MultiPolygon with no Polygons. -func NewMultiPolygon(layout Layout) *MultiPolygon { - return NewMultiPolygonFlat(layout, nil, nil) -} - -// NewMultiPolygonFlat returns a new MultiPolygon with the given flat coordinates. -func NewMultiPolygonFlat(layout Layout, flatCoords []float64, endss [][]int) *MultiPolygon { - g := new(MultiPolygon) - g.layout = layout - g.stride = layout.Stride() - g.flatCoords = flatCoords - g.endss = endss - return g -} - -// Area returns the sum of the area of the individual Polygons. -func (g *MultiPolygon) Area() float64 { - return doubleArea3(g.flatCoords, 0, g.endss, g.stride) / 2 -} - -// Clone returns a deep copy. -func (g *MultiPolygon) Clone() *MultiPolygon { - return deriveCloneMultiPolygon(g) -} - -// Length returns the sum of the perimeters of the Polygons. -func (g *MultiPolygon) Length() float64 { - return length3(g.flatCoords, 0, g.endss, g.stride) -} - -// MustSetCoords sets the coordinates and panics on any error. -func (g *MultiPolygon) MustSetCoords(coords [][][]Coord) *MultiPolygon { - Must(g.SetCoords(coords)) - return g -} - -// NumPolygons returns the number of Polygons. -func (g *MultiPolygon) NumPolygons() int { - return len(g.endss) -} - -// Polygon returns the ith Polygon. -func (g *MultiPolygon) Polygon(i int) *Polygon { - if len(g.endss[i]) == 0 { - return NewPolygon(g.layout) - } - // Find the offset from the previous non-empty polygon element. - offset := 0 - lastNonEmptyIdx := i - 1 - for lastNonEmptyIdx >= 0 { - ends := g.endss[lastNonEmptyIdx] - if len(ends) > 0 { - offset = ends[len(ends)-1] - break - } - lastNonEmptyIdx-- - } - ends := make([]int, len(g.endss[i])) - if offset == 0 { - copy(ends, g.endss[i]) - } else { - for j, end := range g.endss[i] { - ends[j] = end - offset - } - } - return NewPolygonFlat(g.layout, g.flatCoords[offset:g.endss[i][len(g.endss[i])-1]], ends) -} - -// Push appends a Polygon. -func (g *MultiPolygon) Push(p *Polygon) error { - if p.layout != g.layout { - return ErrLayoutMismatch{Got: p.layout, Want: g.layout} - } - offset := len(g.flatCoords) - var ends []int - if len(p.ends) > 0 { - ends = make([]int, len(p.ends)) - if offset == 0 { - copy(ends, p.ends) - } else { - for i, end := range p.ends { - ends[i] = end + offset - } - } - } - g.flatCoords = append(g.flatCoords, p.flatCoords...) - g.endss = append(g.endss, ends) - return nil -} - -// SetCoords sets the coordinates. -func (g *MultiPolygon) SetCoords(coords [][][]Coord) (*MultiPolygon, error) { - if err := g.setCoords(coords); err != nil { - return nil, err - } - return g, nil -} - -// SetSRID sets the SRID of g. -func (g *MultiPolygon) SetSRID(srid int) *MultiPolygon { - g.srid = srid - return g -} - -// Swap swaps the values of g and g2. -func (g *MultiPolygon) Swap(g2 *MultiPolygon) { - *g, *g2 = *g2, *g -} diff --git a/vendor/github.com/twpayne/go-geom/point.go b/vendor/github.com/twpayne/go-geom/point.go deleted file mode 100644 index 69dc6d6..0000000 --- a/vendor/github.com/twpayne/go-geom/point.go +++ /dev/null @@ -1,120 +0,0 @@ -package geom - -import "math" - -// PointEmptyCoordHex is the hex representation of a NaN that represents -// an empty coord in a shape. -const PointEmptyCoordHex = 0x7FF8000000000000 - -// PointEmptyCoord is the NaN float64 representation of the empty coordinate. -func PointEmptyCoord() float64 { - return math.Float64frombits(PointEmptyCoordHex) -} - -// A Point represents a single point. -type Point struct { - geom0 -} - -// NewPoint allocates a new Point with layout l and all values zero. -func NewPoint(l Layout) *Point { - return NewPointFlat(l, make([]float64, l.Stride())) -} - -// NewPointEmpty allocates a new Point with no coordinates. -func NewPointEmpty(l Layout) *Point { - return NewPointFlat(l, nil) -} - -// NewPointFlat allocates a new Point with layout l and flat coordinates flatCoords. -func NewPointFlat(l Layout, flatCoords []float64) *Point { - g := new(Point) - g.layout = l - g.stride = l.Stride() - g.flatCoords = flatCoords - return g -} - -// NewPointFlatMaybeEmpty returns a new point, checking whether the point may be empty -// by checking wther all the points are NaN. -func NewPointFlatMaybeEmpty(layout Layout, flatCoords []float64) *Point { - isEmpty := true - for _, coord := range flatCoords { - if math.Float64bits(coord) != PointEmptyCoordHex { - isEmpty = false - break - } - } - if isEmpty { - return NewPointEmpty(layout) - } - return NewPointFlat(layout, flatCoords) -} - -// Area returns g's area, i.e. zero. -func (g *Point) Area() float64 { - return 0 -} - -// Clone returns a copy of g that does not alias g. -func (g *Point) Clone() *Point { - return deriveClonePoint(g) -} - -// Length returns the length of g, i.e. zero. -func (g *Point) Length() float64 { - return 0 -} - -// MustSetCoords is like SetCoords but panics on any error. -func (g *Point) MustSetCoords(coords Coord) *Point { - Must(g.SetCoords(coords)) - return g -} - -// SetCoords sets the coordinates of g. -func (g *Point) SetCoords(coords Coord) (*Point, error) { - if err := g.setCoords(coords); err != nil { - return nil, err - } - return g, nil -} - -// SetSRID sets the SRID of g. -func (g *Point) SetSRID(srid int) *Point { - g.srid = srid - return g -} - -// Swap swaps the values of g and g2. -func (g *Point) Swap(g2 *Point) { - *g, *g2 = *g2, *g -} - -// X returns g's X-coordinate. -func (g *Point) X() float64 { - return g.flatCoords[0] -} - -// Y returns g's Y-coordinate. -func (g *Point) Y() float64 { - return g.flatCoords[1] -} - -// Z returns g's Z-coordinate, or zero if g has no Z-coordinate. -func (g *Point) Z() float64 { - zIndex := g.layout.ZIndex() - if zIndex == -1 { - return 0 - } - return g.flatCoords[zIndex] -} - -// M returns g's M-coordinate, or zero if g has no M-coordinate. -func (g *Point) M() float64 { - mIndex := g.layout.MIndex() - if mIndex == -1 { - return 0 - } - return g.flatCoords[mIndex] -} diff --git a/vendor/github.com/twpayne/go-geom/polygon.go b/vendor/github.com/twpayne/go-geom/polygon.go deleted file mode 100644 index e6d0b47..0000000 --- a/vendor/github.com/twpayne/go-geom/polygon.go +++ /dev/null @@ -1,87 +0,0 @@ -package geom - -// A Polygon represents a polygon as a collection of LinearRings. The first -// LinearRing is the outer boundary. Subsequent LinearRings are inner -// boundaries (holes). -type Polygon struct { - geom2 -} - -// NewPolygon returns a new, empty, Polygon. -func NewPolygon(layout Layout) *Polygon { - return NewPolygonFlat(layout, nil, nil) -} - -// NewPolygonFlat returns a new Polygon with the given flat coordinates. -func NewPolygonFlat(layout Layout, flatCoords []float64, ends []int) *Polygon { - g := new(Polygon) - g.layout = layout - g.stride = layout.Stride() - g.flatCoords = flatCoords - g.ends = ends - return g -} - -// Area returns the area. -func (g *Polygon) Area() float64 { - return doubleArea2(g.flatCoords, 0, g.ends, g.stride) / 2 -} - -// Clone returns a deep copy. -func (g *Polygon) Clone() *Polygon { - return deriveClonePolygon(g) -} - -// Length returns the perimter. -func (g *Polygon) Length() float64 { - return length2(g.flatCoords, 0, g.ends, g.stride) -} - -// LinearRing returns the ith LinearRing. -func (g *Polygon) LinearRing(i int) *LinearRing { - offset := 0 - if i > 0 { - offset = g.ends[i-1] - } - return NewLinearRingFlat(g.layout, g.flatCoords[offset:g.ends[i]]) -} - -// MustSetCoords sets the coordinates and panics on any error. -func (g *Polygon) MustSetCoords(coords [][]Coord) *Polygon { - Must(g.SetCoords(coords)) - return g -} - -// NumLinearRings returns the number of LinearRings. -func (g *Polygon) NumLinearRings() int { - return len(g.ends) -} - -// Push appends a LinearRing. -func (g *Polygon) Push(lr *LinearRing) error { - if lr.layout != g.layout { - return ErrLayoutMismatch{Got: lr.layout, Want: g.layout} - } - g.flatCoords = append(g.flatCoords, lr.flatCoords...) - g.ends = append(g.ends, len(g.flatCoords)) - return nil -} - -// SetCoords sets the coordinates. -func (g *Polygon) SetCoords(coords [][]Coord) (*Polygon, error) { - if err := g.setCoords(coords); err != nil { - return nil, err - } - return g, nil -} - -// SetSRID sets the SRID of g. -func (g *Polygon) SetSRID(srid int) *Polygon { - g.srid = srid - return g -} - -// Swap swaps the values of g and g2. -func (g *Polygon) Swap(g2 *Polygon) { - *g, *g2 = *g2, *g -} diff --git a/vendor/github.com/whosonfirst/go-ioutil/readseekcloser.go b/vendor/github.com/whosonfirst/go-ioutil/readseekcloser.go index 39b230b..f9700b8 100644 --- a/vendor/github.com/whosonfirst/go-ioutil/readseekcloser.go +++ b/vendor/github.com/whosonfirst/go-ioutil/readseekcloser.go @@ -26,7 +26,7 @@ type ReadSeekCloser struct { // Create a new NewReadSeekCloser instance conforming to the Go 1.16 `io.ReadSeekCloser` interface. This method accepts the following types: io.ReadSeekCloser, io.Reader, io.ReadCloser and io.ReadSeeker. func NewReadSeekCloser(fh interface{}) (io.ReadSeekCloser, error) { - reader := true + reader := false seeker := false closer := false @@ -34,13 +34,17 @@ func NewReadSeekCloser(fh interface{}) (io.ReadSeekCloser, error) { case io.ReadSeekCloser: return fh.(io.ReadSeekCloser), nil case io.Closer: - closer = true + closer = true case io.ReadCloser: + reader = true closer = true case io.ReadSeeker: + reader = true seeker = true + case io.Reader: + reader = true default: - return nil, fmt.Errorf("Invalid or unsupported type") + return nil, fmt.Errorf("Invalid or unsupported type: %T", fh) } mu := new(sync.RWMutex) diff --git a/vendor/github.com/whosonfirst/go-reader/fs.go b/vendor/github.com/whosonfirst/go-reader/fs.go index e735571..a5b3fed 100644 --- a/vendor/github.com/whosonfirst/go-reader/fs.go +++ b/vendor/github.com/whosonfirst/go-reader/fs.go @@ -2,16 +2,20 @@ package reader import ( "context" - "errors" "io" "net/url" "os" "path/filepath" + "compress/bzip2" + "fmt" + "github.com/whosonfirst/go-ioutil" + "strconv" ) type FileReader struct { Reader root string + allow_bz2 bool } func init() { @@ -31,24 +35,39 @@ func NewFileReader(ctx context.Context, uri string) (Reader, error) { u, err := url.Parse(uri) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to parse URI, %w", err) } root := u.Path info, err := os.Stat(root) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to stat %s, %w", root, err) } if !info.IsDir() { - return nil, errors.New("root is not a directory") + return nil, fmt.Errorf("Root (%s) is not a directory", root) } - + r := &FileReader{ root: root, } + q := u.Query() + + allow_bz2 := q.Get("allow_bz2") + + if allow_bz2 != "" { + + allow, err := strconv.ParseBool(allow_bz2) + + if err != nil { + return nil, fmt.Errorf("Unable to parse '%s' parameter, %w", allow_bz2, err) + } + + r.allow_bz2 = allow + } + return r, nil } @@ -59,10 +78,31 @@ func (r *FileReader) Read(ctx context.Context, path string) (io.ReadSeekCloser, _, err := os.Stat(abs_path) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to stat %s, %v", abs_path, err) + } + + var fh io.ReadSeekCloser + + fh, err = os.Open(abs_path) + + if err != nil { + return nil, fmt.Errorf("Failed to open %s, %w", abs_path, err) + } + + if filepath.Ext(abs_path) == ".bz2" && r.allow_bz2 { + + bz_r := bzip2.NewReader(fh) + + rsc, err := ioutil.NewReadSeekCloser(bz_r) + + if err != nil { + return nil, fmt.Errorf("Failed create ReadSeekCloser for bzip2 reader for %s, %w", path, err) + } + + fh = rsc } - return os.Open(abs_path) + return fh, nil } func (r *FileReader) ReaderURI(ctx context.Context, path string) string { diff --git a/vendor/github.com/whosonfirst/go-reader/go.mod b/vendor/github.com/whosonfirst/go-reader/go.mod index 257e587..ef83d3d 100644 --- a/vendor/github.com/whosonfirst/go-reader/go.mod +++ b/vendor/github.com/whosonfirst/go-reader/go.mod @@ -4,5 +4,5 @@ go 1.16 require ( github.com/aaronland/go-roster v0.0.2 - github.com/whosonfirst/go-ioutil v1.0.1 + github.com/whosonfirst/go-ioutil v1.0.2 ) diff --git a/vendor/github.com/whosonfirst/go-reader/go.sum b/vendor/github.com/whosonfirst/go-reader/go.sum index 799689b..5b2d7dd 100644 --- a/vendor/github.com/whosonfirst/go-reader/go.sum +++ b/vendor/github.com/whosonfirst/go-reader/go.sum @@ -1,38 +1,4 @@ -github.com/aaronland/go-roster v0.0.1 h1:r1l4n1HfWvEtOXZvhfXX0Won9Xf6QJsigdUdzOtuy/M= -github.com/aaronland/go-roster v0.0.1/go.mod h1:AcovpxlG1XxJxX2Fjqlm63fEIBhCjEIBV4lP87FZDmI= github.com/aaronland/go-roster v0.0.2 h1:2Fu7v4VQLRLRL/Zgr6R9S5JxsW75Ab/K88QtMVX532s= github.com/aaronland/go-roster v0.0.2/go.mod h1:AcovpxlG1XxJxX2Fjqlm63fEIBhCjEIBV4lP87FZDmI= -github.com/facebookgo/atomicfile v0.0.0-20151019000000-2de1f203e7d5e386a6833233882782932729f27e h1:bYAD+4OJX4+LUrmLhpNFiicL4B0mnswQe5QaI6rxJ4A= -github.com/facebookgo/atomicfile v0.0.0-20151019000000-2de1f203e7d5e386a6833233882782932729f27e/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= -github.com/go-ini/ini v1.42.0 h1:TWr1wGj35+UiWHlBA8er89seFXxzwFn11spilrrj+38= -github.com/go-ini/ini v1.42.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/whosonfirst/go-ioutil v0.0.1 h1:cCrEYen6NDvHfjzV2q4u/VB21u2kTOwDnUGRlMI8Z9o= -github.com/whosonfirst/go-ioutil v0.0.1/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= -github.com/whosonfirst/go-ioutil v1.0.0 h1:sYpgJx7Wsp76e7PFGa8KKQBvWQW3+HMCWSJbKdD5m14= -github.com/whosonfirst/go-ioutil v1.0.0/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= -github.com/whosonfirst/go-ioutil v1.0.1 h1:xITnQgEGdG+Qlph7jPY5htL7UpPSm2wEw1WiUlKTWPc= -github.com/whosonfirst/go-ioutil v1.0.1/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= -github.com/whosonfirst/go-whosonfirst-cache v0.1.0 h1:ryWTsHj7gAEjwHC/WjsjROpFflsz3SCa7W9Qnk4EU7k= -github.com/whosonfirst/go-whosonfirst-cache v0.1.0/go.mod h1:P5Tx34j2M50qX/kTfXY516apwGzJGkFSBYQI7TGArKw= -github.com/whosonfirst/go-whosonfirst-cli v0.1.0 h1:Wwj9z0R/ryHmPmpVm5jCbXdG4agJzKMWXDtPVReN/KA= -github.com/whosonfirst/go-whosonfirst-cli v0.1.0/go.mod h1:Edy+amD+fMq1QS1yxB3u8maA8I93q/LG7JRNh+fsdfc= -github.com/whosonfirst/go-whosonfirst-reader v0.0.0-20191122203133-047f20452865 h1:1GYjmjunRhDm1E4/aM/AIhjBij8C9kMqufjS1G2P0fs= -github.com/whosonfirst/go-whosonfirst-reader v0.0.0-20191122203133-047f20452865/go.mod h1:xYzBn6llLD/uS6Zhh0H4LAqddEJHXdQSUIxywTnhpOU= -github.com/whosonfirst/go-whosonfirst-sources v0.1.0 h1:JuKLa6KWke22jBfJ1pM9WQHoz1/3pbDv2C+aR+THPPQ= -github.com/whosonfirst/go-whosonfirst-sources v0.1.0/go.mod h1:EUMHyGzUmqPPxlMmOp+28BFeoBdxxE0HCKRd67lkqGM= -github.com/whosonfirst/go-whosonfirst-uri v0.1.0 h1:JMlpam0x1hVrFBMTAPY3edIHz7azfMK8lLI2kM9BgbI= -github.com/whosonfirst/go-whosonfirst-uri v0.1.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= -github.com/whosonfirst/go-whosonfirst-uri v1.0.1 h1:hVEDRuW9WhqvTksDi092OO9UecX7PAMDrD47KPEqAg0= -github.com/whosonfirst/go-whosonfirst-uri v1.0.1/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +github.com/whosonfirst/go-ioutil v1.0.2 h1:+GJPfa42OFn5A+5yJSc5jQTQIkNV3/MhYyg4pavdrC8= +github.com/whosonfirst/go-ioutil v1.0.2/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-export/v2/go.mod b/vendor/github.com/whosonfirst/go-whosonfirst-export/v2/go.mod index 8b5ce64..53be406 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-export/v2/go.mod +++ b/vendor/github.com/whosonfirst/go-whosonfirst-export/v2/go.mod @@ -4,10 +4,10 @@ go 1.16 require ( github.com/aaronland/go-roster v0.0.2 - github.com/paulmach/orb v0.4.0 + github.com/paulmach/orb v0.5.0 github.com/sfomuseum/go-edtf v0.3.1 - github.com/tidwall/gjson v1.14.0 + github.com/tidwall/gjson v1.14.1 github.com/tidwall/sjson v1.2.4 github.com/whosonfirst/go-whosonfirst-format v0.3.7 - github.com/whosonfirst/go-whosonfirst-id v0.0.3 + github.com/whosonfirst/go-whosonfirst-id v0.0.4 ) diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-export/v2/go.sum b/vendor/github.com/whosonfirst/go-whosonfirst-export/v2/go.sum index 7b4d2d6..efd0500 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-export/v2/go.sum +++ b/vendor/github.com/whosonfirst/go-whosonfirst-export/v2/go.sum @@ -1,33 +1,28 @@ -github.com/aaronland/go-artisanal-integers v0.1.0/go.mod h1:00F0qOpuZZkzWiSSEQYk6Ul1Oc5kwgcYgsfYRmuR+wY= github.com/aaronland/go-artisanal-integers v0.1.1 h1:bLQmWqcqgPT1NOJFwJtZZ9O/QTnttO54ODiWIVuOW1Y= github.com/aaronland/go-artisanal-integers v0.1.1/go.mod h1:ZTeFI+Ck+q+Dp11Htld5aU6V+YwEzxzprsBO0t9GPp8= -github.com/aaronland/go-artisanal-integers-proxy v0.2.0 h1:3gQznMIWKNXbm3iMVKVC9l7nuZUj3ySUSN889fKlxhQ= -github.com/aaronland/go-artisanal-integers-proxy v0.2.0/go.mod h1:7Pkt553bRIgRMzkyPzPzvPDweCxMG6wx96qMBLlCk/Y= -github.com/aaronland/go-brooklynintegers-api v1.0.2/go.mod h1:JlR7i6vciy3W0aMnid7cN/Ls9Pz/vaq1lNj9sCENQf0= -github.com/aaronland/go-brooklynintegers-api v1.1.0/go.mod h1:agceH8JW8PcdHGCyKEDmOntccB3m7xUKrUejHpxAs6U= +github.com/aaronland/go-artisanal-integers-proxy v0.2.5 h1:jkQ0p8TLCTPFH8rqFqYWMu3Qzr5ZzZWT9KhehzT091k= +github.com/aaronland/go-artisanal-integers-proxy v0.2.5/go.mod h1:mldeud4G0Yn4a+VKZ+CHrg5mw3u5OIOok25q5OKsOrM= +github.com/aaronland/go-brooklynintegers-api v1.2.1/go.mod h1:vFyhY89Uc0LDZEaEam5EQ+2La2VlkTvSfExuZgZhmX4= github.com/aaronland/go-brooklynintegers-api v1.2.4 h1:KcRWO9kWTL6iNmZVTdPZVo7ngN0O9FFTKoQrFSjPMsU= github.com/aaronland/go-brooklynintegers-api v1.2.4/go.mod h1:hNUn5nueKQM23ptExy20p5qDpRPhWg8RbjwW2BuXWmw= -github.com/aaronland/go-londonintegers-api v0.1.0/go.mod h1:E0VIcwks+So4FL1FYAQzrO5/OVOUsFPsqW85UrZArSE= -github.com/aaronland/go-missionintegers-api v0.1.0/go.mod h1:LZEM5+MkPX5RehLxTEv+3Y3cqMSYEk86qBa+aVecnKw= +github.com/aaronland/go-londonintegers-api v0.1.1/go.mod h1:N7Y0jrx+ouRAMrFcdH4nvJH6vrszj8/3yOOe0F8EV1E= github.com/aaronland/go-missionintegers-api v0.1.1 h1:zn6ohxxdUp3UXD8kv7ZXceS6CbGemtyDjvMT1VLezKI= github.com/aaronland/go-missionintegers-api v0.1.1/go.mod h1:CvByrizvklOxK6QD+Z4RNqACxHqqVjiB/GdWQfrB4Mc= -github.com/aaronland/go-pool v0.0.0-20191128211702-88306299c758 h1:m/JUyvxsCbgOyhecvs9WXFvZy9dj8BKu4T96J53d/ao= -github.com/aaronland/go-pool v0.0.0-20191128211702-88306299c758/go.mod h1:hL9EPOZJ6WVHaz7D0Jw1Dn1vaCOOSZNrYBTKMgDKYRk= +github.com/aaronland/go-pool v1.0.0 h1:RupGLoRO5EHzPZ08zZgiLeDXPhErUAtPonzVLM2D6yM= +github.com/aaronland/go-pool v1.0.0/go.mod h1:5EzZAfp1v2N+EyyGQ3868fxNxBL5+b4OUmVgnJZpMFo= github.com/aaronland/go-roster v0.0.1/go.mod h1:AcovpxlG1XxJxX2Fjqlm63fEIBhCjEIBV4lP87FZDmI= github.com/aaronland/go-roster v0.0.2 h1:2Fu7v4VQLRLRL/Zgr6R9S5JxsW75Ab/K88QtMVX532s= github.com/aaronland/go-roster v0.0.2/go.mod h1:AcovpxlG1XxJxX2Fjqlm63fEIBhCjEIBV4lP87FZDmI= -github.com/aaronland/go-string v0.1.1 h1:btdr18owWCBN14ojKx3p+PBCKfm9qIggYEguPLUb2wE= -github.com/aaronland/go-string v0.1.1/go.mod h1:2aMIWdTqk63jZsaLLy+p9dsB1MDRqx4sHYoLtkwyYUo= -github.com/aaronland/go-uid v0.0.2 h1:5H3wtTBi58lkW5bqbaFR8Hp1MXfcraoJRlxKoUDeVfg= -github.com/aaronland/go-uid v0.0.2/go.mod h1:Kb/J05tYHWxp+Dkpod+oRkBKnxyw+szODwIQKIjvhj0= -github.com/aaronland/go-uid-artisanal v0.0.0-20191128230022-67bc446aa49d h1:2Sa8kTm10DVvAPESKu0XhQHNOBKpGxpkqLb7TvFMa4I= -github.com/aaronland/go-uid-artisanal v0.0.0-20191128230022-67bc446aa49d/go.mod h1:/fkI7C9H/GTB/TlLmNsKjHoNyXnYlkb/iG4Qp3tSCmE= -github.com/akrylysov/algnhsa v0.0.0-20190319020909-05b3d192e9a7/go.mod h1:HhzjNA0EjUWcwHTUMwqrpeAdIF3gRmpH0HpWx1hYJSc= +github.com/aaronland/go-string v0.1.2 h1:RSr/mQNbLgF37H0RV+nF7j2kILRRFkCmr8Jwq4lw92k= +github.com/aaronland/go-string v0.1.2/go.mod h1:2aMIWdTqk63jZsaLLy+p9dsB1MDRqx4sHYoLtkwyYUo= +github.com/aaronland/go-uid v0.0.3 h1:MIcdw+Jp8tVx+m9wrExxl2y8l5KbzsTTOUCDNOnNRnk= +github.com/aaronland/go-uid v0.0.3/go.mod h1:VccCcqEWQgE9fr42fwnWIPBRMQlN1Yx+GLUQBPR3xNA= +github.com/aaronland/go-uid-artisanal v0.0.1 h1:WRDDfSO7vqWnkMYFCYEjU2TCs6csDuBHoo7o/jDOcWE= +github.com/aaronland/go-uid-artisanal v0.0.1/go.mod h1:WbAHDcfpYJ673t5kXgZn0zH7XiBjoLdvOMgngVQpCcg= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/aws/aws-lambda-go v1.9.0/go.mod h1:zUsUQhAUjYzR8AuduJPCfhBuKWUaDbQiPOG+ouzmE1A= -github.com/aws/aws-lambda-go v1.10.0/go.mod h1:zUsUQhAUjYzR8AuduJPCfhBuKWUaDbQiPOG+ouzmE1A= +github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -41,9 +36,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/paulmach/orb v0.4.0 h1:ilp1MQjRapLJ1+qcays1nZpe0mvkCY+b8JU/qBKRZ1A= -github.com/paulmach/orb v0.4.0/go.mod h1:FkcWtplUAIVqAuhAOV2d3rpbnQyliDOjOcLW9dUrfdU= -github.com/paulmach/protoscan v0.2.1-0.20210522164731-4e53c6875432/go.mod h1:2sV+uZ/oQh66m4XJVZm5iqUZ62BN88Ex1E+TTS0nLzI= +github.com/paulmach/orb v0.5.0 h1:sNhJV5ML+mv1F077ljOck/9inorF4ahDO8iNNpHbKHY= +github.com/paulmach/orb v0.5.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= +github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -52,42 +47,43 @@ github.com/sfomuseum/go-edtf v0.3.1/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNt github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA= github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= +github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v0.0.0-20190325153808-1166b9ac2b65/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.4 h1:cuiLzLnaMeBhRmEv00Lpk3tkYrcxpmbU81tAY4Dw0tc= github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= -github.com/whosonfirst/algnhsa v0.1.0/go.mod h1:swLBXxaVTv3s6dJLhekdQCuCTshUew+xHjptRC21RG0= github.com/whosonfirst/go-whosonfirst-format v0.3.7 h1:SkiUt2s0LqvH5JP7586+Rz7SgKwtRoFt7aGfWFFemoI= github.com/whosonfirst/go-whosonfirst-format v0.3.7/go.mod h1:lMBIXCnD9ZA+wCNtu6XFYoq5DTfnEALO8k6OkEn11MM= -github.com/whosonfirst/go-whosonfirst-id v0.0.3 h1:sIsUkVPDbR9lgWcgQ9e4C7K4wlpSOGzALHp3iNid8ds= -github.com/whosonfirst/go-whosonfirst-id v0.0.3/go.mod h1:JuDIBvv0gzygE83XjX8Ym7JnX6OTO1X1efikSwTh8Ic= +github.com/whosonfirst/go-whosonfirst-id v0.0.4 h1:Vhvo4qUjQCrM9r1E37DY3lHhbJJE5UazxcmTFAdqQVU= +github.com/whosonfirst/go-whosonfirst-id v0.0.4/go.mod h1:APHWvXV+DOqANgD1Lq615oJpLtdRjKdVV5cV7OgzER0= github.com/whosonfirst/go-whosonfirst-log v0.1.0 h1:mWYI5hn16uyeLxBmPsLSvYV4rQKK/cxGVhM+bC2ZoGc= github.com/whosonfirst/go-whosonfirst-log v0.1.0/go.mod h1:pmgBbxZSnjGVy2nsUJBBMcFagxwIKLlmRsW7ClkXmac= -github.com/whosonfirst/go-whosonfirst-pool v0.1.0/go.mod h1:6LeQYv7hVK16LVevMuOuaLRfgI3JDtaoVxaMMVqRS38= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/ratelimit v0.1.0/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -101,6 +97,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -109,7 +107,7 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-feature/alt/alt.go b/vendor/github.com/whosonfirst/go-whosonfirst-feature/alt/alt.go new file mode 100644 index 0000000..c02d904 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-feature/alt/alt.go @@ -0,0 +1,34 @@ +// package alt provides methods for working with "alternate" geometry records +package alt + +import ( + "github.com/tidwall/gjson" +) + +func IsAlt(body []byte) bool { + + allowed_properties := []string{ + // this is the new new but won't "work" until we backfill all + // 26M files and the export tools to set this property + // (20190821/thisisaaronland) + "properties.src:alt_label", + // SFO syntax (initial proposal) + "properties.wof:alt_label", + } + + for _, path := range allowed_properties { + + rsp := gjson.GetBytes(body, path) + + if rsp.Exists() && rsp.String() != "" { + return true + } + } + + // we used to test that wof:parent_id wasn't -1 but that's a bad test since + // plenty of stuff might have a parent ID of -1 and really what we want to + // test is the presence of the property not the value + // (20190821/thisisaaronland) + + return false +} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-feature/geometry/geometry.go b/vendor/github.com/whosonfirst/go-whosonfirst-feature/geometry/geometry.go new file mode 100644 index 0000000..7426ecd --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-feature/geometry/geometry.go @@ -0,0 +1,27 @@ +// package geometry provides methods for deriving and interpreting Who's On First geometries. +package geometry + +import ( + "fmt" + "github.com/paulmach/orb/geojson" + "github.com/tidwall/gjson" +) + +func Geometry(body []byte) (*geojson.Geometry, error) { + + rsp := gjson.GetBytes(body, "geometry") + + if !rsp.Exists() { + return nil, fmt.Errorf("Failed to derive geometry for feature") + } + + str_geom := rsp.String() + + geom, err := geojson.UnmarshalGeometry([]byte(str_geom)) + + if err != nil { + return nil, fmt.Errorf("Failed to unmarshal geometry for feature, %w", err) + } + + return geom, nil +} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-feature/geometry/type.go b/vendor/github.com/whosonfirst/go-whosonfirst-feature/geometry/type.go new file mode 100644 index 0000000..5b6f240 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-feature/geometry/type.go @@ -0,0 +1,17 @@ +package geometry + +import ( + "fmt" + "github.com/tidwall/gjson" +) + +func Type(body []byte) (string, error) { + + rsp := gjson.GetBytes(body, "geometry.type") + + if !rsp.Exists() { + return "", fmt.Errorf("Missing geometry.type property") + } + + return rsp.String(), nil +} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-feature/properties/belongsto.go b/vendor/github.com/whosonfirst/go-whosonfirst-feature/properties/belongsto.go new file mode 100644 index 0000000..c4553d2 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-feature/properties/belongsto.go @@ -0,0 +1,18 @@ +package properties + +import ( + "github.com/tidwall/gjson" +) + +func BelongsTo(body []byte) []int64 { + + by := make([]int64, 0) + + rsp := gjson.GetBytes(body, "properties.wof:belongsto") + + for _, r := range rsp.Array() { + by = append(by, r.Int()) + } + + return by +} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-feature/properties/source.go b/vendor/github.com/whosonfirst/go-whosonfirst-feature/properties/source.go new file mode 100644 index 0000000..2fac88c --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-feature/properties/source.go @@ -0,0 +1,32 @@ +package properties + +import ( + "fmt" + "github.com/tidwall/gjson" +) + +func Source(body []byte) (string, error) { + + var source string + + possible := []string{ + "properties.src:alt_label", + "properties.src:geom", + } + + for _, path := range possible { + + rsp := gjson.GetBytes(body, path) + + if rsp.Exists() { + source = rsp.String() + break + } + } + + if source == "" { + return "", fmt.Errorf("Missing src:geom or src:alt_label property") + } + + return source, nil +} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/README.md b/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/README.md index 349f497..25e2751 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/README.md +++ b/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/README.md @@ -12,21 +12,13 @@ make tools All of this package's dependencies are bundled with the code in the `vendor` directory. -## Notice +## Important -This package is stuck in that awkward in-between place where it is basically deprecated but still being included as a dependency to a lot of other packages. +This is work in progress. It may change (and break your code) still. This package aims to replace the existing [go-whosonfirst-geojson](https://github.com/whosonfirst/go-whosonfirst-geojson) package. If you want to follow along, please consult: -Which is to say: While this package is not officially deprecated yet it is on its way to being deprecated. Bug fixes will be applied when necessary but otherwise all work is being applied to the [whosonfirst/go-whosonfirst-feature](https://github.com/whosonfirst/go-whosonfirst-feature) package. +https://github.com/whosonfirst/go-whosonfirst-geojson-v2/issues/1 -Basically this package tries to do too many things, specifically around defining GeoJSON-related structs and interfaces. It's not really worth the effort and better to use [paulmach/orb/geojson](https://github.com/paulmach/orb) for geometry and GeoJSON-related operations and [tidwall/gjson](https://github.com/tidwall/gjson] for query-related operations using plain-vanilla `[]byte` elements. This is the approach taken by the `go-whosonfirst-feature` package. - -If you are using _this package_ in your code it would be best to migrate it to use equivalent functionality defined in the `go-whosonfirst-feature` package. - -## History - -The goal of this package was to replace the existing [go-whosonfirst-geojson](https://github.com/whosonfirst/go-whosonfirst-geojson) package. - -### geojson-v2? +## geojson-v2? Yeah, I don't really like it either but this package is basically 100% backwards incompatible with `github.com/whosonfirst/go-whosonfirst-geojson` and while I don't _really_ think anyone else is using it I don't like the idea of suddenly breaking everyone's code. diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/go.mod b/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/go.mod index 6a0176c..989e5b6 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/go.mod +++ b/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/go.mod @@ -5,13 +5,13 @@ go 1.12 require ( github.com/mmcloughlin/geohash v0.10.0 github.com/paulmach/go.geojson v1.4.0 - github.com/sfomuseum/go-edtf v0.3.1 + github.com/sfomuseum/go-edtf v0.2.3 github.com/skelterjohn/geom v0.0.0-20180103142417-96f3e8a219c5 - github.com/tidwall/gjson v1.14.0 - github.com/whosonfirst/go-whosonfirst-flags v0.4.3 + github.com/tidwall/gjson v1.6.8 + github.com/whosonfirst/go-whosonfirst-flags v0.4.2 github.com/whosonfirst/go-whosonfirst-hash v0.1.0 github.com/whosonfirst/go-whosonfirst-placetypes v0.3.0 github.com/whosonfirst/go-whosonfirst-spr/v2 v2.0.0 - github.com/whosonfirst/go-whosonfirst-uri v1.1.0 + github.com/whosonfirst/go-whosonfirst-uri v0.2.0 github.com/whosonfirst/warning v0.1.1 ) diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/go.sum b/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/go.sum index c15f66a..66aa561 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/go.sum +++ b/vendor/github.com/whosonfirst/go-whosonfirst-geojson-v2/go.sum @@ -22,8 +22,6 @@ github.com/sfomuseum/go-edtf v0.2.2 h1:8n1UekTCU6fkgAf3bWqG5RyQxOd9hRhy4lg91aQ3k github.com/sfomuseum/go-edtf v0.2.2/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= github.com/sfomuseum/go-edtf v0.2.3 h1:wpcpwl1RD9W/sXFDi4zpoIpQcIwIk8em9CGwa7YWv4g= github.com/sfomuseum/go-edtf v0.2.3/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= -github.com/sfomuseum/go-edtf v0.3.1 h1:22DEXVvGhnpF7PD4dvpgKH0/oD8u9I+a4cXCwy1x2f4= -github.com/sfomuseum/go-edtf v0.3.1/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= github.com/sfomuseum/go-flags v0.7.0/go.mod h1:ML3DTNbF9xnjExSdS/9FtVLjIUhRU5gm/ehzISv+t2w= github.com/skelterjohn/geom v0.0.0-20180103000000-96f3e8a219c5f4276b0dda3568d80c4e02a50116 h1:3viuBF2tRGd2HlEs/uL4LLmdjOj8kAO6Y2c8Ii4H0oI= github.com/skelterjohn/geom v0.0.0-20180103000000-96f3e8a219c5f4276b0dda3568d80c4e02a50116/go.mod h1:w8cQIijHlvvZM7afYlixPThHAdD+AkRFw3Mb9yQ2Y+I= @@ -44,22 +42,16 @@ github.com/tidwall/gjson v1.6.0 h1:9VEQWz6LLMUsUl6PueE49ir4Ka6CzLymOAZDxpFsTDc= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.6.8 h1:CTmXMClGYPAmln7652e69B7OLXfTi5ABcPPwjIWUv7w= github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= -github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v0.0.0-20190325153808-1166b9ac2b65 h1:rQ229MBgvW68s1/g6f1/63TgYwYxfF4E+bi/KC19P8g= github.com/tidwall/pretty v0.0.0-20190325153808-1166b9ac2b65/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/whosonfirst/go-whosonfirst-cli v0.1.0 h1:Wwj9z0R/ryHmPmpVm5jCbXdG4agJzKMWXDtPVReN/KA= github.com/whosonfirst/go-whosonfirst-cli v0.1.0/go.mod h1:Edy+amD+fMq1QS1yxB3u8maA8I93q/LG7JRNh+fsdfc= github.com/whosonfirst/go-whosonfirst-flags v0.1.0 h1:llb2wtsI2y+gHZCmWaamMCx4YDRE8ZXQRRYqC7qB4so= @@ -69,8 +61,6 @@ github.com/whosonfirst/go-whosonfirst-flags v0.4.0 h1:3qEz1v7rALk+TqVstW9DKQOWrM github.com/whosonfirst/go-whosonfirst-flags v0.4.0/go.mod h1:kewFjxBiE00SqjjIanm5DPI81SYvx93wVb3ogwV/PMk= github.com/whosonfirst/go-whosonfirst-flags v0.4.2 h1:HWjy/0MfAQMdCj4M9hi3LAITgK/D+cuDWGHP37mFeZo= github.com/whosonfirst/go-whosonfirst-flags v0.4.2/go.mod h1:kewFjxBiE00SqjjIanm5DPI81SYvx93wVb3ogwV/PMk= -github.com/whosonfirst/go-whosonfirst-flags v0.4.3 h1:ef6IkgvYADL4kc750sl6i5hkReNq0Z6upLcqpK2CHLY= -github.com/whosonfirst/go-whosonfirst-flags v0.4.3/go.mod h1:pL17Ryo60FH8RYaQRgfu5XnxhrNRK3x+rn03TYD6Gc8= github.com/whosonfirst/go-whosonfirst-hash v0.1.0 h1:FpnclPIb+8M1uhSXfl3z8nYcG/3O59vgfkdV+m0hQpA= github.com/whosonfirst/go-whosonfirst-hash v0.1.0/go.mod h1:1ZdCFZTnQt5bwnsj2daB9yHilKOKToVh+Tyj/Z8TbUk= github.com/whosonfirst/go-whosonfirst-placetypes v0.1.0 h1:zuSk8eqeEkg42sIZ4EF71IMtphdTbG80qJsXhuZXXbM= @@ -88,9 +78,6 @@ github.com/whosonfirst/go-whosonfirst-uri v0.1.0 h1:JMlpam0x1hVrFBMTAPY3edIHz7az github.com/whosonfirst/go-whosonfirst-uri v0.1.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= github.com/whosonfirst/go-whosonfirst-uri v0.2.0 h1:iODHdyvW+8IXqHZTixZ/9GEZy1dVKGj6dMRg7fn0d2M= github.com/whosonfirst/go-whosonfirst-uri v0.2.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= -github.com/whosonfirst/go-whosonfirst-uri v1.0.1/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= -github.com/whosonfirst/go-whosonfirst-uri v1.1.0 h1:kNYOmKSm3u2asUOeq7yXL1Q8gFKkPIl8A0qinKrGV/8= -github.com/whosonfirst/go-whosonfirst-uri v1.1.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= github.com/whosonfirst/warning v0.1.0 h1:NgMa6a6Xv7FdDNgpqK5j/FDo6qrcFzFtidAExDqPfC0= github.com/whosonfirst/warning v0.1.0/go.mod h1:cAez7FpC/UEUrbiOXZO15v2JM8eijtFHQlN93AGFy1k= github.com/whosonfirst/warning v0.1.1 h1:h29zL3VNL9VUHztkAAndzblhrDHyik9z47OuUR2Vovw= diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/go.mod b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/go.mod index e8aad89..f1ff344 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/go.mod +++ b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/go.mod @@ -1,8 +1,10 @@ module github.com/whosonfirst/go-whosonfirst-spr/v2 -go 1.12 +go 1.16 require ( - github.com/sfomuseum/go-edtf v0.2.2 - github.com/whosonfirst/go-whosonfirst-flags v0.2.0 + github.com/sfomuseum/go-edtf v1.0.0 + github.com/whosonfirst/go-whosonfirst-feature v0.0.23 + github.com/whosonfirst/go-whosonfirst-flags v0.4.3 + github.com/whosonfirst/go-whosonfirst-uri v1.0.1 ) diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/go.sum b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/go.sum index 5fa5d1c..07e1ebc 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/go.sum +++ b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/go.sum @@ -1,29 +1,61 @@ -github.com/go-ini/ini v1.42.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/paulmach/orb v0.6.0 h1:QqsQkeYM3zzr3ANUHWBoo8zvK1CATO4G9pYmKoCAgnM= +github.com/paulmach/orb v0.6.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= +github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/sfomuseum/go-edtf v0.2.2 h1:8n1UekTCU6fkgAf3bWqG5RyQxOd9hRhy4lg91aQ3kMk= -github.com/sfomuseum/go-edtf v0.2.2/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/whosonfirst/go-whosonfirst-cli v0.1.0/go.mod h1:Edy+amD+fMq1QS1yxB3u8maA8I93q/LG7JRNh+fsdfc= -github.com/whosonfirst/go-whosonfirst-flags v0.1.0 h1:llb2wtsI2y+gHZCmWaamMCx4YDRE8ZXQRRYqC7qB4so= -github.com/whosonfirst/go-whosonfirst-flags v0.1.0/go.mod h1:bovMiQphaVhqemXFmNVf9Ts0tqnWtzHRFMUSKX+zTE8= -github.com/whosonfirst/go-whosonfirst-flags v0.2.0 h1:zia/L+rhKSQ5iruITPnwU9lqsd1SavvF+HYRubEARSs= -github.com/whosonfirst/go-whosonfirst-flags v0.2.0/go.mod h1:ECd0AJJZIlybmjTGB9z+CPz9pSiMTwxur7fPKmDnoqI= -github.com/whosonfirst/go-whosonfirst-placetypes v0.1.0/go.mod h1:Jdmug2QQLbrmg+UcYGz8k575GnrOEg63vZVS46e5fMs= -github.com/whosonfirst/go-whosonfirst-placetypes v0.2.4/go.mod h1:yl0zZ5tfK80C0kl34pJcPB3mZC5XXR7ybQJ5OJyEcDU= +github.com/sfomuseum/go-edtf v0.2.3/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= +github.com/sfomuseum/go-edtf v0.3.1/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= +github.com/sfomuseum/go-edtf v1.0.0 h1:pU76aSrBgRTaKK/RzEESYDU+YcGNbBk/XKwEMr4qXmE= +github.com/sfomuseum/go-edtf v1.0.0/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= +github.com/sfomuseum/go-flags v0.7.0/go.mod h1:ML3DTNbF9xnjExSdS/9FtVLjIUhRU5gm/ehzISv+t2w= +github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= +github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/whosonfirst/go-whosonfirst-feature v0.0.23 h1:/oklJJRMF5a75D7tYKueh1nQRBcejqZ2cnr0CdakYiQ= +github.com/whosonfirst/go-whosonfirst-feature v0.0.23/go.mod h1:3cvRigFFG2a99M64lZzfy5amHacWu8Os5fXZdGjPnLM= +github.com/whosonfirst/go-whosonfirst-flags v0.4.3 h1:ef6IkgvYADL4kc750sl6i5hkReNq0Z6upLcqpK2CHLY= +github.com/whosonfirst/go-whosonfirst-flags v0.4.3/go.mod h1:pL17Ryo60FH8RYaQRgfu5XnxhrNRK3x+rn03TYD6Gc8= +github.com/whosonfirst/go-whosonfirst-placetypes v0.3.0/go.mod h1:ez0VFkGFbgT2/z2oi3PIuW6FewsZ2+5glyfDD79XEHk= +github.com/whosonfirst/go-whosonfirst-sources v0.1.0 h1:JuKLa6KWke22jBfJ1pM9WQHoz1/3pbDv2C+aR+THPPQ= github.com/whosonfirst/go-whosonfirst-sources v0.1.0/go.mod h1:EUMHyGzUmqPPxlMmOp+28BFeoBdxxE0HCKRd67lkqGM= -github.com/whosonfirst/go-whosonfirst-spr v0.1.0 h1:5qE629nCiucF2upy5NjPOEl9cFatsljykYY0l2JKgAk= -github.com/whosonfirst/go-whosonfirst-spr v0.1.0/go.mod h1:R8GtEVz1GVSnwwOjzcoVUd172ZK26Q7hQSLI6SGG7lM= -github.com/whosonfirst/go-whosonfirst-uri v0.2.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= -github.com/whosonfirst/warning v0.1.0/go.mod h1:cAez7FpC/UEUrbiOXZO15v2JM8eijtFHQlN93AGFy1k= +github.com/whosonfirst/go-whosonfirst-uri v1.0.1 h1:hVEDRuW9WhqvTksDi092OO9UecX7PAMDrD47KPEqAg0= +github.com/whosonfirst/go-whosonfirst-uri v1.0.1/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= github.com/whosonfirst/warning v0.1.1/go.mod h1:/unEMzhB9YaMeEwTJpzLN3kM5LiSxdJhKEsf/OQhn6s= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/spr.go b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/spr.go index a675bed..34bf8a9 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/spr.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/spr.go @@ -1,8 +1,8 @@ package spr import ( + "github.com/sfomuseum/go-edtf" "github.com/whosonfirst/go-whosonfirst-flags" - "github.com/sfomuseum/go-edtf" ) type StandardPlacesResult interface { @@ -15,7 +15,7 @@ type StandardPlacesResult interface { Path() string URI() string Inception() *edtf.EDTFDate - Cessation() *edtf.EDTFDate + Cessation() *edtf.EDTFDate Latitude() float64 Longitude() float64 MinLatitude() float64 diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/whosonfirst.go b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/whosonfirst.go new file mode 100644 index 0000000..cdd0756 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/whosonfirst.go @@ -0,0 +1,343 @@ +package spr + +import ( + "fmt" + "github.com/sfomuseum/go-edtf" + "github.com/sfomuseum/go-edtf/parser" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/geometry" + "github.com/whosonfirst/go-whosonfirst-feature/properties" + "github.com/whosonfirst/go-whosonfirst-flags" + "github.com/whosonfirst/go-whosonfirst-flags/existential" + "github.com/whosonfirst/go-whosonfirst-uri" + "strconv" +) + +// WOFStandardPlacesResult is a struct that implements the `StandardPlacesResult` for +// Who's On First GeoJSON Feature records. +type WOFStandardPlacesResult struct { + StandardPlacesResult `json:",omitempty"` + EDTFInception string `json:"edtf:inception"` + EDTFCessation string `json:"edtf:cessation"` + WOFId int64 `json:"wof:id"` + WOFParentId int64 `json:"wof:parent_id"` + WOFName string `json:"wof:name"` + WOFPlacetype string `json:"wof:placetype"` + WOFCountry string `json:"wof:country"` + WOFRepo string `json:"wof:repo"` + WOFPath string `json:"wof:path"` + WOFSupersededBy []int64 `json:"wof:superseded_by"` + WOFSupersedes []int64 `json:"wof:supersedes"` + WOFBelongsTo []int64 `json:"wof:belongsto"` + MZURI string `json:"mz:uri"` + MZLatitude float64 `json:"mz:latitude"` + MZLongitude float64 `json:"mz:longitude"` + MZMinLatitude float64 `json:"mz:min_latitude"` + MZMinLongitude float64 `json:"mz:min_longitude"` + MZMaxLatitude float64 `json:"mz:max_latitude"` + MZMaxLongitude float64 `json:"mz:max_longitude"` + MZIsCurrent int64 `json:"mz:is_current"` + MZIsCeased int64 `json:"mz:is_ceased"` + MZIsDeprecated int64 `json:"mz:is_deprecated"` + MZIsSuperseded int64 `json:"mz:is_superseded"` + MZIsSuperseding int64 `json:"mz:is_superseding"` + WOFLastModified int64 `json:"wof:lastmodified"` +} + +// WhosOnFirstSPR will derive a new `WOFStandardPlacesResult` instance from 'f'. +func WhosOnFirstSPR(f []byte) (StandardPlacesResult, error) { + + if alt.IsAlt(f) { + return nil, fmt.Errorf("Can not create SPR for alternate geometry") + } + + id, err := properties.Id(f) + + if err != nil { + return nil, err + } + + parent_id, err := properties.ParentId(f) + + if err != nil { + return nil, err + } + + name, err := properties.Name(f) + + if err != nil { + return nil, err + } + + placetype, err := properties.Placetype(f) + + if err != nil { + return nil, err + } + + country := properties.Country(f) + + repo, err := properties.Repo(f) + + if err != nil { + return nil, err + } + + inception := properties.Inception(f) + cessation := properties.Cessation(f) + + // See this: We're accounting for all the pre-2019 EDTF spec + // inception but mostly cessation strings by silently swapping + // them out (20210321/straup) + + _, err = parser.ParseString(inception) + + if err != nil { + + if !edtf.IsDeprecated(inception) { + return nil, err + } + + replacement, err := edtf.ReplaceDeprecated(inception) + + if err != nil { + return nil, err + } + + inception = replacement + } + + _, err = parser.ParseString(cessation) + + if err != nil { + + if !edtf.IsDeprecated(cessation) { + return nil, err + } + + replacement, err := edtf.ReplaceDeprecated(cessation) + + if err != nil { + return nil, err + } + + cessation = replacement + } + + path, err := uri.Id2RelPath(id) + + if err != nil { + return nil, err + } + + uri, err := uri.Id2AbsPath("https://data.whosonfirst.org", id) + + if err != nil { + return nil, err + } + + is_current, err := properties.IsCurrent(f) + + if err != nil { + return nil, err + } + + is_ceased, err := properties.IsCeased(f) + + if err != nil { + return nil, err + } + + is_deprecated, err := properties.IsDeprecated(f) + + if err != nil { + return nil, err + } + + is_superseded, err := properties.IsSuperseded(f) + + if err != nil { + return nil, err + } + + is_superseding, err := properties.IsSuperseding(f) + + if err != nil { + return nil, err + } + + centroid, _, err := properties.Centroid(f) + + if err != nil { + return nil, err + } + + geojson_geom, err := geometry.Geometry(f) + + if err != nil { + return nil, err + } + + orb_geom := geojson_geom.Geometry() + mbr := orb_geom.Bound() + + superseded_by := properties.SupersededBy(f) + supersedes := properties.Supersedes(f) + + belongsto := properties.BelongsTo(f) + + lastmod := properties.LastModified(f) + + spr := WOFStandardPlacesResult{ + WOFId: id, + WOFParentId: parent_id, + WOFPlacetype: placetype, + WOFName: name, + WOFCountry: country, + WOFRepo: repo, + WOFPath: path, + WOFSupersedes: supersedes, + WOFSupersededBy: superseded_by, + WOFBelongsTo: belongsto, + EDTFInception: inception, + EDTFCessation: cessation, + MZURI: uri, + MZLatitude: centroid.Y(), + MZLongitude: centroid.X(), + MZMinLatitude: mbr.Min.Y(), + MZMinLongitude: mbr.Min.X(), + MZMaxLatitude: mbr.Max.Y(), + MZMaxLongitude: mbr.Max.X(), + MZIsCurrent: is_current.Flag(), + MZIsCeased: is_ceased.Flag(), + MZIsDeprecated: is_deprecated.Flag(), + MZIsSuperseded: is_superseded.Flag(), + MZIsSuperseding: is_superseding.Flag(), + WOFLastModified: lastmod, + } + + return &spr, nil + +} + +func (spr *WOFStandardPlacesResult) Id() string { + return strconv.FormatInt(spr.WOFId, 10) +} + +func (spr *WOFStandardPlacesResult) ParentId() string { + return strconv.FormatInt(spr.WOFParentId, 10) +} + +func (spr *WOFStandardPlacesResult) Name() string { + return spr.WOFName +} + +func (spr *WOFStandardPlacesResult) Inception() *edtf.EDTFDate { + return spr.edtfDate(spr.EDTFInception) +} + +func (spr *WOFStandardPlacesResult) Cessation() *edtf.EDTFDate { + return spr.edtfDate(spr.EDTFCessation) +} + +func (spr *WOFStandardPlacesResult) edtfDate(edtf_str string) *edtf.EDTFDate { + + d, err := parser.ParseString(edtf_str) + + if err != nil { + return nil + } + + return d +} + +func (spr *WOFStandardPlacesResult) Placetype() string { + return spr.WOFPlacetype +} + +func (spr *WOFStandardPlacesResult) Country() string { + return spr.WOFCountry +} + +func (spr *WOFStandardPlacesResult) Repo() string { + return spr.WOFRepo +} + +func (spr *WOFStandardPlacesResult) Path() string { + return spr.WOFPath +} + +func (spr *WOFStandardPlacesResult) URI() string { + return spr.MZURI +} + +func (spr *WOFStandardPlacesResult) Latitude() float64 { + return spr.MZLatitude +} + +func (spr *WOFStandardPlacesResult) Longitude() float64 { + return spr.MZLongitude +} + +func (spr *WOFStandardPlacesResult) MinLatitude() float64 { + return spr.MZMinLatitude +} + +func (spr *WOFStandardPlacesResult) MinLongitude() float64 { + return spr.MZMinLongitude +} + +func (spr *WOFStandardPlacesResult) MaxLatitude() float64 { + return spr.MZLatitude +} + +func (spr *WOFStandardPlacesResult) MaxLongitude() float64 { + return spr.MZMaxLongitude +} + +func (spr *WOFStandardPlacesResult) IsCurrent() flags.ExistentialFlag { + return existentialFlag(spr.MZIsCurrent) +} + +func (spr *WOFStandardPlacesResult) IsCeased() flags.ExistentialFlag { + return existentialFlag(spr.MZIsCeased) +} + +func (spr *WOFStandardPlacesResult) IsDeprecated() flags.ExistentialFlag { + return existentialFlag(spr.MZIsDeprecated) +} + +func (spr *WOFStandardPlacesResult) IsSuperseded() flags.ExistentialFlag { + return existentialFlag(spr.MZIsSuperseded) +} + +func (spr *WOFStandardPlacesResult) IsSuperseding() flags.ExistentialFlag { + return existentialFlag(spr.MZIsSuperseding) +} + +func (spr *WOFStandardPlacesResult) SupersededBy() []int64 { + return spr.WOFSupersededBy +} + +func (spr *WOFStandardPlacesResult) Supersedes() []int64 { + return spr.WOFSupersedes +} + +func (spr *WOFStandardPlacesResult) BelongsTo() []int64 { + return spr.WOFBelongsTo +} + +func (spr *WOFStandardPlacesResult) LastModified() int64 { + return spr.WOFLastModified +} + +// we're going to assume that this won't fail since we already go through +// the process of instantiating `flags.ExistentialFlag` thingies in SPR() +// if we need to we'll just cache those instances in the `spr *WOFStandardPlacesResult` +// thingy (and omit them from the JSON output) but today that is unnecessary +// (20170816/thisisaaronland) + +func existentialFlag(i int64) flags.ExistentialFlag { + fl, _ := existential.NewKnownUnknownFlag(i) + return fl +} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/whosonfirst_alt.go b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/whosonfirst_alt.go new file mode 100644 index 0000000..cd1817b --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-spr/v2/whosonfirst_alt.go @@ -0,0 +1,218 @@ +package spr + +import ( + "fmt" + "github.com/sfomuseum/go-edtf" + "github.com/whosonfirst/go-whosonfirst-feature/geometry" + "github.com/whosonfirst/go-whosonfirst-feature/properties" + "github.com/whosonfirst/go-whosonfirst-flags" + "github.com/whosonfirst/go-whosonfirst-uri" + "strconv" + "strings" +) + +// WOFStandardPlacesResult is a struct that implements the `StandardPlacesResult` for +// Who's On First GeoJSON Feature alternate geometry records. +type WOFAltStandardPlacesResult struct { + StandardPlacesResult `json:",omitempty"` + WOFId string `json:"wof:id"` + WOFName string `json:"wof:name"` + WOFPlacetype string `json:"wof:placetype"` + MZLatitude float64 `json:"mz:latitude"` + MZLongitude float64 `json:"mz:longitude"` + MZMinLatitude float64 `json:"mz:min_latitude"` + MZMinLongitude float64 `json:"mz:min_longitude"` + MZMaxLatitude float64 `json:"mz:max_latitude"` + MZMaxLongitude float64 `json:"mz:max_longitude"` + WOFPath string `json:"wof:path"` + WOFRepo string `json:"wof:repo"` +} + +// WhosOnFirstAltSPR will derive a new `WOFStandardPlacesResult` instance from 'f'. +func WhosOnFirstAltSPR(f []byte) (StandardPlacesResult, error) { + + id, err := properties.Id(f) + + if err != nil { + return nil, fmt.Errorf("Failed to derive ID, %w", err) + } + + source, err := properties.Source(f) + + if err != nil { + return nil, fmt.Errorf("Failed to derive source, %w", err) + } + + name := fmt.Sprintf("%d alt geometry (%s)", id, source) + + alt_label, err := properties.AltLabel(f) + + if err != nil { + return nil, fmt.Errorf("Failed to derive alt label, %w", err) + } + + label_parts := strings.Split(alt_label, "-") + + if len(label_parts) == 0 { + return nil, fmt.Errorf("Invalid src:alt_label property") + } + + alt_geom := &uri.AltGeom{ + Source: label_parts[0], + } + + if len(label_parts) >= 2 { + alt_geom.Function = label_parts[1] + } + + if len(label_parts) >= 3 { + alt_geom.Extras = label_parts[2:] + } + + uri_args := &uri.URIArgs{ + IsAlternate: true, + AltGeom: alt_geom, + } + + rel_path, err := uri.Id2RelPath(id, uri_args) + + if err != nil { + return nil, fmt.Errorf("Failed to derive path for %d, %w", id, err) + } + + repo, err := properties.Repo(f) + + if err != nil { + return nil, fmt.Errorf("Failed to derive repo, %w", err) + } + + geojson_geom, err := geometry.Geometry(f) + + if err != nil { + return nil, err + } + + orb_geom := geojson_geom.Geometry() + mbr := orb_geom.Bound() + + lat := mbr.Min.Y() + ((mbr.Max.Y() - mbr.Min.Y()) / 2.0) + lon := mbr.Min.X() + ((mbr.Max.X() - mbr.Min.X()) / 2.0) + + str_id := strconv.FormatInt(id, 10) + + spr := WOFAltStandardPlacesResult{ + WOFId: str_id, + WOFPlacetype: "alt", + WOFName: name, + MZLatitude: lat, + MZLongitude: lon, + MZMinLatitude: mbr.Min.Y(), + MZMinLongitude: mbr.Min.X(), + MZMaxLatitude: mbr.Max.Y(), + MZMaxLongitude: mbr.Max.X(), + WOFPath: rel_path, + WOFRepo: repo, + } + + return &spr, nil +} + +func (spr *WOFAltStandardPlacesResult) Id() string { + return spr.WOFId +} + +func (spr *WOFAltStandardPlacesResult) ParentId() string { + return "-1" +} + +func (spr *WOFAltStandardPlacesResult) Name() string { + return spr.WOFName +} + +func (spr *WOFAltStandardPlacesResult) Placetype() string { + return spr.WOFPlacetype +} + +func (spr *WOFAltStandardPlacesResult) Country() string { + return "XX" +} + +func (spr *WOFAltStandardPlacesResult) Repo() string { + return spr.WOFRepo +} + +func (spr *WOFAltStandardPlacesResult) Path() string { + return spr.WOFPath +} + +func (spr *WOFAltStandardPlacesResult) URI() string { + return "" +} + +func (spr *WOFAltStandardPlacesResult) Latitude() float64 { + return spr.MZLatitude +} + +func (spr *WOFAltStandardPlacesResult) Longitude() float64 { + return spr.MZLongitude +} + +func (spr *WOFAltStandardPlacesResult) MinLatitude() float64 { + return spr.MZMinLatitude +} + +func (spr *WOFAltStandardPlacesResult) MinLongitude() float64 { + return spr.MZMinLongitude +} + +func (spr *WOFAltStandardPlacesResult) MaxLatitude() float64 { + return spr.MZLatitude +} + +func (spr *WOFAltStandardPlacesResult) MaxLongitude() float64 { + return spr.MZMaxLongitude +} + +func (spr *WOFAltStandardPlacesResult) Inception() *edtf.EDTFDate { + return nil +} + +func (spr *WOFAltStandardPlacesResult) Cessation() *edtf.EDTFDate { + return nil +} + +func (spr *WOFAltStandardPlacesResult) IsCurrent() flags.ExistentialFlag { + return existentialFlag(-1) +} + +func (spr *WOFAltStandardPlacesResult) IsCeased() flags.ExistentialFlag { + return existentialFlag(-1) +} + +func (spr *WOFAltStandardPlacesResult) IsDeprecated() flags.ExistentialFlag { + return existentialFlag(-1) +} + +func (spr *WOFAltStandardPlacesResult) IsSuperseded() flags.ExistentialFlag { + return existentialFlag(-1) +} + +func (spr *WOFAltStandardPlacesResult) IsSuperseding() flags.ExistentialFlag { + return existentialFlag(-1) +} + +func (spr *WOFAltStandardPlacesResult) SupersededBy() []int64 { + return []int64{} +} + +func (spr *WOFAltStandardPlacesResult) Supersedes() []int64 { + return []int64{} +} + +func (spr *WOFAltStandardPlacesResult) BelongsTo() []int64 { + return []int64{} +} + +func (spr *WOFAltStandardPlacesResult) LastModified() int64 { + return -1 +} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/README.md b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/README.md index 3a2e756..805ff59 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/README.md +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/README.md @@ -1,6 +1,12 @@ # go-whosonfirst-sqlite-features-index -Go package for indexing Who's On First features in SQLite databases. +Go package for indexing Who's On First features in SQLite databases using the `whosonfirst/go-whosonfirst-sqlite-index` and `whosonfirst/go-whosonfirst-sqlite-features` packages. + +The `go-whosonfirst-sqlite-index` package indexes SQLite databases using table constucts defined in the `aaronland/go-sqlite` package and records defined by the `whosonfirst/go-whosonfirst-iterate/v2` package + +## Documentation + +[![Go Reference](https://pkg.go.dev/badge/github.com/whosonfirst/go-whosonfirst-sqlite-features-index.svg)](https://pkg.go.dev/github.com/whosonfirst/go-whosonfirst-sqlite-features-index) ## Tools @@ -288,8 +294,7 @@ As of this writing individual tables are indexed atomically. There may be some i ## See also -* https://github.com/whosonfirst/go-whosonfirst-sqlite +* https://github.com/aaronland/go-sqlite * https://github.com/whosonfirst/go-whosonfirst-sqlite-features * https://github.com/whosonfirst/go-whosonfirst-sqlite-index -* https://github.com/whosonfirst/go-whosonfirst-iterate -* https://github.com/whosonfirst/go-whosonfirst-iterate-git \ No newline at end of file +* https://github.com/whosonfirst/go-whosonfirst-iterate/v2 \ No newline at end of file diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/doc.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/doc.go new file mode 100644 index 0000000..5444b3e --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/doc.go @@ -0,0 +1,2 @@ +// package index provides methods for indexing Who's On First feature records in SQLite databases using the `whosonfirst/go-whosonfirst-sqlite-index` and `whosonfirst/go-whosonfirst-sqlite-features` packages. The `go-whosonfirst-sqlite-index` package indexes SQLite databases using table constucts defined in the `aaronland/go-sqlite` package and records defined by the `whosonfirst/go-whosonfirst-iterate/v2` package +package index diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/go.mod b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/go.mod index 8d471e0..ccad86d 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/go.mod +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/go.mod @@ -5,14 +5,12 @@ go 1.16 require ( github.com/aaronland/go-sqlite v0.1.1 github.com/tidwall/gjson v1.14.1 - github.com/whosonfirst/go-reader v0.10.0 + github.com/whosonfirst/go-reader v0.11.0 github.com/whosonfirst/go-reader-http v0.3.0 - github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4 + github.com/whosonfirst/go-whosonfirst-feature v0.0.23 github.com/whosonfirst/go-whosonfirst-iterate-git/v2 v2.1.0 github.com/whosonfirst/go-whosonfirst-iterate/v2 v2.0.2 - github.com/whosonfirst/go-whosonfirst-log v0.1.0 - github.com/whosonfirst/go-whosonfirst-sqlite-features v0.9.3 - github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1 + github.com/whosonfirst/go-whosonfirst-sqlite-features v0.10.0 + github.com/whosonfirst/go-whosonfirst-sqlite-index/v3 v3.0.0 github.com/whosonfirst/go-whosonfirst-uri v1.2.0 - github.com/whosonfirst/warning v0.1.1 ) diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/go.sum b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/go.sum index f474fb5..de2246c 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/go.sum +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/go.sum @@ -1,12 +1,6 @@ -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= github.com/aaronland/go-json-query v0.1.1/go.mod h1:lZHt3LmcrZ0bovlqvr1jQaQKJKpb2pMLN2er6RGHAIQ= @@ -14,7 +8,6 @@ github.com/aaronland/go-json-query v0.1.2 h1:+yJBCJk9kcRAzbErhh+zOqK3DHSs/GmuSqX github.com/aaronland/go-json-query v0.1.2/go.mod h1:kkCl5KrO+fVSL2M8b/i3qO5PsnCpmajGXkbJHpEQPY8= github.com/aaronland/go-roster v0.0.2 h1:2Fu7v4VQLRLRL/Zgr6R9S5JxsW75Ab/K88QtMVX532s= github.com/aaronland/go-roster v0.0.2/go.mod h1:AcovpxlG1XxJxX2Fjqlm63fEIBhCjEIBV4lP87FZDmI= -github.com/aaronland/go-sqlite v0.1.0/go.mod h1:/Q4BWbsdgHtQY+99oxaeCj4TwGc8qyAN8CUyF2JK0xg= github.com/aaronland/go-sqlite v0.1.1 h1:bqObBiGw3K01Nq9Zt2NtFTESHSoNVd5ZaLc+FYVivhI= github.com/aaronland/go-sqlite v0.1.1/go.mod h1:EoqGJ9v4WGF9Gwln7g6b0ANsIED2sBit7p4VMtnD/yU= github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= @@ -23,14 +16,10 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -45,28 +34,23 @@ github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2Su github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= -github.com/go-ini/ini v1.42.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce h1:prjrVgOk2Yg6w+PflHoszQNLTUh4kaByUcEWM/9uin4= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874 h1:em+tTnzgU7N22woTBMcSJAOW7tRHAkK597W+MD/CpK8= github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -74,26 +58,16 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mmcloughlin/geohash v0.10.0 h1:9w1HchfDfdeLc+jFEf/04D27KP7E2QmpDu52wPbJWRE= -github.com/mmcloughlin/geohash v0.10.0/go.mod h1:oNZxQo5yWJh0eMQEP/8hwQuVx9Z9tjwFUqcTB1SmG0c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/ory/dockertest/v3 v3.6.0/go.mod h1:4ZOpj8qBUmh8fcBSVzkH2bws2s91JdGvHUqan4GHEuQ= -github.com/paulmach/go.geojson v1.4.0 h1:5x5moCkCtDo5x8af62P9IOAYGQcYHtxz2QJ3x1DoCgY= -github.com/paulmach/go.geojson v1.4.0/go.mod h1:YaKx1hKpWF+T2oj2lFJPsW/t1Q5e1jQI61eoQSTwpIs= +github.com/paulmach/orb v0.6.0 h1:QqsQkeYM3zzr3ANUHWBoo8zvK1CATO4G9pYmKoCAgnM= +github.com/paulmach/orb v0.6.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= +github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -102,116 +76,97 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sfomuseum/go-edtf v0.2.2/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= github.com/sfomuseum/go-edtf v0.2.3/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= -github.com/sfomuseum/go-edtf v0.3.1 h1:22DEXVvGhnpF7PD4dvpgKH0/oD8u9I+a4cXCwy1x2f4= github.com/sfomuseum/go-edtf v0.3.1/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= +github.com/sfomuseum/go-edtf v1.0.0 h1:pU76aSrBgRTaKK/RzEESYDU+YcGNbBk/XKwEMr4qXmE= +github.com/sfomuseum/go-edtf v1.0.0/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= github.com/sfomuseum/go-flags v0.7.0/go.mod h1:ML3DTNbF9xnjExSdS/9FtVLjIUhRU5gm/ehzISv+t2w= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/skelterjohn/geom v0.0.0-20180103142417-96f3e8a219c5 h1:qQF/q/+xaKD4CAVz3zfuvpij8U4ihSGIhHfOROI4NFc= -github.com/skelterjohn/geom v0.0.0-20180103142417-96f3e8a219c5/go.mod h1:w8cQIijHlvvZM7afYlixPThHAdD+AkRFw3Mb9yQ2Y+I= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/twpayne/go-geom v1.4.1 h1:LeivFqaGBRfyg0XJJ9pkudcptwhSSrYN9KZUW6HcgdA= -github.com/twpayne/go-geom v1.4.1/go.mod h1:k/zktXdL+qnA6OgKsdEGUTA17jbQ2ZPTUa3CCySuGpE= -github.com/twpayne/go-kml v1.5.2/go.mod h1:kz8jAiIz6FIdU2Zjce9qGlVtgFYES9vt7BTPBHf5jl4= -github.com/twpayne/go-polyline v1.0.0/go.mod h1:ICh24bcLYBX8CknfvNPKqoTbe+eg+MX1NPyJmSBo7pU= -github.com/twpayne/go-waypoint v0.0.0-20200706203930-b263a7f6e4e8/go.mod h1:qj5pHncxKhu9gxtZEYWypA/z097sxhFlbTyOyt9gcnU= github.com/whosonfirst/go-ioutil v1.0.0/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= -github.com/whosonfirst/go-ioutil v1.0.1 h1:xITnQgEGdG+Qlph7jPY5htL7UpPSm2wEw1WiUlKTWPc= github.com/whosonfirst/go-ioutil v1.0.1/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= -github.com/whosonfirst/go-reader v0.10.0 h1:RHQPNEqurYbI1N0SrqpUMMo0O4KTa5JSZi/sYGMtxig= +github.com/whosonfirst/go-ioutil v1.0.2 h1:+GJPfa42OFn5A+5yJSc5jQTQIkNV3/MhYyg4pavdrC8= +github.com/whosonfirst/go-ioutil v1.0.2/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= github.com/whosonfirst/go-reader v0.10.0/go.mod h1:YNcxm9xr0++Jz4nXWZjtQ/RRVq0fCjq1CwJdmJgfOh8= +github.com/whosonfirst/go-reader v0.11.0 h1:CCk4sOMqP58zyVzcf2Q/FuBW5MW5CxSaNt6/Tek1LuI= +github.com/whosonfirst/go-reader v0.11.0/go.mod h1:sj+z1x90XEBy/QBy5nuBa7EGntGAC2QhbAW1Y1QZ5nM= github.com/whosonfirst/go-reader-http v0.3.0 h1:EgHoK6jSfa3kkyx8pS4eFgzK+Egv2F4LukadPDTtEDQ= github.com/whosonfirst/go-reader-http v0.3.0/go.mod h1:lxrCTVQlcysPs+P9USTB/QeedtZjd4olIdms5nGMkXs= github.com/whosonfirst/go-rfc-5646 v0.1.0 h1:HNFPAem6v5De61PXLgbGzx9tfNOP83AAkVvm9WAddJY= github.com/whosonfirst/go-rfc-5646 v0.1.0/go.mod h1:JZj//FV9YeV3fkyOY/82V53EMLQXwRwNPuQIGs8BUmo= -github.com/whosonfirst/go-whosonfirst-cli v0.1.0/go.mod h1:Edy+amD+fMq1QS1yxB3u8maA8I93q/LG7JRNh+fsdfc= github.com/whosonfirst/go-whosonfirst-crawl v0.2.1 h1:nNG7r7/4MaII/NM8Df2oqgfgVNBDoIKlseleoX1vw1Q= github.com/whosonfirst/go-whosonfirst-crawl v0.2.1/go.mod h1:MTD1TCgAkXlAtysPU98ylrz9Y5+ZCfRrsrBnRyiH/t8= -github.com/whosonfirst/go-whosonfirst-flags v0.2.0/go.mod h1:ECd0AJJZIlybmjTGB9z+CPz9pSiMTwxur7fPKmDnoqI= -github.com/whosonfirst/go-whosonfirst-flags v0.4.2/go.mod h1:kewFjxBiE00SqjjIanm5DPI81SYvx93wVb3ogwV/PMk= +github.com/whosonfirst/go-whosonfirst-feature v0.0.23 h1:/oklJJRMF5a75D7tYKueh1nQRBcejqZ2cnr0CdakYiQ= +github.com/whosonfirst/go-whosonfirst-feature v0.0.23/go.mod h1:3cvRigFFG2a99M64lZzfy5amHacWu8Os5fXZdGjPnLM= github.com/whosonfirst/go-whosonfirst-flags v0.4.3 h1:ef6IkgvYADL4kc750sl6i5hkReNq0Z6upLcqpK2CHLY= github.com/whosonfirst/go-whosonfirst-flags v0.4.3/go.mod h1:pL17Ryo60FH8RYaQRgfu5XnxhrNRK3x+rn03TYD6Gc8= -github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.3/go.mod h1:R3GximAGJWLCITU2eh3I5Vtyze/usjOl5LTGQCDI89Y= -github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4 h1:5FVbXC6PvohoxFAd2fXanmERwFjz9ExJIoj4mC+AAwM= -github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4/go.mod h1:nlnmDlcm3OjkKBihOIGdzWW8fSpR+ubD3JUSXLLG5y4= -github.com/whosonfirst/go-whosonfirst-hash v0.1.0 h1:FpnclPIb+8M1uhSXfl3z8nYcG/3O59vgfkdV+m0hQpA= -github.com/whosonfirst/go-whosonfirst-hash v0.1.0/go.mod h1:1ZdCFZTnQt5bwnsj2daB9yHilKOKToVh+Tyj/Z8TbUk= github.com/whosonfirst/go-whosonfirst-iterate-git/v2 v2.1.0 h1:YcQMIilV2CSL8nSFwPdMiQCOZkH7rtVXYU+mdA/wckc= github.com/whosonfirst/go-whosonfirst-iterate-git/v2 v2.1.0/go.mod h1:okSGTdAZsnR1zvNow9VwtSn1hmbgEZhNc7EymHaEFRU= github.com/whosonfirst/go-whosonfirst-iterate/v2 v2.0.1/go.mod h1:oGk1jhZiP1Hfe4QVQAMAVCkTTjxlr5/hrzk/xfxWVss= github.com/whosonfirst/go-whosonfirst-iterate/v2 v2.0.2 h1:IJ4o6/I0+yfedzv/dy3SPENbxibwxil8ve1URPPGKv8= github.com/whosonfirst/go-whosonfirst-iterate/v2 v2.0.2/go.mod h1:wkoAmndZ3l67zjUmjzw3Km8OzFt/TTJiVDSrYC8b9XY= -github.com/whosonfirst/go-whosonfirst-log v0.1.0 h1:mWYI5hn16uyeLxBmPsLSvYV4rQKK/cxGVhM+bC2ZoGc= github.com/whosonfirst/go-whosonfirst-log v0.1.0/go.mod h1:pmgBbxZSnjGVy2nsUJBBMcFagxwIKLlmRsW7ClkXmac= github.com/whosonfirst/go-whosonfirst-names v0.1.0 h1:uXop/DwQqH60uDBZvHCPg1yRSQLScbm6VZyqcaED2KE= github.com/whosonfirst/go-whosonfirst-names v0.1.0/go.mod h1:0z86/nedM9T/5C8cAdbCMfRuBrkc33oEQ6vdJ6WybSg= -github.com/whosonfirst/go-whosonfirst-placetypes v0.2.4/go.mod h1:yl0zZ5tfK80C0kl34pJcPB3mZC5XXR7ybQJ5OJyEcDU= -github.com/whosonfirst/go-whosonfirst-placetypes v0.3.0 h1:68kuizK8FXjfEIOKlqWemhs7gyMBIgpLJDbCZF8+8Ok= github.com/whosonfirst/go-whosonfirst-placetypes v0.3.0/go.mod h1:ez0VFkGFbgT2/z2oi3PIuW6FewsZ2+5glyfDD79XEHk= github.com/whosonfirst/go-whosonfirst-sources v0.1.0 h1:JuKLa6KWke22jBfJ1pM9WQHoz1/3pbDv2C+aR+THPPQ= github.com/whosonfirst/go-whosonfirst-sources v0.1.0/go.mod h1:EUMHyGzUmqPPxlMmOp+28BFeoBdxxE0HCKRd67lkqGM= -github.com/whosonfirst/go-whosonfirst-spr/v2 v2.0.0 h1:UQ1n/uODS50mckZpXYe5GKm8XwoUUC1jRcNN8oiW2uc= -github.com/whosonfirst/go-whosonfirst-spr/v2 v2.0.0/go.mod h1:tveSSFDn8XoiCeAMarSCn769lA6e3Y0/Qi8S19Jz7Gw= -github.com/whosonfirst/go-whosonfirst-sqlite-features v0.9.3 h1:GqQEKfIQMlCBMZsyDQj4K6A9ob+1Wglz0vGv/E4X9qA= -github.com/whosonfirst/go-whosonfirst-sqlite-features v0.9.3/go.mod h1:kBFrT6COGzqA15Hyunh43JucZKjFWHC/HyFHCemhra8= -github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1 h1:NII/w0HnA5AGjRvwZJIgrEhNq2igiaVRjvVwJ5KejhQ= +github.com/whosonfirst/go-whosonfirst-spr/v2 v2.2.0 h1:mAk0Vl2BDW1pweD0a54spNGpK70GSnjPBVqJDSi/Dbk= +github.com/whosonfirst/go-whosonfirst-spr/v2 v2.2.0/go.mod h1:3P6fiSVGtIbM3UcyaVMs4i1N6Hi88GmTsdouuXzlr78= +github.com/whosonfirst/go-whosonfirst-sqlite-features v0.10.0 h1:H+nxoG/RBezVRigRt0nKF6bCE/CXp5uRe0Y7/VpESW0= +github.com/whosonfirst/go-whosonfirst-sqlite-features v0.10.0/go.mod h1:OYgpbMAxP4g2LiHpbI8ObeOUMZHZb+tqZ58/HDDdfgY= github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1/go.mod h1:dZxoAGOI9dnX95fV3eM4BCoFs+Rzzzc7tmTvhNNbiVM= -github.com/whosonfirst/go-whosonfirst-uri v0.2.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= +github.com/whosonfirst/go-whosonfirst-sqlite-index/v3 v3.0.0 h1:XezVmysv7nfskEBXqhTQDHMegANDlr7xUdLLVPdb6tk= +github.com/whosonfirst/go-whosonfirst-sqlite-index/v3 v3.0.0/go.mod h1:lMCFs+pi80lM1ZyCYczXzCzXOazc4vJYKAsVpaGdTt8= github.com/whosonfirst/go-whosonfirst-uri v1.0.1/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= -github.com/whosonfirst/go-whosonfirst-uri v1.1.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= github.com/whosonfirst/go-whosonfirst-uri v1.2.0 h1:lhmRsIhcpTr5HAo+kXKRGsSt76HTh3Ko/oTR2jpCm/o= github.com/whosonfirst/go-whosonfirst-uri v1.2.0/go.mod h1:CuVygTCUpMG945MMvqHyqxvc/L5YkDaMrrVpRFr7ZxY= github.com/whosonfirst/walk v0.0.1 h1:t0QrqGwOdPMSeovFZSXfiS0GIGHrRXK3Wb9z5Uhs2bg= github.com/whosonfirst/walk v0.0.1/go.mod h1:1KtP/VeooSlFOI61p+THc/C16Ra8Z5MjpjI0tsd3c1M= -github.com/whosonfirst/warning v0.1.1 h1:h29zL3VNL9VUHztkAAndzblhrDHyik9z47OuUR2Vovw= github.com/whosonfirst/warning v0.1.1/go.mod h1:/unEMzhB9YaMeEwTJpzLN3kM5LiSxdJhKEsf/OQhn6s= github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897 h1:KrsHThm5nFk34YtATK1LsThyGhGbGe1olrte/HInHvs= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -223,22 +178,25 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/index.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/index.go index 907b392..a617faf 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/index.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features-index/index.go @@ -2,75 +2,74 @@ package index import ( "context" - "errors" "fmt" "github.com/aaronland/go-sqlite" "github.com/tidwall/gjson" "github.com/whosonfirst/go-reader" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/feature" + "github.com/whosonfirst/go-whosonfirst-feature/geometry" + "github.com/whosonfirst/go-whosonfirst-feature/properties" wof_tables "github.com/whosonfirst/go-whosonfirst-sqlite-features/tables" - sql_index "github.com/whosonfirst/go-whosonfirst-sqlite-index/v2" + sql_index "github.com/whosonfirst/go-whosonfirst-sqlite-index/v3" "github.com/whosonfirst/go-whosonfirst-uri" - "github.com/whosonfirst/warning" "io" "log" "sync" ) +// SQLiteFeaturesLoadRecordFuncOptions is a struct to define options when loading Who's On First feature records. type SQLiteFeaturesLoadRecordFuncOptions struct { + // StrictAltFiles is a boolean flag indicating whether the failure to load or parse an alternate geometry file should trigger a critical error. StrictAltFiles bool } +// SQLiteFeaturesIndexRelationsFuncOptions type SQLiteFeaturesIndexRelationsFuncOptions struct { + // Reader is a valid `whosonfirst/go-reader` instance used to load Who's On First feature data Reader reader.Reader + // Strict is a boolean flag indicating whether the failure to load or parse feature record should trigger a critical error. Strict bool } +// SQLiteFeaturesLoadRecordFunc returns a `go-whosonfirst-sqlite-index/v3.SQLiteIndexerLoadRecordFunc` callback +// function that will ensure the the record being processed is a valid Who's On First GeoJSON Feature record. func SQLiteFeaturesLoadRecordFunc(opts *SQLiteFeaturesLoadRecordFuncOptions) sql_index.SQLiteIndexerLoadRecordFunc { - cb := func(ctx context.Context, path string, fh io.ReadSeeker, args ...interface{}) (interface{}, error) { + cb := func(ctx context.Context, path string, r io.ReadSeeker, args ...interface{}) (interface{}, error) { select { case <-ctx.Done(): return nil, nil default: + // pass + } - i, err := feature.LoadWOFFeatureFromReader(fh) - - if err != nil && !warning.IsWarning(err) { - - _, err := fh.Seek(0, 0) - - if err != nil { - return nil, err - } - - alt, alt_err := feature.LoadWOFAltFeatureFromReader(fh) - - if alt_err != nil && !warning.IsWarning(alt_err) { + body, err := io.ReadAll(r) - msg := fmt.Sprintf("Unable to load %s, because %s (%s)", path, alt_err, err) + if err != nil { + return nil, fmt.Errorf("Failed read %s, %w", path, err) + } - if !opts.StrictAltFiles { - log.Printf("%s - SKIPPING\n", msg) - return nil, nil - } + _, err = properties.Id(body) - return nil, errors.New(msg) - } + if err != nil { + return nil, fmt.Errorf("Failed to derive wof:id for %s, %w", path, err) + } - i = alt - } + _, err = geometry.Geometry(body) - return i, nil + if err != nil { + return nil, fmt.Errorf("Failed to derive geometry for %s, %w", path, err) } + + return body, nil } return cb } +// SQLiteFeaturesIndexRelationsFunc returns a `go-whosonfirst-sqlite-index/v3.SQLiteIndexerPostIndexFunc` callback +// function used to index relations for a WOF record after that record has been successfully indexed. func SQLiteFeaturesIndexRelationsFunc(r reader.Reader) sql_index.SQLiteIndexerPostIndexFunc { opts := &SQLiteFeaturesIndexRelationsFuncOptions{} @@ -79,6 +78,9 @@ func SQLiteFeaturesIndexRelationsFunc(r reader.Reader) sql_index.SQLiteIndexerPo return SQLiteFeaturesIndexRelationsFuncWithOptions(opts) } +// SQLiteFeaturesIndexRelationsFuncWithOptions returns a `go-whosonfirst-sqlite-index/v3.SQLiteIndexerPostIndexFunc` callback +// function used to index relations for a WOF record after that record has been successfully indexed, but with custom +// `SQLiteFeaturesIndexRelationsFuncOptions` options defined in 'opts'. func SQLiteFeaturesIndexRelationsFuncWithOptions(opts *SQLiteFeaturesIndexRelationsFuncOptions) sql_index.SQLiteIndexerPostIndexFunc { seen := new(sync.Map) @@ -88,20 +90,18 @@ func SQLiteFeaturesIndexRelationsFuncWithOptions(opts *SQLiteFeaturesIndexRelati geojson_t, err := wof_tables.NewGeoJSONTable(ctx) if err != nil { - return err + return fmt.Errorf("Failed to create new GeoJSON table, %w", err) } conn, err := db.Conn() if err != nil { - return err + return fmt.Errorf("Failed to establish database connection, %v", err) } - f := record.(geojson.Feature) - body := f.Bytes() + body := record.([]byte) relations := make(map[int64]bool) - to_index := make([]geojson.Feature, 0) candidates := []string{ "properties.wof:belongsto", @@ -152,7 +152,7 @@ func SQLiteFeaturesIndexRelationsFuncWithOptions(opts *SQLiteFeaturesIndexRelati err = row.Scan(&count) if err != nil { - return err + return fmt.Errorf("Failed to count records for ID %d, %v", id, err) } if count != 0 { @@ -162,7 +162,7 @@ func SQLiteFeaturesIndexRelationsFuncWithOptions(opts *SQLiteFeaturesIndexRelati rel_path, err := uri.Id2RelPath(id) if err != nil { - return err + return fmt.Errorf("Failed to determine relative path for %d, %v", id, err) } fh, err := opts.Reader.Read(ctx, rel_path) @@ -170,7 +170,7 @@ func SQLiteFeaturesIndexRelationsFuncWithOptions(opts *SQLiteFeaturesIndexRelati if err != nil { if opts.Strict { - return err + return fmt.Errorf("Failed to open %s, %v", rel_path, err) } log.Printf("Failed to read '%s' because '%v'. Strict mode is disabled so skipping\n", rel_path, err) @@ -179,35 +179,18 @@ func SQLiteFeaturesIndexRelationsFuncWithOptions(opts *SQLiteFeaturesIndexRelati defer fh.Close() - ancestor, err := feature.LoadFeatureFromReader(fh) - - // check for warnings in case this record has a non-standard - // placetype (20201224/thisisaaronland) - - if err != nil && !warning.IsWarning(err) { - - if opts.Strict { - return err - } + ancestor, err := io.ReadAll(fh) - log.Printf("Failed to load feature for '%s' because '%v'. Strict mode is disabled so skipping\n", rel_path, err) - continue + if err != nil { + return fmt.Errorf("Failed to read data for %s, %v", rel_path, err) } - to_index = append(to_index, ancestor) - - // TO DO: CHECK WHETHER TO INDEX ALT FILES FOR ANCESTOR(S) - // https://github.com/whosonfirst/go-whosonfirst-sqlite-features-index/issues/3 - } - - for _, record := range to_index { - for _, t := range tables { - err = t.IndexRecord(ctx, db, record) + err = t.IndexRecord(ctx, db, ancestor) if err != nil { - return err + return fmt.Errorf("Failed to index ancestor (%s), %v", rel_path, err) } } } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/README.md b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/README.md index dcafc30..5e292a1 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/README.md +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/README.md @@ -1,16 +1,14 @@ # go-whosonfirst-sqlite-features -Go package for working with Who's On First features and SQLite databases. +Go package for implementing the `aaronland/go-sqlite.Table` interface used to index Who's On First Feature records in one or more SQLite database tables. -## Install +This package only defines packages that implement the `aaronland/go-sqlite.Table` interface and does not do any actual database table indexing. That is handled by the `whosonfirst/go-whosonfirst-sqlite-feature-index` package. -You will need to have both `Go` (specifically version [Go 1.12](https://golang.org/dl/) or higher) and the `make` programs installed on your computer. Assuming you do just type: +## Documentation -``` -make tools -``` +[![Go Reference](https://pkg.go.dev/badge/github.com/whosonfirst/go-whosonfirst-sqlite-features.svg)](https://pkg.go.dev/github.com/whosonfirst/go-whosonfirst-sqlite-features) -All of this package's dependencies are bundled with the code in the `vendor` directory. +Documentation is incomplete at this time. ## Tables @@ -258,6 +256,9 @@ These are documented in the [Dependencies and relationships section](https://git ## See also * https://sqlite.org/ -* https://www.gaia-gis.it/fossil/libspatialite/index -* https://github.com/whosonfirst/go-whosonfirst-sqlite + +# See also + +* https://github.com/aaronland/go-sqlite +* https://github.com/whosonfirst/go-whosonfirst-sqlite-index * https://github.com/whosonfirst/go-whosonfirst-sqlite-feature-index \ No newline at end of file diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/doc.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/doc.go new file mode 100644 index 0000000..f3014f1 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/doc.go @@ -0,0 +1,2 @@ +// package features provides methods for indexing Who's On First Feature records in SQLite databases. +package features diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/features.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/features.go index 1db7cc4..cb965c2 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/features.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/features.go @@ -2,10 +2,13 @@ package features import ( "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" ) +// FeatureTable is an interface that implements the `aaronland/go-sqlite.Table` interface +// for indexing Who's On First Feature records in SQLite databases. This interface is in +// turn implemented by code in the `tables` package. type FeatureTable interface { sqlite.Table - IndexFeature(sqlite.Database, geojson.Feature) error + // IndexFeature will index a Who's On First Feature record, stored in a byte array, in a SQLite database. + IndexFeature(sqlite.Database, []byte) error } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/go.mod b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/go.mod index f09f1d5..8daf051 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/go.mod +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/go.mod @@ -4,9 +4,10 @@ go 1.16 require ( github.com/aaronland/go-sqlite v0.1.1 + github.com/paulmach/orb v0.6.0 github.com/tidwall/gjson v1.14.1 - github.com/twpayne/go-geom v1.4.1 + github.com/whosonfirst/go-whosonfirst-feature v0.0.23 github.com/whosonfirst/go-whosonfirst-flags v0.4.3 - github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4 github.com/whosonfirst/go-whosonfirst-names v0.1.0 + github.com/whosonfirst/go-whosonfirst-spr/v2 v2.2.0 ) diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/go.sum b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/go.sum index 4e5da0f..d7130d0 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/go.sum +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/go.sum @@ -1,120 +1,71 @@ -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/aaronland/go-sqlite v0.1.1 h1:bqObBiGw3K01Nq9Zt2NtFTESHSoNVd5ZaLc+FYVivhI= github.com/aaronland/go-sqlite v0.1.1/go.mod h1:EoqGJ9v4WGF9Gwln7g6b0ANsIED2sBit7p4VMtnD/yU= -github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/go-ini/ini v1.42.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mmcloughlin/geohash v0.10.0 h1:9w1HchfDfdeLc+jFEf/04D27KP7E2QmpDu52wPbJWRE= -github.com/mmcloughlin/geohash v0.10.0/go.mod h1:oNZxQo5yWJh0eMQEP/8hwQuVx9Z9tjwFUqcTB1SmG0c= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/ory/dockertest/v3 v3.6.0/go.mod h1:4ZOpj8qBUmh8fcBSVzkH2bws2s91JdGvHUqan4GHEuQ= -github.com/paulmach/go.geojson v1.4.0/go.mod h1:YaKx1hKpWF+T2oj2lFJPsW/t1Q5e1jQI61eoQSTwpIs= +github.com/paulmach/orb v0.6.0 h1:QqsQkeYM3zzr3ANUHWBoo8zvK1CATO4G9pYmKoCAgnM= +github.com/paulmach/orb v0.6.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= +github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sfomuseum/go-edtf v0.2.2/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= github.com/sfomuseum/go-edtf v0.2.3/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= -github.com/sfomuseum/go-edtf v0.3.1 h1:22DEXVvGhnpF7PD4dvpgKH0/oD8u9I+a4cXCwy1x2f4= github.com/sfomuseum/go-edtf v0.3.1/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= +github.com/sfomuseum/go-edtf v1.0.0 h1:pU76aSrBgRTaKK/RzEESYDU+YcGNbBk/XKwEMr4qXmE= +github.com/sfomuseum/go-edtf v1.0.0/go.mod h1:1rP0EJZ/84j3HO80vGcnG2T9MFBDAFyTNtjrr8cv3T4= github.com/sfomuseum/go-flags v0.7.0/go.mod h1:ML3DTNbF9xnjExSdS/9FtVLjIUhRU5gm/ehzISv+t2w= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/skelterjohn/geom v0.0.0-20180103142417-96f3e8a219c5 h1:qQF/q/+xaKD4CAVz3zfuvpij8U4ihSGIhHfOROI4NFc= -github.com/skelterjohn/geom v0.0.0-20180103142417-96f3e8a219c5/go.mod h1:w8cQIijHlvvZM7afYlixPThHAdD+AkRFw3Mb9yQ2Y+I= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/twpayne/go-geom v1.4.1 h1:LeivFqaGBRfyg0XJJ9pkudcptwhSSrYN9KZUW6HcgdA= -github.com/twpayne/go-geom v1.4.1/go.mod h1:k/zktXdL+qnA6OgKsdEGUTA17jbQ2ZPTUa3CCySuGpE= -github.com/twpayne/go-kml v1.5.2/go.mod h1:kz8jAiIz6FIdU2Zjce9qGlVtgFYES9vt7BTPBHf5jl4= -github.com/twpayne/go-polyline v1.0.0/go.mod h1:ICh24bcLYBX8CknfvNPKqoTbe+eg+MX1NPyJmSBo7pU= -github.com/twpayne/go-waypoint v0.0.0-20200706203930-b263a7f6e4e8/go.mod h1:qj5pHncxKhu9gxtZEYWypA/z097sxhFlbTyOyt9gcnU= github.com/whosonfirst/go-rfc-5646 v0.1.0 h1:HNFPAem6v5De61PXLgbGzx9tfNOP83AAkVvm9WAddJY= github.com/whosonfirst/go-rfc-5646 v0.1.0/go.mod h1:JZj//FV9YeV3fkyOY/82V53EMLQXwRwNPuQIGs8BUmo= -github.com/whosonfirst/go-whosonfirst-cli v0.1.0/go.mod h1:Edy+amD+fMq1QS1yxB3u8maA8I93q/LG7JRNh+fsdfc= -github.com/whosonfirst/go-whosonfirst-flags v0.2.0/go.mod h1:ECd0AJJZIlybmjTGB9z+CPz9pSiMTwxur7fPKmDnoqI= +github.com/whosonfirst/go-whosonfirst-feature v0.0.23 h1:/oklJJRMF5a75D7tYKueh1nQRBcejqZ2cnr0CdakYiQ= +github.com/whosonfirst/go-whosonfirst-feature v0.0.23/go.mod h1:3cvRigFFG2a99M64lZzfy5amHacWu8Os5fXZdGjPnLM= github.com/whosonfirst/go-whosonfirst-flags v0.4.3 h1:ef6IkgvYADL4kc750sl6i5hkReNq0Z6upLcqpK2CHLY= github.com/whosonfirst/go-whosonfirst-flags v0.4.3/go.mod h1:pL17Ryo60FH8RYaQRgfu5XnxhrNRK3x+rn03TYD6Gc8= -github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4 h1:5FVbXC6PvohoxFAd2fXanmERwFjz9ExJIoj4mC+AAwM= -github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4/go.mod h1:nlnmDlcm3OjkKBihOIGdzWW8fSpR+ubD3JUSXLLG5y4= -github.com/whosonfirst/go-whosonfirst-hash v0.1.0 h1:FpnclPIb+8M1uhSXfl3z8nYcG/3O59vgfkdV+m0hQpA= -github.com/whosonfirst/go-whosonfirst-hash v0.1.0/go.mod h1:1ZdCFZTnQt5bwnsj2daB9yHilKOKToVh+Tyj/Z8TbUk= github.com/whosonfirst/go-whosonfirst-names v0.1.0 h1:uXop/DwQqH60uDBZvHCPg1yRSQLScbm6VZyqcaED2KE= github.com/whosonfirst/go-whosonfirst-names v0.1.0/go.mod h1:0z86/nedM9T/5C8cAdbCMfRuBrkc33oEQ6vdJ6WybSg= -github.com/whosonfirst/go-whosonfirst-placetypes v0.2.4/go.mod h1:yl0zZ5tfK80C0kl34pJcPB3mZC5XXR7ybQJ5OJyEcDU= -github.com/whosonfirst/go-whosonfirst-placetypes v0.3.0 h1:68kuizK8FXjfEIOKlqWemhs7gyMBIgpLJDbCZF8+8Ok= github.com/whosonfirst/go-whosonfirst-placetypes v0.3.0/go.mod h1:ez0VFkGFbgT2/z2oi3PIuW6FewsZ2+5glyfDD79XEHk= +github.com/whosonfirst/go-whosonfirst-sources v0.1.0 h1:JuKLa6KWke22jBfJ1pM9WQHoz1/3pbDv2C+aR+THPPQ= github.com/whosonfirst/go-whosonfirst-sources v0.1.0/go.mod h1:EUMHyGzUmqPPxlMmOp+28BFeoBdxxE0HCKRd67lkqGM= -github.com/whosonfirst/go-whosonfirst-spr/v2 v2.0.0 h1:UQ1n/uODS50mckZpXYe5GKm8XwoUUC1jRcNN8oiW2uc= -github.com/whosonfirst/go-whosonfirst-spr/v2 v2.0.0/go.mod h1:tveSSFDn8XoiCeAMarSCn769lA6e3Y0/Qi8S19Jz7Gw= -github.com/whosonfirst/go-whosonfirst-uri v0.2.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= +github.com/whosonfirst/go-whosonfirst-spr/v2 v2.2.0 h1:mAk0Vl2BDW1pweD0a54spNGpK70GSnjPBVqJDSi/Dbk= +github.com/whosonfirst/go-whosonfirst-spr/v2 v2.2.0/go.mod h1:3P6fiSVGtIbM3UcyaVMs4i1N6Hi88GmTsdouuXzlr78= +github.com/whosonfirst/go-whosonfirst-uri v1.0.1 h1:hVEDRuW9WhqvTksDi092OO9UecX7PAMDrD47KPEqAg0= github.com/whosonfirst/go-whosonfirst-uri v1.0.1/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= -github.com/whosonfirst/go-whosonfirst-uri v1.1.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= github.com/whosonfirst/warning v0.1.1/go.mod h1:/unEMzhB9YaMeEwTJpzLN3kM5LiSxdJhKEsf/OQhn6s= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/ancestors.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/ancestors.go index d15509a..920f123 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/ancestors.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/ancestors.go @@ -4,8 +4,8 @@ import ( "context" "fmt" "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-sqlite-features" "strings" ) @@ -27,13 +27,13 @@ func NewAncestorsTableWithDatabase(ctx context.Context, db sqlite.Database) (sql t, err := NewAncestorsTable(ctx) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to create ancestors table, %w", err) } err = t.InitializeTable(ctx, db) if err != nil { - return nil, err + return nil, InitializeTableError(t, err) } return t, nil @@ -74,37 +74,39 @@ func (t *AncestorsTable) InitializeTable(ctx context.Context, db sqlite.Database } func (t *AncestorsTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *AncestorsTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { +func (t *AncestorsTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - is_alt := whosonfirst.IsAlt(f) - - if is_alt { + if alt.IsAlt(f) { return nil } + id, err := properties.Id(f) + + if err != nil { + return MissingPropertyError(t, "id", err) + } + conn, err := db.Conn() if err != nil { - return err + return DatabaseConnectionError(t, err) } tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } - id := f.Id() - sql := fmt.Sprintf(`DELETE FROM %s WHERE id = ?`, t.Name()) stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() @@ -112,13 +114,11 @@ func (t *AncestorsTable) IndexFeature(ctx context.Context, db sqlite.Database, f _, err = stmt.Exec(id) if err != nil { - return err + return ExecuteStatementError(t, err) } - str_id := f.Id() - - hierarchies := whosonfirst.Hierarchies(f) - lastmod := whosonfirst.LastModified(f) + hierarchies := properties.Hierarchies(f) + lastmod := properties.LastModified(f) for _, h := range hierarchies { @@ -135,20 +135,26 @@ func (t *AncestorsTable) IndexFeature(ctx context.Context, db sqlite.Database, f stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() - _, err = stmt.Exec(str_id, ancestor_id, ancestor_placetype, lastmod) + _, err = stmt.Exec(id, ancestor_id, ancestor_placetype, lastmod) if err != nil { - return err + return ExecuteStatementError(t, err) } } } - return tx.Commit() + err = tx.Commit() + + if err != nil { + return CommitTransactionError(t, err) + } + + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/concordances.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/concordances.go index 845e85c..3fa08e2 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/concordances.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/concordances.go @@ -4,8 +4,8 @@ import ( "context" "fmt" "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-sqlite-features" ) @@ -32,7 +32,7 @@ func NewConcordancesTableWithDatabase(ctx context.Context, db sqlite.Database) ( err = t.InitializeTable(ctx, db) if err != nil { - return nil, err + return nil, InitializeTableError(t, err) } return t, nil @@ -74,37 +74,39 @@ func (t *ConcordancesTable) InitializeTable(ctx context.Context, db sqlite.Datab } func (t *ConcordancesTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *ConcordancesTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { - - is_alt := whosonfirst.IsAlt(f) +func (t *ConcordancesTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - if is_alt { + if alt.IsAlt(f) { return nil } + id, err := properties.Id(f) + + if err != nil { + return MissingPropertyError(t, "id", err) + } + conn, err := db.Conn() if err != nil { - return err + return DatabaseConnectionError(t, err) } tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } - id := f.Id() - sql := fmt.Sprintf(`DELETE FROM %s WHERE id = ?`, t.Name()) stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() @@ -112,18 +114,11 @@ func (t *ConcordancesTable) IndexFeature(ctx context.Context, db sqlite.Database _, err = stmt.Exec(id) if err != nil { - return err - } - - str_id := f.Id() - - concordances, err := whosonfirst.Concordances(f) - - if err != nil { - return err + return ExecuteStatementError(t, err) } - lastmod := whosonfirst.LastModified(f) + concordances := properties.Concordances(f) + lastmod := properties.LastModified(f) for other_source, other_id := range concordances { @@ -136,17 +131,23 @@ func (t *ConcordancesTable) IndexFeature(ctx context.Context, db sqlite.Database stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() - _, err = stmt.Exec(str_id, other_id, other_source, lastmod) + _, err = stmt.Exec(id, other_id, other_source, lastmod) if err != nil { - return err + return ExecuteStatementError(t, err) } } - return tx.Commit() + err = tx.Commit() + + if err != nil { + return CommitTransactionError(t, err) + } + + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/error.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/error.go new file mode 100644 index 0000000..22f8f0b --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/error.go @@ -0,0 +1,48 @@ +package tables + +import ( + "fmt" + "github.com/aaronland/go-sqlite" +) + +// TBD: move these in to aaronland/go-sqlite ? + +// WrapError returns a new error wrapping 'err' and prepending with the value of 't's Name() method. +func WrapError(t sqlite.Table, err error) error { + return fmt.Errorf("[%s] %w", t.Name(), err) +} + +// InitializeTableError returns a new error with a default message for database initialization problems wrapping 'err' and prepending with the value of 't's Name() method. +func InitializeTableError(t sqlite.Table, err error) error { + return WrapError(t, fmt.Errorf("Failed to initialize database table, %w", err)) +} + +// MissingPropertyError returns a new error with a default message for problems deriving a given property ('prop') from a record, wrapping 'err' and prepending with the value of 't's Name() method. +func MissingPropertyError(t sqlite.Table, prop string, err error) error { + return WrapError(t, fmt.Errorf("Failed to determine value for '%s' property, %w", prop, err)) +} + +// DatabaseConnectionError returns a new error with a default message for database connection problems wrapping 'err' and prepending with the value of 't's Name() method. +func DatabaseConnectionError(t sqlite.Table, err error) error { + return WrapError(t, fmt.Errorf("Failed to establish database connection, %w", err)) +} + +// BeginTransactionError returns a new error with a default message for database transaction initialization problems wrapping 'err' and prepending with the value of 't's Name() method. +func BeginTransactionError(t sqlite.Table, err error) error { + return WrapError(t, fmt.Errorf("Failed to begin database transaction, %w", err)) +} + +// CommitTransactionError returns a new error with a default message for problems committing database transactions wrapping 'err' and prepending with the value of 't's Name() method. +func CommitTransactionError(t sqlite.Table, err error) error { + return WrapError(t, fmt.Errorf("Failed to commit database transaction, %w", err)) +} + +// PrepareStatementError returns a new error with a default message for problems preparing database (SQL) statements wrapping 'err' and prepending with the value of 't's Name() method. +func PrepareStatementError(t sqlite.Table, err error) error { + return WrapError(t, fmt.Errorf("Failed to prepare SQL statement, %w", err)) +} + +// ExecuteStatementError returns a new error with a default message for problems executing database (SQL) statements wrapping 'err' and prepending with the value of 't's Name() method. +func ExecuteStatementError(t sqlite.Table, err error) error { + return WrapError(t, fmt.Errorf("Failed to execute SQL statement, %w", err)) +} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geojson.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geojson.go index 984dcea..b712514 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geojson.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geojson.go @@ -4,19 +4,21 @@ import ( "context" "fmt" "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-sqlite-features" ) type GeoJSONTableOptions struct { - IndexAltFiles bool + IndexAltFiles bool + AllowMissingSourceGeom bool } func DefaultGeoJSONTableOptions() (*GeoJSONTableOptions, error) { opts := GeoJSONTableOptions{ - IndexAltFiles: false, + IndexAltFiles: false, + AllowMissingSourceGeom: true, } return &opts, nil @@ -112,34 +114,52 @@ func (t *GeoJSONTable) InitializeTable(ctx context.Context, db sqlite.Database) } func (t *GeoJSONTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *GeoJSONTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { +func (t *GeoJSONTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - conn, err := db.Conn() + is_alt := alt.IsAlt(f) + + if is_alt && !t.options.IndexAltFiles { + return nil + } + + id, err := properties.Id(f) if err != nil { - return err + return MissingPropertyError(t, "id", err) } - str_id := f.Id() - body := f.Bytes() + source, err := properties.Source(f) - source := whosonfirst.Source(f) - is_alt := whosonfirst.IsAlt(f) - alt_label := whosonfirst.AltLabel(f) + if err != nil { - if is_alt && !t.options.IndexAltFiles { - return nil + if !t.options.AllowMissingSourceGeom { + return MissingPropertyError(t, "source", err) + } + + source = "unknown" } - lastmod := whosonfirst.LastModified(f) + alt_label, err := properties.AltLabel(f) + + if err != nil { + return MissingPropertyError(t, "alt label", err) + } + + lastmod := properties.LastModified(f) + + conn, err := db.Conn() + + if err != nil { + return DatabaseConnectionError(t, err) + } tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } sql := fmt.Sprintf(`INSERT OR REPLACE INTO %s ( @@ -151,18 +171,24 @@ func (t *GeoJSONTable) IndexFeature(ctx context.Context, db sqlite.Database, f g stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() - str_body := string(body) + str_body := string(f) + + _, err = stmt.Exec(id, str_body, source, is_alt, alt_label, lastmod) + + if err != nil { + return ExecuteStatementError(t, err) + } - _, err = stmt.Exec(str_id, str_body, source, is_alt, alt_label, lastmod) + err = tx.Commit() if err != nil { - return err + return CommitTransactionError(t, err) } - return tx.Commit() + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geometries.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geometries.go index 94cea84..49fa088 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geometries.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geometries.go @@ -4,12 +4,10 @@ import ( "context" "fmt" "github.com/aaronland/go-sqlite" - "github.com/twpayne/go-geom" - gogeom_geojson "github.com/twpayne/go-geom/encoding/geojson" - "github.com/twpayne/go-geom/encoding/wkt" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/geometry" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/paulmach/orb/encoding/wkt" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/geometry" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-sqlite-features" _ "log" ) @@ -128,56 +126,52 @@ func (t *GeometriesTable) InitializeTable(ctx context.Context, db sqlite.Databas } func (t *GeometriesTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *GeometriesTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { +func (t *GeometriesTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - conn, err := db.Conn() + is_alt := alt.IsAlt(f) + + if is_alt && !t.options.IndexAltFiles { + return nil + } + + id, err := properties.Id(f) if err != nil { - return err + return MissingPropertyError(t, "id", err) } - str_id := f.Id() - is_alt := whosonfirst.IsAlt(f) - alt_label := whosonfirst.AltLabel(f) + alt_label, err := properties.AltLabel(f) - if is_alt && !t.options.IndexAltFiles { - return nil + if err != nil { + return MissingPropertyError(t, "alt label", err) } - lastmod := whosonfirst.LastModified(f) + lastmod := properties.LastModified(f) - tx, err := conn.Begin() + conn, err := db.Conn() if err != nil { - return err + return DatabaseConnectionError(t, err) } - str_geom, err := geometry.ToString(f) + tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } - // but wait! there's more!! for reasons I've forgotten (simonw told me) - // the spatialite doesn't really like indexing GeomFromGeoJSON but also - // doesn't complain about it - it just chugs along happily filling your - // database with null geometries so we're going to take advantage of the - // handy "go-geom" package to convert the GeoJSON geometry in to WKT - - // it is "one more thing" to import and maybe it would be better to just - // write a custom converter but not today... - // (20180122/thisisaaronland) - - var g geom.T - err = gogeom_geojson.Unmarshal([]byte(str_geom), &g) + geojson_geom, err := geometry.Geometry(f) if err != nil { - return err + return MissingPropertyError(t, "geometry", err) } - str_wkt, err := wkt.Marshal(g) + orb_geom := geojson_geom.Geometry() + + str_wkt := wkt.MarshalString(orb_geom) sql := fmt.Sprintf(`INSERT OR REPLACE INTO %s ( id, is_alt, alt_label, type, geom, lastmodified @@ -188,18 +182,24 @@ func (t *GeometriesTable) IndexFeature(ctx context.Context, db sqlite.Database, stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() geom_type := "common" - _, err = stmt.Exec(str_id, is_alt, alt_label, geom_type, lastmod) + _, err = stmt.Exec(id, is_alt, alt_label, geom_type, lastmod) + + if err != nil { + return ExecuteStatementError(t, err) + } + + err = tx.Commit() if err != nil { - return err + return CommitTransactionError(t, err) } - return tx.Commit() + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geometry.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geometry.go deleted file mode 100644 index 4964564..0000000 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/geometry.go +++ /dev/null @@ -1,167 +0,0 @@ -package tables - -import ( - "context" - "fmt" - "github.com/aaronland/go-sqlite" - "github.com/tidwall/gjson" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" - "github.com/whosonfirst/go-whosonfirst-sqlite-features" -) - -type GeometryTableOptions struct { - IndexAltFiles bool -} - -func DefaultGeometryTableOptions() (*GeometryTableOptions, error) { - - opts := GeometryTableOptions{ - IndexAltFiles: false, - } - - return &opts, nil -} - -type GeometryTable struct { - features.FeatureTable - name string - options *GeometryTableOptions -} - -type GeometryRow struct { - Id int64 - Body string - LastModified int64 -} - -func NewGeometryTableWithDatabase(ctx context.Context, db sqlite.Database) (sqlite.Table, error) { - - opts, err := DefaultGeometryTableOptions() - - if err != nil { - return nil, err - } - - return NewGeometryTableWithDatabaseAndOptions(ctx, db, opts) -} - -func NewGeometryTableWithDatabaseAndOptions(ctx context.Context, db sqlite.Database, opts *GeometryTableOptions) (sqlite.Table, error) { - - t, err := NewGeometryTableWithOptions(ctx, opts) - - if err != nil { - return nil, err - } - - err = t.InitializeTable(ctx, db) - - if err != nil { - return nil, err - } - - return t, nil -} - -func NewGeometryTable(ctx context.Context) (sqlite.Table, error) { - - opts, err := DefaultGeometryTableOptions() - - if err != nil { - return nil, err - } - - return NewGeometryTableWithOptions(ctx, opts) -} - -func NewGeometryTableWithOptions(ctx context.Context, opts *GeometryTableOptions) (sqlite.Table, error) { - - t := GeometryTable{ - name: "geometry", - options: opts, - } - - return &t, nil -} - -func (t *GeometryTable) Name() string { - return t.name -} - -func (t *GeometryTable) Schema() string { - - sql := `CREATE TABLE %s ( - id INTEGER NOT NULL, - body TEXT, - is_alt BOOLEAN, - alt_label TEXT, - lastmodified INTEGER - ); - - CREATE UNIQUE INDEX geometry_by_id ON %s (id, alt_label); - CREATE INDEX geometry_by_alt ON %s (id, is_alt, alt_label); - CREATE INDEX geometry_by_lastmod ON %s (lastmodified); - ` - - return fmt.Sprintf(sql, t.Name(), t.Name(), t.Name(), t.Name()) -} - -func (t *GeometryTable) InitializeTable(ctx context.Context, db sqlite.Database) error { - - return sqlite.CreateTableIfNecessary(ctx, db, t) -} - -func (t *GeometryTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) -} - -func (t *GeometryTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { - - conn, err := db.Conn() - - if err != nil { - return err - } - - str_id := f.Id() - - is_alt := whosonfirst.IsAlt(f) - alt_label := whosonfirst.AltLabel(f) - - if is_alt && !t.options.IndexAltFiles { - return nil - } - - lastmod := whosonfirst.LastModified(f) - - tx, err := conn.Begin() - - if err != nil { - return err - } - - sql := fmt.Sprintf(`INSERT OR REPLACE INTO %s ( - id, body, is_alt, alt_label, lastmodified - ) VALUES ( - ?, ?, ?, ?, ? - )`, t.Name()) - - stmt, err := tx.Prepare(sql) - - if err != nil { - return err - } - - defer stmt.Close() - - rsp_geom := gjson.GetBytes(f.Bytes(), "geometry") - str_geom := rsp_geom.String() - - _, err = stmt.Exec(str_id, str_geom, is_alt, alt_label, lastmod) - - if err != nil { - return err - } - - return tx.Commit() -} diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/names.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/names.go index 84ff389..5554c7e 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/names.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/names.go @@ -4,8 +4,8 @@ import ( "context" "fmt" "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-names/tags" "github.com/whosonfirst/go-whosonfirst-sqlite-features" ) @@ -41,7 +41,7 @@ func NewNamesTableWithDatabase(ctx context.Context, db sqlite.Database) (sqlite. err = t.InitializeTable(ctx, db) if err != nil { - return nil, err + return nil, InitializeTableError(t, err) } return t, nil @@ -96,37 +96,50 @@ func (t *NamesTable) InitializeTable(ctx context.Context, db sqlite.Database) er } func (t *NamesTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *NamesTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { - - is_alt := whosonfirst.IsAlt(f) +func (t *NamesTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - if is_alt { + if alt.IsAlt(f) { return nil } + id, err := properties.Id(f) + + if err != nil { + return MissingPropertyError(t, "id", err) + } + + pt, err := properties.Placetype(f) + + if err != nil { + return MissingPropertyError(t, "placetype", err) + } + + co := properties.Country(f) + + lastmod := properties.LastModified(f) + names := properties.Names(f) + conn, err := db.Conn() if err != nil { - return err + return DatabaseConnectionError(t, err) } tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } - id := f.Id() - sql := fmt.Sprintf(`DELETE FROM %s WHERE id = ?`, t.Name()) stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() @@ -134,29 +147,19 @@ func (t *NamesTable) IndexFeature(ctx context.Context, db sqlite.Database, f geo _, err = stmt.Exec(id) if err != nil { - return err + return ExecuteStatementError(t, err) } - pt := f.Placetype() - co := whosonfirst.Country(f) - - lastmod := whosonfirst.LastModified(f) - names := whosonfirst.Names(f) - for tag, names := range names { lt, err := tags.NewLangTag(tag) if err != nil { - return err + return WrapError(t, fmt.Errorf("Failed to create new language tag for '%s', %w", tag, err)) } for _, n := range names { - if err != nil { - return err - } - sql := fmt.Sprintf(`INSERT INTO %s ( id, placetype, country, language, extlang, @@ -176,7 +179,7 @@ func (t *NamesTable) IndexFeature(ctx context.Context, db sqlite.Database, f geo stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() @@ -184,11 +187,17 @@ func (t *NamesTable) IndexFeature(ctx context.Context, db sqlite.Database, f geo _, err = stmt.Exec(id, pt, co, lt.Language(), lt.ExtLang(), lt.Script(), lt.Region(), lt.Variant(), lt.Extension(), lt.PrivateUse(), n, lastmod) if err != nil { - return err + return ExecuteStatementError(t, err) } } } - return tx.Commit() + err = tx.Commit() + + if err != nil { + return CommitTransactionError(t, err) + } + + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/properties.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/properties.go index 9d83bdc..6b9b50b 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/properties.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/properties.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/aaronland/go-sqlite" "github.com/tidwall/gjson" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-sqlite-features" ) @@ -57,7 +57,7 @@ func NewPropertiesTableWithDatabaseAndOptions(ctx context.Context, db sqlite.Dat err = t.InitializeTable(ctx, db) if err != nil { - return nil, err + return nil, InitializeTableError(t, err) } return t, nil @@ -112,32 +112,41 @@ func (t *PropertiesTable) InitializeTable(ctx context.Context, db sqlite.Databas } func (t *PropertiesTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *PropertiesTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { +func (t *PropertiesTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - conn, err := db.Conn() + is_alt := alt.IsAlt(f) - if err != nil { - return err + if is_alt && !t.options.IndexAltFiles { + return nil } - str_id := f.Id() + id, err := properties.Id(f) - is_alt := whosonfirst.IsAlt(f) - alt_label := whosonfirst.AltLabel(f) + if err != nil { + return MissingPropertyError(t, "id", err) + } - if is_alt && !t.options.IndexAltFiles { - return nil + alt_label, err := properties.AltLabel(f) + + if err != nil { + return MissingPropertyError(t, "alt label", err) } - lastmod := whosonfirst.LastModified(f) + lastmod := properties.LastModified(f) + + conn, err := db.Conn() + + if err != nil { + return DatabaseConnectionError(t, err) + } tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } sql := fmt.Sprintf(`INSERT OR REPLACE INTO %s ( @@ -149,19 +158,25 @@ func (t *PropertiesTable) IndexFeature(ctx context.Context, db sqlite.Database, stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() - rsp_props := gjson.GetBytes(f.Bytes(), "properties") + rsp_props := gjson.GetBytes(f, "properties") str_props := rsp_props.String() - _, err = stmt.Exec(str_id, str_props, is_alt, alt_label, lastmod) + _, err = stmt.Exec(id, str_props, is_alt, alt_label, lastmod) + + if err != nil { + return ExecuteStatementError(t, err) + } + + err = tx.Commit() if err != nil { - return err + return CommitTransactionError(t, err) } - return tx.Commit() + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/rtree.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/rtree.go index d107999..8a986a9 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/rtree.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/rtree.go @@ -4,13 +4,13 @@ package tables import ( "context" - "encoding/json" - "errors" "fmt" "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/geometry" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/paulmach/orb" + "github.com/paulmach/orb/encoding/wkt" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/geometry" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-sqlite-features" _ "log" ) @@ -128,48 +128,63 @@ func (t *RTreeTable) InitializeTable(ctx context.Context, db sqlite.Database) er } func (t *RTreeTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *RTreeTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { +func (t *RTreeTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - switch geometry.Type(f) { - case "Polygon", "MultiPolygon": - // pass - default: + is_alt := alt.IsAlt(f) // this returns a boolean which is interpreted as a float by SQLite + + if is_alt && !t.options.IndexAltFiles { return nil } - conn, err := db.Conn() + geom_type, err := geometry.Type(f) if err != nil { - return err + return MissingPropertyError(t, "geometry type", err) } - wof_id := f.Id() - is_alt := whosonfirst.IsAlt(f) // this returns a boolean which is interpreted as a float by SQLite - - if is_alt && !t.options.IndexAltFiles { + switch geom_type { + case "Polygon", "MultiPolygon": + // pass + default: return nil } + wof_id, err := properties.Id(f) + + if err != nil { + return MissingPropertyError(t, "id", err) + } + alt_label := "" if is_alt { - alt_label = whosonfirst.AltLabel(f) + label, err := properties.AltLabel(f) - if alt_label == "" { - return errors.New("Missing src:alt_label property") + if err != nil { + return MissingPropertyError(t, "alt label", err) } + + alt_label = label } - lastmod := whosonfirst.LastModified(f) + lastmod := properties.LastModified(f) - polygons, err := f.Polygons() + geojson_geom, err := geometry.Geometry(f) if err != nil { - return err + return MissingPropertyError(t, "geometry", err) + } + + orb_geom := geojson_geom.Geometry() + + conn, err := db.Conn() + + if err != nil { + return DatabaseConnectionError(t, err) } tx, err := conn.Begin() @@ -187,58 +202,48 @@ func (t *RTreeTable) IndexFeature(ctx context.Context, db sqlite.Database, f geo stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() - // this should be updated to use go-whosonfirst-geojson-v2/geometry GeometryForFeature - // so that we're not translating between [][][]float64 and skleterjohn/geom things - // twice (20201214/thisisaaronland) - - for _, poly := range polygons { - - exterior_ring := poly.ExteriorRing() - bbox := exterior_ring.Bounds() - - sw := bbox.Min - ne := bbox.Max - - points := make([][][]float64, 0) - - exterior_points := make([][]float64, 0) + var mp orb.MultiPolygon - for _, c := range exterior_ring.Vertices() { - pt := []float64{c.X, c.Y} - exterior_points = append(exterior_points, pt) - } + switch geom_type { + case "MultiPolygon": + mp = orb_geom.(orb.MultiPolygon) + case "Polygon": + mp = []orb.Polygon{orb_geom.(orb.Polygon)} + default: + // This should never happen (we check above) but just in case... + return WrapError(t, fmt.Errorf("Invalid or unsupported geometry type, %s", geom_type)) + } - points = append(points, exterior_points) + for _, poly := range mp { - for _, interior_ring := range poly.InteriorRings() { + // Store the geometry for each bounding box so we can use it to do + // raycasting and filter points in any interior rings. For example in + // whosonfirst/go-whosonfirst-spatial-sqlite - interior_points := make([][]float64, 0) + bbox := poly.Bound() - for _, c := range interior_ring.Vertices() { - pt := []float64{c.X, c.Y} - interior_points = append(interior_points, pt) - } + sw := bbox.Min + ne := bbox.Max - points = append(points, interior_points) - } + enc_geom := wkt.MarshalString(poly) - points_enc, err := json.Marshal(points) + _, err = stmt.Exec(sw.X(), ne.X(), sw.Y(), ne.Y(), wof_id, is_alt, alt_label, enc_geom, lastmod) if err != nil { - return err + return ExecuteStatementError(t, err) } + } - _, err = stmt.Exec(sw.X, ne.X, sw.Y, ne.Y, wof_id, is_alt, alt_label, string(points_enc), lastmod) + err = tx.Commit() - if err != nil { - return err - } + if err != nil { + return CommitTransactionError(t, err) } - return tx.Commit() + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/search.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/search.go index 7c46c27..aa80113 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/search.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/search.go @@ -4,8 +4,8 @@ import ( "context" "fmt" "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-names/tags" "github.com/whosonfirst/go-whosonfirst-sqlite-features" _ "log" @@ -65,39 +65,49 @@ func (t *SearchTable) Schema() string { } func (t *SearchTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *SearchTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { +func (t *SearchTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - is_alt := whosonfirst.IsAlt(f) - - if is_alt { + if alt.IsAlt(f) { return nil } - is_current, err := whosonfirst.IsCurrent(f) + id, err := properties.Id(f) + + if err != nil { + return MissingPropertyError(t, "id", err) + } + + placetype, err := properties.Placetype(f) + + if err != nil { + return MissingPropertyError(t, "placetype", err) + } + + is_current, err := properties.IsCurrent(f) if err != nil { - return err + return MissingPropertyError(t, "is current", err) } - is_ceased, err := whosonfirst.IsCeased(f) + is_ceased, err := properties.IsCeased(f) if err != nil { - return err + return MissingPropertyError(t, "is ceased", err) } - is_deprecated, err := whosonfirst.IsDeprecated(f) + is_deprecated, err := properties.IsDeprecated(f) if err != nil { - return err + return MissingPropertyError(t, "is deprecated", err) } - is_superseded, err := whosonfirst.IsSuperseded(f) + is_superseded, err := properties.IsSuperseded(f) if err != nil { - return err + return MissingPropertyError(t, "is superseded", err) } names_all := make([]string, 0) @@ -105,17 +115,21 @@ func (t *SearchTable) IndexFeature(ctx context.Context, db sqlite.Database, f ge names_variant := make([]string, 0) names_colloquial := make([]string, 0) - name := f.Name() + name, err := properties.Name(f) + + if err != nil { + return MissingPropertyError(t, "name", err) + } names_all = append(names_all, name) names_preferred = append(names_preferred, name) - for tag, names := range whosonfirst.Names(f) { + for tag, names := range properties.Names(f) { lt, err := tags.NewLangTag(tag) if err != nil { - return err + return WrapError(t, fmt.Errorf("Failed to create new lang tag for '%s', %w", tag, err)) } possible := make([]string, 0) @@ -167,41 +181,41 @@ func (t *SearchTable) IndexFeature(ctx context.Context, db sqlite.Database, f ge )`, t.Name()) // ON CONFLICT DO BLAH BLAH BLAH args := []interface{}{ - f.Id(), f.Placetype(), - f.Name(), strings.Join(names_all, " "), strings.Join(names_preferred, " "), strings.Join(names_variant, " "), strings.Join(names_colloquial, " "), + id, placetype, + name, strings.Join(names_all, " "), strings.Join(names_preferred, " "), strings.Join(names_variant, " "), strings.Join(names_colloquial, " "), is_current.Flag(), is_ceased.Flag(), is_deprecated.Flag(), is_superseded.Flag(), } conn, err := db.Conn() if err != nil { - return err + return DatabaseConnectionError(t, err) } tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } s, err := tx.Prepare(fmt.Sprintf("DELETE FROM %s WHERE id = ?", t.Name())) if err != nil { - return err + return PrepareStatementError(t, err) } defer s.Close() - _, err = s.Exec(f.Id()) + _, err = s.Exec(id) if err != nil { - return err + return ExecuteStatementError(t, err) } stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() @@ -209,8 +223,14 @@ func (t *SearchTable) IndexFeature(ctx context.Context, db sqlite.Database, f ge _, err = stmt.Exec(args...) if err != nil { - return err + return ExecuteStatementError(t, err) + } + + err = tx.Commit() + + if err != nil { + return CommitTransactionError(t, err) } - return tx.Commit() + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/spr.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/spr.go index 70a6b16..32d5121 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/spr.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/spr.go @@ -2,11 +2,11 @@ package tables import ( "context" - "errors" "fmt" "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/properties" + "github.com/whosonfirst/go-whosonfirst-spr/v2" "github.com/whosonfirst/go-whosonfirst-sqlite-features" _ "log" "strconv" @@ -141,29 +141,48 @@ func (t *SPRTable) Schema() string { } func (t *SPRTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *SPRTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { +func (t *SPRTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - is_alt := whosonfirst.IsAlt(f) - alt_label := whosonfirst.AltLabel(f) + is_alt := alt.IsAlt(f) if is_alt { if !t.options.IndexAltFiles { return nil } - - if alt_label == "" { - return errors.New("Missing wof:alt_label property") - } } - spr, err := f.SPR() + alt_label, err := properties.AltLabel(f) if err != nil { - return err + return MissingPropertyError(t, "alt label", err) + } + + var s spr.StandardPlacesResult + + if is_alt { + + _s, err := spr.WhosOnFirstAltSPR(f) + + if err != nil { + return WrapError(t, fmt.Errorf("Failed to generate SPR for alt geom, %w", err)) + } + + s = _s + + } else { + + _s, err := spr.WhosOnFirstSPR(f) + + if err != nil { + return WrapError(t, fmt.Errorf("Failed to SPR, %w", err)) + } + + s = _s + } sql := fmt.Sprintf(`INSERT OR REPLACE INTO %s ( @@ -192,15 +211,15 @@ func (t *SPRTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojs ? )`, t.Name()) // ON CONFLICT DO BLAH BLAH BLAH - superseded_by := int64ToString(spr.SupersededBy()) - supersedes := int64ToString(spr.Supersedes()) - belongs_to := int64ToString(spr.BelongsTo()) + superseded_by := int64ToString(s.SupersededBy()) + supersedes := int64ToString(s.Supersedes()) + belongs_to := int64ToString(s.BelongsTo()) str_inception := "" str_cessation := "" - inception := spr.Inception() - cessation := spr.Cessation() + inception := s.Inception() + cessation := s.Cessation() if inception != nil { str_inception = inception.String() @@ -211,35 +230,35 @@ func (t *SPRTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojs } args := []interface{}{ - spr.Id(), spr.ParentId(), spr.Name(), spr.Placetype(), + s.Id(), s.ParentId(), s.Name(), s.Placetype(), str_inception, str_cessation, - spr.Country(), spr.Repo(), - spr.Latitude(), spr.Longitude(), - spr.MinLatitude(), spr.MinLongitude(), - spr.MaxLatitude(), spr.MaxLongitude(), - spr.IsCurrent().Flag(), spr.IsDeprecated().Flag(), spr.IsCeased().Flag(), - spr.IsSuperseded().Flag(), spr.IsSuperseding().Flag(), + s.Country(), s.Repo(), + s.Latitude(), s.Longitude(), + s.MinLatitude(), s.MinLongitude(), + s.MaxLatitude(), s.MaxLongitude(), + s.IsCurrent().Flag(), s.IsDeprecated().Flag(), s.IsCeased().Flag(), + s.IsSuperseded().Flag(), s.IsSuperseding().Flag(), superseded_by, supersedes, belongs_to, is_alt, alt_label, - spr.LastModified(), + s.LastModified(), } conn, err := db.Conn() if err != nil { - return err + return DatabaseConnectionError(t, err) } tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() @@ -247,10 +266,16 @@ func (t *SPRTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojs _, err = stmt.Exec(args...) if err != nil { - return err + return ExecuteStatementError(t, err) + } + + err = tx.Commit() + + if err != nil { + return CommitTransactionError(t, err) } - return tx.Commit() + return nil } func int64ToString(ints []int64) string { diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/supersedes.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/supersedes.go index 23e3c88..1efd0d8 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/supersedes.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/supersedes.go @@ -4,8 +4,8 @@ import ( "context" "fmt" "github.com/aaronland/go-sqlite" - "github.com/whosonfirst/go-whosonfirst-geojson-v2" - "github.com/whosonfirst/go-whosonfirst-geojson-v2/properties/whosonfirst" + "github.com/whosonfirst/go-whosonfirst-feature/alt" + "github.com/whosonfirst/go-whosonfirst-feature/properties" "github.com/whosonfirst/go-whosonfirst-sqlite-features" ) @@ -65,32 +65,35 @@ func (t *SupersedesTable) InitializeTable(ctx context.Context, db sqlite.Databas } func (t *SupersedesTable) IndexRecord(ctx context.Context, db sqlite.Database, i interface{}) error { - return t.IndexFeature(ctx, db, i.(geojson.Feature)) + return t.IndexFeature(ctx, db, i.([]byte)) } -func (t *SupersedesTable) IndexFeature(ctx context.Context, db sqlite.Database, f geojson.Feature) error { +func (t *SupersedesTable) IndexFeature(ctx context.Context, db sqlite.Database, f []byte) error { - is_alt := whosonfirst.IsAlt(f) - - if is_alt { + if alt.IsAlt(f) { return nil } + id, err := properties.Id(f) + + if err != nil { + return MissingPropertyError(t, "id", err) + } + + lastmod := properties.LastModified(f) + conn, err := db.Conn() if err != nil { - return err + return DatabaseConnectionError(t, err) } tx, err := conn.Begin() if err != nil { - return err + return BeginTransactionError(t, err) } - id := whosonfirst.Id(f) - lastmod := whosonfirst.LastModified(f) - sql := fmt.Sprintf(`INSERT OR REPLACE INTO %s ( id, superseded_id, superseded_by_id, lastmodified ) VALUES ( @@ -100,34 +103,40 @@ func (t *SupersedesTable) IndexFeature(ctx context.Context, db sqlite.Database, stmt, err := tx.Prepare(sql) if err != nil { - return err + return PrepareStatementError(t, err) } defer stmt.Close() - superseded_by := whosonfirst.SupersededBy(f) + superseded_by := properties.SupersededBy(f) for _, other_id := range superseded_by { _, err = stmt.Exec(id, id, other_id, lastmod) if err != nil { - return err + return ExecuteStatementError(t, err) } } - supersedes := whosonfirst.Supersedes(f) + supersedes := properties.Supersedes(f) for _, other_id := range supersedes { _, err = stmt.Exec(id, other_id, id, lastmod) if err != nil { - return err + return ExecuteStatementError(t, err) } } - return tx.Commit() + err = tx.Commit() + + if err != nil { + return CommitTransactionError(t, err) + } + + return nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/tables.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/tables.go index ad798f8..436157a 100644 --- a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/tables.go +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-features/tables/tables.go @@ -1,3 +1,5 @@ +// package tables implements the `FeatureTable interface` interface for indexing +// Who's On First Feature records in SQLite database tables. package tables import ( @@ -223,21 +225,5 @@ func RTreeTablesWithDatabaseAndOptions(ctx context.Context, db sqlite.Database, to_index = append(to_index, props) - geom_opts, err := DefaultGeometryTableOptions() - - if err != nil { - return nil, err - } - - geom_opts.IndexAltFiles = opts.IndexAltFiles - - geom, err := NewGeometryTableWithDatabaseAndOptions(ctx, db, geom_opts) - - if err != nil { - return nil, err - } - - to_index = append(to_index, geom) - return to_index, nil } diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/.gitignore b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/.gitignore new file mode 100644 index 0000000..d103902 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/.gitignore @@ -0,0 +1,3 @@ +*~ +bin +*.db \ No newline at end of file diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/LICENSE b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/LICENSE new file mode 100644 index 0000000..d057e1b --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2019, Aaron Straup Cope +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the {organization} nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/Makefile b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/Makefile new file mode 100644 index 0000000..ace62f3 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/Makefile @@ -0,0 +1,2 @@ +cli: + go build -mod vendor -o bin/example cmd/example/main.go diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/README.md b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/README.md new file mode 100644 index 0000000..d46532d --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/README.md @@ -0,0 +1,54 @@ +# go-whosonfirst-sqlite-index + +Go package for indexing SQLite databases using table constucts defined in the `aaronland/go-sqlite` package and records defined by the `whosonfirst/go-whosonfirst-iterate/v2` + +## Documentation + +[![Go Reference](https://pkg.go.dev/badge/github.com/whosonfirst/go-whosonfirst-sqlite-index.svg)](https://pkg.go.dev/github.com/whosonfirst/go-whosonfirst-sqlite-index) + +## Tools + +``` +$> make cli +go build -mod vendor -o bin/example cmd/example/main.go +``` + +### example + +``` +> ./bin/example -h +Usage of ./bin/example: + -driver string + (default "sqlite3") + -dsn string + (default ":memory:") + -emitter-uri string + A valid whosonfirst/go-whosonfirst-iterate/emitter URI. Valid schemes are: directory://,featurecollection://,file://,filelist://,geojsonl://,repo://. (default "repo://") + -live-hard-die-fast + Enable various performance-related pragmas at the expense of possible (unlikely) database corruption (default true) + -post-index + Enable post indexing callback function + -timings + Display timings during and after indexing +``` + +For example: + +``` +$> ./bin/example -dsn test.db /usr/local/data/sfomuseum-data-architecture/ +2021/02/18 11:34:58 time to index paths (1) 403.514656ms + +$> sqlite3 test.db +SQLite version 3.28.0 2019-04-15 14:49:49 +Enter ".help" for usage hints. +sqlite> .tables +example + +sqlite> SELECT COUNT(id) FROM example; +12751 +``` + +## See also + +* https://github.com/aaronland/go-sqlite +* https://github.com/whosonfirst/go-whosonfirst-iterate diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/doc.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/doc.go new file mode 100644 index 0000000..48554d1 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/doc.go @@ -0,0 +1,4 @@ +// package index provides methods for indexing SQLite databases using table constucts defined +// in the `aaronland/go-sqlite` package and records defined by the `whosonfirst/go-whosonfirst-iterate/v2` +// package. +package index diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/go.mod b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/go.mod new file mode 100644 index 0000000..4d4262b --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/go.mod @@ -0,0 +1,9 @@ +module github.com/whosonfirst/go-whosonfirst-sqlite-index/v3 + +go 1.16 + +require ( + github.com/aaronland/go-sqlite v0.1.1 + github.com/whosonfirst/go-whosonfirst-iterate/v2 v2.0.2 + github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1 +) diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/go.sum b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/go.sum new file mode 100644 index 0000000..0a21ef3 --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/go.sum @@ -0,0 +1,26 @@ +github.com/aaronland/go-json-query v0.1.2 h1:+yJBCJk9kcRAzbErhh+zOqK3DHSs/GmuSqXcCn5yH/c= +github.com/aaronland/go-json-query v0.1.2/go.mod h1:kkCl5KrO+fVSL2M8b/i3qO5PsnCpmajGXkbJHpEQPY8= +github.com/aaronland/go-roster v0.0.2 h1:2Fu7v4VQLRLRL/Zgr6R9S5JxsW75Ab/K88QtMVX532s= +github.com/aaronland/go-roster v0.0.2/go.mod h1:AcovpxlG1XxJxX2Fjqlm63fEIBhCjEIBV4lP87FZDmI= +github.com/aaronland/go-sqlite v0.1.1 h1:bqObBiGw3K01Nq9Zt2NtFTESHSoNVd5ZaLc+FYVivhI= +github.com/aaronland/go-sqlite v0.1.1/go.mod h1:EoqGJ9v4WGF9Gwln7g6b0ANsIED2sBit7p4VMtnD/yU= +github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/tidwall/gjson v1.12.1 h1:ikuZsLdhr8Ws0IdROXUS1Gi4v9Z4pGqpX/CvJkxvfpo= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/whosonfirst/go-ioutil v1.0.1 h1:xITnQgEGdG+Qlph7jPY5htL7UpPSm2wEw1WiUlKTWPc= +github.com/whosonfirst/go-ioutil v1.0.1/go.mod h1:2dS1vWdAIkiHDvDF8fYyjv6k2NISmwaIjJJeEDBEdvg= +github.com/whosonfirst/go-whosonfirst-crawl v0.2.1 h1:nNG7r7/4MaII/NM8Df2oqgfgVNBDoIKlseleoX1vw1Q= +github.com/whosonfirst/go-whosonfirst-crawl v0.2.1/go.mod h1:MTD1TCgAkXlAtysPU98ylrz9Y5+ZCfRrsrBnRyiH/t8= +github.com/whosonfirst/go-whosonfirst-iterate/v2 v2.0.2 h1:IJ4o6/I0+yfedzv/dy3SPENbxibwxil8ve1URPPGKv8= +github.com/whosonfirst/go-whosonfirst-iterate/v2 v2.0.2/go.mod h1:wkoAmndZ3l67zjUmjzw3Km8OzFt/TTJiVDSrYC8b9XY= +github.com/whosonfirst/go-whosonfirst-log v0.1.0 h1:mWYI5hn16uyeLxBmPsLSvYV4rQKK/cxGVhM+bC2ZoGc= +github.com/whosonfirst/go-whosonfirst-log v0.1.0/go.mod h1:pmgBbxZSnjGVy2nsUJBBMcFagxwIKLlmRsW7ClkXmac= +github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1 h1:NII/w0HnA5AGjRvwZJIgrEhNq2igiaVRjvVwJ5KejhQ= +github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1/go.mod h1:dZxoAGOI9dnX95fV3eM4BCoFs+Rzzzc7tmTvhNNbiVM= +github.com/whosonfirst/walk v0.0.1 h1:t0QrqGwOdPMSeovFZSXfiS0GIGHrRXK3Wb9z5Uhs2bg= +github.com/whosonfirst/walk v0.0.1/go.mod h1:1KtP/VeooSlFOI61p+THc/C16Ra8Z5MjpjI0tsd3c1M= diff --git a/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/index.go b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/index.go new file mode 100644 index 0000000..c91baef --- /dev/null +++ b/vendor/github.com/whosonfirst/go-whosonfirst-sqlite-index/v3/index.go @@ -0,0 +1,193 @@ +package index + +import ( + "context" + "fmt" + "github.com/aaronland/go-sqlite" + "github.com/whosonfirst/go-whosonfirst-iterate/v2/emitter" + "github.com/whosonfirst/go-whosonfirst-iterate/v2/iterator" + "io" + "log" + "sync" + "sync/atomic" + "time" +) + +// SQLiteIndexerPostIndexFunc is a custom function to invoke after a record has been indexed. +type SQLiteIndexerPostIndexFunc func(context.Context, sqlite.Database, []sqlite.Table, interface{}) error + +// SQLiteIndexerLoadRecordFunc is a custom `whosonfirst/go-whosonfirst-iterate/v2` callback function to be invoked +// for each record processed by the `IndexURIs` method. +type SQLiteIndexerLoadRecordFunc func(context.Context, string, io.ReadSeeker, ...interface{}) (interface{}, error) + +// SQLiteIndexer is a struct that provides methods for indexing records in one or more SQLite database tables +type SQLiteIndexer struct { + // iterator_callback is the `whosonfirst/go-whosonfirst-iterate/v2` callback function used by the `IndexPaths` method + iterator_callback emitter.EmitterCallbackFunc + table_timings map[string]time.Duration + mu *sync.RWMutex + // Timings is a boolean flag indicating whether timings (time to index records) should be recorded) + Timings bool + // Logger is a `log.Logger` instance + Logger *log.Logger +} + +// SQLiteIndexerOptions +type SQLiteIndexerOptions struct { + // DB is the `aaronland/go-sqlite.Database` instance that records will be indexed in. + DB sqlite.Database + // Tables is the list of `aaronland/go-sqlite.Table` instances that records will be indexed in. + Tables []sqlite.Table + // LoadRecordFunc is a custom `whosonfirst/go-whosonfirst-iterate/v2` callback function to be invoked + // for each record processed by the `IndexURIs` method. + LoadRecordFunc SQLiteIndexerLoadRecordFunc + // PostIndexFunc is an optional custom function to invoke after a record has been indexed. + PostIndexFunc SQLiteIndexerPostIndexFunc +} + +// NewSQLiteInder returns a `SQLiteIndexer` configured with 'opts'. +func NewSQLiteIndexer(opts *SQLiteIndexerOptions) (*SQLiteIndexer, error) { + + db := opts.DB + tables := opts.Tables + record_func := opts.LoadRecordFunc + + table_timings := make(map[string]time.Duration) + mu := new(sync.RWMutex) + + logger := log.Default() + + iterator_cb := func(ctx context.Context, path string, r io.ReadSeeker, args ...interface{}) error { + + record, err := record_func(ctx, path, r, args...) + + if err != nil { + logger.Printf("Failed to load record (%s) because %s", path, err) + return err + } + + if record == nil { + return nil + } + + db.Lock() + + defer db.Unlock() + + for _, t := range tables { + + t1 := time.Now() + + err = t.IndexRecord(ctx, db, record) + + if err != nil { + logger.Printf("Failed to index feature (%s) in '%s' table because %s", path, t.Name(), err) + return err + } + + t2 := time.Since(t1) + + n := t.Name() + + mu.Lock() + + _, ok := table_timings[n] + + if ok { + table_timings[n] += t2 + } else { + table_timings[n] = t2 + } + + mu.Unlock() + } + + if opts.PostIndexFunc != nil { + + err := opts.PostIndexFunc(ctx, db, tables, record) + + if err != nil { + return err + } + } + + return nil + } + + i := SQLiteIndexer{ + iterator_callback: iterator_cb, + table_timings: table_timings, + mu: mu, + Timings: false, + Logger: logger, + } + + return &i, nil +} + +// IndexPaths is deprecated and has been superseded by the `IndexURIs` method. +func (idx *SQLiteIndexer) IndexPaths(ctx context.Context, iterator_uri string, uris []string) error { + idx.Logger.Println("The IndexPaths method is deprecated. Please use IndexURIs instead.") + return idx.IndexURIs(ctx, iterator_uri, uris...) +} + +// IndexURIs will index records returned by the `whosonfirst/go-whosonfirst-iterate` instance for 'uris', +func (idx *SQLiteIndexer) IndexURIs(ctx context.Context, iterator_uri string, uris ...string) error { + + iter, err := iterator.NewIterator(ctx, iterator_uri, idx.iterator_callback) + + if err != nil { + return fmt.Errorf("Failed to create new iterator, %w", err) + } + + done_ch := make(chan bool) + t1 := time.Now() + + // ideally this could be a proper stand-along package method but then + // we have to set up a whole bunch of scaffolding just to pass 'indexer' + // around so... we're not doing that (20180205/thisisaaronland) + + show_timings := func() { + + t2 := time.Since(t1) + + i := atomic.LoadInt64(&iter.Seen) + + idx.mu.RLock() + defer idx.mu.RUnlock() + + for t, d := range idx.table_timings { + idx.Logger.Printf("Time to index %s (%d) : %v", t, i, d) + } + + idx.Logger.Printf("Time to index all (%d) : %v", i, t2) + } + + if idx.Timings { + + go func() { + + for { + + select { + case <-done_ch: + return + case <-time.After(1 * time.Minute): + show_timings() + } + } + }() + + defer func() { + done_ch <- true + }() + } + + err = iter.IterateURIs(ctx, uris...) + + if err != nil { + return err + } + + return nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index ed38f62..1a625e4 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -39,13 +39,14 @@ github.com/mmcloughlin/geohash github.com/natefinch/atomic # github.com/paulmach/go.geojson v1.4.0 github.com/paulmach/go.geojson -# github.com/paulmach/orb v0.5.0 +# github.com/paulmach/orb v0.6.0 ## explicit github.com/paulmach/orb +github.com/paulmach/orb/encoding/wkt github.com/paulmach/orb/geojson github.com/paulmach/orb/internal/length github.com/paulmach/orb/planar -# github.com/sfomuseum/go-edtf v0.3.1 +# github.com/sfomuseum/go-edtf v1.0.0 github.com/sfomuseum/go-edtf github.com/sfomuseum/go-edtf/calendar github.com/sfomuseum/go-edtf/common @@ -77,32 +78,30 @@ github.com/tidwall/match github.com/tidwall/pretty # github.com/tidwall/sjson v1.2.4 github.com/tidwall/sjson -# github.com/twpayne/go-geom v1.4.1 -github.com/twpayne/go-geom -github.com/twpayne/go-geom/encoding/geojson -github.com/twpayne/go-geom/encoding/wkt -# github.com/whosonfirst/go-ioutil v1.0.1 +# github.com/whosonfirst/go-ioutil v1.0.2 github.com/whosonfirst/go-ioutil -# github.com/whosonfirst/go-reader v0.10.0 +# github.com/whosonfirst/go-reader v0.11.0 ## explicit github.com/whosonfirst/go-reader # github.com/whosonfirst/go-rfc-5646 v0.1.0 github.com/whosonfirst/go-rfc-5646 # github.com/whosonfirst/go-whosonfirst-crawl v0.2.1 github.com/whosonfirst/go-whosonfirst-crawl -# github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.2 +# github.com/whosonfirst/go-whosonfirst-export/v2 v2.4.3 ## explicit github.com/whosonfirst/go-whosonfirst-export/v2 github.com/whosonfirst/go-whosonfirst-export/v2/properties -# github.com/whosonfirst/go-whosonfirst-feature v0.0.20 +# github.com/whosonfirst/go-whosonfirst-feature v0.0.23 ## explicit +github.com/whosonfirst/go-whosonfirst-feature/alt +github.com/whosonfirst/go-whosonfirst-feature/geometry github.com/whosonfirst/go-whosonfirst-feature/properties # github.com/whosonfirst/go-whosonfirst-flags v0.4.3 github.com/whosonfirst/go-whosonfirst-flags github.com/whosonfirst/go-whosonfirst-flags/existential # github.com/whosonfirst/go-whosonfirst-format v0.3.7 github.com/whosonfirst/go-whosonfirst-format -# github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.4 +# github.com/whosonfirst/go-whosonfirst-geojson-v2 v0.16.3 github.com/whosonfirst/go-whosonfirst-geojson-v2 github.com/whosonfirst/go-whosonfirst-geojson-v2/feature github.com/whosonfirst/go-whosonfirst-geojson-v2/geometry @@ -130,18 +129,20 @@ github.com/whosonfirst/go-whosonfirst-placetypes/placetypes # github.com/whosonfirst/go-whosonfirst-sources v0.1.0 github.com/whosonfirst/go-whosonfirst-sources github.com/whosonfirst/go-whosonfirst-sources/sources -# github.com/whosonfirst/go-whosonfirst-spr/v2 v2.0.0 +# github.com/whosonfirst/go-whosonfirst-spr/v2 v2.2.0 github.com/whosonfirst/go-whosonfirst-spr/v2 -# github.com/whosonfirst/go-whosonfirst-sqlite-features v0.9.4 +# github.com/whosonfirst/go-whosonfirst-sqlite-features v0.10.0 ## explicit github.com/whosonfirst/go-whosonfirst-sqlite-features github.com/whosonfirst/go-whosonfirst-sqlite-features/tables -# github.com/whosonfirst/go-whosonfirst-sqlite-features-index v1.4.6 +# github.com/whosonfirst/go-whosonfirst-sqlite-features-index v1.5.0 ## explicit github.com/whosonfirst/go-whosonfirst-sqlite-features-index # github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 v2.0.1 ## explicit github.com/whosonfirst/go-whosonfirst-sqlite-index/v2 +# github.com/whosonfirst/go-whosonfirst-sqlite-index/v3 v3.0.0 +github.com/whosonfirst/go-whosonfirst-sqlite-index/v3 # github.com/whosonfirst/go-whosonfirst-uri v1.2.0 ## explicit github.com/whosonfirst/go-whosonfirst-uri