Geoserver图层SLD样式编辑问题

一、线上地图样式

SLD:风格化图层描述器(Styled Layer Descriptor)的简称,是2005年OGC提出的一个标准样式层描述符,这个标准在一定条件下允许WMS服务器对地图可视化的表现形式进行扩展。在没有SLD之前,只能使用一些已经在服务器上规定好的样式来对地图进行可视化。而当使用了实现了SLD标准之后,它允许我们从客户端来对地图进行定义自己的样式,分级显示等操作,极大的扩展了地图可视化的灵活性。SLD用于后端渲染图层给前端返回栅格数据。

Mapbox Style:定义地图视觉外观的文档,要绘制哪些数据、绘制地图的顺序以及绘制数据时如何对数据进行样式。样式文档是具有特定根级和嵌套属性的JSON对象。此规范定义并描述这些属性。Mapbox Style用于前端渲染图层,后端只返回矢量切片数据。

Geoserver图层样式使用的是OGC标准的SLD文件,其对初学者学习成本高,学习难度大,如果有类似Mapbox的mapbox studio、百度地图的个性化地图编辑器、高德地图的自定义地图编辑器将大大提高地图制图效率。相关文章《让maputnik支持geoserver》。

二、SLD样式编辑软件

1.QGIS

一个开源的GIS桌面软件,具有丰富的地图样式编辑,功能强大,能够生成SLD文件。

md_4b490654.png
md_c975a26e.png

2.udig

    一个基于Java开发的GIS桌面应用程序,其样式编辑功能没有QGIS强,界面操作上比QGIS简单,能够生成SLD文件,但部分样式参数无法编辑需要自行编写SLD,而且加载大数据量的数据软件容易崩溃。
md_5891ae0e.png
md_a7adf3e1.png

3.SLDEditor

编辑地图样式的 Java 桌面应用程序,允许使用图形用户界面以交互方式创建和编辑OGC 样式层描述符。能生成SLD文件,可以完全控制OGC SLD标准的所有方面;但是无法加载空间数据,对比着调节样式及时查看效果;相比前两个软件,这个更像是一个SLD可视化编辑工具。

md_7f89d7a8.png
md_77ad56eb.png

三、使用maputnik调节自定义样式

通过网上搜索查看了《让maputnik支持geoserver》这篇博客,发现这就是我想要的工具,一个类似百度、高德地图那样的矢量地图配图工具,比起前面的桌面软件调节样式这个更轻,功能更强大,操作更友好。不过前提条件Geoserver需要安装两个插件:

1.插件安装

下载Geoserver对应版本的插件Vector Tiles、MBStyle Styling,将解压安装包中的所有jar包放在.../webapps/geoserver/WEB-INF/lib目录下,重启Geoserver,在编辑图层中Tile Caching标签页看到“application/vnd.mapbox-vector-tile”说明Vector Tiles插件安装成功,新建样式文件Format下拉框看到“MBStyle”说明MBStyle Styling插件安装成功。

md_19cc60b3.png
md_ca42c136.png

2.设置图层开启矢量切片

OSM地图本地发布(四)-----Geoserver发布自定义地图中的“taiwan”图层组开启矢量切片功能。

md_036321de.png

查看矢量切片链接,打开Geoserver首页点击TMS:

md_c6bfed7d.png
md_fb318afc.png

900913@pbf链接为maputnik要用的链接,因为mapbox style只支持谷歌Web墨卡托投影EPSG:900913

http://localhost:8080/geoserver/gwc/service/tms/1.0.0/taiwan%3Ataiwan@EPSG%3A900913@pbf

3.使用maputnik打开图层

不会使用的先看 《让maputnik支持geoserver》这篇博客、Mapbox Style官方文档,这里提供一个json样式模板,其中tiles中的链接即为前面TMS中看到的链接,source为设置的数据源,source-layer为数据源中各个图层的名字,即taiwan图层组中的各个图层的名字:

{
  "version": 8,
  "name": "Taiwan Liberty",
  "metadata": {"maputnik:renderer": "mbgljs"},
  "center": [120.679882, 24.143171],
  "zoom": 4,
  "sources": {
    "taiwan": {
      "type": "vector",
      "scheme": "tms",
      "tiles": [
        "http://localhost:8080/geoserver/gwc/service/tms/1.0.0/taiwan%3Ataiwan@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf"
      ],
      "minZoom": 0,
      "maxzoom": 24
    }
  },
  "sprite": "https://maputnik.github.io/osm-liberty/sprites/osm-liberty",
  "glyphs": "https://api.maptiler.com/fonts/{fontstack}/{range}.pbf?key={key}",
  "layers": [
    {
      "id": "background",
      "type": "background",
      "layout": {"visibility": "visible"},
      "paint": {"background-color": "#F2EFE9"}
    },
    {
      "id": "其他-海洋",
      "type": "fill",
      "source": "taiwan",
      "source-layer": "simplified_water_polygons",
      "layout": {"visibility": "visible"},
      "paint": {"fill-color": "#AAD3DF"}
    },
    {
      "id": "其他-建筑物",
      "type": "fill",
      "source": "taiwan",
      "source-layer": "building",
      "minzoom": 0,
      "maxzoom": 24,
      "paint": {
        "fill-color": "#DCD9D6",
        "fill-outline-color": {
          "base": 1,
          "stops": [[13, "hsla(35, 6%, 79%, 0.32)"], [14, "hsl(35, 6%, 79%)"]]
        }
      }
    },
    {
      "id": "水域",
      "type": "fill",
      "source": "taiwan",
      "source-layer": "water",
      "minzoom": 0,
      "maxzoom": 24,
      "layout": {"visibility": "visible"},
      "paint": {"fill-color": "#B2CEFE"}
    },
    {
      "id": "水域-边界",
      "type": "line",
      "source": "taiwan",
      "source-layer": "water_outline",
      "minzoom": 0,
      "maxzoom": 24,
      "paint": {"line-color": "#B2CEFE"}
    },
    {
      "id": "水域-河流",
      "type": "line",
      "source": "taiwan",
      "source-layer": "river",
      "minzoom": 0,
      "maxzoom": 24,
      "layout": {"visibility": "visible"},
      "paint": {"line-color": "#B2CEFE", "line-width": 1}
    },
    {
      "id": "公路-line",
      "type": "line",
      "source": "taiwan",
      "source-layer": "route_line",
      "minzoom": 0,
      "maxzoom": 24,
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {"line-color": "#4A83BF", "line-opacity": 0.6, "line-width": 0.4}
    },
    {
      "id": "地名-city",
      "type": "symbol",
      "source": "taiwan",
      "source-layer": "placenames_medium",
      "minzoom": 0,
      "maxzoom": 24,
      "layout": {
        "text-field": {"type": "identity", "property": "name"},
        "text-size": 12,
        "text-allow-overlap": false,
        "text-ignore-placement": false,
        "text-font": ["SimSun Regular"]
      },
      "paint": {
        "text-halo-color": "#FFFFFF",
        "text-opacity": 1,
        "text-halo-width": 1
      }
    }
  ],
  "id": "taiwan_liberty"
}

4.使用maputnik调节样式

这里提供一个完整的样式文件,链接: https://pan.baidu.com/s/1qbVC5Jbsa42rbP-p_i5XxQ 提取码: w2pf,文件中的taiwan.json为样式文件。

md_191f7309.png

打开maputnik将taiwan.json文件导入,即可进行样式调节。

md_37583d45.png
md_1faf7ea3.png

四、Mapbox样式转为SLD

1.导出maputnik调节好的样式文件

md_b4a36ba4.png

2.分离不同图层样式

    maputnik导出的json文件包含了所有的图层样式,将不同图层样式单独分离出来,方便导入Geoserver中,以building图层为例,在layers数组中找到"source-layer": "building"的样式,放入下面模板中:
{
  "version": 8,
  "name": "Taiwan Liberty",
  "metadata": {"maputnik:renderer": "mbgljs"},
  "center": [120.679882, 24.143171],
  "zoom": 4,
  "sources": {
    "taiwan": {
      "type": "vector",
      "scheme": "tms",
      "tiles": [
        "http://localhost:8080/geoserver/gwc/service/tms/1.0.0/taiwan%3Ataiwan@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf"
      ],
      "minZoom": 0,
      "maxzoom": 24
    }
  },
  "sprite": "https://maputnik.github.io/osm-liberty/sprites/osm-liberty",
  "glyphs": "https://api.maptiler.com/fonts/{fontstack}/{range}.pbf?key={key}",
  "layers": [
       //分离的图层样式粘贴放在这里!
  ],
  "id": "taiwan_liberty"
}

最终分离样式文件如下:

{
  "version": 8,
  "name": "Taiwan Liberty",
  "metadata": {"maputnik:renderer": "mbgljs"},
  "center": [120.679882, 24.143171],
  "zoom": 4,
  "sources": {
    "taiwan": {
      "type": "vector",
      "scheme": "tms",
      "tiles": [
        "http://localhost:8080/geoserver/gwc/service/tms/1.0.0/taiwan%3Ataiwan@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf"
      ],
      "minZoom": 0,
      "maxzoom": 24
    }
  },
  "sprite": "https://maputnik.github.io/osm-liberty/sprites/osm-liberty",
  "glyphs": "https://api.maptiler.com/fonts/{fontstack}/{range}.pbf?key={key}",
  "layers": [
    {
      "id": "其他-建筑物",
      "type": "fill",
      "source": "taiwan",
      "source-layer": "building",
      "minzoom": 15,
      "maxzoom": 24,
      "filter": ["all", ["!=", "building", "ferry"]],
      "paint": {
        "fill-color": "#DCD9D6",
        "fill-outline-color": {
          "base": 1,
          "stops": [[13, "hsla(35, 6%, 79%, 0.32)"], [14, "hsl(35, 6%, 79%)"]]
        }
      }
    },
    {
      "id": "水域-建筑物",
      "type": "fill",
      "source": "taiwan",
      "source-layer": "building",
      "minzoom": 13,
      "maxzoom": 24,
      "filter": ["all", ["==", "building", "ferry"]],
      "paint": {
        "fill-color": "#DCD9D6",
        "fill-outline-color": {
          "base": 1,
          "stops": [[13, "hsla(35, 6%, 79%, 0.32)"], [14, "hsl(35, 6%, 79%)"]]
        }
      }
    }
  ],
  "id": "taiwan_liberty"
}

3.将Mapbox样式导入Geoserver

新建样式:

md_89ad554e.png

选择MBStyle,粘贴上一节分离的building样式文件,Validate检测一下正确性后保存:

md_5e3ac979.png

4.查看转换后的SLD文件

上一步新建MB_building样式保存完成后,在.../webapps/geoserver/data/workspaces/

taiwan/styles中可以找到SLD文件:

md_bc0dc598.png

提示:如果没有看到对应的sld文件,可能是新建样式选错了工作空间或使用了默认工作空间,在其他文件夹里找;或者需要打开样式文件预览一下才会生成sld文件。

md_ee0313a9.png

五、总结

目前来看Mapbox提供的技术是最好用的开源自定义样式编辑解决方案,maputnik是基于Mapbox规范实现的开源的轻量级样式编辑工具,Mapbox官方样式编辑工具是Mapbox Studio

安装MBStyle Styling插件已经支持了Mapbox样式文件,为什么要多此一举转为SLD文件?从转入过程可以发现Geoserver支持的样式格式只有SLD文件,使用插件也是转为SLD文件在使用,这样转换后可以将SLD文件导出在其他环境中使用,比如生产环境,其他Geoserver服务器中;另一方面我一直在寻找SLD转Mapbox Style工具方便已经存在的SLD样式能供Mapbox使用、Mapbox Style转SLD工具方便已经存在的MB样式供Geoserver使用,这样能更高效使用,如调节一套样式多平台上使用。

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

推荐阅读更多精彩内容