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