Mapmost上掘金头条了?作为Mapbox的国产平替,有什么亮点?

2,589 阅读22分钟

前言

今天打开掘金,忽然发现Mapmost的双十二促销活动出现在了广告位上

官网地址:www.mapmost.com/#/?source=i…

image.png 感觉很恍惚,才半年多过去,商业化进展已经这么快了吗?3月份偶然发现它家的产品,写了一篇体验文章,当时觉得是Mapbox平替,引来了不少争论,大家对戏褒贬不一。

juejin.cn/post/734227…

image.png

这段时间又深度试用了他们家的产品,总得来说可圈可点, 这里把体验写下来给大家参考。

Mapmost对比Mapbox有什么亮点

1.熟悉的用法(和Mapbox一致)

不多说,你们自己看,与Mapbox初始化相比,只有授权密钥的差异,一个是accessToken,一个是userId

// Mapbox GL JS 初始化地图代码
mapboxgl.accessToken = 'pk.eyJ1Ijoiemh1ZHMiLCJhIjoiY2xoZnN5a28xMTl2bzNlcGMzcGJtczlzZCJ9.7pIETMtazm_6Y0boWAnl4A';  
    const map = new mapboxgl.Map({  
    container: 'map', 
    style: 'mapbox://styles/mapbox/streets-v12', 
    center: [-74.5, 40], 
    zoom: 9, 
});


// Mapmost SDK for WebGL初始化地图代码
let map = new mapmost.Map({
    userId: '42ef2968a4d13d46ccb4a510e473831a4fa05291bdab9b936b983dc2f4af3cac',
    container: 'map',
    style:  'https://www.mapmost.com/cdn/styles/sample_data.json'
    center: [-74.5, 40], 
    zoom: 9,

  });

在地图接口设计和文档编排上基本都是一样的,照顾了大部分Mapbox用户,减少迁移和重构的成本

image.png

image.png

2.支持标准的MVT(Mapbox Vector Tile)

这点是我比较关心的,虽说是平替,但不是太过丸美,因为不能直接加载Mapbox官方的MVT服务,问了一下客服,说也是可以加载标准的MVT服务,只能加载他们的产品发布的emmm。。。。。 image.png

不过好消息是,Mapmost官方也提供了一个Studio,可以发布矢量地图服务,此外也支持发布影像、地形和倾斜服务,感兴趣的可以去看看。

Mapmost Studio www.mapmost.com/#/layout/st…

image.png

我登上Mapmost Studio,打开看了一下渲染效果和服务结构,就是标准的MVT,这样兼容性问题是解决了,算是能闭环了, 真的是妙啊,Mapbox Studio和Mapmost Studio,你品,你仔细品。

MVT(Mapbox Vertor Tile)docs.mapbox.com/data/tilese…

image.png

mapmost studio mvt.gif

而且也支持在线编辑MVT的样式,操作逻辑和 Mapbox Studio以及高德地图的GeoHUB类似。 image.png

另外它们文档地图样式文件的描述也是一致的,服务格式都一样。

www.mapmost.com/mapmost_doc… image.png


这里与客服回答的一致,服务确实与Mapbox不通用,两家的SDK和MVT都不能互相兼容,我尝试用Mapmost SDK for WebGL加载Mapbox官方的示例服务,并不能渲染,控制台抛了错误。

let map = new mapmost.Map({
    userId: '42ef2968a4d13d46ccb4a510e473831a4fa05291bdab9b936b983dc2f4af3cac',
    container: 'map',
    style:  'mapbox://styles/mapbox/streets-v12',  
    center: [120.71923008473078, 31.29446443371741],
    zoom: 14.7,
    sky: 'light',

  });

image.png

猜测是做了产品之间的绑定或者加密处理,不过这个无伤大雅,毕竟是要赚钱的。

此外对于矢量图层的操作接口,都是和Mapbox一致的,可以无缝衔接,这里就不再赘述了。

image.png

image.png


3.扩展了模型(glb、fbx、obj)图层加载和操作API

之前一直有在地图上加载3D 模型的需求,特别是一些三维可视化以及数字孪生类的项目,这点Mapbox没有原生能用的API,目前的处理方式是:

  1. 使用Three.js+对应模型的Loader导入模型
  2. 结合Mapbox GL JS 的自定义图层加载到地图上
  3. 然后渲染时做矩阵同步和坐标转换
<script src="https://unpkg.com/three@0.126.0/build/three.min.js"></script>  
<script src="https://unpkg.com/three@0.126.0/examples/js/loaders/GLTFLoader.js"></script>

const customLayer = {  
    id: '3d-model',  
    type: 'custom',  
    renderingMode: '3d',  
    onAdd: function (map, gl) {  
        this.camera = new THREE.Camera();  
        this.scene = new THREE.Scene();  
        // use the three.js GLTF loader to add the 3D model to the three.js scene  
        const loader = new THREE.GLTFLoader();  
        loader.load(  
        'https://docs.mapbox.com/mapbox-gl-js/assets/34M_17/34M_17.gltf',  
        (gltf) => {  
        this.scene.add(gltf.scene);  
        }  
);  
this.map = map;

//...

render: function (gl, matrix) {  
    const rotationX = new THREE.Matrix4().makeRotationAxis(  
        new THREE.Vector3(1, 0, 0),  
        modelTransform.rotateX  
    );  
    const rotationY = new THREE.Matrix4().makeRotationAxis(  
        new THREE.Vector3(0, 1, 0),  
        modelTransform.rotateY  
    );  
    const rotationZ = new THREE.Matrix4().makeRotationAxis(  
        new THREE.Vector3(0, 0, 1),  
        modelTransform.rotateZ  
    );  

    const m = new THREE.Matrix4().fromArray(matrix);  
    const l = new THREE.Matrix4()  
    .makeTranslation(  
        modelTransform.translateX,  
        modelTransform.translateY,  
        modelTransform.translateZ  
    )  
    .scale(  
    new THREE.Vector3(  
        modelTransform.scale,  
        -modelTransform.scale,  
        modelTransform.scale  
    )  
)

image.png

大致数了一下,实现模型上图,至少60行代码,涉及到2个额外的库,虽说能用,说实话确实不好用,不仅实现繁琐,同时功能单一,满足不了生产项目需求,而且对开发的水平要求较高。

再看一下Mapmost的做法,这里是直接扩展了一个图层类型{ type: 'model'}, 6行代码就能实现模型上图。

map.on('load', function () {  
    let models_obj = ["../example_data/jinji_plaza_eastern_door_building.glb"].map(item => ({  
        type: 'glb',  
        url: item,  
    }));  

    let options = {  
    id: 'model_id',  
    type: 'model',  
    models: models_obj,  
    center: [120.67727020663829, 31.31997024841401],  
     callback: function (group, layer) {           
     }  
    };  
    map.addLayer(options);  
})

image.png

sdk加载精模2.gif

我在他们文档上也看到了对应类型的描述,基于Mapbox原有的addLayer方法,新增了一个类型

image.png

另外不像Mapbox只能加载看看,这里还配套给出了很多细粒度的模型图层操作API,诸如旋转、缩放、平移、高亮、淡入淡出动画、属性选择、坐标拾取等等,用于组合实现一些复杂的业务功能。

image.png

image.png

用法也比较简单,以模型高亮为例,这里提供了三个APIselectModeloutlineModelunOutlineModel,选中-高亮-取消高亮:

map.on('click', function (e) {  
    let intersect = modelLayer.selectModel(e.point)[0];  
    if (intersect && intersect.point) {  
        // 高亮选中模型  
        modelLayer.outlineModel([intersect.object], {  
            scope: 'model', // 模型轮廓范围:layer、model、default  
            edgeStrength: 3.0, // 轮廓强度系数  
            edgeGlow: 0.0, // 轮廓发光稀释  
            edgeColor: '#0000ff', // 轮廓颜色  
            enableFillColor: true, // 轮廓内部是否填充  
            fillColorOpacity: 0.2, // 轮廓内部填充颜色不透明度  
        });  
    } else {  
        // 取消高亮选中模型  
        modelLayer.unOutlineModel();  
    }  
});

这个确实要点赞,不仅方便了不少,而且有更多新的用法,其实不难看出来,这背后很多应该是「从实际业务场景中抽象出来的通用接口」。

以这个批量模型加载与更新为例,你可以发现这就是一个 「大规模人员点位上图的应用案例

www.mapmost.com/mapmost_doc…

image.png


如果你深入研究,甚至可以解锁更多玩法,通过调节图层样式和模型,还能做出更加趣味的风格。 image.png

4.原生支持加载3Dtiles

很遗憾,Mapbox的SDK也不能原生支持加载3Dtiles, 目前的处理方式是通过deck.gl扩展,利用Mapbox GL JS的自定义图层实现,这也是官方给的参考:


// 引入相关依赖
import {MapboxOverlay as DeckOverlay} from '@deck.gl/mapbox';
import mapboxgl from 'mapbox-gl';
import {onMounted} from "vue";
import {Tile3DLayer} from 'deck.gl'
import { Tiles3DLoader } from "@loaders.gl/3d-tiles";
 

let map
mapboxgl.accessToken = '...';
let deckOverlay = new DeckOverlay({
  interleaved: true,
  layers: []
});
 
onMounted(() => {
  map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/streets-v12',
    center: [118.94811, 33.01413],
    zoom: 15,
    pitch: 30,
    bearing: 0
  });
 
  map.addControl(deckOverlay);
  map.on('load', () => {
   // 三个参数分别为模型名称,模型id,加载3d tiles对应的url
   // url来源于使用cesiumLab发布的服务地址
   load3DTiles('cs_model','cs_model','.../tileset.json')
  });
})
 
function load3DTiles(name, id, url) {
  const layers = deckOverlay._props.layers;
  deckOverlay.setProps({
    layers: [
      ...layers,
      new Tile3DLayer({
        id: id,
        name: name,
        data: url,
        loader: Tiles3DLoader,
        extruded: true, // 设置3D功能
        opacity: 1, // 设置透明度
        loadOptions: {
          "3d-tiles": {
            loadGLTF: true,
            decodeQuantizedPositions: false,
            isTileset: "auto",
            assetGltfUpAxis: null
          }
        },
        pickable: true, // 设置可选取
        onTilesetError: (err) => {
          console.log(err);
        },
        onTilesetLoad: (tileset) => {
          console.log(tileset);
          const { cartographicCenter, zoom } = tileset;
          deckOverlay.setProps({
            initialViewState: {
              longitude: cartographicCenter[0],
              latitude: cartographicCenter[1]
            }
          });
          map.jumpTo({
            center: [cartographicCenter[0], cartographicCenter[1]],
            zoom: 15
          });
        },
        pointSize: 2
      })
    ]
  });
}
</script>
 
<style>
body {
    margin: 0;
    padding: 0;
}
 
#map {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 100%;
}
</style>

image.png

先不说写这么一堆有点麻烦,关键是还要引入别的库,维护起来很是难受,而且对3Dtiles的图层操作API也很少,更多的是加上去看看,缺少交互功能。

反观这点Mapmost的做法和加载模型一致,同样基于Mapbox原有的addLayer方法,扩展了对3Dtiles的支持:{ type: '3dtiles'}

image.png

image.png

使用Mapmost SDK for WebGL加载3Dtiles服务

const map = new mapmost.Map({  
    container: 'map',  
    style: "********.json",  
    center: [120.74449559193792, 31.30775326748954],  
    zoom: 16,  
    pitch: 60,  
    userId: '***', // 授权码  
});  
  
map.on('load', function () {  
const TILESET_URL = "*******tileset.json";  
    map.addLayer(  
        {  
            id: 'tile-3d-layer',  
            type: "3DTiles",  
            data: TILESET_URL,  
        }  
    )  
})

image.png

另外也配套给出了坐标拾取属性拾取高亮平移等接口。

总得来说,作为一个商业化产品,用法就应该做的足够简单,且品类要丰富。

image.png


另外提一下地形服务加载,这里基本和Mapbox用法和效果一致,在渲染效果上目测高于Maobox,不知道是不是我的错觉。


// Mapmost SDK for WebGL加载地形
map.addSource('mapmost-dem', {
  'type': 'raster-dem',
  'tiles': '****terrain/{z}/{x}/{y}.png', 
  'tileSize': 512,
  'maxzoom': 14
});
map.setTerrain({
  'source': 'mapmost-dem',
  'exaggeration': 1.5  
});

地形.png

// Mapbox GL JS加载地形
map.addSource('mapbox-dem', {  
    'type': 'raster-dem',  
    'url': 'mapbox://mapbox.mapbox-terrain-dem-v1',  
    'tileSize': 512,  
    'maxzoom': 14  
});  

map.setTerrain({
'source': 'mapbox-dem', 
'exaggeration': 1.5 
});

image.png

5.内置Three.js模块,支持自定义扩展

其实不难看出,Mapmost加载模型的功能是基于Three.js实现的,这点他们也不藏着掖着,就直接告诉你我集成了Three模块mapmost.THREE

// 世界坐标->标准坐标->屏幕坐标  
let world_vector = new mapmost.THREE.Vector3(position.x, position.y, position.z); 

image.png

我打印了一下模型加载后的回调参数,发现里面有完整的网格group image.png

image.png

这样的话我们就可以做更多的事情,three.js中对模型的API操作你都可以用,也就是说把地图场景和三维场景结合的同时,还给你留了一个扩展的入口

let obj = models.children[0].children[0];  
// 坐标系参考,红绿蓝表示 xyz 轴  
const axesHelper = new mapmost.THREE.AxesHelper(500);  
models.children[0].add(axesHelper);  
// 模型放大2倍  
obj.scale.set(2, 2, 2)  
// 模型沿 X 方向平移 20 米  
obj.translateX(20)  
// 模型绕 Y 轴旋转 90  
obj.rotateY(Math.PI / 2);

如果你愿意,甚至可以重写mapmost模型图层的渲染函数,这就很好玩了。

image.png


6.标准的地图操作逻辑

目前Mapmost的三维地图操作逻辑是这样的:

  • 左键双击缩放地图层级
  • 长按右键旋转地图视角
  • 长按左键拖动地图
  • 鼠标滚轮快速缩放地图层级

mapmost地图操作逻辑.gif

严格意义上来说,这个并不算亮点,毕竟Mapbox也是如此, 但是看到Mapmost内置了Three.js,就开始有点担心是不是纯三维模式,因为之前用过Three.js和Cesium,和常见的地图操作逻辑不同,要长按滑轮旋转视角,可谓是相当难受:

image.png

不过现在看来是多虑了, Mapmost的三维地图仍然是地图的操作逻辑。


7.空间分析能力

这块的功能是Mapbox相对缺失,恰恰是Mapmost的一个创新点。

image.png

在一些复杂的场景中,会用到专业的GIS空间分析能力,比如建筑领域,规划楼层间距以及房屋密度的时候,经常会用到可视域分析通视分析,来提前帮我们判定视野范围以及遮挡情况。

通视分析.gif image.png image.png 通视分析1.gif

8.多格式数据融合加载能力

我看文档上描述,Mapmost SDK for WebGL支持以下类型数据和服务格式融合渲染:

 (1)栅格地图服务:支持天地图、ArcGIS静/动态服务、WMS服务、WMTS服务和TMS服务。
 (2)矢量地图服务:仅支持 Mapmost Studio 发布的矢量切片服务
 (3)矢量数据:支持GeoJSON(EPSG:4490/EPSG:4326)数据
 (4)三维模型:支持gltf/ glb/ fbx / obj 格式三维模型
 (5)倾斜数据模型:由Cesiumlab发布的3DTiles(不支持纹理合并)
 (6)点云:由Cesiumlab发布的3DTiles
 (7)地形服务:地形支持Terrain-RGB格式
 (8)I3S服务

image.png

这里有意思的是MVT只支持他们自己的产品发布的,3DTiles却兼容Cesiumlab发布的。

这么多类型的数据同时支持,确实是一个系统工程,除了格式上要做兼容以外,在接口适配、坐标系同步、性能优化、视觉效果、实用性等层面需要做很多工作,这个算上一个具有创新性的亮点。


9.内置着色器(Shader)和后处理(Post-Processing)API

我想做过三维开发的同学都遇到过,现在一些客户对项目要求越来越高,不仅实用还要好看,最好有些科技感的特效或者动效,但大多数WebGIS的开发人员很少或者没有接触过图形学编程,所以实现三维特效对他们来说确实有点难度,比如下面这些:

image.png image.png image.png

我最初还是从Three.js中接触到着色器相关的知识,可谓是磕磕绊绊。

Three.js自定义着色器 GLSL :baike.baidu.com/item/GLSL/2… image.png image.png


但是在Mapmost中,提前内置了一些常用的着色器接和后处理接口,我们只需要改改参数就行了,GLSL他们内部已经实现了。

例如:使用Mapmost实现一个粒子能量球

let options = {  
    id: 'model_id',  
    type: 'model',  
    callback: function (group, layer) {  
    let sphere = layer.addSphere({  
        color: "#ff0000",  
        radius: 100,  
        wSegment: 64,  
        hSegment: 64,  
        phiLength: 180,  
        speed: 3,  
        opacity: 0.8,  
        center: [120.74579465203592, 31.30505899929158, 0.0]  
    });  
    }  
};  
map.addLayer(options);

sdk能量球.gif

而且你不难发现,所有的效果都是基于真实经纬度坐标渲染的,以这个地理围栏特效为例,你发现围成这个围栏的数据都是具体的坐标点,这个和GeoJSON的渲染方式很类似:

let GeoFencingDiffuse = layer.addGeoFencing({  
    type: "diffuse",  
    color: "#fff60c",  
    speed: 3,//速度  
    opacity: 0.8, //透明度 
    height: 29.6, //高度 
    data: {  //坐标点位数据
        coordinate: [[120.673884481865016, 31.31845122412421], [120.673892295086972, 31.318434601677584], [120.673896695221984, 31.318416044287087], [120.673913297536004, 31.318339436152087], [120.674082076222007, ]  
    }  
});

地理围栏.gif

当然也可以通过不同的接口组合,做一些炫酷的场景。

这块一开始我想的是作为前面的模型图层的原子API使用的,后来发现还是想简单了,Mapmost的着色器和后处理API是可以作用在整个地图场景上,这点无疑是个小惊喜。

全场景设置三维描边 image.png 三维场景颜色调整 三维场景颜色调整.gif

可能是出于方便用户理解的考虑,官方把这些接口归纳到【三维效果】和【三维场景设置】里面去了。

www.mapmost.com/mapmost_doc…

image.png image.png


那么如此一来,我们可以根据项目的需求以及应用场景,结合这些API,做出不同风格的三维地图。

基于内置着色器的三维特效

//模型渐变特效
  const  addModelEffect = () =>{
  
    Layer.addModelEffect(Group, [{
        type: "gradient",
        startColor: "rgba(63, 177, 245,.5)",
        endColor: "rgba(58, 142, 255,.8)",
        opacity: 0.9,
        percent: 0.5
    }, {
        type: "flow",
        speed: 1,
        color: "rgba(241, 99, 114, .4)",
        opacity: 0.9,
        percent: 0.05
    }])
    Group.addFrame(0x3FB1F5);

  }
 //能量球
  const addSphere = () => {
        
    let sphere = Layer.addSphere({
        color: "rgb(53, 108, 222)",
        radius: 3300, //半径,单位米,默认为10米
        segment: 1024, //构成圆的面片数
        phiLength: 180,
        speed: 3,
        opacity: 1,
        center: [120.67943361712065, 31.306450929918768]
    });

    let sphere2 = Layer.addSphere({
        color: "rgb(219, 74, 51)",
        radius: 2300, //半径,单位米,默认为10米
        segment: 1024, //构成圆的面片数
        phiLength: 180,
        speed: 6,
        opacity: 1,
        center: [120.67727020663829, 31.31997024841401, 0.0]
    });
}

特特效集合.gif

基于后处理特效的多风格地图

image.png

对比SuperMap(超图) 和ArcGIS

这里就不比了,上面毕竟是gis行业老大哥,产品全、功能强、服务好、当然价格也贵得离谱。

image.png

image.png

image.png

Mapmost的一些不足之处:

接口功能上目前看下来算是够用,主要还是在用户体验这块,和3月份相比提升并不是很明显:

1.案例不支持在线编辑

一开始看他家文档上案例很多,想在线体验一下,没想到点进去全是动图,还得把代码复制到本地跑,说实话有点失望。

image.png

同类产品都有在线编辑器,修改保存后就能在线看效果,高德地图做的就很好, 这个功能并不难实现,希望Mapmost官方尽快优化吧。

image.png

2.捆绑销售

最开始我只想买一个SDK试试,因为我对矢量地图没有强需求,更感兴趣的是三维模型,但是发现他们的产品不单卖,都要捆绑 Mapmost Studio 销售,这就有点难受了。

image.png

如果单出一个SDK,把价格降一降,或者推出购物车,让用户自己选购,需要什么买什么,我觉的更合理一些,类似于超图这种。

image.png


3.文档不够细致

作为一个商业软件,首先得有卖相,个人觉得Mapmost内容是有了,但对比另外几家图商的文档,还是有些问题:

  • 字号太多,字体大小粗细不一,颜色对比度过高,没遵守设计规范
  • 配图随意,图片太糊,视觉效果打折扣,看起来比较随意廉价
  • 缺少暖色调,过于冷淡,缺少名词解释,更像是「技术文档」,而不是「产品文档」
  • 部分章节内容的衔接缺乏逻辑和递进关系,经常不知道下一步怎么办
  • 文字描述缺少亲和力,像是在命令,而不是指导用户使用,没有我们这种称呼
  • 少了一些元素点缀,如提醒、警告、建议等,页面内容单一,平铺直叙.

Mapmost的文档

image.png

image.png

image.png

再来看看同行业的产品文档:

Mapbox的文档 image.png image.png

高德地图的文档 image.png image.png

超图的文档 image.png image.png


不过对于程序员来说不影响食用,但对Mapmost官方来说是拉低了产品形象。

4.教程太少

关于社区和教程,作为开发者,这是我比较关心的内容,和他们客服聊了一会,得知他们在B站、知乎、公众号上都开了官号

image.png image.png

image.png

主要的视频教程都放在了B站上,知乎和微信上是一些科普和技术教程, 中间夹杂一些广告。

image.png 不过你仔细找找,课程也有,不过很少,基本是一些碎片化的教程。

image.png

这块可以向超图学习,出一些产品的系列课程或者免费课程,让更多的人有办法使用你们家的产品,另外课程本身也能作为产品的资源出售,也算是一举两得了,我想更多学生用户喜欢看着视频学习。

超图GIS学堂 edu.supermap.com/#/Index image.png


5.缺少mapbox3.0最新特性

没在Mapmost上看到Mapbox3.0的新特性,比如标注样式、灯光、矢量地图样式改进、阴影等,估计是还没适配,期待更新吧。

image.png

Mapbox 3.0 三维地图昼夜切换效果 image.png


为什么Mapmost是收费的?

因为太老实,这是我能想到的答案:

image.png

地图商免费背后的陷阱

SDK免费

很多人说Mapbox、Cesium、百度地图免费啊,他们的SDK确实免费,可以随便用,甚至还提供CDN和github源码。

image.png

image.png

服务花大钱

但是事实真的不用花钱吗? 仔细看看他们的官网,不难发现收费项都是【服务】,无论是地图数据服务还是后端分析服务,都是按量收费的,相当不便宜。

以Mapbox GL JS 商业授权为例, 10万次的调用量就要250美元(约合人民币1800元),也就是说你这个地图被用户打开10万次就得给他们1800元

www.mapbox.com/pricing#map…

mapbox sdk调用次数定价.jpg

这还只是一个光秃秃地图,图层服务和查询API还要额外收费。

mapbox地图服务资源定价.jpg

百度和高德也是如此,收费甚至还更贵,不过这不能怪人家,毕竟在国内是顶级图商,主打C端用户,质量这块还是有保证的

高德地图api定价.jpg 百度地图定价.jpg

当然还有其他一些厂商,大都是这种模式,免费给你用,但要用的爽就得掏钱,以至于后面我一看到【免费】2字就PTSD。

看到这我想大家应该明白了,所谓的免费,相当于说请你吃饭,给你一碗饭,但是菜按量收费,【倒不如一开始就告诉我没有免费的午餐吃了,饭菜都要收钱】,当然你不用的我的也可以,你自己做数据和服务也行,但这个技术成本就上来了。

image.png


另一方面,介于中美两国的关系比较微妙,如今国内很多政企项目,在软件采购上面更加倾向于国产化,同时要私有化部署、数据服务本地化、还要支持国产信创软硬件,就这几点点要求,Mapbox注定在中国市场很难存活。

我身边这样的例子也不少,前期免费产品用着有多少爽,后期迁移就有多痛苦。

image.png

况且2021年Mapbox退出中国后,国内官网无法访问,知乎和微信公众号停运,相关教程停更,国内程序员要翻墙到外网才能看到文档,对项目组来说学习成本巨大,仿佛看到了当年谷歌退出中国。

mapbox退出中国.jpg

当然并不是说Mapbox不行,我个人最喜欢用的就是Mapbox,他们的产品系列是我用过最全的一家,号称世界上最美的地图也不是吹的,符合多数人的审美,退出中国我还是觉得挺遗憾的。

开不开源这件事

Cesium:可能以后就不开了

再说开源,2024年,Cesium 被 Bentley 收购,这个消息在业内造成了不小的轰动,而 Bentley本身就没有开源的基因,吃相更难看,这意味着什么就不言而喻了,我了解到一些同行之前用Cesium就在找替换品了,生怕哪天忽然收费了措手不及 。

cesium被Bentley收购.jpg cesium被Bentely收购.jpg

至于国内的Cesiumlab,本身就是彻头彻尾的商业化公司,不过也算是敞亮,一开始就告诉你用我的东西要花钱。

www.cesiumlab.com/cesiumlabpu…

image.png

有意思的是他们把源码都拿出来卖了, 这也算是【开源】吧。 image.png

Mapbox:开了,但又没完全开

Mapbox GL JS 1.0,这个版本是在开源许可下发布的。对于1.0版本,用户可以在开源许可证(如BSD、MIT等)的条件下,自由地使用、修改和分发代码,而无需支付费用或遵守严格的商业条款。

image.png

到了Mapbox GL JS 3.0,情况就不同了。从2.0版本开始Mapbox GL JS采用商业许可模式,说明3.0版本很也是商业许可,这意味着使用3.0版本的用户需要根据Mapbox的定价策略来购买使用许可,且可能受到一些使用上的限制

image.png image.png

想想也是合理的,毕竟3.0版本是一次大更新,伴随着在中国推广的不顺利,市场占有率有所收缩,官方也不想给白嫖了,所以说开源本身就是「伪命题」,免费的背后才是最贵的。

况且在当前的经济大环境下,大家都要赚钱吃饭,谁也不能一直「为爱发电」, 你看连尤大也开始众筹了。

image.png

不过话又说回来,SDK本身收费确实怪怪的,我还没体验,就开始付钱,这个有违背常识,尤其是在程序员的角度,很多人都理所当然的认为工具本身不该收费,所以这里提个小小的建议,如果Mapmost官方能刷到这篇文章,可以考虑出一款免费版的SDK,然后推出其他服务收费项

比如你们家 Mapmost Alpha 内置的全国的矢量地图,我是真的喜欢,还能一键换风格,如果能拿出来单卖我肯定愿意付费。

image.png

image.png

image.png


所以,到这里,我认为Mapmost还是收费比较诚实,你花钱买个安心服务。

Mapmost值不值花钱买?

首先肯定:值得花钱体验

我是花1999买了一年,虽说是Mapbox平替,但的确有不少创新点,比如三维模型和后处理相关的API,恰恰是我需要的,因为本身我就在用mapbox,可以平滑的迁移过去。

image.png

image.png

因为整体来看,Mapmost更像是一个具有国GIS内行业特色的Mapbox,这点和超图类似,不过他们目前好像没有面向C端的产品,目前的几款产品都是基于业务需求深度定制,主打toB和toG市场,对国产化适配还算可以,因为本身我们就做政府类的项目比较多,这块还是比较吸引我的。

Mapmost官网宣传资料

image.png

如果你是想体验一下,也可以花99买一个教育版的看看,毕竟产品本身的价值远超这个价格。如果你是项目上在用,趁着活动期间4折买一年,最重要的是,最近他们搞活动送【智慧工厂】和【智慧园区】项目源码,我打开跑了一下,质量还挺高的,带有完整的交互和业务逻辑。

这大概是我看到过赠品里面最好看的了

image.png

智慧园区项目源码 image.png image.png image.png

智慧工厂项目源码 image.png image.png image.png image.png

模型、UI素材能给的都给了,感觉源码的价格都比产品本身要值钱,1999也是很值得。 image.png

另外整个项目都是他们SDK已有的接口开发的,所以也是学习的好途径。


Mapmost的其他产品

我看他们也出了类似于Cesium for Unreal的 SDK,这块我不是很感冒,也就没去体验,至于Mapmost SDK Lite 没点进去看过。

image.png

还有就是Mapmost Alpha,一个低代码平台,我之前有篇文章也发过了,功能有些单一,不过里面的地图资源挺多的,感兴趣的可以去体验下。

image.png

最后

没想到断断续续写了4万多字,提到国产,尤其是在软件这块,给大家的固有印象就是【东施效颦】,不过这个也好理解,毕竟我们人生中第一门编程语言都是外国人发明的,习惯这件事一旦养成很难替换,但换个角度考虑一下,国产软件多一家,我们就多了一种选择,商家内卷利好我们普通用户。

另外,本次文章不针对任何一个厂家,各家的产品都有优缺点,我是站在用户的角度客观评测,希望大家能理性选择。