svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.exportto / org.gvsig.exportto.swing / org.gvsig.exportto.swing.prov / org.gvsig.exportto.swing.prov.shape / src / main / java / org / gvsig / export / shape / service / ExportShapeService.java @ 44497
History | View | Annotate | Download (25.4 KB)
1 | 43925 | jjdelcerro | package org.gvsig.export.shape.service; |
---|---|---|---|
2 | |||
3 | import java.io.File; |
||
4 | import java.util.ArrayList; |
||
5 | import java.util.List; |
||
6 | import org.apache.commons.io.FilenameUtils; |
||
7 | 44406 | omartinez | import org.apache.commons.lang3.StringUtils; |
8 | 43925 | jjdelcerro | import org.cresques.cts.ICoordTrans; |
9 | import org.gvsig.export.ExportException; |
||
10 | 44469 | omartinez | import org.gvsig.export.ExportLocator; |
11 | 43925 | jjdelcerro | import org.gvsig.export.spi.AbstractExportService; |
12 | import org.gvsig.export.spi.ExportService; |
||
13 | import org.gvsig.export.spi.ExportServiceFactory; |
||
14 | 44469 | omartinez | import org.gvsig.export.spi.ExportServiceManager; |
15 | 44406 | omartinez | import org.gvsig.expressionevaluator.ExpressionUtils; |
16 | 43925 | jjdelcerro | import org.gvsig.fmap.dal.DALLocator; |
17 | import org.gvsig.fmap.dal.DataManager; |
||
18 | import org.gvsig.fmap.dal.DataServerExplorer; |
||
19 | import org.gvsig.fmap.dal.NewDataStoreParameters; |
||
20 | import org.gvsig.fmap.dal.OpenDataStoreParameters; |
||
21 | import org.gvsig.fmap.dal.exception.DataException; |
||
22 | import org.gvsig.fmap.dal.feature.EditableFeature; |
||
23 | import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor; |
||
24 | import org.gvsig.fmap.dal.feature.EditableFeatureType; |
||
25 | import org.gvsig.fmap.dal.feature.Feature; |
||
26 | import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
||
27 | import org.gvsig.fmap.dal.feature.FeatureSet; |
||
28 | import org.gvsig.fmap.dal.feature.FeatureStore; |
||
29 | import org.gvsig.fmap.dal.feature.FeatureType; |
||
30 | import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters; |
||
31 | import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters; |
||
32 | import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer; |
||
33 | import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters; |
||
34 | import org.gvsig.fmap.geom.DataTypes; |
||
35 | import org.gvsig.fmap.geom.Geometry; |
||
36 | import org.gvsig.fmap.geom.GeometryLocator; |
||
37 | import org.gvsig.fmap.geom.GeometryManager; |
||
38 | import org.gvsig.fmap.geom.aggregate.Aggregate; |
||
39 | import org.gvsig.fmap.geom.exception.CreateGeometryException; |
||
40 | import org.gvsig.fmap.geom.operation.GeometryOperationException; |
||
41 | import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException; |
||
42 | import org.gvsig.fmap.geom.primitive.Curve; |
||
43 | import org.gvsig.fmap.geom.primitive.Line; |
||
44 | import org.gvsig.fmap.geom.primitive.OrientablePrimitive; |
||
45 | import org.gvsig.fmap.geom.primitive.Point; |
||
46 | import org.gvsig.fmap.geom.primitive.Polygon; |
||
47 | import org.gvsig.fmap.geom.primitive.Surface; |
||
48 | import org.gvsig.fmap.geom.type.GeometryType; |
||
49 | import org.gvsig.tools.ToolsLocator; |
||
50 | import org.gvsig.tools.dataTypes.CoercionException; |
||
51 | import org.gvsig.tools.dataTypes.DataTypesManager; |
||
52 | import org.gvsig.tools.dispose.DisposableIterator; |
||
53 | import org.gvsig.tools.dispose.DisposeUtils; |
||
54 | import org.gvsig.tools.util.HasAFile; |
||
55 | |||
56 | /**
|
||
57 | *
|
||
58 | * @author jjdelcerro
|
||
59 | */
|
||
60 | 44270 | omartinez | public class ExportShapeService |
61 | extends AbstractExportService
|
||
62 | implements ExportService {
|
||
63 | 43925 | jjdelcerro | |
64 | public static final int MAX_FIELD_NAME_LENGTH = 10; |
||
65 | 44270 | omartinez | |
66 | private final List<OpenDataStoreParameters> targetOpenStoreParameters; |
||
67 | 44469 | omartinez | |
68 | public File targetFile = null; |
||
69 | 44270 | omartinez | |
70 | 43939 | jjdelcerro | public ExportShapeService(ExportServiceFactory factory, ExportShapeParameters parameters) {
|
71 | 43925 | jjdelcerro | super(factory, parameters);
|
72 | this.targetOpenStoreParameters = new ArrayList<>(); |
||
73 | } |
||
74 | |||
75 | @Override
|
||
76 | public ExportShapeParameters getParameters() {
|
||
77 | 44270 | omartinez | return (ExportShapeParameters) super.getParameters(); |
78 | 43925 | jjdelcerro | } |
79 | |||
80 | @Override
|
||
81 | 44270 | omartinez | protected DataServerExplorer createServerExplorer() throws ExportException { |
82 | |||
83 | 43925 | jjdelcerro | DataManager dataManager = DALLocator.getDataManager(); |
84 | |||
85 | FilesystemServerExplorerParameters explorerParams; |
||
86 | try {
|
||
87 | 44270 | omartinez | explorerParams |
88 | = (FilesystemServerExplorerParameters) dataManager |
||
89 | .createServerExplorerParameters(FilesystemServerExplorer.NAME); |
||
90 | 43925 | jjdelcerro | } catch (Exception e) { |
91 | throw new ExportException(e); |
||
92 | } |
||
93 | 44469 | omartinez | File parametersFile = this.getTargetFile(); |
94 | 44406 | omartinez | explorerParams.setRoot(parametersFile.getParent()); |
95 | 43925 | jjdelcerro | |
96 | FilesystemServerExplorer explorer; |
||
97 | try {
|
||
98 | explorer = (FilesystemServerExplorer) dataManager.openServerExplorer( |
||
99 | "FilesystemExplorer", explorerParams
|
||
100 | ); |
||
101 | return explorer;
|
||
102 | } catch (Exception e) { |
||
103 | throw new ExportException(e); |
||
104 | } |
||
105 | } |
||
106 | |||
107 | @Override
|
||
108 | protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException { |
||
109 | try {
|
||
110 | FilesystemServerExplorer explorer = (FilesystemServerExplorer) this.createServerExplorer();
|
||
111 | 44469 | omartinez | ; |
112 | 43925 | jjdelcerro | NewFeatureStoreParameters newStoreParameters = (NewFeatureStoreParameters) explorer.getAddParameters( |
113 | 44469 | omartinez | this.getTargetFile());
|
114 | 43925 | jjdelcerro | newStoreParameters.setDynValue("Encoding", this.getParameters().getEncoding()); |
115 | newStoreParameters.setDynValue("CRS", this.getParameters().getTargetProjection()); |
||
116 | 44270 | omartinez | FeatureType ft; |
117 | if (this.getParameters().getExportAttributes() != null) { |
||
118 | ft = this.getParameters().getExportAttributes().getTargetFeatureType();
|
||
119 | } else {
|
||
120 | ft = this.getParameters().getSourceFeatureType();
|
||
121 | 43925 | jjdelcerro | } |
122 | 44270 | omartinez | |
123 | 43936 | jjdelcerro | // FIXME: check if ft has one and only one geometry.
|
124 | 43925 | jjdelcerro | newStoreParameters.setDefaultFeatureType(ft.getEditable()); |
125 | return newStoreParameters;
|
||
126 | } catch (DataException ex) {
|
||
127 | throw new ExportException(ex); |
||
128 | } |
||
129 | } |
||
130 | |||
131 | 44469 | omartinez | public File getTargetFile() { |
132 | if (this.targetFile == null) { |
||
133 | this.targetFile = ExpressionUtils.evaluateFilename(this.getParameters().getFile()); |
||
134 | return this.targetFile; |
||
135 | } |
||
136 | return this.targetFile; |
||
137 | } |
||
138 | |||
139 | 43925 | jjdelcerro | @Override
|
140 | public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException { |
||
141 | return this.targetOpenStoreParameters; |
||
142 | } |
||
143 | 44270 | omartinez | |
144 | 43925 | jjdelcerro | @Override
|
145 | public OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException { |
||
146 | try {
|
||
147 | DataManager dataManager = DALLocator.getDataManager(); |
||
148 | 43939 | jjdelcerro | OpenFeatureStoreParameters openStoreParameters = (OpenFeatureStoreParameters) dataManager.createStoreParameters("Shape");
|
149 | 44469 | omartinez | ((HasAFile) openStoreParameters).setFile(this.getTargetFile());
|
150 | 43925 | jjdelcerro | openStoreParameters.setDynValue("Encoding", getParameters().getEncoding());
|
151 | openStoreParameters.setDynValue("CRS", this.getParameters().getTargetProjection()); |
||
152 | return openStoreParameters;
|
||
153 | } catch (DataException ex) {
|
||
154 | throw new ExportException(ex); |
||
155 | } |
||
156 | } |
||
157 | |||
158 | @Override
|
||
159 | public void export(FeatureSet featureSet) throws ExportException { |
||
160 | |||
161 | 44406 | omartinez | File parametersFile = ExpressionUtils.evaluateFilename(this.getParameters().getFile()); |
162 | 43925 | jjdelcerro | String pathName = FilenameUtils.removeExtension(parametersFile.getAbsolutePath());
|
163 | |||
164 | 43936 | jjdelcerro | int geometryType = this.getParameters().getTargetGeometryTypeAsInt(); |
165 | 44270 | omartinez | |
166 | 43925 | jjdelcerro | if (geometryType == Geometry.TYPES.GEOMETRY) {
|
167 | try {
|
||
168 | // SURFACE
|
||
169 | String fullPathName = pathName + "_surface" + ".shp"; |
||
170 | this.getParameters().setFile(new File(fullPathName)); |
||
171 | this.getTaskStatus().setTitle("Exporting surfaces"); |
||
172 | export(featureSet, Geometry.TYPES.SURFACE, true); |
||
173 | |||
174 | // CURVE
|
||
175 | fullPathName = pathName + "_curve" + ".shp"; |
||
176 | this.getParameters().setFile(new File(fullPathName)); |
||
177 | this.getTaskStatus().setTitle("Exporting curves"); |
||
178 | export(featureSet, Geometry.TYPES.CURVE, true); |
||
179 | |||
180 | // POINT
|
||
181 | fullPathName = pathName + "_point" + ".shp"; |
||
182 | this.getParameters().setFile(new File(fullPathName)); |
||
183 | this.getTaskStatus().setTitle("Exporting points"); |
||
184 | export(featureSet, Geometry.TYPES.POINT, true); |
||
185 | |||
186 | } finally {
|
||
187 | this.getParameters().setFile(parametersFile);
|
||
188 | } |
||
189 | 44270 | omartinez | |
190 | 43925 | jjdelcerro | } else {
|
191 | export(featureSet, geometryType, false); |
||
192 | } |
||
193 | 44270 | omartinez | |
194 | 43925 | jjdelcerro | this.getTaskStatus().terminate();
|
195 | this.getTaskStatus().remove();
|
||
196 | |||
197 | } |
||
198 | |||
199 | private void export( |
||
200 | FeatureSet featureSet, |
||
201 | 44270 | omartinez | int geometryType,
|
202 | 43925 | jjdelcerro | boolean checkType
|
203 | 44270 | omartinez | ) throws ExportException { |
204 | |||
205 | 43925 | jjdelcerro | DataServerExplorer explorer = this.createServerExplorer();
|
206 | NewFeatureStoreParameters params = (NewFeatureStoreParameters) this.createTargetNewStoreParameters();
|
||
207 | 44270 | omartinez | |
208 | 43925 | jjdelcerro | String providerName = params.getDataStoreName();
|
209 | String explorerName = explorer.getProviderName();
|
||
210 | boolean there_was_error = false; |
||
211 | |||
212 | DisposableIterator it = null;
|
||
213 | try {
|
||
214 | 44270 | omartinez | // EditableFeatureType type = this.getParameters().getSourceFeatureType().getCopy().getEditable();
|
215 | EditableFeatureType type = params.getDefaultFeatureType(); |
||
216 | 43925 | jjdelcerro | |
217 | 43936 | jjdelcerro | String geomFieldName = this.getParameters().getSourceGeometryFieldName(); |
218 | 44270 | omartinez | |
219 | 43925 | jjdelcerro | FeatureAttributeDescriptor geomFieldDescSource = (FeatureAttributeDescriptor) type.getDefaultGeometryAttribute(); |
220 | 44300 | omartinez | if (geomFieldDescSource != null) { |
221 | 43925 | jjdelcerro | type.remove(geomFieldDescSource.getName()); |
222 | } |
||
223 | EditableFeatureAttributeDescriptor geomFieldDescTarget = type.add( |
||
224 | "GEOMETRY",
|
||
225 | 43968 | jjdelcerro | DataTypes.GEOMETRY |
226 | 43925 | jjdelcerro | ); |
227 | geomFieldDescTarget.setDefaultValue(null);
|
||
228 | 43936 | jjdelcerro | int gsubtype = this.getParameters().getTargetGeometrySubtype(); |
229 | 43925 | jjdelcerro | // El shp solo soporta los subtipos 2D y 3D
|
230 | switch (gsubtype) {
|
||
231 | case Geometry.SUBTYPES.GEOM2D:
|
||
232 | break;
|
||
233 | case Geometry.SUBTYPES.GEOM3D:
|
||
234 | break;
|
||
235 | default:
|
||
236 | // Forzaremos las geometrias a 3D
|
||
237 | gsubtype = Geometry.SUBTYPES.GEOM3D; |
||
238 | break;
|
||
239 | } |
||
240 | GeometryType gty = null;
|
||
241 | try {
|
||
242 | GeometryManager geoManager = GeometryLocator.getGeometryManager(); |
||
243 | gty = geoManager.getGeometryType(geometryType, gsubtype); |
||
244 | } catch (Exception e) { |
||
245 | throw new ExportException(e); |
||
246 | } |
||
247 | |||
248 | geomFieldDescTarget.setGeometryType(gty); |
||
249 | 44406 | omartinez | String newGeometryFieldName;
|
250 | 44469 | omartinez | if (this.getParameters().getExportAttributes().getTargetName("GEOMETRY") == null) { |
251 | 44406 | omartinez | newGeometryFieldName = "GEOMETRY";
|
252 | } else {
|
||
253 | newGeometryFieldName = this.getParameters().getExportAttributes().getTargetName("GEOMETRY"); |
||
254 | } |
||
255 | geomFieldDescTarget.setName(newGeometryFieldName); |
||
256 | 43925 | jjdelcerro | type.setDefaultGeometryAttributeName(geomFieldDescTarget.getName()); |
257 | |||
258 | // ==========================
|
||
259 | 44406 | omartinez | //fixNames(type);
|
260 | 43925 | jjdelcerro | // ==========================
|
261 | params.setDefaultFeatureType(type.getNotEditableCopy()); |
||
262 | |||
263 | params.setDynValue("geometryType", null); |
||
264 | |||
265 | DataManager manager = DALLocator.getDataManager(); |
||
266 | |||
267 | manager.newStore(explorerName, providerName, params, true);
|
||
268 | 44270 | omartinez | |
269 | 43925 | jjdelcerro | FeatureStore target = (FeatureStore) manager.openStore(providerName, params); |
270 | FeatureType targetType = target.getDefaultFeatureType(); |
||
271 | |||
272 | getTaskStatus().setRangeOfValues(0, featureSet.getSize());
|
||
273 | |||
274 | target.edit(FeatureStore.MODE_APPEND); |
||
275 | it = featureSet.fastIterator(); |
||
276 | int featureCount = 0; |
||
277 | |||
278 | // ================================================
|
||
279 | // Reprojection stuff
|
||
280 | Geometry reproj_geom; |
||
281 | 44469 | omartinez | EditableFeature edit_feat = null;
|
282 | ICoordTrans coord_trans = this.getParameters().getTransformationToUse();
|
||
283 | 43925 | jjdelcerro | // ================================================
|
284 | |||
285 | List<Geometry> extracted;
|
||
286 | 44300 | omartinez | Geometry gitem; |
287 | 43925 | jjdelcerro | DataTypesManager.Coercion toGeometry = ToolsLocator.getDataTypesManager() |
288 | .get(DataTypes.GEOMETRY).getCoercion(); |
||
289 | 44270 | omartinez | |
290 | 44469 | omartinez | //Usefull for reproject
|
291 | ExportServiceManager serviceManager = ExportLocator.getServiceManager(); |
||
292 | FeatureType theTargetFeatureType = target.getDefaultFeatureType(); |
||
293 | int targetGeometryIndex = theTargetFeatureType.getDefaultGeometryAttributeIndex();
|
||
294 | //
|
||
295 | 43925 | jjdelcerro | while (it.hasNext()) {
|
296 | |||
297 | Feature feature = (Feature) it.next(); |
||
298 | 44300 | omartinez | if (geomFieldName == null) { |
299 | 43925 | jjdelcerro | edit_feat = target.createNewFeature(true);
|
300 | //
|
||
301 | // Accumulate error in boolean.
|
||
302 | // This also fixes field names (using origNameToDbfName)
|
||
303 | //
|
||
304 | 44300 | omartinez | there_was_error = there_was_error |
305 | | setNonNulls( |
||
306 | 44270 | omartinez | getParameters().getSourceFeatureType(), |
307 | targetType, |
||
308 | feature, |
||
309 | edit_feat |
||
310 | ); |
||
311 | edit_feat.setDefaultGeometry(null);
|
||
312 | 43925 | jjdelcerro | target.insert(edit_feat); |
313 | } else {
|
||
314 | Object x = feature.getGeometry(geomFieldName);
|
||
315 | try {
|
||
316 | gitem = (Geometry) toGeometry.coerce(x); |
||
317 | } catch (CoercionException ex) {
|
||
318 | gitem = null;
|
||
319 | } |
||
320 | 44270 | omartinez | |
321 | 43925 | jjdelcerro | if (checkType) {
|
322 | extracted = getGeometriesFrom(gitem, geometryType); |
||
323 | if (extracted.isEmpty()) {
|
||
324 | // found no geometries of correct type
|
||
325 | continue;
|
||
326 | } else {
|
||
327 | if (geometryType != Geometry.TYPES.POINT) {
|
||
328 | // If not points, merge geometries
|
||
329 | // (curves or surfaces)
|
||
330 | try {
|
||
331 | gitem = union(extracted); |
||
332 | extracted = new ArrayList<>(); |
||
333 | extracted.add(gitem); |
||
334 | } catch (Exception ex) { |
||
335 | there_was_error = true;
|
||
336 | LOG.info("Error in union.", ex);
|
||
337 | } |
||
338 | } else {
|
||
339 | // only in the case of points, we can have several
|
||
340 | // geometries if source is multipoint
|
||
341 | } |
||
342 | } |
||
343 | } else {
|
||
344 | extracted = new ArrayList<>(); |
||
345 | extracted.add(gitem); |
||
346 | } |
||
347 | |||
348 | for (int i = 0; i < extracted.size(); i++) { |
||
349 | gitem = extracted.get(i); |
||
350 | |||
351 | if (gsubtype == Geometry.SUBTYPES.GEOM2D) {
|
||
352 | gitem = force2D(gitem, geometryType); |
||
353 | } else {
|
||
354 | gitem = force3D(gitem, geometryType); |
||
355 | } |
||
356 | edit_feat = target.createNewFeature(true);
|
||
357 | //
|
||
358 | // Accumulate error in boolean.
|
||
359 | // This also fixes field names (using origNameToDbfName)
|
||
360 | //
|
||
361 | 44270 | omartinez | there_was_error = there_was_error |
362 | | setNonNulls( |
||
363 | getParameters().getSourceFeatureType(), |
||
364 | targetType, |
||
365 | feature, |
||
366 | edit_feat |
||
367 | ); |
||
368 | 43925 | jjdelcerro | edit_feat.setDefaultGeometry(gitem); |
369 | // ================================================
|
||
370 | // Reprojection stuff
|
||
371 | 44469 | omartinez | |
372 | 43925 | jjdelcerro | if (coord_trans != null && gitem != null) { |
373 | 44469 | omartinez | Geometry geometry = edit_feat.getDefaultGeometry(); |
374 | ExportServiceManager.FixGeometryStatus check = serviceManager.fixGeometry(getParameters(), coord_trans, geometry); |
||
375 | switch (check.getState()) {
|
||
376 | case ExportServiceManager.FixGeometryStatus.STATE_OK:
|
||
377 | edit_feat.setDefaultGeometry(check.getGeometry()); |
||
378 | break;
|
||
379 | case ExportServiceManager.FixGeometryStatus.STATE_SKIP:
|
||
380 | continue;
|
||
381 | case ExportServiceManager.FixGeometryStatus.STATE_ABORT:
|
||
382 | throw new InvalidGeometryException(edit_feat, check.getMessage()); |
||
383 | } |
||
384 | |||
385 | 43925 | jjdelcerro | } |
386 | 44469 | omartinez | |
387 | 43925 | jjdelcerro | } |
388 | 44469 | omartinez | // ================================================
|
389 | target.insert(edit_feat); |
||
390 | 43925 | jjdelcerro | } |
391 | 44469 | omartinez | |
392 | 43925 | jjdelcerro | featureCount++; |
393 | this.getTaskStatus().setCurValue(featureCount);
|
||
394 | |||
395 | if (this.getTaskStatus().isCancellationRequested()) { |
||
396 | return;
|
||
397 | } |
||
398 | } |
||
399 | target.finishEditing(); |
||
400 | target.dispose(); |
||
401 | 44270 | omartinez | |
402 | 43925 | jjdelcerro | this.targetOpenStoreParameters.add(this.createTargetOpenStoreParameters()); |
403 | 44270 | omartinez | |
404 | 43925 | jjdelcerro | } catch (Exception e) { |
405 | throw new ExportException(e); |
||
406 | } finally {
|
||
407 | DisposeUtils.dispose(it); |
||
408 | } |
||
409 | |||
410 | if (there_was_error) {
|
||
411 | Exception cause = new Exception( |
||
412 | "_Issues_with_attributes_or_geometries");
|
||
413 | throw new ExportException(cause); |
||
414 | } |
||
415 | } |
||
416 | |||
417 | private void fixNames(EditableFeatureType eft) { |
||
418 | |||
419 | FeatureAttributeDescriptor[] atts = eft.getAttributeDescriptors();
|
||
420 | 44406 | omartinez | String defaultGeometryField = eft.getDefaultGeometryAttributeName();
|
421 | 43925 | jjdelcerro | for (FeatureAttributeDescriptor att : atts) {
|
422 | 44270 | omartinez | String new_name = this.getParameters().getExportAttributes().getTargetName(att.getName()); |
423 | 43925 | jjdelcerro | if (new_name != null) { |
424 | 44406 | omartinez | //efad = eft.add(new_name, att.getType(), att.getSize());
|
425 | EditableFeatureAttributeDescriptor efad = eft.getEditableAttributeDescriptor(att.getName()); |
||
426 | efad.setName(new_name); |
||
427 | efad.setType(att.getDataType()); |
||
428 | efad.setSize(att.getSize()); |
||
429 | 43925 | jjdelcerro | efad.setPrecision(att.getPrecision()); |
430 | 44469 | omartinez | |
431 | 43925 | jjdelcerro | if (att.getDataType().getType() == DataTypes.GEOMETRY) {
|
432 | efad.setGeometryType(att.getGeomType()); |
||
433 | 44406 | omartinez | if (StringUtils.equals(defaultGeometryField, att.getName())) {
|
434 | eft.setDefaultGeometryAttributeName(new_name); |
||
435 | } |
||
436 | 43925 | jjdelcerro | } |
437 | } |
||
438 | } |
||
439 | } |
||
440 | 44469 | omartinez | |
441 | 43925 | jjdelcerro | /**
|
442 | * @param gitem
|
||
443 | * @param geometryType2
|
||
444 | * @return
|
||
445 | */
|
||
446 | private Geometry force2D(Geometry ge, int gt) throws CreateGeometryException { |
||
447 | if (ge == null) { |
||
448 | return null; |
||
449 | } |
||
450 | if (ge.getGeometryType().getSubType() == Geometry.SUBTYPES.GEOM2D) {
|
||
451 | return ge;
|
||
452 | } else {
|
||
453 | GeometryManager geoManager = GeometryLocator.getGeometryManager(); |
||
454 | switch (gt) {
|
||
455 | case Geometry.TYPES.POINT:
|
||
456 | Point p = (Point) ge; |
||
457 | Point point = geoManager.createPoint(
|
||
458 | p.getX(), p.getY(), |
||
459 | Geometry.SUBTYPES.GEOM2D); |
||
460 | return point;
|
||
461 | case Geometry.TYPES.CURVE:
|
||
462 | return geoManager.createCurve(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
|
||
463 | case Geometry.TYPES.SURFACE:
|
||
464 | return geoManager.createSurface(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
|
||
465 | default:
|
||
466 | return ge;
|
||
467 | } |
||
468 | } |
||
469 | } |
||
470 | |||
471 | /**
|
||
472 | * @param gitem
|
||
473 | * @param geometryType2
|
||
474 | * @return
|
||
475 | */
|
||
476 | private Geometry force3D(Geometry ge, int gt) throws CreateGeometryException { |
||
477 | if (ge == null) { |
||
478 | return null; |
||
479 | } |
||
480 | // Los try catch que hay abajo, son para asegurarse de que la geometr?a original
|
||
481 | // tiene las 3 dimensiones necesarias. A veces nos llegan geometr?as que aunque son de subtipo GEOM3D
|
||
482 | // los puntos del generalPath que contienen no son 3D y no tienen la coordenada Z
|
||
483 | GeometryManager geoManager = GeometryLocator.getGeometryManager(); |
||
484 | Point point;
|
||
485 | switch (gt) {
|
||
486 | case Geometry.TYPES.POINT:
|
||
487 | Point p = (Point) ge; |
||
488 | point = geoManager.createPoint( |
||
489 | p.getX(), p.getY(), |
||
490 | Geometry.SUBTYPES.GEOM3D); |
||
491 | try {
|
||
492 | point.setCoordinateAt(2, p.getCoordinateAt(2)); |
||
493 | } catch (Exception e) { |
||
494 | point.setCoordinateAt(2, 0); |
||
495 | } |
||
496 | return point;
|
||
497 | case Geometry.TYPES.CURVE:
|
||
498 | case Geometry.TYPES.LINE:
|
||
499 | Line line = geoManager.createLine(Geometry.SUBTYPES.GEOM3D);
|
||
500 | for (int i = 0; i < ((OrientablePrimitive) ge).getNumVertices(); i++) { |
||
501 | Point vertex = ((OrientablePrimitive) ge).getVertex(i);
|
||
502 | point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D); |
||
503 | try {
|
||
504 | point.setCoordinateAt(2, vertex.getCoordinateAt(2)); |
||
505 | } catch (Exception e) { |
||
506 | point.setCoordinateAt(2, 0); |
||
507 | } |
||
508 | line.addVertex(point); |
||
509 | } |
||
510 | ; |
||
511 | return line;
|
||
512 | |||
513 | case Geometry.TYPES.SURFACE:
|
||
514 | case Geometry.TYPES.POLYGON:
|
||
515 | Polygon polygon = geoManager.createPolygon(Geometry.SUBTYPES.GEOM3D);
|
||
516 | for (int i = 0; i < ((OrientablePrimitive) ge).getNumVertices(); i++) { |
||
517 | Point vertex = ((OrientablePrimitive) ge).getVertex(i);
|
||
518 | point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D); |
||
519 | try {
|
||
520 | point.setCoordinateAt(2, vertex.getCoordinateAt(2)); |
||
521 | } catch (Exception e) { |
||
522 | point.setCoordinateAt(2, 0); |
||
523 | } |
||
524 | polygon.addVertex(point); |
||
525 | } |
||
526 | ; |
||
527 | return polygon;
|
||
528 | default:
|
||
529 | return ge;
|
||
530 | } |
||
531 | } |
||
532 | |||
533 | /**
|
||
534 | * @param feature
|
||
535 | * @param edit_feat
|
||
536 | */
|
||
537 | private boolean setNonNulls( |
||
538 | 44270 | omartinez | FeatureType src_ft, |
539 | 43925 | jjdelcerro | FeatureType target_ft, |
540 | 44270 | omartinez | Feature feat, |
541 | 43925 | jjdelcerro | EditableFeature edit_f |
542 | 44270 | omartinez | ) { |
543 | 43925 | jjdelcerro | |
544 | boolean error = false; |
||
545 | FeatureAttributeDescriptor[] atts = src_ft.getAttributeDescriptors();
|
||
546 | String orig_name;
|
||
547 | String dbf_name;
|
||
548 | for (FeatureAttributeDescriptor att : atts) {
|
||
549 | if (att.getType() != org.gvsig.fmap.geom.DataTypes.GEOMETRY) {
|
||
550 | Object val;
|
||
551 | try {
|
||
552 | orig_name = att.getName(); |
||
553 | 44270 | omartinez | dbf_name = this.getParameters().getExportAttributes().getTargetName(orig_name);
|
554 | 43925 | jjdelcerro | if (dbf_name == null) { |
555 | dbf_name = orig_name; |
||
556 | } |
||
557 | val = feat.get(orig_name); |
||
558 | 44300 | omartinez | if (val != null && target_ft.getAttributeDescriptor(dbf_name) != null) { |
559 | 43925 | jjdelcerro | edit_f.set(dbf_name, val); |
560 | } |
||
561 | 44300 | omartinez | } catch (Exception ex) { |
562 | 43925 | jjdelcerro | LOG.info("Error while getting/setting value", ex);
|
563 | error = true;
|
||
564 | } |
||
565 | } |
||
566 | } |
||
567 | return error;
|
||
568 | } |
||
569 | |||
570 | private Geometry union(List<Geometry> geoms) |
||
571 | throws GeometryOperationNotSupportedException, GeometryOperationException {
|
||
572 | |||
573 | 44300 | omartinez | if (geoms == null || geoms.isEmpty()) { |
574 | 43925 | jjdelcerro | return null; |
575 | } |
||
576 | |||
577 | if (geoms.size() == 1) { |
||
578 | return geoms.get(0); |
||
579 | } |
||
580 | |||
581 | Geometry resp = geoms.get(0);
|
||
582 | for (int i = 1; i < geoms.size(); i++) { |
||
583 | resp = resp.union(geoms.get(i)); |
||
584 | } |
||
585 | return resp;
|
||
586 | } |
||
587 | |||
588 | /**
|
||
589 | * @param feat_geom_type
|
||
590 | * @param type must be POINT, LINE or POLYGON (Geometry.TYPES)
|
||
591 | * @return
|
||
592 | */
|
||
593 | private List<Geometry> getGeometriesFrom(Geometry in_geom, int type) { |
||
594 | |||
595 | List<Geometry> resp = new ArrayList<>(); |
||
596 | Aggregate agg; |
||
597 | |||
598 | /*
|
||
599 | * If input geometry is aggregate, search its
|
||
600 | * primitives
|
||
601 | */
|
||
602 | if (in_geom instanceof Aggregate) { |
||
603 | agg = (Aggregate) in_geom; |
||
604 | Geometry item; |
||
605 | List<Geometry> add_parts;
|
||
606 | for (int i = 0; i < agg.getPrimitivesNumber(); i++) { |
||
607 | item = agg.getPrimitiveAt(i); |
||
608 | add_parts = getGeometriesFrom(item, type); |
||
609 | resp.addAll(add_parts); |
||
610 | } |
||
611 | return resp;
|
||
612 | } |
||
613 | |||
614 | // ============================================
|
||
615 | switch (type) {
|
||
616 | case Geometry.TYPES.POINT:
|
||
617 | if (in_geom instanceof Point) { |
||
618 | resp.add(in_geom); |
||
619 | } |
||
620 | // =======================================================
|
||
621 | break;
|
||
622 | case Geometry.TYPES.CURVE:
|
||
623 | if (in_geom instanceof Curve) { |
||
624 | resp.add(in_geom); |
||
625 | } |
||
626 | // =======================================================
|
||
627 | break;
|
||
628 | case Geometry.TYPES.SURFACE:
|
||
629 | if (in_geom instanceof Surface) { |
||
630 | resp.add(in_geom); |
||
631 | } |
||
632 | // =======================================================
|
||
633 | break;
|
||
634 | } |
||
635 | return resp;
|
||
636 | } |
||
637 | 44270 | omartinez | |
638 | 43925 | jjdelcerro | } |