是否有 Maps API 支持地图定制并向查看用户收费?
结论
有可行方案,但免费版 Maps API 通常不允许直接用于收费观看。一般有两种做法:
- 向地图服务商购买商业授权,确保许可范围涵盖付费访问、会员专区或登录后使用。
- 使用 OpenStreetMap 等开放地理数据,自建地图瓦片、地理编码和路线服务,或购买相应的托管服务。
是否可行,主要取决于服务商的许可协议是否允许将地图放在付费墙后,与地图有没有经过定制关系不大。API 允许”商业用途”,也不代表可以按次收费、收取订阅费,或仅向付费用户展示。
为什么免费商业授权通常不够
地图服务通常涉及多个需要分别确认的授权层:
- JavaScript SDK 或客户端 API
- 地图瓦片和底图样式
- 地理数据
- 地理编码与搜索结果
- 路线规划服务
- 缓存、截图、打印及离线使用
某项 API 可以用于商业网站,不代表其返回的数据也可以长期缓存、重新分发或单独销售。常见限制包括:
- 地图必须免费向公众开放;
- 不得将地图或 API 结果作为独立商品转售;
- 不得隐藏服务商标识和版权信息;
- 不得将地图瓦片下载到自己的服务器后重新提供;
- 未经许可,不得用于离线地图;
- 付费墙、会员访问或按次收费需要签订单独合同。
因此,“用户为整个软件付费”和”用户专门为查看地图付费”可能适用不同的条款。
推荐解决方案
方案一:申请企业商业授权
联系 Mapbox、HERE、Esri 或其他地图服务商,说明具体的业务模式,并要求对方书面确认:
- 地图能否仅向登录用户展示;
- 是否允许订阅、按次或按席位收费;
- 是否允许自定义样式和叠加业务数据;
- 是否允许缓存、导出、截图和打印;
- 是否支持离线使用;
- 是否可以隐藏或调整品牌标识;
- 是否有最低消费、调用量或用户数限制;
- 合同终止后能否继续保存历史数据。
不同产品、地区和合同的规定可能不同,不能仅凭”支持商业用途”就认定付费墙符合许可要求。正式上线前,应以当时有效的服务条款和书面合同为准。
方案二:基于 OpenStreetMap 数据搭建地图
OpenStreetMap 数据可以用于商业项目,但必须遵守 Open Database License(ODbL)及署名要求。使用时需要分清以下几点:
- OpenStreetMap 数据可以按照许可证使用;
tile.openstreetmap.org是公共瓦片服务,并非可供商业收费产品随意使用的免费 CDN;- 大规模或收费业务应自建瓦片服务,或者购买明确允许此类用途的第三方托管服务;
- 如果发布基于 OpenStreetMap 数据形成的衍生数据库,可能需要履行 ODbL 的共享义务;
- 自有业务数据是否构成衍生数据库,需要根据具体的数据处理方式判断。
这种方案有较强的控制力,但地图渲染、服务器、缓存、监控、数据更新和容量规划都需要自行负责。
前端实现示例
以下示例使用 Leaflet 加载自有瓦片服务。tiles.example.com 必须指向开发者自建的服务,或已经取得商业授权的瓦片服务,不能直接换成未经许可的公共瓦片地址。
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>会员地图</title>
<link
rel="stylesheet"
href="https://unpkg.com/leaflet/dist/leaflet.css"
>
<style>
#map {
width: 100%;
height: 600px;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script>
const map = L.map('map').setView([31.2304, 121.4737], 12);
L.tileLayer(
'https://tiles.example.com/{z}/{x}/{y}.png',
{
maxZoom: 19,
attribution:
'© OpenStreetMap contributors'
}
).addTo(map);
L.marker([31.2304, 121.4737])
.addTo(map)
.bindPopup('仅限付费用户查看的业务信息');
</script>
</body>
</html>
地图页面应先由服务端完成鉴权。仅在前端隐藏入口并不安全,用户仍可能直接访问瓦片地址。
服务端可以在确认用户的订阅状态后签发短期令牌:
app.get('/api/map-token', requireLogin, async (req, res) => {
const subscription = await getSubscription(req.user.id);
if (!subscription || subscription.status !== 'active') {
return res.status(403).json({
error: 'An active subscription is required'
});
}
const token = createShortLivedMapToken({
userId: req.user.id,
expiresIn: 300
});
res.json({ token });
});
客户端随后携带令牌请求受保护的瓦片:
const response = await fetch('/api/map-token', {
credentials: 'include'
});
if (!response.ok) {
throw new Error('No map access');
}
const { token } = await response.json();
L.tileLayer(
`https://tiles.example.com/{z}/{x}/{y}.png?token=${encodeURIComponent(token)}`,
{
maxZoom: 19,
attribution: '© OpenStreetMap contributors'
}
).addTo(map);
生产环境还应限制令牌有效期、请求来源、用户并发数和访问速率。由于查询字符串可能被记录到代理或服务器日志中,安全要求较高时,应改用受控 Cookie、请求头或带鉴权的瓦片代理。
注意事项
- 不要将”允许商业使用”理解为”允许转售地图访问权”。
- 不要使用公开演示服务器或社区瓦片服务器承载收费产品。
- 除非合同明确允许,否则不要删除版权署名、Logo 或数据来源声明。
- 底图、搜索、地理编码、路线和卫星影像的授权需要分别核对。
- 如果地图中包含卫星影像、行政边界或第三方 POI,还需检查每个数据源的附加许可。
- 在中国境内提供互联网地图服务,还涉及地图合规、测绘资质、数据来源和坐标体系等要求,应由具备相应条件的服务商及法律专业人员确认。
较稳妥的落地流程是先确定收费模式和所需功能,再要求候选服务商书面确认付费墙及转售权限。如果标准合同不允许,可以选择企业定制授权,或改用开放数据并自建基础设施。
备注:内容仅供参考。
