# tiles

提供与 `3d-tiles-renderer` 和地理空间数据的集成。主要导出 `ArcgisTilesRenderer`，可流式加载 ArcGIS Online 3D 瓦片并将地球重新定向到指定地理位置。

```typescript
import { ArcgisTilesRenderer } from 'u-space/plugins/tiles';

const arcgisTilesRenderer = new ArcgisTilesRenderer(viewer);

// 设置原点为经度、纬度、高度
arcgisTilesRenderer.invalidate(120.002269, 30.284849, 4);

// 瓦片持续流式加载，使用 always 模式
viewer.frameloop = 'always';

arcgisTilesRenderer.enable();

// 经纬高转场景世界坐标
const position = arcgisTilesRenderer.lonLatHeightToPosition(120.002269, 30.284849, 8);

// 场景世界坐标转经纬高
const location = arcgisTilesRenderer.positionToLonLatHeight(position);
```

**方法：**

| 方法 | 说明 |
| :--- | :--- |
| `invalidate(lon, lat, alt)` | 将瓦片原点设置为指定的 WGS84 经纬高。`lon`、`lat` 使用度，`alt` 使用米。可多次调用。返回一个取消订阅的函数。 |
| `lonLatHeightToPosition(lon, lat, height?, target?)` | 将 WGS84 经纬高转换为当前场景的世界坐标。`lon`、`lat` 使用度，`height` 使用米，返回 `Vector3`。 |
| `positionToLonLatHeight(position, target?)` | 将当前场景的世界坐标转换为 WGS84 经纬高，返回 `{ lon, lat, height }`。`lon`、`lat` 使用度，`height` 使用米。 |
| `enable()` | 将瓦片添加到场景并启动更新循环。 |
| `disable()` | 从场景中移除瓦片并暂停更新循环。 |
| `dispose()` | 禁用并完全释放瓦片渲染器。 |

## 坐标转换

`invalidate(lon, lat, alt)` 会通过 `3d-tiles-renderer` 的 `ReorientationPlugin` 把指定 WGS84 经纬高移动到场景原点。重定位完成后，默认场景轴向为：

- `+Y`：高度方向（Up）
- `+Z`：北向（North）
- `+X`：西向（West），东向为 `-X`

`lonLatHeightToPosition()` 和 `positionToLonLatHeight()` 复用瓦片当前的 `group.matrixWorld` 与 WGS84 椭球坐标，适合在 GIS 点位、POI、业务模型和 Three.js 场景世界坐标之间互转。

```typescript
import { Vector3 } from 'three/webgpu';

const poiPosition = arcgisTilesRenderer.lonLatHeightToPosition(120.0024, 30.285, 12);
poi.position.copy(poiPosition);

const worldPosition = object.getWorldPosition(new Vector3());
const { lon, lat, height } = arcgisTilesRenderer.positionToLonLatHeight(worldPosition);
```

传给 `positionToLonLatHeight()` 的 `position` 必须是场景世界坐标。如果坐标来自某个对象的局部空间，先通过 `object.localToWorld(localPosition)` 或 `object.getWorldPosition()` 转成世界坐标。

如果在瓦片 root tileset 加载前调用 `invalidate()`，会先基于当前 WGS84 椭球立即应用一次重定位，保证后续坐标转换可用；root tileset 加载完成后会按最终 ellipsoid 再应用一次。
