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<