Files
Obsidian/MyselfDev/google map places api.md
2026-07-21 14:53:24 +08:00

197 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
**Place ID 是 Google Maps/Places API 中用于唯一标识一个地点(place)的字符串**,常用于构建 URL(如 `https://maps.google.com/?place_id=ChIJ...`)或调用 Places API(如 Place Details)。
### 最简单的方法:使用 Google 官方 Place ID Finder
1. 打开 Google 的 **Place ID Finder** 工具:
- 推荐链接:https://developers.google.com/maps/documentation/javascript/examples/places-placeid-finder
- 或官方文档中的查找器:https://developers.google.com/maps/documentation/places/web-service/place-id
2. 在搜索框中输入地点名称、地址或关键词(例如“上海东方明珠”或具体地址)。
3. 从下拉建议或地图上选择正确的地点。
4. 工具会自动显示 **Place ID**(以 `ChIJ` 开头的一长串字符),直接复制即可。
这个方法最推荐,不需要写代码。
### 通过 Google Maps 网页手动获取(无需 API)
- 在 [Google Maps](https://www.google.com/maps) 搜索并打开你要的地点页面。
- 点击 **分享** → **嵌入地图**(Embed a map),或直接查看页面源代码(右键 → 查看页面源代码,搜索 “place_id” 或 “ChIJ”)。
- 有些 Chrome 扩展(如 “Place ID Finder for Google Maps”)可以点击地点后直接显示 Place ID。
### 通过 Places API 编程获取(推荐用于批量或自动化)
使用 **Text Search**(文本搜索)、**Nearby Search**(附近搜索)或 **Find Place** 等接口,响应结果中会包含 `place_id`。
示例(Text Search):
```
https://maps.googleapis.com/maps/api/place/textsearch/json?query=你的地点名称&key=YOUR_API_KEY
```
响应中会有 `"place_id": "ChIJ..."`。
然后可以用这个 Place ID 调用 Place Details 获取更多信息,或拼接到 URL 中。
### 构建带 Place ID 的 Google Maps URL
- 简单格式:`https://www.google.com/maps/place/?q=place_id:你的PlaceID`
- 或者:`https://maps.google.com/?place_id=你的PlaceID`(你提到的格式)
- 推荐搜索动作:`https://www.google.com/maps/search/?api=1&query_place_id=你的PlaceID`
**注意**:
- Place ID 长期稳定,但 Google 建议如果超过 12 个月,最好刷新一次。
- 使用 Places API 需要启用对应服务并获取 API Key,会有费用(免费额度有限)。
- 对于某些服务区企业(无实体地址),可能需要额外技巧(如查看 “Write a review” 按钮的 data-pid)。
如果你有具体地点名称或地址,告诉我,我可以帮你进一步说明!
---
是否可以将这个程序封装成有gui的界面程序。在界面上加载一个google 地图,或者百度地图之类,通过鼠标可以选择任何一个点,获得其经纬度!
同时,界面提供一个输入框,允许用户输入查询的关键字,如 咖啡店
最终查询的效果可能跟这个命令行差不多!?
npm run scrape "https://www.google.com/maps/place/The+Coffee+Shop/@40.7484,-73.9857,17z"
我的上述需求,是否可以实现?
● 完全可以实现。这个需求的核心是把现有的 CLI 流程变成一个带地图交互的 GUI。
方案分析
有几种实现路径:
方案 A:浏览器 Web 应用 + 本地服务(推荐)
在现有 Node.js 项目基础上,添加一个本地 Web 服务器和前端页面:
- 地图:使用 Leaflet + OpenStreetMap(免费、无需 API Key、全球覆盖)
- 交互:点击地图任意位置获取经纬度,搜索框输入关键词(如 "咖啡店")
- 后端:复用现有的 src/placesApi.ts、src/transformer.ts 等全部代码,通过 API 端点暴露
- 结果展示:在页面上直接渲染 JSON/Markdown 结果
优点:无需额外依赖、免费地图、完全复用现有代码、浏览器打开即用
方案 B:Electron 桌面应用
打包成独立的桌面窗口应用,内嵌地图。
优点:更像"桌面软件"
缺点:Electron 体积大(~150MB),对这个小工具来说过重
方案 C:Python GUI(Tkinter/PyQt + WebView)
优点:Python 生态丰富
缺点:需要把 TypeScript 逻辑用 Python 重写一遍,重复劳动
---
建议
方案 A 最合理。具体来说就是:
浏览器打开 localhost:3000
├── 左侧/上方:Leaflet 地图(OSM 瓦片,免费)
│ ├── 点击任意位置 → 获取经纬度
│ └── 搜索框输入 "咖啡店 北京"
├── 右侧/下方:结果展示
│ ├── JSON 选项卡
│ └── Markdown 选项卡
└── 后端:Express 提供 /api/search?lat=xxx&lng=xxx&keyword=xxx
工作流程:
1. 用户在地图上点击,或在搜索框输入关键词
2. 前端发送经纬度 + 关键词到后端
3. 后端调用 Google Places API(Nearby Search 或 Text Search)
4. 返回结果在前端渲染展示
更好的做法是直接用 Places API 的 nearby search(基于坐标搜索周边),而不是原来的 URL 解析方式,这样更自然匹配地图点击的交互。
---
要我按方案 A开始实现吗?大概需要新增 2-3 个文件(Express 服务端 + HTML 前端页面),不改动现有的 src/ 代码。
---
首先需要确认你的代理是否配置好了。
步骤:
1. 在 .env 中配置代理
HTTPS_PROXY=http://127.0.0.1:你的代理端口
你的代理地址是什么?比如 Clash 一般默认 http://127.0.0.1:7890,V2Ray 一般是 http://127.0.0.1:10809。
2. 启动
npm run gui
看到终端输出 Using proxy: http://... 就说明代理生效了。
3. 使用方式
---
代理已经正常工作了! 但 Google 返回了 403 错误,原因是你 API Key 的限制。
问题
Google API returned:The provided API key has an IP address restriction.
The originating IP address of the call (62.72.181.132) violates this restriction.
你的 API Key 在 Google Cloud Console 里设置了 IP 地址白名单,而你的代理出站 IP(62.72.181.132)不在白名单里。
解决方法
去 Google Cloud Console 修改 API Key 的限制:
1. 打开 https://console.cloud.google.com/apis/credentials
2. 找到你的 API Key:AIzaSyBShHAVWz4caxrAy6X1Abxw4iTXjnSUv3U
3. 在 应用限制(Application restrictions) 中:
- 把 62.72.181.132 加入白名单地址
- 或者直接设为 "无限制"(None)(最简单)
改完后重新 npm run gui 即可。
---
代码本身的修复总结:
- 用 undici 的 setGlobalDispatcher() 来设置代理(而非每个请求手动传 dispatcher),解决了 Node.js 内置 fetch 和 npm
undici 版本不兼容的问题
- 修复了 .env 值的前导空格 bug
- 启动时添加了连通性检测,直接可以判断代理和 API Key 是否正常
---
总结一下排查结果:
发现的问题
1. Bug 修复: places:searchNearby 不支持 textQuery 参数
Google Places API 的 Nearby Search 端点不支持关键词搜索 — 它只接受 includedTypes(预定义的场所类型)。"coffee shop"
这种自由文本只能用 Text Search。
修复: 当有关键词时,自动路由到 places:searchText(Text Search),只在纯坐标搜索时用 places:searchNearby。
2. 网络问题: Google API 在国内被墙
# 你的服务器日志显示的:
[ERROR] Network error during search: TypeError: fetch failed
# 我用 curl 直接测试确认:
* Connection timed out after 10015 milliseconds
# places.googleapis.com 无法从你的网络直接访问
修复: 添加了代理支持。在你的 .env 中加上:
HTTPS_PROXY=http://127.0.0.1:7890 # 换成你的代理地址
然后重新 npm run gui 即可。服务器启动时会显示 Using proxy: http://...。
---