基于mapbox搭建可离线的矢量切片地图服务-4.Mapbox样式设计

本文详细介绍了Mapbox的样式设计思想,通过实例展示了如何对地图元素如道路进行丰富渲染,包括线渲染、符号渲染等。还探讨了Mapbox在线样式编辑器的使用,包括缩放显示、属性过滤、分级和属性输出等关键功能,并提供了一个包含这些特性的样式例子。文章最后简要预告了下篇将讨论的离线部署项目实现。
摘要由CSDN通过智能技术生成

作者:ATtuing
出处:http://www.cnblogs.com/ATtuing

最近在做关于mapbox的项目,看到这篇文章感觉特别好,特此转载记录一下。
先不说废话直接上地址:(所有东西都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵)。
01:中国地图:http://test.sharegis.cn/mapbox/html/3china.html
02:德国-德累斯顿市:http://test.sharegis.cn/mapbox/html/6germany.html

1.Mapbox设计思想

下面我们以一条路的设计为基础进行分析。本身这只是线的矢量数据,我们要对它进行丰富的渲染,大体上分为四个部分:
在这里插入图片描述
1.橙色的为是路的主体。对应type=line,是对线的渲染。代码如下

{
                          //高速公里
                          "id": "bridge-motorway",
                          "type": "line",
                          "source": "germany",
                          "source-layer": "gis_osm_roads_07_1",
                          "filter": [
                              "==",
                              "fclass",
                              "motorway"
                          ],
                          "layout": {
                              "line-cap": "round",
                              "line-join": "round"
                          },
                          "paint": {
                              "line-width": {
                                  "base": 1.5,
                                  "stops": [
                                      [
                                          5,
                                          0.75
                                      ],
                                      [
                                          18,
                                          32
                                      ]
                                  ]
                              },
                              "line-color": "hsl(26, 100%, 68%)"
                          },
                          "interactive": true
                      },

2.为了美观路两边加白色渲染线:对应type=line,是线渲染

{
                         "id": "bridge-motorway-case",
                         "type": "line",
                         "source": "germany",
                         "source-layer": "gis_osm_roads_07_1",
                         "filter": [
                             "==",
                             "fclass",
                             "motorway"
                         ],
                         "layout": {
                             "line-join": "round"
                         },
                         "paint": {
                             "line-width": {
                                 "base": 1.5,
                                 "stops": [
                                     [
                                         10,
                                         1
                                     ],
                                     [
                                         16,
                                         2
                                     ]
                                 ]
                             },
                             "line-color": "hsl(0, 0%, 100%)",
                             "line-gap-width": {
                                 "base": 1.5,
                                 "stops": [
                                     [
                                         5,
                                         0.75
                                     ],
                                     [
                                         18,
                                         32
                                     ]
                                 ]
                             }
                         },
                         "interactive": true
                     },

3.公路编号图标,图标是一张图片外加属性数据。对应type=symbol,是符号渲染

{
                          "id": "road-shields-white",
                          "type": "symbol",
                          "source": "germany",
                          "source-layer": "gis_osm_roads_07_1",
                          "minzoom": 14,
                          "filter": [
                            "==",
                            "fclass",
                            "motorway"
                          ],
                          "layout": {
                              "text-size": 9,
                             "icon-image": "de-motorway-2",
                              "icon-rotation-alignment": "viewport",
                              "text-max-angle": 38,
                              "symbol-spacing": {
                                  "base": 1,
                                  "stops": [
                                      [
                                          11,
                                          150
                                      ],
                                      [
                                          14,
                                          200
                                      ]
                                  ]
                              },
                              "text-font": [
                                  "Microsoft YaHei",
                              ],
                              "symbol-placement": {
                                  "base": 1,
                                  "stops": [
                                      [
                                          10,
                                          "point"
                                      ],
                                      [
                                          11,
                                          "line"
                                      ]
                                  ]
                              },
                              "text-padding": 2,
                              "text-rotation-alignment": "viewport",
                              "text-field": "{ref}",
                              "text-letter-spacing": 0.05,
                              "icon-padding": 2
                          },

4.单行道路标,对应type=symbol,是符号渲染

{
     "id": "road-oneway-arrows-white",
     "type": "symbol",
     "source": "germany",
     "source-layer": "gis_osm_roads_07_1",
     "minzoom": 16,
     "filter": [
       "==",
       "fclass",
       "motorway"
     ],
     "layout": {
         "symbol-placement": "line",
         "icon-image": {
             "base": 1,
             "stops": [
                 [
                     16,
                     "oneway-white-small"
                 ],
                 [
                     17,
                     "oneway-white-large"
                 ]
             ]
         },
         "icon-padding": 2,
         "symbol-spacing": 200
     },
     "paint": {},
     "interactive": true
}

从上面的分析可以看出mapbox的对单个图层渲染可以写各种样式,可以对每个细节做不同的渲染,对线就可以做多次渲染,符号也可以多次,极大提高了渲染的灵活性。可将每个渲染细节划分出来,某些共用的渲染方式还可以复用。告别了传统一图层一渲染的模式,这就是个性化定制地图的基础,其他渲染内容请查看API

2.Mapbox样式在线编辑

这里我们讲一下Mapbox官方提供的在线样式编辑器的使用。

首先注册一个Mapbox账户;登陆后转到样式编辑器,创建一个自己的样式,这里建议从官方的样式库中选取一个模板。我这里选择了一个基础模板,
在这里插入图片描述
在这里插入图片描述
进入编辑页面后,就可以看到他的基础样式地图了,点击你感兴趣的渲染区域,便会弹出点击范围内的所有渲染样式对象。
在这里插入图片描述
我们打开路的渲染,修改路图层中的小路的颜色为红色,结果如下
在这里插入图片描述
编辑器类似于Photoshop的编辑面板,还有一些例如图层选择等功能,自己多摸索一下,这里就不展开了,下面讲一下样式文件的导出:

返回主页面,点击刚才编辑的样式项目,选择导出功能,便可以将我们修改好的样式文件导出,也可以导出一些mapbox的常用模板,对自己感兴趣的官方样式代码实现做分析,完善自己的样式实现。
在这里插入图片描述

3.Mapbox样式中几个特别关注的四个方法

1.缩放显示

对于某个图层我们只想他在8-12级的地图级别进行显示,这是提供了minzoom,maxzoom的属性来设定缩放级别,它支持小数,例如minzoom:8.55;

2.属性过滤

我们有时候图层展示的时候要进行属性的过滤,例如一个图层pio点图层有饭店、学校、咖啡厅等点数据我们进行定制个性化展示,这时图层数据进行过滤来对不同类别进行单独的渲染。我们可以使用Filter 进行过滤,filter提供了好多种过滤条件具体可查看api。

3.分级

前面1中是控制不同级别图层的显示与否,这边的分级是指不同级别范围图层渲染方式,例如8-10级是路是细路,10-15级路变成粗的路,随着级别变化作调整,使得整地图缩放起来更加自然。对应的api为stops,下面会给出例子。

4.属性输出

我们对一些要展示标注内容的属性要进行输出,我们使用{}进行输出,例如要输出name属性的内容可以{name}便可以输出。

最后给出一个有这四个特性的一个样式例子。

{
                            //村庄
                            "id": "place-village",
                            "type": "symbol",
                            "source": "germany",
                            "source-layer": "gis_osm_places_07_1",
                            //8级开始显现
                            "minzoom": 8,
                            //超过15级隐藏
                            "maxzoom": 17,
                            //过滤出所有fclass=village的点
                            "filter": [
                                "==",
                                "fclass",
                                "village"
                            ],
                            "layout": {
                             //使用{}输出属性数据
                                "text-field": "{name}",
                                "text-font": [
                                    "Microsoft YaHei",
                                ],
                                "text-max-width": 7,
                                "text-size": {
                                    "base": 1,
                                    //字体默认大小为1,10-16级字体为大小为 11.5
                                    //大于16级字体大小为18
                                    "stops": [
                                        [
                                            10,
                                            11.5
                                        ],
                                        [
                                            16,
                                            18
                                        ]
                                    ]
                                }
                            },
                            "paint": {
                                "text-halo-color": "hsl(0, 0%, 100%)",
                                "text-halo-width": 1.25,
                                "text-color": "hsl(0, 0%, 0%)"
                            },
                            "interactive": true
                        },

4.总结

这一篇主要讲了一下Mapbox的样式的设计原理,以及Mapbox在线样式编辑器的使用,最后分享了一下我在使用Mapbox中认为比较重要的方法,下篇主要讲一下我的离线部署项目的具体实现。

待续。。。。。。。。。。。。。。。。。。。。。

### 回答1: GDAL(Geospatial Data Abstraction Library)是一个开源库,可用于处理地理空间数据。而Mapbox Vector Tiles(MVT)是一种用于高效渲染和交互式使用的矢量切片格式。下面是关于如何使用GDAL生成Mapbox Vector Tiles矢量切片的简要步骤。 首先,确保你已经安装了GDAL,并且可以在命令行中运行相关命令。 1. 将你的矢量数据转换为PGS(PostGIS)格式,这是一个常用的空间数据库。 例如,可以使用ogr2ogr命令将Shapefile数据转换为PGS格式: ``` ogr2ogr -f PostgreSQL PG:"dbname=your_db user=your_user" your_data.shp ``` 2. 创建一个新的数据库表,用来存储切片数据。 ``` psql -d your_db -U your_user -c "CREATE TABLE your_table AS SELECT * FROM your_data" ``` 3. 利用GDAL的ogr2ogr命令将数据导出为MVT格式。 ``` ogr2ogr -f MVT your_output.mbtiles PG:"dbname=your_db user=your_user" -sql "SELECT * FROM your_table" -dsco FORMAT=MVT ``` 4. 完成上述步骤后,你将得到一个包含Mapbox Vector Tiles的MBTiles文件(your_output.mbtiles),其中包含了你的矢量数据切片。 使用GDAL生成Mapbox Vector Tiles矢量切片的思路是将矢量数据先转换为PGS格式的空间数据库,然后导出为MVT格式。通过这种方式,你可以使用GDAL的强大功能来处理和转换地理空间数据,并方便地生成适用于Mapbox矢量切片。 ### 回答2: GDAL是一个开源的地理数据抽象库,它可以处理和转换各种地理空间数据格式。为了生成Mapbox矢量切片,我们可以使用GDAL的一些工具和功能。 首先,我们需要确保已经安装了GDAL库和相关的依赖项。然后,我们可以使用GDAL的命令行工具或API来执行下面的步骤。 1. 准备数据:将原始矢量数据准备好,可以是常见的矢量数据格式,如Shapefile、GeoJSON或GPKG等。 2. 转换到GeoPackage格式:使用gdal_translate命令将原始数据转换为GeoPackage格式(如果原始数据不是GeoPackage格式)。例如,可以使用以下命令: ```shell gdal_translate -f GPKG input.shp output.gpkg ``` 3. 切片生成:使用gdal2tiles.py或gdal2mbtiles.py命令生成Mapbox矢量切片。这两个命令可以将栅格数据或矢量数据转换为切片。在这种情况下,我们使用gdal2mbtiles.py来生成矢量切片。例如,可以使用以下命令: ```shell gdal2mbtiles.py -l layer_name input.gpkg output.mbtiles ``` 这将生成一个包含矢量切片的MBTiles文件。 4. 导入到Mapbox Studio:将生成的MBTiles文件导入到Mapbox Studio中,以便进一步处理和发布。在Mapbox Studio中,可以编辑样式、添加图层等。 通过以上步骤,我们可以使用GDAL转换和生成Mapbox矢量切片。GDAL提供了很多功能和选项,使得在处理地理空间数据时非常灵活和强大。 ### 回答3: GDAL是一个开源的地理数据抽象库,支持各种格式的地理数据读取、写入和转换。要使用GDAL生成Mapbox Vector Tiles(MVT)矢量切片,需要安装GDAL软件包并了解如何使用其命令行工具。 首先,确保安装了最新版本的GDAL库。你可以从GDAL官方网站上下载并安装适合你操作系统的版本。 在安装完成后,使用命令行工具进入你的地理数据存储路径。然后,运行以下命令来生成MVT矢量切片: ``` ogr2ogr -f MVT output_directory input_data.geojson ``` 上述命令中,`output_directory`是你希望生成矢量切片的输出目录,`input_data.geojson`是你的输入地理数据文件的路径。请确保输入数据文件是GeoJSON格式。 运行上述命令后,GDAL会将输入的地理数据文件转换为MVT格式的矢量切片,并将其保存到指定的输出目录中。 需要注意的是,GDAL的`ogr2ogr`工具提供了多种选项和参数,可用于自定义矢量切片的生成过程。你可以查看GDAL的文档以了解更多详细信息,并根据你的需求进行调整。 总结起来,要用GDAL生成Mapbox Vector Tiles矢量切片,需要安装GDAL库并使用`ogr2ogr`命令行工具进行转换操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值