{"id":10004,"date":"2025-10-07T09:00:02","date_gmt":"2025-10-07T12:00:02","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=10004"},"modified":"2025-10-07T14:28:38","modified_gmt":"2025-10-07T17:28:38","slug":"geoserver-ia-otimizacao-de-estilos-sld-com-algoritmos-generativos","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2025\/10\/07\/geoserver-ia-otimizacao-de-estilos-sld-com-algoritmos-generativos\/","title":{"rendered":"GeoServer + IA: otimiza\u00e7\u00e3o de estilos SLD com algoritmos generativos"},"content":{"rendered":"<p>Prezados leitores,<\/p>\n<p>Quem trabalha com GeoServer sabe que definir estilos SLD (Styled Layer Descriptor) \u00e9 uma das tarefas mais importantes e, ao mesmo tempo, pode ser bastante trabalhosa.<\/p>\n<p>Um estilo mal configurado pode deixar o mapa confuso, pesado ou at\u00e9 inutiliz\u00e1vel.<\/p>\n<p>J\u00e1 um estilo bem planejado torna os dados claros, comunicativos e eficientes.<\/p>\n<p>O problema:<br \/>\n\ud83d\udc49 Criar estilos manualmente exige tempo, conhecimento de XML e testes repetitivos.<br \/>\n\ud83d\udc49 Definir cores adequadas para diferentes atributos (popula\u00e7\u00e3o, uso do solo, altimetria) \u00e9 sempre um desafio.<\/p>\n<p>\u00c9 nesse ponto que a Intelig\u00eancia Artificial (IA) pode transformar o jogo. Combinando o GeoServer REST API com modelos generativos (IA), \u00e9 poss\u00edvel:<\/p>\n<ul>\n<li>Gerar paletas de cores autom\u00e1ticas e consistentes.<\/li>\n<li>Criar estilos din\u00e2micos adaptados ao tipo de dado.<\/li>\n<li>Automatizar a publica\u00e7\u00e3o de SLDs, economizando tempo e reduzindo erros.<\/li>\n<\/ul>\n<p><strong>2. Onde entra a IA<\/strong><\/p>\n<p>A IA pode atuar em diferentes etapas:<\/p>\n<ul>\n<li><strong>Gera\u00e7\u00e3o de paletas de cores autom\u00e1ticas<\/strong> \u2192 sugerindo cores distintas, leg\u00edveis e com contraste.<\/li>\n<li><strong>Sugest\u00e3o de simbologia<\/strong> \u2192 identificar o tipo de dado (ponto, linha, pol\u00edgono) e propor estilos adequados.<\/li>\n<li>Automa\u00e7\u00e3o de SLD \u2192 gerar automaticamente o XML completo a partir de metadados da camada.<\/li>\n<li><strong>Explica\u00e7\u00e3o\/documenta\u00e7\u00e3o<\/strong> \u2192 IA pode comentar o estilo gerado, explicando a l\u00f3gica.<\/li>\n<\/ul>\n<p><strong>3. Na pr\u00e1tica: GeoServer + Python + IA<\/strong><\/p>\n<p>Para ajudar na cria\u00e7\u00e3o de estilos automatizados, o nosso script vai buscar as classes distintas no banco para que a IA possa gerar automaticamente um SLD completo e v\u00e1lido, e na sequencia esse SLD ser publicado no GeoServer via API Rest, ou seja, tudo automatizado com zero edi\u00e7\u00e3o manual no XML.<\/p>\n<pre>\r\nimport psycopg2\r\nimport openai\r\nimport requests\r\n\r\n# Configura\u00e7\u00f5es\r\nDB_NAME = \"gisdb\"\r\nDB_USER = \"gis\"\r\nDB_PASS = \"123\"\r\nDB_HOST = \"localhost\"\r\n\r\nGEOSERVER_URL = \"http:\/\/localhost:8080\/geoserver\/rest\/styles\"\r\nGEOSERVER_USER = \"admin\"\r\nGEOSERVER_PASS = \"geoserver\"\r\n\r\nLAYER_NAME = \"camada_uso_solo\"\r\nFIELD_NAME = \"uso_solo\"\r\nSTYLE_NAME = \"uso_solo_auto\"\r\n\r\n# 1. Coletar classes distintas no PostGIS\r\nconn = psycopg2.connect(f\"dbname={DB_NAME} user={DB_USER} password={DB_PASS} host={DB_HOST}\")\r\ncur = conn.cursor()\r\ncur.execute(f\"SELECT DISTINCT {FIELD_NAME} FROM {LAYER_NAME};\")\r\nclasses = [row[0] for row in cur.fetchall()]\r\n\r\n# 2. Pedir \u00e0 IA paleta + SLD\r\nprompt = f\"\"\"\r\nGere um SLD v\u00e1lido (XML) para a camada {LAYER_NAME},\r\nusando o atributo {FIELD_NAME} como regra de simbologia.\r\nClasses encontradas: {classes}.\r\nUse uma paleta de cores HEX contrastante, acess\u00edvel e sem\u00e2ntica:\r\n- \u00e1gua = azul\r\n- floresta = verde\r\n- urbano = cinza\/vermelho\r\n- solo exposto = laranja\r\n- agr\u00edcola = amarelo\r\n\"\"\"\r\n\r\nresposta = openai.ChatCompletion.create(\r\n    model=\"gpt-4o-mini\",\r\n    messages=[{\"role\": \"user\", \"content\": prompt}]\r\n)\r\n\r\nsld_xml = resposta.choices[0].message.content\r\n\r\n# 3. Publicar estilo no GeoServer\r\nheaders = {\"Content-type\": \"application\/vnd.ogc.sld+xml\"}\r\nr = requests.post(\r\n    f\"{GEOSERVER_URL}?name={STYLE_NAME}\",\r\n    data=sld_xml.encode(\"utf-8\"),\r\n    headers=headers,\r\n    auth=(GEOSERVER_USER, GEOSERVER_PASS)\r\n)\r\n\r\nif r.status_code in [200, 201]:\r\n    print(f\"Estilo '{STYLE_NAME}' publicado com sucesso!\")\r\nelse:\r\n    print(\"Erro ao publicar estilo:\", r.status_code, r.text)\r\n<\/pre>\n<p>Esse processo pode ser facilmente acoplado a um pipeline de publica\u00e7\u00e3o de dados:<\/p>\n<ul>\n<li>Cada vez que uma nova camada for publicada \u2192 o script roda.<\/li>\n<li>Ele gera e publica o estilo de forma autom\u00e1tica.<\/li>\n<li>Voc\u00ea garante consist\u00eancia visual em todo o projeto WebGIS.<\/li>\n<\/ul>\n<p><strong>4.  Benef\u00edcios pr\u00e1ticos<\/strong><\/p>\n<ul>\n<li>Simbologia autom\u00e1tica e inteligente.<\/li>\n<li>Redu\u00e7\u00e3o dr\u00e1stica no tempo gasto criando estilos.<\/li>\n<li>Padroniza\u00e7\u00e3o visual em m\u00faltiplas camadas.<\/li>\n<li>IA atuando como assistente cartogr\u00e1fico.<\/li>\n<\/ul>\n<p><strong>5. Conclus\u00e3o<\/strong><\/p>\n<p>Com esse pipeline, voc\u00ea transforma o trabalho de estiliza\u00e7\u00e3o no GeoServer em um processo r\u00e1pido, automatizado e padronizado, deixando para a IA a parte mais repetitiva e demorada.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prezados leitores, Quem trabalha com GeoServer sabe que definir estilos SLD (Styled Layer Descriptor) \u00e9 uma das tarefas mais importantes e, ao mesmo tempo, pode ser bastante trabalhosa. Um estilo mal configurado pode deixar o mapa confuso, pesado ou at\u00e9&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2025\/10\/07\/geoserver-ia-otimizacao-de-estilos-sld-com-algoritmos-generativos\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":10005,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[208,343],"class_list":["post-10004","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-geoserver","tag-ia"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10004","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=10004"}],"version-history":[{"count":2,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10004\/revisions"}],"predecessor-version":[{"id":10007,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10004\/revisions\/10007"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/10005"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=10004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=10004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=10004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}