Revision 209

View differences:

trunk/org.gvsig.gdal/org.gvsig.gdal.prov/org.gvsig.gdal.prov.ogr/src/main/java/org/gvsig/gdal/prov/ogr/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;
trunk/org.gvsig.gdal/org.gvsig.gdal.prov/org.gvsig.gdal.prov.ogr/src/main/java/org/gvsig/gdal/prov/ogr/OGRFetureSetProvider.java
55 55
import org.slf4j.LoggerFactory;
56 56

  
57 57
/**
58
 * 
58
 *
59 59
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
60 60
 *
61 61
 */
......
122 122
        LOG.debug("Running query {} over {}", new Object[] { sql, dataSource.getName() });
123 123

  
124 124
        Layer layer = null;
125
        if (getOGRStoreProvider().getLayer().TestCapability(ogrConstants.OLCFastSpatialFilter)
125
        boolean ignoreSpatialFilter = (boolean) getStore().getParameters().getDynValue(OGRDataStoreParameters.IGNORE_SPATIAL_FILTER);
126
        if (!ignoreSpatialFilter && getOGRStoreProvider().getLayer().TestCapability(ogrConstants.OLCFastSpatialFilter)
126 127
            && getQuery().hasFilter()) {
127 128

  
128 129
            String evaluatorSQL = getQuery().getFilter().getSQL();
......
153 154
        } else {
154 155
            layer = dataSource.ExecuteSQL(sql);
155 156
        }
156
        
157

  
157 158
        if(layer == null){
158 159
            LOG.warn("The result of query is null. SQL {} FeatureType {}", sql, getFeatureType());
159 160
            LOG.warn("Getting data without SQL filter");
160 161
            OGRDataStoreParameters ogrParameters = (OGRDataStoreParameters) getOGRStoreProvider().getParameters();
161 162
            layer = dataSource.ExecuteSQL("SELECT * FROM ".concat(ogrParameters.getLayerName()));
162 163
        }
163
        
164

  
164 165
        return new OGRFastIterator(getStore(), layer, index);
165 166
    }
166 167

  
......
188 189

  
189 190
        private FeatureProvider featureProvider;
190 191

  
192
        private Feature currentOgrFeature;
193
        private Feature nextOgrFeature;
194

  
191 195
        public OGRFastIterator(FeatureStoreProvider storeProvider, Layer layer, long index)
192 196
            throws OGRUnsupportedFormatException {
193 197
            super(storeProvider);
......
196 200
            this.converter = new OGRConverter();
197 201
            this.index = index;
198 202
            this.layer = layer;
199
            this.layer.SetNextByIndex((int) index);
203
            this.layer.GetFeatureCount();
204
            this.layer.ResetReading();
205
            if(index!=0){
206
                this.layer.SetNextByIndex((int) index);
207
            }
208
            this.currentOgrFeature = null;
209
            this.nextOgrFeature =  this.layer.GetNextFeature();
200 210
        }
201 211

  
202 212
        @Override
203 213
        public void remove() {
204
            Feature ogrFeature;
205
            ogrFeature = this.layer.GetNextFeature();
206
            this.layer.DeleteFeature(ogrFeature.GetFID());
207
            index++;
214
            if (currentOgrFeature != null) {
215
                this.layer.DeleteFeature(currentOgrFeature.GetFID());
216
                currentOgrFeature=null;
217
            }
208 218
        }
209 219

  
210 220
        @Override
211 221
        protected Object internalNext() {
212
            Feature ogrFeature = this.layer.GetNextFeature();
213
            this.featureProvider = converter.convert(featureProvider, getFeatureType(), ogrFeature);
214
            index++;
222
            this.currentOgrFeature = this.nextOgrFeature;
223
            this.featureProvider = null;
224
            this.featureProvider = converter.convert(featureProvider, getFeatureType(), this.nextOgrFeature);
225
            this.nextOgrFeature =  this.layer.GetNextFeature();
215 226
            return this.featureProvider;
216 227
        }
217 228

  
218 229
        @Override
219 230
        protected boolean internalHasNext() {
220
            return index < this.layer.GetFeatureCount() ? true : false;
231
            return nextOgrFeature!=null;
221 232
        }
222 233

  
223 234
        @Override
trunk/org.gvsig.gdal/org.gvsig.gdal.prov/org.gvsig.gdal.prov.ogr/src/main/java/org/gvsig/gdal/prov/ogr/OGRConverter.java
66 66
/**
67 67
 * Converter class used to parse OGR layer defn, feature, types... to gvSIG
68 68
 * objects and constant.
69
 * 
69
 *
70 70
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
71 71
 *
72 72
 */
......
82 82
    private static final Logger LOG = LoggerFactory.getLogger(OGRConverter.class);
83 83

  
84 84
    /**
85
     * 
85
     *
86 86
     */
87 87
    public OGRConverter() {
88 88

  
......
91 91
    /**
92 92
     * Converts {@link FeatureDefn} to {@link FeatureType} and sets
93 93
     * default geometry field to created {@link FeatureType}.
94
     * 
94
     *
95 95
     * @param featureDefn
96 96
     *            OGR definition to be converted
97 97
     * @param defaultGeometryField
......
180 180
    /**
181 181
     * Converts {@link FeatureAttributeDescriptor} of {@link FeatureType} to
182 182
     * {@link FieldDefn}
183
     * 
183
     *
184 184
     * @param featureType
185 185
     *            Fields to be converted
186 186
     * @return FieldDefn list OGR fields
......
200 200

  
201 201
    /**
202 202
     * Converts {@link FeatureAttributeDescriptor} to {@link FieldDefn}
203
     * 
203
     *
204 204
     * @param attDescriptor
205 205
     * @return FieldDefn
206 206
     */
......
218 218
    /**
219 219
     * Converts geometry {@link FeatureAttributeDescriptor} of
220 220
     * {@link FeatureType} to {@link GeomFieldDefn}
221
     * 
221
     *
222 222
     * @param featureType
223 223
     *            Geometry fields to be converted
224 224
     * @param convertDefaultGeometryColumn
......
247 247

  
248 248
    /**
249 249
     * Converts {@link FeatureAttributeDescriptor} to {@link GeomFieldDefn}
250
     * 
250
     *
251 251
     * @param attDescriptor
252 252
     *            Attribute to be converted
253 253
     * @return GeomFieldDefn OGR Geometry field
......
276 276
     * Converts {@link Feature} to {@link FeatureProvider}. If
277 277
     * {@link FeatureProvider} is null, it will be instantiated. This method
278 278
     * only takes into account the fields of received {@link FeatureType}.
279
     * 
279
     *
280 280
     * @param featureProvider
281
     * 
281
     *
282 282
     * @param featureType
283 283
     *            Type of feature provider
284 284
     * @param ogrFeature
......
289 289
    public FeatureProvider convert(FeatureProvider featureProvider, FeatureType featureType,
290 290
        Feature ogrFeature) {
291 291

  
292
        int fid = ogrFeature.GetFID();
292 293
        if (featureProvider == null) {
293
            featureProvider = new DefaultFeatureProvider(featureType, ogrFeature.GetFID());
294
            featureProvider = new DefaultFeatureProvider(featureType, fid);
294 295
        } else {
295
            featureProvider.setOID(ogrFeature.GetFID());
296
            featureProvider.setOID(fid);
296 297
        }
297 298

  
298 299
        FeatureDefn defnRef = ogrFeature.GetDefnRef();
......
363 364

  
364 365
    /**
365 366
     * Converts {@link FeatureProvider} to {@link Feature}.
366
     * 
367
     *
367 368
     * @param featureProvider
368 369
     *            Feature provider to be converted
369 370
     * @return Feature OGR Feature with feature provider values.
......
457 458
    /**
458 459
     * Convert gvSIG geometry type to OGR geometry type. See
459 460
     * {@link ogrConstants}.
460
     * 
461
     *
461 462
     * @param type
462 463
     *            A type of {@link TYPES}
463 464
     * @return int Equivalent type of {@link ogrConstants}
......
512 513

  
513 514
    /**
514 515
     * Convert OGR geometry type to gvSIG geometry type. See {@link TYPES}.
515
     * 
516
     *
516 517
     * @param type
517 518
     *            A type of {@link ogrConstants}
518 519
     * @return int Equivalent type of {@link TYPES}
......
552 553

  
553 554
    /**
554 555
     * Convert gvSIG type to OGR type. See {@link ogrConstants}.
555
     * 
556
     *
556 557
     * @param type
557 558
     *            A type of {@link DataTypes}
558 559
     * @return int Equivalent type of {@link ogrConstants}
......
579 580

  
580 581
    /**
581 582
     * Convert OGR type to gvSIG type. See {@link DataTypes}.
582
     * 
583
     *
583 584
     * @param type
584 585
     *            A type of {@link ogrConstants}
585 586
     * @return int Equivalent type of {@link DataTypes}
......
606 607
     * Convert OGR Feature to another OGR Feature. This method take into account
607 608
     * only {@link FeatureDefn} fields to create new feature. This method is
608 609
     * useful when OGR {@link Layer} is copied to new {@link DataSource}.
609
     * 
610
     *
610 611
     * @param layerDefn
611 612
     *            Definition of new feature
612 613
     * @param feature
trunk/org.gvsig.gdal/org.gvsig.gdal.prov/org.gvsig.gdal.prov.ogr/src/main/java/org/gvsig/gdal/prov/ogr/OGRDataStoreParameters.java
35 35
import org.gvsig.tools.dynobject.DelegatedDynObject;
36 36

  
37 37
/**
38
 * 
38
 *
39 39
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
40 40
 *
41 41
 */
......
43 43
    FilesystemStoreParameters {
44 44

  
45 45
    /**
46
     * 
46
     *
47 47
     */
48 48
    public static final String PARAMETERS_DEFINITION_NAME = "OGRDataStoreParameters";
49 49

  
50 50
    /**
51
     * 
51
     *
52 52
     */
53 53
    public static final String FILE_PARAMTER_NAME = "file";
54 54

  
55 55
    /**
56
     * 
56
     *
57 57
     */
58 58
    public static final String LAYER_NAME_PARAMTER_NAME = "layerName";
59 59

  
60 60
    /**
61
     * 
61
     *
62 62
     */
63 63
    public static final String CONNECTION_STRING_PARAMETER_NAME = "connectionString";
64 64

  
65 65
    /**
66
     * 
66
     *
67 67
     */
68 68
    public static final String DEFAULT_GEOMETRY_PARAMETER_NAME = "defaultGeometryField";
69 69

  
70 70
    /**
71
     * 
71
     *
72 72
     */
73 73
    public static final String CRS_PARAMETER_NAME = "crs";
74 74

  
75
    /**
76
     *
77
     */
78
    public static final String IGNORE_SPATIAL_FILTER = "ignoreSpatialFilter";
79

  
80

  
75 81
    protected DelegatedDynObject parameters;
76 82

  
77 83
    /**
78
     * 
84
     *
79 85
     */
80 86
    public OGRDataStoreParameters() {
81 87
        this.parameters =
......
124 130
    }
125 131

  
126 132
    /**
127
     * 
133
     *
128 134
     * @return String
129 135
     */
130 136
    public IProjection getCRS() {
......
164 170
    }
165 171

  
166 172
    /**
167
     * 
173
     *
168 174
     * @param crs
169 175
     */
170 176
    public void setCRS(IProjection crs) {
trunk/org.gvsig.gdal/org.gvsig.gdal.prov/org.gvsig.gdal.prov.ogr/src/main/resources/org/gvsig/gdal/prov/ogr/OGRDataStoreParameters.xml
26 26
					group="Basic">
27 27
					<description>Name of default geometry field</description>
28 28
				</field>
29
        <field name="ignoreSpatialFilter" type="boolean" mandatory="false"
30
          group="Advanced" defaultValue="true">
31
          <description>Ignore spatial filter</description>
32
        </field>
29 33
			</fields>
30 34
		</class>
31 35
	</classes>
32
</definitions>  
36
</definitions>
trunk/org.gvsig.gdal/org.gvsig.gdal.prov/org.gvsig.gdal.prov.gml/src/main/java/org/gvsig/gdal/prov/gml/GMLDataStoreProvider.java
78 78
    private static final Logger LOG = LoggerFactory.getLogger(GMLDataStoreProvider.class);
79 79

  
80 80
    /**
81
     * 
81
     *
82 82
     */
83 83
    public static final String NAME = "GMLDataStoreProvider";
84 84

  
85 85
    /**
86
     * 
86
     *
87 87
     */
88 88
    public static final String DESCRIPTION = "GML provider to open vectorial resources";
89 89

  
......
192 192
            }
193 193

  
194 194
            List<org.gdal.ogr.Feature> ogrFeatures = new ArrayList<org.gdal.ogr.Feature>();
195
            for (int j = 0; j < tmpLayer.GetFeatureCount(); j++) {
196
                ogrFeatures.add(tmpLayer.GetFeature(j));
195
            org.gdal.ogr.Feature feature = tmpLayer.GetNextFeature();
196
            while(feature!=null){
197
                ogrFeatures.add(feature);
197 198
            }
198

  
199 199
            createLayer(newDataSource, tmpLayer.GetName(), srs, ogrGeomType, fields, geomFields,
200 200
                ogrFeatures);
201 201
        }

Also available in: Unified diff