# Tmap.extend.js
**Repository Path**: chumbir/tmap.extend.js
## Basic Information
- **Project Name**: Tmap.extend.js
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-08
- **Last Updated**: 2026-09-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# tmap.extend.js
轻量的天地图定位 SDK。一套 JS 同时适配 **普通浏览器 / Vue / uni-app(H5 / web-view)**,参数与回调习惯对齐 `uni.getLocation`,但**不依赖、不调用** `uni.getLocation`。
- 独立实现,零第三方依赖
- 同时支持 Promise 和 `success / fail / complete` 回调
- 定位结果来源可辨(`provider: browser / ip / native`),默认不做静默回退
## 特性
| 能力 | 说明 |
| --- | --- |
| 浏览器定位 | 天地图 `T.Geolocation` |
| IP 定位 | 天地图 `T.LocalCity`,无需浏览器授权 |
| 逆地理编码 | `geocode: true` 时用 `T.Geocoder` 补 `address` |
| 显式回退 | 仅当 `fallback: true` 时才回退原生 `navigator.geolocation`,结果标 `provider: 'native'` |
| 脚本去重 | 天地图 JS API 按 URL 做 Promise 级去重缓存,可安全并发调用 |
## 仓库结构
```
TMAP-EXTEND-JS/
├── demo.html # 开箱即用的调用示例
└── tmap.extend.js/ # npm 包本体
├── index.mjs # ESM 源码(唯一源码)
├── index.cjs # CommonJS 入口
├── tmap.extend.js # UMD 构建产物(浏览器
```
### CommonJS
```js
const Tmap = require('tmap.extend.js')
```
## API
### `Tmap.extend.getLocation(options)`
浏览器定位。**默认仅使用天地图 `T.Geolocation`**,任何失败(脚本加载失败、缺少 tk、未授权、超时等)都会直接 reject,错误带 `errMsg`(`方法名:fail 原因`)和 `provider: 'browser'`。只有显式传 `fallback: true`,才会在天地图失败时回退原生 `navigator.geolocation`,此时结果 `provider: 'native'`。
### `Tmap.extend.ipLocation(options)`
IP 定位,使用天地图 `T.LocalCity`,不需要浏览器授权。
### `Tmap.extend.createLocation(defaults)`
工厂方法,预设默认参数(如 `tk`),返回带 `getLocation / ipLocation / loadTiandituScript` 的实例。
### `Tmap.extend.loadTiandituScript(options)`
手动加载天地图 JS API,返回 `Promise`。
## 参数
| 参数 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `tk` | string | - | 天地图密钥,必填(可由 `createLocation` 预设) |
| `geocode` | boolean | `false` | 逆地理编码,补 `address` / `formattedAddress` |
| `timeout` | number | `10000` | 超时(毫秒) |
| `isHighAccuracy` / `enableHighAccuracy` | boolean | `false` | 是否高精度 |
| `highAccuracyExpireTime` | number | - | 高精度超时(兼容 uni 参数) |
| `maximumAge` | number | `0` | 缓存时间(毫秒);或用 `cacheTimeout`(秒) |
| `fallback` | boolean | `false` | 浏览器定位失败时是否回退原生 geolocation |
| `apiUrl` | string | 天地图 v4.0 | JS API 地址 |
| `scriptId` | string | `tianditu-jsapi-v4` | script 标签 id |
| `windowRef` | object | `globalThis` | 全局引用(测试注入用) |
| `success` / `fail` / `complete` | function | - | uni 风格回调 |
## 返回值
```jsonc
{
"latitude": 34.7466,
"longitude": 113.6253,
"lnglat": { "lat": 34.7466, "lng": 113.6253 },
"cityName": "郑州市",
"address": { "province": "河南省", "city": "郑州市" },
"formattedAddress": "河南省郑州市...",
"provider": "browser",
"accuracy": 30,
"raw": {}
}
```
`provider` 取值:
- `browser`:天地图浏览器定位(`T.Geolocation`)
- `ip`:天地图 IP 定位(`T.LocalCity`)
- `native`:`fallback: true` 回退到的原生定位(`navigator.geolocation`)
## 行为与注意事项
- **不做静默回退**:`getLocation` 失败会明确报错,绝不会悄悄换成原生定位的结果。错误对象带 `errMsg`、`method`、`provider`、`raw`。
- 浏览器定位需要 **HTTPS 或 localhost** 的安全上下文,并且需要用户授权。
- `geocode` 依赖天地图地理编码服务,逆地理失败不影响定位结果本身(只是没有 `address`)。
- 在 uni-app 中适用于 H5 与 web-view 场景。
## 本地 Demo
```bash
npx serve .
```
打开 `http://localhost:3000/demo.html`,填入天地图 `tk` 即可测试。支持 URL 参数直达:
```
demo.html?tk=你的tk&provider=browser&geocode=true
```
- `provider`:`browser` / `ip`;非安全上下文会自动切到 `ip`
- `geocode`:`true` / `false`
- 带上 `tk` 参数时页面会自动发起一次定位
## 构建
```bash
cd tmap.extend.js
npm run build # index.mjs -> tmap.extend.js(UMD)
```
无任何 npm 依赖,Node 直接运行。
## 版本记录
- **0.2.0**(2026-09-08):**行为变更**——移除 `getLocation` 默认静默回退原生定位;新增显式 `fallback` 选项,回退结果 `provider: 'native'`。依赖旧行为的调用方需显式加 `fallback: true`。
- **0.1.0**:首个发布版本。
## License
[MIT](./LICENSE)