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 | ||
---|---|---|
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