查看原文
其他

源码分析 | 用 Mapbox 做一款安卓共享单车导航 App(下)—— 运营团队端

Mapbox 2019-06-01

共享单车的PM要是早点看到这个教程,可能结果就不一样了吧~


全中文 PDF 源码分析请在公众号后台回复“源码分析”获得!





前情回顾:写给程序媛的源码分析 | 用 Mapbox Android SDK 做一款共享单车 App(上)—— 消费者端


虽然近期的共享单车行业有些风波,但根据麦肯锡预测,截至 2030 年,包括但不限于共享单车的微移动(Micro-mobility)市场在美国将会达到 3,000 亿美元,在欧洲将会达到 1,500 亿美元,在中国将会达到 500 亿美元。


上周我们分享了消费者端的 App 设计,那么对于共享单车的运营团队,如何提高他们的工作效率呢?这篇文章带你一起了解下。


关于作者

这篇教程将会循序渐进帮助你掌握下面的内容:

  • 如何使用移动端 Maps SDK (Android, iOS) 添加 3D 建筑,自定义图标和热力图等。

  • 如何使用 Navigation SDK 在 App 中嵌入导航功能,并使用 Direction API 设置步行、骑行、驾驶等模式。

  • 如何使用 Geocoding API 将坐标转化为地址或者 POI。

  • 如何设计符合自己品牌风格的地图,切换地图模式并自定义图层以便显示不能停车的区域。

  • 一些帮助你提升团队效率的小建议。


我们贴心地为你提供了 Demo 和源码



Step 1:地理空间分析库+高性能可视化 = 高效的运营


实时资产跟踪

结合我们的地理空间分析库,和高性能的可视化,可以做实时资产跟踪,实现对问题的自动化处理和维护。比如显示需要运营团队干预的车辆,这样现场团队可以在没有调度员帮助的情况下获得优先权。


追踪是否符合城市规定

符合当地政策是非常重要的,虽然有时候挺烦的,而且每个城市的规则又不太一样。这种情况下,我们可以使用地理空间分析库来实时追踪基于位置许可的合规性。



提高资产吞吐量

您可以使用这些工具帮助运营人员进行更有策略地进行需求管理,比如使用 Turf.js 增加每天每种资产的使用量。JUMP 使用 Turf.js 预测需求管理,将预计的应用程序打开率和每个十六进制区域的单车数量进行比较,并适当做调整。



通过游戏化激励减轻运营负担

有时候,为了减轻运营负担,我们可以考虑激励用户的方式,让用户帮助我们维护单车网络。在使用 Direction API 推荐路线之前,您也可以使用我们的地理空间分析库发现游戏化、激励等机会。比如引导用户把车停在特定的区域,或者优先为低电量的车辆充电。



Step 2:Navigation SDK 和 Matrix API 保证用户和车辆的合适位置


Navigation SDK

可以通过支持高度定制化的 Navigation SDK 提升用户体验、保持品牌知名度。Navigation SDK 帮助您分配用户到最近的车辆处,并导航到期望的目的地,无需跳转到其他应用。


Matrix API

使用 Matrix API,在不考虑交通方式的情况下,运营者可以为区域团队设计最快、最高效的路线。需要多长时间?满足需求需要多少技术?如何为消费者传达更大的价值?这些类似的问题是我们在关注的。使用 Predictive Large Matrix,借助交通数据,我们可以帮助您解决复杂的优化问题。


通过运行一系列大型矩阵,可以模拟数百万个路径选择,优化求解器可以为您的业务找到最佳解决方案。


热力图

热力图是展示密度和实时趋势比较好的形式,并且您可以使用数据属性来为热力图设计样式。自定义颜色、密度和半径等,还能根据缩放指数控制样式。比如这个例子,运营团队在缩放指数较小的时候可以查看趋势,当放大地图后,热力图层会隐藏,以便显示精细的位置信息。



热力图数据一般可以表达下面这几种场景:

  • 一些地区对车辆有非常迫切的需求

  • 一些地区有很多空闲的车辆

  • 一些地区有一些老用户(比如上周、上个月或者去年用过)

  • 一些地区经常有很多车停在那里

  • 一些地区车辆使用频率非常高,比如旅游景区

  • 一些地区需要更多的车辆(运营团队建议或者充电桩比较多)


如何在 app 中嵌入热力图呢?我们可以使用 Mapbox Studio 中 Datasets 部分,创建一些独立的 GeoJSON Points。过去我们会把 dataset 导出为 tileset。使用 Maps SDK,我们从 Mapbox 账户中检索这些数据并将它设置为 VectorSource,把 VectorSource 设置为参数创建 HeatmapLayer 并加载到地图中。


具体实现方法可以参考下面的代码。


private void addHeatmapData(@NonNull Style loadedMapStyle) {
loadedMapStyle.addSource(new VectorSource(HEATMAP_GEOJSON_SOURCE_ID,
"mapbox://langsmith.cjfsu62ap010i2qrxti214ub6-3pa5v"));
HeatmapLayer heatmapLayer = new HeatmapLayer(HEATMAP_LAYER_ID, HEATMAP_GEOJSON_SOURCE_ID)
.withProperties(
heatmapWeight(interpolate(linear(), zoom(),
stop(0, 4),
stop(6, 10),
stop(MAX_HEATMAP_LAYER_ZOOM, 12))),
heatmapOpacity(.6f),
heatmapRadius(interpolate(linear(), zoom(),
stop(0, 2),
stop(9, 7),
stop(MAX_HEATMAP_LAYER_ZOOM, 12))));
heatmapLayer.setMaxZoom(MAX_HEATMAP_LAYER_ZOOM);
heatmapLayer.setSourceLayer("GoShare_Heatmap_Locations");
loadedMapStyle.addLayerBelow(heatmapLayer, NO_PARK_ZONE_FILL_LAYER_ID);
}


 总结


将近两万字的教程终于介绍完了,我们发现原来地图上可以加载这么多的内容啊!这个项目是开源的,欢迎到 Github repo 中提交建议。


如果你在实现的过程中遇到任何问题,可以在 Github repo 中开一个 issue,并发邮件到 tarani@mapox.com 或者 langston.smith@mapbox.com。




原创不易,欢迎转发给你身边感兴趣的小伙伴。


全中文 PDF 源码分析请在公众号后台回复“源码分析”获得!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存