1 需求及数据预处理
等高线图层在小比例尺下糊做一团,为了解决这个问题,研究了在不同比例尺下显示合适疏密程度的样式设置。在此做个总结。
已知等高线初始等高距为20米,因此可以将等高线大概分为三个层级:小比例尺按200米等高距显示,中等比例尺按100米等高距显示,大比例尺显示全部等高线。
在(postgis)数据库中运行如下sql:
UPDATE dgx SETlevel = CASEWHEN gao % 200 = 0 THEN '3'WHEN gao % 100 = 0 THEN '2'ELSE '1'
END;
运行之后,会将高程值能被200整除的level字段值设置为3,能被100整除的设置为2,其他为1。
于是,level值为3的数据是等高距为200的等高线,level值为3和2的数据是等高距为100的等高线。
(这种处理方式仅针对本项目数据)
2 样式总结
接下来再开始写样式:
<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><NamedLayer><Name>dgx-style</Name><UserStyle><Title>dgx line style</Title><FeatureTypeStyle><Rule><Name>Large</Name><MaxScaleDenominator>80000</MaxScaleDenominator><LineSymbolizer><Stroke><CssParameter name="stroke">#ff0000</CssParameter></Stroke></LineSymbolizer></Rule><Rule><Name>Medium</Name><MinScaleDenominator>80000</MinScaleDenominator><MaxScaleDenominator>500000</MaxScaleDenominator><ogc:Filter><ogc:Or><ogc:PropertyIsEqualTo><ogc:PropertyName>level</ogc:PropertyName><ogc:Literal>3</ogc:Literal></ogc:PropertyIsEqualTo><ogc:PropertyIsEqualTo><ogc:PropertyName>level</ogc:PropertyName><ogc:Literal>2</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Or></ogc:Filter><LineSymbolizer><Stroke><CssParameter name="stroke">#00ff00</CssParameter></Stroke></LineSymbolizer></Rule><Rule><Name>Small</Name><MinScaleDenominator>500000</MinScaleDenominator><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>level</ogc:PropertyName><ogc:Literal>3</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><LineSymbolizer><Stroke><CssParameter name="stroke">#0000ff</CssParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle></NamedLayer>
</StyledLayerDescriptor>
可以看到,sld代码中写了3条Rule,每个Rule都控制了显示的比例尺范围。
3条Rule从上到下的顺序是按照比例尺从大到小写的。
Rule中可以包含name
、MaxScaleDenominator
/MinScaleDenominator
、Filter
、LineSymbolizer
等标签。
其中,name
指定了当前规则的名称,将在图例中标识;MaxScaleDenominator
/MinScaleDenominator
设置了当前规则的最大/最小比例尺,用于控制该样式的生效范围;Filter
可用于过滤当前样式规则中显示的数据,不设置则展示所有数据;LineSymbolizer
用于设置具体的线样式。
我将三种比例尺下的线设置成了不同的颜色,是为了在后面进行成果展示。项目中根据实际需求设置即可。
3 样式说明
以第二条样式Medium为例:
- 控制显示的比例尺范围是从1:500000到1:80000之间:
<MinScaleDenominator>80000</MinScaleDenominator>
<MaxScaleDenominator>500000</MaxScaleDenominator>
- 控制显示的数据是level字段的值等于3或等于2:
<ogc:Filter><ogc:Or><ogc:PropertyIsEqualTo><ogc:PropertyName>level</ogc:PropertyName><ogc:Literal>3</ogc:Literal></ogc:PropertyIsEqualTo><ogc:PropertyIsEqualTo><ogc:PropertyName>level</ogc:PropertyName><ogc:Literal>2</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Or>
</ogc:Filter>
- 控制线样式为黄色:
<LineSymbolizer><Stroke><CssParameter name="stroke">#00ff00</CssParameter></Stroke>
</LineSymbolizer>
以此类推,其他两个样式便也可以理解了。
4 成果展示
图例如下:
各种比例尺下的效果:
5 最后
我写的样式主要是为了解决不同比例尺下数据疏密情况,因此重点在用MinScaleDenominator、MaxScaleDenominator、Filter过滤数据。
如果需求是不同比例尺下数据样式的差异,就需要在LineSymbolizer中设置了。