gvsig-geoprocess / org.gvsig.sextante / trunk / org.gvsig.sextante.app / org.gvsig.sextante.app.extension / src / main / java / org / gvsig / sextante / app / extension / core / gvVectorLayer.java @ 35
History | View | Annotate | Download (13 KB)
1 | 20 | nbrodin | package org.gvsig.sextante.app.extension.core; |
---|---|---|---|
2 | |||
3 | import java.awt.geom.Rectangle2D; |
||
4 | import java.io.File; |
||
5 | import java.sql.Types; |
||
6 | import java.util.Iterator; |
||
7 | |||
8 | import org.cresques.cts.IProjection; |
||
9 | import org.gvsig.fmap.dal.DALLocator; |
||
10 | import org.gvsig.fmap.dal.DataManager; |
||
11 | import org.gvsig.fmap.dal.DataStoreParameters; |
||
12 | import org.gvsig.fmap.dal.DataTypes; |
||
13 | 35 | nbrodin | import org.gvsig.fmap.dal.NewDataStoreParameters; |
14 | 20 | nbrodin | import org.gvsig.fmap.dal.exception.DataException; |
15 | import org.gvsig.fmap.dal.exception.ReadException; |
||
16 | import org.gvsig.fmap.dal.feature.EditableFeature; |
||
17 | import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor; |
||
18 | import org.gvsig.fmap.dal.feature.EditableFeatureType; |
||
19 | import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
||
20 | import org.gvsig.fmap.dal.feature.FeatureStore; |
||
21 | import org.gvsig.fmap.dal.feature.FeatureType; |
||
22 | import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters; |
||
23 | import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer; |
||
24 | import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters; |
||
25 | import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters; |
||
26 | 30 | nbrodin | import org.gvsig.fmap.geom.GeometryLocator; |
27 | import org.gvsig.fmap.geom.GeometryManager; |
||
28 | import org.gvsig.fmap.geom.operation.GeometryOperationContext; |
||
29 | import org.gvsig.fmap.geom.operation.GeometryOperationException; |
||
30 | import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException; |
||
31 | import org.gvsig.fmap.geom.operation.fromjts.FromJTS; |
||
32 | 20 | nbrodin | import org.gvsig.fmap.geom.primitive.Envelope; |
33 | import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; |
||
34 | |||
35 | import com.vividsolutions.jts.geom.Geometry; |
||
36 | |||
37 | 30 | nbrodin | import es.unex.sextante.core.Sextante; |
38 | 20 | nbrodin | import es.unex.sextante.dataObjects.AbstractVectorLayer; |
39 | import es.unex.sextante.dataObjects.IFeatureIterator; |
||
40 | import es.unex.sextante.dataObjects.IVectorLayer; |
||
41 | |||
42 | public class gvVectorLayer extends AbstractVectorLayer { |
||
43 | |||
44 | 30 | nbrodin | private final int PRECISION = 5; |
45 | private FeatureStore featureStore = null; |
||
46 | private int m_iGeometry; |
||
47 | 31 | nbrodin | private Object inputParameters = null; |
48 | private String s_Name = null; |
||
49 | 30 | nbrodin | private IProjection m_Projection = null; |
50 | private FeatureType featureType = null; |
||
51 | private GeometryManager geometryManager = null; |
||
52 | 20 | nbrodin | |
53 | 30 | nbrodin | public gvVectorLayer() {
|
54 | geometryManager = GeometryLocator.getGeometryManager(); |
||
55 | } |
||
56 | |||
57 | 31 | nbrodin | @SuppressWarnings("unchecked") |
58 | public void create(String sName, Object inputParams, int iShapeType, |
||
59 | Class[] types, String[] sFields, Object crs, int[] fieldSize) { |
||
60 | try {
|
||
61 | inputParameters = inputParams; |
||
62 | s_Name = sName; |
||
63 | m_iGeometry = 0;
|
||
64 | m_Projection = (IProjection) crs; |
||
65 | |||
66 | 32 | nbrodin | if(inputParams instanceof OutputParameters) { |
67 | OutputParameters outputParam = (OutputParameters)inputParams; |
||
68 | 35 | nbrodin | NewFeatureStoreParameters newParams = outputParam.getDataParameters(); |
69 | 32 | nbrodin | featureType = newParams.getDefaultFeatureType(); |
70 | loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize); |
||
71 | newParams.setDynValue("srs", m_Projection);
|
||
72 | outputParam.getExplorer().add(newParams, true);
|
||
73 | 35 | nbrodin | |
74 | 32 | nbrodin | DataManager manager = DALLocator.getDataManager(); |
75 | featureStore = (FeatureStore) manager.createStore(newParams); |
||
76 | featureStore.edit(FeatureStore.MODE_APPEND); |
||
77 | } |
||
78 | |||
79 | 31 | nbrodin | if(inputParams instanceof FilesystemStoreParameters) { |
80 | //TODO: Terminar para todo tipo fuentes de datos. No se puede hacer ahora pq falta poder obtener un FeatureType del parameter.
|
||
81 | //Esto es as? pq el store registra parameters para cargar ficheros y no para escribirlos.
|
||
82 | String path = ((FilesystemStoreParameters)inputParams).getFile().getAbsolutePath();
|
||
83 | create(sName, path, iShapeType, types, sFields, crs, fieldSize); |
||
84 | } |
||
85 | |||
86 | /*NewFeatureStoreParameters param = (NewFeatureStoreParameters)inputParams;
|
||
87 | featureType = param.getDefaultFeatureType();
|
||
88 | loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
|
||
89 | |||
90 | param.setDefaultFeatureType(featureType);
|
||
91 | |||
92 | DataManager manager = DALLocator.getDataManager();
|
||
93 | featureStore = (FeatureStore) manager.createStore(param);
|
||
94 | featureStore.edit(FeatureStore.MODE_APPEND);*/
|
||
95 | |||
96 | } catch (Exception e) { |
||
97 | Sextante.addErrorToLog(e); |
||
98 | } |
||
99 | } |
||
100 | |||
101 | @SuppressWarnings("unchecked") |
||
102 | 20 | nbrodin | public void create(String sName, String sFilename, int iShapeType, |
103 | 28 | nbrodin | Class[] types, String[] sFields, Object crs, int[] fieldSize) { |
104 | 20 | nbrodin | try {
|
105 | 31 | nbrodin | inputParameters = sFilename; |
106 | s_Name = sName; |
||
107 | 20 | nbrodin | m_iGeometry = 0;
|
108 | m_Projection = (IProjection) crs; |
||
109 | |||
110 | 27 | nbrodin | DataManager datamanager = DALLocator.getDataManager(); |
111 | FilesystemServerExplorerParameters explorerParams = (FilesystemServerExplorerParameters) datamanager.createServerExplorerParameters(FilesystemServerExplorer.NAME); |
||
112 | 20 | nbrodin | explorerParams.setRoot(new File(sFilename).getParent()); |
113 | 27 | nbrodin | FilesystemServerExplorer explorer = (FilesystemServerExplorer) datamanager.createServerExplorer(explorerParams); |
114 | 20 | nbrodin | NewFeatureStoreParameters newParams = (NewFeatureStoreParameters) explorer.getAddParameters(new File(sFilename)); |
115 | |||
116 | featureType = newParams.getDefaultFeatureType(); |
||
117 | 28 | nbrodin | loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize); |
118 | 20 | nbrodin | |
119 | newParams.setDefaultFeatureType(featureType); |
||
120 | newParams.setDynValue("srs", m_Projection);
|
||
121 | |||
122 | explorer.add(newParams, true);
|
||
123 | DataManager manager = DALLocator.getDataManager(); |
||
124 | featureStore = (FeatureStore) manager.createStore(newParams); |
||
125 | featureStore.edit(FeatureStore.MODE_APPEND); |
||
126 | |||
127 | } catch (Exception e) { |
||
128 | 31 | nbrodin | Sextante.addErrorToLog(e); |
129 | 20 | nbrodin | } |
130 | } |
||
131 | 25 | nbrodin | |
132 | /**
|
||
133 | * Gets the feature store
|
||
134 | * @return FeatureStore
|
||
135 | */
|
||
136 | public FeatureStore getFeatureStore() {
|
||
137 | return featureStore;
|
||
138 | } |
||
139 | 20 | nbrodin | |
140 | 31 | nbrodin | @SuppressWarnings("unchecked") |
141 | 20 | nbrodin | private void loadFeatureType(String[] fields, Class[] types, |
142 | 28 | nbrodin | int shapeType, Object crs, FeatureType featureType, int[] fieldSize) { |
143 | int[] iTypes = DataTools.getgvSIGTypes(types); |
||
144 | 20 | nbrodin | |
145 | for (int i = 0; i < fields.length; i++) { |
||
146 | EditableFeatureAttributeDescriptor efad = ((EditableFeatureType)featureType).add(fields[i], iTypes[i]); |
||
147 | 28 | nbrodin | efad.setSize(fieldSize[i]); |
148 | 20 | nbrodin | efad.setPrecision(PRECISION); |
149 | } |
||
150 | ((EditableFeatureType)featureType).add("GEOMETRY", DataTypes.GEOMETRY).setGeometryType(
|
||
151 | getgvSIGShapeType(shapeType)).setGeometrySubType( |
||
152 | org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D); |
||
153 | } |
||
154 | |||
155 | public void create(Object obj) { |
||
156 | if (obj instanceof FLyrVect){ |
||
157 | m_BaseDataObject = obj; |
||
158 | FLyrVect layer = (FLyrVect) m_BaseDataObject; |
||
159 | try{
|
||
160 | featureStore = layer.getFeatureStore(); |
||
161 | featureType=featureStore.getDefaultFeatureType(); |
||
162 | m_Projection = layer.getProjection(); |
||
163 | } |
||
164 | catch(Exception e){ |
||
165 | e.printStackTrace(); |
||
166 | } |
||
167 | } |
||
168 | } |
||
169 | |||
170 | public void open() { |
||
171 | } |
||
172 | |||
173 | public void close() { |
||
174 | } |
||
175 | |||
176 | /**
|
||
177 | * Returns the length of field
|
||
178 | * @param dataType
|
||
179 | * @return length of field
|
||
180 | */
|
||
181 | public int getDataTypeLength(int dataType) { |
||
182 | switch (dataType) {
|
||
183 | case Types.NUMERIC: |
||
184 | case Types.DOUBLE: |
||
185 | case Types.REAL: |
||
186 | case Types.FLOAT: |
||
187 | case Types.BIGINT: |
||
188 | case Types.INTEGER: |
||
189 | case Types.DECIMAL: |
||
190 | return 20; |
||
191 | case Types.CHAR: |
||
192 | case Types.VARCHAR: |
||
193 | case Types.LONGVARCHAR: |
||
194 | return 254; |
||
195 | case Types.DATE: |
||
196 | return 8; |
||
197 | case Types.BOOLEAN: |
||
198 | case Types.BIT: |
||
199 | return 1; |
||
200 | } |
||
201 | return 0; |
||
202 | } |
||
203 | |||
204 | 31 | nbrodin | @SuppressWarnings("unchecked") |
205 | 20 | nbrodin | public void addFeature(Geometry geom, Object[] values) { |
206 | try {
|
||
207 | 30 | nbrodin | org.gvsig.fmap.geom.Geometry iGeo = null;
|
208 | |||
209 | GeometryOperationContext ctx = new GeometryOperationContext();
|
||
210 | ctx.setAttribute(FromJTS.PARAM, geom); |
||
211 | try {
|
||
212 | iGeo = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx); |
||
213 | } catch (GeometryOperationNotSupportedException e) {
|
||
214 | Sextante.addErrorToLog(e); |
||
215 | return;
|
||
216 | } catch (GeometryOperationException e) {
|
||
217 | Sextante.addErrorToLog(e); |
||
218 | return;
|
||
219 | } |
||
220 | 20 | nbrodin | |
221 | m_iGeometry++; |
||
222 | |||
223 | EditableFeature ef = featureStore.createNewFeature(); |
||
224 | Iterator<FeatureAttributeDescriptor> features = featureType.iterator();
|
||
225 | |||
226 | int i = 0; |
||
227 | while (features.hasNext()) {
|
||
228 | FeatureAttributeDescriptor featureAttributeDescriptor = features.next(); |
||
229 | if (!featureAttributeDescriptor.getName().equals(featureType.getDefaultGeometryAttributeName())) {
|
||
230 | ef.set(featureAttributeDescriptor.getName().substring(0, Math.min(11, featureAttributeDescriptor.getName().length())), values[i]); |
||
231 | i++; |
||
232 | } |
||
233 | } |
||
234 | ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo); |
||
235 | featureStore.insert(ef); |
||
236 | } catch (Exception e) { |
||
237 | e.printStackTrace(); |
||
238 | } |
||
239 | } |
||
240 | |||
241 | public IFeatureIterator iterator() {
|
||
242 | if (m_BaseDataObject instanceof FLyrVect) { |
||
243 | FLyrVect layer = (FLyrVect) m_BaseDataObject; |
||
244 | gvFeatureIterator iter; |
||
245 | try {
|
||
246 | iter = new gvFeatureIterator(layer);
|
||
247 | } catch (DataException e) {
|
||
248 | throw new RuntimeException(e); |
||
249 | } |
||
250 | return iter;
|
||
251 | } else {
|
||
252 | return null; |
||
253 | } |
||
254 | } |
||
255 | |||
256 | public String getFieldName(int i) { |
||
257 | if (featureStore != null) { |
||
258 | return ((FeatureAttributeDescriptor)featureType.get(i)).getName();
|
||
259 | } |
||
260 | return null; |
||
261 | } |
||
262 | |||
263 | 31 | nbrodin | @SuppressWarnings("unchecked") |
264 | 20 | nbrodin | public Class getFieldType(int i) { |
265 | if (featureStore != null) { |
||
266 | return DataTools.getTypeClass(((FeatureAttributeDescriptor)featureType.get(i)).getDataType());
|
||
267 | } |
||
268 | return null; |
||
269 | } |
||
270 | |||
271 | |||
272 | public int getFieldCount() { |
||
273 | if (featureStore != null) { |
||
274 | return featureType.size();
|
||
275 | } |
||
276 | return 0; |
||
277 | } |
||
278 | |||
279 | public int getShapesCount() { |
||
280 | if (featureStore != null) { |
||
281 | try {
|
||
282 | return (int)featureStore.getFeatureSet().getSize(); |
||
283 | } catch (DataException e) {
|
||
284 | e.printStackTrace(); |
||
285 | return 0; |
||
286 | } |
||
287 | } |
||
288 | return 0; |
||
289 | } |
||
290 | |||
291 | public int getShapeType() { |
||
292 | if (featureStore != null) { |
||
293 | return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor)featureType.get(featureType.getDefaultGeometryAttributeIndex())).getGeometryType());
|
||
294 | } |
||
295 | return 0; |
||
296 | } |
||
297 | |||
298 | private int getShapeTypeFromGvSIGShapeType(int shapeType) { |
||
299 | switch (shapeType){
|
||
300 | case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
|
||
301 | return IVectorLayer.SHAPE_TYPE_POLYGON;
|
||
302 | case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
|
||
303 | 27 | nbrodin | case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
|
304 | 20 | nbrodin | return IVectorLayer.SHAPE_TYPE_LINE;
|
305 | case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
|
||
306 | 27 | nbrodin | case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
|
307 | 20 | nbrodin | return IVectorLayer.SHAPE_TYPE_POINT;
|
308 | default:
|
||
309 | return IVectorLayer.SHAPE_TYPE_POLYGON;
|
||
310 | } |
||
311 | } |
||
312 | |||
313 | private int getgvSIGShapeType(int shapeType) { |
||
314 | switch (shapeType) {
|
||
315 | case IVectorLayer.SHAPE_TYPE_POLYGON :
|
||
316 | return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
|
||
317 | case IVectorLayer.SHAPE_TYPE_LINE:
|
||
318 | return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
|
||
319 | case IVectorLayer.SHAPE_TYPE_POINT:
|
||
320 | return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
|
||
321 | default:
|
||
322 | return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
|
||
323 | } |
||
324 | } |
||
325 | |||
326 | public String getName() { |
||
327 | if (m_BaseDataObject instanceof FLyrVect) { |
||
328 | FLyrVect layer = (FLyrVect) m_BaseDataObject; |
||
329 | return layer.getName();
|
||
330 | } else {
|
||
331 | 31 | nbrodin | if(inputParameters instanceof String) |
332 | return (String)inputParameters; |
||
333 | else {
|
||
334 | if(inputParameters instanceof FilesystemStoreParameters) |
||
335 | return ((FilesystemStoreParameters)inputParameters).getFile().getName();
|
||
336 | else
|
||
337 | return inputParameters.toString();
|
||
338 | } |
||
339 | 20 | nbrodin | } |
340 | } |
||
341 | |||
342 | public void postProcess() { |
||
343 | if (featureStore == null) { |
||
344 | return;
|
||
345 | } |
||
346 | try {
|
||
347 | featureStore.finishEditing(); |
||
348 | } catch (DataException e) {
|
||
349 | 28 | nbrodin | //No puede finalizar la edici?n. Es posible que se haya cerrado previamente.
|
350 | 20 | nbrodin | } |
351 | 31 | nbrodin | FLyrVect vectorLayer = null;
|
352 | if(inputParameters instanceof String) |
||
353 | vectorLayer = (FLyrVect) FileTools.openLayer((String)inputParameters, s_Name, m_Projection);
|
||
354 | 35 | nbrodin | if(inputParameters instanceof OutputParameters) |
355 | vectorLayer = (FLyrVect) FileTools.openLayer(((OutputParameters)inputParameters).getDataParameters(), s_Name, m_Projection); |
||
356 | 20 | nbrodin | create(vectorLayer); |
357 | } |
||
358 | |||
359 | public Rectangle2D getFullExtent() { |
||
360 | if (m_BaseDataObject instanceof FLyrVect) { |
||
361 | FLyrVect layer = (FLyrVect) m_BaseDataObject; |
||
362 | Envelope env=null;
|
||
363 | try {
|
||
364 | env = layer.getFullEnvelope(); |
||
365 | } catch (ReadException e) {
|
||
366 | e.printStackTrace(); |
||
367 | } |
||
368 | return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env.getLength(0), env.getLength(1)); |
||
369 | } |
||
370 | return null; |
||
371 | } |
||
372 | |||
373 | public String getFilename() { |
||
374 | if (m_BaseDataObject instanceof FLyrVect) { |
||
375 | FLyrVect layer = (FLyrVect) m_BaseDataObject; |
||
376 | FeatureStore fs=null;
|
||
377 | fs = (layer).getFeatureStore(); |
||
378 | |||
379 | DataStoreParameters dsp = fs.getParameters(); |
||
380 | if (dsp instanceof FilesystemStoreParameters) { |
||
381 | return ((FilesystemStoreParameters)dsp).getFile().getAbsolutePath();
|
||
382 | } else {
|
||
383 | return null; |
||
384 | } |
||
385 | } else {
|
||
386 | 31 | nbrodin | if(inputParameters instanceof FilesystemStoreParameters) |
387 | return ((FilesystemStoreParameters)inputParameters).getFile().getName();
|
||
388 | else
|
||
389 | return inputParameters.toString();
|
||
390 | 20 | nbrodin | } |
391 | |||
392 | } |
||
393 | |||
394 | public Object getCRS() { |
||
395 | return m_Projection;
|
||
396 | } |
||
397 | |||
398 | public void setName(String name) { |
||
399 | 31 | nbrodin | inputParameters = name; |
400 | 20 | nbrodin | } |
401 | |||
402 | } |