Statistics
| Revision:

root / branches / Mobile_Compatible_Hito_1 / libFMap_mobile_shp_driver / src-test / org / gvsig / data / datastores / vectorial / file / shp / SHPTest.java @ 22037

History | View | Annotate | Download (17.1 KB)

1
package org.gvsig.data.datastores.vectorial.file.shp;
2

    
3
import java.awt.Shape;
4
import java.awt.geom.PathIterator;
5
import java.io.File;
6
import java.util.Date;
7
import java.util.Iterator;
8

    
9
import junit.framework.TestCase;
10

    
11
import org.apache.log4j.FileAppender;
12
import org.apache.log4j.Level;
13
import org.apache.log4j.Logger;
14
import org.apache.log4j.PatternLayout;
15
import org.cresques.cts.IProjection;
16
import org.gvsig.compatible.StringUtil;
17
import org.gvsig.data.CloseException;
18
import org.gvsig.data.DataCollection;
19
import org.gvsig.data.DataManager;
20
import org.gvsig.data.DataStoreParameters;
21
import org.gvsig.data.InitializeException;
22
import org.gvsig.data.OpenException;
23
import org.gvsig.data.ReadException;
24
import org.gvsig.data.datastores.vectorial.file.shp.utils.SHP;
25
import org.gvsig.data.datastores.vectorial.file.shp_inst.InstSHPStore;
26
import org.gvsig.data.datastores.vectorial.file.shp_jni.JNISHPStore;
27
import org.gvsig.data.datastores.vectorial.file.shp_mem.MemSHPStore;
28
import org.gvsig.data.datastores.vectorial.file.shp_util.IGeometricDataStore;
29
import org.gvsig.data.datastores.vectorial.file.shp_util.ResourceReader;
30
import org.gvsig.data.datastores.vectorial.file.shp_util.Utils;
31
import org.gvsig.data.vectorial.Feature;
32
import org.gvsig.data.vectorial.FeatureType;
33
import org.gvsig.fmap.geom.Geometry;
34
import org.gvsig.fmap.geom.aggregate.MultiCurve2D;
35
import org.gvsig.fmap.geom.aggregate.MultiPoint2D;
36
import org.gvsig.fmap.geom.aggregate.MultiSurface2D;
37
import org.gvsig.fmap.geom.primitive.Curve2D;
38
import org.gvsig.fmap.geom.primitive.NullGeometry;
39
import org.gvsig.fmap.geom.primitive.Point2D;
40
import org.gvsig.fmap.geom.primitive.Surface2D;
41

    
42
import com.vividsolutions.jts.algorithm.CGAlgorithms;
43
import com.vividsolutions.jts.geom.Coordinate;
44
import com.vividsolutions.jts.geom.CoordinateList;
45

    
46
import es.prodevelop.gvsig.mobile.fmap.driver.vect.shp.ShpReader;
47

    
48
/**
49
 * This class tests the three SHP drivers implemented for gvSIG Mobile.
50
 * These drivers are compatible with the new data access model (june 2008)
51
 * and will share a lot of code with gvsig Desktop.
52
 * 
53
 * The right testdata folder is needed.
54
 * 
55
 *  
56
 * @author jldominguez
57
 *
58
 */
59
public class SHPTest extends TestCase {
60
        
61
        private static Logger logger;
62
        
63
        /**
64
         * Test IDs
65
         */
66
        public static final int TEST_PUNTO = 0; 
67
        public static final int TEST_MPUNTO = 1; 
68
        public static final int TEST_LINEA = 2; 
69
        public static final int TEST_POLIGONO = 3; 
70
        public static final int TEST_NULL = 4; 
71
        public static final int TEST_ATT = 5; 
72

    
73
        private File filePunto, fileMPunto, fileLinea, filePoligono, fileNull, fileAtt;
74

    
75
        public SHPTest() {
76
                new Point2D();
77
                new MultiPoint2D((IProjection) null);
78
                new MultiCurve2D(null, null);
79
                new MultiSurface2D(null, null);
80
                new NullGeometry();
81
                
82
                ShpReader.touch();
83
                initLogger();
84
        }
85
        
86
        public static void main(String[] args) {
87
                junit.textui.TestRunner.run(SHPTest.class);
88
        }
89

    
90
        protected void setUp() throws Exception {
91
                super.setUp();
92
        }
93

    
94
        public void testInitialize() {
95
                
96
                if (Utils.USING_PDA) {
97
                        filePunto = ResourceReader.getPdaTestFile(PerformanceTest.SD_FOLDER, "testdata", "puntos_grande.shp");
98
                        fileMPunto = ResourceReader.getPdaTestFile(PerformanceTest.SD_FOLDER, "testdata", "multipuntos_grande.shp");
99
                        fileLinea = ResourceReader.getPdaTestFile(PerformanceTest.SD_FOLDER, "testdata", "lineas_grande.shp");
100
                        filePoligono = ResourceReader.getPdaTestFile(PerformanceTest.SD_FOLDER, "testdata", "poligonos_grande.shp");
101
                        fileNull = ResourceReader.getPdaTestFile(PerformanceTest.SD_FOLDER, "testdata", "pruebaNull.shp");
102
                        fileAtt = ResourceReader.getPdaTestFile(PerformanceTest.SD_FOLDER, "testdata", "atttest.shp");
103
                } else {
104
                        filePunto = ResourceReader.getResourceFile("testdata", "puntos_grande.shp");
105
                        fileMPunto = ResourceReader.getResourceFile("testdata", "multipuntos_grande.shp");
106
                        fileLinea = ResourceReader.getResourceFile("testdata", "lineas_grande.shp");
107
                        // fileLinea = ResourceReader.getResourceFile("testdata", "streets.shp");
108
                        filePoligono = ResourceReader.getResourceFile("testdata", "poligonos_grande.shp");
109
                        fileNull = ResourceReader.getResourceFile("testdata", "pruebaNull.shp");
110
                        fileAtt = ResourceReader.getResourceFile("testdata", "atttest.shp");
111
                }
112

    
113
                new SHPStore();
114
                doTest(SHPStore.DATASTORE_NAME);
115
                new MemSHPStore();
116
                doTest(MemSHPStore.DATASTORE_NAME);
117
                new JNISHPStore();
118
                doTest(JNISHPStore.DATASTORE_NAME);
119
                new InstSHPStore();
120
                doTest(InstSHPStore.DATASTORE_NAME);
121
                
122
                logger.debug("DONE.");
123
        }
124
        
125
        /**
126
         * Performs a test with a given data sorce name
127
         * 
128
         * @see SHPStore
129
         * @see MemSHPStore
130
         * @see JNISHPStore
131
         * 
132
         * @param ds_name
133
         */
134
        public void doTest(String ds_name) {
135
                
136
                logger.debug("DATASOURCE: " + ds_name + ", FILE = " + filePunto.getName() + "...");
137
                shp(filePunto, TEST_PUNTO, ds_name);
138
                
139
                if (ds_name.compareTo(JNISHPStore.DATASTORE_NAME) != 0) {
140
                        logger.debug("DATASOURCE: " + ds_name + ", FILE = " + fileMPunto.getName() + "...");
141
                        shp(fileMPunto, TEST_MPUNTO, ds_name);
142
                }
143

    
144
                logger.debug("DATASOURCE: " + ds_name + ", FILE = " + fileLinea.getName() + "...");
145
                shp(fileLinea, TEST_LINEA, ds_name);
146
                
147
                logger.debug("DATASOURCE: " + ds_name + ", FILE = " + filePoligono.getName() + "...");
148
                shp(filePoligono, TEST_POLIGONO, ds_name);
149
                
150
                logger.debug("DATASOURCE: " + ds_name + ", FILE = " + fileNull.getName() + "...");
151
                shp(fileNull, TEST_NULL, ds_name);
152
                
153
                logger.debug("DATASOURCE: " + ds_name + ", FILE = " + fileAtt.getName() + "...");
154
                shp(fileAtt, TEST_ATT, ds_name);
155
                
156
                // shp(fileGeometryNull);
157
        }
158
        
159
        private void shp(File file, int fileid, String datastore_name) {
160
                DataManager manager = DataManager.getManager();
161
                IGeometricDataStore store = null;
162
                SHPStoreParameters shpParameters=null;
163
                shpParameters =(SHPStoreParameters) manager.createDataStoreParameters(datastore_name);
164
                shpParameters.setFile(file);
165
                shpParameters.setDBFFile(SHP.getDbfFile(file));
166
                shpParameters.setSHXFile(SHP.getShxFile(file));
167
                shpParameters.setDataStoreName(datastore_name);
168
                
169

    
170
                try {
171
                        store = (IGeometricDataStore)
172
                        manager.createDataStore((DataStoreParameters)shpParameters);
173
                } catch (InitializeException e) {
174
                        // TODO Auto-generated catch block
175
                        e.printStackTrace();
176
                }
177
                try {
178
                        store.doOpen();
179
                } catch (OpenException e2) {
180
                        // TODO Auto-generated catch block
181
                        e2.printStackTrace();
182
                }
183

    
184
                FeatureType ft = store.getDefaultFeatureType();
185
                DataCollection dataCollection = null;
186
                try {
187
                        dataCollection = store.getDataCollection(ft,null,null);
188
                } catch (ReadException e1) {
189
                        e1.printStackTrace();
190
                }
191
                Iterator iter = dataCollection.iterator();
192
                int feature_count = 0;
193
                
194
                while (iter.hasNext()) {
195
                        Feature feature = (Feature)iter.next();
196

    
197
                        boolean simple = (datastore_name.compareTo(JNISHPStore.DATASTORE_NAME) == 0);
198
                        check(feature, ft, fileid, simple);
199
                        feature_count++;
200
                }
201
                iter=null;
202
                dataCollection.dispose();
203

    
204
                try {
205
                        store.doClose();
206
                        store.doDispose();
207
                } catch (CloseException e) {
208
                        // TODO Auto-generated catch block
209
                        e.printStackTrace();
210
                }
211

    
212
        }
213
        
214
        private void check(Feature feature, FeatureType att_desc, int fileid, boolean simpletypes) {
215

    
216
                double expected = 0;
217
                
218
                switch (fileid) {
219
                
220
                case TEST_PUNTO:
221
                        expected = feature.getDouble("X");
222
                        Point2D p =  (Point2D) ((Geometry) feature.getDefaultGeometry()).getInternalShape();
223
                        checkPoint(feature, p, expected, simpletypes);
224
                        break;
225
                case TEST_MPUNTO:
226
                        checkMPoint(feature, simpletypes);
227
                        break;
228
                case TEST_LINEA:
229
                        expected = feature.getDouble("LEN");
230
                        Curve2D pl =  (Curve2D) ((Geometry) feature.getDefaultGeometry()).getInternalShape();
231
                        checkLineLength(feature, pl, expected, simpletypes);
232
                        break;
233
                case TEST_POLIGONO:
234
                        expected = feature.getDouble("AREA");
235
                        Surface2D pg =  (Surface2D) ((Geometry) feature.getDefaultGeometry()).getInternalShape();
236
                        checkPolygonArea(feature, pg, expected, simpletypes);
237
                        break;
238
                case TEST_NULL:
239
                        checkNullGeometry(feature);
240
                        break;
241
                case TEST_ATT:
242
                        checkAttributes(feature, simpletypes);
243
                        break;
244
                }
245
        }
246

    
247
        private void checkAttributes(Feature feat, boolean simpl) {
248
                
249
                if (! simpl) {
250
                        Date d = feat.getDate("ATT_DATE");
251
                        String str = d.toString().toLowerCase();
252
                        boolean boo =
253
                                ((str.indexOf("99") != -1)
254
                                        && (
255
                                                        (str.indexOf("12") != -1)
256
                                                        || (str.indexOf("dec") != -1)
257
                                                        || (str.indexOf("dic") != -1))
258
                                        && (str.indexOf("31") != -1));
259
                        assertTrue("Found a date different to 1999 12 31", boo);
260

    
261
                }
262

    
263
                String str = feat.getString("ATT_STRING").trim();
264
                assertEquals(str, "DFGDFGDFG");
265
                
266
                double real = feat.getDouble("ATT_REAL");
267
                boolean boo = ((real == 4.4444) || (real == 4));
268
                assertTrue("REAL = " + real + ", EXP = 4, 4.4444", boo);
269
                
270
                boolean bool = feat.getBoolean("ATT_BOOLEA");
271
                assertTrue("EXP = FALSE, RET = " + (!bool), !bool);
272

    
273

    
274
                int integ = 0;
275
                if (simpl) {
276
                        integ = (int) Math.round(feat.getDouble("ATT_INTEGE"));
277
                } else {
278
                        integ = feat.getInt("ATT_INTEGE");
279
                }
280
                
281
                assertTrue("REAL = " + integ + ", EXP = 44444", integ == 44444);
282
        }
283
        
284
        /**
285
         * Gets the area of the path iterator
286
         * @param piter the path iterator
287
         * @return the area of the path iterator
288
         */
289
        public static double getPathIteratorArea(PathIterator piter) {
290
                
291
                if (piter == null) {
292
                        return 0;
293
                }
294

    
295
                double resp = 0;
296

    
297
                double[] theData = new double[6];
298
                Coordinate c1 = null;
299
                Coordinate firstc = null;
300
                CoordinateList coordList = null;
301

    
302
                while (!piter.isDone()) {
303

    
304
                        int type = piter.currentSegment(theData);
305
                        
306
                        if (type == PathIterator.SEG_MOVETO) {
307
                                if (coordList != null) {
308
                                        coordList.add(firstc, true);
309
                                        // printCoordList(coordList);
310
                                        resp = resp + CGAlgorithms.signedArea(coordList.toCoordinateArray());
311
                                }
312
                                firstc = new Coordinate(theData[0], theData[1]);
313
                                coordList = new CoordinateList();
314
                        }
315
                        c1 = new Coordinate(theData[0], theData[1]);
316
                        coordList.add(c1, true);
317
                        piter.next();
318
                }
319
                
320
                if (coordList != null) {
321
                        coordList.add(firstc, true);
322
                        // printCoordList(coordList);
323
                        // resp = resp + Math.abs(CGAlgorithms.signedArea(coordList.toCoordinateArray()));
324
                        resp = resp + CGAlgorithms.signedArea(coordList.toCoordinateArray());
325
                }
326
                return Math.abs(resp);
327
        }
328

    
329
        private void checkPolygonArea(Feature feature, Surface2D poly, double expected, boolean simpl) {
330

    
331
                int id = 0;
332
                
333
                if (simpl) {
334
                        id = (int) Math.round(feature.getDouble("GUIA_ID"));
335
                } else {
336
                        id = feature.getInt("GUIA_ID");
337
                }
338

    
339
                double ar = getPathIteratorArea(poly.getPathIterator(null));
340
                assertTrue("AREA = " + ar + ", EXP = " + expected, acceptablySimilar(expected, ar, 0.1));
341

    
342
                switch (id) {
343
                case 174996:
344
                        assertTrue("AREA = " + ar + ", EXP = " + 357.7, acceptablySimilar(ar, 357.7, 0.1));
345
                        break;
346
                case 569303133:
347
                        assertTrue("AREA = " + ar + ", EXP = " + 409.46, acceptablySimilar(ar, 409.46, 0.1));
348
                        break;
349
                case 1229222137:
350
                        assertTrue("AREA = " + ar + ", EXP = " + 49.285, acceptablySimilar(ar, 49.285, 0.1));
351
                        break;
352
                case 1795370359:
353
                        assertTrue("AREA = " + ar + ", EXP = " + 98.165, acceptablySimilar(ar, 98.165, 0.1));
354
                        break;
355
                }
356
        }
357

    
358
    /**
359
     * Gets the Euclidean distance between points A and B.
360
     * 
361
     * @param x1 x coordinate of point A
362
     * @param y1 y coordinate of point A
363
     * @param x2 x coordinate of point B
364
     * @param y2 y coordinate of point B
365
     * @return the Euclidean distance between points A and B.
366
     */
367
        public static double distance(double x1, double y1, double x2, double y2) {
368
                double dx = x2 - x1;
369
                double dy = y2 - y1;
370
                return Math.sqrt(dx * dx + dy * dy);
371
        }
372
        
373
        /**
374
         * Gets the length of the path iterator and of the last of its arcs.
375
         * No SRS or unit conversion is used, just the plain length between coordinates.
376
         * 
377
         * @param piter the path iterator of interest
378
         * @return the length of the path iterator and of the last of its arcs.
379
         */
380
        public static double[] getIteratorLengthAndLast(PathIterator piter) {
381

    
382
                double[] resp = new double[2];
383
                resp[0] = 0;
384
                resp[1] = 0;
385

    
386
                if (piter == null)
387
                        return resp;
388

    
389
                double lastx = 0;
390
                double lasty = 0;
391
                boolean conn = true;
392
                float[] current = new float[6];
393

    
394
                // logger.debug("UTILS getIteratorLength. PITER = " + piter);
395

    
396
                while (!piter.isDone()) {
397
                        if (piter.currentSegment(current) != PathIterator.SEG_MOVETO) {
398
                                conn = true;
399
                        } else {
400
                                conn = false;
401
                        }
402
                        resp[1] = distance(lastx, lasty, current[0], current[1]);
403
                        if (conn)
404
                                resp[0] = resp[0] + resp[1];
405
                        lastx = current[0];
406
                        lasty = current[1];
407
                        piter.next();
408
                }
409
                return resp;
410
        }
411

    
412
        private void checkLineLength(Feature feature, Curve2D pl, double expected, boolean simpl) {
413
                int color = 0;
414
                int eleva = 0;
415

    
416
                if (simpl) {
417
                        color = (int) Math.round(feature.getDouble("COLOR"));
418
                        eleva = (int) Math.round(feature.getDouble("ELEVACION"));
419
                } else {
420
                        color = feature.getInt("COLOR");
421
                        eleva = feature.getInt("ELEVACION");
422
                }
423
                                
424
                double len = getIteratorLengthAndLast(pl.getPathIterator(null))[0];
425
                assertTrue("Not good: " + len  + " and " + expected, acceptablySimilar(expected, len, 0.05));
426

    
427
                switch (color) {
428
                case 888830465:
429
                        assertEquals(eleva, -1519669334);
430
                        break;
431
                case 135691458:
432
                        assertEquals(eleva, -1594772521);
433
                        break;
434
                case 631009463:
435
                        assertEquals(eleva, -409958687);
436
                        break;
437
                case 601164227:
438
                        assertEquals(eleva, -1632831996);
439
                        break;
440
                case 1766834083:
441
                        assertEquals(eleva, -671796992);
442
                        break;
443
                }
444
        }
445

    
446
        private void checkMPoint(Feature feature, boolean simpl) {
447
                
448
                int tipocont = 0;
449
                
450
                if (simpl) {
451
                        tipocont = (int) Math.round(feature.getDouble("TIPOCONT"));
452
                } else {
453
                        tipocont = feature.getInt("TIPOCONT");                }                
454

    
455
                tipocont = feature.getInt("TIPOCONT");
456
                
457
                String nomb = feature.getString("FIRST_NOMB").trim();
458
                MultiPoint2D mp = (MultiPoint2D) feature.getDefaultGeometry(); 
459

    
460
                switch (tipocont) {
461
                case 116:
462
                        assertEquals(nomb, "MARIN (EL)");
463
                        assertTrue("Checking presence of coordinate X: ", oneOfXInMPoint(mp, 272463.83));
464
                        break;
465
                case 118:
466
                        assertEquals(nomb, "SALAMANCA");
467
                        assertTrue("Checking presence of coordinate X: ", oneOfXInMPoint(mp, 276024.43));
468
                        break;
469
                case 15035:
470
                        assertEquals(nomb, "ORBISO");
471
                        assertTrue("Checking presence of coordinate X: ", oneOfXInMPoint(mp, 554478.48));
472
                        break;
473
                case 19586:
474
                        assertEquals(nomb, "VALDEZORRAS");
475
                        assertTrue("Checking presence of coordinate X: ", oneOfXInMPoint(mp, 241343.25));
476
                        break;
477
                case 30000:
478
                         assertEquals(nomb, "ORZOLA");
479
                         assertTrue("Checking presence of coordinate X: ", oneOfXInMPoint(mp, -619386.36));
480
                        break;
481
                }
482
        }
483

    
484
        private boolean oneOfXInMPoint(Shape pointorpoints, double d) {
485
                
486
                if (pointorpoints instanceof MultiPoint2D) {
487
                        MultiPoint2D mp = (MultiPoint2D) pointorpoints;
488
                        int np = mp.getNumPoints();
489
                        for (int i=0; i<np; i++) {
490
                                double itemx = mp.getPoint(i).getX();
491
                                if (acceptablySimilar(d, itemx, 0.01)) return true; 
492
                        }
493
                        return false;
494
                } else {
495
                        Point2D p = (Point2D) pointorpoints;
496
                        return acceptablySimilar(d, p.getX(), 0.01); 
497
                }
498
        }
499
        
500
        private void checkNullGeometry(Feature feature) {
501
                Object obj = feature.getDefaultGeometry();
502
                assertNotNull("Checking not NULL geometry: ", obj);
503
        }
504
        
505

    
506
        private void checkPoint(Feature feature, Point2D point, double expected, boolean simpl) {
507
                int id = 0;
508

    
509
                if (simpl) {
510
                        id = (int) Math.round(feature.getDouble("NUMEROENT"));
511
                } else {
512
                        id = feature.getInt("NUMEROENT");
513
                }
514

    
515
                String nomb = feature.getString("NOMBRE").trim();
516
                assertTrue(acceptablySimilar(expected, point.getX(), 0.01));
517

    
518
                switch (id) {
519
                case 58:
520
                        assertEquals(nomb, "MARIN (EL)");
521
                        break;
522
                case 59:
523
                        assertEquals(nomb, "SALAMANCA");
524
                        break;
525
                case 2825:
526
                        assertEquals(nomb, "NAVAHONDILLA");
527
                        break;
528
                case 6474:
529
                        assertEquals(nomb, "CENTENERA");
530
                        break;
531
                case 27761:
532
                        assertEquals(nomb, "EVAN DE ARRIBA");
533
                        break;
534
                }
535
        }
536

    
537

    
538
        private boolean acceptablySimilar(double expec, double area, double tol) {
539
                double diff = Math.abs(expec - area);
540
                return ((diff / Math.abs((expec + area) / 2)) < tol);
541
        }
542

    
543
        
544

    
545
//        public void test_Resources(){
546
//
547
//                DataManager manager = DataManager.getManager();
548
//                Register.selfRegister();
549
//
550
//                SHPStoreParameters shpParameters;
551
//
552
//                shpParameters=(SHPStoreParameters)manager.createDataStoreParameters(SHPStore.DATASTORE_NAME);
553
//                shpParameters.setFile(fileNormal);
554
//
555
//
556
//                DataStoreTest.doFileResourceTest(shpParameters);
557
//        }
558
        
559

    
560
        private void initLogger() {
561

    
562
                Date now = new Date(System.currentTimeMillis());
563
                String nowstr = now.toString();
564
                
565
                nowstr = StringUtil.replaceAllString(nowstr, " ", "_");
566
                nowstr = StringUtil.replaceAllString(nowstr, ":", "_") + ".txt";
567
                
568
                
569
                String outlogpath = "";
570
                
571
                if (Utils.USING_PDA) {
572
                        outlogpath = ResourceReader.getPdaTestFile(PerformanceTest.SD_FOLDER, "testdata", "basic_test_" + nowstr).getAbsolutePath();
573
                } else {
574
                        outlogpath = ResourceReader.getResourceFile("testdata", "basic_test_" + nowstr).getAbsolutePath();
575
                }
576

    
577
                System.out.println("Log file: " + outlogpath);
578

    
579
                try {
580
                    PatternLayout l = new PatternLayout("%5p [%t] - %m%n");
581
                    FileAppender fa = new FileAppender(l, outlogpath, false);
582
                    // ConsoleAppender ca = new ConsoleAppender(l);
583
                    Logger.getRootLogger().setLevel(Level.DEBUG);
584
                    Logger.getRootLogger().addAppender(fa);
585
                    // Logger.getRootLogger().addAppender(ca);
586
                } catch (Exception ex) {
587
                        System.err.println("Error while initializing log4j: " + ex.getMessage());
588
                }
589
                logger = Logger.getLogger(SHPTest.class);
590
        }
591

    
592
}