Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversion from TileXYZ into extendedSpatialID and SpatialID #29

Merged
merged 25 commits into from
Aug 23, 2024
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d39f4bb
feature_4481
Jul 11, 2024
e5825d3
changed calculation of ConvertQuadkeysAndAltitudekeysToExtendedSpatia…
mi-24v Jul 26, 2024
ff8a838
fixed lack of vertical index when zBaseOffset is not power of 2
mi-24v Jul 29, 2024
74b6a07
added examples to ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs …
mi-24v Jul 30, 2024
8e5b8f1
added documentation of ConvertQuadkeysAndAltitudekeysToExtendedSpatia…
mi-24v Jul 31, 2024
c4053a2
make public altitude conversion
mi-24v Aug 2, 2024
08c980c
added docs about current converting functions
mi-24v Aug 8, 2024
a064f23
changed `ConvertQuadkeysAndAltitudekeysToExtendedSpatialIDs()` into `…
mi-24v Aug 12, 2024
98478fb
reduce outputHZoom parameter in `ConvertTileXYZToExtendedSpatialIDs()`
mi-24v Aug 16, 2024
787a10a
added excluding duplication outputIDs in `ConvertTileXYZToExtendedSpa…
mi-24v Aug 16, 2024
74ebcc5
added conversion from extendedSpatialId into SpatialId
mi-24v Aug 16, 2024
e9aefb5
added conversion from TileXYZ into SpatialId
mi-24v Aug 19, 2024
c140e99
updated documentation of conversion functions
mi-24v Aug 19, 2024
ebbb029
refactored function name and parameters
mi-24v Aug 20, 2024
dcbf46a
updated documentation for TileXYZ->SpatialID conversion
mi-24v Aug 20, 2024
1aec8a9
refactored conversion function
mi-24v Aug 21, 2024
2163f75
reduced type casting of `objects.TileXYZ`
mi-24v Aug 21, 2024
17c6c8d
moved example of converting TileXYZ to SpatialID
mi-24v Aug 21, 2024
7830aa2
updated documentation of conversion function
mi-24v Aug 22, 2024
662019c
refactored conversion from altitudeKey to Z-index
mi-24v Aug 22, 2024
9dbe76d
refactored conversion from Z-index to altitudeKey
mi-24v Aug 22, 2024
b78f77a
updated dependencies
mi-24v Aug 22, 2024
da2aacb
updated workflow's go version
mi-24v Aug 22, 2024
270570e
reverted to not using test table at `TestConvertZToMinMaxAltitudekey`…
mi-24v Aug 23, 2024
ebe0d0e
refactored convertZToMinAltitudeKey
mi-24v Aug 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 ./...
Expand Down
1 change: 1 addition & 0 deletions common/consts/consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 浮動小数点誤差

Expand Down
22 changes: 11 additions & 11 deletions common/object/id_object.go
Original file line number Diff line number Diff line change
Expand Up @@ -516,14 +516,14 @@ func (qh QuadkeyAndVerticalID) MinHeight() float64 {

// TileXYZ 水平方向TileKey(x,y)と垂直方向TileKey(z)の組み合わせを管理する構造体
type TileXYZ struct {
// 水平精度 0-(consts.MaxTileXYZZoom)の非負整数
hZoom uint16
// 水平精度 [0, consts.MaxTileXYZZoom]の整数
hZoom int64
// x 水平方向key x軸
x int64
// y 水平方向key y軸
y int64
// 垂直精度 0-(consts.MaxTileXYZZoom)の非負整数
vZoom uint16
// 垂直精度 [0, consts.MaxTileXYZZoom]の整数
vZoom int64
// 垂直方向key
z int64
}
Expand All @@ -547,8 +547,8 @@ type TileXYZ struct {
// 戻り値(エラー):
//
// 以下の条件に当てはまる場合、エラーインスタンスが返却される。
// ズームレベル不正:hZoomまたはvZoomに0-(consts.MaxTileXYZZoom)以外の数値が含まれていた場合
func NewTileXYZ(hZoom uint16, x int64, y int64, vZoom uint16, z int64) (*TileXYZ, error) {
// ズームレベル不正:hZoomまたはvZoomに[0, consts.MaxTileXYZZoom]以外の数値が含まれていた場合
func NewTileXYZ(hZoom int64, x int64, y int64, vZoom int64, z int64) (*TileXYZ, error) {
tile := &TileXYZ{}

// 水平精度設定
Expand Down Expand Up @@ -585,8 +585,8 @@ func NewTileXYZ(hZoom uint16, x int64, y int64, vZoom uint16, z int64) (*TileXYZ
// 戻り値(エラー):
//
// 以下の条件に当てはまる場合、エラーインスタンスが返却される。
// ズームレベル不正:hZoomに0-(consts.MaxTileXYZZoom)以外の数値が含まれていた場合
func (a *TileXYZ) SetHZoom(hZoom uint16) error {
// ズームレベル不正:hZoomに[0, consts.MaxTileXYZZoom]以外の数値が含まれていた場合
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))
}
Expand Down Expand Up @@ -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))
}
Expand All @@ -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
}

Expand Down Expand Up @@ -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
}

Expand Down
43 changes: 26 additions & 17 deletions documentation/convesion.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,36 @@

## 変換関数一覧

| 変換元 | 変換先 | 対応関数 | 今後の変更予定など備考 |
|-------------|-------------|--------------------------------------------------------|--------------------------------------------------------|
| 空間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()` | - |

高度(一次元インデックス)変換関数:

| 変換元 | 変換先 | 対応関数 |
|--------------|--------------|---------------------------------|
| 一次元インデックス | 一次元変換先インデックス | `ConvertZToMinMaxAltitudekey()` |
| 一次元変換先インデックス | 一次元インデックス | `ConvertAltitudeKeyToMinMaxZ()` |
HarutakaMatsumoto marked this conversation as resolved.
Show resolved Hide resolved

廃止/非推奨予定の関数:

| 変換元 | 変換先 | 関数 |
|--------|--------|--------------------------------------------------------|
| 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndAltitudekeys()` |
| 拡張空間ID | Key | `ConvertExtendedSpatialIDsToQuadkeysAndVerticalIDs()` |
| Key | 拡張空間ID | `ConvertQuadkeysAndVerticalIDsToExtendedSpatialIDs()` |
| Key | 空間ID | `ConvertQuadkeysAndVerticalIDsToSpatialIDs()` |
| 空間ID | Key | `ConvertSpatialIDsToQuadkeysAndVerticalIDs()` |

## TileXYZ -> 空間ID変換

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タイルキー空間データがある時を考える

Expand Down Expand Up @@ -137,7 +146,7 @@ request []*object.TileXYZ, zBaseExponent uint16, zBaseOffset int64, extendedSpat
TileXYZ空間のボクセルを拡張空間IDに変換する

変換時、`TileXYZ.x`,`TileXYZ.y`は元の値が利用されるのみである
しかし`TileXYZ.z`は一次元変換(`ConvertAltitudeKeyToZ()`)によって元の値に近い垂直方向拡張空間インデックスに変換される
しかし`TileXYZ.z`は一次元逆変換(`ConvertAltitudeKeyToMinMaxZ()`)によって元の値に近い垂直方向拡張空間インデックスに変換される
HarutakaMatsumoto marked this conversation as resolved.
Show resolved Hide resolved

これは`TileXYZ.z`と拡張空間ID垂直インデックスの間ではボクセルのインデックス付番や0番の位置の基準を変更されているためである

Expand Down
6 changes: 4 additions & 2 deletions examples/checkZoom/go.mod
Original file line number Diff line number Diff line change
@@ -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
)
11 changes: 6 additions & 5 deletions examples/checkZoom/go.sum
Original file line number Diff line number Diff line change
@@ -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=
15 changes: 0 additions & 15 deletions examples/convertTileXYZToSpatialId/go.mod

This file was deleted.

58 changes: 0 additions & 58 deletions examples/convertTileXYZToSpatialId/go.sum

This file was deleted.

65 changes: 0 additions & 65 deletions examples/convertTileXYZToSpatialId/main.go

This file was deleted.

13 changes: 7 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,23 +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
golang.org/x/exp v0.0.0-20230321023759-10a507213a29
github.com/trajectoryjp/closest_go v1.0.2
)
Loading
Loading