Revision 47656 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.csv/src/main/java/org/gvsig/fmap/dal/store/csv/CSVFeatureWriter.java

View differences:

CSVFeatureWriter.java
11 11
import java.io.OutputStreamWriter;
12 12
import java.io.Writer;
13 13
import java.nio.file.Files;
14
import java.util.HashMap;
14 15
import java.util.Locale;
16
import java.util.Map;
15 17
import org.apache.commons.lang3.ArrayUtils;
16 18
import org.apache.commons.lang3.StringUtils;
17 19
import org.apache.commons.text.StringEscapeUtils;
......
29 31
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
30 32
import org.gvsig.fmap.geom.primitive.Envelope;
31 33
import org.gvsig.tools.ToolsLocator;
34
import org.gvsig.tools.dataTypes.Coercion;
32 35
import org.gvsig.tools.dataTypes.CoercionException;
33
import org.gvsig.tools.dataTypes.Coercion;
34 36
import org.gvsig.tools.dynobject.Tags;
35 37
import org.slf4j.Logger;
36 38
import org.slf4j.LoggerFactory;
......
46 48

  
47 49
  private static final Logger LOGGER = LoggerFactory.getLogger(CSVFeatureWriter.class);
48 50

  
49
  private Envelope envelope = null;
51
  private Map<String,Envelope> envelopes = null;
50 52
  private boolean calculate_envelope = false;
51 53
  private CsvListWriter listWriter = null;
52 54
  private CsvPreference csvpreferences = null;
......
64 66
  private boolean includeMetadataInHeader;
65 67
    private Locale locale;
66 68
    private GeometryManager geometryManager;
67
    private SpatialIndex spatialIndex;
69
    private Map<String,SpatialIndex> spatialIndexes;
68 70

  
69 71
  public void initialize(
70 72
          CSVStoreParameters storeParameters, 
......
80 82
          File file, 
81 83
          FeatureType ftype, 
82 84
          CsvPreference csvpreferences,
83
          SpatialIndex spatialIndex
85
          Map<String,SpatialIndex> spatialIndex
84 86
    ) {
85 87
    this.file = file;
86 88
    this.ftype = ftype;
......
104 106
    this.includeMetadataInHeader = CSVStoreParameters.getIncludeMetadataInHeader(storeParameters);
105 107
    this.locale = CSVStoreParameters.getLocale(storeParameters);
106 108
    this.geometryManager = GeometryLocator.getGeometryManager();
107
    this.spatialIndex = spatialIndex;
109
    this.spatialIndexes = spatialIndex;
108 110
    if( spatialIndex != null ) {
109
        spatialIndex.removeAll();
111
        for (SpatialIndex index : spatialIndex.values()) {
112
            index.removeAll();
113
        }
110 114
    }
111

  
112 115
  }
113 116

  
114 117
  public void beginAppend() {
......
198 201

  
199 202
  public void add(FeatureProvider feature) {
200 203
    if (this.calculate_envelope) {
201
      Geometry geom = feature.getDefaultGeometry();
202
      if (geom != null) {
203
        if (envelope == null) {
204
          try {
205
            envelope = (Envelope) geom.getEnvelope().clone();
206
          } catch (CloneNotSupportedException e) {
207
            LOGGER.warn("Este error no deberia pasar, siempre se puede hacer un clone de un envelope.", e);
208
          }
209
        } else {
210
          envelope.add(geom.getEnvelope());
204
        if (envelopes == null) {
205
            envelopes = new HashMap<>();
211 206
        }
212
      }
207
        for (FeatureAttributeDescriptor featureAttributeDescriptor : ftype) {
208
            if(featureAttributeDescriptor.getType()==DataTypes.GEOMETRY){
209
                String geomName = featureAttributeDescriptor.getName();
210
                Geometry geom = (Geometry) feature.get(geomName);
211
                Envelope env = envelopes.get(geomName);
212
                if (env == null) {
213
                    if (geom == null) {
214
                        envelopes.put(geomName, null);
215
                    } else {
216
                        try {
217
                            envelopes.put(geomName, (Envelope) geom.getEnvelope().clone());
218
                        } catch (CloneNotSupportedException e) {
219
                            LOGGER.warn("Este error no deberia pasar, siempre se puede hacer un clone de un envelope.", e);
220
                        }
221
                    }
222
                } else {
223
                    if (geom != null){
224
                        env.add(geom.getEnvelope());
225
                    }
226
                }
227
            }
228
        }
213 229
    }
214
    if( spatialIndex!=null ) {
215
        Geometry geom = feature.getDefaultGeometry();
216
        this.spatialIndex.insert(geom, feature.getOID());
230

  
231
    if(spatialIndexes == null){
232
        spatialIndexes = new HashMap<>();
217 233
    }
218 234

  
219 235
    for (int i = 0; i < descriptors.length; i++) {
......
222 238
        Object value = feature.get(i);
223 239
        try {
224 240
          if( descriptor.getType()==DataTypes.GEOMETRY ) {
225
              if(value != null){
241
              String geomName = descriptor.getName();
242
              Geometry geom = (Geometry) value;
243
              if(geom != null){
244
                SpatialIndex index = spatialIndexes.get(geomName);
245
                if(index != null){
246
                    index.insert(geom, feature.getOID());
247
                }
226 248
                if( StringUtils.equalsIgnoreCase("WKT", CSVStoreParameters.getGeometryFormat(storeParameters))) {
227
                  values[i] = ((Geometry)value).convertToWKT();
249
                  values[i] = geom.convertToWKT();
228 250
                } else {
229
                  values[i] = ((Geometry)value).convertToHexWKB();
251
                  values[i] = geom.convertToHexWKB();
230 252
                }
231 253
              }
232 254
          } else {
......
292 314
    } catch (Exception ex){
293 315
        LOGGER.warn("Can't delete index file '"+(indexFile == null?"null":indexFile.getAbsolutePath())+"'", ex);
294 316
    }
295
    if( spatialIndex!=null ) {
296
        spatialIndex.flush();
317
    if( spatialIndexes!=null ) {
318
        for (SpatialIndex index : spatialIndexes.values()) {
319
            index.flush();
320
        }
297 321
    }
298 322
  }
299 323

  
300
  public Envelope getEnvelope() {
301
    return this.envelope;
324
  public Map<String,Envelope> getEnvelopes() {
325
    return this.envelopes;
302 326
  }
303 327
}

Also available in: Unified diff