{"id":10034,"date":"2025-10-15T09:00:52","date_gmt":"2025-10-15T12:00:52","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=10034"},"modified":"2025-10-23T15:30:36","modified_gmt":"2025-10-23T18:30:36","slug":"geonode-ia-chatbot-para-consulta-de-dados-espaciais","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2025\/10\/15\/geonode-ia-chatbot-para-consulta-de-dados-espaciais\/","title":{"rendered":"GeoNode + IA: Chatbot para consulta de dados espaciais"},"content":{"rendered":"<p>Imagine poder conversar com o seu <strong>GeoNode <\/strong>como se fosse um assistente t\u00e9cnico:<\/p>\n<p>\u201cMostre os munic\u00edpios com popula\u00e7\u00e3o acima de 50 mil.\u201d<br \/>\n\u201cListe as camadas relacionadas a meio ambiente publicadas em 2024.\u201d<br \/>\n\u201cQuais \u00e1reas de risco est\u00e3o dentro da zona urbana de Florian\u00f3polis?\u201d<\/p>\n<p>Essas consultas, que normalmente exigiriam acesso ao banco ou ao painel do GeoNode, podem ser respondidas <strong>em segundo<\/strong>s por um <strong>chatbot integrado com IA<\/strong>.<\/p>\n<p>A ideia deste post \u00e9 mostrar como criar um assistente geoespacial inteligente, capaz de:<\/p>\n<ul>\n<li>Compreender perguntas em linguagem natural;<\/li>\n<li>Traduzir em chamadas \u00e0 API do GeoNode (ou SQL\/PostGIS);<\/li>\n<li>Retornar respostas estruturadas (tabelas, nomes de camadas, metadados, links);<\/li>\n<li>E at\u00e9 gerar mapas din\u00e2micos a partir das consultas.<\/li>\n<\/ul>\n<p><strong>1. O papel do GeoNode como fonte de conhecimento geoespacial<\/strong><\/p>\n<p>O GeoNode exp\u00f5e suas informa\u00e7\u00f5es por meio de uma API REST poderosa:<\/p>\n<ul>\n<li><strong>\/api\/v2\/datasets\/<\/strong> \u2192 lista de camadas;<\/li>\n<li><strong>\/api\/v2\/maps\/<\/strong> \u2192 mapas compostos;<\/li>\n<li><strong>\/api\/v2\/documents\/<\/strong> \u2192 relat\u00f3rios e anexos;<\/li>\n<li><strong>\/api\/v2\/datasets\/{id}\/<\/strong> \u2192 metadados detalhados de uma camada.<\/li>\n<\/ul>\n<p>Com essas rotas, \u00e9 poss\u00edvel consultar qualquer informa\u00e7\u00e3o sobre os dados publicados, autores, datas, categorias, palavras-chave, links WMS\/WFS e muito mais.<\/p>\n<p>O desafio \u00e9 como traduzir uma pergunta humana em uma sequ\u00eancia de chamadas a essa API? A resposta \u00e9, usando IA generativa como int\u00e9rprete.<\/p>\n<p>A IA funciona como um \u201ctradutor sem\u00e2ntico\u201d entre o usu\u00e1rio e o GeoNode. Ela interpreta o que foi pedido e decide:<\/p>\n<ul>\n<li>Qual endpoint da API deve ser consultado;<\/li>\n<li>Quais filtros aplicar (categoria, data, palavra-chave, etc.);<\/li>\n<li>Como formatar a resposta para o usu\u00e1rio.<\/li>\n<\/ul>\n<p>Al\u00e9m disso, a IA pode resumir os metadados retornados, explicando o contexto da camada em linguagem natural.<\/p>\n<p><strong>2. Chatbot + GeoNode + IA<\/strong><\/p>\n<p>Vamos montar um exemplo funcional em Python.<\/p>\n<pre>\r\nimport requests\r\nfrom openai import OpenAI\r\n\r\n# Configura\u00e7\u00f5es\r\nGEONODE_URL = \"http:\/\/localhost:8000\/api\/v2\/datasets\/\"\r\nGEONODE_USER = \"admin\"\r\nGEONODE_PASS = \"geonode\"\r\nMODEL = \"gpt-4o-mini\"\r\n\r\n# Inicializa cliente OpenAI\r\nclient = OpenAI()\r\n\r\n# Entrada do usu\u00e1rio\r\npergunta = \"Liste as camadas de saneamento publicadas em 2024.\"\r\n\r\n# Prompt para IA gerar consulta API\r\nprompt = f\"\"\"\r\nVoc\u00ea \u00e9 um assistente que interpreta perguntas sobre um GeoNode.\r\nGere a URL completa da API a ser consultada, com base na pergunta abaixo.\r\nURL base: {GEONODE_URL}\r\nPergunta: {pergunta}\r\nExemplo de resposta esperada:\r\nGET http:\/\/localhost:8000\/api\/v2\/datasets\/?keywords__slug=saneamento&date__year=2024\r\n\"\"\"\r\n\r\n# Chamada \u00e0 API da OpenAI\r\nresposta = client.chat.completions.create(\r\n    model=MODEL,\r\n    messages=[{\"role\": \"user\", \"content\": prompt}]\r\n)\r\n\r\n# Extrai URL\r\nconsulta = resposta.choices[0].message.content.strip().replace(\"GET \", \"\")\r\nprint(\"URL gerada pela IA:\\n\", consulta)\r\n\r\n# 2. Executar chamada \u00e0 API do GeoNode\r\nr = requests.get(consulta, auth=(GEONODE_USER, GEONODE_PASS))\r\nif r.status_code == 200:\r\n    data = r.json().get(\"results\", [])\r\n    print(f\"\\n{len(data)} camadas encontradas:\\n\")\r\n    for layer in data:\r\n        title = layer.get(\"title\", \"Sem t\u00edtulo\")\r\n        category = layer.get(\"category\", {}).get(\"gn_description\", \"Sem categoria\")\r\n        print(f\"- {title} ({category})\")\r\nelse:\r\n    print(\"Erro na requisi\u00e7\u00e3o:\", r.status_code, r.text)\r\n\r\n<\/pre>\n<p>Ap\u00f3s a execu\u00e7\u00e3o do script voc\u00ea ter\u00e1 a seguinte resposta: <\/p>\n<p>URL gerada pela IA:<br \/>\nhttp:\/\/localhost:8000\/api\/v2\/datasets\/?keywords__slug=saneamento&#038;date__year=2024<\/p>\n<p>3 camadas encontradas:<br \/>\n&#8211; Sistema de Esgotamento Sanit\u00e1rio (Infraestrutura)<br \/>\n&#8211; Pontos de Abastecimento de \u00c1gua (Saneamento)<br \/>\n&#8211; Zonas de Prote\u00e7\u00e3o de Mananciais (Meio Ambiente)<\/p>\n<p>A IA traduziu a inten\u00e7\u00e3o da pergunta em uma consulta REST real, executou a requisi\u00e7\u00e3o e retornou os resultados de forma leg\u00edvel.<\/p>\n<p>Al\u00e9m de listar as camadas, a <strong>IA pode analisar e descrever<\/strong> o que foi encontrado.<\/p>\n<pre>\r\ndescricoes = \"\\n\".join([f\"{l['title']}: {l['abstract']}\" for l in data])\r\n\r\nprompt_explica = f\"\"\"\r\nGere um resumo amig\u00e1vel das camadas retornadas abaixo, destacando a utilidade\r\nde cada uma para an\u00e1lises de planejamento urbano.\r\n{descricoes}\r\n\"\"\"\r\n\r\nresumo = openai.ChatCompletion.create(\r\n    model=MODEL,\r\n    messages=[{\"role\": \"user\", \"content\": prompt_explica}]\r\n)\r\n\r\nprint(\"\\n Resumo gerado pela IA:\\n\")\r\nprint(resumo.choices[0].message.content)\r\n<\/pre>\n<p>No caso desse script, voc\u00ea teria a seguinte resposta:<\/p>\n<p>\u201cAs camadas de saneamento abrangem sistemas de abastecimento, coleta e prote\u00e7\u00e3o de mananciais.<br \/>\nJuntas, permitem identificar \u00e1reas com d\u00e9ficit de infraestrutura h\u00eddrica e orientar o planejamento urbano.\u201d<\/p>\n<p><strong>3. Aplica\u00e7\u00f5es pr\u00e1ticas<\/strong><\/p>\n<p>Voc\u00ea pode evoluir os scripts acima para um chatbot completo. Para isso basta encapsular essa l\u00f3gica em uma API Flask ou interface Web que permita conversas em tempo real:<\/p>\n<ul>\n<li>O usu\u00e1rio digita perguntas em texto (\u201cQuais camadas s\u00e3o de meio ambiente?\u201d);<\/li>\n<li>A IA gera a consulta e executa no GeoNode;<\/li>\n<li>A resposta \u00e9 retornada em formato leg\u00edvel ou como mapa interativo embutido (via WMS).<\/li>\n<\/ul>\n<p>\ud83d\udca1 Dica: usando o endpoint layer[&#8220;ows&#8221;], \u00e9 poss\u00edvel gerar um link direto de visualiza\u00e7\u00e3o do WMS retornado.<\/p>\n<p>Al\u00e9m disso voc\u00ea pode aplicar esse conceito do ChatBot para transformar seu GeoNode atrav\u00e9s de:<\/p>\n<ul>\n<li>Atendimento autom\u00e1tico em portais WebGIS corporativos;<\/li>\n<li>Busca sem\u00e2ntica de dados espaciais por tema ou localiza\u00e7\u00e3o;<\/li>\n<li>Consultas t\u00e9cnicas acess\u00edveis a gestores n\u00e3o especialistas;<\/li>\n<li>Assistentes geoespaciais integrados com Telegram, WhatsApp ou ChatGPT API.<\/li>\n<\/ul>\n<p><strong>4. Conclus\u00e3o<\/strong><\/p>\n<p>O GeoNode deixa de ser apenas um cat\u00e1logo de dados geoespaciais e se transforma em um sistema de informa\u00e7\u00e3o conversacional, onde qualquer pessoa pode obter respostas ou gerar mapas a partir de simples perguntas.<\/p>\n<p>Integrar IA + GeoNode \u00e9 o primeiro passo para construir portais WebGIS realmente inteligentes, acess\u00edveis e colaborativos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imagine poder conversar com o seu GeoNode como se fosse um assistente t\u00e9cnico: \u201cMostre os munic\u00edpios com popula\u00e7\u00e3o acima de 50 mil.\u201d \u201cListe as camadas relacionadas a meio ambiente publicadas em 2024.\u201d \u201cQuais \u00e1reas de risco est\u00e3o dentro da zona&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2025\/10\/15\/geonode-ia-chatbot-para-consulta-de-dados-espaciais\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":10041,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[196,343],"class_list":["post-10034","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-geonode","tag-ia"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10034","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=10034"}],"version-history":[{"count":9,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10034\/revisions"}],"predecessor-version":[{"id":10062,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10034\/revisions\/10062"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/10041"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=10034"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=10034"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=10034"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}