Statistics
| Revision:

svn-gvsig-desktop / tags / v10_RC2c / extensions / extJDBC / src / com / iver / cit / gvsig / fmap / drivers / jdbc / postgis / testPostGis.java @ 8745

History | View | Annotate | Download (19.1 KB)

1 2269 fjp
/*
2
 * Created on 03-mar-2005
3
 *
4
 * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
5
 *
6
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21
 *
22
 * For more information, contact:
23
 *
24
 *  Generalitat Valenciana
25
 *   Conselleria d'Infraestructures i Transport
26
 *   Av. Blasco Ib??ez, 50
27
 *   46010 VALENCIA
28
 *   SPAIN
29
 *
30
 *      +34 963862235
31
 *   gvsig@gva.es
32
 *      www.gvsig.gva.es
33
 *
34
 *    or
35
 *
36
 *   IVER T.I. S.A
37
 *   Salamanca 50
38
 *   46005 Valencia
39
 *   Spain
40
 *
41
 *   +34 963163400
42
 *   dac@iver.es
43
 */
44
package com.iver.cit.gvsig.fmap.drivers.jdbc.postgis;
45
46 5574 fjp
import java.awt.geom.Rectangle2D;
47 7095 fjp
import java.nio.ByteBuffer;
48 3127 fjp
import java.sql.Connection;
49 7095 fjp
import java.sql.Date;
50 2269 fjp
import java.sql.DriverManager;
51 3127 fjp
import java.sql.PreparedStatement;
52 2269 fjp
import java.sql.ResultSet;
53 3127 fjp
import java.sql.SQLException;
54 2269 fjp
import java.sql.Statement;
55 7095 fjp
import java.sql.Time;
56
import java.sql.Timestamp;
57
import java.util.Calendar;
58 2269 fjp
import java.util.Enumeration;
59 7095 fjp
import java.util.GregorianCalendar;
60 2269 fjp
61 7095 fjp
import javax.swing.UIManager;
62
63 5574 fjp
import org.cresques.cts.IProjection;
64
import org.cresques.cts.ProjectionPool;
65 4740 fjp
import org.postgresql.fastpath.Fastpath;
66
67 5574 fjp
import com.iver.cit.gvsig.fmap.core.ICanReproject;
68
import com.iver.cit.gvsig.fmap.core.IFeature;
69 2269 fjp
import com.iver.cit.gvsig.fmap.core.IGeometry;
70 7703 luisw2
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
71 5574 fjp
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
72
import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator;
73
import com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver;
74
import com.iver.cit.gvsig.fmap.drivers.VectorialJDBCDriver;
75 5714 fjp
import com.iver.cit.gvsig.fmap.drivers.WKBParser2;
76 5574 fjp
import com.iver.cit.gvsig.fmap.layers.FLayer;
77
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
78
import com.iver.cit.gvsig.fmap.layers.ISpatialDB;
79
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
80 2269 fjp
81
82
/**
83
 * @author FJP
84
 *
85
 * TODO To change the template for this generated type comment go to
86
 * Window - Preferences - Java - Code Generation - Code and Comments
87
 */
88
public class testPostGis {
89
90
      public static void main(String[] args)
91
      {
92
      /*    System.err.println("dburl has the following format:");
93
          System.err.println("jdbc:postgresql://HOST:PORT/DATABASENAME");
94
          System.err.println("tablename is 'jdbc_test' by default.");
95
          System.exit(1); */
96
97
98 3127 fjp
          String dburl = "jdbc:postgresql://localhost/latin1";
99
          String dbuser = "postgres";
100
          String dbpass = "aquilina";
101
102 7095 fjp
          String dbtable = "reservados2";
103 3127 fjp
104
          Connection conn = null;
105
          System.out.println("Creating JDBC connection...");
106
          try {
107
            Class.forName("org.postgresql.Driver");
108
              Enumeration enumDrivers = DriverManager.getDrivers();
109
              while (enumDrivers.hasMoreElements())
110
              {
111
                  System.out.println("Driver " + enumDrivers.nextElement().toString());
112
              }
113
              conn = DriverManager.getConnection(dburl, dbuser, dbpass);
114
115
              conn.setAutoCommit(false);
116
117
              long t1 = System.currentTimeMillis();
118 7095 fjp
              test1(conn, dburl, dbuser, dbpass, dbtable);
119 3127 fjp
              long t2 = System.currentTimeMillis();
120
              System.out.println("Tiempo de consulta1:" + (t2 - t1) + " milisegundos");
121
122 7095 fjp
              /* FLyrVect lyr = initLayerPostGIS();
123 3127 fjp
              t1 = System.currentTimeMillis();
124 5574 fjp
              test4(lyr);
125 3127 fjp
              t2 = System.currentTimeMillis();
126

127 7095 fjp
              System.out.println("Tiempo de consulta2:" + (t2 - t1) + " milisegundos"); */
128 3127 fjp
129
              conn.close();
130 2269 fjp
131 3127 fjp
          } catch (ClassNotFoundException e) {
132
              // TODO Auto-generated catch block
133
              e.printStackTrace();
134
          } catch (SQLException e) {
135
            // TODO Auto-generated catch block
136
            e.printStackTrace();
137
          }
138
139
140
      }
141
      private static void test1(Connection conn, String dburl, String dbuser, String dbpass, String dbtable)
142
      {
143
          try
144
          {
145
              // magic trickery to be pgjdbc 7.2 compatible
146
              // This works due to the late binding of data types in most java VMs. As
147
              // this is more a demo source than a real-world app, we can risk this
148
              // problem.
149
              /* if (conn.getClass().getName().equals("org.postgresql.jdbc2.Connection")) {
150
                  ((org.postgresql.Connection) conn).addDataType("geometry", "org.postgis.PGgeometry");
151
                  ((org.postgresql.Connection) conn).addDataType("box3d", "org.postgis.PGbox3d");
152
              } else {
153
                  ((org.postgresql.PGConnection) conn).addDataType("geometry", "org.postgis.PGgeometry");
154
                  ((org.postgresql.PGConnection) conn).addDataType("box3d", "org.postgis.PGbox3d");
155
              } */
156 2269 fjp
157 3127 fjp
158 2269 fjp
159 3127 fjp
            /*
160
            * Create a statement and execute a select query.
161 2269 fjp
            */
162 4740 fjp
              // String strSQL = "select AsBinary(the_geom) as geom, nom_provin from " + dbtable;
163 7095 fjp
              // String strSQL = "select ASBINARY(the_geom) as geom, gid from " + dbtable;
164
              String strSQL = "select ASBINARY(geometria) as geom, fecha_inicio_evento, fecha_fin_evento, date1, time1 from " + dbtable;
165 3127 fjp
              // strSQL = "select ASTEXT(the_geom), nom_provin as geom from " + dbtable;
166
              /* String strSQL = "SELECT gid, rd_3, rd_5, rd_6, rd_10, rd_11, rd_12, rd_13, rd_14,";
167
              strSQL = strSQL + " rd_15, rd_16, kilometers, cost, metros, AsText(force_2d(the_geom)) FROM vias";
168
              strSQL = strSQL + " WHERE TRUE";
169
              */
170
              // PreparedStatement s = conn.prepareStatement(strSQL);
171
172
              Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
173 3251 fjp
              // s.execute("begin");
174 3127 fjp
175
              // Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
176
              // s.setFetchSize(5);
177 4740 fjp
              int fetchSize = 150000;
178 3127 fjp
            s.execute("declare wkb_cursor binary cursor for " + strSQL);
179 7095 fjp
            ResultSet r =   s.executeQuery("fetch forward " + fetchSize + " in wkb_cursor");
180
//              /// ResultSet r =   s.executeQuery("fetch forward all in wkb_cursor");
181 3251 fjp
182
            // String strSQL2 = "select AsBinary(the_geom) as geom, nom_provin from " + dbtable;
183
            // PreparedStatement ps = conn.prepareStatement(strSQL2);
184
            // ResultSet r = ps.executeQuery();
185 3127 fjp
186 7095 fjp
//              ResultSet r = s.executeQuery(strSQL);
187 5007 fjp
            WKBParser2 parser2 = new WKBParser2();
188 5714 fjp
            // WKBParser parser = new WKBParser();
189 3127 fjp
            long id=0;
190
            /* for (int i=1; i< 100; i++)
191 2269 fjp
            {
192
                r.absolute(i);
193
                System.out.println("Row " + i + ":" + r.getString(2));
194 3127 fjp
            }
195
            r.beforeFirst();
196
              for (int i=1; i< 100; i++)
197
              {
198
                  r.absolute(i);
199
                  System.out.println("Row " + i + ":" + r.getString(2));
200
              } */
201 7095 fjp
            Timestamp date1 = new Timestamp(2006-1900, 8, 5, 16, 0, 0, 0);
202
            long time1 = date1.getTime();
203
            System.out.println("time1 = " + time1 + " data1 + " + date1);
204
            Timestamp date2 = new Timestamp(2006-1900, 8, 4, 9, 0, 0, 0);
205
            long time2 = date2.getTime();
206
            System.out.println("time2 = " + time2 + " data2 + " + date2);
207
            double num_msSecs2000 = 9.466776E11;
208
209 3127 fjp
210
            while( r.next() )
211
            {
212
              /*
213
              * Retrieve the geometry as an object then cast it to the geometry type.
214
              * Print things out.
215
              */
216
                // Object obj = r.getObject(2);
217 7095 fjp
                // byte[] arrayByte = r.getBytes(1);
218 5007 fjp
219
                // IGeometry gp = parser.parse(arrayByte);
220 7095 fjp
                // IGeometry gp2 = parser2.parse(arrayByte);
221 5007 fjp
222 7095 fjp
                String strAux = r.getString(2);
223
//                long asLong = r.getLong(2);
224
//                double asDouble = r.getDouble(2);
225
//                Date asDate = r.getDate(2);
226
                byte[] data1 = r.getBytes(2);
227
                byte[] data2 = r.getBytes(3);
228
                byte[] bdate1 = r.getBytes(4);
229
                byte[] btime1 = r.getBytes(5);
230
                ByteBuffer buf = ByteBuffer.wrap(data1);
231
                ByteBuffer bufDate1 = ByteBuffer.wrap(bdate1);
232
                ByteBuffer bufTime1 = ByteBuffer.wrap(btime1);
233
234
                long daysAfter2000 = bufDate1.getInt() + 1;
235
                long msecs = daysAfter2000*24*60*60*1000;
236
                long real_msecs_date1 = (long) (num_msSecs2000 + msecs);
237
                Date realDate1 = new Date(real_msecs_date1);
238
                System.err.println("Date1 = " + realDate1 + " diff = " + (real_msecs_date1 - num_msSecs2000));
239
240
                long microsecs = bufTime1.getLong();
241
                long real_msecs = (long) (microsecs-num_msSecs2000);
242
                Time mytime1 = new Time(real_msecs);
243
                System.err.println("TIME1 = " + mytime1);
244
245
246
                                double n1 = buf.getDouble(0); // num segs after 2000
247
//                                Timestamp ts2000 = new Timestamp(2000-1900, 0, 1, 0, 0 , 0, 0);
248
//                                int offset = ts2000.getTimezoneOffset() * 60 * 1000;
249
250
//                                double num_msSecs2000 = ts2000.getTime() + offset;
251
                                long real_msecs2 = (long) (num_msSecs2000 + n1*1000);
252
                                Timestamp real = new Timestamp(real_msecs2);
253
254 3127 fjp
                // int id = r.getInt(2);
255 7095 fjp
                System.out.println("Fila " + id + ": fecha:" + real);
256 3127 fjp
                id++;
257
                // Geometry regeom = PGgeometry.geomFromString(obj.toString());
258
259
              // PGgeometry geom = (PGgeometry)obj;
260
               // int id = r.getInt(2);
261 4740 fjp
              // System.out.println("Row " + id + ":" + strAux);
262 3127 fjp
              // System.out.println(geom.toString());
263
                // System.out.println("provin=" + r.getString(2));
264 4740 fjp
                /* if ((id % fetchSize) == 0)
265 3127 fjp
                {
266
                    r =   s.executeQuery("fetch forward " + fetchSize + " in wkb_cursor");
267 4740 fjp
                } */
268 3251 fjp
269 3127 fjp
            }
270 3251 fjp
            // s.execute("end");
271
            s.close();
272
273 3127 fjp
          }
274
          catch( Exception e )
275 2269 fjp
          {
276 3127 fjp
            e.printStackTrace();
277
          }
278
        }
279
      private static void test2(Connection conn, String dburl, String dbuser, String dbpass, String dbtable)
280
      {
281
          try
282
          {
283 2269 fjp
            /*
284 3127 fjp
            * Create a statement and execute a select query.
285
            */
286
              String strSQL = "select gid from " + dbtable;
287
              PreparedStatement s = conn.prepareStatement(strSQL);
288 2269 fjp
289 3127 fjp
              // Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
290
              int fetchSize = 5000;
291
              ResultSet r = s.executeQuery(strSQL);
292
              int id=0;
293
              while( r.next() )
294
              {
295
                String strAux = r.getString(1);
296
                id++;
297
                // System.out.println("Row " + id + ":" + strAux);
298
              }
299
              s.close();
300
          }
301
          catch( Exception e )
302
          {
303
            e.printStackTrace();
304
          }
305
        }
306 4740 fjp
307 3127 fjp
308 4740 fjp
      private static void test3(Connection conn, String dburl, String dbuser, String dbpass, String dbtable)
309
      {
310
          try
311
          {
312
                  Fastpath  fp;
313
                  if (conn.getClass().getName().equals("org.postgresql.jdbc2.Connection")) {
314
                          // ((org.postgresql.Connection) conn).addDataType("geometry", "org.postgis.PGgeometry");
315
                          // ((org.postgresql.Connection) conn).addDataType("box3d", "org.postgis.PGbox3d");
316
                  } else {
317
                          ((org.postgresql.PGConnection) conn).addDataType("geometry", "org.postgis.PGgeometry");
318
                          ((org.postgresql.PGConnection) conn).addDataType("box3d", "org.postgis.PGbox3d");
319
                          fp =  ((org.postgresql.PGConnection) conn).getFastpathAPI();
320
                  }
321
322
323
324
            /*
325
            * Create a statement and execute a select query.
326
            */
327
              String strSQL = "select * from " + dbtable;
328
              // String strSQL = "select ASBINARY(the_geom) as geom from " + dbtable;
329
              // strSQL = "select ASTEXT(the_geom), nom_provin as geom from " + dbtable;
330
              /* String strSQL = "SELECT gid, rd_3, rd_5, rd_6, rd_10, rd_11, rd_12, rd_13, rd_14,";
331
              strSQL = strSQL + " rd_15, rd_16, kilometers, cost, metros, AsText(force_2d(the_geom)) FROM vias";
332
              strSQL = strSQL + " WHERE TRUE";
333
              */
334
              // PreparedStatement s = conn.prepareStatement(strSQL);
335
336
              Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
337
              // s.execute("begin");
338
339
              // Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
340
              // s.setFetchSize(5);
341
            /*  int fetchSize = 150000;
342
            s.execute("declare wkb_cursor2 binary cursor for " + strSQL);
343
            ResultSet r =   s.executeQuery("fetch forward " + fetchSize + " in wkb_cursor2"); */
344
345
            // String strSQL2 = "select AsBinary(the_geom) as geom, nom_provin from " + dbtable;
346
            // PreparedStatement ps = conn.prepareStatement(strSQL2);
347
            // ResultSet r = ps.executeQuery();
348
349
            ResultSet r = s.executeQuery(strSQL);
350 5714 fjp
            // WKBParser parser = new WKBParser();
351 4740 fjp
            long id=0;
352
            /* FastpathArg args[] = new FastpathArg[2];
353
            args[0] = new FastpathArg(fd);
354
            args[1] = new FastpathArg(len);
355
            return fp.getData("loread", args); */
356
            while( r.next() )
357
            {
358
              /*
359
              * Retrieve the geometry as an object then cast it to the geometry type.
360
              * Print things out.
361
              */
362
                Object obj = r.getObject(9);
363
                // fp.
364
                    // final Shape current = (Shape) r.getObject(1);
365
                // byte[] arrayByte = r.getBytes(1);
366
                // String strAux = r.getString(2);
367
368
                id++;
369
                // Geometry regeom = PGgeometry.geomFromString(obj.toString());
370
371
              // PGgeometry geom = (PGgeometry)obj;
372
               // int id = r.getInt(2);
373
              // System.out.println("Row " + id + ":" + strAux);
374
              // System.out.println(geom.toString());
375
                // System.out.println("provin=" + r.getString(2));
376
                /* if ((id % fetchSize) == 0)
377
                {
378
                    r =   s.executeQuery("fetch forward " + fetchSize + " in wkb_cursor");
379
                } */
380
381
382
            }
383
            // s.execute("end");
384
            s.close();
385
386
          }
387
          catch( Exception e )
388
          {
389
            e.printStackTrace();
390
          }
391
      }
392
393 5574 fjp
      private static void test4(FLyrVect lyr)
394
      {
395
            try
396
            {
397
                    ISpatialDB dbAdapter = (ISpatialDB) lyr.getSource();
398
            VectorialDatabaseDriver dbDriver = (VectorialDatabaseDriver) dbAdapter.getDriver();
399
                IFeatureIterator geomIt = dbDriver.getFeatureIterator(lyr.getFullExtent(), "23030");
400
                while (geomIt.hasNext())
401
                {
402
                        IFeature feat = geomIt.next();
403
                        IGeometry geom = feat.getGeometry();
404
                }
405
                  }
406
                  catch(Exception e)
407
                  {
408
                          e.printStackTrace();
409
                  }
410
411
      }
412
413
        private static FLyrVect initLayerPostGIS()
414
        {
415
        String dbURL = "jdbc:postgresql://localhost:5432/latin1"; // latin1 is the catalog name
416
        String user = "postgres";
417
        String pwd = "aquilina";
418
        String layerName = "vias";
419
        String tableName = "vias";
420
        Connection conn;
421
        LayerFactory.setDriversPath("D:/eclipse/workspace/_fwAndami/gvSIG/extensiones/com.iver.cit.gvsig/drivers");
422
                try {
423
                        conn = DriverManager.getConnection(dbURL, user, pwd);
424
                conn.setAutoCommit(false);
425
426
                String fidField = "gid"; // BE CAREFUL => MAY BE NOT!!!
427
                String geomField = "the_geom"; // BE CAREFUL => MAY BE NOT!!! => You should read table GEOMETRY_COLUMNS.
428
                                                                                // See PostGIS help.
429
430
                // To obtain the fields, make a connection and get them.
431
                        /* Statement st = conn.createStatement();
432
                        ResultSet rs = st.executeQuery("select * from " + tableName + " LIMIT 1");
433
                        ResultSetMetaData rsmd = rs.getMetaData();
434
                        String[] fields = new String[rsmd.getColumnCount()-1]; // We don't want to include the_geom field
435
                        int j = 0;
436
                        for (int i = 0; i < fields.length; i++) {
437
                                if (!rsmd.getColumnName(i+1).equalsIgnoreCase(geomField))
438
                                {
439
                                        fields[j++] = rsmd.getColumnName(i+1);
440
                                }
441
                        }
442
                        rs.close(); */
443
444
                String[] fields = new String[1];
445
                fields[0] = "gid";
446
447
                String whereClause = "";
448
449
                VectorialJDBCDriver driver = (VectorialJDBCDriver) LayerFactory.getDM()
450
                                        .getDriver("PostGIS JDBC Driver");
451
452
                // Here you can set the workingArea
453
                // driver.setWorkingArea(dbLayerDefinition.getWorkingArea());
454
455
456
                String strEPSG = "23030";
457
                DBLayerDefinition lyrDef = new DBLayerDefinition();
458
                lyrDef.setName(layerName);
459
                lyrDef.setTableName(tableName);
460
                lyrDef.setWhereClause(whereClause);
461
                lyrDef.setFieldNames(fields);
462
                lyrDef.setFieldGeometry(geomField);
463
                lyrDef.setFieldID(fidField);
464
                // if (dbLayerDefinition.getWorkingArea() != null)
465
                //     lyrDef.setWorkingArea(dbLayerDefinition.getWorkingArea());
466
467
                lyrDef.setSRID_EPSG(strEPSG);
468
                if (driver instanceof ICanReproject)
469
                {
470
                    ((ICanReproject)driver).setDestProjection(strEPSG);
471
                }
472
                driver.setData(conn, lyrDef);
473
                IProjection proj = null;
474
                if (driver instanceof ICanReproject)
475
                {
476 7703 luisw2
                    proj = CRSFactory.getCRS("EPSG:" + ((ICanReproject)driver).getSourceProjection());
477 5574 fjp
                }
478
479
                FLayer lyr = LayerFactory.createDBLayer(driver, layerName, proj);
480
                Rectangle2D rectAux = lyr.getFullExtent();
481
                return (FLyrVect) lyr;
482
                }
483
                catch(Exception e)
484
                {
485
                        e.printStackTrace();
486
                }
487
                return null;
488
        }
489 2269 fjp
}