Sistema de chatbot inteligente para consulta de dados geoespaciais usando linguagem natural, integrado com PostGIS, GeoServer e visualização em mapa interativo.
- Chatbot com IA: Faça perguntas em português sobre dados espaciais
- SQL Automático: IA converte perguntas em queries SQL/PostGIS
- Visualização em Mapa: Integração com GeoServer e OpenLayers
- Dados Brasileiros: Estados, rodovias e cidades pré-carregados
- Interface Moderna: Next.js 15 + TailwindCSS + shadcn/ui
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ Next.js │────▶│ OpenAI │────▶│ PostGIS │
│ Frontend │ │ (GPT-4) │ │ (Queries) │
└─────────────┘ └──────────────┘ └──────────────┘
│ │
│ │
▼ ▼
┌─────────────┐ ┌──────────────┐
│ OpenLayers │◀─────────────────────────│ GeoServer │
│ Mapa │ WMS/WFS │ (Layers) │
└─────────────┘ └──────────────┘
- Docker e Docker Compose
- OpenAI API Key OU Google Gemini API Key (para o chatbot funcionar)
- Recomendado: Use Gemini - é gratuito! Veja GEMINI_SETUP.md
- 4GB+ RAM disponível
- Portas livres: 3000, 5432, 8080
cd /home/phsilva/UFSC/test_mcp
# Copie o arquivo de exemplo
cp .env.example .env
# Edite o .env e adicione sua API Key
nano .envOpção A - Usar Gemini (Gratuito, Recomendado):
AI_PROVIDER=gemini
GEMINI_API_KEY=sua_chave_aqui # Obtenha em: https://aistudio.google.com/app/apikeyOpção B - Usar OpenAI:
AI_PROVIDER=openai
OPENAI_API_KEY=sk-sua_chave_aqui📖 Guia completo do Gemini: GEMINI_SETUP.md
cd frontend
cp .env.example .env
nano .env # Adicione as mesmas configurações do passo 1# Volte para a raiz do projeto
cd ..
# Inicie todos os serviços
docker-compose up -d
# Acompanhe os logs
docker-compose logs -f- PostGIS: ~30 segundos
- GeoServer: ~2-3 minutos
- Frontend: ~1 minuto (primeira vez)
- Frontend: http://localhost:3000
- GeoServer: http://localhost:8080/geoserver
- Usuário:
admin - Senha:
geoserver
- Usuário:
- 6 estados brasileiros (SP, RJ, MG, PR, SC, RS)
- Geometrias (polígonos)
- População, área, região
- Rodovias federais e estaduais
- Geometrias (linhas)
- Extensão, condição, tipo
- Principais cidades
- Geometrias (pontos)
- População
Quantas rodovias tem em cada estado?
Qual a distância entre São Paulo e Rio de Janeiro?
Quais cidades estão próximas da BR-101?
Qual estado tem rodovias em melhor condição?
Me mostre as estatísticas de rodovias por estado
Quais rodovias passam por Santa Catarina?
Qual a densidade populacional dos estados?
- Acesse http://localhost:8080/geoserver
- Login:
admin/geoserver - Vá em Stores → Add new Store → PostGIS
- Configure:
- Workspace: Crie um workspace chamado
geo - Data Source Name:
geospatial - host:
postgis - port:
5432 - database:
geospatial - user:
geouser - passwd:
geopass
- Workspace: Crie um workspace chamado
- Publique as camadas:
estados,rodovias,cidades
# Ver logs de um serviço específico
docker-compose logs -f frontend
docker-compose logs -f postgis
docker-compose logs -f geoserver
# Parar todos os serviços
docker-compose down
# Parar e remover volumes (apaga dados)
docker-compose down -v
# Reiniciar um serviço
docker-compose restart frontend
# Executar SQL no PostGIS
docker-compose exec postgis psql -U geouser -d geospatial
# Acessar shell do container
docker-compose exec frontend shtest_mcp/
├── docker-compose.yml # Orquestração dos containers
├── database/
│ ├── init/
│ │ └── 01-init-postgis.sql # Schema e dados iniciais
│ ├── db-schema.sql # Documentação do schema
│ └── example-queries.sql # Queries de exemplo para IA
├── frontend/
│ ├── app/
│ │ ├── api/chat/ # API route do chatbot
│ │ ├── globals.css # Estilos globais
│ │ ├── layout.tsx # Layout principal
│ │ └── page.tsx # Página inicial
│ ├── components/
│ │ ├── ChatPanel.tsx # Painel do chatbot
│ │ ├── MapView.tsx # Visualização do mapa
│ │ ├── MapLegend.tsx # Legenda do mapa
│ │ └── ui/ # Componentes UI
│ ├── lib/
│ │ └── utils.ts # Utilitários
│ ├── package.json
│ ├── Dockerfile
│ └── .env.example
└── README.md
Para usar o MCP Server Postgres localmente no Cursor/Windsurf:
Edite ~/.cursor/mcp.json ou ~/.windsurf/mcp.json:
{
"mcpServers": {
"geospatial_db": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://geouser:geopass@localhost:5432/geospatial"
]
}
}
}Após configurar, reinicie o Cursor/Windsurf.
Agora você pode fazer perguntas diretamente no chat do editor:
@geospatial_db Quantas rodovias tem em cada estado?
docker-compose exec postgis psql -U geouser -d geospatial
# No psql:
INSERT INTO geo.estados (nome, sigla, regiao, populacao, area_km2, geom)
VALUES ('Bahia', 'BA', 'Nordeste', 14985284, 564733.08,
ST_GeomFromText('MULTIPOLYGON((...))', 4326));# Copie o shapefile para o container
docker cp meu_arquivo.shp postgis:/tmp/
# Importe usando shp2pgsql
docker-compose exec postgis shp2pgsql -I -s 4326 /tmp/meu_arquivo.shp geo.nova_tabela | \
docker-compose exec -T postgis psql -U geouser -d geospatialUse ferramentas como ogr2ogr ou bibliotecas Python (GeoPandas).
# Verifique se o PostGIS está rodando
docker-compose ps
# Teste a conexão
docker-compose exec frontend sh
nc -zv postgis 5432# Verifique os logs
docker-compose logs geoserver
# Pode precisar de mais memória
# Edite docker-compose.yml e aumente MAXIMUM_MEMORY- Verifique se a
OPENAI_API_KEYestá configurada - Veja os logs:
docker-compose logs -f frontend - Teste a API:
curl http://localhost:3000/api/chat
- Configure o GeoServer manualmente (veja seção acima)
- Verifique se as camadas foram publicadas
- Teste WMS: http://localhost:8080/geoserver/geo/wms?service=WMS&version=1.1.0&request=GetCapabilities
- Frontend: Next.js 15, React 19, TypeScript
- UI: TailwindCSS, shadcn/ui, Lucide Icons
- Mapa: OpenLayers 10
- Backend: Node.js, PostgreSQL, PostGIS
- GeoServer: Kartoza GeoServer 2.25
- IA: OpenAI GPT-4
- Containerização: Docker, Docker Compose
Sinta-se à vontade para:
- Adicionar mais dados geoespaciais
- Melhorar as queries de exemplo
- Criar novos componentes de visualização
- Otimizar performance
MIT License - use livremente!