Revision 209 trunk/org.gvsig.gdal/org.gvsig.gdal.prov/org.gvsig.gdal.prov.ogr/src/main/java/org/gvsig/gdal/prov/ogr/OGRDataStoreProvider.java

View differences:

OGRDataStoreProvider.java
37 37
import org.gdal.ogr.Layer;
38 38
import org.gdal.ogr.ogr;
39 39
import org.gdal.ogr.ogrConstants;
40

  
40 41
import org.gvsig.fmap.dal.DataStore;
41 42
import org.gvsig.fmap.dal.DataStoreParameters;
42 43
import org.gvsig.fmap.dal.DataTypes;
......
70 71
import org.gvsig.tools.dynobject.DynObject;
71 72
import org.gvsig.tools.evaluator.Evaluator;
72 73
import org.gvsig.tools.exception.BaseException;
74

  
73 75
import org.slf4j.Logger;
74 76
import org.slf4j.LoggerFactory;
75 77

  
76 78
/**
77
 * 
79
 *
78 80
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
79 81
 *
80 82
 */
......
84 86
    private static final Logger LOG = LoggerFactory.getLogger(OGRDataStoreProvider.class);
85 87

  
86 88
    /**
87
     * 
89
     *
88 90
     */
89 91
    public static final String METADATA_DEFINITION_NAME = "OGRDataStoreProvider";
90 92

  
91 93
    /**
92
     * 
94
     *
93 95
     */
94 96
    public static final String NAME = "OGRDataStoreProvider";
95 97

  
96 98
    /**
97
     * 
99
     *
98 100
     */
99 101
    public static final String DESCRIPTION = "OGR provider to open vectorial resources";
100 102

  
......
218 220

  
219 221
                @Override
220 222
                public Object run() throws Exception {
221
                    double[] extent = getLayer().GetExtent(true);
223
                    Layer layer = getLayer();
224
                    double[] extent = layer.GetExtent(true);
222 225
                    if (extent != null) {
223 226
                        return GeometryLocator.getGeometryManager().createEnvelope(extent[0],
224 227
                            extent[2], extent[1], extent[3], SUBTYPES.GEOM2D);
......
226 229
                        Envelope tmpEnvelope =
227 230
                            GeometryLocator.getGeometryManager().createEnvelope(SUBTYPES.GEOM2D);
228 231
                        FeatureType featureType = getStoreServices().getDefaultFeatureType();
229
                        int index = 0;
230
                        while (index < getLayer().GetFeatureCount()) {
232
                        layer.ResetReading();
233
                        Feature feature = layer.GetNextFeature();
234
                        while (feature!=null) {
231 235
                            double[] envelope = new double[4];
232
                            Feature feature = getLayer().GetNextFeature();
233 236
                            int geomFieldIndex =
234
                                getLayer().GetLayerDefn().GetGeomFieldIndex(
237
                                layer.GetLayerDefn().GetGeomFieldIndex(
235 238
                                    featureType.getDefaultGeometryAttributeName());
236 239
                            Geometry ogrGeometry = feature.GetGeomFieldRef(geomFieldIndex);
237 240
                            ogrGeometry.GetEnvelope(envelope);
238 241
                            tmpEnvelope.add(GeometryLocator.getGeometryManager()
239 242
                                .createEnvelope(envelope[0], envelope[2], envelope[1], envelope[3],
240 243
                                    SUBTYPES.GEOM2D));
241
                            index++;
244
                            feature = layer.GetNextFeature();
242 245
                        }
243 246

  
244 247
                        return tmpEnvelope;
......
489 492
            @Override
490 493
            public Object run() throws Exception {
491 494

  
492
                return getLayer().GetFeatureCount();
495
                return getLayer().GetFeatureCount(0);
493 496
            }
494 497
        })).longValue();
495 498
    }
......
504 507
        FeatureReferenceProviderServices providerServices, FeatureType featureType)
505 508
        throws DataException {
506 509

  
507
        Feature ogrFeature = getLayer().GetFeature((int) providerServices.getOID());
510
        int oid = (int)providerServices.getOID();
511
        // Parece que hay un bug en el proveedor de SQLite para gdal.
512
        // Cuando se lee la capa, el m?todo GetFID est? indexado empezando por 0,
513
        // pero cuando se busca una ogrFeature a partir de dicho FID
514
        // el m?todo GetFeature(fid) est? indexado empezando por 1.
515
        // Esto es para rodear el problema.
516
        if(this.dataSource.GetDriver().getName().equalsIgnoreCase("SQLite")){
517
            oid++;
518
        }
519
        Feature ogrFeature = getLayer().GetFeature(oid);
520
        int fid = ogrFeature.GetFID();
508 521
        FeatureProvider featureProvider =
509
            new DefaultFeatureProvider(featureType, ogrFeature.GetFID());
522
            new DefaultFeatureProvider(featureType, fid);
510 523
        OGRConverter converter = new OGRConverter();
511 524
        featureProvider = converter.convert(featureProvider, featureType, ogrFeature);
512 525
        return featureProvider;

Also available in: Unified diff