geomtransform-:几何转换

作者

Håvard Tveite

接触

havard.tveite@nmbu.no

几何体转换返回新几何体。几何变换的目的可以是实现符号渲染和标记的特殊效果。

几何转换可在 LAYER 水平和 STYLE 水平。在 LAYER 级别(从6.4开始),使用原始矢量几何图形(“真实世界”坐标)。在 STYLE 级别,使用像素坐标。

在“layer”级别应用像素值可能很有用,这是可能的。如果在“layer”中定义了“units”,则可以使用[map_cellsize]变量在“layer”级别转换为像素值:

GEOMTRANSFORM (simplify([shape], [map_cellsize]*10))

STYLE

以下简单的几何图形转换在“class`` style`级别可用:

  • bbox

  • centroid

  • end

  • start

  • vertices

bbox

  • ` geomtransform bbox`返回几何体的边界框。

    • geomtransform “bbox”

注解

仅适用于 STYLECLASS 语境。

../_images/geomtrans-bbox.png

GeomTransform BBox

示例的类定义:

CLASS
  STYLE
    COLOR 0 0 0
    WIDTH 6
  END # STYLE
  STYLE
    GEOMTRANSFORM "bbox"
    OUTLINECOLOR 255 0 0
    WIDTH 1
    PATTERN 1 2 END
  END # STYLE
END # CLASS

centroid

  • ` geomtransform centroid`返回几何体的质心。

    • 几何变换“质心”

注解

仅适用于 STYLECLASS 语境。

../_images/geomtrans-centroid.png

几何变换质心

示例的样式定义。::

STYLE
  GEOMTRANSFORM "centroid"
  COLOR 255 0 0
  SYMBOL circlef
  SIZE 5
END # STYLE

'circlef'符号的符号定义::

SYMBOL
  NAME "circlef"
  TYPE ellipse
  FILLED true
  POINTS
    1 1
  END # POINTS
END # SYMBOL

end and start

  • ` geomtransform end`返回直线的终点。

  • ` geomtransform start`返回直线的起点。

    • geomtransform :“开始”

    • END end

开始/结束点处的线条方向可用于渲染效果。

注解

仅适用于 STYLECLASS 语境。

../_images/geomtrans-startend.png

geomtransform:开始和结束用法

示例的类定义。

图的下半部分:

CLASS
  STYLE
    GEOMTRANSFORM "start"
    SYMBOL "circlef"
    COLOR 255 0 0
    SIZE 20
  END # STYLE
  STYLE
    COLOR 0 0 0
    WIDTH 4
  END # STYLE
  STYLE
    GEOMTRANSFORM "end"
    SYMBOL "circlef"
    COLOR 0 255 0
    SIZE 20
  END # STYLE
END # CLASS

图的上部:

CLASS
  STYLE
    COLOR 0 0 0
    WIDTH 4
  END # STYLE
  STYLE
    GEOMTRANSFORM "start"
    SYMBOL "startarrow"
    COLOR 255 0 0
    SIZE 20
    ANGLE auto
  END # STYLE
  STYLE
    GEOMTRANSFORM "start"
    SYMBOL "circlef"
    COLOR 0 0 255
    SIZE 5
  END # STYLE
  STYLE
    GEOMTRANSFORM "end"
    SYMBOL "endarrow"
    COLOR 0 255 0
    SIZE 20
    ANGLE auto
  END # STYLE
  STYLE
    GEOMTRANSFORM "end"
    SYMBOL "circlef"
    COLOR 0 0 255
    SIZE 5
  END # STYLE
END # CLASS

Startarrow符号定义(Endarrow相同,但AnchorPoint除外(Endarrow的值:1 0.5)::

SYMBOL
  NAME "startarrow"
  TYPE vector
  FILLED true
  POINTS
    0 0.4
    3 0.4
    3 0
    5 0.8
    3 1.6
    3 1.2
    0 1.2
    0 0.4
  END # POINTS
  ANCHORPOINT 0 0.5
END # SYMBOL

vertices

  • ` geomtransform vertices`生成一条直线的顶点集(带有方向信息)。

    • GEOMTRANSFORM "vertices"

注解

仅适用于 STYLECLASS 语境。

../_images/geomtrans-vertices.png

几何变换顶点

示例的类定义:

CLASS
  STYLE
    COLOR 0 0 0
    WIDTH 4
  END # STYLE
  STYLE
    GEOMTRANSFORM "vertices"
    SYMBOL "vertline"
    COLOR 0 0 0
    WIDTH 2
    SIZE 20
    ANGLE AUTO
  END # STYLE
END # CLASS

垂直线符号定义:

SYMBOL
  NAME "vertline"
  TYPE vector
  POINTS
    0 0
    0 1
  END # POINTS
END # SYMBOL

Labels (LABEL STYLE only)

以下简单的几何转换可在 LABEL STYLE 水平:

  • labelpnt

  • labelpoly

这些用于标签样式(背景色、背景阴影、背景框)。

注解

labelpnt LAYER LABELCACHE LABELCACHEON labelpnt.

labelpnt和labelpoly

  • GEOMTRANSFORM labelpnt CC.

    • geomtransform: "labelpnt"

  • ` geomtransform labelpoly`生成一个覆盖标签的多边形加上一个1像素的填充。

    • geomtransform:“labelpoly”

注解

仅适用于 STYLELABEL 语境。

这些转换可用于为标签制作背景矩形,并向标签点添加符号。

../_images/geomtrans-label.png

geomtransform labelpnt 和 labelpoly

示例的类定义:

CLASS
  STYLE
    OUTLINECOLOR 255 255 204
  END # STYLE
  LABEL
    SIZE giant
    POSITION UC
    STYLE # shadow
      GEOMTRANSFORM "labelpoly"
      COLOR 153 153 153
      OFFSET 3 3
    END # Style
    STYLE # background
      GEOMTRANSFORM "labelpoly"
      COLOR 204 255 204
    END # Style
    STYLE # outline
      GEOMTRANSFORM "labelpoly"
      OUTLINECOLOR 0 0 255
      WIDTH 1
    END # Style
    STYLE
      GEOMTRANSFORM "labelpnt"
      SYMBOL 'circlef'
      COLOR 255 0 0
      SIZE 15
    END # Style
  END # Label
END # Class

'circlef'符号的符号定义::

SYMBOL
  NAME "circlef"
  TYPE ellipse
  FILLED true
  POINTS
    1 1
  END # POINTS
END # SYMBOL

CLASS

组合/链接表达式

几何体转换生成一个几何体,该几何体可以用作另一个几何体转换的输入。实现这一点至少有两种方法。一种是将基本的几何转换表达式组合成更复杂的几何转换表达式,另一种是将“layer”级别的几何转换表达式与“class`` style”级别的几何转换表达式或简单的几何转换结合起来。

Combining geometry transformation expressions 几何转换表达式包含一个`[shape]`部分。“[形状]”部分可以由几何转换表达式替换。

例如::

GEOMTRANSFORM (simplify(buffer([shape], 20),10))

buffer simplify.

一种显示以下内容的样式:

STYLE
  GEOMTRANSFORM (simplify(buffer([shape], 20),10))
  OUTLINECOLOR 255 0 0
  WIDTH 2
END # STYLE

此转换的结果显示在下图(红线)的顶部。原始多边形显示为一条完整的黑线,缓冲区显示为一条黑色虚线。

Combining expressions with simple geometry transformations CLASS LAYER 水平。

从执行此类组合的层定义中摘录:

LAYER
  ...
  GEOMTRANSFORM (simplify(buffer([shape], 10),5))
  CLASS
    ...
    STYLE
      GEOMTRANSFORM "vertices"
      COLOR 255 102 102
      SYMBOL vertline
      SIZE 20
      WIDTH 2
      ANGLE auto
    END # STYLE
  END # CLASS
END # LAYER

此转换的结果显示在下图(红线)的底部。图层级别的geomtransform的结果显示为一条完整的黑线。原始多边形与图中顶部使用的多边形相同。

../_images/geomtrans-expressions.png

组合geomtransform表达式

缓冲区

  • ` geomtransform buffer`返回原始几何体的缓冲区。结果始终是多边形几何体。

    • geomtransform:(缓冲区([形状],缓冲区大小)

注解

不支持“bufferSize”(后退)的负值。

注解

可用于 LAYER 水平和 STYLECLASS 语境。

注解

对于点几何图形,缓冲区似乎不起作用。

../_images/geomtrans-buffer.png

geomtransform:缓冲区

示例的一些类定义。

下部(带缓冲区的多边形)::

CLASS
  STYLE
    OUTLINECOLOR 0 255 0
    GEOMTRANSFORM (buffer([shape], 20))
    WIDTH 1
  END # STYLE
  STYLE
    OUTLINECOLOR 0 0 255
    GEOMTRANSFORM (buffer([shape], 10))  #
    WIDTH 1
  END # STYLE
  STYLE
    COLOR 255 0 0
    GEOMTRANSFORM (buffer([shape], 5))  #
  END # STYLE
  STYLE
    COLOR 0 0 0
  END # STYLE
END # CLASS

右上角(层级geomtransform)::

LAYER  # line buffer layer
  STATUS DEFAULT
  TYPE LINE
  FEATURE
    POINTS
      80 70
      80 75
    END # Points
  END # Feature
  GEOMTRANSFORM (buffer([shape], 10))
  CLASS
    STYLE
      COLOR 0 0 255
    END # STYLE
  END # CLASS
END # LAYER

归纳([形状],公差)

  • GEOMTRANSFORM generalize simplifies a geometry ([shape]) in a way comparable to FME’s ThinNoPoint algorithm. See http://trac.osgeo.org/gdal/ticket/966 更多信息。

    • geomtransform:(通用([形状],公差)

    公差是强制性的,并且是与原始行相比,广义行允许的最大偏差的规范。公差值越高,线条越通用/简化。

注解

可用于 LAYER 水平和 STYLECLASS 语境。

注解

取决于地理位置。

generalize STYLE 随着公差值(10-绿色、20-蓝色和40-红色)的增加而变平。

../_images/geomtrans-generalize.png

地球变换概括

其中之一 STYLE 示例定义(公差40):

STYLE
  GEOMTRANSFORM (generalize([shape], 40))
  COLOR 255 0 0
  WIDTH 1
  PATTERN 3 3 END
END # STYLE

简化([形状],公差)

  • ` geomtransform使用标准道格拉斯-派克算法简化了几何体([形状])。

    • GEOMTRANSFORM (simplify([shape], tolerance))

    公差是强制性的,并且是与原始行相比,广义行允许的最大偏差的规范。公差值越高,线条越通用/简化。

注解

可用于 LAYER 水平和 STYLECLASS 语境。

simplify STYLE 随着公差值(10-绿色、20-蓝色和40-红色)的增加而变平。

../_images/geomtrans-simplify.png

Geomtransform simplify

其中之一 STYLE 示例定义(公差40):

STYLE
  GEOMTRANSFORM (simplify([shape], 40))
  COLOR 255 0 0
  WIDTH 1
  PATTERN 3 3 END
END # STYLE

simplifypt([shape], tolerance)

  • GEOMTRANSFORM simplifypt tolerance 必须为非负。

    • geomtransform(simplifypt([形状],公差))

    公差是强制性的,并且是与原始行相比,广义行允许的最大偏差的规范。公差值越高,线条越通用/简化。

注解

可用于 LAYER 水平和 STYLECLASS 语境。

simplifypt STYLE 随着公差值(10-绿色、20-蓝色和40-红色)的增加而变平。

../_images/geomtrans-simplifypt.png

geomtransform 的简化

其中之一 STYLE 示例定义(公差40):

STYLE
   GEOMTRANSFORM (simplifypt([shape], 40))
   COLOR 255 0 0
   WIDTH 1
   PATTERN 3 3 END
 END # STYLE

平滑(形状),平滑大小,平滑迭代,预处理)

  • ` geomtransform smoothsia`返回线条的平滑版本。

    • geomtransform:(平滑度([形状]、平滑度大小、平滑度迭代、预处理)

    使用以下参数:

    • *形状*(必需)。指定要使用的几何图形

    • *平滑大小*(可选)。算法使用的窗口大小(点数)。默认值为3。

    • *平滑“迭代次数”(可选)。算法的迭代次数。默认值为1。

    • *预处理*(可选)。预处理方法,在平滑之前向几何体添加更多顶点,如下所述。有两种可能的预处理方法:

      • *全部*在每个原始顶点的每一侧添加两个中间顶点。这对于保留具有低分辨率数据的线条的一般形状很有用。

      • angle 根据角度检测在某些特定位置添加顶点。

注解

可用于 LAYER 水平和 STYLECLASS 语境。

简单层定义示例:

LAYER NAME "my_layer"
TYPE LINE
STATUS DEFAULT
DATA roads.shp
GEOMTRANSFORM (smoothsia([shape], 3, 1, 'angle'))
CLASS
  STYLE
    WIDTH 2
    COLOR 255 0 0
  END
END

下面是一些显示不同参数值结果的示例。

../_images/smoothing11.png

原始几何图形(左)和具有默认参数的平滑(右)

../_images/smoothing21.png

Smoothsia-窗口大小(左)越大,窗口大小越大,迭代次数越多(右)

调整冰沙的行为

smoothsia有几个参数可用于调整其行为。以下章节描述了一些案例/可能性。

数据集分辨率太高

如果试图平滑具有非常高分辨率的线(当前视图比例下顶点的高密度),则可能无法获得预期的结果,因为顶点对于平滑窗口大小而言过于密集。在这种情况下,您可能希望在平滑之前简化几何图形。您可以在单个geomtransform中组合平滑和简化:

GEOMTRANSFORM (smoothsia(simplifypt([shape], 10)))

RFC 89: Layer Geomtransform 更多信息。以下是问题的可视化:

../_images/smoothing_highres1.png

高分辨率几何、平滑和简化

数据集分辨率太低

如果试图平滑顶点密度较低的长线,在某些情况下可能无法获得预期的结果。在平滑过程中,可能会丢失几何体的某些重要部分,例如锐角周围。可以通过启用预处理步骤在平滑之前沿直线添加中间顶点来改进结果。

此行为使用“smoothsia”geomtransform预处理参数中的“all”值进行控制:

GEOMTRANSFORM (smoothsia([shape], 3, 1, 'all'))

此预处理将在平滑之前执行。它在每个原始顶点的每一侧添加2个中间顶点。如果我们真的需要保留低分辨率线的一般形状,这是有用的。请注意,这可能会影响渲染,因为输出中将有更多的顶点。

以下是问题的可视化:

../_images/smoothing_lowres1.png

正态平滑和预处理的影响

曲线

预处理步骤可能不适用于所有情况,因为它会显著影响平滑结果。但是,如果没有它,您可能会注意到对于线顶点之间距离较大的曲线平滑效果不佳。请参见此示例:

../_images/smoothing_curve11.png

正常平滑效果(无预处理)

您可以通过启用另一种类型的预处理来改进这一点:“角度”。这将在一些特定的地方添加基于角度检测的点来识别曲线。以下是启用它的方法:

GEOMTRANSFORM (smoothsia([shape], 3, 1, 'angle'))
../_images/smoothing_curve21.png

angle

javascript 转换

作者

Alan Boudreault

接触

aboudreault at mapgears.com

最后更新

2013/16/12

介绍

使用“geomtransform”这种方式,除了内置的geomtransform函数外,还可以通过编程方式修改几何图形。

使用

只需通过以下方式声明javascript插件:

MAP
  ...
  LAYER
  ...
    GEOMTRANSFORM "javascript://transform.js" # relative path
    CLASS
    END
  END
END

路径也可以是绝对的。

MAP
  ...
  LAYER
  ...
    GEOMTRANSFORM "javascript:///home/user/transform.js" # absolute path
    CLASS
    END
  END
END

javascript插件必须实现一个名为 geomtransform ,而且这个过程将被自动调用。此函数必须返回新形状。注意 only 将使用此新形状的几何图形,因此将保留原始形状属性。

通过 shape.attributes javascript对象。

可以使用以下javascript函数:

  • alert(str1, str2, ..., str)

    在MapServer日志中打印一些文本

  • print(str1, str2, ..., str)

    在MapServer日志中打印一些文本

  • require(path_to_lib1, path_to_lib2, ..., path_to_lib)

    包括一个或多个javascript库

例1。简单几何变换

这个例子做了一个简单的垂直翻译…

function geomtransform() {
  new_shape = new shapeObj();
  new_shape.add(new lineObj());
  new_point = new pointObj();
  new_point.x = shape.line(0).point(0).x;
  new_point.y = shape.line(0).point(0).y+30000;
  new_shape.line(0).add(new_point);
  return new_shape;
}

例2。在MapServer日志中打印日志

通过将信息打印到MapServer日志来扩展示例1。

MAP
  ...
  CONFIG  "MS_ERRORFILE" "/tmp/mapserver.log"
  DEBUG 1
  LAYER
  ...
     GEOMTRANSFORM "javascript://transform.js"
  ...
  END
END
function geomtransform() {
  new_shape = new shapeObj();
  new_shape.add(new lineObj());
  new_point = new pointObj();
  new_point.x = shape.line(0).point(0).x;
  new_point.y = shape.line(0).point(0).y+30000;
  print('Modified y value from: ' + shape.line(0).point(0).y + ' to: '+new_point.y);
  new_shape.line(0).add(new_point);
  return new_shape;
}

基本API

当前可以使用最小API创建新形状。

彭波托基

构造函数
new pointObj()
成员

类型

名字

注意

双重的

x

双重的

y

双重的

z

双重的

方法
void setxy(双x,双y[,双m])

设置x,y[,m]值。

void setxyz(双x,双y,双z[,双m])

设置x,y,z[,m]值。

线路对象

构造函数
new lineObj()
成员

类型

名字

注意

利息

点数

只读的

方法
pointObj点(int索引)

返回位于“index”位置的点。

无效添加(pointobj point)

向线条添加点。

void addxy(双x,双y[,双m])

从x,y[,m]值向直线添加点。

void addxyz(双x,双y,双z[,双m])

从x、y、z[、m]值向直线添加点。

形状对象

构造函数
new shapeObj(int type)

类型“”是shapeobj.point、shapeobj.line、shapeobj.polygon或shapeobj.null之一。

成员

类型

名字

注意

利息

数字

只读的

利息

数字

只读的

利息

指数

只读的

利息

类型

只读的

利息

倾斜指数

只读的

利息

类别索引

只读的

文本

文本

对象

属性

方法
shapeobj克隆()

返回形状的克隆。

lineobj line(int索引)

返回位于“index”位置的行。

空添加(lineobj line)

向形状添加线条。

void setgeometry(shapeobj shape)

将对象的几何图形替换为“shape”几何图形。