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>
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:
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:
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