在MapServer中显示国际字符

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2020-10-28

信用卡

最初的功能被添加到MapServer4.4.0中,作为日本信息技术促进局(IPA)赞助的项目的一部分。项目成员包括:Venkatesh Raghavan、Masumoto Shinji、Nonogaki Susumu、Nemoto Tatsuya、Hirai Naoki(日本大阪城市大学)、Mario Basa、Hagiwara Akira、Niwa Makoto、Mori Toru(日本奥克尼公司)和Hattori Norihiro(日本电子解决方案服务公司)。

要求

  • mapserver>=4.4.0(对于层级编码,mapserver>=7.0)

  • MapServer使用 libiconv 类库

备注

就带有国际字符的地图标注而言,从MapServer7.0版本开始,除了libiconv之外,其他重要的依赖库还有 Freetype (要获取有关字形大小的信息), Fribidi (处理双向文本),以及 Harfbuzz (用于文本整形)。

如何在映射文件中启用(mapserver>=7.0)

MapServer 7.0版本包含MapServer处理编码方式的更改;7.0中的新内容是在 LAYER 水平。这使得在同一个映射文件中,在不同的编码中管理多个层变得更加容易。这种变化的原因是数据集的编码不仅影响标签,还影响整个层。MapServer7还将在后台将任何字符串转换为utf8,并且将以utf8返回任何输出(例如通过ogc getcapabilities、getfeature或查询)。

Mapfile LAYER 对象的 ENCODING 参数接受编码名称作为其参数。

地图服务器使用GNU libiconv 库来处理编码。Libiconv网站上有一个受支持的编码列表。用户还可以在安装了libiconv的系统上使用“iconv-l”命令,以获取该特定系统上支持的编码的完整列表。

备注

标签对象的 ENCODING 参数已弃用,但在该场景中仍存在一些逻辑来处理在MapServer 7中使用的情况。

步骤1:验证ICONV支持和MapServer版本

执行 mapserv -v 在命令行中,验证您的MapServer版本>=7.0及其包含 SUPPORTS=ICONV ,例如:

> mapserv -v

  MapServer version 7.7.0-dev (MS4W 4.0.4) OUTPUT=PNG OUTPUT=JPEG
  OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE
  SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS SUPPORTS=SVGCAIRO
  SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER
  SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT
  SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI
  SUPPORTS=THREADS SUPPORTS=GEOS SUPPORTS=POINT_Z_M SUPPORTS=PBF
  INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE

步骤2:验证ICONV是否支持文件的编码

由于MapServer使用libicv库来处理编码,因此您可以在此处查看支持的编码列表:https://www.gnu.org/software/libiconv/

Unix用户也可以使用 iconv -l 安装libiconv的系统上的命令,以获取该特定系统上支持的编码的完整列表。

步骤3:向层对象添加编码参数

现在,您只需将编码参数添加到mapfile层对象中,例如:

MAP
 ...
 LAYER
   ...
   ENCODING "SHIFT_JIS"
   CLASS
     ...
   END #class
 END #layer
END #map

备注

确保在文本编辑器中以“utf-8”编码保存映射文件。

LAYER
  NAME "地名"
  DATA "chimei.shp"
  STATUS DEFAULT
  TYPE POINT

  ENCODING "SHIFT_JIS"
  LABELITEM "NAMAE"

  CLASS
    NAME "地名"
    STYLE
      COLOR 10 100 100
    END
    LABEL
      TYPE TRUETYPE
      FONT "pgothic"
      COLOR 220 20 20
      SIZE 7
      POSITION CL
      PARTIALS FALSE
      BUFFER 3
    END
  END
END

备注

MapServer 7.6.0版本包括一个重要的修复程序,允许在文件名和映射文件中的路径中使用特殊字符,如“ä”(元音)。

步骤4:使用shp2img实用程序进行测试

../_images/encoding.png

如何在映射文件中启用(mapserver<7.0)

旧版MapServer只允许在 LABEL 映射文件中的级别。

向标签对象添加编码参数

将encoding参数添加到mapfile label对象,例如:

MAP
 ...
 LAYER
   ...
   CLASS
     ...
     LABEL
       ...
       ENCODING "SHIFT_JIS"
     END
   END
 END
END

下面是使用标签级别的编码集的示例层:

LAYER
  NAME "chimei"
  DATA "chimei.shp"
  STATUS DEFAULT
  TYPE POINT
  LABELITEM "NAMAE"
  CLASS
    NAME "CHIMEI"
    STYLE
      COLOR 10 100 100
    END
    LABEL
      TYPE TRUETYPE
      FONT "kochi-gothic"
      COLOR 220 20 20
      SIZE 10
      POSITION CL
      PARTIALS FALSE
      BUFFER 0
      ENCODING "SHIFT_JIS"
    END
  END
END

使用php mapscript的示例

对于php mapscript, Encoding 参数包含在labelobj类中(对于mapserver<7),因此可以修改层的编码参数,例如:

// Loading the php_mapscript library
dl("php_mapscript.so");

// Loading the map file
$map = ms_newMapObj("example.map");

// get the desired layer
$layer = $map->getLayerByName("chimei");

// get the layer's class object
$class = $layer->getClass(0);

// get the class object's label object
$clabel= $class->label;

// get encoding parameter
$encode_str = $clabel->encoding;
print "Encoding = ".$encode_str."\n";

// set encoding parameter
$clabel->set("encoding","UTF-8");

笔记

备注

在最初的实现过程中,使用不同的日本编码系统(shift-jis、euc-jp、utf-8以及泰国的tis-620编码系统)测试了该功能。

libiconv支持的拉丁字母编码示例有:ISO-8859-1(拉丁字母1-也称为拉丁-1-西欧语言)、ISO-8859-2(拉丁字母2-也称为拉丁-2-东欧语言)、CP1252(Microsoft Windows拉丁字母编码-英语和其他一些西欧语言)。