From d39f4bb1e6a95989a26470dd019942502f11c7cd Mon Sep 17 00:00:00 2001 From: Rafael Camelo Date: Thu, 11 Jul 2024 14:41:23 +0900 Subject: [PATCH 01/25] feature_4481 --- go.mod | 10 ++- go.sum | 57 +++++++++++++++ transform/convert_quadkey_and_Vertical_id.go | 72 +++++++++++++++++++ .../convert_quadkey_and_Vertical_id_test.go | 28 ++++++++ 4 files changed, 165 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 9b54e31..b512407 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,12 @@ require ( gonum.org/v1/gonum v0.13.0 ) -require golang.org/x/image v0.7.0 // indirect +require ( + go.mongodb.org/mongo-driver v1.11.4 // indirect + golang.org/x/image v0.7.0 // indirect +) -require github.com/trajectoryjp/closest_go v1.0.1 +require ( + github.com/paulmach/orb v0.11.1 + github.com/trajectoryjp/closest_go v1.0.1 +) diff --git a/go.sum b/go.sum index 331219d..1bd2bf0 100644 --- a/go.sum +++ b/go.sum @@ -1,30 +1,75 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-gl/mathgl v1.1.0 h1:0lzZ+rntPX3/oGrDzYGdowSLC2ky8Osirvf5uAwfIEA= github.com/go-gl/mathgl v1.1.0/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ= +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/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= +github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= +github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/trajectoryjp/closest_go v1.0.1 h1:dvshtZzPDwhGDhzn5SVZxlgNnqr/gLp4uIpGDIEOHaU= github.com/trajectoryjp/closest_go v1.0.1/go.mod h1:+iTxW7/pOi0dIqo2/GcqGqWh/fAj2gMjDIiZ+BFDXIc= github.com/trajectoryjp/geodesy_go v1.0.1 h1:FvvnA3kPcPoXOjn6cS27R9aiCLyszOarFuZRVlQRG2s= github.com/trajectoryjp/geodesy_go v1.0.1/go.mod h1:eJuX+ds+t3MKxHG9dhobqNjUbUsYlpTT9XDO0mbc0LU= github.com/wroge/wgs84 v1.1.7 h1:8WVUUrpjysYxrn0ssWX7z90SOUKCuHt9NQ5tg9ovjIY= github.com/wroge/wgs84 v1.1.7/go.mod h1:mc1F8ubW03DO4zaf/006cmhaiMlfvbKmqVAcPuAtsNA= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xieyuschen/deepcopy v1.0.1 h1:nTCnKprCOdibz8WXWlMZzULIlpzZX0ZzKjz8HlGd/Nk= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas= +go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= 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/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= +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/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +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/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 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/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/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/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -34,13 +79,25 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 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/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 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/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= +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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 81c7269..0b44b6f 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -6,6 +6,7 @@ import ( "strconv" "strings" + "github.com/paulmach/orb/maptile" "github.com/trajectoryjp/spatial_id_go/v4/common" "github.com/trajectoryjp/spatial_id_go/v4/common/errors" "github.com/trajectoryjp/spatial_id_go/v4/common/object" @@ -19,6 +20,11 @@ var ( zOriginValue int64 = 25 ) +const ( + quadkeyIndex = 0 + altitudekeyIndex = 1 +) + // ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs 内部形式IDを拡張空間IDに変換する。 // // 変換後の水平方向のIDはXYZ形式のタイルIDとなる。 @@ -438,6 +444,72 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str return extendedSpatialIDToQuadkeyAndAltitudekey, nil } +/* +SPから来るTileXYZをQuadKeysAndAltitudeKeysに変える +例:Ouranos GetValueを実行後SPからTileXYZを取得する + +QuadKeyをXY、zoomに変換する → maptile で変換する。 +ZとAltitudeKeyは変換が必要。 +*/ +func ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey) ([]object.ExtendedSpatialID, error) { + + extendedSpatialIDs := []object.ExtendedSpatialID{} + + for _, r := range request { + for _, qa := range r.InnerIDList() { + quadKey := qa[quadkeyIndex] + altitudeKey := qa[altitudekeyIndex] + + z, err := convertAltitudeKeyToZ(altitudeKey, r.AltitudekeyZoom(), r.ZBaseExponent(), r.ZBaseOffset()) + if err != nil { + return nil, err + } + + mapTile := maptile.FromQuadkey(uint64(quadKey), maptile.Zoom(r.QuadkeyZoom())) + + extendedSpatialID := new(object.ExtendedSpatialID) + extendedSpatialID.SetX(int64(mapTile.X)) + extendedSpatialID.SetY(int64(mapTile.Y)) + extendedSpatialID.SetZ(z) + extendedSpatialID.SetZoom(r.QuadkeyZoom(), r.ZBaseExponent()) + extendedSpatialIDs = append(extendedSpatialIDs, *extendedSpatialID) + } + } + + return extendedSpatialIDs, nil +} + +func convertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, zBaseExponent int64, zBaseOffset int64) (int64, error) { + // 1. check that the input index exists in the input system + inputResolution := common.CalculateArithmeticShift(1, altitudekeyZoomLevel) + + maxInputIndex := inputResolution - 1 + minInputIndex := -inputResolution + + if altitudekey > maxInputIndex || altitudekey < minInputIndex { + return 0, errors.NewSpatialIdError(errors.InputValueErrorCode, "input index does not exist") + } + + zoomDifference := zBaseExponent - altitudekeyZoomLevel + + // 2. Calculate outputIndex + outputIndex := common.CalculateArithmeticShift(altitudekey, -zoomDifference) + outputIndex += zBaseOffset + // outputIndex = common.CalculateArithmeticShift(outputIndex, (outputZoom - zBaseExponent)) + + // 3. Check to make sure outputIndex exists in the output system + outputResolution := common.CalculateArithmeticShift(1, zBaseExponent) + + maxOutputIndex := outputResolution - 1 + minOutputIndex := int64(0) + + if outputIndex > maxOutputIndex || outputIndex < minOutputIndex { + return 0, errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") + } + + return outputIndex, nil +} + // ConvertSpatialIDsToQuadkeysAndVerticalIDs 空間IDを内部形式IDに変換する。 // // 最高高度、最低高度の両方が同じ値の場合、変換後の高さ方向のIDを空間IDインデックス形式とする。 diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index d655697..23dacb2 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -376,6 +376,34 @@ func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { } } +func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { + // hZoom/x/y/vZoom/z + expected := []object.ExtendedSpatialID{} + extendedSpatialID, _ := object.NewExtendedSpatialID("20/85263/65423/3/5") + expected = append(expected, *extendedSpatialID) + + request := object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 3}}, + 3, + 3, + 2, + ) + + result, err := ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs([]*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + request, + }) + if err != nil { + t.Error(err) + } + if result[0] != expected[0] { + // t.Error(result): + t.Error(result[0], expected) + } else { + t.Log("Success", result) + } +} + func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example1(t *testing.T) { expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( From e5825d39f233b801210b63e999f4a3d1b1dfcc53 Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Fri, 26 Jul 2024 21:03:34 +0900 Subject: [PATCH 02/25] changed calculation of ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs especially altitude conversion between AltitudeKeys and VerticalFIndex --- transform/convert_quadkey_and_Vertical_id.go | 75 +- .../convert_quadkey_and_Vertical_id_test.go | 2599 +++++++++-------- 2 files changed, 1363 insertions(+), 1311 deletions(-) diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 0b44b6f..a768647 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -444,13 +444,23 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str return extendedSpatialIDToQuadkeyAndAltitudekey, nil } -/* -SPから来るTileXYZをQuadKeysAndAltitudeKeysに変える -例:Ouranos GetValueを実行後SPからTileXYZを取得する - -QuadKeyをXY、zoomに変換する → maptile で変換する。 -ZとAltitudeKeyは変換が必要。 -*/ +// ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs +// QuadKeys+AltitudeKeys形式から拡張空間ID形式へ変換する +// +// QuadKeyは同一の意味のまま拡張空間IDのX,Yに変換される +// AltitudeKeyから拡張空間ID垂直インデックス(f)へは高度変換が用いられ変化する。 +// 引数 : +// +// request : 変換対象のromExtendedSpatialIDToQuadkeyAndAltitudekey構造体のスライス +// +// 戻り値 : +// +// 変換後の拡張空間IDのスライス +// +// 戻り値(エラー) : +// +// 以下の条件に当てはまる場合、エラーインスタンスが返却される。 +// 拡張空間ID高度範囲外:変換後の拡張空間ID高度がその垂直ズームレベルにおける高度範囲外である場合。 func ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey) ([]object.ExtendedSpatialID, error) { extendedSpatialIDs := []object.ExtendedSpatialID{} @@ -460,54 +470,65 @@ func ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(request []*object.FromEx quadKey := qa[quadkeyIndex] altitudeKey := qa[altitudekeyIndex] - z, err := convertAltitudeKeyToZ(altitudeKey, r.AltitudekeyZoom(), r.ZBaseExponent(), r.ZBaseOffset()) + zMin, zMax, err := convertAltitudeKeyToZ(altitudeKey, r.AltitudekeyZoom(), r.AltitudekeyZoom(), r.ZBaseExponent(), r.ZBaseOffset()) if err != nil { return nil, err } mapTile := maptile.FromQuadkey(uint64(quadKey), maptile.Zoom(r.QuadkeyZoom())) - extendedSpatialID := new(object.ExtendedSpatialID) - extendedSpatialID.SetX(int64(mapTile.X)) - extendedSpatialID.SetY(int64(mapTile.Y)) - extendedSpatialID.SetZ(z) - extendedSpatialID.SetZoom(r.QuadkeyZoom(), r.ZBaseExponent()) - extendedSpatialIDs = append(extendedSpatialIDs, *extendedSpatialID) + for z := zMin; z <= zMax; z++ { + extendedSpatialID := new(object.ExtendedSpatialID) + extendedSpatialID.SetX(int64(mapTile.X)) + extendedSpatialID.SetY(int64(mapTile.Y)) + extendedSpatialID.SetZ(z) + extendedSpatialID.SetZoom(r.QuadkeyZoom(), r.AltitudekeyZoom()) + extendedSpatialIDs = append(extendedSpatialIDs, *extendedSpatialID) + } } } return extendedSpatialIDs, nil } -func convertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, zBaseExponent int64, zBaseOffset int64) (int64, error) { +func convertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, zZoomLevel int64, zBaseExponent int64, zBaseOffset int64) (int64, int64, error) { // 1. check that the input index exists in the input system inputResolution := common.CalculateArithmeticShift(1, altitudekeyZoomLevel) maxInputIndex := inputResolution - 1 - minInputIndex := -inputResolution + minInputIndex := int64(0) if altitudekey > maxInputIndex || altitudekey < minInputIndex { - return 0, errors.NewSpatialIdError(errors.InputValueErrorCode, "input index does not exist") + return 0, 0, errors.NewSpatialIdError(errors.InputValueErrorCode, "input index does not exist") } + // 2. Calculate internal index zoomDifference := zBaseExponent - altitudekeyZoomLevel - // 2. Calculate outputIndex - outputIndex := common.CalculateArithmeticShift(altitudekey, -zoomDifference) - outputIndex += zBaseOffset - // outputIndex = common.CalculateArithmeticShift(outputIndex, (outputZoom - zBaseExponent)) + internalMinIndex := common.CalculateArithmeticShift(altitudekey, zoomDifference) + internalMaxIndex := internalMinIndex + if zoomDifference > 0 { + internalMaxIndex = common.CalculateArithmeticShift(altitudekey+1, zoomDifference) - 1 + } + // 3. Calculate outputMinIndex + outputZoomDifference := zZoomLevel - 25 + outputMinIndex := common.CalculateArithmeticShift(internalMinIndex-zBaseOffset, outputZoomDifference) + outputMaxIndex := outputMinIndex + if outputZoomDifference > 0 { + outputMaxIndex = common.CalculateArithmeticShift(internalMaxIndex-zBaseOffset+1, outputZoomDifference) - 1 + } - // 3. Check to make sure outputIndex exists in the output system - outputResolution := common.CalculateArithmeticShift(1, zBaseExponent) + // 4. Check to make sure outputMinIndex exists in the output system + outputResolution := common.CalculateArithmeticShift(1, zZoomLevel) maxOutputIndex := outputResolution - 1 - minOutputIndex := int64(0) + minOutputIndex := -outputResolution - if outputIndex > maxOutputIndex || outputIndex < minOutputIndex { - return 0, errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") + if outputMaxIndex > maxOutputIndex || outputMinIndex < minOutputIndex { + return 0, 0, errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") } - return outputIndex, nil + return outputMinIndex, outputMaxIndex, nil } // ConvertSpatialIDsToQuadkeysAndVerticalIDs 空間IDを内部形式IDに変換する。 diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 23dacb2..46ad329 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -1,1284 +1,1315 @@ -// 空間IDパッケージ -package transform - -import ( - "reflect" - "sort" - "strconv" - "testing" - - "github.com/trajectoryjp/spatial_id_go/v4/common/errors" - "github.com/trajectoryjp/spatial_id_go/v4/common/object" -) - -func TestConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToHZoom int64 - ToVZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 6, ToVZoom: 20, pattern: 0, result: []string{"6/24/53/20/9", "6/24/49/20/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 7, ToVZoom: 2, pattern: 0, result: []string{"7/48/107/2/0", "7/49/107/2/0", "7/48/98/2/0", "7/49/98/2/0", "7/48/99/2/0", "7/49/99/2/0", "7/48/106/2/0", "7/49/106/2/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 5, ToVZoom: 8, pattern: 0, result: []string{"5/12/26/8/0", "5/12/24/8/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToHZoom: 9, ToVZoom: 2, pattern: 0, result: []string{"9/338/229/2/0"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 0, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 5, ToVZoom: 36, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, e, p.e) - } - } - -} - -func TestConvertQuadkeysAndVerticalIDsToSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 6, pattern: 0, result: []string{"6/0/24/53", "6/0/24/49"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 7, pattern: 0, result: []string{"7/0/48/107", "7/0/49/107", "7/0/48/98", "7/0/49/98", "7/0/48/99", "7/0/49/99", "7/0/48/106", "7/0/49/106"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 5, pattern: 0, result: []string{"5/0/12/26", "5/0/12/24"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToZoom: 9, pattern: 0, result: []string{"9/0/338/229"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToSpatialIDs(p.quadkeyAndVerticalIDs, p.ToZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToSpatialIDs(%+v,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToZoom, e, p.e) - } - } - -} - -func TestConvertExtendedSpatialIdsToQuadkeysAndVerticalIDs(t *testing.T) { - // 結果確認用の構造体を作成する - //"20/85263/65423"→ 00012322332320003333 →7432012031 21:29728048124,29728048125,29728048126,29728048127, - //horizontalID: "20/45621/43566", result: 3448507833}, //"00003031203000312321" - //horizontalID: "26/4562451/2343566", result: 26508024119725}, //"00012001233201113020012231" - //horizontalID: "26/1/2", result: 9}, //"00000000000000000000000021" - //horizontalID: "26/2/1", result: 6}, //"00000000000000000000000012" - //horizontalID: "5/4562451/2343566", result: 429}, //"12231" - - quadkeyAndVerticalIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 58}, {29728048124, 57}, {29728048125, 58}, {29728048125, 57}, {29728048126, 58}, {29728048126, 57}, {29728048127, 58}, {29728048127, 57}}, 10, 500, 0) - quadkeyAndVerticalIDs = append(quadkeyAndVerticalIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsSpatialIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsSpatialIDs = append(quadkeyAndVerticalIDsSpatialIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsHBorders1 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(1, [][2]int64{{0, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsHBorders1 = append(quadkeyAndVerticalIDsHBorders1, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsHBorders31 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - quadkeyAndVerticalIDsHBorders31 = append(quadkeyAndVerticalIDsHBorders31, newQuadkeyAndVerticalID) - - // quadkeyAndVerticalIDsValueE := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - // newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - // quadkeyAndVerticalIDsValueE = append(quadkeyAndVerticalIDsValueE, newQuadkeyAndVerticalID) - - _, err := strconv.ParseInt("test", 10, 64) - datas := []struct { - spatialIds []string - ToHZoom int64 - ToVZoom int64 - maxHeight float64 - minHeight float64 - result []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID - resultLength int - pattern int64 // 0:正常 1:異常 2:個数(水平) 3:個数(垂直) - e error - }{ - // 正常 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 21, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, pattern: 0}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 19, ToVZoom: 26, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDs, pattern: 0}, - - // 水平精度個数確認 低精度は1、高精度は精度差^4 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 24, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 512, pattern: 2}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 2, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 2, pattern: 2}, - // 水平精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders1, resultLength: 2, pattern: 2}, - {spatialIds: []string{"35/85263/65423/26/0"}, ToHZoom: 31, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders31, pattern: 0}, - - // 垂直精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 0, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 1, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - - // 異常系(精度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 0, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 20, ToVZoom: -1, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"35/85263/65423/26/56"}, ToHZoom: 32, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/35/56"}, ToHZoom: 20, ToVZoom: 36, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"36/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/36/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - - // 異常系(高度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: -500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - // 異常系(入力エラー) - {spatialIds: []string{"20/test/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, err.Error())}, - } - for _, p := range datas { - - result, e := ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, p.result[0], result[0]) - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, e, p.e) - } - if p.pattern == 2 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - if p.pattern == 3 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_1(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_2(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 56}, {29728048125, 56}, {29728048126, 56}, {29728048127, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 21, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_3(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 7}}, - 12, - 14, // 2^14 - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_4(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 54}}, - 12, - 14, - 188, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 188, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 12}, {29728048124, 13}, {29728048125, 12}, {29728048125, 13}, {29728048126, 12}, {29728048126, 13}, {29728048127, 12}, {29728048127, 13}}, - 15, - 14, - -50, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/56"}, - 21, - 15, - 14, - -50, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { - // hZoom/x/y/vZoom/z - expected := []object.ExtendedSpatialID{} - extendedSpatialID, _ := object.NewExtendedSpatialID("20/85263/65423/3/5") - expected = append(expected, *extendedSpatialID) - - request := object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 3}}, - 3, - 3, - 2, - ) - - result, err := ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs([]*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - request, - }) - if err != nil { - t.Error(err) - } - if result[0] != expected[0] { - // t.Error(result): - t.Error(result[0], expected) - } else { - t.Log("Success", result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example1(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 3}}, - 3, - 3, - 2, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/1"}, - 20, - 3, - 3, - 2, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example2(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 2}}, - 2, - 3, - 2, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/3"}, - 20, - 2, - 3, - 2, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example3(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 2}, {7432012031, 3}}, - 3, - 3, - 2, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/24/0"}, - 20, - 3, - 3, - 2, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example4(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 0}, {7432012031, 1}, {7432012031, 2}, {7432012031, 3}}, - 25, - 23, - -1, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/1"}, - 20, - 25, - 23, - -1, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example5(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 0}}, - 23, - 25, - -1, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/1"}, - 20, - 23, - 25, - -1, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example6(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( // 例6 - 20, - [][2]int64{{7432012031, 0}}, - 23, - 25, - -1, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/4"}, - 20, - 23, - 25, - -1, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertSpatialIdsToQuadkeysAndVerticalIDs(t *testing.T) { - quadkeyAndVerticalIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 1023}, {29728048125, 1023}, {29728048126, 1023}, {29728048127, 1023}}, 10, 500, 0) - quadkeyAndVerticalIDs = append(quadkeyAndVerticalIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsUpup := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 2047}, {29728048125, 2047}, {29728048126, 2047}, {29728048127, 2047}}, 11, 500, 0) - quadkeyAndVerticalIDsUpup = append(quadkeyAndVerticalIDsUpup, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsDwdw := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 511}}, 9, 500, 0) - quadkeyAndVerticalIDsDwdw = append(quadkeyAndVerticalIDsDwdw, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsDwup := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 2047}}, 11, 500, 0) - quadkeyAndVerticalIDsDwup = append(quadkeyAndVerticalIDsDwup, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsSpatialIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 112}, {29728048124, 113}, {29728048125, 112}, {29728048125, 113}, {29728048126, 112}, {29728048126, 113}, {29728048127, 112}, {29728048127, 113}}, 21, 0, 0) - quadkeyAndVerticalIDsSpatialIDs = append(quadkeyAndVerticalIDsSpatialIDs, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsSpatialIDsUpdw := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 28}, {29728048125, 28}, {29728048126, 28}, {29728048127, 28}}, 19, 0, 0) - quadkeyAndVerticalIDsSpatialIDsUpdw = append(quadkeyAndVerticalIDsSpatialIDsUpdw, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsSpatialIDsDwup := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 112}, {1858003007, 113}}, 21, 0, 0) - quadkeyAndVerticalIDsSpatialIDsDwup = append(quadkeyAndVerticalIDsSpatialIDsDwup, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsSpatialIDsDwdw := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 28}}, 19, 0, 0) - quadkeyAndVerticalIDsSpatialIDsDwdw = append(quadkeyAndVerticalIDsSpatialIDsDwdw, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsHBorders1 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(1, [][2]int64{{0, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsHBorders1 = append(quadkeyAndVerticalIDsHBorders1, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsHBorders31 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 0}}, 10, 500, 0) - quadkeyAndVerticalIDsHBorders31 = append(quadkeyAndVerticalIDsHBorders31, newQuadkeyAndVerticalID) - - // quadkeyAndVerticalIDsValueE := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - // newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - // quadkeyAndVerticalIDsValueE = append(quadkeyAndVerticalIDsValueE, newQuadkeyAndVerticalID) - - _, err := strconv.ParseInt("test", 10, 64) - datas := []struct { - spatialIds []string - ToHZoom int64 - ToVZoom int64 - maxHeight float64 - minHeight float64 - result []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID - resultLength int - pattern int64 // 0:正常 1:異常 2:個数(水平) 3:個数(垂直) - e error - }{ - // 正常 - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 21, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, pattern: 0}, //all1 - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 21, ToVZoom: 11, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsUpup, pattern: 0}, //all1 - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 19, ToVZoom: 9, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsDwdw, pattern: 0}, //all1 - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 19, ToVZoom: 11, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsDwup, pattern: 0}, //all1 - - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 21, ToVZoom: 21, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDs, pattern: 0}, - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 21, ToVZoom: 19, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDsUpdw, pattern: 0}, - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 19, ToVZoom: 21, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDsDwup, pattern: 0}, - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 19, ToVZoom: 19, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDsDwdw, pattern: 0}, - - // 水平精度個数確認 低精度は1、高精度は精度差^4 - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 24, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 256, pattern: 2}, - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 2, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 1, pattern: 2}, - // 水平精度境界値 - {spatialIds: []string{"20/0/85263/65423"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders1, resultLength: 66, pattern: 2}, - {spatialIds: []string{"35/0/85263/65423"}, ToHZoom: 31, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders31, pattern: 0}, - - // 垂直精度境界値 - {spatialIds: []string{"20/0/85263/65423"}, ToHZoom: 21, ToVZoom: 0, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - {spatialIds: []string{"20/0/85263/65423"}, ToHZoom: 21, ToVZoom: 1, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - - // 異常系(精度エラー) - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 0, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 20, ToVZoom: -1, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"35/56/85263/65423"}, ToHZoom: 32, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 20, ToVZoom: 36, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"36/56/85263/65423"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - - // 異常系(高度エラー) - {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 1, ToVZoom: 10, maxHeight: -500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - // 異常系(入力エラー) - {spatialIds: []string{"20/56/test/65423"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, err.Error())}, - } - for _, p := range datas { - result, e := ConvertSpatialIDsToQuadkeysAndVerticalIDs(p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight) - if p.pattern == 0 && !SortCheck(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, p.result[0], result[0]) - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, e, p.e) - } - - if p.pattern == 2 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - if p.pattern == 3 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - - } -} - -func SortCheck(r []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID, rt []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID) bool { - // 実行結果とテスト値が一致しない場合、false。それ以外の場合、true - for index, rTmp := range r { - rtTmp := rt[index] - if rtTmp.QuadkeyZoom() != rTmp.QuadkeyZoom() { - return false - } - if rtTmp.VerticalZoom() != rTmp.VerticalZoom() { - return false - } - if rtTmp.MaxHeight() != rTmp.MaxHeight() { - return false - } - if rtTmp.MinHeight() != rTmp.MinHeight() { - return false - } - for _, li := range rTmp.InnerIDList() { - b := false - for _, li2 := range rtTmp.InnerIDList() { - if li2 == li { - b = true - } - } - // テスト値の内部形式IDが関数の実行結果に存在しない場合、false - if !b { - return b - } - } - } - // 最後に到達した場合はTrue - return true -} - -func TestDeleteDuplicationList(t *testing.T) { - datas := []struct { - duplicationList []string - result []string - }{ - {duplicationList: []string{"20/562356/78451/23/956", "20/562356/78451/23/957", "20/562356/78451/23/956", "20/562356/78451/23/957"}, result: []string{"20/562356/78451/23/956", "20/562356/78451/23/957"}}, - } - for _, p := range datas { - result := deleteDuplicationList(p.duplicationList) - sort.Strings(result) - sort.Strings(p.result) - if !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("deleteDuplicationList(%s) == %s, result: %s", p.duplicationList, p.result, result) - } - - } -} - -func TestConvertHorizontalIDToQuadkey(t *testing.T) { - datas := []struct { - horizontalID string - result int64 - }{ - {horizontalID: "20/45621/43566", result: 3448507833}, //"00003031203000312321" - {horizontalID: "26/4562451/2343566", result: 26508024119725}, //"00012001233201113020012231" - {horizontalID: "26/1/2", result: 9}, //"00000000000000000000000021" - {horizontalID: "26/2/1", result: 6}, //"00000000000000000000000012" - {horizontalID: "5/4562451/2343566", result: 429}, //"12231" - ///{horizontalID: "31/2147483647/2147483647", result: 5}, - } - for _, p := range datas { - result := convertHorizontalIDToQuadkey(p.horizontalID) - if result != p.result { - t.Log(t.Name()) - t.Errorf("convertHorizontalIDToQuadkey(%s) == %d, result: %d", p.horizontalID, p.result, result) - } - } -} -func TestConvertQuadkeyToHorizontalID(t *testing.T) { - datas := []struct { - quadkey int64 - zoom int64 - resultX int64 - resultY int64 - }{ - {quadkey: 2914, zoom: 6, resultX: 24, resultY: 53}, //2914-""231202"" - {quadkey: 438, zoom: 6, resultX: 22, resultY: 13}, //438-"012312" - {quadkey: 14628, zoom: 7, resultX: 82, resultY: 100}, //14628-"3210210" - } - for _, p := range datas { - resultX, resultY := convertQuadkeyToHorizontalID(p.quadkey, p.zoom) - if resultX != p.resultX && resultY != p.resultY { - t.Log(t.Name()) - t.Errorf("convertQuadkeyToHorizontalID(%d,%d) == %d,%d, resultX: %d,resultY: %d,", p.quadkey, p.zoom, p.resultX, p.resultY, resultX, resultY) - } - - } -} -func TestConvertVerticallIDToBit(t *testing.T) { - datas := []struct { - vZoom int64 - vIndex int64 - outputZoom int64 - maxHeight float64 - minHeight float64 - result []int64 - }{ - // 正常系 1111−0000すべて - {vZoom: 16, vIndex: 0, outputZoom: 4, maxHeight: 500.0, minHeight: 0.0, result: []int64{15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}}, - // 正常系 bit形式の枠外(正方向) - {vZoom: 13, vIndex: 6, outputZoom: 5, maxHeight: 0.0, minHeight: -500.0, result: []int64{31}}, - // 正常系 bit形式の枠外(負方向) - {vZoom: 13, vIndex: -6, outputZoom: 5, maxHeight: 500.0, minHeight: 0.0, result: []int64{0}}, - {vZoom: 20, vIndex: 0, outputZoom: 8, maxHeight: 500.0, minHeight: -500.0, result: []int64{136, 128, 129, 130, 131, 132, 133, 134, 135}}, - //{vZoom: 35, vIndex: 0, outputZoom: 35, maxHeight: 1.0, minHeight: 0.0, result: []int64{136, 128, 129, 130, 131, 132, 133, 134, 135}}, - } - for _, p := range datas { - result := convertVerticallIDToBit(p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight) - if !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("convertVerticallIDToBit(%d,%d, %d,%f,%f) == %d, result: %d", p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight, p.result, result) - } - - } -} - -func TestCalcBitIndex(t *testing.T) { - datas := []struct { - altitude float64 - outputZoom int64 - maxHeight float64 - minHeight float64 - pattern int64 - result int64 - }{ - // 正常(地表) - {altitude: 256.0, outputZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 524}, - // 正常(桁数補正) - {altitude: 0.0, outputZoom: 10, maxHeight: 256.0, minHeight: -256.0, pattern: 0, result: 512}, - // 正常(地中) - {altitude: -200.0, outputZoom: 10, maxHeight: 0.0, minHeight: -500.0, pattern: 0, result: 614}, - // 正常 All1 - {altitude: 2560.0, outputZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 1023}, - // 正常 All0 - {altitude: -256.0, outputZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 0}, - // 正常 0 - {altitude: -256.0, outputZoom: 1, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 0}, - // 正常 1 - {altitude: 512.0, outputZoom: 1, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 1}, - } - for _, p := range datas { - result := calcBitIndex(p.altitude, p.outputZoom, p.maxHeight, p.minHeight) - if result != p.result { - t.Log(t.Name()) - t.Errorf("calcBitIndex(%f, %d,%f,%f) == %d, result: %d", p.altitude, p.outputZoom, p.maxHeight, p.minHeight, p.result, result) - } - } -} - -func TestConvertBitToVerticalID(t *testing.T) { - datas := []struct { - vZoom int64 - vIndex int64 - outputZoom int64 - maxHeight float64 - minHeight float64 - pattern int64 - result []string - }{ - // 正常系 - // 01010101010101010101010101→5592405 - {vZoom: 26, vIndex: 5592405, outputZoom: 26, maxHeight: 500, minHeight: 0, pattern: 0, result: []string{"26/83", "26/83"}}, - {vZoom: 2, vIndex: 4, outputZoom: 25, maxHeight: 500, minHeight: 0, pattern: 1, result: []string{"126", "500", "375"}}, - {vZoom: 26, vIndex: 5592405, outputZoom: 25, maxHeight: 0, minHeight: -500, pattern: 0, result: []string{"25/-459", "25/-459"}}, - // インデックスの補完 - {vZoom: 8, vIndex: 85, outputZoom: 26, maxHeight: 1000, minHeight: 0, pattern: 0, result: []string{"26/671", "26/664", "26/665", "26/666", "26/667", "26/668", "26/669", "26/670"}}, - } - for _, p := range datas { - result := convertBitToVerticalID(p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight) - if p.pattern == 0 { - if !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("convertBitToVerticalID(%d,%d, %d,%f,%f) == %s, result: %s", p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight, p.result, result) - } - } else { - // スライスの長さ,桁数 - length, _ := strconv.Atoi(p.result[0]) - if len(result) != length { - t.Log(t.Name()) - t.Errorf("convertBitToVerticalID(%d,%d, %d,%f,%f) == %s, result: %s", p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight, p.result[0], result) - } - } - } - -} - -func TestQuadkeyCheckZoom(t *testing.T) { - // テストデータのテーブルを定義 - datas := []struct { - HZoom int64 - VZoom int64 - result bool - }{ - {HZoom: 1, VZoom: 12, result: true}, - {HZoom: 2, VZoom: 12, result: true}, - {HZoom: 31, VZoom: 12, result: true}, - {HZoom: 12, VZoom: 0, result: true}, - {HZoom: 12, VZoom: 1, result: true}, - {HZoom: 12, VZoom: 35, result: true}, - {HZoom: 0, VZoom: 12, result: false}, - {HZoom: 32, VZoom: 12, result: false}, - {HZoom: 12, VZoom: -1, result: false}, - {HZoom: 12, VZoom: 36, result: false}, - } - - for _, p := range datas { - result := quadkeyCheckZoom(p.HZoom, p.VZoom) - if result != p.result { - t.Log(t.Name()) - t.Errorf("quadkeyCheckZoom(%d, %d) == %s, result: %s", p.HZoom, p.VZoom, strconv.FormatBool(p.result), strconv.FormatBool(result)) - } - } -} - -func TestSpatialIDCheckZoom(t *testing.T) { - // テストデータのテーブルを定義 - datas := []struct { - HZoom int64 - VZoom int64 - result bool - }{ - {HZoom: 0, VZoom: 12, result: true}, - {HZoom: 1, VZoom: 12, result: true}, - {HZoom: 35, VZoom: 12, result: true}, - {HZoom: 12, VZoom: 0, result: true}, - {HZoom: 12, VZoom: 1, result: true}, - {HZoom: 12, VZoom: 35, result: true}, - {HZoom: -1, VZoom: 12, result: false}, - {HZoom: 36, VZoom: 12, result: false}, - {HZoom: 12, VZoom: -1, result: false}, - {HZoom: 12, VZoom: 36, result: false}, - } - - for _, p := range datas { - result := extendedSpatialIDCheckZoom(p.HZoom, p.VZoom) - if result != p.result { - t.Log(t.Name()) - t.Errorf("extendedSpatialIDCheckZoom(%d, %d) == %s, result: %s", p.HZoom, p.VZoom, strconv.FormatBool(p.result), strconv.FormatBool(result)) - } - } - -} - -func TestConvertZToAltitudekey_1(t *testing.T) { - expected := []int64{400, 401, 402, 403} - - result, error := convertZToAltitudekey( - 100, - 25, - 27, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_2(t *testing.T) { - expected := []int64{50} - - result, error := convertZToAltitudekey( - 100, - 25, - 24, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_3(t *testing.T) { - expected := []int64{100} - - result, error := convertZToAltitudekey( - 100, - 25, - 25, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_4(t *testing.T) { - expected := []int64{53} - - result, error := convertZToAltitudekey( - 100, - 25, - 25, - 25, - -47, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_5(t *testing.T) { - expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - - result, error := convertZToAltitudekey( - 100, - 25, - 21, - 25, - -272, - ) - if error != expectedError { - t.Fatal(result, error) - } -} - -func TestConvertZToAltitudekey_6(t *testing.T) { - expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - - result, error := convertZToAltitudekey( - 100, - 25, - 25, - 25, - -512, - ) - if error != expectedError { - t.Fatal(result, error) - } -} - -func TestConvertZToAltitudekey_7(t *testing.T) { - expected := []int64{1000} - - result, error := convertZToAltitudekey( - 28, - 25, - 14, - 25, - 2048000, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_8(t *testing.T) { - expected := []int64{100} - - result, error := convertZToAltitudekey( - 100, - 25, - 24, - 24, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_9(t *testing.T) { - expected := []int64{800, 801, 802, 803, 804, 805, 806, 807} - - result, error := convertZToAltitudekey( - 100, - 25, - 27, - 24, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_1(t *testing.T) { - expected := int64(47) - - result, error := convertZToMinAltitudekey( - 0, - 25, - 25, - 25, - 47, - ) - if error != nil { - t.Fatal(error) - } - - if result != expected { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_2(t *testing.T) { - expected := int64(0) - - result, error := convertZToMinAltitudekey( - 0, - 25, - 25, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if result != expected { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_3(t *testing.T) { - expected := int64(0) - - result, error := convertZToMinAltitudekey( - 0, - 25, - 27, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if result != expected { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_4(t *testing.T) { - expected := int64(4) - - result, error := convertZToMinAltitudekey( - 1, - 25, - 27, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if result != expected { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_5(t *testing.T) { - expected := int64(3276800) - - result, error := convertZToMinAltitudekey( - 100, - 10, - 25, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if result != expected { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_6(t *testing.T) { - expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - - result, error := convertZToMinAltitudekey( - 100, - 10, - 25, - 25, - -3276801, - ) - if error != expectedError { - t.Fatal(result, error) - } -} - -func TestConvertZToMinAltitudekey_7(t *testing.T) { - expected := int64(24) - - result, error := convertZToMinAltitudekey( - 47, - 25, - 24, - 25, - 2, - ) - if error != nil { - t.Fatal(error) - } - - if result != expected { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_8(t *testing.T) { - expected := int64(2) - - result, error := convertZToMinAltitudekey( - 47, - 25, - 20, - 25, - 32, - ) - if error != nil { - t.Fatal(error) - } - - if result != expected { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_9(t *testing.T) { - expected := int64(12) - - result, error := convertZToMinAltitudekey( - 47, - 25, - 12, - 14, - 4, - ) - if error != nil { - t.Fatal(error) - } - - if result != expected { - t.Fatal(result) - } -} - -func TestConvertZToMinAltitudekey_10(t *testing.T) { - expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - - result, error := convertZToMinAltitudekey( - -1, - 25, - 25, - 25, - 0, - ) - if error != expectedError { - t.Fatal(result, error) - } -} - -func TestConvertZToMinAltitudekey_11(t *testing.T) { - expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - - result, error := convertZToMinAltitudekey( - -100, - 25, - 26, - 24, - 51, - ) - if error != expectedError { - t.Fatal(result, error) - } -} +// 空間IDパッケージ +package transform + +import ( + "reflect" + "sort" + "strconv" + "testing" + + "github.com/trajectoryjp/spatial_id_go/v4/common/errors" + "github.com/trajectoryjp/spatial_id_go/v4/common/object" +) + +func TestConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(t *testing.T) { + // データの作成 + quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 + quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) + newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" + quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" + quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 + quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) + + quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 + quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) + + quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 + quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) + + quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 + quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) + + quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 + quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) + + datas := []struct { + quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID + ToHZoom int64 + ToVZoom int64 + result []string + pattern int64 + e error + }{ + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 6, ToVZoom: 20, pattern: 0, result: []string{"6/24/53/20/9", "6/24/49/20/0"}}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 7, ToVZoom: 2, pattern: 0, result: []string{"7/48/107/2/0", "7/49/107/2/0", "7/48/98/2/0", "7/49/98/2/0", "7/48/99/2/0", "7/49/99/2/0", "7/48/106/2/0", "7/49/106/2/0"}}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 5, ToVZoom: 8, pattern: 0, result: []string{"5/12/26/8/0", "5/12/24/8/0"}}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToHZoom: 9, ToVZoom: 2, pattern: 0, result: []string{"9/338/229/2/0"}}, + // 異常系(精度エラー) + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 0, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 5, ToVZoom: 36, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + } + + for _, p := range datas { + result, e := ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom) + sort.Strings(result) + sort.Strings(p.result) + if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { + t.Log(t.Name()) + t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, p.result, result) + return + } + if p.pattern == 1 && e != p.e { + t.Log(t.Name()) + t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, e, p.e) + } + } + +} + +func TestConvertQuadkeysAndVerticalIDsToSpatialIDs(t *testing.T) { + // データの作成 + quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 + quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) + newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" + quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" + quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 + quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) + + quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 + quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) + + quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 + quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) + + quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 + quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) + + quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} + newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 + quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) + + datas := []struct { + quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID + ToZoom int64 + result []string + pattern int64 + e error + }{ + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 6, pattern: 0, result: []string{"6/0/24/53", "6/0/24/49"}}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 7, pattern: 0, result: []string{"7/0/48/107", "7/0/49/107", "7/0/48/98", "7/0/49/98", "7/0/48/99", "7/0/49/99", "7/0/48/106", "7/0/49/106"}}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 5, pattern: 0, result: []string{"5/0/12/26", "5/0/12/24"}}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToZoom: 9, pattern: 0, result: []string{"9/0/338/229"}}, + // 異常系(精度エラー) + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + } + + for _, p := range datas { + result, e := ConvertQuadkeysAndVerticalIDsToSpatialIDs(p.quadkeyAndVerticalIDs, p.ToZoom) + sort.Strings(result) + sort.Strings(p.result) + if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { + t.Log(t.Name()) + t.Errorf("ConvertQuadkeysAndVerticalIDsToSpatialIDs(%+v,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToZoom, p.result, result) + return + } + if p.pattern == 1 && e != p.e { + t.Log(t.Name()) + t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToZoom, e, p.e) + } + } + +} + +func TestConvertExtendedSpatialIdsToQuadkeysAndVerticalIDs(t *testing.T) { + // 結果確認用の構造体を作成する + //"20/85263/65423"→ 00012322332320003333 →7432012031 21:29728048124,29728048125,29728048126,29728048127, + //horizontalID: "20/45621/43566", result: 3448507833}, //"00003031203000312321" + //horizontalID: "26/4562451/2343566", result: 26508024119725}, //"00012001233201113020012231" + //horizontalID: "26/1/2", result: 9}, //"00000000000000000000000021" + //horizontalID: "26/2/1", result: 6}, //"00000000000000000000000012" + //horizontalID: "5/4562451/2343566", result: 429}, //"12231" + + quadkeyAndVerticalIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID := object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 58}, {29728048124, 57}, {29728048125, 58}, {29728048125, 57}, {29728048126, 58}, {29728048126, 57}, {29728048127, 58}, {29728048127, 57}}, 10, 500, 0) + quadkeyAndVerticalIDs = append(quadkeyAndVerticalIDs, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDsSpatialIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 56}}, 26, 0, 0) + quadkeyAndVerticalIDsSpatialIDs = append(quadkeyAndVerticalIDsSpatialIDs, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDsHBorders1 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(1, [][2]int64{{0, 56}}, 26, 0, 0) + quadkeyAndVerticalIDsHBorders1 = append(quadkeyAndVerticalIDsHBorders1, newQuadkeyAndVerticalID) + quadkeyAndVerticalIDsHBorders31 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) + quadkeyAndVerticalIDsHBorders31 = append(quadkeyAndVerticalIDsHBorders31, newQuadkeyAndVerticalID) + + // quadkeyAndVerticalIDsValueE := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + // newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) + // quadkeyAndVerticalIDsValueE = append(quadkeyAndVerticalIDsValueE, newQuadkeyAndVerticalID) + + _, err := strconv.ParseInt("test", 10, 64) + datas := []struct { + spatialIds []string + ToHZoom int64 + ToVZoom int64 + maxHeight float64 + minHeight float64 + result []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID + resultLength int + pattern int64 // 0:正常 1:異常 2:個数(水平) 3:個数(垂直) + e error + }{ + // 正常 + {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 21, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, pattern: 0}, + {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 19, ToVZoom: 26, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDs, pattern: 0}, + + // 水平精度個数確認 低精度は1、高精度は精度差^4 + {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 24, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 512, pattern: 2}, + {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 2, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 2, pattern: 2}, + // 水平精度境界値 + {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders1, resultLength: 2, pattern: 2}, + {spatialIds: []string{"35/85263/65423/26/0"}, ToHZoom: 31, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders31, pattern: 0}, + + // 垂直精度境界値 + {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 0, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, + {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 1, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, + + // 異常系(精度エラー) + {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 0, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 20, ToVZoom: -1, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"35/85263/65423/26/56"}, ToHZoom: 32, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"20/85263/65423/35/56"}, ToHZoom: 20, ToVZoom: 36, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"36/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"20/85263/65423/36/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + + // 異常系(高度エラー) + {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: -500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + // 異常系(入力エラー) + {spatialIds: []string{"20/test/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, err.Error())}, + } + for _, p := range datas { + + result, e := ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight) + if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { + t.Log(t.Name()) + t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, p.result[0], result[0]) + } + if p.pattern == 1 && e != p.e { + t.Log(t.Name()) + t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, e, p.e) + } + if p.pattern == 2 && p.resultLength != len(result[0].InnerIDList()) { + t.Log(t.Name()) + t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) + } + if p.pattern == 3 && p.resultLength != len(result[0].InnerIDList()) { + t.Log(t.Name()) + t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) + } + + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_1(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 56}}, + 26, + 25, + 0, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/26/56"}, + 20, + 26, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_2(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 21, + [][2]int64{{29728048124, 56}, {29728048125, 56}, {29728048126, 56}, {29728048127, 56}}, + 26, + 25, + 0, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/26/56"}, + 21, + 26, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_3(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 7}}, + 12, + 14, // 2^14 + 0, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/26/56"}, + 20, + 12, + 14, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_4(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 54}}, + 12, + 14, + 188, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/26/56"}, + 20, + 12, + 14, + 188, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 21, + [][2]int64{{29728048124, 12}, {29728048124, 13}, {29728048125, 12}, {29728048125, 13}, {29728048126, 12}, {29728048126, 13}, {29728048127, 12}, {29728048127, 13}}, + 15, + 14, + -50, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/25/56"}, + 21, + 15, + 14, + -50, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { + testCases := []struct { + expected []string + request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey + }{ + { + // hZoom/x/y/vZoom/z + []string{"20/85263/65423/23/-2"}, + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 0}}, + 23, + 23, + 8, + )}, + }, + { + []string{"20/85263/65423/25/1"}, + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 3}}, + 25, + 25, + 2, + )}, + }, + { + []string{"20/85263/65423/3/0"}, + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 3}}, + 3, + 3, + 2, + )}, + }, + } + for _, testCase := range testCases { + expectedData := []object.ExtendedSpatialID{} + for i := 0; i < len(testCase.expected); i++ { + extendedSpatialId, _ := object.NewExtendedSpatialID(testCase.expected[i]) + expectedData = append(expectedData, *extendedSpatialId) + } + result, err := ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs( + testCase.request, + ) + if err != nil { + t.Fatal(err) + } + if reflect.DeepEqual(expectedData, result) == false { + // t.Error(result): + t.Errorf("expected: %v result: %v", expectedData, result) + } else { + t.Log("Success", result) + } + } + +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example1(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 3}}, + 3, + 3, + 2, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/25/1"}, + 20, + 3, + 3, + 2, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example2(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 2}}, + 2, + 3, + 2, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/25/3"}, + 20, + 2, + 3, + 2, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example3(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 2}, {7432012031, 3}}, + 3, + 3, + 2, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/24/0"}, + 20, + 3, + 3, + 2, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example4(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 0}, {7432012031, 1}, {7432012031, 2}, {7432012031, 3}}, + 25, + 23, + -1, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/25/1"}, + 20, + 25, + 23, + -1, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example5(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 0}}, + 23, + 25, + -1, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/25/1"}, + 20, + 23, + 25, + -1, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example6(t *testing.T) { + expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( // 例6 + 20, + [][2]int64{{7432012031, 0}}, + 23, + 25, + -1, + ), + } + + result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( + []string{"20/85263/65423/25/4"}, + 20, + 23, + 25, + -1, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertSpatialIdsToQuadkeysAndVerticalIDs(t *testing.T) { + quadkeyAndVerticalIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID := object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 1023}, {29728048125, 1023}, {29728048126, 1023}, {29728048127, 1023}}, 10, 500, 0) + quadkeyAndVerticalIDs = append(quadkeyAndVerticalIDs, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDsUpup := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 2047}, {29728048125, 2047}, {29728048126, 2047}, {29728048127, 2047}}, 11, 500, 0) + quadkeyAndVerticalIDsUpup = append(quadkeyAndVerticalIDsUpup, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDsDwdw := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 511}}, 9, 500, 0) + quadkeyAndVerticalIDsDwdw = append(quadkeyAndVerticalIDsDwdw, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDsDwup := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 2047}}, 11, 500, 0) + quadkeyAndVerticalIDsDwup = append(quadkeyAndVerticalIDsDwup, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDsSpatialIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 112}, {29728048124, 113}, {29728048125, 112}, {29728048125, 113}, {29728048126, 112}, {29728048126, 113}, {29728048127, 112}, {29728048127, 113}}, 21, 0, 0) + quadkeyAndVerticalIDsSpatialIDs = append(quadkeyAndVerticalIDsSpatialIDs, newQuadkeyAndVerticalID) + quadkeyAndVerticalIDsSpatialIDsUpdw := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 28}, {29728048125, 28}, {29728048126, 28}, {29728048127, 28}}, 19, 0, 0) + quadkeyAndVerticalIDsSpatialIDsUpdw = append(quadkeyAndVerticalIDsSpatialIDsUpdw, newQuadkeyAndVerticalID) + quadkeyAndVerticalIDsSpatialIDsDwup := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 112}, {1858003007, 113}}, 21, 0, 0) + quadkeyAndVerticalIDsSpatialIDsDwup = append(quadkeyAndVerticalIDsSpatialIDsDwup, newQuadkeyAndVerticalID) + quadkeyAndVerticalIDsSpatialIDsDwdw := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 28}}, 19, 0, 0) + quadkeyAndVerticalIDsSpatialIDsDwdw = append(quadkeyAndVerticalIDsSpatialIDsDwdw, newQuadkeyAndVerticalID) + + quadkeyAndVerticalIDsHBorders1 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(1, [][2]int64{{0, 56}}, 26, 0, 0) + quadkeyAndVerticalIDsHBorders1 = append(quadkeyAndVerticalIDsHBorders1, newQuadkeyAndVerticalID) + quadkeyAndVerticalIDsHBorders31 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 0}}, 10, 500, 0) + quadkeyAndVerticalIDsHBorders31 = append(quadkeyAndVerticalIDsHBorders31, newQuadkeyAndVerticalID) + + // quadkeyAndVerticalIDsValueE := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} + // newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) + // quadkeyAndVerticalIDsValueE = append(quadkeyAndVerticalIDsValueE, newQuadkeyAndVerticalID) + + _, err := strconv.ParseInt("test", 10, 64) + datas := []struct { + spatialIds []string + ToHZoom int64 + ToVZoom int64 + maxHeight float64 + minHeight float64 + result []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID + resultLength int + pattern int64 // 0:正常 1:異常 2:個数(水平) 3:個数(垂直) + e error + }{ + // 正常 + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 21, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, pattern: 0}, //all1 + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 21, ToVZoom: 11, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsUpup, pattern: 0}, //all1 + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 19, ToVZoom: 9, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsDwdw, pattern: 0}, //all1 + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 19, ToVZoom: 11, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsDwup, pattern: 0}, //all1 + + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 21, ToVZoom: 21, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDs, pattern: 0}, + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 21, ToVZoom: 19, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDsUpdw, pattern: 0}, + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 19, ToVZoom: 21, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDsDwup, pattern: 0}, + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 19, ToVZoom: 19, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDsDwdw, pattern: 0}, + + // 水平精度個数確認 低精度は1、高精度は精度差^4 + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 24, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 256, pattern: 2}, + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 2, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 1, pattern: 2}, + // 水平精度境界値 + {spatialIds: []string{"20/0/85263/65423"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders1, resultLength: 66, pattern: 2}, + {spatialIds: []string{"35/0/85263/65423"}, ToHZoom: 31, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders31, pattern: 0}, + + // 垂直精度境界値 + {spatialIds: []string{"20/0/85263/65423"}, ToHZoom: 21, ToVZoom: 0, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, + {spatialIds: []string{"20/0/85263/65423"}, ToHZoom: 21, ToVZoom: 1, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, + + // 異常系(精度エラー) + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 0, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 20, ToVZoom: -1, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"35/56/85263/65423"}, ToHZoom: 32, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 20, ToVZoom: 36, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + {spatialIds: []string{"36/56/85263/65423"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + + // 異常系(高度エラー) + {spatialIds: []string{"20/56/85263/65423"}, ToHZoom: 1, ToVZoom: 10, maxHeight: -500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, + // 異常系(入力エラー) + {spatialIds: []string{"20/56/test/65423"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, err.Error())}, + } + for _, p := range datas { + result, e := ConvertSpatialIDsToQuadkeysAndVerticalIDs(p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight) + if p.pattern == 0 && !SortCheck(result, p.result) { + t.Log(t.Name()) + t.Errorf("ConvertSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, p.result[0], result[0]) + } + if p.pattern == 1 && e != p.e { + t.Log(t.Name()) + t.Errorf("ConvertSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, e, p.e) + } + + if p.pattern == 2 && p.resultLength != len(result[0].InnerIDList()) { + t.Log(t.Name()) + t.Errorf("ConvertSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) + } + if p.pattern == 3 && p.resultLength != len(result[0].InnerIDList()) { + t.Log(t.Name()) + t.Errorf("ConvertSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) + } + + } +} + +func SortCheck(r []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID, rt []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID) bool { + // 実行結果とテスト値が一致しない場合、false。それ以外の場合、true + for index, rTmp := range r { + rtTmp := rt[index] + if rtTmp.QuadkeyZoom() != rTmp.QuadkeyZoom() { + return false + } + if rtTmp.VerticalZoom() != rTmp.VerticalZoom() { + return false + } + if rtTmp.MaxHeight() != rTmp.MaxHeight() { + return false + } + if rtTmp.MinHeight() != rTmp.MinHeight() { + return false + } + for _, li := range rTmp.InnerIDList() { + b := false + for _, li2 := range rtTmp.InnerIDList() { + if li2 == li { + b = true + } + } + // テスト値の内部形式IDが関数の実行結果に存在しない場合、false + if !b { + return b + } + } + } + // 最後に到達した場合はTrue + return true +} + +func TestDeleteDuplicationList(t *testing.T) { + datas := []struct { + duplicationList []string + result []string + }{ + {duplicationList: []string{"20/562356/78451/23/956", "20/562356/78451/23/957", "20/562356/78451/23/956", "20/562356/78451/23/957"}, result: []string{"20/562356/78451/23/956", "20/562356/78451/23/957"}}, + } + for _, p := range datas { + result := deleteDuplicationList(p.duplicationList) + sort.Strings(result) + sort.Strings(p.result) + if !reflect.DeepEqual(result, p.result) { + t.Log(t.Name()) + t.Errorf("deleteDuplicationList(%s) == %s, result: %s", p.duplicationList, p.result, result) + } + + } +} + +func TestConvertHorizontalIDToQuadkey(t *testing.T) { + datas := []struct { + horizontalID string + result int64 + }{ + {horizontalID: "20/45621/43566", result: 3448507833}, //"00003031203000312321" + {horizontalID: "26/4562451/2343566", result: 26508024119725}, //"00012001233201113020012231" + {horizontalID: "26/1/2", result: 9}, //"00000000000000000000000021" + {horizontalID: "26/2/1", result: 6}, //"00000000000000000000000012" + {horizontalID: "5/4562451/2343566", result: 429}, //"12231" + ///{horizontalID: "31/2147483647/2147483647", result: 5}, + } + for _, p := range datas { + result := convertHorizontalIDToQuadkey(p.horizontalID) + if result != p.result { + t.Log(t.Name()) + t.Errorf("convertHorizontalIDToQuadkey(%s) == %d, result: %d", p.horizontalID, p.result, result) + } + } +} +func TestConvertQuadkeyToHorizontalID(t *testing.T) { + datas := []struct { + quadkey int64 + zoom int64 + resultX int64 + resultY int64 + }{ + {quadkey: 2914, zoom: 6, resultX: 24, resultY: 53}, //2914-""231202"" + {quadkey: 438, zoom: 6, resultX: 22, resultY: 13}, //438-"012312" + {quadkey: 14628, zoom: 7, resultX: 82, resultY: 100}, //14628-"3210210" + } + for _, p := range datas { + resultX, resultY := convertQuadkeyToHorizontalID(p.quadkey, p.zoom) + if resultX != p.resultX && resultY != p.resultY { + t.Log(t.Name()) + t.Errorf("convertQuadkeyToHorizontalID(%d,%d) == %d,%d, resultX: %d,resultY: %d,", p.quadkey, p.zoom, p.resultX, p.resultY, resultX, resultY) + } + + } +} +func TestConvertVerticallIDToBit(t *testing.T) { + datas := []struct { + vZoom int64 + vIndex int64 + outputZoom int64 + maxHeight float64 + minHeight float64 + result []int64 + }{ + // 正常系 1111−0000すべて + {vZoom: 16, vIndex: 0, outputZoom: 4, maxHeight: 500.0, minHeight: 0.0, result: []int64{15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}}, + // 正常系 bit形式の枠外(正方向) + {vZoom: 13, vIndex: 6, outputZoom: 5, maxHeight: 0.0, minHeight: -500.0, result: []int64{31}}, + // 正常系 bit形式の枠外(負方向) + {vZoom: 13, vIndex: -6, outputZoom: 5, maxHeight: 500.0, minHeight: 0.0, result: []int64{0}}, + {vZoom: 20, vIndex: 0, outputZoom: 8, maxHeight: 500.0, minHeight: -500.0, result: []int64{136, 128, 129, 130, 131, 132, 133, 134, 135}}, + //{vZoom: 35, vIndex: 0, outputZoom: 35, maxHeight: 1.0, minHeight: 0.0, result: []int64{136, 128, 129, 130, 131, 132, 133, 134, 135}}, + } + for _, p := range datas { + result := convertVerticallIDToBit(p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight) + if !reflect.DeepEqual(result, p.result) { + t.Log(t.Name()) + t.Errorf("convertVerticallIDToBit(%d,%d, %d,%f,%f) == %d, result: %d", p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight, p.result, result) + } + + } +} + +func TestCalcBitIndex(t *testing.T) { + datas := []struct { + altitude float64 + outputZoom int64 + maxHeight float64 + minHeight float64 + pattern int64 + result int64 + }{ + // 正常(地表) + {altitude: 256.0, outputZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 524}, + // 正常(桁数補正) + {altitude: 0.0, outputZoom: 10, maxHeight: 256.0, minHeight: -256.0, pattern: 0, result: 512}, + // 正常(地中) + {altitude: -200.0, outputZoom: 10, maxHeight: 0.0, minHeight: -500.0, pattern: 0, result: 614}, + // 正常 All1 + {altitude: 2560.0, outputZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 1023}, + // 正常 All0 + {altitude: -256.0, outputZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 0}, + // 正常 0 + {altitude: -256.0, outputZoom: 1, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 0}, + // 正常 1 + {altitude: 512.0, outputZoom: 1, maxHeight: 500.0, minHeight: 0.0, pattern: 0, result: 1}, + } + for _, p := range datas { + result := calcBitIndex(p.altitude, p.outputZoom, p.maxHeight, p.minHeight) + if result != p.result { + t.Log(t.Name()) + t.Errorf("calcBitIndex(%f, %d,%f,%f) == %d, result: %d", p.altitude, p.outputZoom, p.maxHeight, p.minHeight, p.result, result) + } + } +} + +func TestConvertBitToVerticalID(t *testing.T) { + datas := []struct { + vZoom int64 + vIndex int64 + outputZoom int64 + maxHeight float64 + minHeight float64 + pattern int64 + result []string + }{ + // 正常系 + // 01010101010101010101010101→5592405 + {vZoom: 26, vIndex: 5592405, outputZoom: 26, maxHeight: 500, minHeight: 0, pattern: 0, result: []string{"26/83", "26/83"}}, + {vZoom: 2, vIndex: 4, outputZoom: 25, maxHeight: 500, minHeight: 0, pattern: 1, result: []string{"126", "500", "375"}}, + {vZoom: 26, vIndex: 5592405, outputZoom: 25, maxHeight: 0, minHeight: -500, pattern: 0, result: []string{"25/-459", "25/-459"}}, + // インデックスの補完 + {vZoom: 8, vIndex: 85, outputZoom: 26, maxHeight: 1000, minHeight: 0, pattern: 0, result: []string{"26/671", "26/664", "26/665", "26/666", "26/667", "26/668", "26/669", "26/670"}}, + } + for _, p := range datas { + result := convertBitToVerticalID(p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight) + if p.pattern == 0 { + if !reflect.DeepEqual(result, p.result) { + t.Log(t.Name()) + t.Errorf("convertBitToVerticalID(%d,%d, %d,%f,%f) == %s, result: %s", p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight, p.result, result) + } + } else { + // スライスの長さ,桁数 + length, _ := strconv.Atoi(p.result[0]) + if len(result) != length { + t.Log(t.Name()) + t.Errorf("convertBitToVerticalID(%d,%d, %d,%f,%f) == %s, result: %s", p.vZoom, p.vIndex, p.outputZoom, p.maxHeight, p.minHeight, p.result[0], result) + } + } + } + +} + +func TestQuadkeyCheckZoom(t *testing.T) { + // テストデータのテーブルを定義 + datas := []struct { + HZoom int64 + VZoom int64 + result bool + }{ + {HZoom: 1, VZoom: 12, result: true}, + {HZoom: 2, VZoom: 12, result: true}, + {HZoom: 31, VZoom: 12, result: true}, + {HZoom: 12, VZoom: 0, result: true}, + {HZoom: 12, VZoom: 1, result: true}, + {HZoom: 12, VZoom: 35, result: true}, + {HZoom: 0, VZoom: 12, result: false}, + {HZoom: 32, VZoom: 12, result: false}, + {HZoom: 12, VZoom: -1, result: false}, + {HZoom: 12, VZoom: 36, result: false}, + } + + for _, p := range datas { + result := quadkeyCheckZoom(p.HZoom, p.VZoom) + if result != p.result { + t.Log(t.Name()) + t.Errorf("quadkeyCheckZoom(%d, %d) == %s, result: %s", p.HZoom, p.VZoom, strconv.FormatBool(p.result), strconv.FormatBool(result)) + } + } +} + +func TestSpatialIDCheckZoom(t *testing.T) { + // テストデータのテーブルを定義 + datas := []struct { + HZoom int64 + VZoom int64 + result bool + }{ + {HZoom: 0, VZoom: 12, result: true}, + {HZoom: 1, VZoom: 12, result: true}, + {HZoom: 35, VZoom: 12, result: true}, + {HZoom: 12, VZoom: 0, result: true}, + {HZoom: 12, VZoom: 1, result: true}, + {HZoom: 12, VZoom: 35, result: true}, + {HZoom: -1, VZoom: 12, result: false}, + {HZoom: 36, VZoom: 12, result: false}, + {HZoom: 12, VZoom: -1, result: false}, + {HZoom: 12, VZoom: 36, result: false}, + } + + for _, p := range datas { + result := extendedSpatialIDCheckZoom(p.HZoom, p.VZoom) + if result != p.result { + t.Log(t.Name()) + t.Errorf("extendedSpatialIDCheckZoom(%d, %d) == %s, result: %s", p.HZoom, p.VZoom, strconv.FormatBool(p.result), strconv.FormatBool(result)) + } + } + +} + +func TestConvertZToAltitudekey_1(t *testing.T) { + expected := []int64{400, 401, 402, 403} + + result, error := convertZToAltitudekey( + 100, + 25, + 27, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertZToAltitudekey_2(t *testing.T) { + expected := []int64{50} + + result, error := convertZToAltitudekey( + 100, + 25, + 24, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertZToAltitudekey_3(t *testing.T) { + expected := []int64{100} + + result, error := convertZToAltitudekey( + 100, + 25, + 25, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertZToAltitudekey_4(t *testing.T) { + expected := []int64{53} + + result, error := convertZToAltitudekey( + 100, + 25, + 25, + 25, + -47, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertZToAltitudekey_5(t *testing.T) { + expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") + + result, error := convertZToAltitudekey( + 100, + 25, + 21, + 25, + -272, + ) + if error != expectedError { + t.Fatal(result, error) + } +} + +func TestConvertZToAltitudekey_6(t *testing.T) { + expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") + + result, error := convertZToAltitudekey( + 100, + 25, + 25, + 25, + -512, + ) + if error != expectedError { + t.Fatal(result, error) + } +} + +func TestConvertZToAltitudekey_7(t *testing.T) { + expected := []int64{1000} + + result, error := convertZToAltitudekey( + 28, + 25, + 14, + 25, + 2048000, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertZToAltitudekey_8(t *testing.T) { + expected := []int64{100} + + result, error := convertZToAltitudekey( + 100, + 25, + 24, + 24, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertZToAltitudekey_9(t *testing.T) { + expected := []int64{800, 801, 802, 803, 804, 805, 806, 807} + + result, error := convertZToAltitudekey( + 100, + 25, + 27, + 24, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if !reflect.DeepEqual(result, expected) { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_1(t *testing.T) { + expected := int64(47) + + result, error := convertZToMinAltitudekey( + 0, + 25, + 25, + 25, + 47, + ) + if error != nil { + t.Fatal(error) + } + + if result != expected { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_2(t *testing.T) { + expected := int64(0) + + result, error := convertZToMinAltitudekey( + 0, + 25, + 25, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if result != expected { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_3(t *testing.T) { + expected := int64(0) + + result, error := convertZToMinAltitudekey( + 0, + 25, + 27, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if result != expected { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_4(t *testing.T) { + expected := int64(4) + + result, error := convertZToMinAltitudekey( + 1, + 25, + 27, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if result != expected { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_5(t *testing.T) { + expected := int64(3276800) + + result, error := convertZToMinAltitudekey( + 100, + 10, + 25, + 25, + 0, + ) + if error != nil { + t.Fatal(error) + } + + if result != expected { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_6(t *testing.T) { + expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") + + result, error := convertZToMinAltitudekey( + 100, + 10, + 25, + 25, + -3276801, + ) + if error != expectedError { + t.Fatal(result, error) + } +} + +func TestConvertZToMinAltitudekey_7(t *testing.T) { + expected := int64(24) + + result, error := convertZToMinAltitudekey( + 47, + 25, + 24, + 25, + 2, + ) + if error != nil { + t.Fatal(error) + } + + if result != expected { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_8(t *testing.T) { + expected := int64(2) + + result, error := convertZToMinAltitudekey( + 47, + 25, + 20, + 25, + 32, + ) + if error != nil { + t.Fatal(error) + } + + if result != expected { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_9(t *testing.T) { + expected := int64(12) + + result, error := convertZToMinAltitudekey( + 47, + 25, + 12, + 14, + 4, + ) + if error != nil { + t.Fatal(error) + } + + if result != expected { + t.Fatal(result) + } +} + +func TestConvertZToMinAltitudekey_10(t *testing.T) { + expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") + + result, error := convertZToMinAltitudekey( + -1, + 25, + 25, + 25, + 0, + ) + if error != expectedError { + t.Fatal(result, error) + } +} + +func TestConvertZToMinAltitudekey_11(t *testing.T) { + expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") + + result, error := convertZToMinAltitudekey( + -100, + 25, + 26, + 24, + 51, + ) + if error != expectedError { + t.Fatal(result, error) + } +} From ff8a8380b5650ca761964491d53b4f31f3e6f033 Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Mon, 29 Jul 2024 19:00:00 +0900 Subject: [PATCH 03/25] fixed lack of vertical index when zBaseOffset is not power of 2 in ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs --- transform/convert_quadkey_and_Vertical_id.go | 3 +- .../convert_quadkey_and_Vertical_id_test.go | 72 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index a768647..931b5cf 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -460,6 +460,7 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // 戻り値(エラー) : // // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 +// AltitudeKey高度範囲外:変換前のAltitudeKeyがその垂直ズームレベルにおける高度範囲外である場合。 // 拡張空間ID高度範囲外:変換後の拡張空間ID高度がその垂直ズームレベルにおける高度範囲外である場合。 func ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey) ([]object.ExtendedSpatialID, error) { @@ -513,7 +514,7 @@ func convertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, zZoomL // 3. Calculate outputMinIndex outputZoomDifference := zZoomLevel - 25 outputMinIndex := common.CalculateArithmeticShift(internalMinIndex-zBaseOffset, outputZoomDifference) - outputMaxIndex := outputMinIndex + outputMaxIndex := common.CalculateArithmeticShift(internalMaxIndex-zBaseOffset, outputZoomDifference) if outputZoomDifference > 0 { outputMaxIndex = common.CalculateArithmeticShift(internalMaxIndex-zBaseOffset+1, outputZoomDifference) - 1 } diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 46ad329..b8deab0 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -5,6 +5,7 @@ import ( "reflect" "sort" "strconv" + "strings" "testing" "github.com/trajectoryjp/spatial_id_go/v4/common/errors" @@ -412,6 +413,36 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { 2, )}, }, + { + []string{"20/85263/65423/23/-2"}, + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 0}}, + 23, + 25, + 8, + )}, + }, + { + []string{"20/85263/65423/23/-2", "20/85263/65423/23/-1"}, + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 0}}, + 23, + 25, + 7, + )}, + }, + { + []string{"20/85263/65423/26/6", "20/85263/65423/26/7"}, + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 3}}, + 26, + 25, + -2, + )}, + }, } for _, testCase := range testCases { expectedData := []object.ExtendedSpatialID{} @@ -435,6 +466,47 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { } +func TestErrorConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { + testCases := []struct { + expected string + request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey + }{ + { + "input index does not exist", + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, (1 << zOriginValue) + 1}}, + 25, + 25, + 8, + )}, + }, + { + "output index does not exist", + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, (1 << zOriginValue) - 1}}, + 25, + 25, + -1, + )}, + }, + } + for _, testCase := range testCases { + _, err := ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs( + testCase.request, + ) + if err == nil { + t.Fatal(err) + } + if strings.Contains(err.Error(), testCase.expected) == false { + t.Errorf("expected: %v result: %v", testCase.expected, err) + } else { + t.Log("Success", err) + } + } +} + func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_Example1(t *testing.T) { expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( From 74b6a07f9422b4b29946245975a2d52443626085 Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Tue, 30 Jul 2024 20:15:44 +0900 Subject: [PATCH 04/25] added examples to ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs for documentation --- transform/convert_quadkey_and_Vertical_id.go | 60 ++++++++++++++++++- .../convert_quadkey_and_Vertical_id_test.go | 10 ++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 931b5cf..092eceb 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -20,8 +20,11 @@ var ( zOriginValue int64 = 25 ) +// FromExtendedSpatialIDToQuadkeyAndAltitudekey.innerIDの並び順 const ( - quadkeyIndex = 0 + // quadkeyはinnerID[0] + quadkeyIndex = 0 + // altitudekeyがinnerID[1] altitudekeyIndex = 1 ) @@ -451,7 +454,7 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // AltitudeKeyから拡張空間ID垂直インデックス(f)へは高度変換が用いられ変化する。 // 引数 : // -// request : 変換対象のromExtendedSpatialIDToQuadkeyAndAltitudekey構造体のスライス +// request : 変換対象のFromExtendedSpatialIDToQuadkeyAndAltitudekey構造体のスライス // // 戻り値 : // @@ -462,6 +465,59 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 // AltitudeKey高度範囲外:変換前のAltitudeKeyがその垂直ズームレベルにおける高度範囲外である場合。 // 拡張空間ID高度範囲外:変換後の拡張空間ID高度がその垂直ズームレベルにおける高度範囲外である場合。 +// +// 補足事項: +// +// 高さについて: +// AltitudeKeys形式と拡張空間ID形式垂直インデックスは高度基準が異なる(同じにすることも可能) +// FromExtendedSpatialIDToQuadkeyAndAltitudekey構造体でデータと高度基準を定義する +// 構造体内のデータが次の状態のとき、入力AltitudeKeyに対して出力拡張空間ID垂直インデックス数が増加する +// - altitudekeyZoomがzBaseExponentまたは25(空間IDの高度基準におけるzBaseExponent)より大きい場合 +// - zBaseOffsetが2のべき乗でない場合 +// +// 変換利用例: +// +// 1. 入力altitudekeyが出力拡張空間ID垂直インデックスに対応する場合 +// +// []FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +// { +// quadkeyZoom : 20 +// innerIDList : [[7432012031,0]] +// altitudekeyZoom : 23 +// zBaseExponent : 25 +// zBaseOffset : 8 +// } +// } +// +// extendedSpatialIDs :["20/85263/65423/23/-2"] +// +// 2. altitudekeyZoomが25より大きい場合 +// +// []FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +// { +// quadkeyZoom : 20 +// innerIDList : [[7432012031,3]] +// altitudekeyZoom : 26 +// zBaseExponent : 25 +// zBaseOffset : -2 +// } +// } +// +// extendedSpatialIDs :["20/85263/65423/26/7", "20/85263/65423/26/7] +// +// 3. zBaseOffsetが2のべき乗でない場合 +// +// []FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +// { +// quadkeyZoom : 20 +// innerIDList : [[7432012031,0]] +// altitudekeyZoom : 23 +// zBaseExponent : 25 +// zBaseOffset : 7 +// } +// } +// +// extendedSpatialIDs :["20/85263/65423/23/-2", "20/85263/65423/23/-1"] func ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey) ([]object.ExtendedSpatialID, error) { extendedSpatialIDs := []object.ExtendedSpatialID{} diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index b8deab0..5567ce4 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -443,6 +443,16 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { -2, )}, }, + { + []string{"20/85263/65423/23/0", "20/85263/65423/23/1"}, + []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( + 20, + [][2]int64{{7432012031, 0}}, + 23, + 25, + -1, + )}, + }, } for _, testCase := range testCases { expectedData := []object.ExtendedSpatialID{} From 8e5b8f1a1c170f2658a8069fdf0c9f6f0609c47b Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Wed, 31 Jul 2024 19:47:35 +0900 Subject: [PATCH 05/25] added documentation of ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs --- documentation/convesion.md | 122 +++++++++++++++++++++++ documentation/image/tilekey-standard.png | Bin 0 -> 139607 bytes 2 files changed, 122 insertions(+) create mode 100644 documentation/convesion.md create mode 100644 documentation/image/tilekey-standard.png diff --git a/documentation/convesion.md b/documentation/convesion.md new file mode 100644 index 0000000..25e252e --- /dev/null +++ b/documentation/convesion.md @@ -0,0 +1,122 @@ +# 空間ID変換関数 + +`transform/convert_quadkey_and_Vertical_id.go`内にある各種変換関数の利用方法を記載 + +## ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs + +Quadkey+AltitudeKey空間のボクセルを拡張空間IDに変換する + +変換時、QuadKeyはx,yインデックスにデコードされるのみである +しかしAltitudeKeyは変換によって元の値に近い垂直方向拡張空間インデックスに変換される + +これはAltitudeKeyと拡張空間IDの間ではボクセルのインデックス付番や0番の位置の基準を変更されているためである + +この基準とデータをまとめて示すために 構造体`FromExtendedSpatialIDToQuadkeyAndAltitudekey`を入力として扱う + +```go +[]FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + { + quadkeyZoom : 20 + innerIDList : [[7432012031,0]] // [[quadkey, alatitudekey],...] + altitudekeyZoom : 23 + zBaseExponent : 25 + zBaseOffset : -1 + } +} +``` + +ここで構造体フィールドには次のような値を利用する(fig.1) + +- `quadkeyZoom` 水平方向ズームレベル +- `innerIDList` 実際の値: QuadKeyと高度キーの組を配列にしたもの +- `altitudekeyZoom` 垂直方向ズームレベル +- `zBaseExponent` 高度キー1つの実際の高さが1mになるズームレベル +- `zBaseOffset` 高度キー0番に対応する空間ID垂直インデックス + - ここでは高度キー0番のズームレベルを`zBaseExponent`で扱う + +![fig.1](./image/tilekey-standard.png) +
fig1. FromExtendedSpatialIDToQuadkeyAndAltitudekeyで用いる値
+ +出力は拡張空間ID文字列になる +上記の入力は以下の文字列配列として出力される + +``` +["20/85263/65423/23/-2"] +``` + +上記の例では入力と出力は1:1であるが、この変換では1:Nに変換されることがある + +その条件は次のどちらか + +1. `altitudekeyZoom`が`zBaseExponent`または25(これは空間IDの高度基準における`zBaseExponent`である)より大きい場合 +2. `zBaseOffset`が2のべき乗でない場合 + +また、変換の前後でAltitudeKeyにそのズームレベルで存在しないインデックスが現れた場合エラーとなる +この際変換は失敗となり、変換後のデータはnilとなる + +### 変換例 + +#### 1. 入力altitudekeyが出力拡張空間ID垂直インデックスに対応する場合 + +変換前 + +``` +[]FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + { + quadkeyZoom : 20 + innerIDList : [[7432012031,0]] + altitudekeyZoom : 23 + zBaseExponent : 25 + zBaseOffset : 8 + } +} +``` + +変換後 + +``` +extendedSpatialIDs :["20/85263/65423/23/-2"] +``` + +#### 2. altitudekeyZoomが25より大きい場合 + +変換前 + +``` +[]FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + { + quadkeyZoom : 20 + innerIDList : [[7432012031,3]] + altitudekeyZoom : 26 + zBaseExponent : 25 + zBaseOffset : -2 + } +} +``` + +変換後 + +extendedSpatialIDs :["20/85263/65423/26/7", "20/85263/65423/26/7] + +#### 3. zBaseOffsetが2のべき乗でない場合 + +変換前 + +``` +[]FromExtendedSpatialIDToQuadkeyAndAltitudekey{ + { + quadkeyZoom : 20 + innerIDList : [[7432012031,0]] + altitudekeyZoom : 23 + zBaseExponent : 25 + zBaseOffset : 7 + } +} +``` + +変換後 + +``` +extendedSpatialIDs :["20/85263/65423/23/-2", "20/85263/65423/23/-1"] +``` + diff --git a/documentation/image/tilekey-standard.png b/documentation/image/tilekey-standard.png new file mode 100644 index 0000000000000000000000000000000000000000..ce54c44ffa3c5505ec85ab79adf181a262b98697 GIT binary patch literal 139607 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 Date: Fri, 2 Aug 2024 19:18:07 +0900 Subject: [PATCH 06/25] make public altitude conversion --- transform/convert_quadkey_and_Vertical_id.go | 62 ++++++++++- .../convert_quadkey_and_Vertical_id_test.go | 103 ++++++++++++++++-- 2 files changed, 150 insertions(+), 15 deletions(-) diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 092eceb..2a71362 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -410,7 +410,7 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str } // B. convert vertical IDs to fit Output Vertical Zoom Level - altitudeKeys, error = convertZToAltitudekey(currentID.Z(), currentID.VZoom(), outputAltitudekeyZoom, zBaseExponent, zBaseOffset) + altitudeKeys, error = ConvertZToAltitudekey(currentID.Z(), currentID.VZoom(), outputAltitudekeyZoom, zBaseExponent, zBaseOffset) if error != nil { return nil, error } @@ -527,7 +527,7 @@ func ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(request []*object.FromEx quadKey := qa[quadkeyIndex] altitudeKey := qa[altitudekeyIndex] - zMin, zMax, err := convertAltitudeKeyToZ(altitudeKey, r.AltitudekeyZoom(), r.AltitudekeyZoom(), r.ZBaseExponent(), r.ZBaseOffset()) + zMin, zMax, err := ConvertAltitudeKeyToZ(altitudeKey, r.AltitudekeyZoom(), r.AltitudekeyZoom(), r.ZBaseExponent(), r.ZBaseOffset()) if err != nil { return nil, err } @@ -548,7 +548,32 @@ func ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(request []*object.FromEx return extendedSpatialIDs, nil } -func convertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, zZoomLevel int64, zBaseExponent int64, zBaseOffset int64) (int64, int64, error) { +// ConvertAltitudeKeyToZ altitudekeyを(拡張)空間IDのz成分に高度変換する。 +// +// 変換前と変換後の精度差によって出力されるaltitudekeyの個数は増減する。 +// +// 引数 : +// +// altitudekey : 変換前のaltitudekeyの値 +// +// altitudekeyZoom : 変換前のaltitudekeyの精度指定 +// +// outputZoom : 変換対象の拡張空間ID垂直精度の指定 +// +// zBaseExponent : 変換対象の拡張空間IDの高さが1mとなるズームレベル +// +// zBaseOffset : ズームレベルがzBaseExponentのとき、高度0mにおける拡張空間IDの垂直インデックス値 +// +// 戻り値 : +// +// 変換後のaltitudekeyのスライス +// +// 戻り値(エラー) : +// +// 以下の条件に当てはまる場合、エラーインスタンスが返却される。 +// 入力インデックス不正 :inputIndexにそのズームレベル(inputZoom)で存在しないインデックス値が入力されていた場合。 +// 出力インデックス不正 :出力altitudekeyが出力ズームレベル(outputZoom)で存在しないインデックス値になった場合。 +func ConvertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) (int64, int64, error) { // 1. check that the input index exists in the input system inputResolution := common.CalculateArithmeticShift(1, altitudekeyZoomLevel) @@ -568,7 +593,7 @@ func convertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, zZoomL internalMaxIndex = common.CalculateArithmeticShift(altitudekey+1, zoomDifference) - 1 } // 3. Calculate outputMinIndex - outputZoomDifference := zZoomLevel - 25 + outputZoomDifference := outputZoom - 25 outputMinIndex := common.CalculateArithmeticShift(internalMinIndex-zBaseOffset, outputZoomDifference) outputMaxIndex := common.CalculateArithmeticShift(internalMaxIndex-zBaseOffset, outputZoomDifference) if outputZoomDifference > 0 { @@ -576,7 +601,7 @@ func convertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, zZoomL } // 4. Check to make sure outputMinIndex exists in the output system - outputResolution := common.CalculateArithmeticShift(1, zZoomLevel) + outputResolution := common.CalculateArithmeticShift(1, outputZoom) maxOutputIndex := outputResolution - 1 minOutputIndex := -outputResolution @@ -822,7 +847,32 @@ func convertVerticallIDToBit(vZoom int64, vIndex int64, outputZoom int64, maxHei } -func convertZToAltitudekey(inputIndex int64, inputZoom int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) ([]int64, error) { +// ConvertZToAltitudekey (拡張)空間IDのz成分をaltitudekeyに高度変換する。 +// +// 変換前と変換後の精度差によって出力されるaltitudekeyの個数は増減する。 +// +// 引数 : +// +// inputIndex : 変換対象の(拡張)空間IDのz成分(fインデックス) +// +// inputZoom : 変換対象の(拡張)空間IDのズームレベル(zインデックス) +// +// outputZoom : 変換後のaltitudekeyの精度指定 +// +// zBaseExponent : 変換後のaltitudekeyの高さが1mとなるズームレベル +// +// zBaseOffset : ズームレベルがzBaseExponentのとき、高度0mにおけるaltitudekeyのインデックス値 +// +// 戻り値 : +// +// 変換後のaltitudekeyのスライス +// +// 戻り値(エラー) : +// +// 以下の条件に当てはまる場合、エラーインスタンスが返却される。 +// 入力インデックス不正 :inputIndexにそのズームレベル(inputZoom)で存在しないインデックス値が入力されていた場合。 +// 出力インデックス不正 :出力altitudekeyが出力ズームレベル(outputZoom)で存在しないインデックス値になった場合。 +func ConvertZToAltitudekey(inputIndex int64, inputZoom int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) ([]int64, error) { var ( outputIndexes []int64 diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 5567ce4..3a0035d 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -1039,7 +1039,7 @@ func TestSpatialIDCheckZoom(t *testing.T) { func TestConvertZToAltitudekey_1(t *testing.T) { expected := []int64{400, 401, 402, 403} - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 100, 25, 27, @@ -1058,7 +1058,7 @@ func TestConvertZToAltitudekey_1(t *testing.T) { func TestConvertZToAltitudekey_2(t *testing.T) { expected := []int64{50} - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 100, 25, 24, @@ -1077,7 +1077,7 @@ func TestConvertZToAltitudekey_2(t *testing.T) { func TestConvertZToAltitudekey_3(t *testing.T) { expected := []int64{100} - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 100, 25, 25, @@ -1096,7 +1096,7 @@ func TestConvertZToAltitudekey_3(t *testing.T) { func TestConvertZToAltitudekey_4(t *testing.T) { expected := []int64{53} - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 100, 25, 25, @@ -1115,7 +1115,7 @@ func TestConvertZToAltitudekey_4(t *testing.T) { func TestConvertZToAltitudekey_5(t *testing.T) { expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 100, 25, 21, @@ -1130,7 +1130,7 @@ func TestConvertZToAltitudekey_5(t *testing.T) { func TestConvertZToAltitudekey_6(t *testing.T) { expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 100, 25, 25, @@ -1145,7 +1145,7 @@ func TestConvertZToAltitudekey_6(t *testing.T) { func TestConvertZToAltitudekey_7(t *testing.T) { expected := []int64{1000} - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 28, 25, 14, @@ -1164,7 +1164,7 @@ func TestConvertZToAltitudekey_7(t *testing.T) { func TestConvertZToAltitudekey_8(t *testing.T) { expected := []int64{100} - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 100, 25, 24, @@ -1183,7 +1183,7 @@ func TestConvertZToAltitudekey_8(t *testing.T) { func TestConvertZToAltitudekey_9(t *testing.T) { expected := []int64{800, 801, 802, 803, 804, 805, 806, 807} - result, error := convertZToAltitudekey( + result, error := ConvertZToAltitudekey( 100, 25, 27, @@ -1395,3 +1395,88 @@ func TestConvertZToMinAltitudekey_11(t *testing.T) { t.Fatal(result, error) } } + +func TestConvertAltitudeKeyToZ(t *testing.T) { + type args struct { + altitudekey int64 + altitudekeyZoomLevel int64 + outputZoomLevel int64 + zBaseExponent int64 + zBaseOffset int64 + } + tests := []struct { + name string + args args + minZ int64 + maxZ int64 + wantErr bool + }{ + { + name: "altitudekey must be offset converted", + args: args{ + altitudekey: 0, + altitudekeyZoomLevel: 23, + outputZoomLevel: 23, + zBaseExponent: 23, + zBaseOffset: 8, + }, + minZ: -2, + maxZ: -2, + wantErr: false, + }, + { + name: "altitudekey must be zoom level converted", + args: args{ + altitudekey: 0, + altitudekeyZoomLevel: 23, + outputZoomLevel: 22, + zBaseExponent: 25, + zBaseOffset: -2, + }, + minZ: 0, + maxZ: 0, + wantErr: false, + }, + { + name: "minZ and maxZ must be different when zBaseOffset is not power of 2", + args: args{ + altitudekey: 0, + altitudekeyZoomLevel: 23, + outputZoomLevel: 23, + zBaseExponent: 25, + zBaseOffset: 7, + }, + minZ: -2, + maxZ: -1, + wantErr: false, + }, + { + name: "minZ and maxZ must be different when outputZoom or altitudekeyZoomLevel is greater than zBaseExponent", + args: args{ + altitudekey: 3, + altitudekeyZoomLevel: 26, + outputZoomLevel: 26, + zBaseExponent: 25, + zBaseOffset: -2, + }, + minZ: 6, + maxZ: 7, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotMinZ, gotMaxZ, err := ConvertAltitudeKeyToZ(tt.args.altitudekey, tt.args.altitudekeyZoomLevel, tt.args.outputZoomLevel, tt.args.zBaseExponent, tt.args.zBaseOffset) + if (err != nil) != tt.wantErr { + t.Errorf("ConvertAltitudeKeyToZ() error = %v, wantErr %v", err, tt.wantErr) + return + } + if gotMinZ != tt.minZ { + t.Errorf("ConvertAltitudeKeyToZ() gotMinZ = %v, minZ %v", gotMinZ, tt.minZ) + } + if gotMaxZ != tt.maxZ { + t.Errorf("ConvertAltitudeKeyToZ() gotMaxZ = %v, maxZ %v", gotMaxZ, tt.maxZ) + } + }) + } +} From 08c980c9588a388670109923641faf916daa5de1 Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Thu, 8 Aug 2024 21:02:19 +0900 Subject: [PATCH 07/25] added docs about current converting functions --- documentation/convesion.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/documentation/convesion.md b/documentation/convesion.md index 25e252e..8f5d310 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -2,6 +2,23 @@ `transform/convert_quadkey_and_Vertical_id.go`内にある各種変換関数の利用方法を記載 +## 変換関数一覧 + +| 変換元 | 変換先 | 対応関数 | 今後の変更予定など備考 | +|-------------|-------------|--------------------------------------------------------|----------------------------------------------------| +| 空間ID | 拡張空間ID | なし | `ConvertSpatialIDsToQuadkeysAndVerticalIDs`が部分的に行う | +| 拡張空間ID | 拡張空間ID | なし | `ConvertQuadkeysAndVerticalIDsToSpatialIDs`が部分的に行う | +| 拡張空間ID | XYZKeys | なし | `ConvertExtendedSpatialIDsToXYZKeys()`に実装予定 | +| XYZKeys | 拡張空間ID | なし | `ConvertXYZkeysToExtendedSpatialIDs()`に実装予定 | +| 3Dtilekey | 拡張空間ID | `ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs()` | Pull Request#27のもの 廃止する | +| 拡張空間ID | 3Dtilekey | `ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys()` | 廃止予定 | +| 一次元インデックス | 一次元変換インデックス | `ConvertZToAltitudekey()` | `TransformIndexCoordinate()`にリネーム予定 | +| 一次元変換インデックス | 一次元インデックス | `ConvertAltitudeKeyToZ()` | `InverseTransformIndexCoordinate()`にリネーム予定 | +| Key | 拡張空間ID | `ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs()` | 廃止予定 | +| Key | 空間ID | `ConvertQuadkeysAndVerticalIDsToSpatialIDs()` | 廃止予定 | +| 空間ID | Key | `ConvertSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | +| 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | + ## ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs Quadkey+AltitudeKey空間のボクセルを拡張空間IDに変換する From a064f23315bb3fadbefe965592f82964a0f9ae3a Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Mon, 12 Aug 2024 14:54:41 +0900 Subject: [PATCH 08/25] changed `ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs()` into `ConvertTileXYZToExtendedSpatialIDs()` not to using Quadkey --- common/consts/consts.go | 10 + common/object/id_object.go | 194 +++++++++++++++++ documentation/convesion.md | 4 +- transform/convert_quadkey_and_Vertical_id.go | 127 ++++++----- .../convert_quadkey_and_Vertical_id_test.go | 205 +++++++++++++----- 5 files changed, 425 insertions(+), 115 deletions(-) diff --git a/common/consts/consts.go b/common/consts/consts.go index 61f564c..9cf6dd0 100644 --- a/common/consts/consts.go +++ b/common/consts/consts.go @@ -6,3 +6,13 @@ const OrthCrs = 3857 // OrthCrs 直交座標系のEPSGコード const SpatialIDDelimiter = "/" // SpatialIDDelimiter 空間IDの区切り文字 const Minima = 1e-10 // Minima 浮動小数点誤差 + +const MaxTileXYZZoom = 35 // MaxTileXYZZoom TileXYZにおける最大ズームレベル(水平、垂直共通) + +// FromExtendedSpatialIDToQuadkeyAndAltitudekey.innerIDの並び順 +const ( + // InnerIDQuadkeyIndex quadkeyはinnerID[0] + InnerIDQuadkeyIndex = 0 + // InnerIDAltitudekeyIndex altitudekeyはinnerID[1] + InnerIDAltitudekeyIndex = 1 +) diff --git a/common/object/id_object.go b/common/object/id_object.go index b28664b..6144646 100644 --- a/common/object/id_object.go +++ b/common/object/id_object.go @@ -1,6 +1,12 @@ // 拡張空間IDパッケージ package object +import ( + "fmt" + "github.com/trajectoryjp/spatial_id_go/v4/common/consts" + "github.com/trajectoryjp/spatial_id_go/v4/common/errors" +) + // FromExtendedSpatialIDToQuadkeyAndAltitudekey 拡張空間IDから変換したquadkeyとaltitudekeyの組み合わせを管理する構造体 type FromExtendedSpatialIDToQuadkeyAndAltitudekey struct { // quadkeyの精度 @@ -507,3 +513,191 @@ func (qh QuadkeyAndVerticalID) MaxHeight() float64 { func (qh QuadkeyAndVerticalID) MinHeight() float64 { return qh.minHeight } + +// TileXYZ 水平方向TileKey(x,y)と垂直方向TileKey(z)の組み合わせを管理する構造体 +type TileXYZ struct { + // 水平精度 0-(consts.MaxTileXYZZoom)の非負整数 + hZoom uint16 + // x 水平方向key x軸 + x int64 + // y 水平方向key y軸 + y int64 + // 垂直精度 0-(consts.MaxTileXYZZoom)の非負整数 + vZoom uint16 + // 垂直方向key + z int64 +} + +// NewTileXYZ TileXYZ初期化関数 +// +// quadkeyに数値以外が含まれていた場合エラーとなる。 +// +// 引数: +// +// hZoom: 水平ズームレベル +// x: 水平方向xインデックス +// y: 水平方向yインデックス +// vZoom: 垂直ズームレベル +// z: 高さ方向のインデックス +// +// 戻り値: +// +// 初期化したTileXYZオブジェクト +// +// 戻り値(エラー): +// +// 以下の条件に当てはまる場合、エラーインスタンスが返却される。 +// ズームレベル不正:hZoomまたはvZoomに0-(consts.MaxTileXYZZoom)以外の数値が含まれていた場合 +func NewTileXYZ(hZoom uint16, x int64, y int64, vZoom uint16, z int64) (*TileXYZ, error) { + tile := &TileXYZ{} + + // 水平精度設定 + err := tile.SetHZoom(hZoom) + if err != nil { + return nil, err + } + + // X設定 + tile.SetX(x) + // Y設定 + tile.SetY(y) + + // 垂直精度設定 + err = tile.SetVZoom(vZoom) + if err != nil { + return nil, err + } + + // 高さのインデックス設定 + tile.SetZ(z) + + return tile, nil +} + +// SetHZoom 水平精度設定関数 +// +// TileXYZオブジェクトのhZoomを引数の入力値に設定する。 +// +// input 引数: +// +// hZoom:水平精度 +// +// 戻り値(エラー): +// +// 以下の条件に当てはまる場合、エラーインスタンスが返却される。 +// ズームレベル不正:hZoomに0-(consts.MaxTileXYZZoom)以外の数値が含まれていた場合 +func (a *TileXYZ) SetHZoom(hZoom uint16) error { + if !(hZoom <= consts.MaxTileXYZZoom) { + return errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("hZoom must be in 0-%v, but got %v", consts.MaxTileXYZZoom, hZoom)) + } + a.hZoom = hZoom + return nil +} + +// SetX xインデックス設定関数 +// +// TileXYZオブジェクトのxを引数の入力値に設定する。 +// +// input 引数: +// +// x:xインデックス値 +func (a *TileXYZ) SetX(x int64) { + a.x = x +} + +// SetY yインデックス設定関数 +// +// TileXYZオブジェクトのyを引数の入力値に設定する。 +// +// input 引数: +// +// y:yインデックス値 +func (a *TileXYZ) SetY(y int64) { + a.y = y +} + +// SetVZoom 垂直精度設定関数 +// +// TileXYZオブジェクトのvZoomを引数の入力値に設定する。 +// +// input 引数: +// +// vZoom:垂直精度 +// +// 戻り値(エラー): +// +// 以下の条件に当てはまる場合、エラーインスタンスが返却される。 +// ズームレベル不正:はvZoomに0-35以外の数値が含まれていた場合 +func (a *TileXYZ) SetVZoom(vZoom uint16) error { + if !(vZoom <= consts.MaxTileXYZZoom) { + return errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("vZoom must be in 0-%v, but got %v", consts.MaxTileXYZZoom, vZoom)) + } + a.vZoom = vZoom + return nil +} + +// SetZ zインデックス設定関数 +// +// TileXYZオブジェクトのzを引数の入力値に設定する。 +// +// input 引数: +// +// z:zインデックス値 +func (a *TileXYZ) SetZ(z int64) { + a.z = z +} + +// HZoom HZoom設定値取得関数 +// +// TileXYZオブジェクトに設定されているhZoomの値を取得する。 +// +// output 戻り値: +// +// TileXYZオブジェクトに設定されているHZoomの値 +func (a *TileXYZ) HZoom() uint16 { + return a.hZoom +} + +// X x設定値取得関数 +// +// TileXYZオブジェクトに設定されているxの値を取得する。 +// +// output 戻り値: +// +// TileXYZオブジェクトに設定されているxの値 +func (a *TileXYZ) X() int64 { + return a.x +} + +// Y y設定値取得関数 +// +// TileXYZオブジェクトに設定されているyの値を取得する。 +// +// output 戻り値: +// +// TileXYZオブジェクトに設定されているyの値 +func (a *TileXYZ) Y() int64 { + return a.y +} + +// VZoom vZoom設定値取得関数 +// +// TileXYZオブジェクトに設定されているvZoomの値を取得する。 +// +// output 戻り値: +// +// TileXYZオブジェクトに設定されているvZoomの値 +func (a *TileXYZ) VZoom() uint16 { + return a.vZoom +} + +// Z z設定値取得関数 +// +// TileXYZオブジェクトに設定されているzの値を取得する。 +// +// output 戻り値: +// +// TileXYZオブジェクトに設定されているzの値 +func (a *TileXYZ) Z() int64 { + return a.z +} diff --git a/documentation/convesion.md b/documentation/convesion.md index 8f5d310..54462b4 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -8,8 +8,8 @@ |-------------|-------------|--------------------------------------------------------|----------------------------------------------------| | 空間ID | 拡張空間ID | なし | `ConvertSpatialIDsToQuadkeysAndVerticalIDs`が部分的に行う | | 拡張空間ID | 拡張空間ID | なし | `ConvertQuadkeysAndVerticalIDsToSpatialIDs`が部分的に行う | -| 拡張空間ID | XYZKeys | なし | `ConvertExtendedSpatialIDsToXYZKeys()`に実装予定 | -| XYZKeys | 拡張空間ID | なし | `ConvertXYZkeysToExtendedSpatialIDs()`に実装予定 | +| 拡張空間ID | TileXYZ | なし | `ConvertExtendedSpatialIDsToTileXYZ()`に実装予定 | +| TileXYZ | 拡張空間ID | なし | `ConvertTileXYZToExtendedSpatialIDs()`に実装予定 | | 3Dtilekey | 拡張空間ID | `ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs()` | Pull Request#27のもの 廃止する | | 拡張空間ID | 3Dtilekey | `ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys()` | 廃止予定 | | 一次元インデックス | 一次元変換インデックス | `ConvertZToAltitudekey()` | `TransformIndexCoordinate()`にリネーム予定 | diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 2a71362..f4f6348 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -2,11 +2,11 @@ package transform import ( + "fmt" "math" "strconv" "strings" - "github.com/paulmach/orb/maptile" "github.com/trajectoryjp/spatial_id_go/v4/common" "github.com/trajectoryjp/spatial_id_go/v4/common/errors" "github.com/trajectoryjp/spatial_id_go/v4/common/object" @@ -20,14 +20,6 @@ var ( zOriginValue int64 = 25 ) -// FromExtendedSpatialIDToQuadkeyAndAltitudekey.innerIDの並び順 -const ( - // quadkeyはinnerID[0] - quadkeyIndex = 0 - // altitudekeyがinnerID[1] - altitudekeyIndex = 1 -) - // ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs 内部形式IDを拡張空間IDに変換する。 // // 変換後の水平方向のIDはXYZ形式のタイルIDとなる。 @@ -447,14 +439,18 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str return extendedSpatialIDToQuadkeyAndAltitudekey, nil } -// ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs -// QuadKeys+AltitudeKeys形式から拡張空間ID形式へ変換する +// ConvertTileXYZToExtendedSpatialIDs +// TileXYZ形式から拡張空間ID形式へ変換する // -// QuadKeyは同一の意味のまま拡張空間IDのX,Yに変換される -// AltitudeKeyから拡張空間ID垂直インデックス(f)へは高度変換が用いられ変化する。 +// TileXYZのx,yは同一の意味のまま拡張空間IDのX,Yに変換される +// TileXYZのZから拡張空間ID垂直インデックス(f)へは高度変換が用いられ変化する。 // 引数 : // -// request : 変換対象のFromExtendedSpatialIDToQuadkeyAndAltitudekey構造体のスライス +// request : 変換対象のTileXYZ構造体のスライス +// zBaseExponent: zの高さが1mとなるズームレベル +// zBaseOffset: ズームレベルがzBaseExponentのとき高度0mにおけるvZoom +// outputHZoom : 入力値が変換後の拡張空間IDの水平精度となる。拡張空間IDの精度の閾値である 0 ~ 35 の整数値を指定可能。 +// outputVZoom : 入力値が変換後の拡張空間IDの高さの精度となる。拡張空間IDの精度の閾値である 0 ~ 35 の整数値を指定可能。 // // 戻り値 : // @@ -463,85 +459,96 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // 戻り値(エラー) : // // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 -// AltitudeKey高度範囲外:変換前のAltitudeKeyがその垂直ズームレベルにおける高度範囲外である場合。 +// 精度閾値超過(出力精度):出力の水平方向精度、または高さ方向の精度に 0 ~ 35 の整数値以外が入力されていた場合。 +// z高度範囲外:変換前のzがその垂直ズームレベルにおける高度範囲外である場合。 // 拡張空間ID高度範囲外:変換後の拡張空間ID高度がその垂直ズームレベルにおける高度範囲外である場合。 // // 補足事項: // // 高さについて: -// AltitudeKeys形式と拡張空間ID形式垂直インデックスは高度基準が異なる(同じにすることも可能) -// FromExtendedSpatialIDToQuadkeyAndAltitudekey構造体でデータと高度基準を定義する -// 構造体内のデータが次の状態のとき、入力AltitudeKeyに対して出力拡張空間ID垂直インデックス数が増加する -// - altitudekeyZoomがzBaseExponentまたは25(空間IDの高度基準におけるzBaseExponent)より大きい場合 +// TileXYZ形式のzと拡張空間ID形式垂直インデックスは高度基準が異なる(同じにすることも可能) +// 引数のzBaseExponentとzBaseOffsetで高度基準を定義する +// TileXYZ内のデータもしくは引数が次の状態のとき、入力TileXYZ数に対して出力拡張空間ID垂直インデックス数が増加する +// - vZoomがzBaseExponentまたは25(空間IDの高度基準におけるzBaseExponent)より大きい場合 // - zBaseOffsetが2のべき乗でない場合 // // 変換利用例: // -// 1. 入力altitudekeyが出力拡張空間ID垂直インデックスに対応する場合 +// 1. 入力TileXYZのzが出力拡張空間ID垂直インデックスに対応する場合 // -// []FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +// []TileXYZ{ // { -// quadkeyZoom : 20 -// innerIDList : [[7432012031,0]] -// altitudekeyZoom : 23 -// zBaseExponent : 25 -// zBaseOffset : 8 +// hZoom : 20 +// x 85263 +// y 65423 +// vZoom 23 +// z 0 // } -// } +// }, +// zBaseExponent 25, +// zBaseOffset 8, +// outputHZoom 20, +// outputVZoom 23 // // extendedSpatialIDs :["20/85263/65423/23/-2"] // -// 2. altitudekeyZoomが25より大きい場合 +// 2. vZoomが25より大きい場合 // -// []FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +// []TileXYZ{ // { -// quadkeyZoom : 20 -// innerIDList : [[7432012031,3]] -// altitudekeyZoom : 26 -// zBaseExponent : 25 -// zBaseOffset : -2 +// hZoom : 20 +// x 85263 +// y 65423 +// vZoom 26 +// z 3 // } -// } +// }, +// zBaseExponent 25, +// zBaseOffset -2, +// outputHZoom 20, +// outputVZoom 26 // // extendedSpatialIDs :["20/85263/65423/26/7", "20/85263/65423/26/7] // // 3. zBaseOffsetが2のべき乗でない場合 // -// []FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +// []TileXYZ{ // { -// quadkeyZoom : 20 -// innerIDList : [[7432012031,0]] -// altitudekeyZoom : 23 -// zBaseExponent : 25 -// zBaseOffset : 7 +// hZoom : 20 +// x 85263 +// y 65423 +// vZoom 23 +// z 0 // } -// } +// }, +// zBaseExponent 25, +// zBaseOffset 7, +// outputHZoom 20, +// outputVZoom 23 // // extendedSpatialIDs :["20/85263/65423/23/-2", "20/85263/65423/23/-1"] -func ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey) ([]object.ExtendedSpatialID, error) { +func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputHZoom uint16, outputVZoom uint16) ([]object.ExtendedSpatialID, error) { + if !extendedSpatialIDCheckZoom(int64(outputHZoom), int64(outputVZoom)) { + return nil, errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("extendSpatialID zoom level must be in 0-35: hZoom=%v, vZoom=%v", outputHZoom, outputVZoom)) + } extendedSpatialIDs := []object.ExtendedSpatialID{} for _, r := range request { - for _, qa := range r.InnerIDList() { - quadKey := qa[quadkeyIndex] - altitudeKey := qa[altitudekeyIndex] - zMin, zMax, err := ConvertAltitudeKeyToZ(altitudeKey, r.AltitudekeyZoom(), r.AltitudekeyZoom(), r.ZBaseExponent(), r.ZBaseOffset()) - if err != nil { - return nil, err - } - - mapTile := maptile.FromQuadkey(uint64(quadKey), maptile.Zoom(r.QuadkeyZoom())) + zMin, zMax, err := ConvertAltitudeKeyToZ(r.Z(), int64(r.VZoom()), int64(outputVZoom), int64(zBaseExponent), zBaseOffset) + if err != nil { + return nil, err + } - for z := zMin; z <= zMax; z++ { - extendedSpatialID := new(object.ExtendedSpatialID) - extendedSpatialID.SetX(int64(mapTile.X)) - extendedSpatialID.SetY(int64(mapTile.Y)) - extendedSpatialID.SetZ(z) - extendedSpatialID.SetZoom(r.QuadkeyZoom(), r.AltitudekeyZoom()) - extendedSpatialIDs = append(extendedSpatialIDs, *extendedSpatialID) - } + // TODO change x,y with integrate.HorizontalZoom() + for z := zMin; z <= zMax; z++ { + extendedSpatialID := new(object.ExtendedSpatialID) + extendedSpatialID.SetX(r.X()) + extendedSpatialID.SetY(r.Y()) + extendedSpatialID.SetZ(z) + extendedSpatialID.SetZoom(int64(r.HZoom()), int64(outputVZoom)) + extendedSpatialIDs = append(extendedSpatialIDs, *extendedSpatialID) } } diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 3a0035d..a86e57d 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -377,81 +377,146 @@ func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { } } +func newTileXYZ(t *testing.T, hZoom uint16, x int64, y int64, vZoom uint16, z int64) *object.TileXYZ { + t.Helper() + xyz, err := object.NewTileXYZ(hZoom, x, y, vZoom, z) + if err != nil { + t.Fatal(err) + } + return xyz +} + func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { + type argSet struct { + tile []*object.TileXYZ + zBaseExponent uint16 + zBaseOffset int64 + outputHZoom uint16 + outputVZoom uint16 + } testCases := []struct { expected []string - request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey + request argSet }{ { // hZoom/x/y/vZoom/z []string{"20/85263/65423/23/-2"}, - []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 0}}, - 23, + argSet{ + []*object.TileXYZ{newTileXYZ( + t, + 20, + 85263, + 65423, + 23, + 0, + )}, 23, 8, - )}, + 20, + 23, + }, }, { []string{"20/85263/65423/25/1"}, - []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 3}}, - 25, + argSet{ + []*object.TileXYZ{newTileXYZ( + t, + 20, + 85263, + 65423, + 25, + 3, + )}, 25, 2, - )}, + 20, + 25, + }, }, { []string{"20/85263/65423/3/0"}, - []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 3}}, - 3, + argSet{ + []*object.TileXYZ{newTileXYZ( + t, + 20, + 85263, + 65423, + 3, + 3, + )}, 3, 2, - )}, + 20, + 3, + }, }, { []string{"20/85263/65423/23/-2"}, - []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 0}}, - 23, + argSet{ + []*object.TileXYZ{newTileXYZ( + t, + 20, + 85263, + 65423, + 23, + 0, + )}, 25, 8, - )}, + 20, + 23, + }, }, { []string{"20/85263/65423/23/-2", "20/85263/65423/23/-1"}, - []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 0}}, - 23, + argSet{ + []*object.TileXYZ{newTileXYZ( + t, + 20, + 85263, + 65423, + 23, + 0, + )}, 25, 7, - )}, + 20, + 23, + }, }, { []string{"20/85263/65423/26/6", "20/85263/65423/26/7"}, - []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 3}}, - 26, + argSet{ + []*object.TileXYZ{newTileXYZ( + t, + 20, + 85263, + 65423, + 26, + 3, + )}, 25, -2, - )}, + 20, + 26, + }, }, { []string{"20/85263/65423/23/0", "20/85263/65423/23/1"}, - []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 0}}, - 23, + argSet{ + []*object.TileXYZ{newTileXYZ( + t, + 20, + 85263, + 65423, + 23, + 0, + )}, 25, -1, - )}, + 20, + 23, + }, }, } for _, testCase := range testCases { @@ -460,9 +525,7 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { extendedSpatialId, _ := object.NewExtendedSpatialID(testCase.expected[i]) expectedData = append(expectedData, *extendedSpatialId) } - result, err := ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs( - testCase.request, - ) + result, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputHZoom, testCase.request.outputVZoom) if err != nil { t.Fatal(err) } @@ -477,35 +540,71 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { } func TestErrorConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { + type argSet struct { + tile []*object.TileXYZ + zBaseExponent uint16 + zBaseOffset int64 + outputHZoom uint16 + outputVZoom uint16 + } testCases := []struct { expected string - request []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey + request argSet }{ { "input index does not exist", - []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, (1 << zOriginValue) + 1}}, - 25, + argSet{ + []*object.TileXYZ{newTileXYZ( + t, + 20, + 85263, + 65423, + 25, + (1< Date: Fri, 16 Aug 2024 11:34:31 +0900 Subject: [PATCH 09/25] reduce outputHZoom parameter in `ConvertTileXYZToExtendedSpatialIDs()` If horizontal index conversion is needed, use HorizontalZoom alone; because this function does not need horizontal index conversion. --- transform/convert_quadkey_and_Vertical_id.go | 16 ++++++---------- .../convert_quadkey_and_Vertical_id_test.go | 16 ++-------------- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index f4f6348..e56002c 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -442,14 +442,14 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // ConvertTileXYZToExtendedSpatialIDs // TileXYZ形式から拡張空間ID形式へ変換する // -// TileXYZのx,yは同一の意味のまま拡張空間IDのX,Yに変換される +// TileXYZのx,yは同一の意味のまま拡張空間IDのX,Yに変換される。 +// このため出力の水平精度は入力のものが用いられる(ただし精度チェックは行われる)。 // TileXYZのZから拡張空間ID垂直インデックス(f)へは高度変換が用いられ変化する。 // 引数 : // // request : 変換対象のTileXYZ構造体のスライス // zBaseExponent: zの高さが1mとなるズームレベル // zBaseOffset: ズームレベルがzBaseExponentのとき高度0mにおけるvZoom -// outputHZoom : 入力値が変換後の拡張空間IDの水平精度となる。拡張空間IDの精度の閾値である 0 ~ 35 の整数値を指定可能。 // outputVZoom : 入力値が変換後の拡張空間IDの高さの精度となる。拡張空間IDの精度の閾値である 0 ~ 35 の整数値を指定可能。 // // 戻り値 : @@ -487,7 +487,6 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // }, // zBaseExponent 25, // zBaseOffset 8, -// outputHZoom 20, // outputVZoom 23 // // extendedSpatialIDs :["20/85263/65423/23/-2"] @@ -505,7 +504,6 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // }, // zBaseExponent 25, // zBaseOffset -2, -// outputHZoom 20, // outputVZoom 26 // // extendedSpatialIDs :["20/85263/65423/26/7", "20/85263/65423/26/7] @@ -523,25 +521,23 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // }, // zBaseExponent 25, // zBaseOffset 7, -// outputHZoom 20, // outputVZoom 23 // // extendedSpatialIDs :["20/85263/65423/23/-2", "20/85263/65423/23/-1"] -func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputHZoom uint16, outputVZoom uint16) ([]object.ExtendedSpatialID, error) { - if !extendedSpatialIDCheckZoom(int64(outputHZoom), int64(outputVZoom)) { - return nil, errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("extendSpatialID zoom level must be in 0-35: hZoom=%v, vZoom=%v", outputHZoom, outputVZoom)) - } +func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputVZoom uint16) ([]object.ExtendedSpatialID, error) { extendedSpatialIDs := []object.ExtendedSpatialID{} for _, r := range request { + if !extendedSpatialIDCheckZoom(int64(r.HZoom()), int64(outputVZoom)) { + return nil, errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("extendSpatialID zoom level must be in 0-35: hZoom=%v, vZoom=%v", r.HZoom(), outputVZoom)) + } zMin, zMax, err := ConvertAltitudeKeyToZ(r.Z(), int64(r.VZoom()), int64(outputVZoom), int64(zBaseExponent), zBaseOffset) if err != nil { return nil, err } - // TODO change x,y with integrate.HorizontalZoom() for z := zMin; z <= zMax; z++ { extendedSpatialID := new(object.ExtendedSpatialID) extendedSpatialID.SetX(r.X()) diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index a86e57d..ea4b37e 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -391,7 +391,6 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { tile []*object.TileXYZ zBaseExponent uint16 zBaseOffset int64 - outputHZoom uint16 outputVZoom uint16 } testCases := []struct { @@ -412,7 +411,6 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 23, 8, - 20, 23, }, }, @@ -429,7 +427,6 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 25, 2, - 20, 25, }, }, @@ -446,7 +443,6 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 3, 2, - 20, 3, }, }, @@ -463,7 +459,6 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 25, 8, - 20, 23, }, }, @@ -480,7 +475,6 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 25, 7, - 20, 23, }, }, @@ -497,7 +491,6 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 25, -2, - 20, 26, }, }, @@ -514,7 +507,6 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 25, -1, - 20, 23, }, }, @@ -525,7 +517,7 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { extendedSpatialId, _ := object.NewExtendedSpatialID(testCase.expected[i]) expectedData = append(expectedData, *extendedSpatialId) } - result, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputHZoom, testCase.request.outputVZoom) + result, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) if err != nil { t.Fatal(err) } @@ -544,7 +536,6 @@ func TestErrorConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { tile []*object.TileXYZ zBaseExponent uint16 zBaseOffset int64 - outputHZoom uint16 outputVZoom uint16 } testCases := []struct { @@ -564,7 +555,6 @@ func TestErrorConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 25, 8, - 20, 25, }, }, @@ -581,7 +571,6 @@ func TestErrorConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 25, -1, - 20, 25, }, }, @@ -598,13 +587,12 @@ func TestErrorConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { )}, 23, 8, - 200, 230, }, }, } for _, testCase := range testCases { - _, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputHZoom, testCase.request.outputVZoom) + _, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) if err == nil { t.Fatal(err) } From 787a10a2a3fb565443819f7f9933e769f434ee5b Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Fri, 16 Aug 2024 18:33:12 +0900 Subject: [PATCH 10/25] added excluding duplication outputIDs in `ConvertTileXYZToExtendedSpatialIDs()` - tests are renamed(missing older commit) - added `ElementsMatch` for comparing slices without order --- go.mod | 7 ++- go.sum | 60 +++---------------- transform/convert_quadkey_and_Vertical_id.go | 11 +++- .../convert_quadkey_and_Vertical_id_test.go | 45 ++++++++++---- 4 files changed, 54 insertions(+), 69 deletions(-) diff --git a/go.mod b/go.mod index b512407..3ffd1e3 100644 --- a/go.mod +++ b/go.mod @@ -10,11 +10,14 @@ require ( ) require ( - go.mongodb.org/mongo-driver v1.11.4 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/image v0.7.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( - github.com/paulmach/orb v0.11.1 + github.com/stretchr/testify v1.9.0 github.com/trajectoryjp/closest_go v1.0.1 + golang.org/x/exp v0.0.0-20230321023759-10a507213a29 ) diff --git a/go.sum b/go.sum index 1bd2bf0..196541e 100644 --- a/go.sum +++ b/go.sum @@ -1,75 +1,37 @@ -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/go-gl/mathgl v1.1.0 h1:0lzZ+rntPX3/oGrDzYGdowSLC2ky8Osirvf5uAwfIEA= github.com/go-gl/mathgl v1.1.0/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ= -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/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -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/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= -github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= -github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pkg/errors v0.9.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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/trajectoryjp/closest_go v1.0.1 h1:dvshtZzPDwhGDhzn5SVZxlgNnqr/gLp4uIpGDIEOHaU= github.com/trajectoryjp/closest_go v1.0.1/go.mod h1:+iTxW7/pOi0dIqo2/GcqGqWh/fAj2gMjDIiZ+BFDXIc= github.com/trajectoryjp/geodesy_go v1.0.1 h1:FvvnA3kPcPoXOjn6cS27R9aiCLyszOarFuZRVlQRG2s= github.com/trajectoryjp/geodesy_go v1.0.1/go.mod h1:eJuX+ds+t3MKxHG9dhobqNjUbUsYlpTT9XDO0mbc0LU= github.com/wroge/wgs84 v1.1.7 h1:8WVUUrpjysYxrn0ssWX7z90SOUKCuHt9NQ5tg9ovjIY= github.com/wroge/wgs84 v1.1.7/go.mod h1:mc1F8ubW03DO4zaf/006cmhaiMlfvbKmqVAcPuAtsNA= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xieyuschen/deepcopy v1.0.1 h1:nTCnKprCOdibz8WXWlMZzULIlpzZX0ZzKjz8HlGd/Nk= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas= -go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= 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/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= -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/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 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/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/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/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -79,25 +41,17 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 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/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 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/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= -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 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index e56002c..5a7e0d5 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -3,6 +3,7 @@ package transform import ( "fmt" + "golang.org/x/exp/maps" "math" "strconv" "strings" @@ -526,6 +527,7 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // extendedSpatialIDs :["20/85263/65423/23/-2", "20/85263/65423/23/-1"] func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputVZoom uint16) ([]object.ExtendedSpatialID, error) { + extendedSpatialIDsMap := make(map[int64]object.ExtendedSpatialID) extendedSpatialIDs := []object.ExtendedSpatialID{} for _, r := range request { @@ -539,14 +541,21 @@ func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent } for z := zMin; z <= zMax; z++ { + // 重複排除 + if _, exists := extendedSpatialIDsMap[z]; exists { + continue + } extendedSpatialID := new(object.ExtendedSpatialID) extendedSpatialID.SetX(r.X()) extendedSpatialID.SetY(r.Y()) extendedSpatialID.SetZ(z) extendedSpatialID.SetZoom(int64(r.HZoom()), int64(outputVZoom)) - extendedSpatialIDs = append(extendedSpatialIDs, *extendedSpatialID) + extendedSpatialIDsMap[z] = *extendedSpatialID } } + for _, extendedSpatialID := range maps.Values(extendedSpatialIDsMap) { + extendedSpatialIDs = append(extendedSpatialIDs, extendedSpatialID) + } return extendedSpatialIDs, nil } diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index ea4b37e..3b17c32 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -8,6 +8,7 @@ import ( "strings" "testing" + "github.com/stretchr/testify/assert" "github.com/trajectoryjp/spatial_id_go/v4/common/errors" "github.com/trajectoryjp/spatial_id_go/v4/common/object" ) @@ -386,7 +387,16 @@ func newTileXYZ(t *testing.T, hZoom uint16, x int64, y int64, vZoom uint16, z in return xyz } -func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { +func newExtendedSpatialID(t *testing.T, id string) *object.ExtendedSpatialID { + t.Helper() + extendedSpatialId, err := object.NewExtendedSpatialID(id) + if err != nil { + t.Fatal(err) + } + return extendedSpatialId +} + +func TestConvertTileXYZToExtendedSpatialIDs(t *testing.T) { type argSet struct { tile []*object.TileXYZ zBaseExponent uint16 @@ -495,16 +505,25 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { }, }, { - []string{"20/85263/65423/23/0", "20/85263/65423/23/1"}, + []string{"20/85263/65423/23/0", "20/85263/65423/23/1", "20/85263/65423/23/2"}, argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, + []*object.TileXYZ{ + newTileXYZ( + t, + 20, + 85263, + 65423, + 23, + 0, + ), + newTileXYZ( + t, + 20, + 85263, + 65423, + 23, + 1, + )}, 25, -1, 23, @@ -514,14 +533,14 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { for _, testCase := range testCases { expectedData := []object.ExtendedSpatialID{} for i := 0; i < len(testCase.expected); i++ { - extendedSpatialId, _ := object.NewExtendedSpatialID(testCase.expected[i]) + extendedSpatialId := newExtendedSpatialID(t, testCase.expected[i]) expectedData = append(expectedData, *extendedSpatialId) } result, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) if err != nil { t.Fatal(err) } - if reflect.DeepEqual(expectedData, result) == false { + if assert.ElementsMatch(t, expectedData, result) == false { // t.Error(result): t.Errorf("expected: %v result: %v", expectedData, result) } else { @@ -531,7 +550,7 @@ func TestConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { } -func TestErrorConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs(t *testing.T) { +func TestErrorConvertTileXYZToExtendedSpatialIDs(t *testing.T) { type argSet struct { tile []*object.TileXYZ zBaseExponent uint16 From 74ebcc5b7ae768fe3011c3ba7f9b576bee78cb21 Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Fri, 16 Aug 2024 19:51:44 +0900 Subject: [PATCH 11/25] added conversion from extendedSpatialId into SpatialId via `ConvertExtendedSpatialIDsToSpatialIDs` `HorizontalZoom` is refactored for using integer output --- integrate/change_zoom.go | 35 +- transform/convert_quadkey_and_Vertical_id.go | 82 + .../convert_quadkey_and_Vertical_id_test.go | 3210 +++++++++-------- 3 files changed, 1727 insertions(+), 1600 deletions(-) diff --git a/integrate/change_zoom.go b/integrate/change_zoom.go index 8c81f11..6689d83 100644 --- a/integrate/change_zoom.go +++ b/integrate/change_zoom.go @@ -214,6 +214,28 @@ func HorizontalZoom( // 変換後の拡張空間ID格納用のスライス horizontalIDs := []string{} + minXparam, minYparam, maxXparam, maxYparam := HorizontalZoomMinMax(inputZoom, xIndex, yIndex, outputZoom) + + // 変換後の拡張空間IDを定義 + for y := minYparam; y <= maxYparam; y++ { + for x := minXparam; x <= maxXparam; x++ { + horizontalIDs = append( + horizontalIDs, + strconv.FormatInt(outputZoom, 10)+ + "/"+strconv.FormatInt(x, 10)+ + "/"+strconv.FormatInt(y, 10)) + } + } + return horizontalIDs +} + +// HorizontalZoomMinMax 拡張空間IDの水平方向の精度変換関数 +// +// HorizontalZoom() の返却値が最小x,yインデックスと最大x,yインデックスになったもの +// 詳細は HorizontalZoom のドキュメントを参照 +// +// 戻り値の順序:(最小xインデックス, 最小yインデックス, 最大xインデックス, 最大yインデックス) +func HorizontalZoomMinMax(inputZoom int64, xIndex int64, yIndex int64, outputZoom int64) (int64, int64, int64, int64) { // 精度の差異を取得 hZoomDiff := outputZoom - inputZoom @@ -248,18 +270,7 @@ func HorizontalZoom( maxXparam = minXparam maxYparam = minYparam } - - // 変換後の拡張空間IDを定義 - for y := minYparam; y <= maxYparam; y++ { - for x := minXparam; x <= maxXparam; x++ { - horizontalIDs = append( - horizontalIDs, - strconv.FormatInt(outputZoom, 10)+ - "/"+strconv.FormatInt(x, 10)+ - "/"+strconv.FormatInt(y, 10)) - } - } - return horizontalIDs + return minXparam, minYparam, maxXparam, maxYparam } // VerticalZoom 拡張空間IDの垂直方向の精度変換関数 diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 5a7e0d5..50353b9 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -440,6 +440,88 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str return extendedSpatialIDToQuadkeyAndAltitudekey, nil } +// ConvertExtendedSpatialIDsToSpatialIDs 拡張空間IDを空間IDへ変換する +// +// 引数 : +// +// extendedSpatialID : 変換対象の拡張空間ID構造体 +// +// 戻り値 : +// +// 変換後の空間IDのスライス +// +// 補足事項: +// +// 入力拡張空間IDの垂直精度と水平精度の間で差がある場合、差が1増えるごとに4のべき乗で出力空間ID数が増加する。 +// そのため、精度差が大きすぎると変換後の空間ID数は大幅に増大する。 +// 動作環境によってはメモリ不足となる可能性があるため、注意すること。 +// +// 変換利用例: +// 1. 水平精度の方が低い場合 +// 入力 +// ExtendedSpatialID{ +// hZoom: 6, +// x: 24, +// y: 49, +// vZoom: 7, +// z: 0, +// } +// +// 出力 +// []string{"7/0/48/98", "7/0/48/99", "7/0/49/98", "7/0/49/99"} +// +// 2. 垂直精度の方が低い場合 +// 入力 +// ExtendedSpatialID{ +// hZoom: 7, +// x: 24, +// y: 53, +// vZoom: 6, +// z: 24, +// } +// +// 出力 +// []string{"7/48/24/53", "7/49/24/53"} +// +// 3. 水平精度、垂直精度に差がない場合 +// 入力 +// ExtendedSpatialID{ +// hZoom: 6, +// x: 24, +// y: 49, +// vZoom: 6, +// z: 0, +// } +// +// 出力 +// []string{"6/0/24/49"} +func ConvertExtendedSpatialIDsToSpatialIDs(extendedSpatialID *object.ExtendedSpatialID) []string { + spatialIds := []string{} + // 精度が高い方へズームレベルを上げる + switch { + case extendedSpatialID.HZoom() < extendedSpatialID.VZoom(): + targetZoomLevel := extendedSpatialID.VZoom() + xMin, yMin, xMax, yMax := integrate.HorizontalZoomMinMax(extendedSpatialID.HZoom(), extendedSpatialID.X(), extendedSpatialID.Y(), targetZoomLevel) + for x := xMin; x <= xMax; x++ { + for y := yMin; y <= yMax; y++ { + spatialIds = append(spatialIds, fmt.Sprintf("%v/%v/%v/%v", targetZoomLevel, extendedSpatialID.Z(), x, y)) + } + } + case extendedSpatialID.HZoom() > extendedSpatialID.VZoom(): + targetZoomLevel := extendedSpatialID.HZoom() + verticalIds := integrate.VerticalZoom(extendedSpatialID.VZoom(), extendedSpatialID.Z(), targetZoomLevel) + for _, verticalId := range verticalIds { + // "z/f" + "x/y" + spatialIds = append(spatialIds, fmt.Sprintf("%v/%v/%v", verticalId, extendedSpatialID.X(), extendedSpatialID.Y())) + } + // ズームレベルが等しい場合は直接変換可 + case extendedSpatialID.HZoom() == extendedSpatialID.VZoom(): + spatialId := fmt.Sprintf("%v/%v/%v/%v", extendedSpatialID.HZoom(), extendedSpatialID.Z(), extendedSpatialID.X(), extendedSpatialID.Y()) + spatialIds = append(spatialIds, spatialId) + } + return spatialIds +} + // ConvertTileXYZToExtendedSpatialIDs // TileXYZ形式から拡張空間ID形式へ変換する // diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 3b17c32..02318f5 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -1,1588 +1,1622 @@ -// 空間IDパッケージ -package transform - -import ( - "reflect" - "sort" - "strconv" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/trajectoryjp/spatial_id_go/v4/common/errors" - "github.com/trajectoryjp/spatial_id_go/v4/common/object" -) - -func TestConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToHZoom int64 - ToVZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 6, ToVZoom: 20, pattern: 0, result: []string{"6/24/53/20/9", "6/24/49/20/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 7, ToVZoom: 2, pattern: 0, result: []string{"7/48/107/2/0", "7/49/107/2/0", "7/48/98/2/0", "7/49/98/2/0", "7/48/99/2/0", "7/49/99/2/0", "7/48/106/2/0", "7/49/106/2/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 5, ToVZoom: 8, pattern: 0, result: []string{"5/12/26/8/0", "5/12/24/8/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToHZoom: 9, ToVZoom: 2, pattern: 0, result: []string{"9/338/229/2/0"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 0, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 5, ToVZoom: 36, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, e, p.e) - } - } - -} - -func TestConvertQuadkeysAndVerticalIDsToSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 6, pattern: 0, result: []string{"6/0/24/53", "6/0/24/49"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 7, pattern: 0, result: []string{"7/0/48/107", "7/0/49/107", "7/0/48/98", "7/0/49/98", "7/0/48/99", "7/0/49/99", "7/0/48/106", "7/0/49/106"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 5, pattern: 0, result: []string{"5/0/12/26", "5/0/12/24"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToZoom: 9, pattern: 0, result: []string{"9/0/338/229"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToSpatialIDs(p.quadkeyAndVerticalIDs, p.ToZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToSpatialIDs(%+v,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToZoom, e, p.e) - } - } - -} - -func TestConvertExtendedSpatialIdsToQuadkeysAndVerticalIDs(t *testing.T) { - // 結果確認用の構造体を作成する - //"20/85263/65423"→ 00012322332320003333 →7432012031 21:29728048124,29728048125,29728048126,29728048127, - //horizontalID: "20/45621/43566", result: 3448507833}, //"00003031203000312321" - //horizontalID: "26/4562451/2343566", result: 26508024119725}, //"00012001233201113020012231" - //horizontalID: "26/1/2", result: 9}, //"00000000000000000000000021" - //horizontalID: "26/2/1", result: 6}, //"00000000000000000000000012" - //horizontalID: "5/4562451/2343566", result: 429}, //"12231" - - quadkeyAndVerticalIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 58}, {29728048124, 57}, {29728048125, 58}, {29728048125, 57}, {29728048126, 58}, {29728048126, 57}, {29728048127, 58}, {29728048127, 57}}, 10, 500, 0) - quadkeyAndVerticalIDs = append(quadkeyAndVerticalIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsSpatialIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsSpatialIDs = append(quadkeyAndVerticalIDsSpatialIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsHBorders1 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(1, [][2]int64{{0, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsHBorders1 = append(quadkeyAndVerticalIDsHBorders1, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsHBorders31 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - quadkeyAndVerticalIDsHBorders31 = append(quadkeyAndVerticalIDsHBorders31, newQuadkeyAndVerticalID) - - // quadkeyAndVerticalIDsValueE := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - // newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - // quadkeyAndVerticalIDsValueE = append(quadkeyAndVerticalIDsValueE, newQuadkeyAndVerticalID) - - _, err := strconv.ParseInt("test", 10, 64) - datas := []struct { - spatialIds []string - ToHZoom int64 - ToVZoom int64 - maxHeight float64 - minHeight float64 - result []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID - resultLength int - pattern int64 // 0:正常 1:異常 2:個数(水平) 3:個数(垂直) - e error - }{ - // 正常 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 21, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, pattern: 0}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 19, ToVZoom: 26, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDs, pattern: 0}, - - // 水平精度個数確認 低精度は1、高精度は精度差^4 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 24, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 512, pattern: 2}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 2, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 2, pattern: 2}, - // 水平精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders1, resultLength: 2, pattern: 2}, - {spatialIds: []string{"35/85263/65423/26/0"}, ToHZoom: 31, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders31, pattern: 0}, - - // 垂直精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 0, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 1, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - - // 異常系(精度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 0, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 20, ToVZoom: -1, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"35/85263/65423/26/56"}, ToHZoom: 32, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/35/56"}, ToHZoom: 20, ToVZoom: 36, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"36/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/36/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - - // 異常系(高度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: -500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - // 異常系(入力エラー) - {spatialIds: []string{"20/test/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, err.Error())}, - } - for _, p := range datas { - - result, e := ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, p.result[0], result[0]) - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, e, p.e) - } - if p.pattern == 2 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - if p.pattern == 3 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_1(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_2(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 56}, {29728048125, 56}, {29728048126, 56}, {29728048127, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 21, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_3(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 7}}, - 12, - 14, // 2^14 - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_4(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 54}}, - 12, - 14, - 188, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 188, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 12}, {29728048124, 13}, {29728048125, 12}, {29728048125, 13}, {29728048126, 12}, {29728048126, 13}, {29728048127, 12}, {29728048127, 13}}, - 15, - 14, - -50, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/56"}, - 21, - 15, - 14, - -50, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func newTileXYZ(t *testing.T, hZoom uint16, x int64, y int64, vZoom uint16, z int64) *object.TileXYZ { - t.Helper() - xyz, err := object.NewTileXYZ(hZoom, x, y, vZoom, z) - if err != nil { - t.Fatal(err) - } - return xyz -} - -func newExtendedSpatialID(t *testing.T, id string) *object.ExtendedSpatialID { - t.Helper() - extendedSpatialId, err := object.NewExtendedSpatialID(id) - if err != nil { - t.Fatal(err) - } - return extendedSpatialId -} - -func TestConvertTileXYZToExtendedSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected []string - request argSet - }{ - { - // hZoom/x/y/vZoom/z - []string{"20/85263/65423/23/-2"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 23, - 8, - 23, - }, - }, - { - []string{"20/85263/65423/25/1"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 25, - 3, - )}, - 25, - 2, - 25, - }, - }, - { - []string{"20/85263/65423/3/0"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 3, - 3, - )}, - 3, - 2, - 3, - }, - }, - { - []string{"20/85263/65423/23/-2"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 25, - 8, - 23, - }, - }, - { - []string{"20/85263/65423/23/-2", "20/85263/65423/23/-1"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 25, - 7, - 23, - }, - }, - { - []string{"20/85263/65423/26/6", "20/85263/65423/26/7"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 26, - 3, - )}, - 25, - -2, - 26, - }, - }, - { - []string{"20/85263/65423/23/0", "20/85263/65423/23/1", "20/85263/65423/23/2"}, - argSet{ - []*object.TileXYZ{ - newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - ), - newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 1, - )}, - 25, - -1, - 23, - }, - }, - } - for _, testCase := range testCases { - expectedData := []object.ExtendedSpatialID{} - for i := 0; i < len(testCase.expected); i++ { - extendedSpatialId := newExtendedSpatialID(t, testCase.expected[i]) - expectedData = append(expectedData, *extendedSpatialId) - } - result, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) - if err != nil { - t.Fatal(err) - } - if assert.ElementsMatch(t, expectedData, result) == false { - // t.Error(result): - t.Errorf("expected: %v result: %v", expectedData, result) - } else { - t.Log("Success", result) - } - } - -} - -func TestErrorConvertTileXYZToExtendedSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected string - request argSet - }{ - { - "input index does not exist", - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 25, - (1< Date: Mon, 19 Aug 2024 14:54:51 +0900 Subject: [PATCH 12/25] added conversion from TileXYZ into SpatialId via `ConvertTileXYZToSpatialIDs` `ConvertExtendedSpatialIDsToSpatialIDs` is renamed to `ConvertExtendedSpatialIDToSpatialIDs` --- transform/convert_quadkey_and_Vertical_id.go | 51 +- .../convert_quadkey_and_Vertical_id_test.go | 3390 +++++++++-------- 2 files changed, 1817 insertions(+), 1624 deletions(-) diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 50353b9..4a6cb38 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -440,7 +440,7 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str return extendedSpatialIDToQuadkeyAndAltitudekey, nil } -// ConvertExtendedSpatialIDsToSpatialIDs 拡張空間IDを空間IDへ変換する +// ConvertExtendedSpatialIDToSpatialIDs 拡張空間IDを空間IDへ変換する // // 引数 : // @@ -495,7 +495,7 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // // 出力 // []string{"6/0/24/49"} -func ConvertExtendedSpatialIDsToSpatialIDs(extendedSpatialID *object.ExtendedSpatialID) []string { +func ConvertExtendedSpatialIDToSpatialIDs(extendedSpatialID *object.ExtendedSpatialID) []string { spatialIds := []string{} // 精度が高い方へズームレベルを上げる switch { @@ -642,6 +642,53 @@ func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent return extendedSpatialIDs, nil } +// ConvertTileXYZToSpatialIDs +// TileXYZ形式から空間ID形式へ変換する +// ConvertTileXYZToExtendedSpatialIDs と ConvertExtendedSpatialIDToSpatialIDs の組み合わせであるため、詳細はそちらを参照 +// +// TileXYZのx,yは水平精度と垂直精度のうち高い方の空間IDのX,Yに変換される。 +// TileXYZのZから拡張空間ID垂直インデックス(f)へは高度変換が用いられ変化する。 +// +// 引数 : +// +// request : 変換対象のTileXYZ構造体のスライス +// zBaseExponent: zの高さが1mとなるズームレベル +// zBaseOffset: ズームレベルがzBaseExponentのとき高度0mにおけるvZoom +// outputVZoom : 拡張空間ID変換中の拡張空間IDの高さの精度指定。空間ID変換時、水平精度の方が高い場合この値は使われない。拡張空間IDの精度の閾値である 0 ~ 35 の整数値を指定可能。 +// +// 戻り値 : +// +// 変換後の空間IDのスライス +// +// 戻り値(エラー) : +// +// 以下の条件に当てはまる場合、エラーインスタンスが返却される。 +// 精度閾値超過(出力精度):出力の水平方向精度、または高さ方向の精度に 0 ~ 35 の整数値以外が入力されていた場合。 +// z高度範囲外:変換前のzがその垂直ズームレベルにおける高度範囲外である場合。 +// 拡張空間ID高度範囲外:拡張空間ID変換時の拡張空間ID高度がその垂直ズームレベルにおける高度範囲外である場合。 +// +// 補足事項: +// +// 入力のoutputVZoomは次の2項目と関係しており、出力空間ID数に影響を与える +// 1. TileXYZの垂直精度, zBaseExponent, zBaseOffset: 条件により拡張空間ID変換後の拡張空間ID数が増加する(詳しくは ConvertTileXYZToExtendedSpatialIDs の例を参照) +// 2. TileXYZの水平精度の差: 差が1増えるごとに1で出力された拡張空間ID数の4のべき乗で出力空間ID数が増加する。 +// そのため、これら2項目の値によっては変換後の空間ID数は大幅に増大する。 +// 動作環境によってはメモリ不足となる可能性があるため、注意すること。 +func ConvertTileXYZToSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputVZoom uint16) ([]string, error) { + var outputData []string + outputExtendedSpatialIds, err := ConvertTileXYZToExtendedSpatialIDs( + request, zBaseExponent, zBaseOffset, outputVZoom, + ) + if err != nil { + return nil, err + } + for _, out := range outputExtendedSpatialIds { + spatialIds := ConvertExtendedSpatialIDToSpatialIDs(&out) + outputData = append(outputData, spatialIds...) + } + return outputData, nil +} + // ConvertAltitudeKeyToZ altitudekeyを(拡張)空間IDのz成分に高度変換する。 // // 変換前と変換後の精度差によって出力されるaltitudekeyの個数は増減する。 diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 02318f5..9c895ea 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -1,1622 +1,1768 @@ -// 空間IDパッケージ -package transform - -import ( - "reflect" - "sort" - "strconv" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/trajectoryjp/spatial_id_go/v4/common/errors" - "github.com/trajectoryjp/spatial_id_go/v4/common/object" -) - -func TestConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToHZoom int64 - ToVZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 6, ToVZoom: 20, pattern: 0, result: []string{"6/24/53/20/9", "6/24/49/20/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 7, ToVZoom: 2, pattern: 0, result: []string{"7/48/107/2/0", "7/49/107/2/0", "7/48/98/2/0", "7/49/98/2/0", "7/48/99/2/0", "7/49/99/2/0", "7/48/106/2/0", "7/49/106/2/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 5, ToVZoom: 8, pattern: 0, result: []string{"5/12/26/8/0", "5/12/24/8/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToHZoom: 9, ToVZoom: 2, pattern: 0, result: []string{"9/338/229/2/0"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 0, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 5, ToVZoom: 36, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, e, p.e) - } - } - -} - -func TestConvertQuadkeysAndVerticalIDsToSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 6, pattern: 0, result: []string{"6/0/24/53", "6/0/24/49"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 7, pattern: 0, result: []string{"7/0/48/107", "7/0/49/107", "7/0/48/98", "7/0/49/98", "7/0/48/99", "7/0/49/99", "7/0/48/106", "7/0/49/106"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 5, pattern: 0, result: []string{"5/0/12/26", "5/0/12/24"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToZoom: 9, pattern: 0, result: []string{"9/0/338/229"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToSpatialIDs(p.quadkeyAndVerticalIDs, p.ToZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToSpatialIDs(%+v,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToZoom, e, p.e) - } - } - -} - -func TestConvertExtendedSpatialIdsToQuadkeysAndVerticalIDs(t *testing.T) { - // 結果確認用の構造体を作成する - //"20/85263/65423"→ 00012322332320003333 →7432012031 21:29728048124,29728048125,29728048126,29728048127, - //horizontalID: "20/45621/43566", result: 3448507833}, //"00003031203000312321" - //horizontalID: "26/4562451/2343566", result: 26508024119725}, //"00012001233201113020012231" - //horizontalID: "26/1/2", result: 9}, //"00000000000000000000000021" - //horizontalID: "26/2/1", result: 6}, //"00000000000000000000000012" - //horizontalID: "5/4562451/2343566", result: 429}, //"12231" - - quadkeyAndVerticalIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 58}, {29728048124, 57}, {29728048125, 58}, {29728048125, 57}, {29728048126, 58}, {29728048126, 57}, {29728048127, 58}, {29728048127, 57}}, 10, 500, 0) - quadkeyAndVerticalIDs = append(quadkeyAndVerticalIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsSpatialIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsSpatialIDs = append(quadkeyAndVerticalIDsSpatialIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsHBorders1 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(1, [][2]int64{{0, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsHBorders1 = append(quadkeyAndVerticalIDsHBorders1, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsHBorders31 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - quadkeyAndVerticalIDsHBorders31 = append(quadkeyAndVerticalIDsHBorders31, newQuadkeyAndVerticalID) - - // quadkeyAndVerticalIDsValueE := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - // newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - // quadkeyAndVerticalIDsValueE = append(quadkeyAndVerticalIDsValueE, newQuadkeyAndVerticalID) - - _, err := strconv.ParseInt("test", 10, 64) - datas := []struct { - spatialIds []string - ToHZoom int64 - ToVZoom int64 - maxHeight float64 - minHeight float64 - result []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID - resultLength int - pattern int64 // 0:正常 1:異常 2:個数(水平) 3:個数(垂直) - e error - }{ - // 正常 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 21, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, pattern: 0}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 19, ToVZoom: 26, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDs, pattern: 0}, - - // 水平精度個数確認 低精度は1、高精度は精度差^4 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 24, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 512, pattern: 2}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 2, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 2, pattern: 2}, - // 水平精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders1, resultLength: 2, pattern: 2}, - {spatialIds: []string{"35/85263/65423/26/0"}, ToHZoom: 31, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders31, pattern: 0}, - - // 垂直精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 0, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 1, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - - // 異常系(精度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 0, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 20, ToVZoom: -1, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"35/85263/65423/26/56"}, ToHZoom: 32, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/35/56"}, ToHZoom: 20, ToVZoom: 36, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"36/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/36/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - - // 異常系(高度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: -500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - // 異常系(入力エラー) - {spatialIds: []string{"20/test/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, err.Error())}, - } - for _, p := range datas { - - result, e := ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, p.result[0], result[0]) - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, e, p.e) - } - if p.pattern == 2 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - if p.pattern == 3 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_1(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_2(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 56}, {29728048125, 56}, {29728048126, 56}, {29728048127, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 21, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_3(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 7}}, - 12, - 14, // 2^14 - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_4(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 54}}, - 12, - 14, - 188, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 188, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 12}, {29728048124, 13}, {29728048125, 12}, {29728048125, 13}, {29728048126, 12}, {29728048126, 13}, {29728048127, 12}, {29728048127, 13}}, - 15, - 14, - -50, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/56"}, - 21, - 15, - 14, - -50, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func newTileXYZ(t *testing.T, hZoom uint16, x int64, y int64, vZoom uint16, z int64) *object.TileXYZ { - t.Helper() - xyz, err := object.NewTileXYZ(hZoom, x, y, vZoom, z) - if err != nil { - t.Fatal(err) - } - return xyz -} - -func newExtendedSpatialID(t *testing.T, id string) *object.ExtendedSpatialID { - t.Helper() - extendedSpatialId, err := object.NewExtendedSpatialID(id) - if err != nil { - t.Fatal(err) - } - return extendedSpatialId -} - -func TestConvertTileXYZToExtendedSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected []string - request argSet - }{ - { - // hZoom/x/y/vZoom/z - []string{"20/85263/65423/23/-2"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 23, - 8, - 23, - }, - }, - { - []string{"20/85263/65423/25/1"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 25, - 3, - )}, - 25, - 2, - 25, - }, - }, - { - []string{"20/85263/65423/3/0"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 3, - 3, - )}, - 3, - 2, - 3, - }, - }, - { - []string{"20/85263/65423/23/-2"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 25, - 8, - 23, - }, - }, - { - []string{"20/85263/65423/23/-2", "20/85263/65423/23/-1"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 25, - 7, - 23, - }, - }, - { - []string{"20/85263/65423/26/6", "20/85263/65423/26/7"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 26, - 3, - )}, - 25, - -2, - 26, - }, - }, - { - []string{"20/85263/65423/23/0", "20/85263/65423/23/1", "20/85263/65423/23/2"}, - argSet{ - []*object.TileXYZ{ - newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - ), - newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 1, - )}, - 25, - -1, - 23, - }, - }, - } - for _, testCase := range testCases { - expectedData := []object.ExtendedSpatialID{} - for i := 0; i < len(testCase.expected); i++ { - extendedSpatialId := newExtendedSpatialID(t, testCase.expected[i]) - expectedData = append(expectedData, *extendedSpatialId) - } - result, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) - if err != nil { - t.Fatal(err) - } - if assert.ElementsMatch(t, expectedData, result) == false { - // t.Error(result): - t.Errorf("expected: %v result: %v", expectedData, result) - } else { - t.Log("Success", result) - } - } - -} - -func TestErrorConvertTileXYZToExtendedSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected string - request argSet - }{ - { - "input index does not exist", - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 25, - (1< Date: Mon, 19 Aug 2024 20:04:57 +0900 Subject: [PATCH 13/25] updated documentation of conversion functions about updating `ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs` to `ConvertTileXYZToExtendedSpatialIDs` --- documentation/convesion.md | 134 +- documentation/image/tilekey-standard.png | Bin 139607 -> 167438 bytes transform/convert_quadkey_and_Vertical_id.go | 6 +- .../convert_quadkey_and_Vertical_id_test.go | 3536 ++++++++--------- 4 files changed, 1846 insertions(+), 1830 deletions(-) diff --git a/documentation/convesion.md b/documentation/convesion.md index 54462b4..4bf66b3 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -4,42 +4,46 @@ ## 変換関数一覧 -| 変換元 | 変換先 | 対応関数 | 今後の変更予定など備考 | -|-------------|-------------|--------------------------------------------------------|----------------------------------------------------| -| 空間ID | 拡張空間ID | なし | `ConvertSpatialIDsToQuadkeysAndVerticalIDs`が部分的に行う | -| 拡張空間ID | 拡張空間ID | なし | `ConvertQuadkeysAndVerticalIDsToSpatialIDs`が部分的に行う | -| 拡張空間ID | TileXYZ | なし | `ConvertExtendedSpatialIDsToTileXYZ()`に実装予定 | -| TileXYZ | 拡張空間ID | なし | `ConvertTileXYZToExtendedSpatialIDs()`に実装予定 | -| 3Dtilekey | 拡張空間ID | `ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs()` | Pull Request#27のもの 廃止する | -| 拡張空間ID | 3Dtilekey | `ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys()` | 廃止予定 | -| 一次元インデックス | 一次元変換インデックス | `ConvertZToAltitudekey()` | `TransformIndexCoordinate()`にリネーム予定 | -| 一次元変換インデックス | 一次元インデックス | `ConvertAltitudeKeyToZ()` | `InverseTransformIndexCoordinate()`にリネーム予定 | -| Key | 拡張空間ID | `ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs()` | 廃止予定 | -| Key | 空間ID | `ConvertQuadkeysAndVerticalIDsToSpatialIDs()` | 廃止予定 | -| 空間ID | Key | `ConvertSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | -| 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | +| 変換元 | 変換先 | 対応関数 | 今後の変更予定など備考 | +|-------------|-------------|--------------------------------------------------------|--------------------------------------------------------| +| 空間ID | 拡張空間ID | なし | `ConvertSpatialIDsToQuadkeysAndVerticalIDs`が部分的に行う | +| 拡張空間ID | 空間ID | `ConvertExtendedSpatialIDToSpatialIDs` | `ConvertQuadkeysAndVerticalIDsToSpatialIDs`も部分的に行う | +| 拡張空間ID | TileXYZ | なし | `ConvertExtendedSpatialIDsToTileXYZ()`に実装予定 | +| TileXYZ | 拡張空間ID | `ConvertTileXYZToExtendedSpatialIDs()` | 空間IDへの変換は`ConvertExtendedSpatialIDToSpatialIDs`と組み合わせる | +| TileXYZ | 空間ID | `ConvertTileXYZToSpatialIDs()` | TileXYZ->拡張空間ID変換と拡張空間ID->空間ID変換の組み合わせ | +| 3Dtilekey | 拡張空間ID | なし | Pull Request#27のもの 実装**しない** | +| 拡張空間ID | 3Dtilekey | `ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys()` | 廃止予定 | +| 一次元インデックス | 一次元変換インデックス | `ConvertZToAltitudekey()` | `TransformIndexCoordinate()`にリネーム予定 | +| 一次元変換インデックス | 一次元インデックス | `ConvertAltitudeKeyToZ()` | `InverseTransformIndexCoordinate()`にリネーム予定 | +| Key | 拡張空間ID | `ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs()` | 廃止予定 | +| Key | 空間ID | `ConvertQuadkeysAndVerticalIDsToSpatialIDs()` | 廃止予定 | +| 空間ID | Key | `ConvertSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | +| 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | -## ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs +## ConvertTileXYZToExtendedSpatialIDs -Quadkey+AltitudeKey空間のボクセルを拡張空間IDに変換する +TileXYZ空間のボクセルを拡張空間IDに変換する -変換時、QuadKeyはx,yインデックスにデコードされるのみである -しかしAltitudeKeyは変換によって元の値に近い垂直方向拡張空間インデックスに変換される +変換時、`TileXYZ.x`,`TileXYZ.y`は元の値が利用されるのみである +しかし`TileXYZ.z`は変換によって元の値に近い垂直方向拡張空間インデックスに変換される -これはAltitudeKeyと拡張空間IDの間ではボクセルのインデックス付番や0番の位置の基準を変更されているためである +これは`TileXYZ.z`と拡張空間ID垂直インデックスの間ではボクセルのインデックス付番や0番の位置の基準を変更されているためである -この基準とデータをまとめて示すために 構造体`FromExtendedSpatialIDToQuadkeyAndAltitudekey`を入力として扱う +この基準とデータを`ConvertTileXYZToExtendedSpatialIDs`の入力として扱う ```go -[]FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +[]TileXYZ{ { - quadkeyZoom : 20 - innerIDList : [[7432012031,0]] // [[quadkey, alatitudekey],...] - altitudekeyZoom : 23 - zBaseExponent : 25 - zBaseOffset : -1 + hZoom: 20 + x: 85263 + y: 65423 + vZoom: 23 + z: 0 } -} +}, +zBaseExponent 25, +zBaseOffset 8, +outputVZoom 23 ``` ここで構造体フィールドには次のような値を利用する(fig.1) @@ -52,7 +56,7 @@ Quadkey+AltitudeKey空間のボクセルを拡張空間IDに変換する - ここでは高度キー0番のズームレベルを`zBaseExponent`で扱う ![fig.1](./image/tilekey-standard.png) -
fig1. FromExtendedSpatialIDToQuadkeyAndAltitudekeyで用いる値
+
fig1. ConvertTileXYZToExtendedSpatialIDs入力の高度基準
出力は拡張空間ID文字列になる 上記の入力は以下の文字列配列として出力される @@ -73,67 +77,79 @@ Quadkey+AltitudeKey空間のボクセルを拡張空間IDに変換する ### 変換例 -#### 1. 入力altitudekeyが出力拡張空間ID垂直インデックスに対応する場合 +#### 1. 入力TileXYZのzが出力拡張空間ID垂直インデックスに対応する場合 -変換前 +入力 ``` -[]FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +[]TileXYZ{ { - quadkeyZoom : 20 - innerIDList : [[7432012031,0]] - altitudekeyZoom : 23 - zBaseExponent : 25 - zBaseOffset : 8 + hZoom : 20 + x: 85263 + y: 65423 + vZoom: 23 + z: 0 } -} +}, +zBaseExponent: 25, +zBaseOffset: 8, +outputVZoom: 23 ``` -変換後 +出力 ``` extendedSpatialIDs :["20/85263/65423/23/-2"] ``` -#### 2. altitudekeyZoomが25より大きい場合 +#### 2. vZoomが25より大きい場合 -変換前 +入力 ``` -[]FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +[]TileXYZ{ { - quadkeyZoom : 20 - innerIDList : [[7432012031,3]] - altitudekeyZoom : 26 - zBaseExponent : 25 - zBaseOffset : -2 + hZoom : 20 + x: 85263 + y: 65423 + vZoom: 26 + z: 3 } -} +}, +zBaseExponent: 25, +zBaseOffset: -2, +outputVZoom: 26 + ``` -変換後 +出力 -extendedSpatialIDs :["20/85263/65423/26/7", "20/85263/65423/26/7] +``` +extendedSpatialIDs: ["20/85263/65423/26/7", "20/85263/65423/26/7] +``` #### 3. zBaseOffsetが2のべき乗でない場合 -変換前 +入力 ``` -[]FromExtendedSpatialIDToQuadkeyAndAltitudekey{ +[]TileXYZ{ { - quadkeyZoom : 20 - innerIDList : [[7432012031,0]] - altitudekeyZoom : 23 - zBaseExponent : 25 - zBaseOffset : 7 + hZoom : 20 + x: 85263 + y: 65423 + vZoom: 23 + z: 0 } -} +}, +zBaseExponent: 25, +zBaseOffset: 7, +outputVZoom: 23 ``` -変換後 +出力 ``` -extendedSpatialIDs :["20/85263/65423/23/-2", "20/85263/65423/23/-1"] +extendedSpatialIDs: ["20/85263/65423/23/-2", "20/85263/65423/23/-1"] ``` diff --git a/documentation/image/tilekey-standard.png b/documentation/image/tilekey-standard.png index ce54c44ffa3c5505ec85ab79adf181a262b98697..5bef51151f2184cc4dab3e027c09b88c6b533e61 100644 GIT binary patch literal 167438 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%0AqPn2G+&#oxsS-SA% z))iOsh)X(Ov5A}QSDbqnQ*xB%s-gu+zy|;03p}KGb`bUZccGkjeQ9U%l~V%@mqzS<#$~@h zter=9P@f+e;pus{``TJUcII*A;?mE?%`stmBXz9CL<`<}zO9OKPP5j0VM1}Ii&nob ztK5@H`MlQ)-6_}5)K=Rwm9S9M(MBC|{jq;t^2X?UZvW3+;O-8eg4Q}RfG$|l-(@X2 z)*XI9wLi579j=!bv$P3IvE}DUzpW_c7PM5oJ*Qys%fjUj4+-3G_W7yrf1Oc4xng6%V%q%Xf2?jKkV*2BcE7X7 zO7hDqDN&88d3@9VBc!{Y&B%=pm=;_m!$cRq9qd z)n^psylAWHoBUDA0!?AT<)y;Yzpw9~aX<^}rQ!Bgchh^g9QUUz0=&t>tVYcEvfK%9@knD~Lv8ip6apa*(MeQ!Ey8ityCy&T=Er=>*z%OP*SpUc|M_jgPqBB# zh%f6^Z)+(b1-FQcm$pDl0|_SyV4eoHUmGktuA4 z{oA2@K>6QWUbqS;RLNV(noYs@z79}K-3GZ|DXck77j;PeBOFpcUh!0}}kY zA%-LLJ_!yTA_*?Fc;4Dr=vBPJn=%yCAGIF7FwjmIaMedZfJl|&QslZdyU8Ad5 zCLUL?KIn*Ju~~okW-=jZJvGKyyTB&ZvUI`FDJy5UWA^I)U@Sm4)mq}_ z$$9HVhO{OA!(y*FCfvH8@Yu#NtL*Iwt)YwY+LU{hN}_tQ zku9@!pmr{3RD9p)v2mC-Op{E zRfx1yvbIw@7xg25ddyq?jQR1(_^|lzZ=^KyR<7VkVbdpdVW+Blyf!=_i}%)U9Xe@P zrKXWenw}j9R3HWNJii3(I)en?8|X9#Q=tAn?S}i@nxZZU*6}AU7qO4s!8O+o_HzqJ z{E{U~WXlmJ9xO}=Bqf`E0%nEWO-yGSp?}CR{$O%xx{`^hCvg(HU=J*uMTPbL@A%r=G<1l@>#5NH861Rc8YJca>lppa;-HxlN%-X#n!AM zCSi(jz3T@I>*~lPSu}=a{TQ7;qZ0jltaik}nCqI&nNr__foADE^k+AD^uH=QRK05@ zH-C^7?eEzm#B(86>D8k-0p$#LV5mHvD@tA8gZ3;#idoWf^hbnWU;dBAhH&I}x98L2 zN{+0`Z!&!IDS6jw9)IO3*FIV%Z%5(RX@nT?~NI@c+AJZBMLtk~=nB)5oNT+t@U zcp_2$8u~UQklFj>oxju&(|9!GR6;G|HcZkmCUbHuZ$vCHQCJ^xLf;CA>P|48Of7Yl zGlyPrk3dGNWE>R_&1O7|jz}0)_lu5G#MUFea6DHT7$`g8fldJ3@FeC+L zeo}s|W72rg=VkFW)5LQ3oSb7jFO9diYW19WCEC62^QB?6Qgn6A(%iP)Gr{Ir-uZII zWS#xC`)&CtnvpzS+Ap3R4c=C!*V$lNJ@2%j*ZKWM2 zE2G;X%$V|uAtUPo>YhYyc1ZpKqX?8-(;j{u|2vi zIa#;K-`kp3=IEXp1rGbzUj@nu&=(O>ebxN3NRsp6 zuVz|O)Qc=B(bQrC@)T5?Sebb*33f7D@T_9rPUMz)tejbai3U`^Xsz@bQ*<1tFBotQ z^8gn?*Sn@6TFbdHY6EgeBPt&bhvsWm!#6k*m+Y{a?oib%Jh1=_wrPRf7AHnFT@4M5 z5zjN$_;8+Rk^Ku$Ho}c$bltmmFC;wNtS&;#NzN@4)G4)d;(3m!tx-aJ12Gr1S_e+? zO*QrMk4c^4Tj-7uGH0vW~ z_>5};(?+SG;U;zUY!=)rw>KJ;n5U_udvJT4a$*=Ny{-mZ@1eIFie41bsCTpNjMd=Ch(rNY#|XDymI42?Sxajpc>3HpEB-?f-{wxV7k|Q zPR}Q2GB+zhkS>X$Er=C0uh;iT_HNBV*_vK%U47!gZ<@}*XZ}$PaW9oOHa4LuW%4tE z<=nJyau$EwQ4ae`l18jezgDfslyU9aXQ%AqCxRVE7$>jSUF9(OYH2PhfBucS0soIP zmhm{OUYoo~5ZM2gc=%+nHb&+HzAj*2Yk`HaNUvqP!DA7+EdK{M6H+-&?!44ovnqj! z(Gz!*hz`-O4{VOgT{|q>vj}-N-aV05!aGV1 z$UE_6%M5XxynZ_hCd0FA?jtxdc{ZO?Wyu?SoMv%)rmvn)_`dYFSPnkZg$cfes2IMX zR2L-SBPcG`WJNDm?Q)vbM_dY!D)7bG`2*=-@xlIpkJkizrFUZ%86KpXv<#NB9&OdG zP)bSFZx!OzqMU4thtyE3<7<(|_4JQ+Wm}x|X}{kspA*n4*4WL# zd=QuMY}#Ot3W^##Umm*GI{D&kZg8cm_PUtDcaPk3l0b{689Pp6=Dn+B|0}#-%t9z{i#y=~BU%Lb5Z~zaP$HFS42y?r$xi9W~Ao@A8=C5-&~bjs`;KL$*`nfG^KXR!t0{Ox6&26(&eL z*Zs=Ew=4o+({>2a)^_W>iNiKfLIwp&A&Bo%s8j@m?~o&?&^sZp8mmv%SF7ZyedBh_ z)$!&;W8AIIi=DHll&OVo3f+G)N)Br#yJ|J)9LiXjd0uL+F#(f-Ha9pTmhi$jmKS4% zW_vBrOOTWl?CUsFaG1g1a390%{CBq~1?pdyEox&p=zWILv!K$GYSMmTW{6qi>*$pQ zOvF{OOBa{56U$vB+DA8wyRAhFzqwEL>SK8;z<**3f2si;O7F&9^C+XQo%va}(^B~} zy|$=NjFm1no>2cx{*m1a7eJ}@)^59hZB9@CK0XcXnGQy=E`5v(%NbG!PL9F6jbQEB zF14}RgtphEA@5N0i3&$GAWCg?1xBv{GC9^&Gwm2j58oATu2%Qdp2qhZi`7!&AWyWn z`@(bk%H_-8&~z)xz}itrrZJGPJ@Yri(Vqc{Ey&?h5v+)Su-YOO{32p88S~VxLfzP9 zND|D65ywSyZmMHnv(IZTXy%P*5jqjI=Bo>HMbAmP)?R*@o3?DXmq{V{)QYwv=PToG zyki9G33Crfv?m}|wV&CKjD{B28~R{;Gt+_nXVoUzjg}$MwT;UecY|P6R@Lv5+0$c+ zH!JdZp0YUeo|tM*e#+1Y+GEeAB^G(}HcKqO*m>0xsWFM*+-WY6UEy456otH`2mtKk zw|8H)k@*UVjyaIV!riLkRxf&Se?o~OjvUoC&yt*P=Qc|;5JjyFrO_5Y1B&*fmp^3|J_2<7bWgwM5ynDW6^2uDp zT*qnZr~DD?t)1JquB`i?--5@w_A#yL#cJVM#z;C;R!%4#w0qT);p}Sv-2@eT0PXHmmT|sOuW9say*SHnnIPz_fJ^W&B}eV;EEpBUWS9zW zsA9n<6Cv_w@@Rd01_{L<%&qG2h| zwHx62?+=@lP>#?D0YH!qacF+?PH-IMBB7K2b`CQ@#c<~a!0p&kidvSf2KtieDWmrp ziV>p3vEff|9$1bxCnxmUes>N_4?sIptW;e6UmN~Ufk*-!yn;eSfMF$r%jxB05qOp6 zp#-MYTk273$(wulAaq2?bV8?2S$=wbPt?=_NiCuMezRm^nVtx|9V`~bPTsW zT?W9Wl><|F3X9$~G~^>$I+pI@^uz}TxbK{QKrQ+3x6BWw|NRhD{MK#%CYJo(xo5oO^cQcX&JS;(pe zb>F;s6A~S5wak(D{bLG8OA~1`r~y~+B|9p+YEK>h*+#nUS3a|EJp)xH#kVZ`(~b=7 z%W!(;wJ^eZ*Q@aTuS)6v%#%LpWgR%aMMJ7YT|}S2;scFq-8G%t*-(jz$LQEppuuKy zr%wdf?qX0-&F<>b$-hc#BQG!iPiIy+mFDze$q(}ud5QzGcT;|>4rN83P*J{Y6fbG8 zXZ&w!!0o{DD)XLgG4+kR|9bkdA*lF^fdUSnr~4}v1%JFgO&B#^8mkV0o5+IsC2a-U zfE;J3x_8jcE`pT zg6s`kWx40hYaCS9(Xl{|QpFg_65W+0;D}x9p2}a3I4}3xjr`@VAghAmNb_pY$BT<= zo~*6K;I)8jpB?Ki$_H4f0b;ZQ^IWgx+n_@)neN6Z0n<-x2{=xPHAS8P+_Qv28g?=p z%nQ$S2@#Ln2E&ZU!BUtDCe+~W{j2VkjACtqWvic-Pl1o47B+;}uV44gcL*S(O%c+I z(;`53ERmXWEr6r4k?jI6C@I+k!!qpiJwLv<40@-&kigTQ=*PMWv$fY@)0zMuv286< z(}A)Cg|PM&PF!t*!N8$A`>z8^({9Dc*tipZW+WtKc>qF;3_$!PknlWR38ltHM!14H zZE=X47P6;2(&|>g2V)E>raZ9mPzR?spBscNKdTHn{|Q4chY-t5>)706$$~D@iios3 zU$)zBs6H2}SoO#T1>DRWWCsOLVkCB9vU@C7P+KAlC6A_PudHo9r(|FdH!^goj2FzK zUc(7z_Pw)899#e-<5_P+w3E7;hF&WSCvrw<`uc2q96n z52@_?J%&n+@S2<_IS)3IR`j3w-HzHsI-n!wGh{GBGv$m8sB;_)D3XAGr8d5_w5bp9*lak)<+BG`crhp#+vu!4PH z+MYFy)E}V&s53;f2*BEGn9Nc=>&9#~0lYK&&5SK#YkYX%Pv*g3x8NcNkDYyp1-xtv zoTV8Iae)$(r&XuDU``@}OTISw%wH#tQ%mnfV{S?(bM)v!u6nv|%efa?D~OTXN@`7a zm>ny!mR1)j-ZYVARL8yoD^XETN4Y6fcDC1EkfwDWFtp`8o-39MZZAA$(c8}@VpDL1 zy!_N5lTqY3&foSj&8 zJYm!3Z70y>nO)3PYWdvLr-x&2bxo3#IV9Z+QoNh)!%C)nY#J{Zcr*`ne>F-;oETS9 z7i4xioH>wupam02m(X^IgBRw5saDJZ9XA7Vi-N{?3=eXz`DCDU{Q5E8auE$f+0cNg z^(*gLMp&)rFO~j`Gq}P9P}s1_yYONyk%mOX!psu9n{E+it7+z>4JhC7IxtTC$$~X; z>oohO`!psZJW}k*0=Cf=NKOSYfq+`(a^?j(fQ_CceVWN@zmBuVJ(iwxd+EK2?`4}> z7=%pLp)7t`<-&Q(P`qO%j9qNW(QEgxKS*k(PBnvGP4`28u9g^~hFR>z8W=b=QU=8T zk9(-Wn&d!3j+24HgKfkq467piTS8@IT`Z_5PmJp!zOQs z8|R^xOTnDNE}ELC`Z2Qa!eOg0zRYJ_6)Sg`I~%5(YH0b{l5_zzHb+Vr6-B4&qRIZ3 zv8R(rYI6#e>IVT`R>9dS5z_* zQ&2iIADzZZr0f~7Ijt{EpXvAs>8hHrn|(@6pICvUz02;Si12tOkGqIdvQuE(5Hj{J zDu8DTg8bsyfqg>(<=KL`y&gXTldD&%Tr)dukc)6VnTafAFv#-i&}j24_pckg2`rK02LYjiAV z3r?>4v%0df&I?|)t?!If=_779%@j2lw|6Hym7dzS(0*!2hxnj}nlPqZ!B5cTl~AGj z2!$wh)b1*&37-`@-f|p$UnDv;ygtCm0)lKiv8yH&A=8pIE<^XPpWX;mYWNtv^1RF+J<5wBXkSyX!PF)|HVWlv6T*bO- zA6t${SXhp9n&@aDKAWFXWm~GTpbkkKJ$kfhNV_@~MkS5dy%?AcUl6NtJGe|PGw!&f zV?RzQl+~mxuO#mK<9Xb>Yex%Nl8EVLdZYQv=~uLqP z2>NyKOR`WJ2E%>#TC&PfR_|}VPpm4uHm>PkUQv5zfSzN1s2Zy%a|3;d#X`kYU&LB- zPR^szb^Q+1AjBr*_qnl=dW1K!eU0M`Tdle&A_aBO5^Y1+lX`?0U0$2?ZMqzZ^_eLD zGuw$@u+x${sx;UNS+om8xv`4*~N^fF(d1$TjD(e%))WW+NST632LKER6Z*zN z)0&&CALr$QR>JCP`z*mU+gIJ*aaZinm(q(S&p7q0cD9X=u9M68kerIHSgBOzWfK&N#)j)?ONXCsK>%ZAvXqdM~SeYcr#c_lNBH z2K83wGOy}qI9!^$!{JxprM^WN!EV+WK&Q|ZNT!f<`mA|u$up@D7iOI%D0^!T zFs?)_EVYV1$=oJM0--}L+@q0f>0gzil&zw%iRTe71pYgncqnW|9vD~$8$EYm1D-a zxFWEsA*oVHg%HQF78HRkA0Jzzt>m*0{fJp#MZc}~vuZ+``~#kX*uFF|$uuDvBHKLB z?I;tb5*THkSe<+;yqMLCP<)E5JxiM^4H5}DRN$@4c_{#T3;nXxf9IfU zch`_HdY;*Rw5!n0pQbbcVZAdqtJ3u7m1;_09bfuNRPVQYSR1X@`qFrJnyS_$RGzZ{ zvD$zhVIimJm3bDNw*-nt#YmR&o^gPc?u{HQX`D+KuNx2dty@pn#{#f!e8Njsa!88M zb(Z&PG-|XmUaBV)sO0dh{Ur@PS*B}swan_KQwTfNT!wl}mp3*w;z043)|gB667(Dj z`4%Fp+Og&8nqQZ@oDKJzODvy7h6D@jZY>Iv@i9PqvD{GSyc)A5edKiRBgu#wVO*0# ztWX8dM#{`*5s&p*@oP2>y|WAYZ5alWo3|3mT_=EwV?%p|h*HNTQI!ZR2u)wqYkgI} zQFn4#XLN=&yghY}d2g$G;V`=zjvUgmG!tGQ=Q~D`v{y9MF>S!s&QA6A&RwKtuBSQI zt+=~Q&5;dT>JDMrmZffWDlppXpyTzOM zco6;m<}Go{4&hMCq*$y80&?L!l_LE>cO?R)yv`YhQp5Bl@sY~7A1KQlBYMplKdFCq zvJ%bAJo_y?>nb)2>FqLX_9}6yxq#b~B&4xMt8ZNzO_WI*_`0RQyoK~d?}(8e?{M13 zx_;kQ@b=%-46d0c+L@>ZUE8j(DXd(a=+Z(tlaD!)vOgWAEiQrv)UQTGW+dvexTV4j z5u1|rRw0D%ojw1UMsOVIA+?bvL&&;h+tu#2AbgYJ)*5&96Id|`E(tX;5fd#Fwol`E zyU!@KC-ShRHauiin+y4%$XvthvDkm-*3mrpkjECbc!}Vtg;_?#IMTSW2vH2@SSGcY zGQty|_TJM=+)z=yTukJn9IY-bYpZgr}LNmU+-TJs0B?PHu`STE(I z%ou5xx4h{FsKEuM$#%q`pdbSl^xd@zJ?lY81BT>x@;Xm;=ft^S>c^~aWofdsrQ%Y< zQ?7D`zA~w~(E4>GVRyHFT-hzZmeBD>dTetwHuD`&iXIo5opVxQ`$~DF#*U{oU^Aww zg~=$!Nd3g+L35Lt?&JDW*T+^*J?8C1L%vU_H&2k_^05N;71H%yrEJ8;LMm{WK7tT?ZCl3g<2HA3fd_9?kgK|Cd= zGsL$luA-=sz(NPdjAndKTP&uJ=UI4!zTNQrtZuu1&6zY1NfopUG^X!rh*MAE~F{-UU!>QF?`MQjJ$TooV^k^GdIo@vLdym$2E&- zjv7FtTSdx`Tp+)9CEl19!;97EZ0Cq?)4o6r$ojLy{9-4Sk)}V~J=?5i8_p>0fLTX^ zkb(n$H$-e!;R{ND_bLu$i*`^PWmjp_rv&o9K{LaE@*d$TfV+a?1H+~QmbRiRUVFYyfINN z4#C}&_kWiGu3zJ{tjiCfd?sp)pYgb$pHAmUwNj#SPJgZOi}>8fo z6~KyG>V~Ji8y9jWvP3kABui(oer|o1$(}DFT!}NR;?ak&P$5*4B>k-F2`-2)U6Ixm zZ6_j`9-6z)N_)M}x?o9DQPqg-JEkc@kXeaH+lT&?UhoOC@p)VNn#?&%Dc+SvOY_5& zFzNPMNd0X5EqM$z+RHG){+qqCN6UPZF|XWYEY|QUMwvB_c}+$Htq)9Y_TI+v_KsMM zGEQ2{EB`7c_{l;QxwYU8GGbkF{Nz+baQteq&~Q(P8cCZ;WKR1_J#lN=*I*(x20J74 zinv6MZ~+$Gk2;a`wVfIonT2b*Y1gia>paS)-`duS;5nXcG$l$F=`I_ZWCXZA;CG@h$fmERoxd?dk30bpn1zhubOYX=6ge zGha%aB7w|eLha@8YT8Swxjygv4kN(ZxB*&7qa@~7b8{FTgp+!ZnQUhly}D92VNNV- z?Zu*Bu1!E3Ia|g*OQl?x6T_G48Ws93P?qEd;@z6mC|b26n`sE5#;i2Bgba4tK3S;} z`@c$N7!Cc)g;n$C=S0!P>W+7$*BSPg&YPpkmm1z5_$MOY@%Bhikg2@D@ucz8tb@cu zPEeC8>U)?^Lh$1W{-tv#2)eN0rVV|DP%NJ|F@NpN!t5g6I z>v^p#BVI2o6mtZ4w7uxY)ftwDI8NT8n=R{KvfWa%k}%Rsr`Q3kF**2L84S8)w~WS!c7m z5OJW>;agVTjpAR!*GorcJO={AjD}OvF0U=fR`idD3*E!Mli6U5``=4$-qJmE-}ckA zPF@8xQ0SbvRo7{;gygJ?EYcQ$K|=~*=(yExm9Rc2G8PFXV0M_hthJ?oJ-tSIjljyI zks$P%eIQ3W->RYx?nQO*p+uTnHK;r0H7FcRbA77hXz1dveW6n=_5!UUI<46_fQ_Ud zj)v+z-z^<$u2Jy{po}Lf7t1N4_PX|lKGZE6*;ZWB;V9jXdZhVQ^9;+`X6~A*@}WkW zDiqhALZOvm3qG@O#;To{0ZXu7JDSWSF@8c!vHf|+qYx~c5l1?z91|JJty(pKqecov zW7E{dq)o0|7g?&ouVIZ!)&22OT6&T5$c%>%0HXC2K_ur1WnF{h|w^S=J8?fg}JWha#7-#^nk_KvCUo?Fav2g`~C6FzHj2Z7-T~S&i!&C{dJ1{ z6}jJL<=R6pFu7f-cD#CG-^9J#GVSaa7}0{7=#P>8A=sb^(4*%8tg8hr$E@>p3tE=? z;aLzQ-*dt}3BLSsiZW7yor*GB1tT;ngaVRD2_w3DV!S*ES9zRc_5XBSYdphqFoouB zRhC-c723|mC;3`eeL@?hqY_fMPe8s`Xq?s#Vp1JW~f)g62Re@KvuRst72V9u76qFkvGVapdsvod5 zZO|jHc>SH8;mSG$fC(of9mxHXN)(wtW2oRUue3ZawlN&ZrIFG=T=(bZOtX90SFlm+ zZ>7NY4o0io9Kur-3)XKJ^^{E9$hG81Tu&H1#&*u$GuV>6?jq1p)#F)O(r~e$>|p=$ zr-`PqbV=6!wB6RF%keX*WnU@BTI_X8BGAQOvRrYocpq0nG4F{O)uM0d2LaNBcT}ny z#2q`-5YPTOXW!tDByYzxT1M-*L%ZxNldR-lvfzC_3!j`?UNP zi&}n2cuM|rVjj2b_4r^ZSK8Op1@1d9EjeUO=*-^sP$@|*QB5%~9Y6eJpJmDD;jv=( zaH2(9=aX=zfX@l-dr-E=GX{#>_~rt|ChnzHPTUH!(^^dt6X-g+zM$u<(;BtzU!Zq5o;fz z$7}pzL-Jw|KhG}JPs~mB=KHR@E@~Gvyn;u#Fh8@?DrQ~MuXKLBb$IZ=x%s@23!AWq zlwaQJqVryGT;U7+>+St3Bz@p8L!NJydVb*f_0i>|slyz9a(2*Bj+B^H6KhWA805@d zTWc>{{AMz~$3vFJ=k%_-muOBuI(wQKn%)MqgnYBe>qIv7){M!~Yu*xxeV*G6-qdl# zA6>MgoIE7J6nX211L?1rY6sU2pU=|zSSH9GU&lzN{`^Ny^qfHqv_!-8 z;rL;}uTLJx8SMNY)z`Zj(wQ&T$ZhqEJA2G%Ez+EmQEgj`q&f4@_m5&TubXxnPI2y< z_Z+TjlemNsyZxY9TyUbf{eR&!F(;KzPNZ0NCT?P|k9pjt`Od$DKY6L~lEr;X&K>!v zqE`NliR_D2U0;tL5bBZ_8Qy7!0Ae_ItfA<<<2UwykozAW@O!)bZjiKA=BGR%(+zq{ z{tZ!80m}#2D*+V`zpNfMsHOkRmEqxJs-2mFdsNFZk0S2IX}`H0;MdJK4-3MUPa2-7 zlE9t6d-lIKui4O|#4CB#+e>){UURuqU0W`;x-8{zjkDopIbG47mnGV)I^CUS9jAMv z=LBbx94>_)m|J^s3qErZYHMbvgX@1;UYJ!&+xn)5c_TE73Tka!+!Y{PJdW_)zk0d$NqiB{eC0hzk2I=(`4w~qW*t>P@S%H^z8QnMr?oO@xZiSD``MZeDU(-dE@Hg zpXxNfBN@PO)P~7isk$X+RGB~$g$SZSK@x3xVD~>)oY(cHneK_m-2B@izk~S_2oGVt z=no)AXMVbfWk>U|E6;XBHZc6Wl_%Ul$%$Z^C(DSQfr!L!v^CWnac1P2HdRG?t-EYk z=>GE=Kg-1ad7#yR<+leBdkMpJ$`sVCqA;y+LAlRqeRV0}{n7N6q-&Lk&25Um;pa`> zv7-Qn8IHFZ20Dmcap5d-n#uzzV;ka1LmIf;3X9N*%!hgI-8?w*Fn<+zKmUyL7Fu4J z9WewkY&J6DZTq>|MtwoV9kftr)l*z}4)~50BgNmJ1=nd>R5{wXF8ZHa1Dd5O^sHek zG^k@Hu5E*HsZjLI#`}l;_(;rHACP}-Ve$a~UBUupodkV|_N!+`jyPqvoUGozTjvog ztbPv^w0(2IfzlRc9Bm3}fttn&1%blXT6q?xhE)&Worn_qemV4U>8-=Q*+xpgE~*^^ zsQ3#3Sxr|Z_-o^nl;eCE51c(+yY&9&>ham2!;v)%0``fmTg&!gCpvPGaI5}A09+FO z@Ybzc6F6<|?K(~?@!YbG)XET8_b--)dBJllZ_ zV=xyHfm8Z39h~Hx-82s>Xw4ku(^@~i(!5G6@Y)>#gG|sEgUTslkwm7%8j%vdLjS|) zS;Ia!G_7bolv)qx5Jb+|i~oR6eGZhqx7yC9U6%^`Rk;jCShSSnJ&={Mdk4+>i;rlQtm!)Lnr(Fn%z-M&skp z-{Ca(F{%p>JFuP*k;F{XdJ8uD%;T~9#AK_#wO%s`AN=tB=P(z&X>7_p)|TfWM9%GF z+Y6ldxrt6O=+eZQB0fAPVGfVk5A#6(b;}kyo35Q-kC1@3HOck{3+hR#zB|qT^vRR! z$c)`&rgpTqAZ7RupxMjXWJ4y9%K>!kiUk*sOtTiAre{WGSd!XS3fGA>z#?s~ofWp~ zYLgG)GX<%5qGeBUJHK8Ejz2{s^SN6TIC#p|<|DE{vMwQ(NJXj?*i`aCh>7l9(OX;? ziJ2@}2f?7laAO=Y69Aa=A!6<4Qf@bb2hJyhGf}1oe@@~)&lF(0+dYi@WVxtL#A@%zXfZ| zS>=%E_GNiG#Os5QY62=7SxBzzhJF6$)(9bj{IrC<&1S)W9`+6{6iSmY0Ye+BX1|-f z=$RkE`{va>R~f*XGw1s(F7Y!=I?F>egJ@6df`0$T_KF3>bIQQ%)_Lv3RUbUD@S1A* z>@&khnIPiYLj9`C%!_-E9_LX@>Qlt5oCSEaYMxJc-j{Qm-56cpak(&+Lv5YUJR1k4$Zz%^bq$Y zQf7OzR4#(sg_&umx-CgAgqq;3^Vg;-MbKYZj;P1Z1HC#xL-P;xWs$)E->Cq0ku1c& zeJ+Iwnah{F|6`tIr;d%5&nOrb!uM0t@MDj@Al;z@1LZ!OCcuVZSAFW{=SxMfpLECZ zX=Ie+d7;cvZ)1YlR;ydhoIDTB#PF)>CdFMCji$ezg^vbvV}K_J*YZ=f^EYh9evO;=BZV^ z)Lj^(3NGpzhI5s(r*TK9%9Mca|4sx)WWu<1x?oL4fEqGe7_kovm^jt)=hKO$#Kt|6 zld(W6v#erO_0^l0&dn+#o7}D17(`48BjrLl;w-ibE{^frfE{DYxf`>P_!g175bBfm zk@0NQeMCh>c;#=7i8OcXkrS=ynC_thnWxLlssovA2opPipH#wD(-TsHs(Ng;EMp5~ zEddSwi)f#c1e!^x-A$ni;pmHkQ5KVD-^z%goN2AgHCWArS{IzK8m=rl<+y8Kr#5Nm^0i#jiMVbtg%+N%Lvp9>{oI@9?!ZZ$vV zZv1uUzju;+-lJ~N7>jZTb7PiyqIQE5Jy^M0;nXDdQ> zuJUPhC(^0!aWH8uObdkAq)~1ADv-SFWlV{>xXl>{3dOev7$yqU)o?z#p(^!(A{n`4%_lrmScMw7j(?^+##~1iZCWW3AV~i9uI4^=>liY9 z9gJG6j$ND4%Q?mJVuEnEsi|maQb3-YhoHzh+>yDS(oGSzAQGlz)i9l%_7>w-Y7j3p zkB^(LnVjw-y6~=C5+#U=nYX?VR!q%wVX>G5lM+k}79T%tdyxYgQ1Be-_A!+n?^ zVHy(oeA3acj}%XsBEiB#Jt(c+xf(F@w7&n}McN&AV3`b6UdF}>7mZh6jXFc9sXx2W zWv9pld&eK`%?AmSND(FNbw<7=I*g_59BAlts*=U<4LmQ&C#|sT8Ut&fiEAdh&I=BB zr9NyqBb#2@rEC^};TXo_ ziVM+SlC~jZbK24UBGGAQv&}HeX5)qdXk^qiGIU{2s|ul*Wl>$#Kdl}Maivaz6Rxv< zY<9d}RX6|LPwEe-xjiw%RhO{WU_gj1QDYW=S|>Mhb$nCjzlG3nU;j8Hz1ijnvs_-B zN+~ARsO8C%CuD>IR`+Ol7Ob;Hd@2EB+Mqex)`_!Gq1E5eC|gG}t2Jx9W}i`SFVRHn zmN?`@!Eqc`wa}vRiiaZ#uWEXO7*+~?hj9qb8?3H@lKfPFSBmY;wSfWuv==9>vdwEQ z)sLLc()O|*OxDo{3GXR%y@*wMl@CrIpVuEQ7f@YVLL3y9VD2kqh-`-vpqIppzJ@qE z+S14lfQtK$YYcQBaG$O)$RCM04fD5IIZHm>=kZ`rv=)D3Ic!lOaXv?IP_XHYy! z$MPAW6;wLrgL^c=HVn4x#%(hq$Fi#C&cWCnWb$G@9L>gsjMnGZlo72m0>vo4tSM<; ztk0ifF$`i?%9r4gU0MeuY8h{wk`trh+N49faw)W_-YEb5--VWMN2WnetqIWi36O#c zb-ze9%6$y#GURu6S=rI$nzoCS_wr_d~bsWVaOAnf5QI+x9e7fNA@ z=Qtc54Q8jTKm*d>;>(k~fJ~3yrXhG(y}gG00fa8OVe=ny&DB@nROo(Y0bPd_5om`r z34IWinaAAb^*)dWK_rz!X}B1q!|e#%LzQL;ju|2TL~=)DRs^DM5lGlUZ9?+GOYRxG7)vBFQ`+4Wf9gAu4fz(F>}dP!0XE}EgXJFWblr36QAZO= z!XKRX&u;zaOaApw^ek^BwU{ZwQ-)V#!S9~d08!oh9n-aw(!nR)TQ!XfPnv9DIxxNm zTb>6Yht-un5CjPpwb(@_(!>er0H9-J+sh2BrxI-qIb2?aR~t80ElaZqAQa&MTk^p@ zcAde*l#d^fF;_%Ey&jM^UlB{o6jBvVwIBId*sa#~MfgI76}@u1rI#w41CLFJJlHIx zgEGT>Zz7ZNud|TzBZ_^qoERzD?4FfQlk#CAull1|tG54ey(n{`+L=CTapA8gK4w-9 z>xT*QO++Q!poIz2N$2exk3kw*9gwr>Y&~mD$@)W0b{X86?{0Q!S+|czJ5BXiVmMRI zX84A?b>3uGcec(Cjj3gVJeTNPI@hYLNQhcfeEDRGGA6JB@9(Xr#5s^u4^jBc1#Qy9 z*n8D0^ab}G)G-j$`|cb7XP^4^vx!&wOS(5dM;R$}) z>Gj>6RvO!U%WU0h#83S7z5jY4@4uj7D_^qjKsudSVnl4A{fJ6v`!ZM(pP>v9j}}a6 zqFY!+td=5Fo!#4Z3BZ9xaJw2ITE`!+ACXm{^ z8h=p2epnv@%8MD~9A64%*sQn{uG>kp!5#CHm*9=SzVs_eIM^+@zGxU~Ng}MmJgb(C z|3}wV$3?kyT~Z}PL;YmP(Ku+ zOCe%uqgt*6GNY2O{>(a?V869P_*EL}t26+}Y0+zm|*Zj_4 zX$47;vIeWYQm%omUyk7w6gyt~c=t#2e}KqDB#XQNA;vW$;&^>+aY3z#*~?Y^&@b__ z8_2D7Wd&cMlcA8>cE8J3FL(WP`lA+%UR~=Xr}4KV5lm4_{)&R>1&{!gQe8wAJ<-Sz zvU$Ie%8ku8@tL&*^(FHQXRNzhS8nvsS%Lz@zGXumtsK^>s*#F0*`4(17D^REf3PWK z^m$~;liNY`FZDsi7ef`#Gp%u6Jrhdl_g;s+HSAph460gtB^V`U$M*8=(kTeos!#wAGVm)CT%^4x!Vsf*4ILpH>2ZI%1h-q`t}gcqZ4vTs zxsKvr9~{fkX#$XMnoV0^DEgIAflT~tH2q@4K&hMC`Dr9qF;i5fJNNayHSN!k>v$xd znNQ?pZPJZ5dYsJahBxjrZ#RV%cT+$9FHjX+q&X`ORifJy;@=91$Op4bvc-9SzuNsQ zsjXV)vJBJc!7F=9iBHVs-p$bpJD+N;t+PxyvE%@Z-eQNhVJp8dDq=E99oddM&Zd^$p-%y+>Cn9;*31O46hFlhsMG-(Q9>utS zeW=af?ELTdL0*qzj+~pAb?w~?(!Uh49Ma^7nG=F|Q4uWrv7n8Gl)go^>BfJi^mi)_ zV3@=p6(7UjtA(y+yrQU>kEpSLMrH%EUpk?NMFcrOZq&Jt75Ds)J_GW{gE>T;@l@+% zS--HzorS9_uLP~W35?b%K&a<{_x_sy^Uar(@7KJCO9t^Ub-r_MzVP+ntLDyx8;G4e zOzHY^1=rWiy=9%}!mEm63d5ajKXU@v=l_5u2g_B(KSdt$FV|0;vg+hR(8P4D>}t!d z3>zRK=EDPz_7S>&+5f$dko9ah=O&xrW>Z+OU3NftccFxf)u-jK;G-&9B&BX?E~Oa; zlJ+$glUMI|1eFg8#?6|z?F}}w%)VH?(c>M zG~QsK z^pCi_QSU7tq-*%{V56e#JQ<~Kyw<~<3@To?j;y_tVU(p3;&T|!Mf&iUS?CtG;G2A~ zavtwlGrKkQe;j7`BZTx?qTr9Y4X6Lw*3ik~SwxZo z)rCUvdRuK0!_wk|hL^7XcgHB+298=^N|%;_ZXYMbO-?3=IXZgcAGCr zHxR15j-#U^gVm}3^w8Nkg=!EGUL7s_d%6yqgb@cf-ww(RhVTgDDg`>t&V*|bB=fr^ z{yMI|;*_!eUFsn%8UN+K`Mrl2Uz|1xfQzJo9EA-11oiw89P`Nd^SM8rpr4^%c9?>e zNI=qS^{@CQ`wv5RxmO{=n?n4aU^Y}9pkRG7J-O))Bej=$@B9D#%*12|ULPg;XOl-O|N6iO(!}Im@HZ`BBS7&X3IoslFrVF`CU$H!iAeU- zw`T1F{YwtmW%VKhFk!;ti;fKaJ|tIqFc%o~XH(7W=OBH-`@;_C=QjMV&jBtk8K7Dz zMJ82NKySw!F_Hr5(&%PI5An~KelVjFkcHbw1%r(7MdEo^ByUDh^|Fs_`)>v-1T=aM z(z7|S*8Gpik=+L)iHoO(L9ywS&qDR*Ill2_0SqsJkRKP2dRNqSMhn^iBvsg#lUhG| z_vj*892g*^!Az~Hp-dV}PX3qhwslOk_=!NbEufh^DRDCGo7(8g13)@2l0svH~BNgTXv4T z0=RUW*lmJ21e@$xC<5lRu^)e}jEXbana+6xsbd0Hu@FgPg}0yW zIt*0rtN|h(nS*y38HZxu4w(ZX7QHjR0Zjt;y`F5V`0N6dC+Fx_T z=ms<_M{p_{m!Kzun6Yd2aZ^$ukh&`fuX|x&!Y#y+ZZrVea+c8Ja7e7_+V_vn7}ODk z0BQF!+m#L1zWsdG<#+8&gf3@vNBrUuq4a2DL?6r)HV6D87ZO_6d9n9QKkp9Ob`m74 z!W)0KtysUk31LG2)D^K|uH(nML7iy4(LEtaa!Eb@;zK%thbK;-{=B@<3%uPKC^fT@ z{=fi{Cjf^K9NWu!BzMBV!BA*ikoYy<5!=|8D0EbfPEbrS;mK}rjhc)7!urhfC3Jr} zVf3z^-7&Gvhbv~aA?))Cd*P1xT+HG*@k$gL6^N0Q4Om$mrcri#eJ6HKfnOu-#pcu3 zr5(>>6#qm>xX_^kH{hloH2uz+$j5FA3R(S2;r({^f6c|>Fd&0kz?R)-`5&aM7YuUq zQt)V;1$T#h=t2~m2DpnW1(On!eH!@o8Qy{8ehU9ouJX=DaBHFI$V(+w!-7T2>7=)sJ=cHplSh#u)^NpL5Q~{!9*GMB;DNwg@+Z{d}q+dEMJm7Im<|J>g> zw5@B^u~J@9wHv%3nV8&sVXOA`=P8!`%%CDdD^-@**1|NH1{lxa@mOHa(2zYZg02{g zBwe{?q{R>KhAPTXV!f2Unpw{NfO7lXZT|5<0I zcSrR$VPL8rt)6zx#;{}MUE*N|li$LXyRr`|Vcx*k3iC+`H30f%!3c%}$87vw_eb*j z==I%zzH@*SAX6RY7FJ5TK%0lm5pQ%J@x8G;{9^wDF0}tX>F#hoZ92*0Tb)dEV$(w; zKfvlbM)aqXA?rEJqEWhNs2F-6qS(NMafejI_v3lK1o-|%P|VnTj0^KbeAy(py;i11 zn`oq=q1b23*9YiZbC_r+HTiS;N(3J4e_;*oHV%!3&Yv%J7TOt>4hJy%O(SyD%TEs7 z;<=x8H@njZ1QxRZNjWEYF5lPhY2Zmtb6{PTi>vMH`0ioTa4uHTBPUtU={_a>_mar0 z=^$2#PS(KMUCk*-S+fcYDkv;MAo88<-x+C)^tIuZC{zJ1 zquw29@^c+(4cd`Rpl44nyt1&4Ou&F9Vxw9{ja37sM!Qz=RIXpXCC}E3VY6a?BkIiM zmkoYNU-BAM=U9k z`U2qpqM=NlV)*hU$WV_r?pH1T$Z3WSs8sv=>fStI1OtHezTXXCKgQb{`2HH1v6>Nd z921$(l_92QrN>{x0n!G?EWKp60d9q#5rkOiE>)+*Yp?dRCz;r_da9ro?9{g^#IGi; zt=N;+(6F~_nN!y+t|KoU?hEWd7=1}vgNhaP5M(r38fMSrx_Y|Sdd-jb@fY@g6+)?p zw>G*r-`Q-Cjy>z}nwfVUy_+q|-h^yCZ|_f1CM3{{eDQ6zCAq-2Sf2}!^KqL33`mk) z=;N=ie3K)d$BOCl6ZrGuF-URQP0zgmZ|ul`^}b>!F0(=5$x}#n!F>o_m!QdT9o5r_ zA>m1N01iMO)WiDXxA)x!N)LP=7!SLFL*-0f{CcXjnYE@WR;}^qM%R^E<3;cno4mPJ z5buZSMHsxR;?K1D{&}XLr5q{rVf6$q)ujVL@mQ_F0mJLWg5d9(^X>ta@cI4nEW>^n z#3Cs5gxo^JV+hWFGO6S74Z+atFxts74?cy9=7Jx#Yk=pNx|_zvkkO74mTULyVvq)PKbngRluIm56=}tiqAy40484Xw!`&<((b>zEXInm*lcjY z6IhdSgfN42eN-vr=WDCAB-l0{{|h+SdGPnqP`|zT_Jqeuv#J5WyyClWNb-Q_QxI)i zQXeLu1Rm#02XX4rkZc3Ls~0ZUXTy7t$*5vunPNBk+#x0C-{%C4rk9P&9o;25nj^cd zJ{e>tU(Zoc5VITX-->@XGz~EPWW$EOONY8`HXH@40hkj+i#sJY2CtCRF=0j#B&^Y5 zv*Eh$@@M&S#rclhoEIxKuN5e5dvZPi&8kRq+Kb9cpS4s-RV}I&i{!jWuMc72C}!y7 zr)&ZG)T}q6YGKX98d59TdA8wK?(x75t)6_cfZOcZR#-_*=i3CWWMhiXa%06*1ECSt z=}GiFx1qJZ)nixdg69LJGYf6?u6o5hi$Nn2=X^BP>7zg@QZw)w1sPx;h;uCf(_7;I zaP6;M@M}MytD*MRd$CdBWA$mBmwdmzm`^QIa`t(~$Yf^)(Mnil$A) zMt?YCr|TIdRqmR+6_vwTG|>WD39hih22MKv_OB}+USE3LuXrDW|NeM0L+mG3RmLXp z@pr5FXB`Hc?|m8^6K-)APKD?8BP#)}?|^@vC~wjJqTH+fV5k&yteo;6DF{yQ&p4^7 zu@7YhjFyG;TIg`6X)pK~7+Cb{lSi%PpA4-i^!c3aGSlr~=+?CHD|O$(qSH?$>wv=d=T!2FQw)`4hq)Po|64hrU||`S-Qa9xP1nx8)_}j4xl+<=BJA z2!+igtTgJ6*#*&Eb-fsAsya5G6VsCpXp2PxSR-yFo~8aa8)Oy8hL%YpQ6m(9m1mwPs|-|0~s+&c_#OnGz3p&a_1pNNeFvD!gVGKoY)%95bPk) zdsO|(>B+AJ`}1nDdV9Dd(ZB8=`0ujUDY*A|W2X#lK23cnIAdn@ek1mUO21_|U(78p z^=r>_R2wuKPw}&1-zFyZf`eGP9kv1>RdBQIg<4TzL5xjV^y6=?)$dnv;0N?dFV295 z=I18Lp>sFea@=&?3`n~zEY(1E)Ae28?C00dn+hyeZcCh1DJfRvxF$wtLMBFSxsXk7-&nt25_sLPVOGC5 z8vT6#(3r}Cfl_N#PaW6CrvwAYG~Ui;$&j4yD?tz0TsTed(ClUPLaS4{uSB#6-Erq+ zRo5cU7)~5AJwTPV2--jy-<*JF@O4o|{KTK#@av~|1hW#Ldl%{d6T3mHpoO1W=@vc` zk>gsDRv?$|$>|;JE8|g}fBHBgPqk6A(4=9GF`I9osZ?n2P}Xrj&O~8W*(1vCkX2iQ z1z6(u7VuZe2BKU~3Lpb@<;H9O{Y4UyY#x;*ayMMoV*I(n#v1X?MrmDb8j`m+4Zoa= zRpT2eZV0K&ydE~YIhKeLS|G622@EpSF$g}Rl`)J#Xmp4}h7>e`=d=R%GT%n%CiH@_ zpT$YZ?EX6hK!SOJ!`Ju2BMRGdzwp^T99e=S>-0GFIM>-hn*&|^xiPnDnGIO#NTlC7 zfAE>~{E}8`-6J&p`As138d@5{`K^%gA24`A*m6T28SR3;LYbzG%k^1XrYgA86Bpi} z729FuRmN(s(|2Xg&*tBUv7T4n`O^kQdDYW8V?c$2d+Z5To>WjEFj}YR-sa%!v_T(Xgm#PKntzD#MsNL z-<&I?&eOBMW|z)=&-_{cVX8&+G8+~&L*ZG_SjUSrb;gav{)UB-RCD?n;mn(<7lN;6g z*LQ@bhD|SQzp(4~bH*o8SPzC-9_ZxHA3&4NYh)*O@T=Fhk&ebcd&EiRS2h_e7g;6I z=B9nqXlCNWN!^+IE2wVbhoiQ0y9mh@@sPX38^ij;@(5pCBVipj;5>&aSt)b_+_8^g@5S#y(Xm zRN+_jx;bZ8y`#)$p%FMD*>eM>ebx7=(%~^zVfLXelm@R8yq1wvwN4ZLU1XbgJTB)> zZWD{6jS=6_sO!RE{UsNS^}pwib6Z2x<-X6ZZkaz1il)G06X{pgIYLucKXm3-ZE4Uv z+4P$8b@88HdHqn3C~Zwul+P{URoKaXiQ;f|-pHi-8-0n&akhZL#KHlthXVRGLfr(s zPTmGJc?f=Ws38f;XFaGK)w80Jd{u5*WW?iInwB)i^@Hobw^$PGl?RUuS}A@78Q2q) zvPL5rdDp$JQa|@(Q%gXHDb~5$eS4L_ds|1N3Tx7+5j@q_0tlfia2B;7y#_20@-Bq8 zxgX!;EE)-C=F)ki^)&I-+t^pGxFKKHjknnv1)eic1`G~1@B8?x`?hni){liQYG&Yj zcI*Dt0OH^w3l=Di+j^PP6SS5}qt0W{woAj-NaR|0^A}7CCtbQ?amwoF@Qx}EuJBZ2 zDV|QsijV?E0Lu!2wfGUSXyY{~D`K8r19Rht1-5N4(_S`SmaHJ%z)CpKz-pEq^Kq(B zszP?PUI_p_QL=^v+k&V*!jp|=jsD^zQ=3j$aIy z9kXAlbg!Z(B_6S`0pGCGBVQX(%QyL@%T&mIazkqu%9w77h*w&& zt;qBho2B*{dRj)!_7*?8KIGkHzI)HbLfJ+a!)P|hzaPk;V-vV`ew2+*0)2|WlqS)~ z-;%I{r-{iO)=q>@=lH)7o11PPM4WMfCYl8}sW!wZ#O_w3(6;t;(BtkqWA@1Q*fbyX z?!%8`MJp~v$Jfr~>1!nF&`*nv4-B0#fGGBPKX*7S?xv=s(`bYRV|TfaS)SWJgd-{w zB&8y6m8pFz+6&XUoh8m8h3QGiG^AU2<^SZUDr95;J6J<F8^Lf8 z)E1@(Jp69ZE`@BAA+l<6RQ}r6hY6G!2WEhE^!lce>O;y^NB^ZaId%jk5yR~m*4#0t z?c*SZ0X@UxcBa0iK7oc?$<=WKr|(3uYFlayyWL}hmFkBH-@$#Ve3|&Q_755IaOL9~P*>zILIo z&-=A^f8B5JumvPQ!fmYiG_%uyg27#H5d&r>QELli(33h?hqd#-R1`D}vgNB;e*gZW z1SHi$*W06^<|(EQx2ssMMf5@li+XFV#h2wCFdgcVK}yjws0u`F1kmzrn5sL_mu1x@ zun7a9tie+fRNb>0-)IvaiF|TASp(-@hYW8|#G^Z#wV2UtA`1MP^=oH%8Ohx#z ztVA^&h3oV^VvGsCA)#U1H>$ycO%ef{%P;*w3SJw?V(&a(Ngc9-j`}R<(sRL$19E~5 zVfo$v3dTD(D%y{cgS2Rm)KG_ zJH|7JA+5gb*|YwPJ6nSMMAmV$R1t3VS|BEB7;T!$?|Gks0IEA3Nyzsbrn)liklUt) z<}u-Px^YLe?|(G{L4zUy=l)T%5hB-l1tX3sYtn_i9M4P*iaW!+&n zSJ%d&H6X~Gt*99~1{-LSow!+a35Viu^2jY7E8(SvV0Yp~BL z(&#>e%R)Xp<%anp6S8#iL}V3%CC#yh+kvdQ1vxS5C-HkF$yjaS}q9)xb3JHpyiPuJ-H0;I6S zLM5pUfYllA<4CFzX29xf-+1vyBoH9rhgk zM06wJ8y0l}H|;;n2{)FCEQwRWECqpwNUInmuf0}-u5X6sA2WxS#+wZm(4wq-81@W_ zUgxvod^9`2ee~pHsr5`0XMy{8Cr++@WPgXCdM6WSc%$Pi+#bdAXi8iPG6voCBea9$ z`#QT{hRHa{`EhE6e2eNlb8=*@p6`6*FJ9S=V_C)@D7zvc-pW{RT>LR`5lPM64?xX- z$y}|f85tV1>>t;#nVhVbUHe`=8G{s>ij9pjOm>=P&*}Np7n}`AD|zIS9DJ<4B;A62 znS+eBvn?B}^51Pf63v)soONE-lg>!zG>Fqpi^j(*F*|F&!^!3px&Q-PXJ($bhN{ai)so7U4!0~x<5P6pc$AvkZFGtJ<>JyT*P>b4nhy^*nl z!f;m##hE>1ZP&OC3Z{^;{G2s^v64L-YxDDdkwB2H(06JQv3=R+!#b|W86skk;r9s|*bT|N;?0_} z>Q!Hm?i%#~(l|3)%P_#Z5~4uuJ!Bs7z5&6;rIB#InsBqOAn4Lk4yB?_V;hNWi?!Bi^Oag13O<2&nm zb)vIpa1xTVXESadJ&lrJyRVDQ;ca5m-qJmVOKqvbCQJ0cx%Od8*i>zLS1FQCF2^Wz z7#V=T#EQ;+)emzOJu_Xg*}?l%?06FO=KD(QKlIy!p$j#uL83eht$QiweLSD%^)4wzT&3 zC=1@_1T8)WWAdgEufE`BCoj9&Ang^2xg>>4<+C&+OgY5|c9nINtRg@;;wh;ZrVDR7 z7C?NG85cXUk3f^`c(+5)uS$s=6-RCQ)T_!+|Jj{w1%ZL$Afha{^NT;2B(l#b@enoU zB!YeS-F)ijTliVg4#`haHQr%spjS_;O9H;AIf%o})DsZ1I$yo8(NrWCNR#ctvCIH> z!vj@xIddhy(*D=8Sk-6Q4C)YpmT#MjW}|=5|veFLk`5`HUcFzHKvE$OP*in8IsW&d|VF6D_5 zbr+&*_sViwUPWR+Ih0o9_rj8jQNS7d z5UGw!&MV2e_Jc{g08AENhwSSHpVN#PAz&BEicH~QAzw_{?tf4}^DmAma!AmQRG-;p z4;23En1Ljcmrps6o#jQ6qH_lErG6i0JEt=G0Z8lpFpZT~vz~i3_yHS|`Ya+sZ*K8- z4frB}NUxg-Aqk;~<;=+t4`|wy7>yz<4CE>TyV;}4Qk|&hf-uynuf!#_QGfuJP~Y=d z?KsVnoag#`%0Y9Him*4gc5j0?V~xR~1#Tu0vt5SJ(h+#0>Exwpu! z??_Tzds2hp)DBUZ14UMWt*DA!7sGj3u3M6!mIB3J>o%Rn=^kCHG896sJz0-dUno=? z+O3k0CD)5d&=$jRQunAC9S|BVe{SWl9m=z<@!Clj;cZrm$On4?>M-5aFFj5nKl>+kS+0`ViE?%>B8w zzDTfcWT0s}Bt4tg?$@|($eomC!)=iv$lAbG0U{v$oo{EG4?_>+g$%m6%g1$+8~`5|){~l);l) zZ?O^0kW~&jBL(>~)r43Nuxm=T*_Xgip%|;JK5#|53bd@j1k(6GB#Q3`Ej$Y+S1}~o z05V&+9n1?-Q@wLX>S%{rKu=t9bcZXTva*_Axl-4oGM)^=tz%kvCDDV@5=Mi5krHac zyZO}~*4UMU01l9{;TdsNjCdQ(j3^gQT=e$DX3=gx%;ug6U8#3DEe&{Jf2FU0{aJ;_ zwhu2u(i6uPDYriQW0y+rK zLBJh98m|zF)RNFR(ghir{`VjPrWrChlW%(_PCzD0i$&1)O}wM?k6QNNi^>pK?IPK+ z`Haem1e-?neA{|c0>dF+Hn)olVj=doG#V8b+`uKd^NsvIBnJuuAw@pwt3hd+yiB2p zAI3|Cf)G$#^x{XCL6&6?qR&s{JFjlnZf`)jhj+hhjeEWwR+=U_R8BU2f+FeOCL-7f z5L9c`tiJ$6+{QD{4L?5{egIJgJ%KDZ>o^*|AEZPD$`w_C9px^RG7TB3l&kAe?+69| zreu+$oYhk`Y0J%ML)K$BX7QeWGL(o~Ep)V5SZLn#94pjnBXsC-?IFyGGm@c>xhdvw zBC7_Ngkt##r)-v z-8ZEhurZC%Hv?+|_7%#r`+S*ohKdGZZnuSy`@@vg`f zKIUSY+Pd&Pgxb1?ucLo_S2O;V=XbN3hDd&|leR{y0|6t?NMz(|0p-J=1Cqy-u$j}hJp~QmGNlhIIeU)X}#?J6*5#i z$@#|9R^i=GV|4k8-LEnmW#*2{7@7~2T_}{UGUR2TRoEwKNtTg(3vHEpVTkF?-)#a}X9`LDLXGR!hg?xY z=p7{?7=$Bpo-*>hoL8Rj#IH-Lkjs6RoM-uIfwRe%W%2R0*LUpDJcU`R*8I2L&9WwZ z?_J)_GJx+Fbz|hcJdA>)aMdY1Z|FFQ^PbkxEwtjQ!ggSKuy-W* zj>H#iV&zBPJI-xHErDDBs(D>dOC#nPiAph+@+=M)TiptEYhdpv?ZdNb8_OhE*V`-7 z;rANw{9rTv=rwTgkR$dC=CK}$UKh=FPaZ@T`#t%x7sB<~*=w}jyy!SmSZk8=P>f4g zSer?_p{v4{lknZUf9#+2QeN6L)nmBm+aab0@IGV7@6v$YAb?9X4{{sd2N}&0+tu8Q zLMWi7S7S+C|Fm>=&INLRBKxnRMNmF)2g{LtPks>ZbCedZxR(qSqPh_A3HyLq-qZh| zJ%q%!^EvaR36DC|GG64gL<*w>xpmtGD4)BtfuVE)(l@N^#t54?=Yc?OmvXWnrX@pn z)sB$aGsLs^l^s-)4>cxK+zRf{^Nkr z9w5O$;vceGNY-tapN2dHcysj>xiP!vam815qj>2B?*v9D1%H3j95-jih#!!?mEtnl z{h1sk;WA|kEb;o&IEl9n#OS9VKSzqk$@qB{KoeKSrRU$yFFTL05C`p>Z9ey3An`3S z2KY3S?Y#sx`aOhL#Rah^H=Pw5LWbte)S0y>?|uF35>MV5o#uyeQGMLQ#b{{rCZnPk zsPeNL)0u^bg>P#)I@WS{Sd3-*VO9<_GRU^Pv4ZgVX4<(>UnNFM&yS|n&IXr7JE4-+Y{cSkDnAFI611DoB@qv!08<8`)&6}vz zIa28q9v^m`Fn>AMvcX&Kq=WmjM|48-U%gJ^COP`RXO=LaKW%4|dUxoxR;SB@)U(|y{V9J;}S(muDNTwJ?Bm%wm2gl%>)o*EUy zM~#viWYfFyulM-*N*7L45}h^uB1!w>JvqwAU5oBx_ z3VLk&jq;NOm%|GAJ?~g)%(XriFZ{V;Tk9Yxh;l|Wi{$N6km_N@v0ho z>_FS;$YDF29*dyVE!;GDZODh98f-s1>chu&TezS{ECXSnP+kzUtv`s;9BOug+lWY4|$k>hsT? zV5?QN6!nC)emsA-F~59bypn=YylX>!4uxk{@3o!OC};65*-c6@VD#9A&-oV+}NKY%*)4j(brcRoQp`` zWKS*_gHb|O-|R$hzEx7m$B~`IltA}K@qB9Ndm==?i!C;kX?57{d^$aE<30=dz>SSW zN`I5$s|(Z0INsZF5u=j}nz0eRmWzcx%%gW6N8R&nlUBL4EYInsn`cv$rZ;ULuR%WL zrQs8TY}E$R`*l-;^l^M1>>sIFd#%N`wX;}Lc^@ykoE0n=elpcVV|6LFPsHH-1)n<- z9RVb#)be^ytw7NN&DDA0<@=({6^$K)do zHM1zSxVX3$#B&HYr9#Fh5u&+ zG;Hth5|h$sM^GWpb}_fofS#Z*Y8P3~Ksuu8py(>7RbBL5GviVK<mQ>U=;$NF zNpmeKE)O>IE9t)z2){U^(b1>QbI<1LXr@)1)W}mct;sZ&a3VE76_l=3;o4dey4QB( zvEA3D-LZFTZp&?}DpfMh^PQJpk&t)d#}qKhBrRx0O_bB$-FFY*lS7Hj3d2)QR+IP`4!>_)}3myV%H!^X@tuq8P z*PgLLpcwDX;`()w;!YT;u#Z2^RbMY~WX>?t*xn8bA~|RgdH2Q^`4M7%_Jm|J`8!*^ zCqzW)nPFYgMwAf26K$W*Zw4^iRze$W0eU9n%hx&cz@Lr~DDE`oPJI`IOfK@0TrTCL${_+4Xf8%_O)sp09@4FqD~T*{_RHTr7yeO+@M5$hviaul_2oMs?rUmI(b(CmgR7Es z!FX9M3hDy!ce&Fppj3c*BU_hOJ^mW{OJb_X8H>EZLZDBgY4Ob zc6wD~OEvP%T4JJgYGENBQ48RXtv&A4%Y=K4LV7M58X6<|3nIue zCLQQDR80@`5x7BYjKLjLU+DXM?u}LPxr7y z?-YS~-RNV@R;-ijovQ*B8csqXin9+6+>Bxu64w)Gd&lncB>4c>h0B8V6YU2~81bx! zeZ2CEyfCR&N7hWED5aityb<9q?9_HR+L60U>Y1(8Dnp4)I?u9{QLb?iWlchT;Qq7Y zb`$tN3#-GWlDo#6?_bC4|G^+9!G)_i{Uj|ZiHKK)iuqv=8LTM5`(x!mz3N-pzCC$! zf|@q%<4ICeH{@CGgWhUii`1H)f2d}FQU&+{th_9|Sv95n%*X|p+~=-@Q}%A-$7KjJ ziN4H-E!V+@>XM@3UI31EA68m_`%I}CT3!a2;LQW#1)uf-=i6Lr-#j!Iu<4Z{@!|XTiv3AhZH~nUss)#w)_QWMys!4Le1a?)MP2LM!u0lJ{_NE#+|ob+<6Zf8 zvInW|Z5z(LK7?6JM%>-Nw}9vEO;LXSbb<|qqFK@iIGd@oxan?Rri#6?vT%>$z_ND{ zf~8UwESF7XVhAa6Q_u}CXd&ivBHqSquWe^Jjw-O`mDq`ZeVP^@gOs7Yx3^@)`WUkw z4CMraLE3LG^%YYbO|{0M7v7y;_ikQjdx3o$Ctn7f15jNBcG+%_b^rU zPvUtox-ulPX3?hfKs6z67h^{4qK9FCk4(>b%6rc$y~0KoeVQDGzi@{5h;!XK9US!R z2F1>0OC}FT*j{gIa9V1u-ygWzQ;!Ta_wdz7H-@&}cA6IG0tM)i5ZOF{qrSp``x<~@ zsV8$mI+!>~i3OKSHqzZRX)>R{wCKjRUTodEV$>N5=!CfX6X8IuQwfw0s^ojC`G{1} zlN}nI)zFSBw`E{t48-6^1vj>U2xJ2HE|BS1;f~T@3GO2OzLVqHaEBUduIrkno{uXs zr6;Uj(0kGx*B20h4z!gcUbn-8dD&gyek&@kXW0*5cnSRm_w~vG(HZ)EihoKCS^*MH zhso|(I)Zw>K5s!F)#1(a=m-0|t>&Ku<@;AxV7R(<#V(k4$8ktNnx0oIJ5BdNbl!K_ zB_4cq&b7W2Hm5;`=E8R-7&;t;^_))6I;R~eSEL*#9lHKdUvcb9m`sKOYJk+JYjX}O zAHtR%XzFYT@}@K;PuPEMzd-|wj_D-S}3yK;1V5_-AhF&@)}v&qcl3=LmF zhHC0N%(`5vI1kUwK|&5iM_2N#IGC`TCHYK8Bw~V#b2FB;URvu5&G;<@(N3*O_pu6J|;F(c`hS= zia494Z^UTD<;~^ko+lquPKNEO(O3{j+ueD_Q_Nj(Z|(6H5`%l>^tx{E%dz-;R1Z3; z+`POs;NBMm>S4z3n_=%(oy<;$N6f8xZi@`oy2$vx9lJnq>mk(I6;9++Z}ZKf%cpho z^iOH5I&YJYobBiOAL$9)Bo<_chyrViFUkKiv<78IyLzRN-m80QH>-MkHT3m^KpJ$R zTKDkH5|MNmUKjd`-i*fR*`!fc7Nl`ffp$)t2D!KQZUBeGNQ5GobJ-;yvNe$OvCu7x z+S1V}zdXA?vwW2aWC&@sc4C`40k6Y7&^AgGk-%a1#ECx23ad!wmMtv0c>HjaeRqRO>E?O*)f8nsv)V-Rw(2xB^>7lo z<&v(qYh(uhmoZ;4rv%Eo9i6L=m7U+Eab9}jPP&skFN9id9Cr8nIM8h^D#iK%OIQ`# zBEUFaG<3>n0DBEgGvs<`n5sbI(Go$9E@K}Z7h#Fo++w8Jy2Z}@CNJv6FE4<9LjXTh zVmzY}(F{hvwct4qePp{UB>$cjdKBWieJnJAG^(8LF_Ioa2JXZ6HD+%HyonVuqns-m zp#e$lfphWUufjNqkY?KS8o%7dM(?T?$t7wqSXllJGQ5c?EO59oeWg5}K7amYD1TYI z+Kj?#AljNsROnsYC#e}rpe6_x*kLmQ|8eDib}Pj!2Kp+Km-6%TwQ@`;20g}E`@z;T zqXQQM1&r)_s)I>W&DtK(M{eEBEP9(ogG%_`MNc@9I`yqyTk3Oj{{q&ti~OGktUAvj zDc*e2%bez=4Duh=6ax1OCLMXWmO5l09lm06X}|By5ZzpfS0;nc&fy2_>fY;ypWg7E zJ?BC0%G^6rg*$9xtU_##E9sY{G>i(|oxg7~_~!Kjfy&>oDqxLIxM5!;ugB*i8MTv>C49bP3r<@-F|`AG?T zh}Gzp`}Uwq=*H^iIqJJ=LjfforQ5c5P=`uVQF8xJ*>Y49V(SY7iDVK;iNrvlHz`M= zf-2R!`8Cb)Bp=_h8{^)BXH%vWDIoq008XqCv_PS0E5@Wo)W~jV7CZ!9QxY)!YdgOP z=Pz)36SG~D{W0a%@$xf0nV+zQVCKv^1oJ|3d=)9|d3kv3f$ZKP_>9ZZ7r2iWv_y@1 z7$L6gd*z7g6hsaQn;deMjgqz2Nb2_be7s5^CR)WPcWS}ywi5gCdy`o$b77d1DIsEc z(~kwh<#^BNcYSbSyJ|VW=QJ%}V?SG%j?qkhm2TJ|bBLgTGQBc%T%PmhnpDaoZ#O^< zJRBlky;l+Aa~_yr74<)S|B79^YSNkGDO#PIE> zS~@b5Rm$KO{A1}ZNRuHG+P97fuI+nMy!IhOT5oKS5ZaqjmDM*l@8KD%A{J4gcBgRF z_sm2$_SM>fDWdMaEw1shcAYAs?)DGkLch}1zbi=E^CZ-FYnF}cTN^-aT?@AsNt@i^ z@7iOZ!xq%XuzN4&YVqN~S|{74PgE)|kGkt+%s|#TUUBima8voIeXV1+fP(Y1X&tTU zZPB#;JN@hw7G`ypcY=8DjyFZW^Ixp(bJtme;ignsAwuwO;5Rq&$9&^0|JA! z`uS+93%ee2a^hobeN=t0fn~MBc2+cpZuKdQ&bxHpuX8w<9DB_yZK8<0(Duk2bmgA_ z>>HnwLU~L+_&w07SLT&tm9*zDO&TK3`MQl~F0}+w_A8~AGy&mT?KM^yiBF zE4t9$+F33?gtAivo_SKuy5n{c2|Sm1tVjotiqGRrhbfIoWLJ0BiK=W#$^68@rMwEh zXQ%Ype(b5M@mKCwUfz-M;PqBK5BPHpKHy@;l7=& z8to(-VO2!J{_1F7T?Q3uyhM{wGSATv2MABs=ZqV;(%NpulfjhB&NH7$zMn4!0u?z3 z89OpZNu2;<|NO?={ivf4F1~y2C6V@w$?1t@*KHS7bzDzMHQ`-@v9kBh(*MYhboenn=m+(%!NYc~S)_R;cEi#4Fv4o1b_M*Jngk)djn+Ev@VpE^ zW73fv#SMjTV`IZ0H2*xD`GoE}0yBV8xhVi+^(AoMmpGOcY2(F~VEASzPB7Va|pm*GEJ8(Io0zBO}7!4=e zfJykyEBx8B1DB;tHGljf7P3d`I0?A(6mY!5duy=vMLddYRl2w_O4Q!Y*}&%YzGZOvC*b==8=BYx=uTPKWtn|EdgILb<-|Ye%8@$ zjlBk&RQ^r!^pACw?WO=%lLNr{usqckbNz4uF!r7tI(>9zqmc%nyb20$FbCMlWxx0X zski1^{j<|x;(!$$)7dH0Y1IJAJU?pF)BG`*wJ&FHk?79yzkezFkP>CqJ-(ISaSp$C zyg`a)bEZtH{JtGP%+eJB7`w97V}#XKl#1?jCFIwOzyt=r_689e_)Ci|3acObF^6H5 z12CuEco**dL<4PjLc_y%c@*^mJ)1+l3i18U*yGAS?gnSpk!;X?WG@hp=;1yTL@37k zO(;;083T3jkf^oRx0ido6p+KMKz@iwe)9h4ogJi7cA26m5TifEgQ{`q)(F5fZ?@>- zY8SdDN3P*?b+zvc&iNi$h|hMt{o&av|LXU*;!Dn(gW@l zKVS>=!U5zgo(AFw3s|iUcZsh)AUU{jbqET#E}4(u0UTn0f(*KZ&K|Wo2hpY*>bdydQva zr0U=V+;tUDscy)1&$?Ro6(}lqsbWHvcQ#^t6WJ3RS5vkZzjkjNnZn9TO!SdqJ9AdT z>ZL~yhclJkZStNLE(8r{F8Sf;2y=Kx`a$VUAyyz;%>;-s7zR9Uo*Vo|Z#J6w>|@{7 z$A!ZBzCgQQ2t4gkG<0)!Md&$F;>#=i%^p?=sj=FJR>1gW$Rv2t`$N zp_bVGemyBEWg8p*Pq%Y3h{8vI#DLaSh{t^drmWpRwgPboi5U+*=2;;{F%N#0d)Q7Q z0K@jG+TzuZ)jBG|NYDt^93Ht-c&lT(iG+oQ8souKTXBYJ@lLX$!49^(v%5~%u~%IE z83$$ekcSHz2EToK{0R&vyeB{U3UCxzsw+cYRpg9DAjQXlrY{>zw16=PGfJo{5u4J9 z8VA(QBMk)-ks8Ug79k)Oau&Kt=m^ct*n3jv@IfCHXE!*)YNU5Zm#c5CF;tw!yX1&6 z62|O$9$p&1{yscJMqW>cvbI8!`6J=ZF6v!!&${ma?`1PagKg~p(e>T&RKM^42xUuz ztW+qQvS(3>ME2fPw(M~nvKm5zWTZm&9>+dr%HEsfWY2RVj&U5n`zY`6`M!UD^my>7 z&UxLh`@XOHy07awtN>!M%1XF7Vjc;ekbs z1ra%2tS6{&n()>6y;g(tgCAFCV>=O%a$>rR7E!~o@GR~Z!&~DURAh(`3WZb-IjS*^ z*OuzMiY}Ggz8jkznQD{(d!xPAWM_YWL+EE0M}Z>pOWwC-#7RaW2%FqsPj{ynDAscx zz0mpf^K}}>FEo<`&}d%*?YQv0LRofDAF&7qSCthhD1cPE&Cbm&)iN?N&H$x`VRxdF zJFXLKNAGTj(_-72#rekZr^FERUc&0SHfSQ)%Ild)7NFm)7b5$zf-n5{d|F zs5-Gv^*)}_n^~1ooyL|mo;_^XEP)(qE}k5rtI^epDfuv*yzbw{%yiIfZh6NZr$h{b z3a@8?H7!}PO&jp*#2;|jX&S6XTYsn?XZaG4<5xjU$R7U=)${{a1G}gW|=wzvXI`V zue>Lpe!7~!u{3rS>nRFyXC~a92a6lm@gw{W4-7;=cke4GJl)sR`w|hd-t*~%sHmt> zk%}`u)CLg+(}TX`ZT0m(&C%(Mpip>sW*Z`z7whyOs$c0!M#;voMrV)X{O_3N!i$Cc zz+5bJ98-R~I`T3!_iobeYU-l&GE<6R5*0Q7bm0uz>re!{wIu%IC~6)(20lMf3?c?< zTRm{-A;H?q>ZA5hup$|#2fw|9QTjbeXlx=HFcV|&8M#g})--UQ0F!Y#dc~&_dS!1h0H*Z$=eoqRz+9$opa0#27(}-9bBDWdV#o1*eQ<{oE zNH7Br!qQ}(5e-9Q;3RA!OW_)Y3s8l|haxkf@TsT<{V2?eo`!G&6RsFo6Zl84{OJe& z>pcV;;QQ5l`Uwla!)P_e--OVtZx>nkRl z_{(_#EM$633yUykY%isrOkOyotL1PWFy- zS1|QEpm{zb!IOXU_iB6?TOXahH(YyXC(%L}^ov!<`WHYD!>36WphdsDY;?Eg(7Wca ztJ^QVLErrO861{}sS`U`k`Akc?MEYB)VM0;|8tCNgg6F4uY9rYw?_+X>~{UU>-4)@ zgoPeAd7r?q2-T1Ly5}@-6&2x`vMF)1v(hglTWh`1(%VwgMys_GJ?x9}A%}X;$IVQ< zM_5l5R0?x7&kU#>M&f3=wgXFk0!!1EP3FTOC=K&5BS3ih*VO(VoF+I3eOdkt9;6*b zRrImciLI#tCRG~UWY|_=@?ZxY;o9kX@!ULK!X^a1>pI*}z!%`agtN1Bp0K?vmgZAa z*IU!0y|a&S!B}EnB0gt+B+8nUo>?V`>q9tK8NeS;{-T?73og_;M~_9|DEr>nZ4W!Zfg%0V*HH*lRYekUa+_h z#hNdoVdLLhEwRO6AQqcM1RUHsNYu>fprhh87|=w&OaxOA3#Uq7rCx9d!78==Cw}b7(T?iZho|EvUFesn*dPlSY}A$RDgw$l-6Zv!c9tbo}nc zvx!xF-?NA87@OS>aX{^IOc|Cd6$pFG+eFq_b5nj*3Q<>ZZqFQ74iAAAStQCA6g^_2 zky1E1n4mVoxTVbk?7YAKWIbAX)O*$(mYXMsp0q5KfO$?J*q={Yz;PGL*$x?Q(HV z5uT04kcib(bzFoPsro0q2GxWsKKPSI+~Ns1H)frNHZ!Adw<*Iz2g3Q#4F5UnZiI1m z%8OKmK;a25*w4-(p19!4eesu$@!%Rz*8Kr!BlWay5ml39yClyZMuWl2rO;oovG=^7z z2RAAA8#4SQJ$f(scVqMHsigSV{ZGo2;Jkd$K?~~o&5`!u%42XJ~rzGJ{Cjg z4(vE|f6DA-ojm>SHR~RW<5Au(i@TJa@6R zFitx2|2hl^xxf;<>m2g>HQnsO!phX`pmE?H#5Q}Do?bCrIF8#gjZ$sZUaM0Y@GK9s z%Au=8tsXr~?Dkbdd6}8@pxp(WIJ_38eSk`cA2c5`2?uH{Z1^e_wMw+qJd?-LV|4V} z{J?UDVQN6)X0w3v>`i4<2V;8r~Vhf)T7E9xhZ_mqmGT7~3+F_P6Ih&yNhWsFI0>vf1uzk{~aPq7e zC3c^ya__^rFX2HPpV`-2K^X>rtX~|~&%%0!!Bw)_%){Y=%z+vI6)qykO9f43JfJ2& zGU|b1N$Nt@B+P|_l!iSLuP_Pr*H`nyJ^cWn6DeIG2O!2jM<1kciit4*-ND|?(JE?h zV8w$3>U%>iy4nhyTR1vwW!2h|2)Sbj(8JohN*4oVd!o) z|8&EzdM|~Hjcpgi?Cjw!cXx54jZV1S$MM4Oaam>XbSbNK(P`3?%QWt*U-y;x>+hscR+ zARX_IiPm9W^+lN+m2HZNr4we{ly95^P>XECJEpG;e3CSdT;j}G29NNvIMb}57OVC zTQwHSJ}gGWWHlnxzy+YevfPOmYfALu3d4(c?~n<`3QE2=1@@>`gYHv&Pks@4{=phigP zE&{N$r0W3z=?b9DWrUc#7xD($4B#(w$BV30*x1!h@e&r|xmjm`7U5nxaXlbyrv?ft z=~sv6dgYDxq3G_Z(F!)*IVp;bwJ;73jU#`!yPo%K7~kvyHc|9=+dg*DeSj?3D3^W* zibVJM&u`8cQFf}Ri!+?N^+Wb8LjUZIaA;KMkYojgO^U7j{ZTj=?H9=kULgk>{`*K& zlp=ffcZe^%-$dlIgZolm=T_qas`DnGIdwVF;sl@c+Ou7D`7q*IW@d)tH(%=`L(^rfHtwr8OKF1RprTNbK3?Z zxnVFgMTdwa5enNpVG;_~Ed(u}Zc7}tK6Q*M%F>Dj>LTQBkAS% z+Fx2O`(j!+b=2GPENAw?yKhLYSV|8#ej-2LKH&LH*eJ%H99tmpcx`h~WGILC;UmNO ziakqjHr>8g2KZye8Vpm zmf%5a^%{ONoM8wh(1LiXM`+wo(CcUaZ^UY7y5jWV>vM4#%u>m(HTA-wag~9#>;QA2 zKTo(lfQO`9;^CPAD)aeJ<9X`1^TT4HMY7$Uoq15i!83t!|(sG!`YUOiPpq5~B>UJz@ z&A;aG`f`6CL{eUg1+FV3e?{u# z%++dfv-E})ZWNr<;p@U@`xh{m%DJ<$z>LgqXXeKbtLP>Myc%WEBhXQrxb4`7|;=#q`o{Mxe$GH*m!Y;(QF2&9U1bb(gt zJ>4exLBuXSpEs~R zTK`PvPw5BuT=GNuZCj2N{G4fBu}rqb8Tww!{}$`4CM*pybiA_zRTmz-)dJEPbNK2L z3c>nf+jduw`Yx+lkx9b$*JS`22ikB1XAnD?(beK^f-du}KImGhh*KQjf1OS`Hy?9{%;JH?H6Oq2W3zCE(n)eQp zGUJ#wR?LYznS6v5#Py>3#X1DlV*uOtWkJ!4q|SePwRe*`1tbTwhZPl){3aE&0A0#? zR>*91ED`~N+-3ThHZ#n!ewMhu$Kfrx)xs4I+k6uZLiFNWFF$HivS;bmmtlN$05 zHe^T|@6_AnHRxj$g2f7I@~Sbyi8$IZD0L{K!fwNrC!xjf?RjiBS;!dwuM8i(6u z!L=2sbHAbPoAb5id4JMi{+yQ>S@Ce5afXt4RwRHeOOR5to~k4T4L0|@uOJasq&#Jl zEoE`|G29zcurrO`h3lM6)uUpVtRT+|Nx)#Dwhz!WVxeei29r`)vp*}ZH0g-X^V5Qw zb>0f{b=zL6#s?I4f4WKTBK?KYuQx67bvN%1-P-w1Qn}AE*@!p;O4S$13(HIt8xffZ8ov)^&dYborW-9s8^R~{9F9dmfssRr^dxe zb!|m?r6?FlE{B$6SFHyqd31MIfa>Ot{v}xI1r&jnw0Cp-LW=VKMVjGe^ThCJmj3&D zm3OEJA!$yj5_=zopn~gko}PpCDd+71Q43WmHaPP~F7)e-#`b3B=7|pbT+0h{ zA+P0PI5+{aA)$j0>vS_XaFIkkKqRLuT~+dZQ;S2o30UnzNEC7zVMx6{(cIYtJI?JN zCM!-Jo@~=>$d2zQ;zr%OUIAa7QV1O$Yq zl{%}JkE$i1s^`By{Hn-s18bzK1^s58^IVR!zPRy20&ne<$Q`FM^mPS|z1;&7EjaN+ z@S8F?^!Qg#Jw-@jzXRujEOdS=zN>yhaR3NL1v@=>Xwa}$A1TT5mS z>vC{Y`ybX-G}>#nKHdsj%Hbn-OWQ-=&V`w5p%!vw$)FCLNR-%Ut>oLlTm-!=^mhSU zk(Q)`P34o_=8d=Swb0jL6d^uo^{al0Kcy)Ju+(3F)di1oVr~RqJ}c}kO;Ub=!?`zKJ^aR^W~shOld4yFkNoBvOFt;?{TVuameTwoKl`Tu^_b)Z&H(ejy zVvM}qw(TpSHgHgJV=}sx$9758JPW3vC&!U8MM5f;;-j5+V^U>vLt=#{@>_z#;K{oa zhc6%5k3WRC6p%xco8*VBEM)Oaqpst;O;M7J=}gigyw(1BYk^@?W0nK^{%bws&nGNG zxPBd)_ghB*a+f8)#a+h&fBo5SjjAhImJ`|!hDj5KGkFw(6cCostdZ;F%DMQ(TI+EP z;n1FT6+4;kFY_^cqOBnBR+Q8fM5OMDP>)i*>M0vXZUXy4O9HdoJJlw5oP!KkHBXf4 zuNX}UH&$&^sIBviq!`LyQe2;7t~x_rT8C?K#h%HW49cbRCPK$k)m_(ag;8MV0!i{bhvx%mUAwVQ{=Kv#~qsEEf0>iC+B;- zpe+=Q-(BDR&Llu@>)S+~DL)yN7tFBp#Ojp2j^+-kPgYDgpD-gWwEW4C95#7XWoIRj z{nefcSf|)nUb{zhxpyuPCvZ32?bg3O=`v`0`zAwviQvE|Ylm&-d*kanDBc>#Ht|vC zKI(;hK&QhF-+}xkELBfWJJP1_bsha^lKa)~5HAyoM#O^w+E$qXSy(<=qC>^Rh3uL6 zN>v2>1ZWf5etY?kNB`?bMQwcc*oX8#8UYX)I5ESbN9a;6P8oD)92a5bPjxHZ=Atgi z*H89<@0Mx|+ArCGq??lY0DL8q{$1!AU0ZtgZesWSrknfYX*b+cL*e!cSAU90OD64O zyrIa_Ng8+a=7=*7K38QD%N@GX37T!6E8ds5I;?3r%@+%oTdnTxFOo^RcO?xnnzsJJ ze83ge=V$QR^*v22Jl2avHVj_-urtmcd5&}^ESML&WRry>EXh^$68AKHIBa% z;-}o;Wb5@1^A-F(B+Xz#vMj1?*i90}eC~#>jn@alSqXItX_5=?-D(*-P?XTYo?5^u z1nr%~v8|gY)tW4;AeHR-&pTAbG;%`WehQL4wUAMjihOGUK7A$mLox)`DQX%SZ=ByU zDkT4Mr!*V`gW;+h5e|7S4L@QGU91c4?8s>7hF9};MDW;NlUXgnvWTcqxlI6yQzK&K z@!t7{5!bpo15HmF=>7^CCc*C{nd`$JzsdR^{JN*=gk6NJiNnbcen&z1Q@^6r@(cK5 z2QgVvL3v))A6{&~c@4?bv_wApKKkui>uw=zsGt!I+eO1t&z1YTIO)D9G9@e|-lM~{ z1tx_Yl>6vgmR(2AJMH)^=UtvCWpI0RMG~@oanX0|SsmtnCk)KWuo2=qQEr_J<4p%= zfGV?fUZl3CcHQ-^mzu7?ym1u7sz)NxFy+qO@n~cLCNTo_kB-`3KL!(=0-auh3x8Uf zy;o=-=rm1b+t=m|kwc!)(XH!k`fz8V=PAUn?oYB!WU3jOs9?$fvEl;SXm@QVjTn|I zVfk^&Y`7|+7Xu5%^1C!R&vr=WeTI6&6MI%2?iv?T^)Y9Y?`5an4THO6p@)Y)uYI<) zC4(+xw}F@vt=^`iu=%BmU}T?JFEglrys%qqm*oW#g-fvS&>QRlNFKj?F3m+7!~5#Z z-v6ghlk7I8I~{C%Sh#&@BaRMvm9ra$W_h6j1M(BV{N z6jHBtTxV~5i!6BJC22is5ekQAAt7f5W9nk<1s5Kk3fdfYYF4qYL-Zy4$Hc@wyP5)_ zH&tOvMd=6rGzB?zC1CQJGUD!mR-Vj<@dP@Yd@Z;|o@2vx#h@j~c~>Xzz0x?|fDb>_ z1G%~={Iw1A9k>Cz(G9r&T5ZgJkH7lh9tEa(5F{wBwDIx~=^ryQmZI;Mt7kM1IqCp$ zvI3|DEx-Hud$LMjD$Yi`kBB?V@*XXr=BJ7Y-=Eywa&=MRPMcY5ro`MNgm$5ar4~@( z%YA<1ih6i(Aw%;*hIcjsdP!k)XI;g>V@g*V>jWJ*&2;$lMmRjsq$lrpl|Z9|xXE0B zc98odAJm~o|K(?4xoXBH^TW%Pf7)>8?TJ_I6J7%cx3kdQc5^gPH?VGaLb3yx7fEc%0~K0TT^zMO2O1FYo8;WU6ej!?=nEfPV z5bQuosJ<@!z}0rep5XY+VL9y9gZ1e>>ad14&udQj9QHYQ?l_djyKNj!zUYlU1gI;H z;am6?mwBrBK=6|qch>uY|lYg^Mafl z8yOiHlbAg{(4A#U=IJQ;tQbl5_U+s0s+IhvGa9nNrKP1zGX5U~!72(y|eb;*;VtDtw;WS+I>S>_{#DArlsJ2Pgan~90W3OxOS_C_t6 zqqj%T6fTSp;=vk>{C(u5De2&3HOCO_q|LI1!#&F# z%#1_17}c-uPRV-6dtLqt{Y5HGEmzF2QRieI#_S)t1~HbpG4wjciR^LuhIeK*c8d!e zt8IMWD+pOIE+(%jvFiTm+_qsO;(adGvmdE_oct*(&Yu!X?DPSxv{$cQ1q+&1O@sdQ z4L}bB%z&GhzyU0gnN1%kz_M{LRY&d#>G zVj-~lOkB*_Rc<7TB921y(QV4@PdBO#3)*NFXQ)7-{}Kl;)L~GLEAN|`_90=IK>=2v zY;f5!g&DVO9AbWa)S)l*fT|NfM2j<>(=+p4>>&i;=dEG}M$lY%bsi1Cze_1=C0){d zbXD#0_}cwb=HThW7Gb-~zMp^RR_a9J48LkzEm&07%9s*|POET#IXU+WY#r&<5*>Ub zbH`ENz1?!iOa2p8EE|wfx8KLR+Qm6Lr1x&|;I^)3@wwN-4D;2f)M95-sSl-W*%yBG zLb`mvu}U&WRan1z@Xe!+nbe#{26H#p-<^z9oi!T3U8wIwn;=oBFCT=Z>@BaBt`$V5 zY(M;_XDKJu%K&`?!%ix{Qu4rV)iv6;xT{zvY5as@hIEz)DsJmq zx2JM-GAy@YYVDsInH!azBlpQj7#vsIisFM{1%3Lg zwjwWlenoZ1K~G+baDOClA%ZkvOl1bsHZfo2KA9uR@$Tnt;IQi|+Pq ze>ppKQ-;zz$wp+^OQe7)wjCH5C@AWz}*h-zKb&gZM`^}?k%cS~H>Z2dulz2** z>6d$EnA6J=X+{@xoRWVE(=+#b?D!{pa!!e*oX%GAm+Jz>Pf6~&oMB9&e`-io2DP>V z3LL;UUT2HC`kt@!bQRuvJ6)O;T-QUbG-zd?WS4~SCY2eTrzX&T= zRjJp{gz_-s#DiP@stolI0V7^g&^Qe5mfyd72+akIDKgXQy+eOCLy$t0GXg;F30^>t zdD!!@97XB>JFBB2PB_fb4;kG3Q}?5lBT9)|?+3+r=I_Ey3Yii2Zw9aAsJ*g&-t=pA zn({##dKiWt_RO%&B9Ne%0^CDCJqBD`5(bB=!7a>*gFmh^}s($d%T2x``$k>Bs^;uXk;Td|u_c zyEimK0y^s9M?ga;G0SsMe7M?)l^Lw;ktPTh|Fo`3R!4-R;U?&9G;mRsyut zon#EXlIJZ1#RrKRm$skvk34R>8Vorrd+k1o5K& zRryOx?cJ617uOA0SJ4ueljrXpXP@}8`JeP2|Dz^PJ-Njcc^=&efOP<^?hxF;zWY?1 z-krzR-s-CzJGt254{CRp~_i7 z$9on)^w0-1R(=AHt()Z9%85-(3twP<-Gk6um}}xZRa>wzHfl*#B9u*fFWLO z#R_QoR{%j{H_*o}x9L|JGKB}qeYyL-&ti8eBP9wrjb%58*5Rk0Hiu{(iJ}*4{&n9z z5NY5*3AJ8(esUoIba6FH=(XP2w^b66y89{8G^1gZ-SaNjUuF~FTZ?i(UK1_1C;z+a za=f-f%>ep*u`^Nj2hbsn#%m!5CIjQInJAg{deC7pg?FUzcvZ6jnup5Gn7AZE&-AXHLGNg1@qB~`t)Y-Z8B(xR1aSh!k}jJ1hh-Z$w7Cg zno`u}<&_n>c+oEM#p_mb*vYgbhLrRw)BCq!FRoS*54@B4TaDoO3Gq4lLlzJToMzUy zG66iO_FGq% zb79n|V>oLB9xSNHPob>3!_wil3zZ^@{&%#7}00Mu>(>0{W>9dq!0kVVFYeFW{T8!(B=#<@Cc*inH=M`bOB(Hkjb}kagBB*Vg_Fs zkJjKFkcN`?3n4BvFpPJte>)%B6)GxvSP{HeN#<`!Gm#AZRWx{oPlBJp)NfsKejAKaksJx zt=~A?o3&O1FE>)CK{~_q7Gckw#5z9=M^$;IZ)h96&npj1H1Z&b6uYeQd9zb^-*3R1 zgsJEP$EM55N!=>uw^MAwY1Vl~1!J%PyPl|GT7zHZYxTXn1ZFO)C#>6k3Ufyh5n)Sy z747*>ep>gx?~v1GJ}k%hmSVX1-VuE|>h^0i4DckmYyLm5bY-ykEWHM8@~7~)RB$bB z0lE#j{`xvPX?)&*Q`oGxB@Q^yKzl&$p41%urAwtXMC}LDP2p5cK-x4Ecs-N_{sb3P z*XGkI1MvAX_|vTDQeifBnspJ8xvcN2tZMvePcT|hjBIeWcdX5PN#hl{n?z>4Y67tx ziUHNz4cRTu`$Duy&gAz?FrQ`&k0{CT-CYWd5QE`7QF} zFU#a5;cpk;I=#q}nf;U)aI2x!VWdyKO^#Q6J;#7~+gHug_n@%*sAdxm-(#Oq@)CVE3Kd&~c^IXy6Hz*{4Ap-qFws!D2jAHJoq_{qII|lzYsKLcKBzgU;|M@+~ z`wI%-*1Fd569^v7O??+_wR~trdRL&(Gx?n(s@?ZHK&?)Tdoi)u+n?A%^td``9q=Iw zO5Z3k=0^lf353hX&efTYzx4xbL zhV=_Sev!;ioNwN|+4=%DFK+d7gE)}y82D5g+NPDq-*jC8_;g6yI2T^{9TW+J55xuy zKJ#ijZF#1>^6aB~LUQ3pX-@68!gj4PzO`^K2sU9;-^Bzo2c07^$P16%hTUO!tTx`@ zq?5Mzfg9$ba@`1_d$2MF$(W42omNU6_*C(Un10S6ddR zV~`D8WZo7T#hIrHZ$3|@OkUgHI!zfzEo?v?c&f`YFnG_*5@uO_?p#1lnF&g3{guHf zAeW&31cl5_z_syr?XqOZY_0Ln{P2e>u-*Z zDB3I{$dA`<>h}tsF5y_hWPX+<>|@@7>jNiO#^6C+;IKyCR0NDIDJJP9h;6mClNP%g z*;YOc!A^^7OiJI~A<1U`a0=AUITUPqZmB>ltsg-2^9U0{?_#4pCveb{6{JQ}CkEoEx zIL%t0Co#+Z_q*vK8RCc~1Z?Mlj6kK~H3lDuk<04(`&A>>Aw;w$cp+k_EGg*PNQ^6a zoaH5heU=I}zz^qR6Bou(CGlaD|7$oG)Il5?D%_FRpn#Fm?>ZNLAL)EISkdQpUu3P@!XVC?u)`nwUV>@CCso- zigzh4o#XB8FTJu#rA39^rQUzhOs#dk5l^|^A+b5iu z$lDHIOQ&89*@7A2WE4)Ivv~0>1!cww`vJs3gGXq=SXhSNKRBlU5|G^B749i#*01J; z_IK;W!hyW1FCl0n=Y>P^HKEgzT8#)tz(Tuie$2VV?>mE7_Y1hmrH(>{@27XoXMUOJ z4t@jJxgCDAYKxe`{ezP!!!9`tJeO*p_Wn#MA4K|^fN)I;!gXu?&G{>TT|0s`$tin~ z1vbxI5uAs{1-XG8KbOw<7 ztXtC?eCPOq5i$fuoA(_))5 zs;2}5c(y!V(Cj4Lh;xM>l4e?_81Ay%HvMa7|6W$7O6&X5)q26DiSpdFQ$R8`{@NqD z?3|nv5T^C$quIcMD6)F;oWyY^a$cHb!#*zt?X4IFNgbzH+-}=N*3!q0DDXzLxR$u((ik$7%KJ4m$g9KG0VlL`afD5 z77H7kg+G-*IJk`&n`}68y95~Ya~3jr9RQlSv%4b|owxfC`)S@GQb$R0zwd{oXTF_g z3bRhDx0q6!TV7pxL)D=P1?N3Zer~`QFs4$d$9uyl#58fRtnJ3LI=jb%eFIlZ{3cD*GAZ2OXr{wl zoFT*eK!wQJTWmEw$3l2Je1bP0JyaH@fCzyc?)LE*Q>>ph-(EmTe^^(5Vp`VzH9C;y z+?WO$TMeN85(R`)r-3Gw;;mbx&UL$X2K;fFtRGsBLT<1fu@x^t9gxTn@me*AJSUcY zCk_QaWKV(Oq(F)3^Mc^R$F|4f6;CyTQ{RZ9A2y!X88tqe>nAg*fHKWMyso-AI+G$p z89Lfim8r>#Z-q|h4p1}2CataYP{jcZUE-M;Bw3i6a zw2|)Gv#Q&B6FWj-%-(CYg?4(hEcL>;m=MHfgIHzv?3r3-@ zz|(~FPDW!L{xE&28mx3U#vGfmB%1}mzt%ttG-j6!kZx-}Jj%G2462f(695Y91N4q- z@>`FQN3R59Y_46r(^q)Dl)vOANqye9?~`6;Kkh7);k;yu-x9ey*T|M9i;IkSe1B~% zL-8DGH6=hITIgRjuqZ6m4ldjrmJE^V-yPekdxs)TB_6dm|3aTKgegu85~Q9#Sjb8Z zD-XAc`3qrIqt`mfc$bGSN5mZZCR*!r`(}Wv!Hd%kmo-k~y;T7{iYzGPr8*Rt z6etQ3KOb~S(&^11p9UevR#ms!%gKLx^uZdansj(5O#L6niod)oK30%j13svDKO*{f zlYnOmgl|wvm&EYbM;yCw9Gf!) z(=y-{*#X_^YRh6EaA(Z{)#c|-zkN$Cvj$sj;nvd){^PF&F;nm?-G0$*1YKR7XI!yV$c`hp+~iSv#(^-}@iq zhJXA@e=@jz068ZyTrt3jy`4?p2_J#z+0GTMTce$SI_`${Pf9?d*V{ zM>+5$83P1k(c0^PWL88WSW*8qn#0AYKj_%Z_LC4T^dVWq)2BTg4iztj<)yw;N%hrt zuGGG05-kX2{mal9Z`%>Z-;;U&BCx;G;*5UMe`MH^#-q7PGz|=m4ILdF%d>;ZsL?>b zYZAAFEIKxFxuIs^&`7v%u^=sxNy^n8J~Z7Ja81qHdlcgjV=ERoGq0~*(PSQOi<~0p ziuz-$8+Jk1d))+>QzzbJ-TPu^W%XG%Q?sE6n1CN;C%?G zIOJv9_klHO$`}~-g!!$jV}|`ESb$#vJm!OaRx5K zT(BEjui3l@tmopk7JHl21(HYWYJNM>5D@KNqyzJ{J-yd{IN`U%d#LjJI_G8-> zS{xD9?ivk7Q~M4SsDU{zC*TzdY2@54|M?fQdWuMtkNF&`yjjv=x)JeJk5`lzHtA*( zRG%Vzg`73Q424@2YE=c*OIAmq6EFl!Snp!` z{Th3Fd$;RP(AZRQxExOmW; z>$jB`0g>fJG&n)4io_j;I^y^Ztw1I4O)S4*A5bZB(m4^)>16Zq&nu(7Mbu(XH4TpE z5kU8`Dsy;H=QRmbi!AYeRCrr7Kfd8yLu;TYUwrH3Iop3ckt+!iA9O|KU6Df;mg<~v zux-y}^|&|mxIMdAsVKCBPvPHB!=qVXCI={7@7a83U*U@I7L7y2wrY6)CcIHLJelWs z0ttwG887P*qMM(cDdF-0iuLjAhGn2KE0bgD!|^A4KH;ARlM)aM-}Iyh3AcgM@}{3@}PmDSxrc(A(mbrogh_&CddSX&Y6e>6}h zWHXWWQ~Dj2gP)uoK~g|k_rE~6u~c;d78btz!L}cQ-tl1v_rBM)nLjYB%-^50`yf4M zaU77(N0Q8Ur?`kY40-e`tcbpbKsB^J-P&3nTzh&k>eLLM_2Tge6(5q*gEOb6h9r{w z&wz?A#+dCGbH9eS*|ZAgK!{GXch#XWRz&T&-$Vn<!pbS zL6^C?pUR)9l0C(WR!`0Of`(BeUDz-6vnNOw>dXlR+Ztu8I=-3aBP;L){MRSrf2E}-%Z3N@ulOX#F^g-N0IJzF=Eg;S)^=YJAvIRQ+vt{y(2~oo*VI zb^S@&u}jpqYDJ43W4@}lWdf#GP|1BEXGWHCvh~zTZ7vpi&{yJG6`aQwLSo@;0V%z~ zx(1sP!||+7|LYk&2#KaYzUkxq^Z2v3EMP((1KK3kN_e3RI5YjcXE(KX6It4>wO%eX zDLtI_Yx7ind!g{|#kU7kIn?U=tSgDzm9-Sm6=NG^h6Z zkrnBIK5rcwCL0T1vYvBwSgtR&(kXQsE0Kz*EvzQC*)2u6XQTC3v}itWyrUsKULmwY zM6HgvuVaqJOdG?rZ|GSztZjl$g(fH-_6ZrJXt{)r74}7Dn9Sy18y~?heqvzNCmEmc z>)3>B^z6tC1(YE>Pk|n1W?n0TbSd8wMTh_gBBJ&snPJ;NTGSW5m=9dq4>QzSZXM6Z zc}HT^-6y(oz&lp+7jc`)dih3q^`a@0K7P!zn&2xUELM+WfiKtx`vY-vc@vOoF? zuRgtOD8Kr(BM4Y8$`YRnYMPN3QT;QgkwFUBm(gWS0V{p%N%%;}^#8bf&w!@V?Ryvy z6oU-~QL$i`prF#Eide7(Pzb$u2ug#fUo_NU9nxSp( z;vH~OnfGKo{=%Q5>VCy85s05x+-sueX2vvZ~DNarE|Nv7$T31ySU<9^yK=L8D{zTo3e^4w;UDyryT%773 z?qp|u*5^L(cl_cKV1g{+MLVaaq`(G_)5MIJ=k)Q8-gFF2tXC7Zr}1Rowzof32lSmj zYI-STFFm7o9(?96`6U_$87^>Ky?HYQM)5TvnHn7XDMA*_?_Hj5=5)mk4Y$1R&PD1X zidyQQRVf<=@0NGkqV`q5OnChFbmzy7B?oX0B1$2vG)_XYFZmL3N}p?brke2@IvhK8?gn-RAjwwY5u3-%^;qhU zT*dpn)c3+w`<-RDuWx@PFMr-nIyk%Ne5{?ajH>o5!T=8QAsPiLOJQMii|nq4oEqC^ z!9D!Z$0+lTyf!ulxiImjhg%PX>D`3dAsIU51L)34U7odubUw|xtLPpjayA8Oc^be3 zocu;UoUKrIxAu+4Mu#Eu+u!dV2Ui0_Sb-bKp_`Ey3a5b5Bt{jYqv2qZPTNH2wTU=V zE$fDS+Z{c}Jgc)D+bY_bzuAgj@Jd>xPnmXs!vh?&+btZ@ z;u{y^Yc_@V$fyt!-hUTvIdIq>!E1_?I(^E%l3{MngOR!2|IE$&chHYH;6+3px=r4a zV$TI{c-e__y>Ik~!N{ZZI~jIs>I*r^CZ%|-P`wUta&6|04uNv0K?sxGN>YyB6y1qc zAq}{}HJCwK&+k>mp=tXpR#Y${cF+b?v2is3psPdWI|4>YXP6!Y3i@IqO(9DjhPijM zW1?U*(f{2R+b#15R7WVUg}nha8(>R_87nxL`Q^)v zm4QuFtGj4)+ztA9Q0L^Nx79#{3~gErrqBp8B}-$NLXmlaoL1hUZhVqU;}>xqdAY&O z8G6Ouqq}^C6MXlH(Wd7CiU=ke*;z_dpI>!t$rbD28x~}r0m&2&dVuUo9K-1~^9l0R zI2TYiQlOR)au{tDw~ON24`$ecRj-++de+So8U(N@gj32=dk5>Q27JRUmXiqGs0v4IHD!$hNrNhcr0H0dmgZM+-_RaBi?o%h8#p-6i|0J$io=TQ1q)}(YPB1k z7YWXzYH>lKDrrHRr!m+N-!YS@2rI9sDC28$!QJ{rEXd|AMb(K7sPHJ{nmx;vtQ-fQy9@e1C@Ny_Ukc*de9M$pjxITzgJtJw?62SD`RI zi16I9F6P-{>@1rP4;R#hU=Z{=)V|r2P@t@v5fpb(-vgSoG_X@(`Os>kTAHQ%;i2XE zeI%WkO8y#KToXD0B5Bm--Df|BIrZ+&2FR_=ec@5H(^&3o)?_GXT+?j&WF5kG$et@i zh7c)Fla~>tAxFQ~-Lj)`dP)sZolBoMt!!r%^}h!ZMqcGJ7|*+4>Wfg_leK#K`fZL_ zZc4%m%!{hJ;b8hyGs)m_8w~LvY&&nKz?4Z703Y7_i%b11Oo+E#!<*2-?{&))d+_q? zCk|kXM#XY6i}w+yw$|V2oy}modgXxH`DsRN`Q1LWBZLqMB~rjqN5h1|et}Jk^4Qe< zPNpjR>sTHdYK^Wd`3Y$J%CP?|F#Tb;dBOatkPj;|zI%EIcWAmWu{)SV#O`W>PACBh z-vj5{feO$o%hUGep{ti;x-&i0AeT4>O*slVw5iX;JnS}CaN3*ipt2Pc$LpLa>}W;n z7CSO+Xu3$-LXnFY`;uMJSpf~zjDn;vU=GtHsRkT8%y$DyoGEmQg?9%DI=2tnfiDau zlE`34;a&uxT&BD_d!`wHo;HyQMK`^usQdMbZlbzHj6-eN>993q?7O@;vdj#a(ox59 z1x+ema(^XozY3s{uqJT?Gi|R=D2LqGSU=Ih6WJi#9R?$o*$o9K|5Vy{c!Ybaqx1y{ zFpTd5_5coT!1UP+9Ix%SS|}8d38%H_b3F$O2&dH>*mmsrn!k!4>+5lfy&W|S4Loam>ii*MZT7c{NWS-|pkRUFI_`ZHh_4XX^dAFu}52bGHI5DtT zyZ+Q1!?V23WP|-5YC8SU;w~T0ijQ%=yYhEN^7mI<$KiH}d_muH%N_6&>`5ZtVvh)Q z?0!5DrdppsBw*iU8dmI7<|b{kqY^L>ua2yqK}m(Xe!r%yOXPkoxH-i$qmI7ynautH zq9GVfTBMrQ-^FI3!mz2Txz2VT9>lxYqZ8m1*45D~aqIIeAnqzUbYv;D`V=#wWEJ_l zLc{xl+qm5%GsO!D($qT4m{XTkrwhst#?aVs(5-?yx#a=ArOmB!0i~$R3h4l!5gOm? z2=Ve(=VS2E=!o+$TYYvszsuz<+Pvw#rRsE`^Xif#1$|e-vq>?LQWJyD>?cm84_g$$39izZSj*Y>x zk_gvTnOyMoAGEZa3FATu+~d=qVol$&3y={1LjsqO^@s{~1DwGPqZ+6}Ed6k(aDp6G zJh~yJoh-bZOgpS}*~S?|Z?81OZfvUoV6!HZm9rak1{L%A*PQ$&8{c8wLU4KiSy@}4 zA5QeA590^&Rawr-7!3RT^D+EYSo~S28mL2-*P_Uj{Emo0CeU%5HY4h$!hp>d$jPjN zj6_HT`P*CL&9IU2w3>ZF=5JO%LnfGw(pr6ZQBD!#3a&P)Kt;7?C9An8DR6JyCt8P$ zSK#1+COgfnj8tcB=YgZbhIa`fH{tk=DiZ*xo?oZKl(f7!D@;)(q4h95WN+Q& zI_D2~3{^iLRMgxIcbWQ-5gEZrs*7o6_2r68IWUm`*P3ysvuhNgH3*HbLOD?J?59c1 z!tb_8h%FnW$T?H>jZ>^-)A-cWD&3bRWM+5Q*3~(gCL7lXQE=qNcvPoP5V2A)Afsre zfDl`fnrAae7)VV$mh5geXo)eF{TqV%i*flaYb*_RK$lXO^6Ej9-D7el9K3cI&!e1_zN7!?Qu74ZvTvPPMnEg{;&yrb;H$gz~_k z^RBa__p)8p!tDZhCI$(|W=Eq4b4meDI@CSYLBvI9V4kr;W`5^_GGO58MK_Rjwu8q) zMF+jyZ%e(#@}FhDsv7iqATB4cg8>DTTDkWs{=wO(xN%4j!%sGo#qcjdgROHgltX55 zcU8I)8`$PdDO!{dr0X}Co;PT@Py`|45@<`NRk*={+&W6kQ&g}c5HDeGk;df}q)E3M zaDy_qNwaKPSA89oIHPDy8SE*%zad*Q8jd8$qV2yb3R*g24pM@o4ZW&RzU*;knyT1& zGatav?F(lr1NoP!GNk8@z|qctMSDIqLUSXK%7MXcdz@Z%;=~ zn2O?d8r>dX4gdjt}obj(}~ zYjL*?VKBu`6F82zglVl3#g$VtM@PU9vW>xbN!V(^%*s33-0 zSUuuh++vQZ#Y%)`r9!LthsoLDChC;@)ws?K%eJi8 ztquWYvBHC`6|ec^a+_A6{jZ(yXo>wSk480)IvtBrK4{*#T!YCET2S>H76?_=P1~p8kwHpR6>P-{3_;bjNM5t6?CSH)H?U&1{Bjt;~ zqmTc-e}T-~=!`u-s7D?@ZQUuAUY#hMv=oy!z0hl1xX}dj4Olad){P^lEl zDe5}=>O0$k+8G%7{B6i-0DzWlQd}+!H|awqj?YN{b@Kmy%kknU4M^spiCVDXhOMpb zewVM-P;sBcLs6*){%aO6?a7iE)b`*P%}c_Plyo;gp8S#bGQuiv&>3g@Mz^({V_d5`{yC zr0MVpJ9Hv_6S55vjPKuTiyvo|m#>SKJK)kAXiUZg3w7~ZUxAym8%5U4rV(UA&BEOm zVg)T*8;xqhEFfb@XXjBeaNP7KeZ>|+$6ml>Tow55H-__4LX(F+!pp*p z7EXHW#O!4aYgX3AB*Q0wu$4dDv|Eq(y}`KvDV=hmT)g}ZmAMJo%{lN~epp;N2!| z(raXTvg(14`~SW@YkhU_s1%d+)wZX@o3C_fL|qRc0|2FzYKEPSQH~F51J^~~(^Xo0 zOz91feOm4lwM~E#)#}icM}c;w8Q5dS=kDdNEL1>8=Q)K8G2{&LfO_{NXi=-qq_^1z zBVOM2OA{s81xe85_X^xbjPiA?=8)Y9|J!Px?nUcB$ZwF9WJo|sJOfO1GYny3u{asB zW)S-;uyM^YDAM({$9;af1aL2Mf~FwYH2^%lpAt=}$CS^wK-X&)T|6j6yoB-!cJQet zeUz1)H*f)CjgjX!c<)%9(#)y@J(xL%UO4mt% zCKqPzvAUd2+P=k=FF$;&HItfV*%s6h&7H7PBRX^vLC;%XqbxIfUNMOA9be<@L8(Pt zx|>tqwkUTYT&Sdval0dw+cZ!ZQx$8lM8!KLCr&EGP{L6TFwof|U9(SO zB!zktTVO_H3_GL$5XNfMsJel*zh(Bym-p9p03;c@ni@9Tp4+0i3icPRinS;)VXO9G z;`76Y4&5F`Z09q%qlC>Hb!7J0y__DPmVgqgw?pRZZMuAzWTp;KnukyG1**aZ{bqyR zOHjeumvcwIckx@gzp?uTxB+iS6wX>>$)%Meq?dTJ7i#WAib-98j3#rZiCVWDr$Sa=_Rn^eb4+Zcb07zX<;^dEN@aMvs1Yt4^m(R&Rkxv_F74QB8c#C1;lwb3*(DA zrQ*T!g4R;C4E6Cl&Iai6Gz6F_4TLIh7&;;DgAm=?7@KE5M5|)zd9=^|4JPnxv093W zF6wD6;j{*B3ogjOs}$cyb7b4r7iH=SRn%R4`sj|e5@N1%3==q`MbX;$iywxbrQi&$ z>H3-QhfZ!wU(oNU_i6~Y@D+Y`zT@(oLRr*7`3!jKIO05ll6f2v;H1so>oIUbX%)QL zm2i|jH`4Zs*8k*l=U_~c67V;Q*i>_vcThmMu1hIf1jHzVtIox0qPsW^peXeelV?r= ziO8e}7WsGY-sQGwj5`Bl(FmX22+qd4EmpbHN(%C%1aK*SdS|F?1!yZ;o|_BLtwYOx zfwXyS!U$#^vfYCB0}Ex>fH=*pimVGaIjKexl9X)6GPr2r7aeP`^JJ7h7VR678R|8%w;Xd7nODuS zHFem+)UMVi!iNd?h^KcM%$qV?r@3{F1wFBo;aN}{FZVF7U{X3j8)d`DQfePzT%Yfbwcm`I4^5lgy!L~NXt{)rK4na6>yD}AJtayRM{l*H= zbGGAkE5x@jUDHF;I@UB4Yf3T=0LT4Nf{l_OiQp~Umhx$|$cts<2e5*SSx=q*WhxtK!2u|s*lcV1BxMP*X&6AEWde(ioNV^dTJa4od@AQtg^~z3cj&1f1`p^I zaO}<=AY++a!3TP-p|L(F8&!&34#_gTZh__GP*gY<-Y}@`Yd79mIC@L|Yp?i!ECYNi zb&mPSrB?~-Zbe;mkC}M38vKm!+lC4{R%TZGx}Exq&nq65nw;H##gnzlfc!xWR70ES zS5EENRLnISnQE-<)Wc47P9r|YKJoR%+)51k!VTfuAU&Kxizy+9s2Y%i5;}bN@bV*5 zVqYC5GOnnaCoZFC^%eRSRs=~0vx!={k%DII>+?agzp`BG^7gvAS5AZ&8a-vvai+l zBQdGIQ7|gWv%i2abh|iV;Y;cX10}Fq2=V0z$3gZcFOBM z7|Iu7BXA!!3%B|oiErq=vSU`lCF zx~<~It^uKObBN(JC~8~2F;tD^EmlJhPj8W&R~pO(OCo7$rkVxR$7^@w$J2_j%p}vm z*QeBt01%)-&8+OEk>~2P>hAn@1cfoKeA6W@#}r1Ka)Tl8C#|)a8enWeOpErxcb?sk z_B)qi@`vZ0sQSOW04VIkcEg$tkerQL+&#Z;k@^tQ9JQJ-2{=o@`q9YSO|Z>Ihf~a+ z9NVo-A17^1i6-Bf8EUA>nSPbKEI6IY&;Sm8S*dJeBUW}oB}w%klx2X*dE20DfzbLgo?^tIGZah_R?xwmPCh-j{<;XgHT7_R4&7LArwda&n8d{S1|Zo*{pef72N? zZD#;U>|sb(Pgbo+@`}^ezta4FKU+{5&oYqdLtMn3UW!mb4L2r!P^2LDVQ0lq-`ll> zFTZvSUVdi;!?~AZTl6n-F*1P_rO9M(6-(i>Ge_1ev46b`l$-OL{%2_W5$-NuLIg&w zS9#a{&x=Ps5Eor9|Njb=e}+#sR?xH@x_kHs9I)0p{Qa|gbZ=_@b?*Kv2+LoB+W$$Z z@3*smeYF4j!5MTU*Zu1a{_~opSfS$QJtX|RVojXp@9TrFnE$_C#1r)N|Cwq0ykOv^ z5n*-l6ApD?hAF_YDy5k>ElD0-{tKchz6}9dKTWX%;o$#xcQIFJG`QX`l~St6Y= z5XO+%ZzxN;kd5?=-?2KNCrP{8Q|>CUA@s-F8fZiKSyUQ+y!MR{VN*fKdU#ZYTxQIX z8AHQRQ>Q_7nrR_2?A-<$M@A+Pgc+3Vwef*C%*!ZK;t%%;-wn{QhWMD6@>;s$ds2Aj z6rj_fO4A1`)yeR9ApU3IjTe5PQ$-3~5XE`3`VT>Eeh+jlXmLKzTgc^JmcJ)>?@1@7 z=lPm@f%zyNh?gelXf%iE?w~8tZ~@|cs>l3A#Y0We%9f z=xwMDy%&z!xFIiU1oZV$6-Dn?@54Vg;e+^lXm@>m{SjcI(vbWYamhii|1fKR_PZW$ zf_0ZPC)Be5c2=3y#oVeC%y5Mp&NT(w@#0w6=|gMYeNdSh7`z7+Q8l=W;*f?cfbVve z4SjpN?L;{O>LP?^6Xcy%YF}MeSC&UB_Cl$icIWGr^!?Vi^4#N)s(^U|JiXQ#H+)#v z3J1_bx=X@2CDeUkfcr|mLD}}%EZ~;7(NFW3=W8+6Ts#K5u6&F zJ8XI@H!eTXd4Q}8E60gjALIQh)}|it(rn1kHuKu|*X&#Gl&C_3i#ar!A@~sIIqL{8 z;)>rU^C=egoiM`!KSf3-8-~}P5)o-a4B2M+$0fpkY-_e01oyS7-o0jIJt4%PHZ}_x zcsjC?iG={SHbU`h3TN|5aeTX`Px8ethY z#T~7+vP!2Dfg?=;7sX1jR?WG&__>)C09271pfatLh?sFJ~ zICdSc_CYrpg2)63Sp<3ZK#G z8brgSqd*Pt5{b!5{*^?7DFX-zGf=juz@fk72f~{cKoJ7I94x-O2q`k<(&O#bgOHG< zAyE?c@Q620+|{oWa3{0Jmk}@xUfOEQH#62@#g{WK9R!+`wd2~)TLGP7igb@YODF~) zC0AQr9wOyAOtsBL-FKNDG(?6G1%Q4)>I#|rp|E9ZKY@eSf5(2&Yk(zMKovHMH8&^Q z4c3)`k=cu`Z7F`}C5g~Zdn#Vf3PsIly3AUp%X$fiCOwV4_3ld0GRo#6 z_yAh~0mJ<;0^M;u%(2L836C?6IeRX_bn{ba`ivf_Cvv z%ak8NQ~=5Q5s#^_fNVcY{XR`B-dzY9VS!B9n?YhRz7c@#>9B9HNLPKb^OSjK0e;1z zeFrva2ATnVlOe^8(^I*S=s8q30_O^HRQ*Wwo!DbQYUH=lh9HH)GvKmYF-W5fNn2q8 z$SZaf1agD5FUfAJRLl79kPeEQKU(wchG>CAS?olRmICt<1kCJoMQ(C|12jvoXtLMBeyCGy zBNA2OO&1I-8W!Ra4#Xv{!8wMgf{E+`)NB}i5h*YjHRcQI5ZW3)=GuJuQBRCA4!3rR^H-buC!`o(P34)zmVmyO2#)U$#c3PMk z0Qu8##5J_HDZpdfiUU&Jkv`%O=5Yyy=f)}~pzbA?zp z3NWJtw9w&$6~r6*Iw26*NWW!M5&awC_$!srM7r+4Qu4!>6Fy5YUaD;o zrMr&DF!dI$2rVV6Nl$c3)l^tT@1@y{u{xf`oPv7z8pp61rSZ+1U9)LuOb2vS2O|(I zq{|l6yg}gvQ;+H3EYps&hUF^Ib-kL?%$FNW7PR+OpdT}Qt=Wsl@?eQCvu?O_;y2vH zXAmT2;*_z)C?62mxp8z4axry5oKNR;fyZ-cS;Mi*iv}IDe1v|BgLfJOB+Hnw2elSCr!ugw_<4xZ^HN5kb%x1gvNV)ceH(#np*|{&wO1 z`b_Q^I|ht4B{n*jKlJzP^UBo7m3Esw-j#elS$K+S#ybADCsUhD2dCh|q=`NjA z{ihLN-ebw8--~c*! zw?lE6gw|oo9Y}@uY87=D4QW@u(3S@K$##*tCj-SgnH@W*bRmO~G1CkbMC;4X?Kr07 z-I#aeRBvo5iLg!h-EzukqO!#BG^gx&P}Esbn@iO4&sm@9AJ(`}^9mEOG0Mt5cH~GS zqE0;w^H106^ZI)+x7Gf*EEhI2#9=dKi{&68RbOy(GOcYoXr=>{%uw(vI)>c3N0wJC z)KanlDU9W*)`Df=iU*}tDF=sAr>f%xZK=2>iF6uMUV|`Z0{EM-w+l*<20H#E?!e=6 zVIjSWYAnjQ4K5d);Ca=E8O4O|bG%2;Q##L74{*u>L|^Z*uP-OW0bpV1rBz1KkgDKM zqQ{rZG6Cuy*nbxYo9yc**xUaoS-Cuzo^Lg;=-BaDjN#y+0%M6wmW&_%esCZ$DGdIa z*682U;q??+dm$zoAW!N*CP82YK%gHC5Ou?bhxS0rI^a5qW*KlBX6lu-n_!x!DIBi+ z*he%XwnBR&i4|woC$rz_76XZZ@lOwA1{^WG&8epZB`j#QtshqB++0jjXM@@M^m-L7*JM8(|?3J zc5ieT!LRx!8^3k?lO_JS?fvr^uDK{>@33u}%1mvUxwsPM)6RN=5r1~$Vyo(l8N&G% zm4lleEBwYi%b!G2@qQtmy>(eBhp+gY#>NxBV|6=#8M1&**(=`9l;Sj+yzU{`k@{g} zT$|a#xAb=B3d}}w1mEe?FlsVeQ-vs{aL_o{d3yN$3)#DP8=VqF{Y)QObe$;zi9;;6 zNQ$xBGlGFBrFs>qX)EI?MAP$&!~DYbzN?U}O^?N!bwSs3hI{JzID(cX9L?%4l)jEP zg96PGl2C`OR>AIOYJCNrSlo8pKAljRgQ>I)v_0jh2*IOwb*O5ENwqFn`>}^f(kg{n zgf=ClR??(fYPG3pVwKt3)jkHQ?4cW5M709yYs4qPXll#w`Rp33D#zfM2Un5yHx%Ke$ydB@$ckkMaLTv!unDJPh_24z>0K_m`(oL4FGukrCW1(_@g?^#+ z%kQ~lgbpM6)0n_d-u|~h#CVabh$HT(aorcIMTh2O_0`0kQRqf&{T{;<&X&n*QiTML zUPD_{o1~XJN;R3960hcb@LOtw7Vdb6wI}!cDog4v2+eJ6;RI2U zcltJ>G@pgC5qmFEQ?6X5gp5&%Vd^NN5!Mabqpolhs6O%JILEDcf7T4ck?qh)YvM;U zGc`PvJUdqCzgv9W1uj1Zu`6x{8$GNNz4fb8`VSNP5{0+O(BVDV93g`;FStiKJR-+yai{F)#g*&VFAt}`VeSZ@P!d)td)Vi->MeQ$Fb^K%p0xoU=Gh=pEC&_nE1WJuR`J8Rt~7#m#7YDjn)ZQUyl7Q znoKbL2wcmhx!~Q~$9@w)Y`cX2V|$dQRrYnIq-n#!^@+w=(p&$}}(7xfi= z80eFqmrW?0J-8ow!cTZIM7b3b_X|J~8<7F5F~_Xjy|D%CZldY4)Ua_d5NQocRJ)-( zG+FEIcaL_BR@Z?1(|@2c@X8aYm~!4Mt#U(JQJ3i9x1QSatXmqYcCnT|mbzJiqkOxi z{Oy~+f8%SuYhE8MbfAIb8Ujl>soU7!B5tY=N(wsEgo|xhnogTc?njv{Sgj#9l(%Ji ze)0}=R@cGlSr4a*V$|UujfilQugW$WKMwXlmny99(YO^5tbQre`NF^xS-4ER6#N}2 zU%jOqIB$#R1~YB{eeuw<$?NZ`^Qd^`?6F~91svTDx<_pm`UOlU{Zod*6P6}NXmrQu zcsu1-qAx}`0+7Jrw^)h&E&Tj_7T&uj*C}OiZ87(Duzz|CYj)w_@FL&0k}_atj^anI zVTT*$>>~x<+m_U(d_15eW`@ZcOGHY0=7*5#o@N{PFQ{LUw2sx|?=!OZ=?|W#eHC`Q zK)3h1!(;k~K?Q>!*9+;6Q6h!N0$(%9l~l$8Q$?i5w~+0RO-9Clb@=}F9RHnP|M`_X zQr3DI*95Lvn*V;I@ewGHum!xR{@3mQkKI6rFWLc+p14c({}h@3`1_1l0K8&CZ2wQe zATwJStWj5!jnNu+@Si0aR}6fl3q9}o|IdH3(#@91${j9w`c7izyEuQ zy^aIc<~S3w`=3|!pNoXtb|QQvd69vCb~pXL=D*(JggETuqU65HzyHjC`ASM2BwzQ- zuNnWB-~U~JOLak2z!4^4yk;ZFKQ7l34T-X%tmxVx(XWd{E*vEnaj7dbXl)(aJ*hja zjgS#8LmS6VsJ#F{N!xyOuHN8I=B&o?pFk`d8NrH%s+!i^W}p#-#uLQ(rWpi*6p*eV z$x!fF!|RDQou0q;Fy0g3ab9M_>a`)nGwh8}Z*PWl6~X4fUn>oS5zWx(H4F}HX^oAI zdc-2b!`s>!fVUZ~xdZALGLU_UYNQbq-5(a;?vj9um4CqaeJ`Egt}{inI8F5jS2Nhw z-fzsW3ZOFw@k>fZ6b>CdVCH2GfK{5qnAWOL7@#zB%;F#m0Xoj_N8X5J3m%^k!~;k? z<2en+!-)BicY;(HN3%+vYo;cM^a!RJzmg_@F?^d`RdR-xYb4sixp*?>o7mbZB1p<5Fxi&om)QLtmOmrTk4;wUdyls02D<;HM`ouwAth~xs#YIVtJ79} z8=*pb@`AyBNK1VcoCa&DxjOf3MNqVE138Fa@+bQLN^N9HN;tF21GAeR C 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 literal 139607 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 Date: Tue, 20 Aug 2024 14:39:09 +0900 Subject: [PATCH 14/25] refactored function name and parameters --- transform/convert_quadkey_and_Vertical_id.go | 18 +- .../convert_quadkey_and_Vertical_id_test.go | 3536 ++++++++--------- 2 files changed, 1777 insertions(+), 1777 deletions(-) diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index da38d9c..5020023 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -522,7 +522,7 @@ func ConvertExtendedSpatialIDToSpatialIDs(extendedSpatialID *object.ExtendedSpat return spatialIds } -// ConvertTileXYZToExtendedSpatialIDs +// ConvertTileXYZsToExtendedSpatialIDs // TileXYZ形式から拡張空間ID形式へ変換する // // TileXYZのx,yは同一の意味のまま拡張空間IDのX,Yに変換される。 @@ -607,7 +607,7 @@ func ConvertExtendedSpatialIDToSpatialIDs(extendedSpatialID *object.ExtendedSpat // outputVZoom 23 // // extendedSpatialIDs :["20/85263/65423/23/-2", "20/85263/65423/23/-1"] -func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputVZoom uint16) ([]object.ExtendedSpatialID, error) { +func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputVZoom uint16) ([]object.ExtendedSpatialID, error) { extendedSpatialIDsMap := make(map[int64]object.ExtendedSpatialID) extendedSpatialIDs := []object.ExtendedSpatialID{} @@ -642,9 +642,9 @@ func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent return extendedSpatialIDs, nil } -// ConvertTileXYZToSpatialIDs +// ConvertTileXYZsToSpatialIDs // TileXYZ形式から空間ID形式へ変換する -// ConvertTileXYZToExtendedSpatialIDs と ConvertExtendedSpatialIDToSpatialIDs の組み合わせであるため、詳細はそちらを参照 +// ConvertTileXYZsToExtendedSpatialIDs と ConvertExtendedSpatialIDToSpatialIDs の組み合わせであるため、詳細はそちらを参照 // // TileXYZのx,yは水平精度と垂直精度のうち高い方の空間IDのX,Yに変換される。 // TileXYZのZから拡張空間ID垂直インデックス(f)へは高度変換が用いられ変化する。 @@ -654,7 +654,7 @@ func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent // request : 変換対象のTileXYZ構造体のスライス // zBaseExponent: zの高さが1mとなるズームレベル // zBaseOffset: ズームレベルがzBaseExponentのとき高度0mにおけるvZoom -// outputVZoom : 拡張空間ID変換中の拡張空間IDの高さの精度指定。空間ID変換時、水平精度の方が高い場合この値は使われない。拡張空間IDの精度の閾値である 0 ~ 35 の整数値を指定可能。 +// extendedSpatialIdVZoom : 拡張空間ID変換中の拡張空間IDの高さの精度指定。空間ID変換時、水平精度の方が高い場合この値は使われない。拡張空間IDの精度の閾値である 0 ~ 35 の整数値を指定可能。 // // 戻り値 : // @@ -670,14 +670,14 @@ func ConvertTileXYZToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent // 補足事項: // // 入力のoutputVZoomは次の2項目と関係しており、出力空間ID数に影響を与える -// 1. TileXYZの垂直精度, zBaseExponent, zBaseOffset: 条件により拡張空間ID変換後の拡張空間ID数が増加する(詳しくは ConvertTileXYZToExtendedSpatialIDs の例を参照) +// 1. TileXYZの垂直精度, zBaseExponent, zBaseOffset: 条件により拡張空間ID変換後の拡張空間ID数が増加する(詳しくは ConvertTileXYZsToExtendedSpatialIDs の例を参照) // 2. TileXYZの水平精度の差: 差が1増えるごとに1で出力された拡張空間ID数の4のべき乗で出力空間ID数が増加する。 // そのため、これら2項目の値によっては変換後の空間ID数は大幅に増大する。 // 動作環境によってはメモリ不足となる可能性があるため、注意すること。 -func ConvertTileXYZToSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputVZoom uint16) ([]string, error) { +func ConvertTileXYZsToSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, extendedSpatialIdVZoom uint16) ([]string, error) { var outputData []string - outputExtendedSpatialIds, err := ConvertTileXYZToExtendedSpatialIDs( - request, zBaseExponent, zBaseOffset, outputVZoom, + outputExtendedSpatialIds, err := ConvertTileXYZsToExtendedSpatialIDs( + request, zBaseExponent, zBaseOffset, extendedSpatialIdVZoom, ) if err != nil { return nil, err diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 2a88588..a08ec38 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -1,1768 +1,1768 @@ -// 空間IDパッケージ -package transform - -import ( - "reflect" - "sort" - "strconv" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/trajectoryjp/spatial_id_go/v4/common/errors" - "github.com/trajectoryjp/spatial_id_go/v4/common/object" -) - -func TestConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToHZoom int64 - ToVZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 6, ToVZoom: 20, pattern: 0, result: []string{"6/24/53/20/9", "6/24/49/20/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 7, ToVZoom: 2, pattern: 0, result: []string{"7/48/107/2/0", "7/49/107/2/0", "7/48/98/2/0", "7/49/98/2/0", "7/48/99/2/0", "7/49/99/2/0", "7/48/106/2/0", "7/49/106/2/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 5, ToVZoom: 8, pattern: 0, result: []string{"5/12/26/8/0", "5/12/24/8/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToHZoom: 9, ToVZoom: 2, pattern: 0, result: []string{"9/338/229/2/0"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 0, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 5, ToVZoom: 36, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, e, p.e) - } - } - -} - -func TestConvertQuadkeysAndVerticalIDsToSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 6, pattern: 0, result: []string{"6/0/24/53", "6/0/24/49"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 7, pattern: 0, result: []string{"7/0/48/107", "7/0/49/107", "7/0/48/98", "7/0/49/98", "7/0/48/99", "7/0/49/99", "7/0/48/106", "7/0/49/106"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 5, pattern: 0, result: []string{"5/0/12/26", "5/0/12/24"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToZoom: 9, pattern: 0, result: []string{"9/0/338/229"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToSpatialIDs(p.quadkeyAndVerticalIDs, p.ToZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToSpatialIDs(%+v,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToZoom, e, p.e) - } - } - -} - -func TestConvertExtendedSpatialIdsToQuadkeysAndVerticalIDs(t *testing.T) { - // 結果確認用の構造体を作成する - //"20/85263/65423"→ 00012322332320003333 →7432012031 21:29728048124,29728048125,29728048126,29728048127, - //horizontalID: "20/45621/43566", result: 3448507833}, //"00003031203000312321" - //horizontalID: "26/4562451/2343566", result: 26508024119725}, //"00012001233201113020012231" - //horizontalID: "26/1/2", result: 9}, //"00000000000000000000000021" - //horizontalID: "26/2/1", result: 6}, //"00000000000000000000000012" - //horizontalID: "5/4562451/2343566", result: 429}, //"12231" - - quadkeyAndVerticalIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 58}, {29728048124, 57}, {29728048125, 58}, {29728048125, 57}, {29728048126, 58}, {29728048126, 57}, {29728048127, 58}, {29728048127, 57}}, 10, 500, 0) - quadkeyAndVerticalIDs = append(quadkeyAndVerticalIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsSpatialIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsSpatialIDs = append(quadkeyAndVerticalIDsSpatialIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsHBorders1 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(1, [][2]int64{{0, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsHBorders1 = append(quadkeyAndVerticalIDsHBorders1, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsHBorders31 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - quadkeyAndVerticalIDsHBorders31 = append(quadkeyAndVerticalIDsHBorders31, newQuadkeyAndVerticalID) - - // quadkeyAndVerticalIDsValueE := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - // newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - // quadkeyAndVerticalIDsValueE = append(quadkeyAndVerticalIDsValueE, newQuadkeyAndVerticalID) - - _, err := strconv.ParseInt("test", 10, 64) - datas := []struct { - spatialIds []string - ToHZoom int64 - ToVZoom int64 - maxHeight float64 - minHeight float64 - result []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID - resultLength int - pattern int64 // 0:正常 1:異常 2:個数(水平) 3:個数(垂直) - e error - }{ - // 正常 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 21, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, pattern: 0}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 19, ToVZoom: 26, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDs, pattern: 0}, - - // 水平精度個数確認 低精度は1、高精度は精度差^4 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 24, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 512, pattern: 2}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 2, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 2, pattern: 2}, - // 水平精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders1, resultLength: 2, pattern: 2}, - {spatialIds: []string{"35/85263/65423/26/0"}, ToHZoom: 31, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders31, pattern: 0}, - - // 垂直精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 0, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 1, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - - // 異常系(精度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 0, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 20, ToVZoom: -1, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"35/85263/65423/26/56"}, ToHZoom: 32, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/35/56"}, ToHZoom: 20, ToVZoom: 36, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"36/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/36/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - - // 異常系(高度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: -500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - // 異常系(入力エラー) - {spatialIds: []string{"20/test/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, err.Error())}, - } - for _, p := range datas { - - result, e := ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, p.result[0], result[0]) - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, e, p.e) - } - if p.pattern == 2 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - if p.pattern == 3 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_1(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_2(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 56}, {29728048125, 56}, {29728048126, 56}, {29728048127, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 21, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_3(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 7}}, - 12, - 14, // 2^14 - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_4(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 54}}, - 12, - 14, - 188, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 188, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 12}, {29728048124, 13}, {29728048125, 12}, {29728048125, 13}, {29728048126, 12}, {29728048126, 13}, {29728048127, 12}, {29728048127, 13}}, - 15, - 14, - -50, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/56"}, - 21, - 15, - 14, - -50, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func newTileXYZ(t *testing.T, hZoom uint16, x int64, y int64, vZoom uint16, z int64) *object.TileXYZ { - t.Helper() - xyz, err := object.NewTileXYZ(hZoom, x, y, vZoom, z) - if err != nil { - t.Fatal(err) - } - return xyz -} - -func newExtendedSpatialID(t *testing.T, id string) *object.ExtendedSpatialID { - t.Helper() - extendedSpatialId, err := object.NewExtendedSpatialID(id) - if err != nil { - t.Fatal(err) - } - return extendedSpatialId -} - -func TestConvertTileXYZToSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected []string - request argSet - }{ - { - // hZoom/z/x/y - []string{"23/-2/85263/65423"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 23, - 85263, - 65423, - 23, - 0, - )}, - 23, - 8, - 23, - }, - }, - { - []string{"25/1/170526/130846", "25/1/170526/130847", "25/1/170527/130846", "25/1/170527/130847"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 24, - 85263, - 65423, - 25, - 3, - )}, - 25, - 2, - 25, - }, - }, - { - []string{"4/0/63/23", "4/1/63/23"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 4, - 63, - 23, - 3, - 3, - )}, - 3, - 2, - 3, - }, - }, - { - []string{"23/-2/85263/65423", "23/-1/85263/65423"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 23, - 85263, - 65423, - 23, - 0, - )}, - 25, - 7, - 23, - }, - }, - { - []string{"26/6/85263/65423", "26/7/85263/65423"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 26, - 85263, - 65423, - 26, - 3, - )}, - 25, - -2, - 26, - }, - }, - { - []string{ - "23/0/170526/130846", - "23/1/170526/130846", - "23/2/170526/130846", - "23/0/170526/130847", - "23/1/170526/130847", - "23/2/170526/130847", - "23/0/170527/130846", - "23/1/170527/130846", - "23/2/170527/130846", - "23/0/170527/130847", - "23/1/170527/130847", - "23/2/170527/130847", - }, - argSet{ - []*object.TileXYZ{ - newTileXYZ( - t, - 22, - 85263, - 65423, - 23, - 0, - ), - newTileXYZ( - t, - 22, - 85263, - 65423, - 23, - 1, - )}, - 25, - -1, - 23, - }, - }, - } - for _, testCase := range testCases { - result, err := ConvertTileXYZToSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) - if err != nil { - t.Fatal(err) - } - if assert.ElementsMatch(t, testCase.expected, result) == false { - // t.Error(result): - t.Errorf("expected: %v result: %v", testCase.expected, result) - } else { - t.Log("Success", result) - } - } - -} - -func TestConvertTileXYZToExtendedSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected []string - request argSet - }{ - { - // hZoom/x/y/vZoom/z - []string{"20/85263/65423/23/-2"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 23, - 8, - 23, - }, - }, - { - []string{"20/85263/65423/25/1"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 25, - 3, - )}, - 25, - 2, - 25, - }, - }, - { - []string{"20/85263/65423/3/0"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 3, - 3, - )}, - 3, - 2, - 3, - }, - }, - { - []string{"20/85263/65423/23/-2"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 25, - 8, - 23, - }, - }, - { - []string{"20/85263/65423/23/-2", "20/85263/65423/23/-1"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 25, - 7, - 23, - }, - }, - { - []string{"20/85263/65423/26/6", "20/85263/65423/26/7"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 26, - 3, - )}, - 25, - -2, - 26, - }, - }, - { - []string{"20/85263/65423/23/0", "20/85263/65423/23/1", "20/85263/65423/23/2"}, - argSet{ - []*object.TileXYZ{ - newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - ), - newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 1, - )}, - 25, - -1, - 23, - }, - }, - } - for _, testCase := range testCases { - expectedData := []object.ExtendedSpatialID{} - for i := 0; i < len(testCase.expected); i++ { - extendedSpatialId := newExtendedSpatialID(t, testCase.expected[i]) - expectedData = append(expectedData, *extendedSpatialId) - } - result, err := ConvertTileXYZToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) - if err != nil { - t.Fatal(err) - } - if assert.ElementsMatch(t, expectedData, result) == false { - // t.Error(result): - t.Errorf("expected: %v result: %v", expectedData, result) - } else { - t.Log("Success", result) - } - } - -} - -func TestErrorConvertTileXYZToExtendedSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected string - request argSet - }{ - { - "input index does not exist", - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 25, - (1< Date: Tue, 20 Aug 2024 14:50:45 +0900 Subject: [PATCH 15/25] updated documentation for TileXYZ->SpatialID conversion with sample program --- documentation/convesion.md | 246 +- .../image/spatialid-volel-splitting.png | Bin 0 -> 154739 bytes .../image/tilekey-standard-SpatialID.png | Bin 0 -> 177280 bytes documentation/image/tilekey-standard.png | Bin 167438 -> 166281 bytes examples/convertTileXYZToSpatialId/go.mod | 15 + examples/convertTileXYZToSpatialId/go.sum | 58 + examples/convertTileXYZToSpatialId/main.go | 65 + .../convert_quadkey_and_Vertical_id_test.go | 3536 ++++++++--------- 8 files changed, 2134 insertions(+), 1786 deletions(-) create mode 100644 documentation/image/spatialid-volel-splitting.png create mode 100644 documentation/image/tilekey-standard-SpatialID.png create mode 100644 examples/convertTileXYZToSpatialId/go.mod create mode 100644 examples/convertTileXYZToSpatialId/go.sum create mode 100644 examples/convertTileXYZToSpatialId/main.go diff --git a/documentation/convesion.md b/documentation/convesion.md index 4bf66b3..582e8f6 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -9,8 +9,8 @@ | 空間ID | 拡張空間ID | なし | `ConvertSpatialIDsToQuadkeysAndVerticalIDs`が部分的に行う | | 拡張空間ID | 空間ID | `ConvertExtendedSpatialIDToSpatialIDs` | `ConvertQuadkeysAndVerticalIDsToSpatialIDs`も部分的に行う | | 拡張空間ID | TileXYZ | なし | `ConvertExtendedSpatialIDsToTileXYZ()`に実装予定 | -| TileXYZ | 拡張空間ID | `ConvertTileXYZToExtendedSpatialIDs()` | 空間IDへの変換は`ConvertExtendedSpatialIDToSpatialIDs`と組み合わせる | -| TileXYZ | 空間ID | `ConvertTileXYZToSpatialIDs()` | TileXYZ->拡張空間ID変換と拡張空間ID->空間ID変換の組み合わせ | +| TileXYZ | 拡張空間ID | `ConvertTileXYZsToExtendedSpatialIDs()` | 空間IDへの変換は`ConvertExtendedSpatialIDToSpatialIDs`と組み合わせる | +| TileXYZ | 空間ID | `ConvertTileXYZsToSpatialIDs()` | TileXYZ->拡張空間ID変換と拡張空間ID->空間ID変換の組み合わせ | | 3Dtilekey | 拡張空間ID | なし | Pull Request#27のもの 実装**しない** | | 拡張空間ID | 3Dtilekey | `ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys()` | 廃止予定 | | 一次元インデックス | 一次元変換インデックス | `ConvertZToAltitudekey()` | `TransformIndexCoordinate()`にリネーム予定 | @@ -20,16 +20,128 @@ | 空間ID | Key | `ConvertSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | | 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | -## ConvertTileXYZToExtendedSpatialIDs +## TileXYZ -> 空間ID変換 + +3Dタイルキー空間でボクセルデータを扱っている場合、`transform`パッケージの関数を用いて(拡張)空間IDへ変換することが可能 + +以下のコードブロックの全文は[examples/convertTileXYZToSpatialId](../examples/convertTileXYZToSpatialId/main.go)で実行可能 + +次のような3Dタイルキー空間データがある時を考える + +```go +inputData := []struct { + hZoom uint16 + x int64 + y int64 + vZoom uint16 + z int64 +}{ + { + 22, + 85263, + 65423, + 23, + 0, + }, + { + 22, + 85263, + 65423, + 23, + 1, + }, +} +``` + +この3Dタイルキー空間データを本ライブラリでパースする方法はいくつかあるが、ここでは`object.TileXYZ`として扱うため以下を実行する + +```go +var inputXYZ []*object.TileXYZ +for _, in := range inputData { + tile, err := object.NewTileXYZ(in.hZoom, in.x, in.y, in.vZoom, in.z) + if err != nil { + panic(err) + } + inputXYZ = append(inputXYZ, tile) +} +``` + +作成したTileXYZデータを空間IDへ変換するには、`ConvertTileXYZsToSpatialIDs`を用いる + +```go +outputData, err := transform.ConvertTileXYZsToSpatialIDs( + inputXYZ, + 25, + -1, + 23, +) +if err != nil { + panic(err) +} +``` + +この関数の引数は、以下の並びである +``` +request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, extendedSpatialIdVZoom uint16 +``` + +- `request`には先ほど作成したTileXYZデータを渡す +- `zBaseExponent`と`zBaseOffset`は、内部で利用する3Dタイルキー->拡張空間ID変換([`#ConvertTileXYZsToExtendedSpatialIDs`](#converttilexyzstoextendedspatialids))のために3Dタイルキー空間系と空間ID系にある高度インデックスの基準情報を渡す + - `zBaseExponent`は基準となるズームレベルを指定する: 具体的には、ボクセルのサイズが1mとなる際のズームレベル + - `zBaseOffset`は、基準となるインデックス番号を指定する: 空間ID系で0番に位置する3Dタイルキー空間系インデックス番号 + - この際のズームレベルは`zBaseExponent`を用いるものとする +- `extendedSpatialIdVZoom`は、内部で利用する拡張空間ID変換([`#ConvertTileXYZsToExtendedSpatialIDs`](#converttilexyzstoextendedspatialids))時に出力するズームレベルを指定する + +例で示している`zBaseExponent=25`,`zBaseOffset=-1`は、下図のような関係である + +![fig.1](./image/tilekey-standard-SpatialID.png) +
fig1. ConvertTileXYZsToSpatialIDs入力の高度基準
+ +変換関数の結果としては、空間IDの文字列配列が得られる + +``` +{ + "23/0/170526/130846", + "23/0/170527/130846", + "23/0/170526/130847", + "23/0/170527/130847", + "23/1/170526/130846", + "23/1/170526/130847", + "23/1/170527/130846", + "23/1/170527/130847", + "23/2/170526/130846", + "23/2/170526/130847", + "23/2/170527/130846", + "23/2/170527/130847", +} +``` + +この配列が元となった3Dタイルキー空間データ数(2個)に対して12個に増えている理由は大きく分けて2つある: + +1. 内部の拡張空間ID変換において、高度基準の指定によりボクセル数が増加している + - 詳細は[`#ConvertTileXYZsToExtendedSpatialIDs`](#converttilexyzstoextendedspatialids)を確認 + - 例では`zBaseOffset`が2のべき乗ではない(`-1`)ため3個に増加 +2. 内部の拡張空間ID->空間ID変換において、垂直ズームレベルと水平ズームレベルを統合するためにボクセル分割を行っている + - 詳細は[`#ConvertExtenededSpatialIDToExtendedSpatialIDs`](#convertextendedspatialidtospatialids)を確認 + - 例では`TileXYZ.hZoom`より`extendedSpatialIdVZoom`の方が1大きいため、1.で増加した3つに対し4倍されて12個に増加 + +1.で増加したボクセル数は2.の増加量に影響(乗算で増加)する +メモリ利用量の観点から増加量を抑えたい場合、次のような条件を設定する: + +- `zBaseExponent`を25以下にする +- `zBaseOffset`は2のべき乗にする +- 入力データの水平ズームレベルと同じまたはそれに近い`extendedSpatialIdVZoom`を設定する + +### ConvertTileXYZsToExtendedSpatialIDs TileXYZ空間のボクセルを拡張空間IDに変換する 変換時、`TileXYZ.x`,`TileXYZ.y`は元の値が利用されるのみである -しかし`TileXYZ.z`は変換によって元の値に近い垂直方向拡張空間インデックスに変換される +しかし`TileXYZ.z`は一次元変換(`ConvertAltitudeKeyToZ()`)によって元の値に近い垂直方向拡張空間インデックスに変換される これは`TileXYZ.z`と拡張空間ID垂直インデックスの間ではボクセルのインデックス付番や0番の位置の基準を変更されているためである -この基準とデータを`ConvertTileXYZToExtendedSpatialIDs`の入力として扱う +この基準とデータを`ConvertTileXYZsToExtendedSpatialIDs`の入力として扱う ```go []TileXYZ{ @@ -46,17 +158,21 @@ zBaseOffset 8, outputVZoom 23 ``` -ここで構造体フィールドには次のような値を利用する(fig.1) +ここでパラメータには次のような値を利用する(fig.2) -- `quadkeyZoom` 水平方向ズームレベル -- `innerIDList` 実際の値: QuadKeyと高度キーの組を配列にしたもの -- `altitudekeyZoom` 垂直方向ズームレベル +- `[]TileXYZ` 以下のデータを含む`TileXYZ`のスライス + - `hZoom` 水平方向ズームレベル + - `x` 水平方向xキー + - `y` 水平方向yキー + - `vZoom` 垂直方向ズームレベル + - `z` 垂直方向zキー - `zBaseExponent` 高度キー1つの実際の高さが1mになるズームレベル -- `zBaseOffset` 高度キー0番に対応する空間ID垂直インデックス +- `zBaseOffset` 空間ID垂直インデックス0番に対応する高度キー - ここでは高度キー0番のズームレベルを`zBaseExponent`で扱う +- `outputVZoom`出力拡張空間IDの垂直ズームレベル -![fig.1](./image/tilekey-standard.png) -
fig1. ConvertTileXYZToExtendedSpatialIDs入力の高度基準
+![fig.2](./image/tilekey-standard.png) +
fig2. ConvertTileXYZsToExtendedSpatialIDs入力の高度基準
出力は拡張空間ID文字列になる 上記の入力は以下の文字列配列として出力される @@ -69,15 +185,15 @@ outputVZoom 23 その条件は次のどちらか -1. `altitudekeyZoom`が`zBaseExponent`または25(これは空間IDの高度基準における`zBaseExponent`である)より大きい場合 +1. `vZoom`が`zBaseExponent`または25(これは空間IDの高度基準における`zBaseExponent`である)より大きい場合 2. `zBaseOffset`が2のべき乗でない場合 -また、変換の前後でAltitudeKeyにそのズームレベルで存在しないインデックスが現れた場合エラーとなる +また、変換の前後で`TileXYZ.z`にそのズームレベルで存在しないインデックスが現れた場合エラーとなる この際変換は失敗となり、変換後のデータはnilとなる -### 変換例 +#### 変換例 -#### 1. 入力TileXYZのzが出力拡張空間ID垂直インデックスに対応する場合 +##### 1. 入力TileXYZのzが出力拡張空間ID垂直インデックスに対応する場合 入力 @@ -102,7 +218,7 @@ outputVZoom: 23 extendedSpatialIDs :["20/85263/65423/23/-2"] ``` -#### 2. vZoomが25より大きい場合 +##### 2. vZoomが25より大きい場合 入力 @@ -128,7 +244,7 @@ outputVZoom: 26 extendedSpatialIDs: ["20/85263/65423/26/7", "20/85263/65423/26/7] ``` -#### 3. zBaseOffsetが2のべき乗でない場合 +##### 3. zBaseOffsetが2のべき乗でない場合 入力 @@ -153,3 +269,97 @@ outputVZoom: 23 extendedSpatialIDs: ["20/85263/65423/23/-2", "20/85263/65423/23/-1"] ``` +### ConvertExtendedSpatialIDToSpatialIDs + +1つの拡張空間IDの構造体を渡すとその拡張空間IDのボクセル形状を維持した空間ID列へ変換する +この結果の文字列配列を出力として得ることができる + +出力空間ID配列の長さは拡張空間IDの水平ズームレベルと垂直ズームレベルの差に依存する + +このズームレベル差を`zDiff`とすると出力空間ID数`outputSize`は次のようになる + +1. 水平ズームレベルより垂直ズームレベルの方が大きい場合 + +`outputSize`は`zDiff`の4のべき乗 + +```py +outputSize = 4 ** abs(zDiff) +``` + +2. 垂直ズームレベルより水平ズームレベルの方が大きい場合 + +`outputSize`は`zDiff`の2のべき乗 + +```py +outputSize = 2 ** abs(zDiff) +``` + +これは下図で示すように、入力拡張空間IDの形状を維持するためにボクセル分割を行なっているためである + +![fig.3](./image/spatialid-volel-splitting.png) +
fig3. ConvertExtendedSpatialIDToSpatialIDs実行時のボクセル分割
+ +`zDiff=0`の際、ボクセル分割は発生せず出力空間ID数は1つになる +そのため、メモリ使用量の観点からはなるべく水平ズームレベルと垂直ズームレベルの差が少ない(=`zDiff`が0に近い)拡張空間IDを用いることを推奨する + +#### 使用例 + +##### 1. 水平ズームレベルの方が低い場合 + +入力 + +``` +ExtendedSpatialID{ + hZoom: 6, + x: 24, + y: 49, + vZoom: 7, + z: 0, +} +``` + +出力 + +``` +[]string{"7/0/48/98", "7/0/48/99", "7/0/49/98", "7/0/49/99"} +``` + +##### 2. 垂直ズームレベルの方が低い場合 + +入力 + +``` +ExtendedSpatialID{ + hZoom: 7, + x: 24, + y: 53, + vZoom: 6, + z: 24, +} +``` + +出力 + +``` +[]string{"7/48/24/53", "7/49/24/53"} +``` + +##### 3. 水平ズームレベル、垂直ズームレベルに差がない場合 + +入力 + +``` +ExtendedSpatialID{ + hZoom: 6, + x: 24, + y: 49, + vZoom: 6, + z: 0, +} +``` + +出力 + +``` +[]string{"6/0/24/49"} +``` diff --git a/documentation/image/spatialid-volel-splitting.png b/documentation/image/spatialid-volel-splitting.png new file mode 100644 index 0000000000000000000000000000000000000000..a7fb6276ada1ddcf5b46f388c2ca98bcec390944 GIT binary patch literal 154739 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

-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 delta 129806 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

YcT{w^Q`8sRa%rH$d!KAfS`RRY6+~ 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±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 diff --git a/examples/convertTileXYZToSpatialId/go.mod b/examples/convertTileXYZToSpatialId/go.mod new file mode 100644 index 0000000..9947124 --- /dev/null +++ b/examples/convertTileXYZToSpatialId/go.mod @@ -0,0 +1,15 @@ +module convertTileXYZToSpatialId + +go 1.22 + +require github.com/trajectoryjp/spatial_id_go/v4 v4.0.0-20240820053909-ebbb0298a203 + +require ( + github.com/go-gl/mathgl v1.1.0 // indirect + github.com/trajectoryjp/closest_go v1.0.1 // indirect + github.com/trajectoryjp/geodesy_go v1.0.1 // indirect + github.com/wroge/wgs84 v1.1.7 // indirect + golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect + golang.org/x/image v0.7.0 // indirect + gonum.org/v1/gonum v0.13.0 // indirect +) diff --git a/examples/convertTileXYZToSpatialId/go.sum b/examples/convertTileXYZToSpatialId/go.sum new file mode 100644 index 0000000..0112cfd --- /dev/null +++ b/examples/convertTileXYZToSpatialId/go.sum @@ -0,0 +1,58 @@ +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/go-gl/mathgl v1.1.0 h1:0lzZ+rntPX3/oGrDzYGdowSLC2ky8Osirvf5uAwfIEA= +github.com/go-gl/mathgl v1.1.0/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ= +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/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/trajectoryjp/closest_go v1.0.1 h1:dvshtZzPDwhGDhzn5SVZxlgNnqr/gLp4uIpGDIEOHaU= +github.com/trajectoryjp/closest_go v1.0.1/go.mod h1:+iTxW7/pOi0dIqo2/GcqGqWh/fAj2gMjDIiZ+BFDXIc= +github.com/trajectoryjp/geodesy_go v1.0.1 h1:FvvnA3kPcPoXOjn6cS27R9aiCLyszOarFuZRVlQRG2s= +github.com/trajectoryjp/geodesy_go v1.0.1/go.mod h1:eJuX+ds+t3MKxHG9dhobqNjUbUsYlpTT9XDO0mbc0LU= +github.com/trajectoryjp/spatial_id_go/v4 v4.0.0-20240820053909-ebbb0298a203 h1:xqwGOnafJTqI3Ls3gsHg+SGjkow6aPnAZr5qJAPLfu4= +github.com/trajectoryjp/spatial_id_go/v4 v4.0.0-20240820053909-ebbb0298a203/go.mod h1:wDCjEz2vOtt4ARB1sne8HHC3YeRJ1QGeteJ8ZCrxU5A= +github.com/wroge/wgs84 v1.1.7 h1:8WVUUrpjysYxrn0ssWX7z90SOUKCuHt9NQ5tg9ovjIY= +github.com/wroge/wgs84 v1.1.7/go.mod h1:mc1F8ubW03DO4zaf/006cmhaiMlfvbKmqVAcPuAtsNA= +github.com/xieyuschen/deepcopy v1.0.1 h1:nTCnKprCOdibz8WXWlMZzULIlpzZX0ZzKjz8HlGd/Nk= +github.com/xieyuschen/deepcopy v1.0.1/go.mod h1:smzaXhQZuuehOzevwMMLzvM7gBslB4VPdgJbwdyIDSA= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= +golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +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/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +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.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= +gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/convertTileXYZToSpatialId/main.go b/examples/convertTileXYZToSpatialId/main.go new file mode 100644 index 0000000..c5b6ae1 --- /dev/null +++ b/examples/convertTileXYZToSpatialId/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "fmt" + "github.com/trajectoryjp/spatial_id_go/v4/common/object" + "github.com/trajectoryjp/spatial_id_go/v4/transform" +) + +func main() { + inputData := []struct { + hZoom uint16 + x int64 + y int64 + vZoom uint16 + z int64 + }{ + { + 22, + 85263, + 65423, + 23, + 0, + }, + { + 22, + 85263, + 65423, + 23, + 1, + }, + } + var inputXYZ []*object.TileXYZ + for _, in := range inputData { + tile, err := object.NewTileXYZ(in.hZoom, in.x, in.y, in.vZoom, in.z) + if err != nil { + panic(err) + } + inputXYZ = append(inputXYZ, tile) + } + outputData, err := transform.ConvertTileXYZsToSpatialIDs( + inputXYZ, + 25, + -1, + 23, + ) + if err != nil { + panic(err) + } + fmt.Printf("inputData: %v\n", inputData) + // { + // "23/0/170526/130846", + // "23/0/170527/130846", + // "23/0/170526/130847", + // "23/0/170527/130847", + // "23/1/170526/130846", + // "23/1/170526/130847", + // "23/1/170527/130846", + // "23/1/170527/130847", + // "23/2/170526/130846", + // "23/2/170526/130847", + // "23/2/170527/130846", + // "23/2/170527/130847", + // } + fmt.Printf("outputData: %v\n", outputData) +} diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index a08ec38..007f9a6 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -1,1768 +1,1768 @@ -// 空間IDパッケージ -package transform - -import ( - "reflect" - "sort" - "strconv" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/trajectoryjp/spatial_id_go/v4/common/errors" - "github.com/trajectoryjp/spatial_id_go/v4/common/object" -) - -func TestConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToHZoom int64 - ToVZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 6, ToVZoom: 20, pattern: 0, result: []string{"6/24/53/20/9", "6/24/49/20/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 7, ToVZoom: 2, pattern: 0, result: []string{"7/48/107/2/0", "7/49/107/2/0", "7/48/98/2/0", "7/49/98/2/0", "7/48/99/2/0", "7/49/99/2/0", "7/48/106/2/0", "7/49/106/2/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToHZoom: 5, ToVZoom: 8, pattern: 0, result: []string{"5/12/26/8/0", "5/12/24/8/0"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToHZoom: 9, ToVZoom: 2, pattern: 0, result: []string{"9/338/229/2/0"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 0, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToHZoom: 5, ToVZoom: 36, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToHZoom: 5, ToVZoom: 35, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToHZoom, p.ToVZoom, e, p.e) - } - } - -} - -func TestConvertQuadkeysAndVerticalIDsToSpatialIDs(t *testing.T) { - // データの作成 - quadkeyAndVerticalIDList := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewQuadkeyAndVerticalID(6, 2914, 7, 74, 500, 0) // 231202 6/24/53/5/0 - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, 0, 0) // 231002 "7/48/58/2/0","7/49/58/2/0","7/48/59/2/0","7/49/59/2/0" - quadkeyAndVerticalIDList = append(quadkeyAndVerticalIDList, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDList2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewQuadkeyAndVerticalID(9, 451739, 25, 0, 0, 0) // 123210212 "9/338/229/2/0" - quadkeyAndVerticalIDList2 = append(quadkeyAndVerticalIDList2, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDListE := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE := object.NewQuadkeyAndVerticalID(6, 2882, 25, 0, -500, 0) // 231002 - quadkeyAndVerticalIDListE = append(quadkeyAndVerticalIDListE, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE2 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(6, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE2 = append(quadkeyAndVerticalIDListE2, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE3 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(32, 2882, 2, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE3 = append(quadkeyAndVerticalIDListE3, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE4 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 2882, 36, 10, 500, 0) // 231002 - quadkeyAndVerticalIDListE4 = append(quadkeyAndVerticalIDListE4, newQuadkeyAndVerticalIDE) - - quadkeyAndVerticalIDListE5 := []*object.QuadkeyAndVerticalID{} - newQuadkeyAndVerticalIDE = object.NewQuadkeyAndVerticalID(31, 4611686018427388065, 25, 0, 500, 0) // 231002 - quadkeyAndVerticalIDListE5 = append(quadkeyAndVerticalIDListE5, newQuadkeyAndVerticalIDE) - - datas := []struct { - quadkeyAndVerticalIDs []*object.QuadkeyAndVerticalID - ToZoom int64 - result []string - pattern int64 - e error - }{ - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 6, pattern: 0, result: []string{"6/0/24/53", "6/0/24/49"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 7, pattern: 0, result: []string{"7/0/48/107", "7/0/49/107", "7/0/48/98", "7/0/49/98", "7/0/48/99", "7/0/49/99", "7/0/48/106", "7/0/49/106"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList, ToZoom: 5, pattern: 0, result: []string{"5/0/12/26", "5/0/12/24"}}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDList2, ToZoom: 9, pattern: 0, result: []string{"9/0/338/229"}}, - // 異常系(精度エラー) - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE2, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE3, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE4, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {quadkeyAndVerticalIDs: quadkeyAndVerticalIDListE5, ToZoom: 5, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - } - - for _, p := range datas { - result, e := ConvertQuadkeysAndVerticalIDsToSpatialIDs(p.quadkeyAndVerticalIDs, p.ToZoom) - sort.Strings(result) - sort.Strings(p.result) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToSpatialIDs(%+v,%d) == %s, result: %s", p.quadkeyAndVerticalIDs, p.ToZoom, p.result, result) - return - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs(%+v,%d) == %+v, result: %+v", p.quadkeyAndVerticalIDs, p.ToZoom, e, p.e) - } - } - -} - -func TestConvertExtendedSpatialIdsToQuadkeysAndVerticalIDs(t *testing.T) { - // 結果確認用の構造体を作成する - //"20/85263/65423"→ 00012322332320003333 →7432012031 21:29728048124,29728048125,29728048126,29728048127, - //horizontalID: "20/45621/43566", result: 3448507833}, //"00003031203000312321" - //horizontalID: "26/4562451/2343566", result: 26508024119725}, //"00012001233201113020012231" - //horizontalID: "26/1/2", result: 9}, //"00000000000000000000000021" - //horizontalID: "26/2/1", result: 6}, //"00000000000000000000000012" - //horizontalID: "5/4562451/2343566", result: 429}, //"12231" - - quadkeyAndVerticalIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID := object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(21, [][2]int64{{29728048124, 58}, {29728048124, 57}, {29728048125, 58}, {29728048125, 57}, {29728048126, 58}, {29728048126, 57}, {29728048127, 58}, {29728048127, 57}}, 10, 500, 0) - quadkeyAndVerticalIDs = append(quadkeyAndVerticalIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsSpatialIDs := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(19, [][2]int64{{1858003007, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsSpatialIDs = append(quadkeyAndVerticalIDsSpatialIDs, newQuadkeyAndVerticalID) - - quadkeyAndVerticalIDsHBorders1 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(1, [][2]int64{{0, 56}}, 26, 0, 0) - quadkeyAndVerticalIDsHBorders1 = append(quadkeyAndVerticalIDsHBorders1, newQuadkeyAndVerticalID) - quadkeyAndVerticalIDsHBorders31 := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - quadkeyAndVerticalIDsHBorders31 = append(quadkeyAndVerticalIDsHBorders31, newQuadkeyAndVerticalID) - - // quadkeyAndVerticalIDsValueE := []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID{} - // newQuadkeyAndVerticalID = object.NewFromExtendedSpatialIDToQuadkeyAndVerticalID(31, [][2]int64{{29031296, 1}, {29031296, 0}}, 10, 500, 0) - // quadkeyAndVerticalIDsValueE = append(quadkeyAndVerticalIDsValueE, newQuadkeyAndVerticalID) - - _, err := strconv.ParseInt("test", 10, 64) - datas := []struct { - spatialIds []string - ToHZoom int64 - ToVZoom int64 - maxHeight float64 - minHeight float64 - result []*object.FromExtendedSpatialIDToQuadkeyAndVerticalID - resultLength int - pattern int64 // 0:正常 1:異常 2:個数(水平) 3:個数(垂直) - e error - }{ - // 正常 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 21, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, pattern: 0}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 19, ToVZoom: 26, maxHeight: 0, minHeight: 0.0, result: quadkeyAndVerticalIDsSpatialIDs, pattern: 0}, - - // 水平精度個数確認 低精度は1、高精度は精度差^4 - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 24, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 512, pattern: 2}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 2, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 2, pattern: 2}, - // 水平精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders1, resultLength: 2, pattern: 2}, - {spatialIds: []string{"35/85263/65423/26/0"}, ToHZoom: 31, ToVZoom: 10, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDsHBorders31, pattern: 0}, - - // 垂直精度境界値 - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 0, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - {spatialIds: []string{"20/85263/65423/26/0"}, ToHZoom: 21, ToVZoom: 1, maxHeight: 500, minHeight: 0.0, result: quadkeyAndVerticalIDs, resultLength: 4, pattern: 3}, - - // 異常系(精度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 0, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 20, ToVZoom: -1, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"35/85263/65423/26/56"}, ToHZoom: 32, ToVZoom: 10, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/35/56"}, ToHZoom: 20, ToVZoom: 36, maxHeight: 0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"36/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - {spatialIds: []string{"20/85263/65423/36/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - - // 異常系(高度エラー) - {spatialIds: []string{"20/85263/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: -500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, "")}, - // 異常系(入力エラー) - {spatialIds: []string{"20/test/65423/26/56"}, ToHZoom: 1, ToVZoom: 10, maxHeight: 500.0, minHeight: 0.0, pattern: 1, e: errors.NewSpatialIdError(errors.InputValueErrorCode, err.Error())}, - } - for _, p := range datas { - - result, e := ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight) - if p.pattern == 0 && !reflect.DeepEqual(result, p.result) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, p.result[0], result[0]) - } - if p.pattern == 1 && e != p.e { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, e, p.e) - } - if p.pattern == 2 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - if p.pattern == 3 && p.resultLength != len(result[0].InnerIDList()) { - t.Log(t.Name()) - t.Errorf("ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs(%s,%d,%d,%f,%f) == %+v, result: %+v", p.spatialIds, p.ToHZoom, p.ToVZoom, p.maxHeight, p.minHeight, len(result[0].InnerIDList()), p.resultLength) - } - - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_1(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_2(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 56}, {29728048125, 56}, {29728048126, 56}, {29728048127, 56}}, - 26, - 25, - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 21, - 26, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_3(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 7}}, - 12, - 14, // 2^14 - 0, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_4(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 20, - [][2]int64{{7432012031, 54}}, - 12, - 14, - 188, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/26/56"}, - 20, - 12, - 14, - 188, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { - expected := []*object.FromExtendedSpatialIDToQuadkeyAndAltitudekey{ - object.NewFromExtendedSpatialIDToQuadkeyAndAltitudekey( - 21, - [][2]int64{{29728048124, 12}, {29728048124, 13}, {29728048125, 12}, {29728048125, 13}, {29728048126, 12}, {29728048126, 13}, {29728048127, 12}, {29728048127, 13}}, - 15, - 14, - -50, - ), - } - - result, error := ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys( - []string{"20/85263/65423/25/56"}, - 21, - 15, - 14, - -50, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func newTileXYZ(t *testing.T, hZoom uint16, x int64, y int64, vZoom uint16, z int64) *object.TileXYZ { - t.Helper() - xyz, err := object.NewTileXYZ(hZoom, x, y, vZoom, z) - if err != nil { - t.Fatal(err) - } - return xyz -} - -func newExtendedSpatialID(t *testing.T, id string) *object.ExtendedSpatialID { - t.Helper() - extendedSpatialId, err := object.NewExtendedSpatialID(id) - if err != nil { - t.Fatal(err) - } - return extendedSpatialId -} - -func TestConvertTileXYZToSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected []string - request argSet - }{ - { - // hZoom/z/x/y - []string{"23/-2/85263/65423"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 23, - 85263, - 65423, - 23, - 0, - )}, - 23, - 8, - 23, - }, - }, - { - []string{"25/1/170526/130846", "25/1/170526/130847", "25/1/170527/130846", "25/1/170527/130847"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 24, - 85263, - 65423, - 25, - 3, - )}, - 25, - 2, - 25, - }, - }, - { - []string{"4/0/63/23", "4/1/63/23"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 4, - 63, - 23, - 3, - 3, - )}, - 3, - 2, - 3, - }, - }, - { - []string{"23/-2/85263/65423", "23/-1/85263/65423"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 23, - 85263, - 65423, - 23, - 0, - )}, - 25, - 7, - 23, - }, - }, - { - []string{"26/6/85263/65423", "26/7/85263/65423"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 26, - 85263, - 65423, - 26, - 3, - )}, - 25, - -2, - 26, - }, - }, - { - []string{ - "23/0/170526/130846", - "23/1/170526/130846", - "23/2/170526/130846", - "23/0/170526/130847", - "23/1/170526/130847", - "23/2/170526/130847", - "23/0/170527/130846", - "23/1/170527/130846", - "23/2/170527/130846", - "23/0/170527/130847", - "23/1/170527/130847", - "23/2/170527/130847", - }, - argSet{ - []*object.TileXYZ{ - newTileXYZ( - t, - 22, - 85263, - 65423, - 23, - 0, - ), - newTileXYZ( - t, - 22, - 85263, - 65423, - 23, - 1, - )}, - 25, - -1, - 23, - }, - }, - } - for _, testCase := range testCases { - result, err := ConvertTileXYZsToSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) - if err != nil { - t.Fatal(err) - } - if assert.ElementsMatch(t, testCase.expected, result) == false { - // t.Error(result): - t.Errorf("expected: %v result: %v", testCase.expected, result) - } else { - t.Log("Success", result) - } - } - -} - -func TestConvertTileXYZToExtendedSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected []string - request argSet - }{ - { - // hZoom/x/y/vZoom/z - []string{"20/85263/65423/23/-2"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 23, - 8, - 23, - }, - }, - { - []string{"20/85263/65423/25/1"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 25, - 3, - )}, - 25, - 2, - 25, - }, - }, - { - []string{"20/85263/65423/3/0"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 3, - 3, - )}, - 3, - 2, - 3, - }, - }, - { - []string{"20/85263/65423/23/-2"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 25, - 8, - 23, - }, - }, - { - []string{"20/85263/65423/23/-2", "20/85263/65423/23/-1"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - )}, - 25, - 7, - 23, - }, - }, - { - []string{"20/85263/65423/26/6", "20/85263/65423/26/7"}, - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 26, - 3, - )}, - 25, - -2, - 26, - }, - }, - { - []string{"20/85263/65423/23/0", "20/85263/65423/23/1", "20/85263/65423/23/2"}, - argSet{ - []*object.TileXYZ{ - newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 0, - ), - newTileXYZ( - t, - 20, - 85263, - 65423, - 23, - 1, - )}, - 25, - -1, - 23, - }, - }, - } - for _, testCase := range testCases { - expectedData := []object.ExtendedSpatialID{} - for i := 0; i < len(testCase.expected); i++ { - extendedSpatialId := newExtendedSpatialID(t, testCase.expected[i]) - expectedData = append(expectedData, *extendedSpatialId) - } - result, err := ConvertTileXYZsToExtendedSpatialIDs(testCase.request.tile, testCase.request.zBaseExponent, testCase.request.zBaseOffset, testCase.request.outputVZoom) - if err != nil { - t.Fatal(err) - } - if assert.ElementsMatch(t, expectedData, result) == false { - // t.Error(result): - t.Errorf("expected: %v result: %v", expectedData, result) - } else { - t.Log("Success", result) - } - } - -} - -func TestErrorConvertTileXYZToExtendedSpatialIDs(t *testing.T) { - type argSet struct { - tile []*object.TileXYZ - zBaseExponent uint16 - zBaseOffset int64 - outputVZoom uint16 - } - testCases := []struct { - expected string - request argSet - }{ - { - "input index does not exist", - argSet{ - []*object.TileXYZ{newTileXYZ( - t, - 20, - 85263, - 65423, - 25, - (1< Date: Wed, 21 Aug 2024 21:08:42 +0900 Subject: [PATCH 16/25] refactored conversion function - replaced `fmt.Sprintf` as `strconv.FormatInt` - removed golang.org/x/exp/maps - replaced constants as `consts` package - fixed wrong inline document - `ConvertAltitudeKeyToZ` - `TileXYZ` --- common/consts/consts.go | 1 + common/object/id_object.go | 8 ++++---- go.mod | 1 - go.sum | 1 - transform/convert_quadkey_and_Vertical_id.go | 20 ++++++++++++-------- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/common/consts/consts.go b/common/consts/consts.go index 9cf6dd0..deb83c1 100644 --- a/common/consts/consts.go +++ b/common/consts/consts.go @@ -4,6 +4,7 @@ package consts const GeoCrs = 4326 // GeoCrs 空間IDで利用する地理座標系 const OrthCrs = 3857 // OrthCrs 直交座標系のEPSGコード const SpatialIDDelimiter = "/" // SpatialIDDelimiter 空間IDの区切り文字 +const ZOriginValue = 25 // ZOriginValue 空間IDにおけるボクセルの高さが1mとなるズームレベル const Minima = 1e-10 // Minima 浮動小数点誤差 diff --git a/common/object/id_object.go b/common/object/id_object.go index 6144646..950cbbf 100644 --- a/common/object/id_object.go +++ b/common/object/id_object.go @@ -516,13 +516,13 @@ func (qh QuadkeyAndVerticalID) MinHeight() float64 { // TileXYZ 水平方向TileKey(x,y)と垂直方向TileKey(z)の組み合わせを管理する構造体 type TileXYZ struct { - // 水平精度 0-(consts.MaxTileXYZZoom)の非負整数 + // 水平精度 [0, consts.MaxTileXYZZoom]の整数 hZoom uint16 // x 水平方向key x軸 x int64 // y 水平方向key y軸 y int64 - // 垂直精度 0-(consts.MaxTileXYZZoom)の非負整数 + // 垂直精度 [0, consts.MaxTileXYZZoom]の整数 vZoom uint16 // 垂直方向key z int64 @@ -547,7 +547,7 @@ type TileXYZ struct { // 戻り値(エラー): // // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 -// ズームレベル不正:hZoomまたはvZoomに0-(consts.MaxTileXYZZoom)以外の数値が含まれていた場合 +// ズームレベル不正:hZoomまたはvZoomに[0, consts.MaxTileXYZZoom]以外の数値が含まれていた場合 func NewTileXYZ(hZoom uint16, x int64, y int64, vZoom uint16, z int64) (*TileXYZ, error) { tile := &TileXYZ{} @@ -585,7 +585,7 @@ func NewTileXYZ(hZoom uint16, x int64, y int64, vZoom uint16, z int64) (*TileXYZ // 戻り値(エラー): // // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 -// ズームレベル不正:hZoomに0-(consts.MaxTileXYZZoom)以外の数値が含まれていた場合 +// ズームレベル不正:hZoomに[0, consts.MaxTileXYZZoom]以外の数値が含まれていた場合 func (a *TileXYZ) SetHZoom(hZoom uint16) error { if !(hZoom <= consts.MaxTileXYZZoom) { return errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("hZoom must be in 0-%v, but got %v", consts.MaxTileXYZZoom, hZoom)) diff --git a/go.mod b/go.mod index 3ffd1e3..5782efa 100644 --- a/go.mod +++ b/go.mod @@ -19,5 +19,4 @@ require ( require ( github.com/stretchr/testify v1.9.0 github.com/trajectoryjp/closest_go v1.0.1 - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 ) diff --git a/go.sum b/go.sum index 196541e..64468ef 100644 --- a/go.sum +++ b/go.sum @@ -17,7 +17,6 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 5020023..31379cd 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -3,7 +3,7 @@ package transform import ( "fmt" - "golang.org/x/exp/maps" + "github.com/trajectoryjp/spatial_id_go/v4/common/consts" "math" "strconv" "strings" @@ -504,7 +504,8 @@ func ConvertExtendedSpatialIDToSpatialIDs(extendedSpatialID *object.ExtendedSpat xMin, yMin, xMax, yMax := integrate.HorizontalZoomMinMax(extendedSpatialID.HZoom(), extendedSpatialID.X(), extendedSpatialID.Y(), targetZoomLevel) for x := xMin; x <= xMax; x++ { for y := yMin; y <= yMax; y++ { - spatialIds = append(spatialIds, fmt.Sprintf("%v/%v/%v/%v", targetZoomLevel, extendedSpatialID.Z(), x, y)) + spatialId := strconv.FormatInt(targetZoomLevel, 10) + consts.SpatialIDDelimiter + strconv.FormatInt(extendedSpatialID.Z(), 10) + consts.SpatialIDDelimiter + strconv.FormatInt(x, 10) + consts.SpatialIDDelimiter + strconv.FormatInt(y, 10) + spatialIds = append(spatialIds, spatialId) } } case extendedSpatialID.HZoom() > extendedSpatialID.VZoom(): @@ -512,11 +513,12 @@ func ConvertExtendedSpatialIDToSpatialIDs(extendedSpatialID *object.ExtendedSpat verticalIds := integrate.VerticalZoom(extendedSpatialID.VZoom(), extendedSpatialID.Z(), targetZoomLevel) for _, verticalId := range verticalIds { // "z/f" + "x/y" - spatialIds = append(spatialIds, fmt.Sprintf("%v/%v/%v", verticalId, extendedSpatialID.X(), extendedSpatialID.Y())) + spatialId := verticalId + consts.SpatialIDDelimiter + strconv.FormatInt(extendedSpatialID.X(), 10) + consts.SpatialIDDelimiter + strconv.FormatInt(extendedSpatialID.Y(), 10) + spatialIds = append(spatialIds, spatialId) } // ズームレベルが等しい場合は直接変換可 case extendedSpatialID.HZoom() == extendedSpatialID.VZoom(): - spatialId := fmt.Sprintf("%v/%v/%v/%v", extendedSpatialID.HZoom(), extendedSpatialID.Z(), extendedSpatialID.X(), extendedSpatialID.Y()) + spatialId := strconv.FormatInt(extendedSpatialID.HZoom(), 10) + consts.SpatialIDDelimiter + strconv.FormatInt(extendedSpatialID.Z(), 10) + consts.SpatialIDDelimiter + strconv.FormatInt(extendedSpatialID.X(), 10) + consts.SpatialIDDelimiter + strconv.FormatInt(extendedSpatialID.Y(), 10) spatialIds = append(spatialIds, spatialId) } return spatialIds @@ -610,7 +612,6 @@ func ConvertExtendedSpatialIDToSpatialIDs(extendedSpatialID *object.ExtendedSpat func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputVZoom uint16) ([]object.ExtendedSpatialID, error) { extendedSpatialIDsMap := make(map[int64]object.ExtendedSpatialID) - extendedSpatialIDs := []object.ExtendedSpatialID{} for _, r := range request { if !extendedSpatialIDCheckZoom(int64(r.HZoom()), int64(outputVZoom)) { @@ -635,7 +636,8 @@ func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponen extendedSpatialIDsMap[z] = *extendedSpatialID } } - for _, extendedSpatialID := range maps.Values(extendedSpatialIDsMap) { + extendedSpatialIDs := make([]object.ExtendedSpatialID, 0, len(extendedSpatialIDsMap)) + for _, extendedSpatialID := range extendedSpatialIDsMap { extendedSpatialIDs = append(extendedSpatialIDs, extendedSpatialID) } @@ -707,7 +709,9 @@ func ConvertTileXYZsToSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16 // // 戻り値 : // -// 変換後のaltitudekeyのスライス +// 変換後のaltitudekeyの最小値と最大値 +// +// 戻り値の順序:(最小altitudekey, 最大altitudekey) // // 戻り値(エラー) : // @@ -734,7 +738,7 @@ func ConvertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, output internalMaxIndex = common.CalculateArithmeticShift(altitudekey+1, zoomDifference) - 1 } // 3. Calculate outputMinIndex - outputZoomDifference := outputZoom - 25 + outputZoomDifference := outputZoom - consts.ZOriginValue outputMinIndex := common.CalculateArithmeticShift(internalMinIndex-zBaseOffset, outputZoomDifference) outputMaxIndex := common.CalculateArithmeticShift(internalMaxIndex-zBaseOffset, outputZoomDifference) if outputZoomDifference > 0 { From 2163f751115dd6671c1539b066d141f0158320ab Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Wed, 21 Aug 2024 21:37:25 +0900 Subject: [PATCH 17/25] reduced type casting of `objects.TileXYZ` - adjusted fields' integer size int64 - renamed `object.TileXYZ`s' test functions --- common/object/id_object.go | 14 ++++++------- transform/convert_quadkey_and_Vertical_id.go | 10 +++++----- .../convert_quadkey_and_Vertical_id_test.go | 20 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/common/object/id_object.go b/common/object/id_object.go index 950cbbf..0b634b5 100644 --- a/common/object/id_object.go +++ b/common/object/id_object.go @@ -517,13 +517,13 @@ func (qh QuadkeyAndVerticalID) MinHeight() float64 { // TileXYZ 水平方向TileKey(x,y)と垂直方向TileKey(z)の組み合わせを管理する構造体 type TileXYZ struct { // 水平精度 [0, consts.MaxTileXYZZoom]の整数 - hZoom uint16 + hZoom int64 // x 水平方向key x軸 x int64 // y 水平方向key y軸 y int64 // 垂直精度 [0, consts.MaxTileXYZZoom]の整数 - vZoom uint16 + vZoom int64 // 垂直方向key z int64 } @@ -548,7 +548,7 @@ type TileXYZ struct { // // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 // ズームレベル不正:hZoomまたはvZoomに[0, consts.MaxTileXYZZoom]以外の数値が含まれていた場合 -func NewTileXYZ(hZoom uint16, x int64, y int64, vZoom uint16, z int64) (*TileXYZ, error) { +func NewTileXYZ(hZoom int64, x int64, y int64, vZoom int64, z int64) (*TileXYZ, error) { tile := &TileXYZ{} // 水平精度設定 @@ -586,7 +586,7 @@ func NewTileXYZ(hZoom uint16, x int64, y int64, vZoom uint16, z int64) (*TileXYZ // // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 // ズームレベル不正:hZoomに[0, consts.MaxTileXYZZoom]以外の数値が含まれていた場合 -func (a *TileXYZ) SetHZoom(hZoom uint16) error { +func (a *TileXYZ) SetHZoom(hZoom int64) error { if !(hZoom <= consts.MaxTileXYZZoom) { return errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("hZoom must be in 0-%v, but got %v", consts.MaxTileXYZZoom, hZoom)) } @@ -628,7 +628,7 @@ func (a *TileXYZ) SetY(y int64) { // // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 // ズームレベル不正:はvZoomに0-35以外の数値が含まれていた場合 -func (a *TileXYZ) SetVZoom(vZoom uint16) error { +func (a *TileXYZ) SetVZoom(vZoom int64) error { if !(vZoom <= consts.MaxTileXYZZoom) { return errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("vZoom must be in 0-%v, but got %v", consts.MaxTileXYZZoom, vZoom)) } @@ -654,7 +654,7 @@ func (a *TileXYZ) SetZ(z int64) { // output 戻り値: // // TileXYZオブジェクトに設定されているHZoomの値 -func (a *TileXYZ) HZoom() uint16 { +func (a *TileXYZ) HZoom() int64 { return a.hZoom } @@ -687,7 +687,7 @@ func (a *TileXYZ) Y() int64 { // output 戻り値: // // TileXYZオブジェクトに設定されているvZoomの値 -func (a *TileXYZ) VZoom() uint16 { +func (a *TileXYZ) VZoom() int64 { return a.vZoom } diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 31379cd..8679bec 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -609,16 +609,16 @@ func ConvertExtendedSpatialIDToSpatialIDs(extendedSpatialID *object.ExtendedSpat // outputVZoom 23 // // extendedSpatialIDs :["20/85263/65423/23/-2", "20/85263/65423/23/-1"] -func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, outputVZoom uint16) ([]object.ExtendedSpatialID, error) { +func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponent int64, zBaseOffset int64, outputVZoom int64) ([]object.ExtendedSpatialID, error) { extendedSpatialIDsMap := make(map[int64]object.ExtendedSpatialID) for _, r := range request { - if !extendedSpatialIDCheckZoom(int64(r.HZoom()), int64(outputVZoom)) { + if !extendedSpatialIDCheckZoom(r.HZoom(), outputVZoom) { return nil, errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("extendSpatialID zoom level must be in 0-35: hZoom=%v, vZoom=%v", r.HZoom(), outputVZoom)) } - zMin, zMax, err := ConvertAltitudeKeyToZ(r.Z(), int64(r.VZoom()), int64(outputVZoom), int64(zBaseExponent), zBaseOffset) + zMin, zMax, err := ConvertAltitudeKeyToZ(r.Z(), r.VZoom(), outputVZoom, zBaseExponent, zBaseOffset) if err != nil { return nil, err } @@ -632,7 +632,7 @@ func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponen extendedSpatialID.SetX(r.X()) extendedSpatialID.SetY(r.Y()) extendedSpatialID.SetZ(z) - extendedSpatialID.SetZoom(int64(r.HZoom()), int64(outputVZoom)) + extendedSpatialID.SetZoom(r.HZoom(), outputVZoom) extendedSpatialIDsMap[z] = *extendedSpatialID } } @@ -676,7 +676,7 @@ func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponen // 2. TileXYZの水平精度の差: 差が1増えるごとに1で出力された拡張空間ID数の4のべき乗で出力空間ID数が増加する。 // そのため、これら2項目の値によっては変換後の空間ID数は大幅に増大する。 // 動作環境によってはメモリ不足となる可能性があるため、注意すること。 -func ConvertTileXYZsToSpatialIDs(request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, extendedSpatialIdVZoom uint16) ([]string, error) { +func ConvertTileXYZsToSpatialIDs(request []*object.TileXYZ, zBaseExponent int64, zBaseOffset int64, extendedSpatialIdVZoom int64) ([]string, error) { var outputData []string outputExtendedSpatialIds, err := ConvertTileXYZsToExtendedSpatialIDs( request, zBaseExponent, zBaseOffset, extendedSpatialIdVZoom, diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 007f9a6..dbd91e4 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -378,7 +378,7 @@ func TestConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys_5(t *testing.T) { } } -func newTileXYZ(t *testing.T, hZoom uint16, x int64, y int64, vZoom uint16, z int64) *object.TileXYZ { +func newTileXYZ(t *testing.T, hZoom int64, x int64, y int64, vZoom int64, z int64) *object.TileXYZ { t.Helper() xyz, err := object.NewTileXYZ(hZoom, x, y, vZoom, z) if err != nil { @@ -396,12 +396,12 @@ func newExtendedSpatialID(t *testing.T, id string) *object.ExtendedSpatialID { return extendedSpatialId } -func TestConvertTileXYZToSpatialIDs(t *testing.T) { +func TestConvertTileXYZsToSpatialIDs(t *testing.T) { type argSet struct { tile []*object.TileXYZ - zBaseExponent uint16 + zBaseExponent int64 zBaseOffset int64 - outputVZoom uint16 + outputVZoom int64 } testCases := []struct { expected []string @@ -542,12 +542,12 @@ func TestConvertTileXYZToSpatialIDs(t *testing.T) { } -func TestConvertTileXYZToExtendedSpatialIDs(t *testing.T) { +func TestConvertTileXYZsToExtendedSpatialIDs(t *testing.T) { type argSet struct { tile []*object.TileXYZ - zBaseExponent uint16 + zBaseExponent int64 zBaseOffset int64 - outputVZoom uint16 + outputVZoom int64 } testCases := []struct { expected []string @@ -696,12 +696,12 @@ func TestConvertTileXYZToExtendedSpatialIDs(t *testing.T) { } -func TestErrorConvertTileXYZToExtendedSpatialIDs(t *testing.T) { +func TestErrorConvertTileXYZsToExtendedSpatialIDs(t *testing.T) { type argSet struct { tile []*object.TileXYZ - zBaseExponent uint16 + zBaseExponent int64 zBaseOffset int64 - outputVZoom uint16 + outputVZoom int64 } testCases := []struct { expected string From 17c6c8de37ab4e2878eed247bc2c9f9e5b825935 Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Wed, 21 Aug 2024 22:07:03 +0900 Subject: [PATCH 18/25] moved example of converting TileXYZ to SpatialID --- documentation/convesion.md | 2 +- examples/convertTileXYZToSpatialId/go.mod | 15 ----- examples/convertTileXYZToSpatialId/go.sum | 58 ----------------- examples/convertTileXYZToSpatialId/main.go | 65 ------------------- .../convert_quadkey_and_Vertical_id_test.go | 59 +++++++++++++++++ 5 files changed, 60 insertions(+), 139 deletions(-) delete mode 100644 examples/convertTileXYZToSpatialId/go.mod delete mode 100644 examples/convertTileXYZToSpatialId/go.sum delete mode 100644 examples/convertTileXYZToSpatialId/main.go diff --git a/documentation/convesion.md b/documentation/convesion.md index 582e8f6..4e224fd 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -24,7 +24,7 @@ 3Dタイルキー空間でボクセルデータを扱っている場合、`transform`パッケージの関数を用いて(拡張)空間IDへ変換することが可能 -以下のコードブロックの全文は[examples/convertTileXYZToSpatialId](../examples/convertTileXYZToSpatialId/main.go)で実行可能 +以下のコードブロックの全文は`ExampleConvertTileXYZsToSpatialIDs`([transform/convert_quadkey_and_Vertical_id_test.go](../transform/convert_quadkey_and_Vertical_id_test.go))で実行可能 次のような3Dタイルキー空間データがある時を考える diff --git a/examples/convertTileXYZToSpatialId/go.mod b/examples/convertTileXYZToSpatialId/go.mod deleted file mode 100644 index 9947124..0000000 --- a/examples/convertTileXYZToSpatialId/go.mod +++ /dev/null @@ -1,15 +0,0 @@ -module convertTileXYZToSpatialId - -go 1.22 - -require github.com/trajectoryjp/spatial_id_go/v4 v4.0.0-20240820053909-ebbb0298a203 - -require ( - github.com/go-gl/mathgl v1.1.0 // indirect - github.com/trajectoryjp/closest_go v1.0.1 // indirect - github.com/trajectoryjp/geodesy_go v1.0.1 // indirect - github.com/wroge/wgs84 v1.1.7 // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/image v0.7.0 // indirect - gonum.org/v1/gonum v0.13.0 // indirect -) diff --git a/examples/convertTileXYZToSpatialId/go.sum b/examples/convertTileXYZToSpatialId/go.sum deleted file mode 100644 index 0112cfd..0000000 --- a/examples/convertTileXYZToSpatialId/go.sum +++ /dev/null @@ -1,58 +0,0 @@ -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/go-gl/mathgl v1.1.0 h1:0lzZ+rntPX3/oGrDzYGdowSLC2ky8Osirvf5uAwfIEA= -github.com/go-gl/mathgl v1.1.0/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ= -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/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/trajectoryjp/closest_go v1.0.1 h1:dvshtZzPDwhGDhzn5SVZxlgNnqr/gLp4uIpGDIEOHaU= -github.com/trajectoryjp/closest_go v1.0.1/go.mod h1:+iTxW7/pOi0dIqo2/GcqGqWh/fAj2gMjDIiZ+BFDXIc= -github.com/trajectoryjp/geodesy_go v1.0.1 h1:FvvnA3kPcPoXOjn6cS27R9aiCLyszOarFuZRVlQRG2s= -github.com/trajectoryjp/geodesy_go v1.0.1/go.mod h1:eJuX+ds+t3MKxHG9dhobqNjUbUsYlpTT9XDO0mbc0LU= -github.com/trajectoryjp/spatial_id_go/v4 v4.0.0-20240820053909-ebbb0298a203 h1:xqwGOnafJTqI3Ls3gsHg+SGjkow6aPnAZr5qJAPLfu4= -github.com/trajectoryjp/spatial_id_go/v4 v4.0.0-20240820053909-ebbb0298a203/go.mod h1:wDCjEz2vOtt4ARB1sne8HHC3YeRJ1QGeteJ8ZCrxU5A= -github.com/wroge/wgs84 v1.1.7 h1:8WVUUrpjysYxrn0ssWX7z90SOUKCuHt9NQ5tg9ovjIY= -github.com/wroge/wgs84 v1.1.7/go.mod h1:mc1F8ubW03DO4zaf/006cmhaiMlfvbKmqVAcPuAtsNA= -github.com/xieyuschen/deepcopy v1.0.1 h1:nTCnKprCOdibz8WXWlMZzULIlpzZX0ZzKjz8HlGd/Nk= -github.com/xieyuschen/deepcopy v1.0.1/go.mod h1:smzaXhQZuuehOzevwMMLzvM7gBslB4VPdgJbwdyIDSA= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= -golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -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/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= -gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/convertTileXYZToSpatialId/main.go b/examples/convertTileXYZToSpatialId/main.go deleted file mode 100644 index c5b6ae1..0000000 --- a/examples/convertTileXYZToSpatialId/main.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "fmt" - "github.com/trajectoryjp/spatial_id_go/v4/common/object" - "github.com/trajectoryjp/spatial_id_go/v4/transform" -) - -func main() { - inputData := []struct { - hZoom uint16 - x int64 - y int64 - vZoom uint16 - z int64 - }{ - { - 22, - 85263, - 65423, - 23, - 0, - }, - { - 22, - 85263, - 65423, - 23, - 1, - }, - } - var inputXYZ []*object.TileXYZ - for _, in := range inputData { - tile, err := object.NewTileXYZ(in.hZoom, in.x, in.y, in.vZoom, in.z) - if err != nil { - panic(err) - } - inputXYZ = append(inputXYZ, tile) - } - outputData, err := transform.ConvertTileXYZsToSpatialIDs( - inputXYZ, - 25, - -1, - 23, - ) - if err != nil { - panic(err) - } - fmt.Printf("inputData: %v\n", inputData) - // { - // "23/0/170526/130846", - // "23/0/170527/130846", - // "23/0/170526/130847", - // "23/0/170527/130847", - // "23/1/170526/130846", - // "23/1/170526/130847", - // "23/1/170527/130846", - // "23/1/170527/130847", - // "23/2/170526/130846", - // "23/2/170526/130847", - // "23/2/170527/130846", - // "23/2/170527/130847", - // } - fmt.Printf("outputData: %v\n", outputData) -} diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index dbd91e4..9884ff6 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -2,6 +2,7 @@ package transform import ( + "fmt" "reflect" "sort" "strconv" @@ -542,6 +543,64 @@ func TestConvertTileXYZsToSpatialIDs(t *testing.T) { } +func ExampleConvertTileXYZsToSpatialIDs() { + inputData := []struct { + hZoom int64 + x int64 + y int64 + vZoom int64 + z int64 + }{ + { + 22, + 85263, + 65423, + 23, + 0, + }, + { + 22, + 85263, + 65423, + 23, + 1, + }, + } + var inputXYZ []*object.TileXYZ + for _, in := range inputData { + tile, err := object.NewTileXYZ(in.hZoom, in.x, in.y, in.vZoom, in.z) + if err != nil { + panic(err) + } + inputXYZ = append(inputXYZ, tile) + } + outputData, err := ConvertTileXYZsToSpatialIDs( + inputXYZ, + 25, + -1, + 23, + ) + if err != nil { + panic(err) + } + for _, out := range outputData { + fmt.Println(out) + } + // Unordered output: + // 23/0/170526/130846 + // 23/0/170527/130846 + // 23/0/170526/130847 + // 23/0/170527/130847 + // 23/1/170526/130846 + // 23/1/170526/130847 + // 23/1/170527/130846 + // 23/1/170527/130847 + // 23/2/170526/130846 + // 23/2/170526/130847 + // 23/2/170527/130846 + // 23/2/170527/130847 +} + func TestConvertTileXYZsToExtendedSpatialIDs(t *testing.T) { type argSet struct { tile []*object.TileXYZ From 7830aa20d255974cadd19655cd7d7ba922dd18b6 Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Thu, 22 Aug 2024 18:17:59 +0900 Subject: [PATCH 19/25] updated documentation of conversion function - restructured conversion functions table - removed future plan column to prevent confusing - added overview of ConvertExtendedSpatialIDToSpatialIDs --- documentation/convesion.md | 39 ++++++++++++-------- transform/convert_quadkey_and_Vertical_id.go | 6 ++- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/documentation/convesion.md b/documentation/convesion.md index 4e224fd..8c88028 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -4,21 +4,30 @@ ## 変換関数一覧 -| 変換元 | 変換先 | 対応関数 | 今後の変更予定など備考 | -|-------------|-------------|--------------------------------------------------------|--------------------------------------------------------| -| 空間ID | 拡張空間ID | なし | `ConvertSpatialIDsToQuadkeysAndVerticalIDs`が部分的に行う | -| 拡張空間ID | 空間ID | `ConvertExtendedSpatialIDToSpatialIDs` | `ConvertQuadkeysAndVerticalIDsToSpatialIDs`も部分的に行う | -| 拡張空間ID | TileXYZ | なし | `ConvertExtendedSpatialIDsToTileXYZ()`に実装予定 | -| TileXYZ | 拡張空間ID | `ConvertTileXYZsToExtendedSpatialIDs()` | 空間IDへの変換は`ConvertExtendedSpatialIDToSpatialIDs`と組み合わせる | -| TileXYZ | 空間ID | `ConvertTileXYZsToSpatialIDs()` | TileXYZ->拡張空間ID変換と拡張空間ID->空間ID変換の組み合わせ | -| 3Dtilekey | 拡張空間ID | なし | Pull Request#27のもの 実装**しない** | -| 拡張空間ID | 3Dtilekey | `ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys()` | 廃止予定 | -| 一次元インデックス | 一次元変換インデックス | `ConvertZToAltitudekey()` | `TransformIndexCoordinate()`にリネーム予定 | -| 一次元変換インデックス | 一次元インデックス | `ConvertAltitudeKeyToZ()` | `InverseTransformIndexCoordinate()`にリネーム予定 | -| Key | 拡張空間ID | `ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs()` | 廃止予定 | -| Key | 空間ID | `ConvertQuadkeysAndVerticalIDsToSpatialIDs()` | 廃止予定 | -| 空間ID | Key | `ConvertSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | -| 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs()` | 廃止予定 | +TileXYZ/空間ID/拡張空間ID相互変換における変換関数の対応関係: + +| 変換元(縦軸)\変換先(横軸) | 空間ID | 拡張空間ID | TileXYZ | +|-----------------|------------------------------------------|-----------------------------------------|---------| +| 空間ID | - | なし | なし | +| 拡張空間ID | `ConvertExtendedSpatialIDToSpatialIDs()` | - | なし | +| TileXYZ | `ConvertTileXYZsToSpatialIDs()` | `ConvertTileXYZsToExtendedSpatialIDs()` | - | + +高度(一次元インデックス)変換関数: + +| 変換元 | 変換先 | 対応関数 | +|--------------|--------------|------------------------------------------| +| 一次元インデックス | 一次元変換先インデックス | `ConvertZToAltitudekey()` | +| 一次元変換先インデックス | 一次元インデックス | `ConvertAltitudeKeyToZ()` | + +廃止/非推奨予定の関数: + +| 変換元 | 変換先 | 関数 | +|--------|--------|--------------------------------------------------------| +| 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys()` | +| 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs()` | +| Key | 拡張空間ID | `ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs()` | +| Key | 空間ID | `ConvertQuadkeysAndVerticalIDsToSpatialIDs()` | +| 空間ID | Key | `ConvertSpatialIDsToQuadkeysAndVerticalIDs()` | ## TileXYZ -> 空間ID変換 diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 8679bec..7c2f926 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -442,6 +442,9 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // ConvertExtendedSpatialIDToSpatialIDs 拡張空間IDを空間IDへ変換する // +// 拡張空間IDの水平精度と垂直精度は変換によって高い方に揃えられる。 +// このため、出力空間ID配列の長さは拡張空間IDの水平ズームレベルと垂直ズームレベルの差に依存する +// // 引数 : // // extendedSpatialID : 変換対象の拡張空間ID構造体 @@ -452,7 +455,8 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str // // 補足事項: // -// 入力拡張空間IDの垂直精度と水平精度の間で差がある場合、差が1増えるごとに4のべき乗で出力空間ID数が増加する。 +// 入力拡張空間IDの垂直精度と水平精度の間で差がある場合、差が1増えるごとに4(垂直精度の方が低い場合) +// または2(垂直精度の方が低い場合)のべき乗で出力空間ID数が増加する。 // そのため、精度差が大きすぎると変換後の空間ID数は大幅に増大する。 // 動作環境によってはメモリ不足となる可能性があるため、注意すること。 // From 662019cb4781a0f511557edc5eda4b37fc04f73f Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Thu, 22 Aug 2024 19:38:53 +0900 Subject: [PATCH 20/25] refactored conversion from altitudeKey to Z-index - remove local `zOriginValue` (`consts.ZOriginValue` still remains) - renamed `ConvertAltitudeKeyToZ` to `ConvertAltitudeKeyToMinMaxZ` --- documentation/convesion.md | 4 ++-- transform/convert_quadkey_and_Vertical_id.go | 14 +++++++------- .../convert_quadkey_and_Vertical_id_test.go | 16 +++++++++------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/documentation/convesion.md b/documentation/convesion.md index 8c88028..3784c1b 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -17,7 +17,7 @@ TileXYZ/空間ID/拡張空間ID相互変換における変換関数の対応関 | 変換元 | 変換先 | 対応関数 | |--------------|--------------|------------------------------------------| | 一次元インデックス | 一次元変換先インデックス | `ConvertZToAltitudekey()` | -| 一次元変換先インデックス | 一次元インデックス | `ConvertAltitudeKeyToZ()` | +| 一次元変換先インデックス | 一次元インデックス | `ConvertAltitudeKeyToMinMaxZ()` | 廃止/非推奨予定の関数: @@ -146,7 +146,7 @@ request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, extendedSpat TileXYZ空間のボクセルを拡張空間IDに変換する 変換時、`TileXYZ.x`,`TileXYZ.y`は元の値が利用されるのみである -しかし`TileXYZ.z`は一次元変換(`ConvertAltitudeKeyToZ()`)によって元の値に近い垂直方向拡張空間インデックスに変換される +しかし`TileXYZ.z`は一次元逆変換(`ConvertAltitudeKeyToMinMaxZ()`)によって元の値に近い垂直方向拡張空間インデックスに変換される これは`TileXYZ.z`と拡張空間ID垂直インデックスの間ではボクセルのインデックス付番や0番の位置の基準を変更されているためである diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 7c2f926..50d9b41 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -3,11 +3,12 @@ package transform import ( "fmt" - "github.com/trajectoryjp/spatial_id_go/v4/common/consts" "math" "strconv" "strings" + "github.com/trajectoryjp/spatial_id_go/v4/common/consts" + "github.com/trajectoryjp/spatial_id_go/v4/common" "github.com/trajectoryjp/spatial_id_go/v4/common/errors" "github.com/trajectoryjp/spatial_id_go/v4/common/object" @@ -17,8 +18,7 @@ import ( // 宣言 var ( - alt25 = math.Pow(2, 25) - zOriginValue int64 = 25 + alt25 = math.Pow(2, 25) ) // ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs 内部形式IDを拡張空間IDに変換する。 @@ -622,7 +622,7 @@ func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponen return nil, errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("extendSpatialID zoom level must be in 0-35: hZoom=%v, vZoom=%v", r.HZoom(), outputVZoom)) } - zMin, zMax, err := ConvertAltitudeKeyToZ(r.Z(), r.VZoom(), outputVZoom, zBaseExponent, zBaseOffset) + zMin, zMax, err := ConvertAltitudeKeyToMinMaxZ(r.Z(), r.VZoom(), outputVZoom, zBaseExponent, zBaseOffset) if err != nil { return nil, err } @@ -695,7 +695,7 @@ func ConvertTileXYZsToSpatialIDs(request []*object.TileXYZ, zBaseExponent int64, return outputData, nil } -// ConvertAltitudeKeyToZ altitudekeyを(拡張)空間IDのz成分に高度変換する。 +// ConvertAltitudeKeyToMinMaxZ altitudekeyを(拡張)空間IDのz成分に高度変換する。 // // 変換前と変換後の精度差によって出力されるaltitudekeyの個数は増減する。 // @@ -722,7 +722,7 @@ func ConvertTileXYZsToSpatialIDs(request []*object.TileXYZ, zBaseExponent int64, // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 // 入力インデックス不正 :inputIndexにそのズームレベル(inputZoom)で存在しないインデックス値が入力されていた場合。 // 出力インデックス不正 :出力altitudekeyが出力ズームレベル(outputZoom)で存在しないインデックス値になった場合。 -func ConvertAltitudeKeyToZ(altitudekey int64, altitudekeyZoomLevel int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) (int64, int64, error) { +func ConvertAltitudeKeyToMinMaxZ(altitudekey int64, altitudekeyZoomLevel int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) (int64, int64, error) { // 1. check that the input index exists in the input system inputResolution := common.CalculateArithmeticShift(1, altitudekeyZoomLevel) @@ -1067,7 +1067,7 @@ func convertZToMinAltitudekey(inputIndex int64, inputZoom int64, outputZoom int6 } // 2. Calculate outputIndex - outputIndex := common.CalculateArithmeticShift(inputIndex, -(inputZoom - zOriginValue)) + outputIndex := common.CalculateArithmeticShift(inputIndex, -(inputZoom - consts.ZOriginValue)) outputIndex += zBaseOffset outputIndex = common.CalculateArithmeticShift(outputIndex, (outputZoom - zBaseExponent)) diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 9884ff6..4f27d69 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -9,6 +9,8 @@ import ( "strings" "testing" + "github.com/trajectoryjp/spatial_id_go/v4/common/consts" + "github.com/stretchr/testify/assert" "github.com/trajectoryjp/spatial_id_go/v4/common/errors" "github.com/trajectoryjp/spatial_id_go/v4/common/object" @@ -775,7 +777,7 @@ func TestErrorConvertTileXYZsToExtendedSpatialIDs(t *testing.T) { 85263, 65423, 25, - (1< Date: Thu, 22 Aug 2024 19:50:41 +0900 Subject: [PATCH 21/25] refactored conversion from Z-index to altitudeKey - renamed `ConvertZToAltitudekey` to `ConvertZToMinMaxAltitudekey` - refactored tests using test table --- documentation/convesion.md | 6 +- transform/convert_quadkey_and_Vertical_id.go | 45 ++-- .../convert_quadkey_and_Vertical_id_test.go | 237 ++++++++---------- 3 files changed, 129 insertions(+), 159 deletions(-) diff --git a/documentation/convesion.md b/documentation/convesion.md index 3784c1b..d35dc2f 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -14,9 +14,9 @@ TileXYZ/空間ID/拡張空間ID相互変換における変換関数の対応関 高度(一次元インデックス)変換関数: -| 変換元 | 変換先 | 対応関数 | -|--------------|--------------|------------------------------------------| -| 一次元インデックス | 一次元変換先インデックス | `ConvertZToAltitudekey()` | +| 変換元 | 変換先 | 対応関数 | +|--------------|--------------|---------------------------------| +| 一次元インデックス | 一次元変換先インデックス | `ConvertZToMinMaxAltitudekey()` | | 一次元変換先インデックス | 一次元インデックス | `ConvertAltitudeKeyToMinMaxZ()` | 廃止/非推奨予定の関数: diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index 50d9b41..bb6e1ae 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -382,7 +382,6 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str duplicate := map[[2]int64]interface{}{} for _, idString := range extendedSpatialIDs { - var altitudeKeys []int64 quadkeys := []int64{} currentID, error := object.NewExtendedSpatialID(idString) @@ -403,15 +402,15 @@ func ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys(extendedSpatialIDs []str } // B. convert vertical IDs to fit Output Vertical Zoom Level - altitudeKeys, error = ConvertZToAltitudekey(currentID.Z(), currentID.VZoom(), outputAltitudekeyZoom, zBaseExponent, zBaseOffset) - if error != nil { - return nil, error + minAltitudeKey, maxAltitudeKey, err := ConvertZToMinMaxAltitudekey(currentID.Z(), currentID.VZoom(), outputAltitudekeyZoom, zBaseExponent, zBaseOffset) + if err != nil { + return nil, err } // 水平方向と垂直方向の組み合わせを作成する idList := [][2]int64{} for _, quadkey := range quadkeys { - for _, altitudeKey := range altitudeKeys { + for altitudeKey := minAltitudeKey; altitudeKey <= maxAltitudeKey; altitudeKey++ { newID := [2]int64{quadkey, altitudeKey} if _, ok := duplicate[newID]; ok { continue @@ -996,7 +995,7 @@ func convertVerticallIDToBit(vZoom int64, vIndex int64, outputZoom int64, maxHei } -// ConvertZToAltitudekey (拡張)空間IDのz成分をaltitudekeyに高度変換する。 +// ConvertZToMinMaxAltitudekey (拡張)空間IDのz成分をaltitudekeyに高度変換する。 // // 変換前と変換後の精度差によって出力されるaltitudekeyの個数は増減する。 // @@ -1021,21 +1020,16 @@ func convertVerticallIDToBit(vZoom int64, vIndex int64, outputZoom int64, maxHei // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 // 入力インデックス不正 :inputIndexにそのズームレベル(inputZoom)で存在しないインデックス値が入力されていた場合。 // 出力インデックス不正 :出力altitudekeyが出力ズームレベル(outputZoom)で存在しないインデックス値になった場合。 -func ConvertZToAltitudekey(inputIndex int64, inputZoom int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) ([]int64, error) { - - var ( - outputIndexes []int64 - error error - ) +func ConvertZToMinMaxAltitudekey(inputIndex int64, inputZoom int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) (minAltitudeKey int64, maxAltitudeKey int64, err error) { // determine the upper and lower index bounds to search for matches in height solution space - lowerBound, error := convertZToMinAltitudekey(inputIndex, inputZoom, outputZoom, zBaseExponent, zBaseOffset) - if error != nil { - return nil, error + lowerBound, err := convertZToMinAltitudekey(inputIndex, inputZoom, outputZoom, zBaseExponent, zBaseOffset) + if err != nil { + return 0, 0, err } - upperBound, error := convertZToMinAltitudekey(inputIndex+1, inputZoom, outputZoom, zBaseExponent, zBaseOffset) - if error != nil { - return nil, error + upperBound, err := convertZToMinAltitudekey(inputIndex+1, inputZoom, outputZoom, zBaseExponent, zBaseOffset) + if err != nil { + return 0, 0, err } // Determine the vertical index/indices to return. @@ -1043,15 +1037,14 @@ func ConvertZToAltitudekey(inputIndex int64, inputZoom int64, outputZoom int64, // mathematically the altitude associated with the lower bounds will always satisfy the solution set. // b) cycle through indices from lowerBounds+1 to upperBounds with i to find any possible additional indexes // that satisfy the solution set. - outputIndexes = append(outputIndexes, lowerBound) - - for i := lowerBound + 1; i < upperBound; i++ { - - outputIndexes = append(outputIndexes, int64(i)) + // but only output (minimum key, maximum key) as (lowerBound, upperBound - 1) + minAltitudeKey = lowerBound + maxAltitudeKey = upperBound - 1 + if minAltitudeKey > maxAltitudeKey { + return minAltitudeKey, minAltitudeKey, nil + } else { + return minAltitudeKey, maxAltitudeKey, nil } - - return outputIndexes, nil - } func convertZToMinAltitudekey(inputIndex int64, inputZoom int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) (int64, error) { diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 4f27d69..d0a2479 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -1383,86 +1383,120 @@ func TestSpatialIDCheckZoom(t *testing.T) { } -func TestConvertZToAltitudekey_1(t *testing.T) { - expected := []int64{400, 401, 402, 403} - - result, error := ConvertZToAltitudekey( - 100, - 25, - 27, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_2(t *testing.T) { - expected := []int64{50} - - result, error := ConvertZToAltitudekey( - 100, - 25, - 24, - 25, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_3(t *testing.T) { - expected := []int64{100} - - result, error := ConvertZToAltitudekey( - 100, - 25, - 25, - 25, - 0, - ) - if error != nil { - t.Fatal(error) +func TestConvertZToMinMaxAltitudekey_1(t *testing.T) { + type argSet struct { + inputIndex int64 + inputZoom int64 + outputZoom int64 + zBaseExponent int64 + zBaseOffset int64 } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) + testCases := []struct { + args argSet + expectedMin int64 + expectedMax int64 + }{ + { + argSet{ + 100, + 25, + 27, + 25, + 0, + }, + 400, + 403, + }, + { + argSet{ + 100, + 25, + 24, + 25, + 0, + }, + 50, + 50, + }, + { + argSet{ + 100, + 25, + 25, + 25, + 0, + }, + 100, + 100, + }, + { + argSet{ + 100, + 25, + 25, + 25, + -47, + }, + 53, + 53, + }, + { + argSet{ + 28, + 25, + 14, + 25, + 2048000, + }, + 1000, + 1000, + }, + { + argSet{ + 100, + 25, + 24, + 24, + 0, + }, + 100, + 100, + }, + { + argSet{ + 100, + 25, + 27, + 24, + 0, + }, + 800, + 807, + }, } -} -func TestConvertZToAltitudekey_4(t *testing.T) { - expected := []int64{53} - - result, error := ConvertZToAltitudekey( - 100, - 25, - 25, - 25, - -47, - ) - if error != nil { - t.Fatal(error) - } + for _, testCase := range testCases { + resultMin, resultMax, err := ConvertZToMinMaxAltitudekey( + testCase.args.inputIndex, + testCase.args.inputZoom, + testCase.args.outputZoom, + testCase.args.zBaseExponent, + testCase.args.zBaseOffset, + ) + if err != nil { + t.Fatal(err) + } - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) + if resultMin != testCase.expectedMin || resultMax != testCase.expectedMax { + t.Errorf("expected=[%v, %v], result=[%v, %v], input=%+v", testCase.expectedMin, testCase.expectedMax, resultMin, resultMax, testCase.args) + } } } -func TestConvertZToAltitudekey_5(t *testing.T) { +func TestConvertZToMinMaxAltitudekey_2(t *testing.T) { expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - result, error := ConvertZToAltitudekey( + result, _, error := ConvertZToMinMaxAltitudekey( 100, 25, 21, @@ -1474,10 +1508,10 @@ func TestConvertZToAltitudekey_5(t *testing.T) { } } -func TestConvertZToAltitudekey_6(t *testing.T) { +func TestConvertZToMinMaxAltitudekey_3(t *testing.T) { expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") - result, error := ConvertZToAltitudekey( + result, _, error := ConvertZToMinMaxAltitudekey( 100, 25, 25, @@ -1489,63 +1523,6 @@ func TestConvertZToAltitudekey_6(t *testing.T) { } } -func TestConvertZToAltitudekey_7(t *testing.T) { - expected := []int64{1000} - - result, error := ConvertZToAltitudekey( - 28, - 25, - 14, - 25, - 2048000, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_8(t *testing.T) { - expected := []int64{100} - - result, error := ConvertZToAltitudekey( - 100, - 25, - 24, - 24, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - -func TestConvertZToAltitudekey_9(t *testing.T) { - expected := []int64{800, 801, 802, 803, 804, 805, 806, 807} - - result, error := ConvertZToAltitudekey( - 100, - 25, - 27, - 24, - 0, - ) - if error != nil { - t.Fatal(error) - } - - if !reflect.DeepEqual(result, expected) { - t.Fatal(result) - } -} - func TestConvertZToMinAltitudekey_1(t *testing.T) { expected := int64(47) From b78f77a6777a6e6c00669e8ce51f7c9ea799c4cd Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Thu, 22 Aug 2024 19:57:14 +0900 Subject: [PATCH 22/25] updated dependencies - updated go version at build - upgraded external library --- examples/checkZoom/go.mod | 6 +++-- examples/checkZoom/go.sum | 11 +++++---- go.mod | 12 ++++++---- go.sum | 50 +++++++++------------------------------ 4 files changed, 28 insertions(+), 51 deletions(-) diff --git a/examples/checkZoom/go.mod b/examples/checkZoom/go.mod index a53b37e..d9d5fd2 100644 --- a/examples/checkZoom/go.mod +++ b/examples/checkZoom/go.mod @@ -1,10 +1,12 @@ module checkZoom -go 1.20 +go 1.22 + +toolchain go1.22.6 require github.com/trajectoryjp/spatial_id_go/v4 v4.0.0 require ( github.com/wroge/wgs84 v1.1.7 // indirect - gonum.org/v1/gonum v0.13.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect ) diff --git a/examples/checkZoom/go.sum b/examples/checkZoom/go.sum index 6d2c600..f495db7 100644 --- a/examples/checkZoom/go.sum +++ b/examples/checkZoom/go.sum @@ -1,7 +1,8 @@ -github.com/trajectoryjp/spatial_id_go/v2 v2.0.0 h1:AZkQkIrsOV6IYFPheoDkTiRYSdoARCw0HQe5cfhWci8= -github.com/trajectoryjp/spatial_id_go/v2 v2.0.0/go.mod h1:XEDPqIuIatdNOE08aoZ+jQKf3YPMS57WA2pbrD/3GTE= +github.com/trajectoryjp/spatial_id_go/v4 v4.0.0 h1:EV8B81DORXjQtLO59xYZw+ML6c+23PfhZd1e4DZdUdo= +github.com/trajectoryjp/spatial_id_go/v4 v4.0.0/go.mod h1:Q5epEMx4BXEvPwe/8Ffc6RsHI6IPZYAPJVwgZhZi66k= github.com/wroge/wgs84 v1.1.7 h1:8WVUUrpjysYxrn0ssWX7z90SOUKCuHt9NQ5tg9ovjIY= github.com/wroge/wgs84 v1.1.7/go.mod h1:mc1F8ubW03DO4zaf/006cmhaiMlfvbKmqVAcPuAtsNA= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= -gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= diff --git a/go.mod b/go.mod index 5782efa..14ee2fa 100644 --- a/go.mod +++ b/go.mod @@ -1,22 +1,24 @@ module github.com/trajectoryjp/spatial_id_go/v4 -go 1.19 +go 1.22 + +toolchain go1.22.6 require ( github.com/go-gl/mathgl v1.1.0 - github.com/trajectoryjp/geodesy_go v1.0.1 + github.com/trajectoryjp/geodesy_go v1.0.2 github.com/wroge/wgs84 v1.1.7 - gonum.org/v1/gonum v0.13.0 + gonum.org/v1/gonum v0.15.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.7.0 // indirect + golang.org/x/image v0.19.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( github.com/stretchr/testify v1.9.0 - github.com/trajectoryjp/closest_go v1.0.1 + github.com/trajectoryjp/closest_go v1.0.2 ) diff --git a/go.sum b/go.sum index 64468ef..b48bf0a 100644 --- a/go.sum +++ b/go.sum @@ -6,50 +6,22 @@ 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/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/trajectoryjp/closest_go v1.0.1 h1:dvshtZzPDwhGDhzn5SVZxlgNnqr/gLp4uIpGDIEOHaU= -github.com/trajectoryjp/closest_go v1.0.1/go.mod h1:+iTxW7/pOi0dIqo2/GcqGqWh/fAj2gMjDIiZ+BFDXIc= -github.com/trajectoryjp/geodesy_go v1.0.1 h1:FvvnA3kPcPoXOjn6cS27R9aiCLyszOarFuZRVlQRG2s= -github.com/trajectoryjp/geodesy_go v1.0.1/go.mod h1:eJuX+ds+t3MKxHG9dhobqNjUbUsYlpTT9XDO0mbc0LU= +github.com/trajectoryjp/closest_go v1.0.2 h1:dWm5u43/xsP7IKMzrUO+NEbXnS4GBIPXj7onHWG3imQ= +github.com/trajectoryjp/closest_go v1.0.2/go.mod h1:+iTxW7/pOi0dIqo2/GcqGqWh/fAj2gMjDIiZ+BFDXIc= +github.com/trajectoryjp/geodesy_go v1.0.2 h1:wh0RcZDZOQ6Q38evg6YJJ8gAC6+GKSVJgEFI4yusKZE= +github.com/trajectoryjp/geodesy_go v1.0.2/go.mod h1:eJuX+ds+t3MKxHG9dhobqNjUbUsYlpTT9XDO0mbc0LU= github.com/wroge/wgs84 v1.1.7 h1:8WVUUrpjysYxrn0ssWX7z90SOUKCuHt9NQ5tg9ovjIY= github.com/wroge/wgs84 v1.1.7/go.mod h1:mc1F8ubW03DO4zaf/006cmhaiMlfvbKmqVAcPuAtsNA= github.com/xieyuschen/deepcopy v1.0.1 h1:nTCnKprCOdibz8WXWlMZzULIlpzZX0ZzKjz8HlGd/Nk= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= +github.com/xieyuschen/deepcopy v1.0.1/go.mod h1:smzaXhQZuuehOzevwMMLzvM7gBslB4VPdgJbwdyIDSA= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= -golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/image v0.19.0 h1:D9FX4QWkLfkeqaC62SonffIIuYdOk/UE2XKUBgRIBIQ= +golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys= 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/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= -gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= 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.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From da2aacbbf52b079200c28a749c23ba53e447a406 Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Thu, 22 Aug 2024 20:08:28 +0900 Subject: [PATCH 23/25] updated workflow's go version --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8ca42df..e7fed68 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: '1.19' + go-version: '1.22' - name: Build run: go build -v ./... From 270570e9c7207d54aa88a3b73d445d944b42925d Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Fri, 23 Aug 2024 13:23:10 +0900 Subject: [PATCH 24/25] reverted to not using test table at `TestConvertZToMinMaxAltitudekey` tests --- .../convert_quadkey_and_Vertical_id_test.go | 172 +++++++++--------- 1 file changed, 89 insertions(+), 83 deletions(-) diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index d0a2479..5601212 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -1383,117 +1383,84 @@ func TestSpatialIDCheckZoom(t *testing.T) { } -func TestConvertZToMinMaxAltitudekey_1(t *testing.T) { - type argSet struct { +type argSetForConvertZToMinMaxAltitudekey struct { inputIndex int64 inputZoom int64 outputZoom int64 zBaseExponent int64 zBaseOffset int64 } - testCases := []struct { - args argSet - expectedMin int64 - expectedMax int64 - }{ - { - argSet{ + +func assertConvertZToMinMaxAltitudekey(t *testing.T, expectedMin int64, expectedMax int64, testInput argSetForConvertZToMinMaxAltitudekey) { + resultMin, resultMax, err := ConvertZToMinMaxAltitudekey( + testInput.inputIndex, + testInput.inputZoom, + testInput.outputZoom, + testInput.zBaseExponent, + testInput.zBaseOffset, + ) + if err != nil { + t.Fatal(err) + } + + if resultMin != expectedMin || resultMax != expectedMax { + t.Errorf("expected=[%v, %v], result=[%v, %v], input=%+v", expectedMin, expectedMax, resultMin, resultMax, testInput) + } +} + +func TestConvertZToMinMaxAltitudekey_1(t *testing.T) { + var expectedMin int64 = 400 + var expectedMax int64 = 403 + args := argSetForConvertZToMinMaxAltitudekey{ 100, 25, 27, 25, 0, - }, - 400, - 403, - }, - { - argSet{ + } + assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) +} + +func TestConvertZToMinMaxAltitudekey_2(t *testing.T) { + var expectedMin int64 = 50 + expectedMax := expectedMin + args := argSetForConvertZToMinMaxAltitudekey{ 100, 25, 24, 25, 0, - }, - 50, - 50, - }, - { - argSet{ + } + assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) +} + +func TestConvertZToMinMaxAltitudekey_3(t *testing.T) { + var expectedMin int64 = 100 + expectedMax := expectedMin + args := argSetForConvertZToMinMaxAltitudekey{ 100, 25, 25, 25, 0, - }, - 100, - 100, - }, - { - argSet{ + } + assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) +} + +func TestConvertZToMinMaxAltitudekey_4(t *testing.T) { + var expectedMin int64 = 53 + expectedMax := expectedMin + args := argSetForConvertZToMinMaxAltitudekey{ 100, 25, 25, 25, -47, - }, - 53, - 53, - }, - { - argSet{ - 28, - 25, - 14, - 25, - 2048000, - }, - 1000, - 1000, - }, - { - argSet{ - 100, - 25, - 24, - 24, - 0, - }, - 100, - 100, - }, - { - argSet{ - 100, - 25, - 27, - 24, - 0, - }, - 800, - 807, - }, - } - - for _, testCase := range testCases { - resultMin, resultMax, err := ConvertZToMinMaxAltitudekey( - testCase.args.inputIndex, - testCase.args.inputZoom, - testCase.args.outputZoom, - testCase.args.zBaseExponent, - testCase.args.zBaseOffset, - ) - if err != nil { - t.Fatal(err) - } - - if resultMin != testCase.expectedMin || resultMax != testCase.expectedMax { - t.Errorf("expected=[%v, %v], result=[%v, %v], input=%+v", testCase.expectedMin, testCase.expectedMax, resultMin, resultMax, testCase.args) - } } + assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) } -func TestConvertZToMinMaxAltitudekey_2(t *testing.T) { +func TestConvertZToMinMaxAltitudekey_5(t *testing.T) { expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") result, _, error := ConvertZToMinMaxAltitudekey( @@ -1508,7 +1475,7 @@ func TestConvertZToMinMaxAltitudekey_2(t *testing.T) { } } -func TestConvertZToMinMaxAltitudekey_3(t *testing.T) { +func TestConvertZToMinMaxAltitudekey_6(t *testing.T) { expectedError := errors.NewSpatialIdError(errors.InputValueErrorCode, "output index does not exist with given outputZoom, zBaseExponent, and zBaseOffset") result, _, error := ConvertZToMinMaxAltitudekey( @@ -1523,6 +1490,45 @@ func TestConvertZToMinMaxAltitudekey_3(t *testing.T) { } } +func TestConvertZToMinMaxAltitudekey_7(t *testing.T) { + var expectedMin int64 = 1000 + expectedMax := expectedMin + args := argSetForConvertZToMinMaxAltitudekey{ + 28, + 25, + 14, + 25, + 2048000, + } + assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) +} + +func TestConvertZToMinMaxAltitudekey_8(t *testing.T) { + var expectedMin int64 = 100 + expectedMax := expectedMin + args := argSetForConvertZToMinMaxAltitudekey{ + 100, + 25, + 24, + 24, + 0, + } + assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) +} + +func TestConvertZToMinMaxAltitudekey_9(t *testing.T) { + var expectedMin int64 = 800 + var expectedMax int64 = 807 + args := argSetForConvertZToMinMaxAltitudekey{ + 100, + 25, + 27, + 24, + 0, + } + assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) +} + func TestConvertZToMinAltitudekey_1(t *testing.T) { expected := int64(47) From ebe0d0ef9fe47fe323d9bd0c926f1e6cb0385d2c Mon Sep 17 00:00:00 2001 From: Mandai Yusuke Date: Fri, 23 Aug 2024 13:27:16 +0900 Subject: [PATCH 25/25] refactored convertZToMinAltitudeKey - functions is renamed from `convertZToMinAltitudeKey` to `convertZToMinAltitudekey` - changed tests not to use test tables --- documentation/convesion.md | 4 +- transform/convert_quadkey_and_Vertical_id.go | 6 +- .../convert_quadkey_and_Vertical_id_test.go | 205 +++++++++--------- 3 files changed, 102 insertions(+), 113 deletions(-) diff --git a/documentation/convesion.md b/documentation/convesion.md index d35dc2f..96cbb1c 100644 --- a/documentation/convesion.md +++ b/documentation/convesion.md @@ -17,7 +17,7 @@ TileXYZ/空間ID/拡張空間ID相互変換における変換関数の対応関 | 変換元 | 変換先 | 対応関数 | |--------------|--------------|---------------------------------| | 一次元インデックス | 一次元変換先インデックス | `ConvertZToMinMaxAltitudekey()` | -| 一次元変換先インデックス | 一次元インデックス | `ConvertAltitudeKeyToMinMaxZ()` | +| 一次元変換先インデックス | 一次元インデックス | `ConvertAltitudekeyToMinMaxZ()` | 廃止/非推奨予定の関数: @@ -146,7 +146,7 @@ request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, extendedSpat TileXYZ空間のボクセルを拡張空間IDに変換する 変換時、`TileXYZ.x`,`TileXYZ.y`は元の値が利用されるのみである -しかし`TileXYZ.z`は一次元逆変換(`ConvertAltitudeKeyToMinMaxZ()`)によって元の値に近い垂直方向拡張空間インデックスに変換される +しかし`TileXYZ.z`は一次元逆変換(`ConvertAltitudekeyToMinMaxZ()`)によって元の値に近い垂直方向拡張空間インデックスに変換される これは`TileXYZ.z`と拡張空間ID垂直インデックスの間ではボクセルのインデックス付番や0番の位置の基準を変更されているためである diff --git a/transform/convert_quadkey_and_Vertical_id.go b/transform/convert_quadkey_and_Vertical_id.go index bb6e1ae..b6a0de8 100644 --- a/transform/convert_quadkey_and_Vertical_id.go +++ b/transform/convert_quadkey_and_Vertical_id.go @@ -621,7 +621,7 @@ func ConvertTileXYZsToExtendedSpatialIDs(request []*object.TileXYZ, zBaseExponen return nil, errors.NewSpatialIdError(errors.InputValueErrorCode, fmt.Sprintf("extendSpatialID zoom level must be in 0-35: hZoom=%v, vZoom=%v", r.HZoom(), outputVZoom)) } - zMin, zMax, err := ConvertAltitudeKeyToMinMaxZ(r.Z(), r.VZoom(), outputVZoom, zBaseExponent, zBaseOffset) + zMin, zMax, err := ConvertAltitudekeyToMinMaxZ(r.Z(), r.VZoom(), outputVZoom, zBaseExponent, zBaseOffset) if err != nil { return nil, err } @@ -694,7 +694,7 @@ func ConvertTileXYZsToSpatialIDs(request []*object.TileXYZ, zBaseExponent int64, return outputData, nil } -// ConvertAltitudeKeyToMinMaxZ altitudekeyを(拡張)空間IDのz成分に高度変換する。 +// ConvertAltitudekeyToMinMaxZ altitudekeyを(拡張)空間IDのz成分に高度変換する。 // // 変換前と変換後の精度差によって出力されるaltitudekeyの個数は増減する。 // @@ -721,7 +721,7 @@ func ConvertTileXYZsToSpatialIDs(request []*object.TileXYZ, zBaseExponent int64, // 以下の条件に当てはまる場合、エラーインスタンスが返却される。 // 入力インデックス不正 :inputIndexにそのズームレベル(inputZoom)で存在しないインデックス値が入力されていた場合。 // 出力インデックス不正 :出力altitudekeyが出力ズームレベル(outputZoom)で存在しないインデックス値になった場合。 -func ConvertAltitudeKeyToMinMaxZ(altitudekey int64, altitudekeyZoomLevel int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) (int64, int64, error) { +func ConvertAltitudekeyToMinMaxZ(altitudekey int64, altitudekeyZoomLevel int64, outputZoom int64, zBaseExponent int64, zBaseOffset int64) (int64, int64, error) { // 1. check that the input index exists in the input system inputResolution := common.CalculateArithmeticShift(1, altitudekeyZoomLevel) diff --git a/transform/convert_quadkey_and_Vertical_id_test.go b/transform/convert_quadkey_and_Vertical_id_test.go index 5601212..16a0875 100755 --- a/transform/convert_quadkey_and_Vertical_id_test.go +++ b/transform/convert_quadkey_and_Vertical_id_test.go @@ -411,7 +411,7 @@ func TestConvertTileXYZsToSpatialIDs(t *testing.T) { request argSet }{ { - // hZoom/z/x/y + // z/f/x/y []string{"23/-2/85263/65423"}, argSet{ []*object.TileXYZ{newTileXYZ( @@ -1384,12 +1384,12 @@ func TestSpatialIDCheckZoom(t *testing.T) { } type argSetForConvertZToMinMaxAltitudekey struct { - inputIndex int64 - inputZoom int64 - outputZoom int64 - zBaseExponent int64 - zBaseOffset int64 - } + inputIndex int64 + inputZoom int64 + outputZoom int64 + zBaseExponent int64 + zBaseOffset int64 +} func assertConvertZToMinMaxAltitudekey(t *testing.T, expectedMin int64, expectedMax int64, testInput argSetForConvertZToMinMaxAltitudekey) { resultMin, resultMax, err := ConvertZToMinMaxAltitudekey( @@ -1412,11 +1412,11 @@ func TestConvertZToMinMaxAltitudekey_1(t *testing.T) { var expectedMin int64 = 400 var expectedMax int64 = 403 args := argSetForConvertZToMinMaxAltitudekey{ - 100, - 25, - 27, - 25, - 0, + 100, + 25, + 27, + 25, + 0, } assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) } @@ -1425,11 +1425,11 @@ func TestConvertZToMinMaxAltitudekey_2(t *testing.T) { var expectedMin int64 = 50 expectedMax := expectedMin args := argSetForConvertZToMinMaxAltitudekey{ - 100, - 25, - 24, - 25, - 0, + 100, + 25, + 24, + 25, + 0, } assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) } @@ -1438,11 +1438,11 @@ func TestConvertZToMinMaxAltitudekey_3(t *testing.T) { var expectedMin int64 = 100 expectedMax := expectedMin args := argSetForConvertZToMinMaxAltitudekey{ - 100, - 25, - 25, - 25, - 0, + 100, + 25, + 25, + 25, + 0, } assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) } @@ -1451,11 +1451,11 @@ func TestConvertZToMinMaxAltitudekey_4(t *testing.T) { var expectedMin int64 = 53 expectedMax := expectedMin args := argSetForConvertZToMinMaxAltitudekey{ - 100, - 25, - 25, - 25, - -47, + 100, + 25, + 25, + 25, + -47, } assertConvertZToMinMaxAltitudekey(t, expectedMin, expectedMax, args) } @@ -1726,87 +1726,76 @@ func TestConvertZToMinAltitudekey_11(t *testing.T) { } } -func TestConvertAltitudeKeyToMinMaxZ(t *testing.T) { - type args struct { - altitudekey int64 - altitudekeyZoomLevel int64 - outputZoomLevel int64 - zBaseExponent int64 - zBaseOffset int64 - } - tests := []struct { - name string - args args - minZ int64 - maxZ int64 - wantErr bool - }{ - { - name: "altitudekey must be offset converted", - args: args{ - altitudekey: 0, - altitudekeyZoomLevel: 23, - outputZoomLevel: 23, - zBaseExponent: 23, - zBaseOffset: 8, - }, - minZ: -2, - maxZ: -2, - wantErr: false, - }, - { - name: "altitudekey must be zoom level converted", - args: args{ - altitudekey: 0, - altitudekeyZoomLevel: 23, - outputZoomLevel: 22, - zBaseExponent: 25, - zBaseOffset: -2, - }, - minZ: 0, - maxZ: 0, - wantErr: false, - }, - { - name: "minZ and maxZ must be different when zBaseOffset is not power of 2", - args: args{ - altitudekey: 0, - altitudekeyZoomLevel: 23, - outputZoomLevel: 23, - zBaseExponent: 25, - zBaseOffset: 7, - }, - minZ: -2, - maxZ: -1, - wantErr: false, - }, - { - name: "minZ and maxZ must be different when outputZoom or altitudekeyZoomLevel is greater than zBaseExponent", - args: args{ - altitudekey: 3, - altitudekeyZoomLevel: 26, - outputZoomLevel: 26, - zBaseExponent: 25, - zBaseOffset: -2, - }, - minZ: 6, - maxZ: 7, - wantErr: false, - }, +type argsForConvertAltitudekeyToMinMaxZ struct { + altitudekey int64 + altitudekeyZoomLevel int64 + outputZoomLevel int64 + zBaseExponent int64 + zBaseOffset int64 +} + +func TestConvertAltitudekeyToMinMaxZ_OffseMustBeConverted(t *testing.T) { + var expectedMin int64 = -2 + expectedMax := expectedMin + args := argsForConvertAltitudekeyToMinMaxZ{ + altitudekey: 0, + altitudekeyZoomLevel: 23, + outputZoomLevel: 23, + zBaseExponent: 23, + zBaseOffset: 8, + } + assertConvertAltitudekeyToMinMaxZ(t, args, expectedMin, expectedMax, false) +} + +func TestConvertAltitudekeyToMinMaxZ_ZoomLevelMustBeConverted(t *testing.T) { + var expectedMin int64 = 0 + expectedMax := expectedMin + args := argsForConvertAltitudekeyToMinMaxZ{ + altitudekey: 0, + altitudekeyZoomLevel: 23, + outputZoomLevel: 22, + zBaseExponent: 25, + zBaseOffset: -2, + } + assertConvertAltitudekeyToMinMaxZ(t, args, expectedMin, expectedMax, false) +} + +func TestConvertAltitudekeyToMinMaxZ_MinMaxDiffersWhenZBaseOffsetIsNotPowerOf2(t *testing.T) { + var expectedMin int64 = -2 + var expectedMax int64 = -1 + args := argsForConvertAltitudekeyToMinMaxZ{ + altitudekey: 0, + altitudekeyZoomLevel: 23, + outputZoomLevel: 23, + zBaseExponent: 25, + zBaseOffset: 7, + } + assertConvertAltitudekeyToMinMaxZ(t, args, expectedMin, expectedMax, false) +} + +func TestConvertAltitudekeyToMinMaxZ_MinMaxDiffersWhenZBaseExponentLessThanInputZoomLevelOrOutputZoomLevel(t *testing.T) { + var expectedMin int64 = 6 + var expectedMax int64 = 7 + args := argsForConvertAltitudekeyToMinMaxZ{ + altitudekey: 3, + altitudekeyZoomLevel: 26, + outputZoomLevel: 26, + zBaseExponent: 25, + zBaseOffset: -2, + } + assertConvertAltitudekeyToMinMaxZ(t, args, expectedMin, expectedMax, false) +} + +func assertConvertAltitudekeyToMinMaxZ(t *testing.T, args argsForConvertAltitudekeyToMinMaxZ, expectedMin int64, expectedMax int64, wantError bool) { + gotMinZ, gotMaxZ, err := ConvertAltitudekeyToMinMaxZ(args.altitudekey, args.altitudekeyZoomLevel, args.outputZoomLevel, args.zBaseExponent, args.zBaseOffset) + if (err != nil) != wantError { + t.Errorf("ConvertAltitudekeyToMinMaxZ() error = %v, wantErr %v", err, wantError) + return } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - gotMinZ, gotMaxZ, err := ConvertAltitudeKeyToMinMaxZ(tt.args.altitudekey, tt.args.altitudekeyZoomLevel, tt.args.outputZoomLevel, tt.args.zBaseExponent, tt.args.zBaseOffset) - if (err != nil) != tt.wantErr { - t.Errorf("ConvertAltitudeKeyToMinMaxZ() error = %v, wantErr %v", err, tt.wantErr) - return - } - if gotMinZ != tt.minZ { - t.Errorf("ConvertAltitudeKeyToMinMaxZ() gotMinZ = %v, minZ %v", gotMinZ, tt.minZ) - } - if gotMaxZ != tt.maxZ { - t.Errorf("ConvertAltitudeKeyToMinMaxZ() gotMaxZ = %v, maxZ %v", gotMaxZ, tt.maxZ) - } - }) + if gotMinZ != expectedMin { + t.Errorf("ConvertAltitudekeyToMinMaxZ() gotMinZ = %v, minZ %v", gotMinZ, expectedMin) + } + if gotMaxZ != expectedMax { + t.Errorf("ConvertAltitudekeyToMinMaxZ() gotMaxZ = %v, maxZ %v", gotMaxZ, expectedMax) } }

wYnf# zTMsGAn@GYX^dyl@krl3FJuNG^{#f2=x~1;ta=k)YBfw+V&Z$M}QRbz_ExQLgJUkl) zb_B?4@%t0|A!0*F&<(v{_=dp~_p3a%?j072ROHxYG|820voiri`@)?nhKJC9G4Cy3 zF{slX)58Vqq&z{nrSLr4=xj?NK3?+3(1-Gc{n~mP^1-|ek*}E2N~aZb)}Yjhctwgw zV8D-2A?L&1uO`l`f|<*##dguvdh$N!u9fq=EkL6YaZ29@6jEvwCgCn{kv}1IZYnGcR{|s z8|86Ndg-0*Ko!wnfpj*vcrz}Nfw);&#B@59VB)! z9!b+74gL576G{&5YUj>Oh*FVf`SYJ1E^`%NGrzx7R*4e5)SlS-GBOXYiw2 z9*s4RZ`&N|ukc#31uqR46xClPpD|CvHFv;ey*D4t;)QfqMWbG{ic^-JoU-e_ho}M^zSMc=isQiP zxL%%le>=+NDCQQ)m_@LJ(fMsV@WoAxvx3qmE7?Dk$22}_1zUT4QtQoPN^X( zcZIR$%K>6{8fgWN56Z~cn@iY)sN7qSruiTcj2!Jlyhd!pfT#2jW97FnD zPS=615Q4nObHi^^!WNZP|1P%m;E2}@)ve6K7E4DjbQ)KN^}o40vWB|!GMo9fS*~SI zx53h*rjAooTPB>&yi{WeJUy1!Lx9gaL&={tU6&mHzj8%vP zn-cBE7dO3?x<{1F`dkv^oEVY=&eIQH`g0sGl>hqwXAqNV#$j)N>kKn}Cde$i$uTd*(#+Fp69?Gu~y*8F~x3GOYR z%rMpkI5uPfhwY3<(jh&4O1*1aurpe5!yHM8Z8vv?ltJ#=KtgQn<>MQ~ z{vX~yb~^^@VY+zV>YopuAx(#}{klK<&S4h>7W{I}PdtU}!HoKVRZ0S;^doZ`xDBZL zAX6Fv?n3CoSaT`q4TSzw{nq{;be>KBvuye5Q;^Vl1WPrmtYbJjvkhGHW^&g8`a{nvAOPpjUay#M@=R*bm!|lF4 zNF|i0)5=L~UURmI3-YiNPV~goarhzR<<8D*F(xip}h7kLl@;+b^e7Q_K;R0gDuoLGx{fmD-7_M@&-EBiLw!3Ap>YZiW-^fa(!t6!SKh{3)bu z8Q@Eq37{C#tFr;2@c3{iu)8cES!Mv(fWQmI@&`p+7AK=A*6rMdM!+KMM9N!i#>?>4yPcE(i)&XPkMH^p#kAD1Jb9C zZ_9>6TR7+;L?AKY?t`Z*k>+(5s(tm=U>0dQa!N{_5M@R%rZXBuhz?_qNHOrsdZx|- zrX>UTNd4{oI%?8HugZ~f5#WOrmf$qBOaH}WJwa?66{FG)2KfaN0J}6ZZHH>Fv!rNb zW6sGlS=SHDR9)x*HAA&7cxw^BC#w%Q!2LXoNIDiegz)F_lMD0_WrAZ}6C~v}1B9hW z2oW2gvwXLph#-oBq)PHiRB@h=*y^-ICS>@(ih3e`b~+w-jh}qS5k)kJAM@X;nLHUK zUPH9j=!@PlM}~pP&-Xye&fYkU`kSo*uv!nP4m@oYwEv7$&oK`_d}{9~zzLP+ko3Uk zReJW_KTKmoBMVLXR39<}8-@?6tQ^JyY+hp{&eWyt`D_c(72C(w(!Oq>n!j2Cb*%;{ zzM7JhFAc7NDE@3O(!p=F@5vg7I7DB@fh+pu71GW7G_2!j&@>5Dhpy@m1?A&qkDzq@ zX&+SW%KNZC=_=Kcv-Vs-rDyxNjlnaNL%VyefBoct7VVEj-tT|6m3yjyFH{PKlR8d@ zDE@d*EeJ$bdmv5U7lmu{DUSe3)5IWS1zqe|%0OAA8FT`LzP7aod3A0eyJH*R>-cEjWvb)N!$}bnhk57HvcPu<26>0zL4B$^gT&Rxe`sZNJu)9ZHUSBS(-0znL zMOyc}q+@l`w9~KOp4g?2w4O_U<1#neUulZ0n;Jac6OlP-;IYIF;k|Kp@--Z zaAqECB^J;I7uJIX{hOpc(H3`+71U&?^x`KS>Kq}IKn9U}C zJn<}(?a3c>k4(<#tSy3Ofy2JkvRshN42&jc;c{n~8L)hX zXA{%fXC`jrida8MV2RambzBqe{?q!EDfQe_kVH8D$S;*%kf0 z623OS)OthQFmZdxlfKAQkfMBhn7CPaegFrU_0Y$01`p=eM#Hj~M?F9RyStr|-UiAj z7#FTFw(mF@WmD(@7{xGB5&rVV#aqW6?5;nk4(FynJ1BgyOu{V)6*$lrR|-_coXdxd zI|q4-CsGQvBF4UyP@bW57W>k-m4&E=Fx!}@oH$%5SJ}#g6?k*6h_p*UFaORL@iJt} z4F)(@E{nN0iY$g9I2N>YG1FhwS&ciwp`3H9_mN{hydrbQb4N5e*E6={P5>RRPf{`V zZ1}{R@`)-C{VDsHG<~`&`%-;Ik4b^%({5 z0r$Dk66&q`(R6gvz6gSGa!b1eNG|`!P2J1^mV}a00frN2sJ+}6`X*Kx_A<0Tye|-* zRvnfwau(t*hBqudc$=Cd#uUSsuSp}SksKFz5}v^h)MGIkXk}`#zb*`#+{1A6Ii6aFGbDEFN^t3$M4X@rYOXR>4rM6?PCm6kZHn5{*Cpbn9& za7+%Ut$)7zc5C9{tS~I9E3wO{Ih}? zvT_7uuLQe7OB*3>{>NTRN`-lMC{Khe{!$0d9O@@)d>e@L`94a|wS}}x<1CNQ7D6?kzRan~b%ck_ z5y&_H@XCkiD}Cb3(Wnf)4_o#+MomIi-#ml4^WUmaCfL2MPE3VNR9pa`4UxpahPwhB zS?H3nt`H7RZ*|TE_m9sccCcU=(Jb2sn6kq&_h@y# zjKey}yDowrqup4sR44zuYrin4f-(%Grt(a#urLW)Q2R9ZywmE)n&`|5gmTjOEm)GDIf^dVtX2+YfCWU|1ZM$=*WZpc&(6pc7CBt6Eo1)+^$&!e|#?aR8 zf|LDVR4I5^#bSXSZnF*10{)j}SZ|UT5$ApeA0X=W{V?gk>ylcudBV$`)g_FQhLTsj z&BmMJgArla-D?9xOcar0{+;PBGlmb5j+1Rn=x*4i48vAzYdOJuh6itGO1hFa9AVZi zNP%t?A_((4n(h<>fv%uuV&r21OX?ubUM@1#WYDzt9O}z-zwBIP@%^%ZG;F)|rN{Us z$d=mI^!vF(y>(O{)`=n_{}tfxHRD8LaC;6JUWP@eUeJ9R#GM_w0+lp~-fgZsh;V%^ z5qbS0=rmNH&xMA39)voa0a{$Z;YHhwtmbQHhjd~|kO+_WG|f)sz;v2P+7 zD-z^1smW0E&>U)cim3lwB5B63EVuf9SCKNT=0|+0>3^T{}r(#;Q^;HNLYg{!``(G!0T9^26 zJLku(iH9#Q zpZA-&s^iS`heDLZ!%JEC<%X_KyQ!M~NxOw!&GWipDed&K*-tj~2oOj*a^&!#XXBHU%3 z83JB+s*4Eq-Jw&9q?GA$foVXvaSI@R(%XIxClY zWQ1P*RBC3)*|kv2uLv2bdoh|w6h8!37VkXu{YHA$FtO#%V=~|W@}Cc76g!gËy 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 literal 0 HcmV?d00001 diff --git a/documentation/image/tilekey-standard-SpatialID.png b/documentation/image/tilekey-standard-SpatialID.png new file mode 100644 index 0000000000000000000000000000000000000000..35784b2e64e9a9752eae249ec0c7698ad00db951 GIT binary patch literal 177280 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