PAYATHON 2026

是否有 Maps API 支持地图定制并向查看用户收费?

数据小陈

结论

有可行方案,但免费版 Maps API 通常不允许直接用于收费观看。一般有两种做法:

  1. 向地图服务商购买商业授权,确保许可范围涵盖付费访问、会员专区或登录后使用。
  2. 使用 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:
          '&copy; 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: '&copy; OpenStreetMap contributors'
  }
).addTo(map);

生产环境还应限制令牌有效期、请求来源、用户并发数和访问速率。由于查询字符串可能被记录到代理或服务器日志中,安全要求较高时,应改用受控 Cookie、请求头或带鉴权的瓦片代理。

注意事项

  • 不要将”允许商业使用”理解为”允许转售地图访问权”。
  • 不要使用公开演示服务器或社区瓦片服务器承载收费产品。
  • 除非合同明确允许,否则不要删除版权署名、Logo 或数据来源声明。
  • 底图、搜索、地理编码、路线和卫星影像的授权需要分别核对。
  • 如果地图中包含卫星影像、行政边界或第三方 POI,还需检查每个数据源的附加许可。
  • 在中国境内提供互联网地图服务,还涉及地图合规、测绘资质、数据来源和坐标体系等要求,应由具备相应条件的服务商及法律专业人员确认。

较稳妥的落地流程是先确定收费模式和所需功能,再要求候选服务商书面确认付费墙及转售权限。如果标准合同不允许,可以选择企业定制授权,或改用开放数据并自建基础设施。

备注:内容仅供参考。