地图开发培训(mapBox)

mapbox开发整体流程大致如下

 1.引入mapbox

以简单的一个html为例,首先引入mapbox-gl.js以及css文件,如果是在angular项目中,则需要安装对应的npm包。


<script src='https://api.tiles.mapbox.com/mapbox-gl-js/v1.1.1/mapbox-gl.js'></script>

<link href='https://api.tiles.mapbox.com/mapbox-gl-js/v1.1.1/mapbox-gl.css' rel='stylesheet'/>


 2.添加地图

首先需要创建一个id假设为map的div容器,并指定宽高。

var map = new mapboxgl.Map({

  // container id

  container:'map',

  // style location

  style:'mapbox://styles/mapbox/streets-',

  // starting position

  center:[-74.50, 40],

  zoom:9

});


这样就通过mapbox的Map类创建了一个基础地图,通常这些配置信息都从后台接口获取。

 3.创建图层父类

充分利用面向对象思想,首先封装一个基础父类,由于我们大部分的都是点图层,type为symbol(只需要传入图层id和对应的图标),并可以设置默认值,如果是其他类型的图层,则单独在子类中创建,统一在父类里面添加到地图,此外,还包含诸如初始化过程(增加图层,增加图标),控制图层显示隐藏,创建销毁,图层设置数据源等方法。

如下:

constructor(id,layers,icon){

    this.id=id

    //如果layers不是个数组,则表示是普通点类型的layer

    if(!(this.layers instanceof array)){

    this.layers = [

        {

          id: layers,

          type: "symbol",

          layout: {...},

          paint: {...},

          source: {

            type: "geojson",

            data: {

              type: "FeatureCollection",

              features: []

            }

          }

        }

      ];

    }else{ //否则就是其他类型的layer

      this.layers=layers

    }

    this.icon=icon

  ...

}

    init(){...}

    setVisible(){...}

    destroy(){...}

    setData(){}

 4.创建图层子类

归纳有多少个图层,由于TypeScript不支持多层继承,因此建议每一个图层都独立创造一个类继承父类,根据业务不同重写父类的方法以及增加其他方法。

图层主要分为

- 基础图层,是构成地图基础的图像切片,通常包含大量数据——包括标注、建筑等。

- 叠加图层,例如点、线、面,通常包括GeoJSON之类的矢量数据,包含的信息更少,但通常我们都是与这些图层进行交互,可随意的用js进行更改。

例如创建一个厕所点图层toiletLayer类,

constructor(id,layers,icon){

    super('toilet','','assets/img/1.png',)

}

    addLayer(){...}

    addImage(){...}

    setVisible(){...}

    initLayer(){...}

    destroyLayer(){...}

    setData(){}

    ...其他方法

再例如创建一个景区面图层ScenicLayer类,则需要在内部声明layer,type为fill

constructor(id,layers,icon){

    super('scenic',[

        {

          id: 'tb_basis_info_polygon',

          type: 'fill',

          layout: {},

          minzoom: 8,

          maxzoom: 24,

          source: {

            type: 'geojson',

            data: {

              type: 'FeatureCollection',

              features: []

            }

          },

          paint: {

            'fill-color': 'rgb(255,255,255)',

            'fill-opacity': 0.08

          }

        }]

        ,'assets/img/1.png',)

}

    addLayer(){...}

    addImage(){...}

    setVisible(){...}

    initLayer(){...}

    destroyLayer(){...}

    setData(){}

    ...其他方法

source数据源和style属性会在后面提到。

5.地图加载完成后加载图层

map.on('load', function() {

  map.addLayer(.....);

});

  值得注意的是,当且仅当地图数据源加载之后(包括地图样式),地图引擎提供一个加载完成后的回调事件,通知地图加载完成,之后才可以进行加载图层等一系列业务操作。

6.给图层添加数据源

添加新图层时需要添加数据源,图层数据源包括type和url,因此,既支持远程数据源,也支持

从后台获取(通常用这种方式,灵活可拓展),这种方法通常是GeoJSON格式的数据。

标准的geojson数据格式如下:

const geoJson={

  "type": "FeatureCollection",

  "features": [

        {

        "type":"Feature",

        "properties":{},

        "geometry":{

            "type":"Point",

            "coordinates":[105.380859375,31.57853542647338]

            }

        }

    ]

}

其中,features里面是我们需要的要素信息,geometry里面是地理信息,properties则是一些名称等基本信息。可以在定义图层的时候,配置source,也可以用如下办法灵活改变数据源,如要设置刚才景点图层的数据源:

setData(){

    this.map.getSource('tb_basis_info_polygon').setData(data)

}

可通过getSource(layerId)的方法获得这个layer的source,再重新赋值,但通常只赋值一次,因为这个操作消耗的性能很大,切忌频繁使用,有其他替代办法可以逐步增加或修改。

7.图层的样式设置

主要分为Layout和paint属性设置,用于明确图层如何渲染数据,就相当于css,同样是配置化。Layout属性指渲染位置和可见性,应用于渲染过程的早期阶段。paint指更精细的渲染样式,如不透明度、颜色等。不需要大量处理,在后期阶段进行渲染。例如:

map.addLayer({

    id:'test',

    type:'fill',

    source:...,

    layout:{

      visibility:'visible'

    },

    paint:{

      'fill-color':'rgba(61,153,80,0.55)'

    }

  });

即表示设置图层可见,设置面的填充色为rgba(61,153,80,0.55)。

8.图层的特殊表现形式

&nbsp;&nbsp;&nbsp;&nbsp;这部分通常是开发过程中最难的地方,拓展要求最多,例如聚合、

聚合列表、特殊的需要结合canvas等实现的功能

9.地图绑定事件

&nbsp;&nbsp;&nbsp;&nbsp;地图绑定一些鼠标移入、移出、点击、滚动缩放等事件,绑定的对象是map。

一方面可以对整个地图绑定

this.map.on('click',$event=>{

    console.log($event)

})

```

也可以对某一个图层进行单独的事件绑定,如:

```

this.map.on('click','tb_basis_info_polygon',$event=>{

    console.log($event)

})

这样只有在点击这个图层的时候才会触发,如果两者同时设置,则触发的规则和JS原生的冒泡事件一致。

10.创建地图上其他交互组件

如图例,地图上的弹出框,信息框,控制图层的树或者tab,指北针和放大缩小按钮这些基础组件大部分地图引擎自身包含,但需要定制UI,一些特殊的要求也需要重写逻辑,这些都应该单独作为组件。他们之间的交互,以及和地图的交互,我们目前用一套Rxjs的规范去实现组件间的通信。这部分不属于地图部分,先不做详细介绍。

11.参考

更多进阶知识 https://giser.xyz/mapbox-gl-js-cookbook/advance/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350