{"id":6243,"date":"2016-09-02T07:30:03","date_gmt":"2016-09-02T10:30:03","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=6243"},"modified":"2016-09-02T10:01:53","modified_gmt":"2016-09-02T13:01:53","slug":"melhoria-na-rotulagem-de-poligonos-no-geoserver","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2016\/09\/02\/melhoria-na-rotulagem-de-poligonos-no-geoserver\/","title":{"rendered":"Melhoria na rotulagem de pol\u00edgonos no GeoServer"},"content":{"rendered":"<p>Como parte do FOSS4G Code Sprint, Ian Turton juntamente com Casper B\u00f8rgesen implementaram o <a href=\"https:\/\/www.mapbox.com\/blog\/polygon-center\/\" target=\"_blank\">Vladimir Agafonkin\u2019s Polygon Labelling Algorithm<\/a>. Esta \u00e9 uma maneira r\u00e1pida de calcular o p\u00f3lo de inacessibilidade de um pol\u00edgono para nos permitir colocar uma etiqueta (ou outro item relacionado) na parte &#8220;mais ampla&#8221; do pol\u00edgono. <\/p>\n<p>O GeoServer at\u00e9 hoje tem sido capaz de usar a fun\u00e7\u00e3o <em>centroid <\/em>para colocar etiquetas, mas h\u00e1 casos em que o baricentro n\u00e3o cai dentro do pol\u00edgono, para estes casos o GeoTools e o GeoServer usam o <em>interiorPoint <\/em>no qual pelo menos garante estar no limite do pol\u00edgono (boundary) se n\u00e3o for realmente dentro dele.<\/p>\n<p>O trabalho realizado na Code Sprint foi incorporada pelo Geotools e j\u00e1 \u00e9 poss\u00edvel us\u00e1-lo no GeoServer, basta colocar o <a href=\"https:\/\/repo.boundlessgeo.com\/main\/org\/geotools\/gt-polygon-labeller\/16-SNAPSHOT\/\" target=\"_blank\">arquivo jar<\/a> na pasta WEB-INF\/lib da vers\u00e3o mais recente.<\/p>\n<p>Veja algumas corre\u00e7\u00f5es que foram realizadas com base no estilo <em>population<\/em>.<\/p>\n<pre>\r\n&lt;TextSymbolizer&gt;\r\n&nbsp;&nbsp;&lt;Geometry&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;ogc:Function&nbsp;name=\"centroid\"&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ogc:PropertyName&gt;the_geom&lt;\/ogc:PropertyName&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/ogc:Function&gt;\r\n&nbsp;&nbsp;&lt;\/Geometry&gt;\r\n&nbsp;&nbsp;&lt;Label&gt;\r\n<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/centroid.png\" alt=\"centroid\" width=\"768\" height=\"330\" class=\"aligncenter size-full wp-image-6248\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/centroid.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/centroid-300x129.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/centroid-600x258.png 600w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/p>\n<p>Se voc\u00ea olhar para os r\u00f3tulos de Louisiana (LA) e Fl\u00f3rida (FL) voc\u00ea vai ver que em ambos os casos, o r\u00f3tulo est\u00e1 sobre a borda ou mesmo \u00e0 beira do Estado. Obviamente que ficaria muito melhor se n\u00e3o fosse dessa forma, ent\u00e3o foi alterada o nome da fun\u00e7\u00e3o que est\u00e1 sendo chamado na se\u00e7\u00e3o Geometry do SLD para <em>interiorPoint<\/em> que resultou no seguinte mapa:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/interior.png\" alt=\"interior\" width=\"768\" height=\"330\" class=\"aligncenter size-full wp-image-6250\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/interior.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/interior-300x129.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/interior-600x258.png 600w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/p>\n<p>Como voc\u00ea pode ver agora, a Fl\u00f3rida ficou melhor, mas Louisiana, na verdade, ficou um pouco pior, e este \u00e9 um dos casos em que temos o ponto no limite do pol\u00edgono. Agora vamos mudar o SLD para usar a nova fun\u00e7\u00e3o:<\/p>\n<pre>\r\n&lt;TextSymbolizer&gt;\r\n&nbsp;&nbsp;&lt;Geometry&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;ogc:Function&nbsp;name=\"labelPoint\"&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ogc:PropertyName&gt;the_geom&lt;\/ogc:PropertyName&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ogc:Literal&gt;1.0&lt;\/ogc:Literal&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/ogc:Function&gt;\r\n&nbsp;&nbsp;&lt;\/Geometry&gt;\r\n&nbsp;&nbsp;&lt;Label&gt;\r\n<\/pre>\n<p>Observe o segundo argumento para a fun\u00e7\u00e3o &#8211; este \u00e9 um valor de toler\u00e2ncia para o algoritmo (mas podemos remov\u00ea-lo e fornecer um padr\u00e3o razo\u00e1vel mais tarde). Isso nos d\u00e1 o seguinte resultado:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/polylabel.png\" alt=\"polylabel\" width=\"768\" height=\"330\" class=\"aligncenter size-full wp-image-6252\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/polylabel.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/polylabel-300x129.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/09\/polylabel-600x258.png 600w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/p>\n<p>Agora Louisiana e Fl\u00f3rida est\u00e3o com bom aspecto e com r\u00f3tulos bem colocados.<\/p>\n<p>Ent\u00e3o, por favor, v\u00e1 em frente e teste isso em seus pr\u00f3prios dados e deixe seus coment\u00e1rios neste post se voc\u00ea encontrar quaisquer problemas. Est\u00e1 sendo considerado tornar este o padr\u00e3o para symbolizers text no GeoServer, por isso seria bom saber se h\u00e1 algum problema antes de fazer isso. <\/p>\n<p>Fonte: <a href=\"http:\/\/blog.ianturton.com\/geoserver\/styling\/2016\/08\/30\/Polygon-Labelling-in-GeoServer.html\" target=\"_blank\">Blog do Ian Surton<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como parte do FOSS4G Code Sprint, Ian Turton juntamente com Casper B\u00f8rgesen implementaram o Vladimir Agafonkin\u2019s Polygon Labelling Algorithm. Esta \u00e9 uma maneira r\u00e1pida de calcular o p\u00f3lo de inacessibilidade de um pol\u00edgono para nos permitir colocar uma etiqueta (ou&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2016\/09\/02\/melhoria-na-rotulagem-de-poligonos-no-geoserver\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":6245,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[208,214],"class_list":["post-6243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-geoserver","tag-sld"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=6243"}],"version-history":[{"count":10,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6243\/revisions"}],"predecessor-version":[{"id":6261,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6243\/revisions\/6261"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/6245"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=6243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=6243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=6243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}