SncMappingTool.java
5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package com.sigem.gis;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SncMappingTool {
static class Entity {
String id;
String name;
boolean active;
String sncCode = "N/A";
String sncDept = "N/A";
public Entity(String id, String name, boolean active) {
this.id = id;
this.name = name;
this.active = active;
}
}
static class SncDist {
String code;
String dept;
String name;
public SncDist(String code, String dept, String name) {
this.code = code;
this.dept = dept;
this.name = name;
}
}
public static void main(String[] args) {
try {
System.out.println("Iniciando Reporte Comparativo SIGEM vs SNC...");
// 1. Obtener Entidades de .254
List<Entity> sigemEntities = getSigemEntities();
System.out.println("Entidades SIGEM recuperadas: " + sigemEntities.size());
// 2. Obtener Distritos de SNC (via WFS)
List<SncDist> sncDistricts = getSncDistricts();
System.out.println("Distritos SNC recuperados: " + sncDistricts.size());
// 3. Generar SQL Completo
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("DELETE FROM public.snc_catalog_mapping;\n");
sqlBuilder.append("INSERT INTO public.snc_catalog_mapping (entidad_id, dpto_snc, dist_snc) VALUES \n");
for (int i = 0; i < sncDistricts.size(); i++) {
SncDist sd = sncDistricts.get(i);
// Lógica de ID: Buscar match o generar ID administrativo
Entity match = findMatch(sd.name, sigemEntities);
String id = (match != null) ? match.id : "99" + sd.dept + sd.code;
sqlBuilder.append(String.format("('%s', '%s', %s)", id, sd.dept, sd.code));
if (i < sncDistricts.size() - 1) sqlBuilder.append(",");
if (i % 5 == 4) sqlBuilder.append("\n");
}
sqlBuilder.append(";\n");
System.out.println("--- SQL GENERADO (Copia y pega o inyecta) ---\n");
System.out.println(sqlBuilder.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
private static List<Entity> getSigemEntities() throws Exception {
List<Entity> list = new ArrayList<>();
Class.forName("org.postgresql.Driver");
try (Connection conn = DriverManager.getConnection("jdbc:postgresql://192.168.1.254:5432/sigemweb", "postgres", "x25yvaga2017")) {
try (Statement st = conn.createStatement()) {
ResultSet rs = st.executeQuery("SELECT entidad, nombre, activo FROM public.entidades ORDER BY entidad");
while (rs.next()) {
list.add(new Entity(rs.getString("entidad"), rs.getString("nombre"), rs.getBoolean("activo")));
}
}
}
return list;
}
private static List<SncDist> getSncDistricts() throws Exception {
List<SncDist> list = new ArrayList<>();
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.catastro.gov.py/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=snc:ly_dist&maxFeatures=500&outputFormat=application/json"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String body = response.body();
// Parseo manual simple para evitar dependencias externas de JSON (Regex)
Pattern p = Pattern.compile("\\{\"type\":\"Feature\".*?\"properties\":\\{(.*?)\\}\\}");
Matcher m = p.matcher(body);
while (m.find()) {
String props = m.group(1);
String code = extract(props, "cod_dist");
String dept = extract(props, "cod_dpto");
String name = extract(props, "nom_dist");
list.add(new SncDist(code, dept, name));
}
return list;
}
private static String extract(String props, String key) {
Pattern p = Pattern.compile("\"" + key + "\":\"?(.*?)\"?[,\\}]");
Matcher m = p.matcher(props);
if (m.find()) return m.group(1).trim();
return "N/A";
}
private static Entity findMatch(String sncName, List<Entity> entities) {
String cleanSnc = sncName.toUpperCase().trim();
for (Entity e : entities) {
String cleanSigem = e.name.toUpperCase().replace("MUNICIPALIDAD DE ", "").trim();
if (cleanSnc.contains(cleanSigem) || cleanSigem.contains(cleanSnc)) return e;
}
return null;
}
}