SLD 几何函数 'area' returns 每个缩放级别的不同值
SLD Geometry function 'area' returns different values at each zoom level
我正在使用 SLD 使用 area function.
用派生区域(笛卡尔)标记多边形
我希望多边形的面积保持一致 - 多边形的大小没有变化,但我发现面积值在每个缩放级别都会发生变化。
我是不是误解了区域功能应该做什么?欢迎任何建议。
截图:
SLD:
<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
<sld:NamedLayer>
<sld:Name>Default Styler</sld:Name>
<sld:UserStyle>
<sld:Name>Default Styler</sld:Name>
<sld:FeatureTypeStyle>
<sld:Name>name</sld:Name>
<sld:Rule>
<sld:Title/>
<sld:MinScaleDenominator>423.0</sld:MinScaleDenominator>
<sld:MaxScaleDenominator>4.43744032E8</sld:MaxScaleDenominator>
<sld:PolygonSymbolizer>
<sld:Fill>
<sld:GraphicFill>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>shape://none</sld:WellKnownName>
<sld:Fill/>
<sld:Stroke>
<sld:CssParameter name="stroke">#ff5722</sld:CssParameter>
</sld:Stroke>
</sld:Mark>
<sld:Size>8</sld:Size>
</sld:Graphic>
</sld:GraphicFill>
<sld:CssParameter name="fill">#ff5722</sld:CssParameter>
</sld:Fill>
</sld:PolygonSymbolizer>
<sld:PolygonSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#ff5722</sld:CssParameter>
<sld:CssParameter name="stroke-width">0</sld:CssParameter>
</sld:Stroke>
</sld:PolygonSymbolizer>
<sld:TextSymbolizer>
<sld:Label>
<ogc:Function name="Area">
<ogc:PropertyName>the_geom</ogc:PropertyName>
</ogc:Function>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">Tahoma</sld:CssParameter>
<sld:CssParameter name="font-size">12</sld:CssParameter>
<sld:CssParameter name="font-style">Normal</sld:CssParameter>
<sld:CssParameter name="font-weight">Normal</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:PointPlacement>
<sld:AnchorPoint>
<sld:AnchorPointX>0.5</sld:AnchorPointX>
<sld:AnchorPointY>0.5</sld:AnchorPointY>
</sld:AnchorPoint>
</sld:PointPlacement>
</sld:LabelPlacement>
<sld:Halo>
<sld:Radius>3</sld:Radius>
<sld:Fill>
<sld:CssParameter name="fill">#EEEEEE</sld:CssParameter>
</sld:Fill>
</sld:Halo>
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
<sld:VendorOption name="spaceAround">25</sld:VendorOption>
<sld:VendorOption name="group">no</sld:VendorOption>
</sld:TextSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
</sld:StyledLayerDescriptor>
正如姐妹 GIS 网站上的 this answer 所说:
geometries are generalized, reprojected, rescaled to screen in place for performance reasons, by the time this function is evaluated it's too late. The code would have to be modified to perform these evaluations before the geometry is modified. It's possible, not immediate to do in general (if done, it would have to affect evaluation of all style properties that might be using the geometry, not just the labels), especially if the same geometry is used by other symbolizers before.
所以唯一的方法就是预先计算面积并将它们存储在数据集中,这也会更有效,因为它可以节省每次移动地图时重新计算面积的时间。
我正在使用 SLD 使用 area function.
用派生区域(笛卡尔)标记多边形我希望多边形的面积保持一致 - 多边形的大小没有变化,但我发现面积值在每个缩放级别都会发生变化。
我是不是误解了区域功能应该做什么?欢迎任何建议。
截图:
SLD:
<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
<sld:NamedLayer>
<sld:Name>Default Styler</sld:Name>
<sld:UserStyle>
<sld:Name>Default Styler</sld:Name>
<sld:FeatureTypeStyle>
<sld:Name>name</sld:Name>
<sld:Rule>
<sld:Title/>
<sld:MinScaleDenominator>423.0</sld:MinScaleDenominator>
<sld:MaxScaleDenominator>4.43744032E8</sld:MaxScaleDenominator>
<sld:PolygonSymbolizer>
<sld:Fill>
<sld:GraphicFill>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>shape://none</sld:WellKnownName>
<sld:Fill/>
<sld:Stroke>
<sld:CssParameter name="stroke">#ff5722</sld:CssParameter>
</sld:Stroke>
</sld:Mark>
<sld:Size>8</sld:Size>
</sld:Graphic>
</sld:GraphicFill>
<sld:CssParameter name="fill">#ff5722</sld:CssParameter>
</sld:Fill>
</sld:PolygonSymbolizer>
<sld:PolygonSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#ff5722</sld:CssParameter>
<sld:CssParameter name="stroke-width">0</sld:CssParameter>
</sld:Stroke>
</sld:PolygonSymbolizer>
<sld:TextSymbolizer>
<sld:Label>
<ogc:Function name="Area">
<ogc:PropertyName>the_geom</ogc:PropertyName>
</ogc:Function>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">Tahoma</sld:CssParameter>
<sld:CssParameter name="font-size">12</sld:CssParameter>
<sld:CssParameter name="font-style">Normal</sld:CssParameter>
<sld:CssParameter name="font-weight">Normal</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:PointPlacement>
<sld:AnchorPoint>
<sld:AnchorPointX>0.5</sld:AnchorPointX>
<sld:AnchorPointY>0.5</sld:AnchorPointY>
</sld:AnchorPoint>
</sld:PointPlacement>
</sld:LabelPlacement>
<sld:Halo>
<sld:Radius>3</sld:Radius>
<sld:Fill>
<sld:CssParameter name="fill">#EEEEEE</sld:CssParameter>
</sld:Fill>
</sld:Halo>
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
<sld:VendorOption name="spaceAround">25</sld:VendorOption>
<sld:VendorOption name="group">no</sld:VendorOption>
</sld:TextSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
</sld:StyledLayerDescriptor>
正如姐妹 GIS 网站上的 this answer 所说:
geometries are generalized, reprojected, rescaled to screen in place for performance reasons, by the time this function is evaluated it's too late. The code would have to be modified to perform these evaluations before the geometry is modified. It's possible, not immediate to do in general (if done, it would have to affect evaluation of all style properties that might be using the geometry, not just the labels), especially if the same geometry is used by other symbolizers before.
所以唯一的方法就是预先计算面积并将它们存储在数据集中,这也会更有效,因为它可以节省每次移动地图时重新计算面积的时间。