GeoServer cutting off symbols close to tile edges?

Generally, you have 3 options:

You may disable tiling altogether, which will probably get rid of most symbols being cut off (except maybe at the bounding box edges?) but it will obviously make rendering times increase, so I wouldn't recommend it.

You may want to look into metatiling, which effectively combines multiple tiles adjacent to the current tile prior to rendering symbology and then transforms them back into the original tile size. GeoServer's WMS supports metatiling as a vendor parameter, but is subject to the restriction that the tile size must be 256x256 pixels. I would reccomend using GeoWebCache instead, as it has more metatiling options and is more flexible in this regard.

GeoWebCache also offers a gutter parameter, which adds extra pixel padding space around each tile. This also helps with eliminating artifacts near tile edges, and can be combined with metatiling to prevent said artifacts.

See https://docs.geoserver.org/stable/en/user/geowebcache/webadmin/defaults.html#default-metatile-size for info on metatiling and gutters.

Related: GeoServer VendorOption for SLD to place labels overlapping and out of bounds


(Maybe this is not a correct answer, as the question is about icons of points; but hopefully someone can use it.)

Additionally to the gutter mentioned in the answer I used the following approach to label lines using a TextSymolizer with a Graphic (and solve the problem of symbols being clipped at tile edges):

<TextSymbolizer>
  <!-- ... -->
  <Graphic>
    <ExternalGraphic>
      <OnlineResource xlink:type="simple" xlink:href="http://localhost:8080/geoserver/styles/icons/${code}.png"/>
      <Format>image/png</Format>
    </ExternalGraphic>
    <Size>25</Size>
    <Rotation>0</Rotation>
  </Graphic>
  <Priority>100000</Priority>
  <VendorOption name="spaceAround">13</VendorOption>
  <VendorOption name="group">no</VendorOption>
  <VendorOption name="repeat">300</VendorOption>
  <VendorOption name="partials">true</VendorOption>
</TextSymbolizer>

This creates a icon of 25pixel height/width as a label of a line using the attribute/property code of the feature served by GeoServer (2.7 in my case), with a spaceAround of a little more than half the icons size and no grouping.

The <VendorOption name="partials">true</VendorOption> tells GeoServer to draw only one label (no matter how many tiles are needed to display the feature). (Note that this is very similar to a <PointSymbolizer> instead of a <TextSymbolizer>, but for a curved line the label is placed directly on the line and not on the centroid of the line, which may be aside of the line.) And <VendorOption name="repeat">300</VendorOption> then does almost the same as if you do not use partials (default is false), as the icons is drawn on every tile, but in conjunction with partials=true the icon is repeated every 300 pixels (at little more than a default tile of 256 ) without any clippings of icons at tile borders.

Tags:

Geoserver