root / tmp / trunk / servidor / WPS_Callejero_Server / Callejero / src / es / logex / callejero / core / Callejero.java @ 26631
History | View | Annotate | Download (7.88 KB)
1 |
/**
|
---|---|
2 |
*
|
3 |
*/
|
4 |
package es.logex.callejero.core; |
5 |
|
6 |
import java.awt.geom.Rectangle2D; |
7 |
import java.sql.Connection; |
8 |
import java.sql.ResultSet; |
9 |
import java.sql.SQLException; |
10 |
import java.sql.Statement; |
11 |
import java.util.ArrayList; |
12 |
import java.util.List; |
13 |
|
14 |
import org.apache.commons.logging.Log; |
15 |
import org.apache.commons.logging.LogFactory; |
16 |
import org.postgis.PGbox2d; |
17 |
|
18 |
import es.logex.callejero.modelo.BoundingBox; |
19 |
|
20 |
/* logEx. Lógica Extrema s.l.*
|
21 |
* Copyright (C) 2007 Lógica Extrema and Generalitat Valenciana.
|
22 |
*
|
23 |
* This program is free software; you can redistribute it and/or
|
24 |
* modify it under the terms of the GNU General Public License
|
25 |
* as published by the Free Software Foundation; either version 2
|
26 |
* of the License, or (at your option) any later version.
|
27 |
*
|
28 |
* This program is distributed in the hope that it will be useful,
|
29 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
30 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
31 |
* GNU General Public License for more details.
|
32 |
*
|
33 |
* You should have received a copy of the GNU General Public License
|
34 |
* along with this program; if not, write to the Free Software
|
35 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
36 |
*
|
37 |
* For more information, contact:
|
38 |
*
|
39 |
* Generalitat Valenciana
|
40 |
* Conselleria d'Infraestructures i Transport
|
41 |
* Av. Blasco Ibañez, 50
|
42 |
* 46010 VALENCIA
|
43 |
* SPAIN
|
44 |
*
|
45 |
* +34 963862235
|
46 |
* gvsig@gva.es
|
47 |
* www.gvsig.gva.es
|
48 |
*
|
49 |
* or
|
50 |
*
|
51 |
* Lógica Extrema s.l.
|
52 |
* Avda. Cortes Valencianas
|
53 |
* 46015 Valencia
|
54 |
* Spain
|
55 |
*
|
56 |
* logic@logex.es
|
57 |
*/
|
58 |
|
59 |
/**
|
60 |
* @author kike
|
61 |
*
|
62 |
*/
|
63 |
public class Callejero implements ICallejero { |
64 |
|
65 |
Log log = LogFactory.getLog(this.getClass());
|
66 |
|
67 |
private static List<String> municipios = new ArrayList<String>(); |
68 |
public Connection conn = null; |
69 |
|
70 |
public Callejero(Connection conn) { |
71 |
this.conn = conn;
|
72 |
} |
73 |
|
74 |
private ResultSet EjecutaSql(String query) { |
75 |
ResultSet r= null; |
76 |
|
77 |
try {
|
78 |
if(log.isDebugEnabled())
|
79 |
{ |
80 |
log.debug("Executing SQL:" + query);
|
81 |
} |
82 |
Statement s = conn.createStatement();
|
83 |
r = s.executeQuery(query); |
84 |
|
85 |
}catch (Exception e){ |
86 |
log.error(e.getMessage()); |
87 |
} |
88 |
|
89 |
return r;
|
90 |
} |
91 |
|
92 |
/***
|
93 |
* Devuelve una lista de candidatos a partir de un municipio, calle, número
|
94 |
*
|
95 |
*/
|
96 |
public List<String> getCandidatos(String municipio, String calle, String numero) { |
97 |
String candMunicipio = null; |
98 |
if (municipio == null) |
99 |
candMunicipio = "";
|
100 |
else
|
101 |
candMunicipio = municipio; |
102 |
|
103 |
String candCalle = null; |
104 |
if (calle == null) |
105 |
candCalle = "";
|
106 |
else
|
107 |
candCalle = calle; |
108 |
|
109 |
String candNumero = null; |
110 |
if (numero == null) |
111 |
candNumero = "";
|
112 |
else
|
113 |
candNumero = numero; |
114 |
|
115 |
String query = null; |
116 |
ResultSet r = null; |
117 |
List<String> lista = new ArrayList<String>(); |
118 |
|
119 |
log.debug("Decidir query en función de parámetros ");
|
120 |
|
121 |
if ( !candMunicipio.equals("")) { //hay municipio |
122 |
if (candCalle.equals("")) { //municipio sin calle |
123 |
/*query = "select municipio as texto_candidato,LogexLevenshtein('" + candMunicipio.toUpperCase() +
|
124 |
"',municipio) , extent from candidatos_extent where calle isnull order by LogexLevenshtein('" +
|
125 |
candMunicipio.toUpperCase() + "',municipio) ASC LIMIT 10";*/
|
126 |
query = "select municipio as texto_candidato,Levenshtein('" + candMunicipio.toUpperCase() +
|
127 |
"',municipio) , extent from candidatos_extent where calle isnull order by Levenshtein('" +
|
128 |
candMunicipio.toUpperCase() + "',municipio) ASC LIMIT 10";
|
129 |
} else { //municipio con calle |
130 |
query = "select municipio || ' - ' ||calle as texto_candidato,LogexLevenshtein('" + candCalle.toUpperCase() +
|
131 |
"',calle), Levenshtein('" + candMunicipio.toUpperCase() +"',municipio), extent " + |
132 |
" from candidatos_extent order by LogexLevenshtein('" + candCalle.toUpperCase() + "',calle) + " + |
133 |
" Levenshtein('" + candMunicipio.toUpperCase() + "',municipio) ASC LIMIT 10"; |
134 |
} |
135 |
} else { //solo calle |
136 |
if (!candCalle.equals("")) { |
137 |
query = "select municipio || ' - ' ||calle as texto_candidato,LogexLevenshtein('" + candCalle.toUpperCase() +
|
138 |
"',calle) , extent from candidatos_extent order by LogexLevenshtein('" +
|
139 |
candCalle.toUpperCase() + "',calle) ASC LIMIT 10";
|
140 |
} |
141 |
|
142 |
} |
143 |
|
144 |
if (query == null) |
145 |
return lista;
|
146 |
|
147 |
log.debug("Ejecutar query " + query);
|
148 |
r = this.EjecutaSql(query);
|
149 |
String text;
|
150 |
BoundingBox extent = new BoundingBox();
|
151 |
|
152 |
try {
|
153 |
while (r.next()) {
|
154 |
PGbox2d pgBox = new PGbox2d(r.getString("extent")); |
155 |
|
156 |
double[] lowers = {pgBox.getLLB().x, pgBox.getLLB().y}; |
157 |
double[] uppers = {pgBox.getURT().x, pgBox.getURT().y}; |
158 |
extent.setLowersBoundingBox(lowers); |
159 |
extent.setUppersBoundingBox(uppers); |
160 |
|
161 |
lista.add(r.getString("texto_candidato") + "#$" + extent.toString()); |
162 |
} |
163 |
} catch (SQLException e) { |
164 |
log.error(e.getMessage(),e); |
165 |
|
166 |
} finally{
|
167 |
if(r!=null) |
168 |
{ |
169 |
try {
|
170 |
r.close(); |
171 |
} catch (SQLException e) { |
172 |
log.error(e.getMessage(),e); |
173 |
} |
174 |
} |
175 |
} |
176 |
return lista;
|
177 |
|
178 |
} |
179 |
|
180 |
|
181 |
/**
|
182 |
* Devuelve una lista con los nombres de todos los municipios de la base de datos
|
183 |
*
|
184 |
* @return una lista de municipios
|
185 |
*/
|
186 |
public List<String> getMunicipios() { |
187 |
ResultSet r = null; |
188 |
try{
|
189 |
if (this.municipios.isEmpty() ) { |
190 |
log.debug("Municipios vacío. Se llena por primera vez");
|
191 |
|
192 |
r = this.EjecutaSql("select * from municipios"); |
193 |
while (r.next()) {
|
194 |
municipios.add(r.getString("ine_denomina"));
|
195 |
} |
196 |
|
197 |
log.debug("Añadidos " + r.getRow() + "municipios a Callejero.municipios"); |
198 |
} |
199 |
|
200 |
|
201 |
}catch (Exception e) { |
202 |
log.error(e.getMessage(),e); |
203 |
} |
204 |
finally{
|
205 |
if(r!=null) |
206 |
{ |
207 |
try {
|
208 |
r.close(); |
209 |
} catch (SQLException e) { |
210 |
// TODO Auto-generated catch block
|
211 |
e.printStackTrace(); |
212 |
} |
213 |
} |
214 |
} |
215 |
return municipios;
|
216 |
} |
217 |
|
218 |
/**
|
219 |
* Dado el nombre de un municipio devuelve los 10 mejores
|
220 |
* candidatos. Si se encuentra un municipio con el mismo nombre
|
221 |
* sólo se devuelve el municipio encontrado.
|
222 |
*/
|
223 |
public List<String> getMunicipiosLV(String municipio){ |
224 |
ResultSet r = null; |
225 |
List<String> retMunis = new ArrayList<String>(); |
226 |
try{
|
227 |
|
228 |
|
229 |
r = this.EjecutaSql("select distinct ine_denomina, levenshtein(upper('"+municipio+ |
230 |
"'),upper(BUSQUEDA)) from municipios order by levenshtein(upper('"+municipio+
|
231 |
"'),upper(BUSQUEDA)) asc LIMIT 10");
|
232 |
while (r.next()) {
|
233 |
retMunis.add(r.getString("ine_denomina"));
|
234 |
} |
235 |
|
236 |
}catch (Exception e) { |
237 |
log.error(e.getMessage(),e); |
238 |
} |
239 |
finally{
|
240 |
if(r!=null) |
241 |
{ |
242 |
try {
|
243 |
r.close(); |
244 |
} catch (SQLException e) { |
245 |
// TODO Auto-generated catch block
|
246 |
e.printStackTrace(); |
247 |
} |
248 |
} |
249 |
} |
250 |
return retMunis;
|
251 |
// LevenshteinDistance lv = new LevenshteinDistance();;
|
252 |
// List<String> lista = new ArrayList<String>();
|
253 |
//
|
254 |
// return lv.getTopX(municipio, getMunicipios(),10);
|
255 |
|
256 |
} |
257 |
|
258 |
/**
|
259 |
* Devuelve el mapa con sus layers, cada layer tendrá su gmldocument
|
260 |
*/
|
261 |
public IMap getMapFromExtent(BoundingBox box) {
|
262 |
IMap map = null;
|
263 |
|
264 |
return map;
|
265 |
} |
266 |
|
267 |
/**
|
268 |
* Devuelve el extent máximo de la capa especificada. Quizás debería estar en un package de utils...
|
269 |
* y devolver los máximos...
|
270 |
* @return
|
271 |
* @throws Exception
|
272 |
*/
|
273 |
public Rectangle2D getMaxExtent(String layerName) throws Exception{ |
274 |
ResultSet r = null; |
275 |
Statement s = null; |
276 |
PGbox2d pgBox = null;
|
277 |
|
278 |
try {
|
279 |
s = conn.createStatement(); |
280 |
r = s.executeQuery("SELECT EXTENT(the_GEOM) as bbox FROM " + layerName);
|
281 |
|
282 |
if (r.next() ) {
|
283 |
pgBox = (PGbox2d) r.getObject("bbox");
|
284 |
} |
285 |
|
286 |
Rectangle2D rec = new Rectangle2D.Double(pgBox.getLLB().x,pgBox.getLLB().y, |
287 |
pgBox.getURT().x-pgBox.getLLB().x, pgBox.getURT().y-pgBox.getLLB().y) ; |
288 |
return rec;
|
289 |
|
290 |
} catch (SQLException e) { |
291 |
// TODO Auto-generated catch block
|
292 |
e.printStackTrace(); |
293 |
throw e;
|
294 |
} |
295 |
} |
296 |
|
297 |
public ArrayList<String> getLayerList() { |
298 |
ArrayList<String> list = new ArrayList<String>(); |
299 |
|
300 |
return list;
|
301 |
} |
302 |
} |
303 |
|