Como parte do FOSS4G Code Sprint, Ian Turton juntamente com Casper Børgesen implementaram o Vladimir Agafonkin’s Polygon Labelling Algorithm. Esta é uma maneira rápida de calcular o pólo de inacessibilidade de um polígono para nos permitir colocar uma etiqueta (ou outro item relacionado) na parte “mais ampla” do polígono.

O GeoServer até hoje tem sido capaz de usar a função centroid para colocar etiquetas, mas há casos em que o baricentro não cai dentro do polígono, para estes casos o GeoTools e o GeoServer usam o interiorPoint no qual pelo menos garante estar no limite do polígono (boundary) se não for realmente dentro dele.

O trabalho realizado na Code Sprint foi incorporada pelo Geotools e já é possível usá-lo no GeoServer, basta colocar o arquivo jar na pasta WEB-INF/lib da versão mais recente.

Veja algumas correções que foram realizadas com base no estilo population.

<TextSymbolizer>
  <Geometry>
    <ogc:Function name="centroid">
      <ogc:PropertyName>the_geom</ogc:PropertyName>
    </ogc:Function>
  </Geometry>
  <Label>

centroid

Se você olhar para os rótulos de Louisiana (LA) e Flórida (FL) você vai ver que em ambos os casos, o rótulo está sobre a borda ou mesmo à beira do Estado. Obviamente que ficaria muito melhor se não fosse dessa forma, então foi alterada o nome da função que está sendo chamado na seção Geometry do SLD para interiorPoint que resultou no seguinte mapa:

interior

Como você pode ver agora, a Flórida ficou melhor, mas Louisiana, na verdade, ficou um pouco pior, e este é um dos casos em que temos o ponto no limite do polígono. Agora vamos mudar o SLD para usar a nova função:

<TextSymbolizer>
  <Geometry>
    <ogc:Function name="labelPoint">
      <ogc:PropertyName>the_geom</ogc:PropertyName>
      <ogc:Literal>1.0</ogc:Literal>
    </ogc:Function>
  </Geometry>
  <Label>

Observe o segundo argumento para a função – este é um valor de tolerância para o algoritmo (mas podemos removê-lo e fornecer um padrão razoável mais tarde). Isso nos dá o seguinte resultado:

polylabel

Agora Louisiana e Flórida estão com bom aspecto e com rótulos bem colocados.

Então, por favor, vá em frente e teste isso em seus próprios dados e deixe seus comentários neste post se você encontrar quaisquer problemas. Está sendo considerado tornar este o padrão para symbolizers text no GeoServer, por isso seria bom saber se há algum problema antes de fazer isso.

Fonte: Blog do Ian Surton