特征样式规范

版本0.016-2018-12-03

1。概述

本文档定义了在GDAL的向量驱动程序(OGR)的不同级别处理特征样式信息(即颜色、线宽、符号等)的方式。

以下GDAL矢量驱动程序对要素样式的支持程度各不相同: DWG (libopencad)DWG (Teigha)DXFKML (libkml)MapInfoMicroStation DGN v7DGN v8OpenJUMP JMLPDF .

1.1样式是特征对象的属性

从概念上讲,特征样式应该被视为特征的属性。尽管有些系统将样式信息存储在特殊属性中,但在GDAL中,将样式视为特性更为一致,就像特征的几何图形也是特性一样。

这并不妨碍我们在写入某些不提供样式的格式(例如E00)时将样式信息存储在属性中。但是,当通过GDAL打开这样一个数据集时,包含样式信息的属性的名称应该在某些元数据中指定,或者由用户指定。

此外,在SFCOM界面中,样式信息将像几何图形一样存储在属性中。

1.2要素样式可以存储在两个级别

样式定义了应绘制特征的方式,但有多个共享同一样式的特征是非常常见的。在这些情况下,我们将提供一种更有效的方式来共享样式信息,而不是在每个特征上复制样式信息。

可以在两个级别上找到样式信息:

  • A 数据集 可以有一个预定义样式表,然后可以由图层或单个要素引用。这一机制在本文件中作了进一步的定义。

  • A 特征(OGRFeature对象) 可以有自己完整的样式定义。或者,可以将要素链接到数据集样式表中的样式。当相同的样式经常被重用时,这可以节省存储空间。

在处理给定的数据集时,应该可以在一个或多个不同级别存储样式信息。样式实际存储的级别将取决于我们正在处理的格式的最有效方法。

1.3绘图工具

我们定义了一组用于生成样式定义的绘图工具:

  • PEN :对于线性样式

  • BRUSH :用于填充区域

  • SYMBOL :点符号

  • LABEL :用于批注

每个绘图工具都可以使用许多参数,所有参数都是可选的。样式语法的构建方式是,无法支持所有可能参数的系统可以安全地跳过并忽略不支持的参数。这也将使将来在不破坏现有代码或应用程序的情况下扩展规范变得容易。

样式可以使用单个工具,也可以使用一个或多个工具的组合。通过在一个样式中组合使用多个工具,可以构建几乎任何类型的图形表示。例如,符号工具可用于沿直线放置间隔符号。此外,标签工具还可以用于将文本放置在一个点上,沿一条线拉伸文本,甚至可以通过将笔工具与标签工具结合使用,将该线用作文本标签的引线,并在该线的最后一个顶点上绘制文本字符串。

当然,很少有系统能支持这一切。但是这里的目的是要有一个足够强大和灵活的样式规范,允许所有类型的格式以尽可能少的损失交换样式信息。

1.4样式定义可以使用特征属性

在某些情况下,对于样式定义来说,为给定的工具参数值引用特征上的属性字段可能很有用,而不是在样式本身中使用硬编码值。

例如文本角度、文本字符串等。。。每个文本标签的这些值都会更改,但如果在每个要素的属性中查找角度和文本字符串,则可以在图层级别共享标签样式的其余部分。

样式字符串的语法提供了一种方法,使任何参数值可以是常量值,也可以是对属性字段的查找。

1.5刀具参数单位

根据要处理的文件格式,可以用不同的测量单位表示多个参数值。例如,一些系统以点表示线宽或文本高度,其他系统以像素表示,其他系统则使用地面单位。为了适应所有这些情况,所有参数都可以在以下单元系统中指定:

  • g :地图地面单位(无论地图坐标单位是什么)

  • px :像素

  • pt :点(1/72英寸)

  • mm :毫米

  • cm :厘米

  • in :英寸

必须在GDAL客户机级别提供一些工具,以简化从一个单元系统到另一个单元系统的任何值的转换。这意味着GDAL客户机必须指定地图比例,以便可以执行从地面单位到纸张/像素单位的转换。


2。要素样式字符串

如前所述,样式定义通常存储为字符串,可以存储在每层(或每数据集)表中,也可以直接存储在要素中。

2.1示例

下面是一些样式定义字符串的示例:

  • 5像素宽的红线: PEN(c:#FF0000,w:5px)

  • 用蓝色填充的多边形,轮廓为黑色: BRUSH(fc:#0000FF);PEN(c:#000000)

  • 点符号: SYMBOL(c:#00FF00,id:"points.sym-45,ogr-sym-7")

  • 文本标签,从“文本属性”属性字段获取文本字符串: LABEL(f:"Times New Roman",s:12pt,t:{{text_attribute}})"

下面是包含上述所有样式的样式表的外观:

road:      PEN(c:#FF0000,w:5px)
lake:      BRUSH(fc:#0000FF);PEN(c:#000000)
campsite:  SYMBOL(c:#00FF00,id:"points.sym-45,ogr-sym-7")
label:     LABEL(f:"Times New Roman",s:12pt,t:{text_attribute})

然后,各个要素可以在其样式属性中使用“@”字符后跟样式名称来引用上表中的样式。

例如,样式设置为“@road”的功能将被绘制为红线。

2.2样式字符串语法

每个要素对象都有一个样式属性(字符串):

<style_property> = "<style_def>" | "" | "@<style_name>" | "{<field_name>}"
  • <style_def> 将在本节后面定义。

  • 空样式字符串表示未指定要素的样式。它并不表示该功能是不可见的——不可见的功能可以使用完全透明的颜色来表示,如钢笔(c:#00000000)。

  • @<style_name> 是对图层或数据集样式表中预定义样式的引用。首先查找层的表,如果在其中找不到样式名,则将查找数据集的表。

  • 最后, {{<field_name>}} 意味着应该从指定的属性字段中读取样式属性。

<style_def>是真正的样式定义。它是一个由分号分隔的1个或多个样式部分的组合。每个样式部件都使用绘图工具定义完整图形表示的一部分:

<style_def> =    <style_part>[;<style_part>[;...]]

<style_part> =   <tool_name>([<tool_param>[,<tool_param>[,...]]])

<tool_name> =    name of a drawing tool, for now: PEN | BRUSH | SYMBOL | LABEL

<tool_param> =   <param_name>:<param_value>

<param_name> =   see list of parameters names for each drawing tool

<param_value> =  <value> | <value><units>

<value> =        "<string_value>" | <numeric_value> | {<field_name>}

<units> =        g | px | pt | mm | cm | in

默认情况下,除非为每个零件指定了不同的级别参数值(请参见级别参数定义),否则将按样式定义字符串中的显示顺序绘制样式零件。

所有绘图工具参数都是可选的。因此,使用带有空绘图工具参数列表(例如“PEN()”)的样式部件是合法的。对于没有任何指定值的每个参数,由客户端应用程序使用其自己的默认值。本文档为大多数参数提供建议性默认值,但应用程序不必使用这些默认值。

当{<field_name>}用于tool_param值时,有几个与单位相关的选项可用。这些单位可以在字段名后面指定为“笔”(c:#FF0000,w:{lineúwidth}pt),也可以保留为“笔”(c:#FF0000,w:{lineúwidth})中未指定的单位。在第一种情况下,默认单位是点(pt),但如果属性字段line_width包含一个后跟单位缩写的值(例如“5px”),则属性字段中指定的单位具有优先权(在本例中为像素)。请注意,属性字段不必包含单位值,而且在大多数情况下可能不包含;它只是一个可选功能,可以从属性字段的值内部覆盖默认单位。

2.3笔工具参数

适用的几何类型:

  • 点:应用于点时,笔工具只能定义要绘制的点的颜色和大小。

  • 折线:这是最明显的情况。

  • 多边形:定义绘制多边形轮廓的方式。

这是钢笔工具参数的当前列表。虽然这足以涵盖我们迄今为止遇到的所有情况,但将来可能会添加新的参数来处理新类型的图形表示。请再次注意,所有参数都是可选的:

  • c笔颜色 ,表示为十六进制(#RRGGBB [AA] )

    • [AA] :最后两位数字定义alpha通道值,0表示透明,FF表示不透明。默认值为FF(不透明)

    • 建议默认值:黑色(c:#000000)

    • 示例:笔(c:#FF0000)或笔(c:#FF0000FF)

  • w笔宽 ,用单位(g,px,pt,mm,cm,in)表示为数值

    • 建议默认值:1像素

    • 例如:钢笔(c:#FF0000,w:5px)、钢笔(w:3pt)、钢笔(w:50g)

  • p模式 . 创建虚线。向下/向上笔划距离的列表

    实例:

    • style_pen1 =笔(c:#FF0000,w:2px,p:“4px 5px”)。短虚线

    • style_pen2 =笔(c:#FF0000,w:2px,p:“10px 5px”)。长虚线

    • style_pen3 =笔(c:#FF0000,w:2px,p:“10px 5px 4px 5px”)。长/短划线

  • idComma-delimited list of Pen Names or Ids 用于识别带有名称或id的笔的系统。将扫描以逗号分隔的id列表中的名称,直到目标系统识别其中一个。笔标识可以是系统特定的标识(见下文),也可以是已知线型的预定义OGR笔标识之一。id参数应该始终在以逗号分隔的id列表的末尾包含一个OGR id,这样应用程序就不必依赖于理解特定于系统的id。

    以下是OGR笔ID的当前列表(可能会增长):

    • ogr-pen-0:solid(不提供id时的默认值)

    • ogr-pen-1:空笔(不可见)

    • ogr-pen-2:短划线

    • ogr-pen-3:短划线

    • ogr-pen-4:长划线

    • ogr-pen-5:点线

    • ogr-pen-6:点划线

    • ogr-pen-7:点划线

    • ogr-pen-8:交替线(每隔一个像素设置一次)

特定于系统的id很可能只对创建它们的特定系统有意义。ids应该以系统名称开头,后跟破折号(-),后跟对该系统有意义的任何信息(数字、名称、文件名等)。e、 例如“mapinfo-5”或“mysoft”-线条.sym-123”或“othersystems funnyline”

允许使用特定于系统的ID,以防止在处理来自系统的数据时丢失信息,这些系统将线型图案存储在外部文件中,或者具有自己的预定义线型集(例如,在不丢失任何信息的情况下执行MapInfo MIF到TAB的转换)。

实例:

  • 笔(c:#00FF00,id:“ogr-PEN-0”)—简单实线

  • PEN(c:#00FF00,id:“mapinfo-5,ogr-PEN-7”)—对应于mapinfo的PEN#5,无法理解mapinfo pens的系统将返回默认的“ogr-PEN-7”笔(点-点-线)。

  • cap笔帽 -设置直线端点的形状。

    • "上限:b“-对接:线的端点不超出端点。这是默认值。

    • "上限:r“-圆:用直径等于线宽的圆终止线。

    • "上限:p“-突出:类似于对接,但线的末端超出端点的一半线宽。

  • j笔连接 -设置线的连接点(顶点)的形状。

    • “j:m”-斜接:延伸线的外边缘,直到它们接触。这是默认值。

    • “j:r”-圆角:用一个弧连接线,弧的中心在连接点上,弧的直径等于线的宽度。

    • “j:b”-倒角:用对接端盖连接线,并在连接位置填充产生的三角形缺口。

  • dp垂直偏移 ,表示为数值单位(g,px,pt,mm,cm,in)

    从线中心偏移。如果偏移量为负,则画笔将在主线段的左侧绘制,否则画笔将在右侧绘制。

  • l优先级 -定义样式零件绘制顺序的数值。

    优先级较低的样式零件首先绘制,优先级较高的样式零件在顶部绘制。如果未指定优先级,则默认值为1。

2.4刷具参数

适用的几何类型:

  • 要点:不适用。

  • 折线:不适用。

  • 多边形:定义多边形曲面的填充方式。

以下是笔刷工具参数的当前列表。请再次注意,此列表将来可能会扩展,并且所有参数都是可选的:

  • fc毛刷前景色 ,以十六进制(#RRGGBB)表示 [AA] ). 用于画笔图案本身。

    • [AA] :最后两位数字定义alpha通道值,0表示透明,FF表示不透明。默认值为FF(不透明)

    • 建议默认值:50%灰色(c:#808080)

    • 示例:刷子(fc:#FF0000)

  • bc画笔背景色 ,以十六进制(#RRGGBB)表示 [AA] ). 用于绘制画笔图案后面的区域。

    • [AA] :最后两位数字定义alpha通道值,0表示透明,FF表示不透明。默认值为FF(不透明)

    • 建议默认值:透明(c:#ffffff 00)

    • 示例:画笔(fc:#FF0000,bc:#FFEEDD)

  • id画笔名称或画笔Id -以逗号分隔的画笔名称或ID列表。将扫描以逗号分隔的ID列表中的名称,直到目标系统识别出一个为止。

    笔刷id可以是特定于系统的id(见下文),也可以是已知笔刷模式的预定义OGR笔刷id之一。id参数应该始终在以逗号分隔的id列表的末尾包含一个OGR id,这样应用程序就不必依赖于理解特定于系统的id。

    以下是OGR笔刷id的当前列表(可能会随着时间的推移而增长):

    ../_images/style_ogr_brush.png
    • ogr-brush-0:纯色前景色(未提供id时的默认值)

    • ogr-brush-1:空笔刷(透明-无填充,与fc或bc值无关)

    • ogr-brush-2:水平舱口

    • ogr-brush-3:垂直舱口

    • ogr-brush-4:从左上到右下对角线图案填充

    • ogr-brush-5:从左下到右上的对角线图案填充

    • ogr-brush-6:交叉舱口

    • ogr-brush-7:对角线交叉阴影

    与笔id一样,系统特定的画笔id很可能只对创建它们的特定系统有意义。id应该以系统名称开头,后跟一个破折号(-),后跟对该系统有意义的任何信息(数字、名称、文件名等)。

    以下约定将用于特定于系统的常用画笔ID:

    • 用于Windows bmp模式的“bmp filename.bmp”

    将来可能会添加其他约定(如矢量符号、WMF等)。

  • a角度 -应用于画笔图案的旋转角度(以度为单位,逆时针)。

  • s尺寸或比例因子 -带或不带单位的数值。

    如果指定了单位,则此值是绘制笔刷或符号的绝对大小。如果未指定单位,则将其作为相对于符号默认大小的比例因子。

  • dxdy间距 ,用单位(g,px,pt,mm,cm,in)表示为数值

    如果使用点符号填充区域,这些值将定义要在它们之间使用的间距。”“dx”是两个相邻符号中心之间的水平距离,“dy”是垂直距离。默认情况下,分别为dx和dy使用符号的边界框宽度和高度。

  • l优先级 -定义样式零件绘制顺序的数值。

    优先级较低的样式零件首先绘制,优先级较高的样式零件在顶部绘制。如果未指定优先级,则默认值为1。

2.5符号工具参数

适用的几何类型:

  • 点:在点的位置放置符号

  • 多段线:沿多段线放置符号,可以在每个顶点处放置,也可以等距放置。

  • 多边形:将符号放在多边形的轮廓上。

以下是符号工具参数的当前列表。请再次注意,此列表将来可能会扩展,并且所有参数都是可选的:

  • id符号名称或标识 -符号名或ID的逗号分隔列表。

    将扫描以逗号分隔的ID列表中的名称,直到目标系统识别出一个名称为止。

    符号标识可以是特定于系统的标识(见下文),也可以是用于已知符号的预定义OGR符号标识之一。id参数应该始终在逗号分隔的id列表的末尾包含一个OGR id,这样应用程序就不必依赖于理解系统特定的id。

    下面是OGR符号id的当前列表(可能会随着时间的推移而增长):

    ../_images/style_ogr_sym.png
    • ogr-sym-0:十字(+)

    • ogr-sym-1:诊断交叉(X)

    • ogr-sym-2:圆(未填充)

    • ogr-sym-3:圆形(实心)

    • ogr-sym-4:正方形(未填充)

    • ogr-sym-5:方形(填充)

    • ogr-sym-6:三角形(未填充)

    • ogr-sym-7:三角形(填充)

    • ogr-sym-8:星形(未填充)

    • ogr-sym-9:星形(填充)

    • ogr-sym-10:垂直条(可以使用“角度”属性旋转以生成对角线条)

    与Pen id一样,系统特定的符号id很可能只对创建它们的特定系统有意义。id应该以系统名称开头,后跟一个破折号(-),后跟对该系统有意义的任何信息(数字、名称、文件名等)。

    以下约定将用于特定于系统的通用符号标识:

    • 用于Windows bmp符号的“bmp filename.bmp”

    • “字体符号-%d”对于字体符号,其中%d是字体内的字形数字,字体系列由定义 f 样式字段。

    将来可能会添加其他约定(例如矢量符号、WMF等)

  • a角度 -应用于符号的旋转角度(以度为单位,逆时针)。

  • c符号颜色 ,以十六进制(#RRGGBB)表示 [AA] )

    • [AA] :最后两位数字定义alpha通道值,0表示透明,FF表示不透明。默认值为FF(不透明)

    • 建议的默认符号颜色:黑色(c:#000000)

    • 例子::

      SYMBOL(c:#FF0000)
      
  • o符号轮廓颜色 ,以十六进制(#RRGGBB)表示 [AA] )

    如果设置了此参数,则会在符号周围绘制此颜色的附加光晕或边框。

  • s尺寸或比例因子 -带或不带单位的数值。

    如果指定了单位,则此值是绘制符号的绝对大小。如果未指定单位,则将其作为相对于符号默认大小的比例因子。

  • dxdyX和Y偏移 符号插入点的,表示为带单位的数值(g,px,pt,mm,cm,in)

    应用于点几何图形,以及放置在多段线每个顶点的符号。

  • dsdpdi间距参数 对于沿直线间隔的符号,用单位(g,px,pt,mm,cm,in)表示为数值。

    • ds 沿直线放置符号时要使用的步骤。默认情况下,应用于具有线几何图形的要素的符号放置在每个顶点,但设置“ds”会触发符号沿线等距离的放置。”“ds”对具有点几何图形的特征无效。

    • dp 可与“ds”一起使用,以指定符号中心与放置它们的线之间的垂直距离。

    • di 可用于指定从线的起点开始的初始偏移。

    • 例子::

      SYMBOL(id:123, s:5, di:5px, ds:50px)
      
  • l优先级 -定义样式零件绘制顺序的数值。

    优先级较低的样式零件首先绘制,优先级较高的样式零件在顶部绘制。如果未指定优先级,则默认值为1。

  • f字体名称 -以逗号分隔的字体名称列表。

    与CSS字体族属性类似:扫描字体名称列表,直到遇到已知的字体名称。

    例子::

    SYMBOL(c:#00FF00,s:12pt,id:"font-sym-75,ogr-sym-9",f:"MapInfo_Cartographic")
    

2.6标记刀具参数

适用的几何类型:

  • 点:在点的位置放置文本标签

  • 多段线:沿多段线放置文字。

  • 多边形:在多边形的质心处放置标签。所有参数的行为与几何体是位于多边形质心的点的行为完全相同。

以下是标签工具参数的当前列表。请再次注意,此列表将来可能会扩展,并且所有参数都是可选的:

  • f字体名称 -以逗号分隔的字体名称列表。

    与CSS字体族属性类似:扫描字体名称列表,直到遇到已知的字体名称。

    例子::

    LABEL(f:"Noto Sans, Helvetica", s:12pt, t:"Hello World!")
    
  • s字体大小 ,表示为带有单位(g、px、pt、mm、cm、in)的数值。

    在CAD世界中,字体大小或“文本高度”决定了大写字母的高度,印刷师称之为“大写字母高度”。但在排版、绘图和制图领域,字体大小指的是字体的“em高度”,它比大写字母高。这意味着,在DXF文件中指定高度为1英寸的文本看起来要比PDF文件或MapInfo地图中的72点文本大(通常大约大45%)。目前,GDAL向量驱动程序将“s:”样式的字符串值视为该格式本机使用的字体大小度量(cap height或em height),这可能导致在使用ogr2ogr工具时文本大小不正确。这个参数将来可能会有更明确的规定。

  • t文本字符串 -可以是常量字符串,也可以是对属性字段值的引用。

    如果字符串中存在双引号字符或反斜杠()字符,则在其前面使用反斜杠字符对其进行转义。

    示例:

    LABEL(f:"Arial, Helvetica", s:12pt, t:"Hello World!")
    LABEL(f:"Arial, Helvetica", s:12pt, t:"Hello World with escaped \\"quotes\" and \\\backslash!")
    LABEL(f:"Arial, Helvetica", s:12pt, t:{text_attribute})
    
  • a角度 -旋转角度(以度为单位,逆时针)。

  • c文本前景色 ,以十六进制(#RRGGBB)表示 [AA] )建议默认值:黑色(c:#000000)

  • b文本背景色 -标签后面要绘制的填充框的颜色,以十六进制(#RRGGBB)表示 [AA] ). 如果未设置,则不绘制框。

  • o文本大纲颜色 -文本轮廓的颜色(MapInfo术语中的光环),以十六进制(#RRGGBB)表示 [AA] ). 如果没有设置轮廓。

  • h阴影颜色 -文本阴影的颜色,以十六进制(#RRGGBB)表示 [AA] ). 如果没有设置阴影。

  • w伸展 -拉伸因子按给定百分比更改字体中所有字符的宽度。例如,如果设置为150,则字体中的所有字符都将拉伸到其通常宽度的150%。默认拉伸因子为100。

  • m标签放置模式 -如何相对于要素的几何图形绘制文字。

    • “m:p”-默认值。简单标签附着到点或多段线的第一个顶点。

    • “m:l”-文本附着到多段线的最后一个顶点。笔工具可以与此标签工具结合使用,以绘制多段线作为标签的引线。

    • “m:s”-沿多段线拉伸文本字符串,每个字符之间的间距相等。

    • “m:m”-将文本作为单个标签放置在多段线的中间(基于总行长)。

    • “m:w”-多段线中每个线段一个字。

    • “m:h”-附着在多段线上的每一个文字都水平放置在其段中,定位点是段的中心。

    • “m:a”-附加到多段线的每个文字都会拉伸以适合多段线的线段,并沿该线段放置。锚点是线段的起点。

  • p锚定位置 -从1到12的值,定义标签相对于其附着点的位置

    有四种垂直对齐模式: 基线中心top底部 ;和三种水平模式: left中心正确的 .

    ../_images/style_textanchor.png

    目前,这些值的精确解释(例如,大写字母上的重音是位于p:7对齐点的上方还是下方)因文件格式而异。这个参数将来可能会有更明确的规定。

  • dxdyX和Y偏移 标签插入点的长度,用单位(g,px,pt,mm,cm,in)表示。

    应用于放置在点或多段线的每个顶点上的文本。

  • dp垂直偏移 对于沿直线放置的标签,用带单位(g、px、pt、mm、cm、in)的数值表示。

    “dp”指定标签与其所在直线之间的垂直距离。如果偏移量为负,则标签将从主线段向左移动,否则向右移动。

  • boBold -粗体文本设置为1。设置为0或忽略。

  • it斜体字 -斜体文本设置为1。设置为0或忽略。

  • un下划线 -下划线文本设置为1。设置为0或忽略。

  • st删除线 -设置为1表示穿透文本。设置为0或忽略。

  • l优先级 -定义样式零件绘制顺序的数值。

    优先级较低的样式零件首先绘制,优先级较高的样式零件在顶部绘制。如果未指定优先级,则默认值为1。

2.7样式表格式

对于支持样式表的文件格式,则预定义的样式将以该格式存储。

对于不支持样式表的文件格式,样式表可以存储在扩展名为.ofs(OGR Feature styles)且与数据集同名的文本文件中。这将适用于Esri Shapefile等格式。

下面是.ofs文件的示例:

#OFS-Version: 1.0
#StyleField: "style"

DefaultStyle: PEN(c:#000000)
road:      PEN(c:#FF0000,w:5px)
lake:      BRUSH(fc:#0000FF);PEN(c:#000000)
campsite:  SYMBOL(c:#00FF00,id:"points.sym-45,ogr-sym-7")
label:     LABEL(f:"Times New Roman",s:12pt,t:{text_attribute})

第一行是带有版本号的签名,必须存在。

第二行(style field:“style”)是属性字段的名称,其中存储了对应层中每个对象的要素样式字符串。这是可选的,如果未设置,则图层中的对象都将共享DefaultStyle中定义的相同样式。

第三行(DefaultStyle:…)定义默认情况下应用于所有没有显式样式的对象的样式。

接下来是样式定义列表。

2.8使用OGR SQL在数据源之间传输样式

你可以使用 OGR_STYLE 提取要素级样式的特殊字段,根据以下示例,ogr2ogr可用于在数据源之间传输样式字符串:

ogr2ogr -f "ESRI Shapefile" -sql "select *, OGR_STYLE from rivers" rivers.shp rivers.tab

在不指定样式字段长度的情况下,输出驱动程序可以将长度截断为默认值。因此,可能需要手动指定目标长度,例如:

ogr2ogr -f "ESRI Shapefile" -sql "select *, CAST(OGR_STYLE AS character(255)) from rivers" rivers.shp rivers.tab

OGR知道使用OGR_样式字段(如果存在),如果没有以编程方式指定样式字符串,则OGRFeature::GetStyleString将返回此字段的值。


三。OGR支持类

这个 OGRFeature 类具有成员函数 OGRFeature::GetStyleString()OGRFeature::SetStyleString()OGRFeature::SetStyleStringDirectly() 它可以作为C样式字符串与要素的样式字符串交互。此外,还有 OGRFeature::GetStyleTable()OGRFeature::SetStyleTable()OGRFeature::SetStyleTableDirectly() 用于将样式表作为 OGRStyleTable 班级。

这个 OGRLayerGDALDataset 班级也有 OGRLayer::GetStyleTable()OGRLayer::SetStyleTable()OGRLayer::SetStyleTableDirectly() 成员函数。

To parse style strings, the OGRStyleMgr class is used. Each style tool in the string is accessed as an instance of the OGRStyleTool class. Lastly, four helper classes exist, one for each tool (OGRStylePen, OGRStyleBrush, OGRStyleSymbol, OGRStyleLabel), with each available parameter represented by a getter and setter member function. To understand these classes better, it may be useful to read the ogr_featurestyle.h and ogrfeaturestyle.cpp code files.

下面是一些C++代码示例:

OGRStyleTable oStyleTable;

OGRStyleMgr *poStyleMgr = new OGRStyleMgr(&oStyleTable);

// Create a new style in the style table by specifying the whole style string

if (poStyleMgr->AddStyle("@Name","PEN(c:#123456;w:10px);BRUSH(c:#345678)"))
{
  poStyleMgr->SetFeatureStyleString(poFeature,"@Name",TRUE)
  // or
  poStyleMgr->SetFeatureStyleString(poFeature,"PEN(c:#123456,w:10px);BRUSH(c:#345678)",FALSE)
}

oStyleTable->SaveStyleTable("ttt.tbl");


// Create a new style in the style table by specifying each tool (part) as a string

poStyleMgr->InitStyleString();
poStyleMgr->AddPart("PEN(c:#123456,w:10px)");
poStyleMgr->AddPart("BRUSH(c:345678)");
poStyleMgr->AddStyle("@Name");
poStyleMgr->SetFeatureStyleString(poFeature,"@Name",TRUE);

oStyleTable->SaveStyleTable("ttt.tbl");


// Create a new style in the style table using the style tool helper classes

OGRStyleTool *poStylePen = new OGRStylePen;

poStylePen->SetColor("#123456");
poStylePen->SetUnit(OGRSTUPixel);
poStylePen->SetWidth(10.0);
poStyleMgr->AddPart(poStylePen);

delete poStylePen;


// Reading a style

OGRStyleTool *poStyleTool;

poStyleMgr->GetStyleString(poFeature);

for (int iPart = 0; iPart < poStyleMgr->GetPartCount(); iPart++)
{
   poStyleTool = GetPart(iPart);
   switch (poStyleTool->GetType())
   {
      case OGRSTCPen:
         poStylePen = (OGRStylePen *)poStyleTool;
         pszColor = poStylePen->Color(bDefault);
         if (bDefault == FALSE)
           poStylePen->GetRGBFromString(pszColor, nRed, nGreen,
                                    nBlue, nTrans);
         else
           // Color not defined

         dfWidth = poStylePen->Width(bDefault);
         if (bDefault == FALSE)
           // Use dfWidth
         else
           // dfWidth not defined

        :
        :
    }
 }

修订历史

  • Version 0.016 - 2018-12-03 - Andrew Sudorgin 恢复并记录点符号的字体属性

  • Version 0.015 - 2018-01-08 - Alan Thomas 更新过时的材料;对画笔“id”和标签“t”、“bo”、“it”、“un”、“st”进行细微更改;澄清画笔“fc”、“bc”、符号“o”和标签“s”、“w”、“p”

  • Version 0.014 - 2011-07-24 - Even Rouault 提及标签文本字符串中双引号字符的转义(ticket#3675)

  • Version 0.013 - 2008-07-29 - Daniel Morissette 添加“o:”表示字体点符号轮廓颜色(ticket#2509)

  • Version 0.012 - 2008-07-21 - Daniel Morissette 添加了“o:”作为文本轮廓颜色,并更新了“b:”作为特定的填充标签背景框(ticket#2480)

  • Version 0.011 - 2008-02-28 - Tamas Szekeres 关于在数据源之间传输样式的OGR SQL的说明

  • Version 0.010 - 2006-09-23- Andrey Kiselev Added label styles 'w', 'st', 'h', 'm:h', 'm:a', 'p:{10,11,12}'

  • Version 0.009 - 2005-03-11- Frank Warmerdam 删除对OGRWin的引用,移到ogr发行版中

  • Version 0.008 - 2001-03-21- Frank Warmerdam 修正小错误(示例中h:12pt而不是s:12pt)

  • Version 0.008 - 2000-07-15 - Stephane Villeneuve 删除图层中的样式表。将前景色和背景色添加到画笔。

  • Version 0.007 - 2000-06-22 - Daniel Morissette 修正了输入错误并为笔添加了偏移参数。

  • Version 0.006 - 2000-06-20 - Daniel Morissette 添加了OGR Win的想法,并在这里和那里做了一些小的改变。

  • Version 0.005 - 2000-06-12 - Daniel Morissette 允许在PEN的“id”参数中传递逗号分隔的名称列表。定义了独立于系统的笔样式名称。

  • Version 0.004 - 2000-06-09 - Stephane Villeneuve 添加了笔帽和连接参数,更清楚地定义了API

  • Version 0.003 - 2000-02-15 - Daniel Morissette 第一种完整的版本。