Biblioteca e pipeline em Node.js (ESM) desenvolvida por Diego Oris para extração, validação, projeção geodésica e renderização gráfica bidimensional (2D) e tridimensional isométrica (3D) de polígonos territoriais a partir de memoriais descritivos georreferenciados no padrão SIGEF/INCRA.
A ferramenta opera de forma 100% offline e determinística. Não utiliza APIs externas, inteligência artificial ou processamento em nuvem, garantindo segurança jurídica absoluta sobre dados de propriedades e contratos confidenciais.
Abaixo estão os mapas gerados de forma puramente matemática a partir do arquivo de memorial descritivo padrão:
Projeção cartográfica plana com cálculo de padding, escala uniforme para preservar proporção territorial, grade de eixos métricos (UTM) e identificadores de cada vértice.

Bloco tridimensional calculado por rotação matricial trigonométrica, com sombreamento lateral difuso baseado no produto escalar entre a normal da face e o vetor solar, com contornos realçados.

Toda a precisão do pipeline é garantida por modelagem matemática explícita descrita abaixo:
As coordenadas de latitude e longitude extraídas dos arquivos PDF no formato sexagesimal (Graus, Minutos e Segundos - DMS) são convertidas para decimais reais através da fórmula:
Onde:
-
$D$ : Graus inteiros extraídos. -
$M$ : Minutos inteiros. -
$S$ : Segundos decimais (precisão flutuante). -
$\text{sgn}(D)$ : Função sinal. Se o caractere de direção forS(Sul) ouW/O(Oeste), ou se houver um caractere-explícito,$\text{sgn}(D) = -1$ , caso contrário$+1$ .
O analisador regex faz a higienização de separadores como °, ', ", ”, , ou ., unificando a leitura de strings complexas como -04° 44' 00,00" ou 04 44 00.00.
A projeção para a grade de coordenadas planas (metros) exige determinar em qual fuso da projeção Transversa de Mercator a coordenada de longitude (
O hemisfério rege o deslocamento da coordenada vertical para evitar valores negativos de latitude (Falsa Latitude) no Hemisfério Sul (
O sistema projeta os pontos utilizando as equações do elipsoide GRS80/SIRGAS2000 (parâmetros idênticos ao WGS84, padrão legal de cartografia brasileira) via biblioteca proj4.
Para desenhar o polígono geográfico em um canvas plano quadrado de largura
As posições finais na tela
Para gerar a volumetria 3D, transladamos o polígono métrico UTM para uma origem local
-
Rotação Trigonométrica:
$$x_{\text{rot}} = x' \cdot \cos(-45^\circ) - y' \cdot \sin(-45^\circ) = \frac{\sqrt{2}}{2} \cdot (x' + y')$$ $$y_{\text{rot}} = x' \cdot \sin(-45^\circ) + y' \cdot \cos(-45^\circ) = \frac{\sqrt{2}}{2} \cdot (-x' + y')$$ -
Projeção Isométrica com Cota Altimétrica (
$z$ ):$$u_{3D} = u_{\text{centro}} + x_{\text{rot}} \cdot S_{3D}$$ $$v_{3D} = v_{\text{centro}} + y_{\text{rot}} \cdot \sin(35.264^\circ) \cdot S_{3D} - z$$
Onde:
-
$x', y'$ são as coordenadas UTM locais transladadas. -
$S_{3D}$ é o fator de escala calculado para o encaixe tridimensional. -
$z$ é a altura física da extrusão (base do terreno$z = 0$ ou topo do terreno$z = 350\text{ px}$ ).
Para renderizar profundidade volumétrica nas paredes laterais da extrusão geográfica, calculamos a incidência de luz solar artificial utilizando o produto escalar (
-
Vetor Normal à Parede (
$\vec{N}$ ) para um segmento entre o vértice$i$ e$i+1$ :$$\vec{N} = \left[ -\frac{Y_{i+1} - Y_i}{d}, \frac{X_{i+1} - X_i}{d} \right]^T$$ Onde$d = \sqrt{(X_{i+1} - X_i)^2 + (Y_{i+1} - Y_i)^2}$ é a distância em metros da aresta plana. -
Produto Escalar com o Vetor de Luz (
$\vec{L}$ ): Definimos o vetor de luz solar vindo do quadrante superior esquerdo como$\vec{L} = [-0.707, 0.707]^T$ . O fator de iluminação$k_d$ é calculado por:$$k_d = \vec{N} \cdot \vec{L} = N_x \cdot (-0.707) + N_y \cdot 0.707$$ -
Mapeamento para Luminosidade HSL: Mapeamos
$k_d \in [-1.0, 1.0]$ linearmente para a luminosidade real do canal HSL entre$35%$ (sombra total) e$100%$ (iluminação perpendicular total):$$\text{Luminosity} = 35% + (k_d + 1.0) \cdot 32.5%$$
pdf-to-maps/
├── assets/ # Renders públicos de mapas para demonstração
├── create_example.js # Script offline para gerar PDF SIGEF de teste
├── index.js # Ponto de entrada / importação ESModules
├── package.json # Metadados, dependências e autoria de Diego Oris
├── package-lock.json # Travamento de versões npm
├── .gitignore # Blindagem de PDFs confidenciais e exceções de testes
├── LICENSE # Licença open-source MIT
└── src/ # Código-fonte principal da aplicação
├── index.js # Coordenador principal de arquivos e concorrência
├── parser/
│ ├── pdfReader.js # Leitor espacial de posições geométricas de texto PDF
│ └── vertexExtractor.js # Extrator regex estrito de strings de vértice DMS
├── projection/
│ └── utmProjector.js # Projetor de coordenadas geodésicas para metros UTM
├── draw/
│ ├── mapRenderer.js # Renderizador de imagem de mapa 2D plana (Canvas)
│ └── mapRenderer3D.js # Renderizador de imagem de mapa 3D isométrico (Canvas)
├── export/
│ ├── geojsonExporter.js # Exportador de arquivo vetorial GIS padrão OGC GeoJSON
│ ├── dxfExporter.js # Exportador CAD padrão AutoCAD DXF POLYLINE (R12)
│ ├── svgExporter.js # Exportador vetorial puro de alta definição SVG
│ └── logExporter.js # Calculador Turf e gerador de relatório técnico (TXT)
└── utils/
└── helper.js # Conversor DMS e gerenciador de diretórios
Os memoriais descritivos reais e contratos de imóveis rurais contém dados confidenciais e proprietários de alta criticidade protegidos por termos de sigilo e LGPD.
Para eliminar qualquer chance de commits acidentais de arquivos privados para repositórios públicos no GitHub, o arquivo .gitignore vem configurado de fábrica bloqueando de forma absoluta qualquer arquivo PDF na pasta de processamento, abrindo uma exceção estrita apenas para o PDF público gerado para testes:
# PDFs de memoriais/contratos (confidenciais)
*.pdf
!exemplo_sigef.pdfVocê pode processar centenas de PDFs confidenciais localmente com segurança absoluta: apenas o arquivo exemplo_sigef.pdf poderá ser comitado.
- Node.js v18 ou superior.
Navegue até a pasta do projeto e instale as dependências nativas utilizando:
npm installAs principais bibliotecas integradas ao geoprocessador são:
canvas: Biblioteca nativa C++ integrada para renderização bitmap 2D/3D ultrarápida.@turf/turf: Motor matemático de geoprocessamento espacial geodésico sobre o elipsoide terrestre.pdfjs-dist: Analisador de vetores gráficos e metadados de texto para mapeamento de layout.proj4: Transformador de grades espaciais geodésicas e de cartografia.pdf-lib: Criador vetorial de documentos PDF de demonstração.
Gere o arquivo exemplo_sigef.pdf contendo 4 vértices fechando um imóvel na região Norte (Coari - Amazonas) sem expor dados confidenciais:
node create_example.jsPara ler todos os memoriais descritivos presentes na pasta de mapas, execute:
node index.jsSe desejar ler uma pasta externa específica, basta passá-la como argumento:
node index.js /caminho/da/sua/pasta/com/pdfsO sistema gerará instantaneamente uma subpasta para cada PDF processado dentro do diretório ./output/[NOME_DO_PDF]/:
-
vertices.json: Os pontos geométricos indexados. -
mapa.png: Mapa 2D em alta resolução ($4000 \times 4000\text{ px}$ ). -
mapa_3d.png: Bloco isométrico volumétrico 3D. -
mapa.svg: Geometria vetorial escalável para web. -
mapa.geojson: Feição geográfica fechada para importar no QGIS ou Google Earth. -
mapa.dxf: Arquivo CAD estruturado em escala 1:1 métrica para agrimensores. -
log.txt: Relatório técnico com cálculo geodésico da área (hectares e$m^2$ ) e perímetro via Turf.js.
Se você estiver desenvolvendo um sistema integrador, pode carregar os submódulos da biblioteca individualmente em qualquer arquivo JavaScript (ESM):
import { readPDFAndReconstructLines } from "./src/parser/pdfReader.js";
import { extractVerticesFromReconstructedLines } from "./src/parser/vertexExtractor.js";
import { projectVerticesToUTM } from "./src/projection/utmProjector.js";
import { validateAndClosePolygon } from "./src/index.js";
async function extrairDados(pdfPath) {
// 1. Extrai o texto organizando-o por coordenadas Y e X
const lines = await readPDFAndReconstructLines(pdfPath);
// 2. Extrai os vértices através de regex decimal e DMS
const rawVertices = extractVerticesFromReconstructedLines(lines);
// 3. Valida a topologia geométrica e garante fechamento de anel
const validVertices = validateAndClosePolygon(rawVertices);
// 4. Projeta para metros UTM SIRGAS2000
const { projectedVertices, zone, isSouth } = projectVerticesToUTM(validVertices);
console.log(`Vértices Georreferenciados na Zona ${zone}${isSouth ? "S" : "N"}:`, projectedVertices);
}Este projeto é um software livre de distribuição pública licenciado sob os termos da Licença MIT.
Desenvolvido inteiramente por Diego Oris. Todos os direitos autorais reservados. Sinta-se livre para integrar em ferramentas comerciais, customizar e estender!