从网络地图(目前仅支持百度地图)的 API 获取 POI
通过百度地图的 Place API v2 批量获取 POI。
程序根据地级市组织获取 POI 的范围,默认根据关键字和地级市名称搜索 POI。
百度 Place API v2 的搜索结果最多只有 400 条。程序支持分块获取 POI,以突破 400 条的限制。程序内置了全国大部分地级市的矢量面数据(共 362 个地级市,其中 339 个包含矢量数据),从选定城市的矢量数据中获取外包矩形框,根据选定的分块方案对矩形框进行分块,逐分块请求 POI 数据。对于请求得到的 POI,再根据矢量的边界,将边界外的 POI 剔除。
程序所需的数据都存储在 Db\poi.db 中,这是一个 sqlite 文件,其中包含 spatialite 形式存储的矢量。
直接在 Visual Studio 中打开 Poi.sln 即可开发和修改代码。
编译生成程序后,32 位平台将 Dll\x86 文件夹中所有的 dll 文件复制到 exe 生成的文件夹下;64 位平台将 Dll\x64 文件夹中所有的 dll 文件复制到 exe 生成的文件夹下,已存在的 dll 文件跳过或覆盖都可以。再将 Db\poi.db 复制到 exe 生成的文件夹下,程序即可正常启动。
此时程序中并未包含有效的百度地图 API 的校验码。需要在百度地图开放平台中注册账户,创建服务端应用,确保能够支持 Place API v2,并选择“sn校验方式”。创建应用后,获取相应的 AK 和 SK。通过程序的“配置密钥”按钮添加 AK 和 SK,或直接用 sqlite 客户端打开 poi.db,在 dictionary 表中添加正确的 AK 和 SK。添加成功后,即可正确运行程序。
1. POI 的总数是通过 API 获取的,与实际请求获得的总数很可能不同。这可能是由于
(1) 分块不够细密;
(2) 矢量边界与百度地图中地级市的范围不一致;
(3) POI 重复;
(4) 坐标偏移;
等原因造成。
2. 这里的分块策略是均匀分块,而实际 POI 分布并不均匀,如果 POI 分布过于密集,需要很大的分块数量才能完整获取,但过多的分块请求有可能导致配额不足。
3. 分块建议功能就是假设 POI 均匀分布的情况下进行的分块估算,并将估算结果翻倍后的结果,可能远远大于所需分块数量,也可能由于 POI 过于密集而分块不足,因此只是建议,不必受此限制。
4. 对于一次分块获取的结果,如果配额足够,可以加密分块,如果结果数量没有增加,说明已经获取了矢量范围内所有 POI。