@maptec/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +284 -0
- package/bin/maptec.js +2 -0
- package/dist/chunk-K574OFFK.js +122 -0
- package/dist/chunk-K574OFFK.js.map +1 -0
- package/dist/cli.js +899 -0
- package/dist/cli.js.map +1 -0
- package/dist/store-ZU7HLXCV.js +18 -0
- package/dist/store-ZU7HLXCV.js.map +1 -0
- package/package.json +47 -0
- package/skills/README.md +30 -0
- package/skills/jsapi-skills/README.md +60 -0
- package/skills/jsapi-skills/SKILL.md +145 -0
- package/skills/jsapi-skills/package.json +31 -0
- package/skills/jsapi-skills/references/controls.md +195 -0
- package/skills/jsapi-skills/references/events.md +222 -0
- package/skills/jsapi-skills/references/geocoding.md +184 -0
- package/skills/jsapi-skills/references/map-style.md +123 -0
- package/skills/jsapi-skills/references/map.md +154 -0
- package/skills/jsapi-skills/references/marker.md +136 -0
- package/skills/jsapi-skills/references/operate.md +138 -0
- package/skills/jsapi-skills/references/overlay.md +311 -0
- package/skills/jsapi-skills/references/place-search.md +411 -0
- package/skills/jsapi-skills/references/poi-categories.md +123 -0
- package/skills/jsapi-skills/references/popup.md +146 -0
- package/skills/jsapi-skills/references/re-geocoding.md +183 -0
- package/skills/jsapi-skills/references/routing.md +347 -0
- package/skills/jsapi-skills/references/track.md +240 -0
- package/skills/jsapi-skills/scripts/validate_jsapi_skill.py +160 -0
- package/skills/webapi-skills/README.md +73 -0
- package/skills/webapi-skills/SKILL.md +63 -0
- package/skills/webapi-skills/package.json +32 -0
- package/skills/webapi-skills/references/direction-api.md +175 -0
- package/skills/webapi-skills/references/geocoding.md +195 -0
- package/skills/webapi-skills/references/ip-location.md +87 -0
- package/skills/webapi-skills/references/matrix-api.md +149 -0
- package/skills/webapi-skills/references/nearby-search.md +223 -0
- package/skills/webapi-skills/references/places.md +239 -0
- package/skills/webapi-skills/references/quick-start-cn.md +219 -0
- package/skills/webapi-skills/references/reverse-geocoding.md +157 -0
- package/skills/webapi-skills/references/suggest.md +111 -0
- package/skills/webapi-skills/references/text-search.md +282 -0
- package/skills/webapi-skills/scripts/validate_webapi_skill.py +158 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# 附近搜索
|
|
2
|
+
|
|
3
|
+
**附近搜索** 是通过设置区域实现指定地点附近区域搜索,以获取该区域内匹配一个或多个类型的地点的详细信息列表,包括位置、类型、详情、地点ID等信息。
|
|
4
|
+
|
|
5
|
+
## 1. 接口定义
|
|
6
|
+
|
|
7
|
+
- 接口请求方式为POST,在JSON请求 Body 或 Header 中传递所有参数,作为POST请求的一部分。
|
|
8
|
+
- **请求头包含**:
|
|
9
|
+
|
|
10
|
+
| **Header** | **描述** |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| Authorization: YOUR_API_KEY | 用于请求服务的API密钥。 |
|
|
13
|
+
| Content-Type:application/json | 声明客户端发送给服务器的数据格式(仅POST请求) |
|
|
14
|
+
|
|
15
|
+
**请求:** POST /search/{versionNumber}/nearby
|
|
16
|
+
|
|
17
|
+
**接口串 (Endpoint):** https://api.maptec.com/search/v1/nearby
|
|
18
|
+
|
|
19
|
+
## 2. 请求参数
|
|
20
|
+
|
|
21
|
+
### 2.1 顶级对象
|
|
22
|
+
|
|
23
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
24
|
+
| --- | --- | --- | --- |
|
|
25
|
+
| locationLimit | `Circle Object` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#DCFCE7;color:#166534;font-weight:600;">是</span> | 指定查询区域,返回指定区域内的结果。区域设置支持圆形,由中心点和半径(米)定义,半径取值 `[0, 50000]`,默认半径为 `0`。 |
|
|
26
|
+
| types | `String` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#FEE2E2;color:#991B1B;font-weight:600;">否</span> | 指定查询结果的类型,以获取匹配类型的地点,类别间通过逗号分隔,如 `"types=Food_Drink,Hotel"`。详细类型见[国际化通用POI分类定义](https://maptech.yuque.com/ak9qv5/slwxa2/lwr040btgea2gso9)。<br> 若未设置该参数,则服务将返回指定查询区域内的所有类型的地点。 |
|
|
27
|
+
| resultLimit | `Integer` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#FEE2E2;color:#991B1B;font-weight:600;">否</span> | 指定返回地点结果数上限,取值范围 `[1, 20]`,默认 `20` |
|
|
28
|
+
| rank | `Enum` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#FEE2E2;color:#991B1B;font-weight:600;">否</span> | 指定响应结果的排序方式。<br>取值:`RELEVANCE` (搜索相关性)\|`DISTANCE`(按距离排序)。 |
|
|
29
|
+
| language | `String` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#FEE2E2;color:#991B1B;font-weight:600;">否</span> | 返回结果中可本地化文本的首选语言。取值为符合 IETF BCP 47 / RFC 5646 的语言标签,且必须在本平台支持的语言列表内。例如:`en`、`en-US`。 <br>大小写不敏感,推荐使用规范大小写。若指定语言不可用、部分字段无对应翻译,或该地区数据仅有本地语言名称,则返回本地语言或平台默认语言。 <br>默认值:`en`。 |
|
|
30
|
+
| region | `String` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#FEE2E2;color:#991B1B;font-weight:600;">否</span> | 国家/地区代码,设置返回偏向特定地区的结果。该参数不会将结果严格限制在指定国家/地区内。<br>取值为 ISO 3166-1 alpha-2 / CLDR two-letter region code,大小写不敏感,推荐使用大写形式。例如:`BR`、`SG`。 |
|
|
31
|
+
|
|
32
|
+
### 2.2 Circle 对象
|
|
33
|
+
|
|
34
|
+
*用于 `locationLimit` 参数,附近搜索仅支持圆形区域。*
|
|
35
|
+
|
|
36
|
+
| 字段 | 类型 | 说明 |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| center | `LatLng Object` | 中心点 |
|
|
39
|
+
| radius | `Number` | 半径(米),取值 `[0, 50000]` ,默认 `0` |
|
|
40
|
+
|
|
41
|
+
### 2.3 LatLng 对象
|
|
42
|
+
|
|
43
|
+
*用于 Circle.center、Place.location、Viewport 中的坐标表示。*
|
|
44
|
+
|
|
45
|
+
| 字段 | 类型 | 说明 |
|
|
46
|
+
| --- | --- | --- |
|
|
47
|
+
| latitude | `Number` | 纬度值(以度为单位),取值 `[-90.0, +90.0]` |
|
|
48
|
+
| longitude | `Number` | 经度值(以度为单位),取值 `[-180.0, +180.0]` |
|
|
49
|
+
|
|
50
|
+
## 3. 标准返回值
|
|
51
|
+
|
|
52
|
+
### 3.1 顶级响应对象
|
|
53
|
+
|
|
54
|
+
| 字段 | 类型 | 说明 |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| status | `String` | 响应请求的状态码。可能包含以下值:<br>`"OK"` 表示请求成功,并且至少返回了一条结果。<br>`"ZERO_RESULTS"` 表示请求成功,但未返回任何结果。<br>`"ERROR"` 表示请求失败。 |
|
|
57
|
+
| places | `Place[]` | 以 JSON 对象的形式返回响应。当服务返回结果时,会将结果放置在 places 数组中,数组包含所有匹配地点。<br> 数组中的每个地点都由一个 `Place` 对象表示。`Place` 对象包含单个地点的详细信息。 |
|
|
58
|
+
| error | `Error Object` | 当 `"status"` 为 `"ERROR"` 时返回,含 `code`、`message`。 |
|
|
59
|
+
|
|
60
|
+
### 3.2 Place 对象
|
|
61
|
+
|
|
62
|
+
| 字段 | 类型 | 说明 |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| id | `String` | 地点的唯一标识符,可以与其他服务搭配使用。 |
|
|
65
|
+
| name | `String` | 地点的资源名称,如 `places/{placeId}`,可用于地点详情查询。 |
|
|
66
|
+
| displayName | `LocalizedText Object` | 地点的显示名称。 |
|
|
67
|
+
| types | `String[]` | 返回结果类型,参见[国际化通用POI分类定义](https://maptech.yuque.com/ak9qv5/slwxa2/lwr040btgea2gso9)。 |
|
|
68
|
+
| formattedAddress | `String` | 该位置的地址,包含了一个或多个地址组成部分。 |
|
|
69
|
+
| addressComponents | `AddressComponent[]` | 包含适用于该地址的各个组成部分。<br>注意事项:<br> 地址组成部分的数组包含的组成部分可能多于 `formattedAddress`。<br> 除了 `formattedAddress` 中包含的地点之外,数组不一定会纳入包含地址的所有地点,应使用反向地理编码,并将地址的纬度/经度作为参数传递给请求。 |
|
|
70
|
+
| phoneNumber | `String` | 地点的电话号码。多个电话号码之间用英文逗号分隔。 |
|
|
71
|
+
| location | `LatLng Object` | 地点的地理位置 |
|
|
72
|
+
| openingHours | `OpeningHours Object` | 地点营业时间 |
|
|
73
|
+
| viewport | `Viewport Object` | 返回结果的推荐视口,通过 `northeast` 和 `southwest` 定义的矩形范围。 |
|
|
74
|
+
| timeZone | `TimeZone Object` | [IANA 时区数据库](https://www.iana.org/time-zones)时区,如 `"America/New_York"` |
|
|
75
|
+
| summary | `LocalizedText Object` | 地点摘要信息 |
|
|
76
|
+
|
|
77
|
+
### 3.3 LocalizedText 对象
|
|
78
|
+
|
|
79
|
+
本地化语言文本
|
|
80
|
+
*用于 Place.displayName、Place.summary。*
|
|
81
|
+
|
|
82
|
+
| 字段 | 类型 | 说明 |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| text | `String` | 显示名称字符串,语言同 `languageCode` |
|
|
85
|
+
| languageCode | `String` | 符合 IETF BCP 47 / RFC 5646 的语言标签,如 `en-US` |
|
|
86
|
+
|
|
87
|
+
### 3.4 AddressComponent 对象
|
|
88
|
+
|
|
89
|
+
*用于 Place.addressComponents。*
|
|
90
|
+
|
|
91
|
+
| 字段 | 类型 | 说明 |
|
|
92
|
+
| --- | --- | --- |
|
|
93
|
+
| longName | `String` | 地址组成部分的完整文本说明或名称。 |
|
|
94
|
+
| shortName | `String` | 地址组成部分的缩写名称(如有)。 |
|
|
95
|
+
| types | `String[]` | 一个数组,表示地址组成部分的类型。 |
|
|
96
|
+
| languageCode | `String` | 符合 IETF BCP 47 / RFC 5646 的语言标签,如 `en-US` |
|
|
97
|
+
|
|
98
|
+
### 3.5 Viewport 对象
|
|
99
|
+
|
|
100
|
+
*用于 Place.viewport。*
|
|
101
|
+
|
|
102
|
+
| 字段 | 类型 | 说明 |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| northeast | `LatLng Object` | 推荐视口矩形区域的东北角 |
|
|
105
|
+
| southwest | `LatLng Object` | 推荐视口矩形区域的西南角 |
|
|
106
|
+
|
|
107
|
+
### 3.6 OpeningHours 对象
|
|
108
|
+
|
|
109
|
+
*用于 Place.openingHours。*
|
|
110
|
+
|
|
111
|
+
| 字段 | 类型 | 说明 |
|
|
112
|
+
| --- | --- | --- |
|
|
113
|
+
| openNow | `Boolean` | 当前时刻是否正在营业。根据 `timeZone` 和当前 UTC 时间实时计算的结果。`true` 表示正在营业,`false` 表示已打烊。 |
|
|
114
|
+
| periods | `Period[]` | 详细的周期性营业时间,包含 period Object <br> 包含一周 7 天的详细开门与关门时间。若地点 24 小时营业,则仅包含一组 `day: 0, time: "0000"` 且不含 `close`。 |
|
|
115
|
+
| weekdayText | `String[]` | 一个数组,包含格式化后的本地化文本描述,如 `"Monday: 09:00-19:00"` |
|
|
116
|
+
| nextStatusChange | `String` | 下一次状态变更时间。采用 ISO 8601 格式(UTC 时间)。例如:若当前营业,则为打烊时间;若当前打烊,则为下次开门时间。 |
|
|
117
|
+
|
|
118
|
+
### 3.7 Period 对象
|
|
119
|
+
|
|
120
|
+
*用于 OpeningHours.periods。*
|
|
121
|
+
|
|
122
|
+
| 字段 | 类型 | 说明 |
|
|
123
|
+
| --- | --- | --- |
|
|
124
|
+
| open | `Point Object` | 开门时间 |
|
|
125
|
+
| close | `Point Object` | 打烊时间 |
|
|
126
|
+
|
|
127
|
+
### 3.8 Point 对象
|
|
128
|
+
|
|
129
|
+
*用于 Period.open、Period.close。*
|
|
130
|
+
|
|
131
|
+
| 字段 | 类型 | 说明 |
|
|
132
|
+
| --- | --- | --- |
|
|
133
|
+
| day | `Integer` | 取值 0-6,分别代表星期日到星期六。 |
|
|
134
|
+
| time | `String` | 采用 **24 小时制固定 4 位数字格式**(hhmm)。例如 `"0900"` 代表上午 9 点,`"2130"` 代表晚上 9 点半。 |
|
|
135
|
+
|
|
136
|
+
### 3.9 TimeZone 对象
|
|
137
|
+
|
|
138
|
+
*用于 Place.timeZone。*
|
|
139
|
+
|
|
140
|
+
| 字段 | 类型 | 说明 |
|
|
141
|
+
| --- | --- | --- |
|
|
142
|
+
| id | `String` | [IANA 时区数据库](https://www.iana.org/time-zones)时区。 |
|
|
143
|
+
| version | `String` | IANA 时区数据库版本号,如 `"2025b"` |
|
|
144
|
+
|
|
145
|
+
### 3.10 Error 对象
|
|
146
|
+
|
|
147
|
+
| 字段 | 类型 | 说明 |
|
|
148
|
+
| --- | --- | --- |
|
|
149
|
+
| code | `String` | 错误码 |
|
|
150
|
+
| message | `String` | 错误信息描述 |
|
|
151
|
+
|
|
152
|
+
## 4. JSON示例
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"status": "OK",
|
|
157
|
+
"places": [
|
|
158
|
+
{
|
|
159
|
+
"id": "chij_restaurante_sp_001",
|
|
160
|
+
"name": "places/chij_restaurante_sp_001",
|
|
161
|
+
"displayName": {
|
|
162
|
+
"text": "Restaurante Central",
|
|
163
|
+
"languageCode": "pt"
|
|
164
|
+
},
|
|
165
|
+
"types": ["restaurant", "food"],
|
|
166
|
+
"formattedAddress": "Av. Paulista, 1000, São Paulo - SP, 01310-100, Brasil",
|
|
167
|
+
"addressComponents": [
|
|
168
|
+
{
|
|
169
|
+
"longName": "São Paulo",
|
|
170
|
+
"shortName": "SP",
|
|
171
|
+
"types": ["locality"],
|
|
172
|
+
"languageCode": "pt"
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"phoneNumber": "+55-11-3456-7890",
|
|
176
|
+
"location": {
|
|
177
|
+
"latitude": -23.5612,
|
|
178
|
+
"longitude": -46.6560
|
|
179
|
+
},
|
|
180
|
+
"openingHours": {
|
|
181
|
+
"openNow": true,
|
|
182
|
+
"periods": [
|
|
183
|
+
{
|
|
184
|
+
"open": { "day": 1, "time": "1100" },
|
|
185
|
+
"close": { "day": 1, "time": "2300" }
|
|
186
|
+
}
|
|
187
|
+
],
|
|
188
|
+
"weekdayText": [
|
|
189
|
+
"Monday: 11:00 - 23:00",
|
|
190
|
+
"Tuesday: 11:00 - 23:00",
|
|
191
|
+
"Wednesday: 11:00 - 23:00",
|
|
192
|
+
"Thursday: 11:00 - 23:00",
|
|
193
|
+
"Friday: 11:00 - 00:00",
|
|
194
|
+
"Saturday: 10:00 - 00:00",
|
|
195
|
+
"Sunday: 10:00 - 22:00"
|
|
196
|
+
],
|
|
197
|
+
"nextStatusChange": "2026-03-04T23:00:00Z"
|
|
198
|
+
},
|
|
199
|
+
"viewport": {
|
|
200
|
+
"northeast": { "latitude": -23.5598, "longitude": -46.6545 },
|
|
201
|
+
"southwest": { "latitude": -23.5626, "longitude": -46.6575 },
|
|
202
|
+
"low": { "latitude": -23.5626, "longitude": -46.6575 },
|
|
203
|
+
"high": { "latitude": -23.5598, "longitude": -46.6545 }
|
|
204
|
+
},
|
|
205
|
+
"timeZone": {
|
|
206
|
+
"id": "America/Sao_Paulo",
|
|
207
|
+
"version": "2025b"
|
|
208
|
+
},
|
|
209
|
+
"photos": [
|
|
210
|
+
{
|
|
211
|
+
"name": "places/chij_restaurante_sp_001/photos/AF16_photo002",
|
|
212
|
+
"widthPx": 1920,
|
|
213
|
+
"heightPx": 1080
|
|
214
|
+
}
|
|
215
|
+
],
|
|
216
|
+
"summary": {
|
|
217
|
+
"text": "位于圣保罗市中心,提供巴西传统美食,环境舒适,深受当地居民喜爱。",
|
|
218
|
+
"languageCode": "zh-CN"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
```
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# 地点详情
|
|
2
|
+
|
|
3
|
+
**地点详情** 是根据地点ID,获取该地点的详细信息,包括完整地址、电话号码等全部相关信息。
|
|
4
|
+
<br>可以通过Search服务的 (`/text`, `/nearby`, `/suggest`),Geocoding服务等多种方式获取地点ID。
|
|
5
|
+
|
|
6
|
+
## 1. 接口定义
|
|
7
|
+
|
|
8
|
+
- 接口请求方式为POST,在JSON请求 Body 或 Header 中传递所有参数,作为POST请求的一部分。
|
|
9
|
+
- **请求头包含**:
|
|
10
|
+
|
|
11
|
+
| **Header** | **描述** |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| Authorization: YOUR_API_KEY | 用于请求服务的API密钥。 |
|
|
14
|
+
| Content-Type:application/json | 声明客户端发送给服务器的数据格式(仅POST请求) |
|
|
15
|
+
|
|
16
|
+
**请求:** GET /search/{versionNumber}/places/{placeId}
|
|
17
|
+
|
|
18
|
+
**接口串 (Endpoint):** https://api.maptec.com/search/v1/places/{placeId}?parameters
|
|
19
|
+
|
|
20
|
+
*parameters 代表的参数包括必填参数和可选参数。所有查询参数使用 `&` 字符进行分隔。*
|
|
21
|
+
|
|
22
|
+
## 2. 请求参数
|
|
23
|
+
|
|
24
|
+
### 2.1 路径参数
|
|
25
|
+
|
|
26
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
27
|
+
| --- | --- | --- | --- |
|
|
28
|
+
| versionNumber | `String` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#DCFCE7;color:#166534;font-weight:600;">是</span> | 调用的服务版本,如 `v1` |
|
|
29
|
+
| placeId | `String` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#DCFCE7;color:#166534;font-weight:600;">是</span> | 地点的唯一文本标识符,可通过 `/text`、`/nearby`、`/suggest` 获取 |
|
|
30
|
+
|
|
31
|
+
### 2.2 查询参数
|
|
32
|
+
|
|
33
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
34
|
+
| --- | --- | --- | --- |
|
|
35
|
+
| apiKey | `String` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#DCFCE7;color:#166534;font-weight:600;">是</span> | 用于请求服务的 API 密钥(Header 优先,URL 备选) |
|
|
36
|
+
| language | `String` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#FEE2E2;color:#991B1B;font-weight:600;">否</span> | 返回结果中可本地化文本的首选语言。取值为符合 IETF BCP 47 / RFC 5646 的语言标签,且必须在本平台支持的语言列表内。例如:`en`、`en-US`。 <br>大小写不敏感,推荐使用规范大小写。若指定语言不可用、部分字段无对应翻译,或该地区数据仅有本地语言名称,则返回本地语言或平台默认语言。 <br>默认值:`en`。 |
|
|
37
|
+
| region | `String` | <span style="display:inline-block;padding:2px 10px;border-radius:999px;background:#FEE2E2;color:#991B1B;font-weight:600;">否</span> | 国家/地区代码,设置返回偏向特定地区的结果。该参数不会将结果严格限制在指定国家/地区内。<br>取值为 ISO 3166-1 alpha-2 / CLDR two-letter region code,大小写不敏感,推荐使用大写形式。例如:`BR`、`SG`。 |
|
|
38
|
+
|
|
39
|
+
## 3. 返回标准值
|
|
40
|
+
|
|
41
|
+
### 3.1 顶级响应对象
|
|
42
|
+
|
|
43
|
+
| 字段 | 类型 | 说明 |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| status | `String` | 响应请求的状态码。可能包含以下值:<br>`"OK"` 表示请求成功,并且至少返回了一条结果。<br>`"ZERO_RESULTS"` 表示请求成功,但未返回任何结果。<br>`"ERROR"` 表示请求失败。 |
|
|
46
|
+
| places | `Place Object` | 以 JSON 对象的形式返回响应。Place 对象包含有关地点的详细信息。 |
|
|
47
|
+
| error | `Error Object` | 当 `"status"` 为 `"ERROR"` 时返回,含 `code`、`message` |
|
|
48
|
+
|
|
49
|
+
### 3.2 Place 对象
|
|
50
|
+
|
|
51
|
+
| 字段 | 类型 | 说明 |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| id | `String` | 地点的唯一标识符,可以与其他服务搭配使用。 |
|
|
54
|
+
| name | `String` | 地点的资源名称,如 `places/{placeId}`,可用于地点详情查询。 |
|
|
55
|
+
| displayName | `LocalizedText Object` | 地点的显示名称。 |
|
|
56
|
+
| types | `String[]` | 返回结果类型,详情参见[国际化通用POI分类定义](https://maptech.yuque.com/ak9qv5/slwxa2/lwr040btgea2gso9)。 |
|
|
57
|
+
| formattedAddress | `String` | 该位置的地址,包含了一个或多个地址组成部分。 |
|
|
58
|
+
| addressComponents | `AddressComponent[]` | 包含适用于该地址的各个组成部分。<br>注意事项:<br> 地址组成部分的数组包含的组成部分可能多于 `formattedAddress`。<br> 除了 `formattedAddress` 中包含的地点之外,数组不一定会纳入包含地址的所有地点,应使用反向地理编码,并将地址的纬度/经度作为参数传递给请求。 |
|
|
59
|
+
| phoneNumber | `String` | 地点的电话号码。多个电话号码之间用英文逗号分隔。 |
|
|
60
|
+
| location | `LatLng Object` | 地点的地理位置 |
|
|
61
|
+
| openingHours | `OpeningHours Object` | 地点营业时间 |
|
|
62
|
+
| viewport | `Viewport Object` | 返回结果的推荐视口,通过 `northeast` 和 `southwest` 定义的矩形范围。 |
|
|
63
|
+
| timeZone | `TimeZone Object` | [IANA 时区数据库](https://www.iana.org/time-zones)时区,如 `"America/New_York"` |
|
|
64
|
+
| summary | `LocalizedText Object` | 地点摘要信息 |
|
|
65
|
+
|
|
66
|
+
### 3.3 LocalizedText 对象
|
|
67
|
+
|
|
68
|
+
本地化语言文本
|
|
69
|
+
*用于 Place.displayName、Place.summary。*
|
|
70
|
+
|
|
71
|
+
| 字段 | 类型 | 说明 |
|
|
72
|
+
| --- | --- | --- |
|
|
73
|
+
| text | `String` | 显示名称字符串,语言同 `languageCode` |
|
|
74
|
+
| languageCode | `String` | 符合 IETF BCP 47 / RFC 5646 的语言标签,如 `en-US` |
|
|
75
|
+
|
|
76
|
+
### 3.4 AddressComponent 对象
|
|
77
|
+
|
|
78
|
+
*用于 Place.addressComponents。*
|
|
79
|
+
|
|
80
|
+
| 字段 | 类型 | 说明 |
|
|
81
|
+
| --- | --- | --- |
|
|
82
|
+
| longName | `String` | 地址组成部分的完整文本说明或名称。 |
|
|
83
|
+
| shortName | `String` | 地址组成部分的缩写名称(如有)。 |
|
|
84
|
+
| types | `String[]` | 一个数组,表示地址组成部分的类型。 |
|
|
85
|
+
| languageCode | `String` | 符合 IETF BCP 47 / RFC 5646 的语言标签,如 `en-US` |
|
|
86
|
+
|
|
87
|
+
### 3.5 LatLng 对象
|
|
88
|
+
|
|
89
|
+
*用于 Place.location、Viewport 中的坐标表示。*
|
|
90
|
+
|
|
91
|
+
| 字段 | 类型 | 说明 |
|
|
92
|
+
| --- | --- | --- |
|
|
93
|
+
| latitude | `Number` | 纬度值(以度为单位),取值 `[-90.0, +90.0]` |
|
|
94
|
+
| longitude | `Number` | 经度值(以度为单位),取值 `[-180.0, +180.0]` |
|
|
95
|
+
|
|
96
|
+
### 3.6 Viewport 对象
|
|
97
|
+
|
|
98
|
+
*用于 Place.viewport。*
|
|
99
|
+
|
|
100
|
+
| 字段 | 类型 | 说明 |
|
|
101
|
+
| --- | --- | --- |
|
|
102
|
+
| northeast | `LatLng Object` | 推荐视口矩形区域的东北角 |
|
|
103
|
+
| southwest | `LatLng Object` | 推荐视口矩形区域的西南角 |
|
|
104
|
+
|
|
105
|
+
### 3.7 OpeningHours 对象
|
|
106
|
+
|
|
107
|
+
*用于 Place.openingHours。*
|
|
108
|
+
|
|
109
|
+
| 字段 | 类型 | 说明 |
|
|
110
|
+
| --- | --- | --- |
|
|
111
|
+
| openNow | `Boolean` | 当前时刻是否正在营业。根据 `timeZone` 和当前 UTC 时间实时计算的结果。`true` 表示正在营业,`false` 表示已打烊。 |
|
|
112
|
+
| periods | `Period[]` | 详细的周期性营业时间,包含 period Object <br> 包含一周 7 天的详细开门与关门时间。若地点 24 小时营业,则仅包含一组 `day: 0, time: "0000"` 且不含 `close`。 |
|
|
113
|
+
| weekdayText | `String[]` | 一个数组,包含格式化后的本地化文本描述,如 `"Monday: 09:00-19:00"` |
|
|
114
|
+
| nextStatusChange | `String` | 下一次状态变更时间。采用 ISO 8601 格式(UTC 时间)。例如:若当前营业,则为打烊时间;若当前打烊,则为下次开门时间。 |
|
|
115
|
+
|
|
116
|
+
### 3.8 Period 对象
|
|
117
|
+
|
|
118
|
+
*用于 OpeningHours.periods。*
|
|
119
|
+
|
|
120
|
+
| 字段 | 类型 | 说明 |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| open | `Point Object` | 开门时间 |
|
|
123
|
+
| close | `Point Object` | 打烊时间 |
|
|
124
|
+
|
|
125
|
+
### 3.9 Point 对象
|
|
126
|
+
|
|
127
|
+
*用于 Period.open、Period.close。*
|
|
128
|
+
|
|
129
|
+
| 字段 | 类型 | 说明 |
|
|
130
|
+
| --- | --- | --- |
|
|
131
|
+
| day | `Integer` | 取值 0-6,分别代表星期日到星期六。 |
|
|
132
|
+
| time | `String` | 采用 **24 小时制固定 4 位数字格式**(hhmm)。例如 `"0900"` 代表上午 9 点,`"2130"` 代表晚上 9 点半。 |
|
|
133
|
+
|
|
134
|
+
### 3.10 TimeZone 对象
|
|
135
|
+
|
|
136
|
+
*用于 Place.timeZone。*
|
|
137
|
+
|
|
138
|
+
| 字段 | 类型 | 说明 |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| id | `String` | [IANA 时区数据库](https://www.iana.org/time-zones)时区。 |
|
|
141
|
+
| version | `String` | IANA 时区数据库版本号,如 `"2025b"` |
|
|
142
|
+
|
|
143
|
+
### 3.11 Error 对象
|
|
144
|
+
|
|
145
|
+
| 字段 | 类型 | 说明 |
|
|
146
|
+
| --- | --- | --- |
|
|
147
|
+
| code | `String` | 错误码 |
|
|
148
|
+
| message | `String` | 错误信息描述 |
|
|
149
|
+
|
|
150
|
+
## 4. JSON示例
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"status": "OK",
|
|
155
|
+
"places": {
|
|
156
|
+
"id": "chij_eismieze_berlin_001",
|
|
157
|
+
"name": "places/chij_eismieze_berlin_001",
|
|
158
|
+
"displayName": {
|
|
159
|
+
"text": "Eismieze",
|
|
160
|
+
"languageCode": "de"
|
|
161
|
+
},
|
|
162
|
+
"types": ["ice_cream_shop", "food"],
|
|
163
|
+
"formattedAddress": "Koloniestraße 30, 13359 Berlin, Deutschland",
|
|
164
|
+
"addressComponents": [
|
|
165
|
+
{
|
|
166
|
+
"longName": "Koloniestraße 30",
|
|
167
|
+
"shortName": "Koloniestr. 30",
|
|
168
|
+
"types": ["street_address"],
|
|
169
|
+
"languageCode": "de"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"longName": "Berlin",
|
|
173
|
+
"shortName": "Berlin",
|
|
174
|
+
"types": ["locality"],
|
|
175
|
+
"languageCode": "de"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"longName": "Deutschland",
|
|
179
|
+
"shortName": "DE",
|
|
180
|
+
"types": ["country"],
|
|
181
|
+
"languageCode": "de"
|
|
182
|
+
}
|
|
183
|
+
],
|
|
184
|
+
"phoneNumber": "+49-30-12345678",
|
|
185
|
+
"location": {
|
|
186
|
+
"latitude": 52.5512,
|
|
187
|
+
"longitude": 13.3882
|
|
188
|
+
},
|
|
189
|
+
"openingHours": {
|
|
190
|
+
"openNow": false,
|
|
191
|
+
"periods": [
|
|
192
|
+
{
|
|
193
|
+
"open": { "day": 2, "time": "1200" },
|
|
194
|
+
"close": { "day": 2, "time": "2000" }
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"open": { "day": 5, "time": "1200" },
|
|
198
|
+
"close": { "day": 5, "time": "2100" }
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"open": { "day": 6, "time": "1100" },
|
|
202
|
+
"close": { "day": 6, "time": "2100" }
|
|
203
|
+
}
|
|
204
|
+
],
|
|
205
|
+
"weekdayText": [
|
|
206
|
+
"Monday: Closed",
|
|
207
|
+
"Tuesday: 12:00 - 20:00",
|
|
208
|
+
"Wednesday: 12:00 - 20:00",
|
|
209
|
+
"Thursday: 12:00 - 20:00",
|
|
210
|
+
"Friday: 12:00 - 21:00",
|
|
211
|
+
"Saturday: 11:00 - 21:00",
|
|
212
|
+
"Sunday: Closed"
|
|
213
|
+
],
|
|
214
|
+
"nextStatusChange": "2026-03-05T11:00:00Z"
|
|
215
|
+
},
|
|
216
|
+
"viewport": {
|
|
217
|
+
"northeast": { "latitude": 52.5525, "longitude": 13.3895 },
|
|
218
|
+
"southwest": { "latitude": 52.5499, "longitude": 13.3869 },
|
|
219
|
+
"low": { "latitude": 52.5499, "longitude": 13.3869 },
|
|
220
|
+
"high": { "latitude": 52.5525, "longitude": 13.3895 }
|
|
221
|
+
},
|
|
222
|
+
"timeZone": {
|
|
223
|
+
"id": "Europe/Berlin",
|
|
224
|
+
"version": "2025b"
|
|
225
|
+
},
|
|
226
|
+
"photos": [
|
|
227
|
+
{
|
|
228
|
+
"name": "places/chij_eismieze_berlin_001/photos/AF16_photo010",
|
|
229
|
+
"widthPx": 2048,
|
|
230
|
+
"heightPx": 1536
|
|
231
|
+
}
|
|
232
|
+
],
|
|
233
|
+
"summary": {
|
|
234
|
+
"text": "柏林知名冰淇淋店,主打手工制作,口味丰富,深受本地居民和游客喜爱。",
|
|
235
|
+
"languageCode": "zh-CN"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# 地图 Web Services API 快速开始
|
|
2
|
+
|
|
3
|
+
本指南将带你快速完成项目创建与 API Key 配置,几分钟内即可上手地图 Web Services API。
|
|
4
|
+
|
|
5
|
+
## 前提条件
|
|
6
|
+
|
|
7
|
+
一个 MapTec 开发者账号。如果还没有账号,请先[注册账号](https://test-lbs.maptec.com/auth/register),已有账号可直接[登录](https://test-lbs.maptec.com/auth/login)。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 第一步:创建项目
|
|
12
|
+
|
|
13
|
+
项目是管理 API Key 和服务授权的基本单元。所有 API Key 都归属于某个项目,因此在生成凭证之前,你需要先创建一个项目。
|
|
14
|
+
|
|
15
|
+
1. 登录后前往[项目资产管理](https://test-lbs.maptec.com/console/project-asset)。
|
|
16
|
+
2. 点击**新建项目**。
|
|
17
|
+
3. 输入**项目名称**和可选的**项目描述**。
|
|
18
|
+
4. 点击**确认**完成创建。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 第二步:创建 API Key
|
|
23
|
+
|
|
24
|
+
API Key(凭证)用于验证你向地图 Web Services API 发起的请求。每个 Key 可绑定特定的平台类型,并可限制为仅允许授权 IP 访问。
|
|
25
|
+
|
|
26
|
+
1. 进入项目,点击**创建 Key**。
|
|
27
|
+
2. 输入**凭证显示名称**以便识别该 Key。
|
|
28
|
+
3. 根据应用的运行环境选择**应用限制类型**。Web Services API 属于服务端调用,选择 **Rest API (Server)**。
|
|
29
|
+
|
|
30
|
+
4. 在**允许的服务器 IP / CIDR** 中填写服务器 IP 地址或网段,每行一条。留空表示不限制 IP。
|
|
31
|
+
### IP 格式要求
|
|
32
|
+
|
|
33
|
+
> **注意**:请勿携带端口号(例如:避免使用 `203.0.113.10:8080`)。
|
|
34
|
+
|
|
35
|
+
系统支持以下四种 IP 格式:
|
|
36
|
+
|
|
37
|
+
1. **IPv4** —— 示例:`203.0.113.10`
|
|
38
|
+
2. **IPv4 CIDR** —— 示例:`10.0.0.0/24`
|
|
39
|
+
3. **IPv6** —— 示例:`2001:db8::1`
|
|
40
|
+
4. **IPv6 CIDR** —— 示例:`2001:db8::/32`
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
> **安全最佳实践:** 生产环境中务必将 Key 限制在已知 IP 范围内。不受限制的 Key 一旦泄露,任何人都可以使用。
|
|
44
|
+
|
|
45
|
+
5. *(可选)* 如果需要对请求进行 HMAC 签名校验,可开启**启用 Secret Key (SK) 校验**。详见[第四步:启用 SK 校验](#第四步启用-sk-校验可选)。
|
|
46
|
+
|
|
47
|
+
6. 点击**下一步**,进入服务授权配置。
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 第三步:授权服务
|
|
52
|
+
|
|
53
|
+
为该 Key 选择允许调用的具体 API。Key 只能访问你明确授权的服务。
|
|
54
|
+
|
|
55
|
+
1. 在左侧**可选服务**列表中勾选需要开启的服务。
|
|
56
|
+
2. 点击 **`>`** 将其移入右侧**已授权服务**列表。如需撤销,在右侧选中后点击 **`<`** 移回。
|
|
57
|
+
3. 重复操作,直到所有所需服务出现在**已授权服务**中。
|
|
58
|
+
4. 点击**完成**生成 Key。
|
|
59
|
+

|
|
60
|
+
> **提示:** 只授权应用实际需要的服务。缩小授权范围可以降低 Key 泄露时的风险。
|
|
61
|
+
|
|
62
|
+
API Key 现已就绪。请复制并妥善保存。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 发起第一个请求
|
|
67
|
+
|
|
68
|
+
在每次请求中,将 API Key 作为 `Authorization` Header 传入。
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
curl "https://api.maptec.com/search/v1/reverse?location=1.46878,103.80373" \
|
|
72
|
+
-H "Authorization: YOUR_API_KEY"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
请求成功时返回 HTTP `200` 及 JSON 响应体。如果返回其他请参照[错误码](https://test-lbs.maptec.com/docs/zh-CN/web-services-api/Resources/ErrorCodes)。
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 第四步:启用 SK 校验(可选)
|
|
80
|
+
|
|
81
|
+
SK(Secret Key)校验为每次请求附加 HMAC-SHA256 签名,即便 API Key 泄露,也能防止未授权调用。在 Key 设置中开启**启用 Secret Key (SK) 校验**即可激活。
|
|
82
|
+
|
|
83
|
+
启用后,每次请求都需要在 HTTP Header 中额外携带时间戳和签名。
|
|
84
|
+
|
|
85
|
+
### 请求 Headers
|
|
86
|
+
|
|
87
|
+
| Header | 必填 | 说明 |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| `Authorization` | 是 | API Key 原始值 |
|
|
90
|
+
| `X-Timestamp` | 是 | 当前 Unix 时间戳(**秒级**) |
|
|
91
|
+
| `X-Signature` | 是 | HMAC-SHA256 签名(**十六进制小写**) |
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
### 签名生成方法
|
|
95
|
+
|
|
96
|
+
签名计算公式:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
signature = HMAC-SHA256(secretKey, payload)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
其中 `payload` 由以下四个部分**直接拼接**而成,各部分之间无任何分隔符:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
payload = apiKey + timestamp + path + query
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
| 组成部分 | 说明 | 示例 |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `apiKey` | `Authorization` Header 的值 | `a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6` |
|
|
111
|
+
| `timestamp` | `X-Timestamp` Header 的值 | `1714000000` |
|
|
112
|
+
| `path` | 请求路径,不含 host 和 query | `/search/v1/reverse` |
|
|
113
|
+
| `query` | 完整查询字符串,含 `?` 前缀;无参数时为空字符串 | `?location=1.46878,103.80373` |
|
|
114
|
+
|
|
115
|
+
**完整 payload 示例:**
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p61714000000/search/v1/reverse?location=1.46878,103.80373
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**请求示例:**
|
|
122
|
+
|
|
123
|
+
```http
|
|
124
|
+
GET /search/v1/reverse?location=1.46878,103.80373 HTTP/1.1
|
|
125
|
+
Host: api.maptec.com
|
|
126
|
+
Authorization: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
|
|
127
|
+
X-Timestamp: 1714000000
|
|
128
|
+
X-Signature: 3a7f8c2e9d1b4f5a6c8e0d2f4a6b8c0e...
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 各语言代码示例
|
|
132
|
+
|
|
133
|
+
**Python**
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
import hmac
|
|
137
|
+
import hashlib
|
|
138
|
+
import time
|
|
139
|
+
import requests
|
|
140
|
+
|
|
141
|
+
API_KEY = "YOUR_API_KEY"
|
|
142
|
+
SECRET_KEY = "YOUR_SECRET_KEY"
|
|
143
|
+
|
|
144
|
+
def call_api(path, query_string=""):
|
|
145
|
+
timestamp = str(int(time.time()))
|
|
146
|
+
payload = API_KEY + timestamp + path + ("?" + query_string if query_string else "")
|
|
147
|
+
signature = hmac.new(
|
|
148
|
+
SECRET_KEY.encode("utf-8"),
|
|
149
|
+
payload.encode("utf-8"),
|
|
150
|
+
hashlib.sha256
|
|
151
|
+
).hexdigest()
|
|
152
|
+
|
|
153
|
+
return requests.get(
|
|
154
|
+
f"https://api.maptec.com{path}",
|
|
155
|
+
params=dict(p.split("=", 1) for p in query_string.split("&")) if query_string else {},
|
|
156
|
+
headers={
|
|
157
|
+
"Authorization": API_KEY,
|
|
158
|
+
"X-Timestamp": timestamp,
|
|
159
|
+
"X-Signature": signature,
|
|
160
|
+
}
|
|
161
|
+
).json()
|
|
162
|
+
|
|
163
|
+
result = call_api("/search/v1/reverse", "location=1.46878,103.80373")
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Node.js**
|
|
167
|
+
|
|
168
|
+
```js
|
|
169
|
+
const crypto = require("crypto");
|
|
170
|
+
const https = require("https");
|
|
171
|
+
|
|
172
|
+
const API_KEY = "YOUR_API_KEY";
|
|
173
|
+
const SECRET_KEY = "YOUR_SECRET_KEY";
|
|
174
|
+
|
|
175
|
+
function callApi(path, queryString) {
|
|
176
|
+
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
177
|
+
const payload = API_KEY + timestamp + path + (queryString ? "?" + queryString : "");
|
|
178
|
+
const signature = crypto
|
|
179
|
+
.createHmac("sha256", SECRET_KEY)
|
|
180
|
+
.update(payload)
|
|
181
|
+
.digest("hex");
|
|
182
|
+
|
|
183
|
+
https.get(
|
|
184
|
+
`https://api.maptec.com${path}?${queryString}`,
|
|
185
|
+
{ headers: { Authorization: API_KEY, "X-Timestamp": timestamp, "X-Signature": signature } },
|
|
186
|
+
(res) => { let d = ""; res.on("data", c => d += c); res.on("end", () => console.log(JSON.parse(d))); }
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
callApi("/search/v1/reverse", "location=1.46878,103.80373");
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**cURL**
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
API_KEY="YOUR_API_KEY"
|
|
197
|
+
SECRET_KEY="YOUR_SECRET_KEY"
|
|
198
|
+
PATH_URL="/search/v1/reverse"
|
|
199
|
+
QUERY="?location=1.46878,103.80373"
|
|
200
|
+
TIMESTAMP=$(date +%s)
|
|
201
|
+
|
|
202
|
+
PAYLOAD="${API_KEY}${TIMESTAMP}${PATH_URL}${QUERY}"
|
|
203
|
+
SIGNATURE=$(echo -n "$PAYLOAD" | openssl dgst -sha256 -hmac "$SECRET_KEY" | awk '{print $2}')
|
|
204
|
+
|
|
205
|
+
curl -X GET "https://api.maptec.com${PATH_URL}${QUERY}" \
|
|
206
|
+
-H "Authorization: ${API_KEY}" \
|
|
207
|
+
-H "X-Timestamp: ${TIMESTAMP}" \
|
|
208
|
+
-H "X-Signature: ${SIGNATURE}"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 签名注意事项
|
|
212
|
+
|
|
213
|
+
| 要求 | 说明 |
|
|
214
|
+
|---|---|
|
|
215
|
+
| 时间戳格式 | 使用**秒级** Unix 时间戳,不是毫秒 |
|
|
216
|
+
| 时间戳有效期 | 请求到达时间与 `X-Timestamp` 之差不超过 **±5 分钟** |
|
|
217
|
+
| query 字段 | 拼接 payload 时需带 `?` 前缀;无查询参数时传空字符串 |
|
|
218
|
+
| 签名格式 | 十六进制小写字符串,**不是** Base64 |
|
|
219
|
+
| Secret Key 安全 | 禁止将 SK 写入客户端代码或放入请求 URL 中 |
|