最近需要设计Geoserver服务发布的图层符号,网上找了很多,有用QGis做符号的,但QGIS做的符号也有很多导出不正确,而且以前很多符号都是用ArcGIS制作,于是想到能不能把arcgis的符号转到geoserver上,国外也有过转换的(ArcMap2SLD Converter),但很多转换也不满足我的需求。
对于字体填充符号、线填充符号等的支持不是太好,在这种情况下,根据自身的需求,写了符号转换器,主要就是将arcgis的点、线、面中常用的符号转换成sld格式,以方便在geoserver中使用。
软件运行界面如下:
使用说明:
输出文件:输出sld文件的路径
mxd路径:需要转换的mxd文件路径
参数设置:
导出注记:是否输出图层的标注
考虑注记层的最大最小比例:导出标注时时是否设置标注中设置的最大最小比例
只导出可见图层:只导出mxd文件中打开的图层
保存时去除空格:保存sld文件时去除空格回车等,保存后文件大小较小,但可读性不高
所有图层合并为一个文件:将mxd所有图层合并输出为一个sld文件
图层输出时以要素类名称命名:不是单文件输出时有效,输出sld文件命名以图层的要素类命名,否则以图层名称命名
说明如下:
软件基于ArcGIS10.4开发,如有任何ArcGIS问题可探讨。
Sld格式具体参考官方相关文档(https://docs.geoserver.org/stable/en/user/styling/index.html#styling)。
解析了包括点、线、面三种类型的符号的部分类型及注记,考虑到服务发布需求,图层的查询条件软件暂未考虑,注记类查询条件进行了考虑。
1、图层符号只涉及 唯一值渲染、简单符号渲染;
2、面符号(简单填充、点填充、图片填充、线填充):所有填充边线与线符号对应。
简单填充:填充颜色和边线(边线参考线符号);
点填充:填充符号与点符号对应;graphic-margin设置偏移和间距。
图片填充:不考虑间距和偏移,通过图片缩放比例以及填充间距计算符号大小;
线填充:填充线只考虑SimpleLine和CartographicLine
3、线符号(简单线、点填充线、HashLine、CartographicLine):
简单线:只有宽度和颜色;
点填充线:符号与点符号对应;如果为CartographicLine,mark最小值不能小于2/3点符号大小,如果比符号的一半还小,则不会显示,不知道为啥,以后研究
HashLine:通过shape://vertline实现,作为做铁路符号的实现,不能设间距,只能根据宽度自动调整间距。
CartographicLine:虚线。
4、点符号(简单点、字体注记点、图片点):
点符号的Halo和背景未设置。
不管是点、线、面符号设置到字体注记还是图片注记需要将字体或图片放到合适位置,
1)字体注记:字体放于Geoserver安装对应的java目录下,我的放在C:\Program Files\Java\jre1.8.0_291\lib\fonts目录下,我的Java路径为C:\Program Files\Java\jdk1.8.0_181
具体可参考 https://blog.csdn.net/shendygis/article/details/119021696
2)图片:生成sld文件时,图片存放在与sld文件同一目录下(命名=图层名称+序号),发布时,需要将图片拷贝到与Geoserver目录的style同位置处,否则识别不到。
5、注记
考虑注记类、sql。
注记表达式:只考虑通过&或+的连接。字段(格式:[字段名称])、换行(vbnewline和chr(13))、字符串,未考虑复杂模式。
转换后结果如下图所示:
sld文件是mxd中各个图层对于的样式文件,png格式图片是样式中用到的图片。
arcmap显示如下图所示:
经过转换,将style导入到Geoserver中,在Geoserver中显示如下:
更新日志:
20220903
1、定义查询增加查询值为null,直接设置PropertyIsNull
20220907
1、多个图层的IMultiLayerMarkerSymbol采用图片符号(将符号转为png图片)。
2、添加point单位转换为pixel单位函数,暂时未启用。
源码下载:mxd2sld: mxd2sld,Mxd格式符号(或ArcMap符号)转换为Sld格式
需要下载的童鞋移步到: 我的下载资源Mxd2Sld.zip_mxd转为sld-VB文档类资源-CSDN下载
不能运行或需要或源码维护的qq联系:233020169,请注明:mxd2sld