Statistics
| Revision:

root / tmp / trunk / servidor / WorkSpace_Servidor / Callejero / src / es / logex / callejero / core / GMLProducer.java @ 26470

History | View | Annotate | Download (6.41 KB)

1
/**
2
 * 
3
 */
4
package es.logex.callejero.core;
5

    
6
import java.io.File;
7

    
8
import java.util.List;
9

    
10
import org.apache.commons.logging.Log;
11
import org.apache.commons.logging.LogFactory;
12
import org.gvsig.gpe.GPEContentHandler;
13
import org.gvsig.gpe.GPEDefaults;
14
import org.gvsig.gpe.GPEErrorHandler;
15
import org.gvsig.gpe.GPEParser;
16
import org.gvsig.gpe.GPERegister;
17
import org.gvsig.gpe.writers.GPEWriterHandler;
18
import org.gvsig.gpe.gml.writer.GPEGmlWriterHandlerImplementor;
19
//import org.gvsig.gpe.writers.IGPEWriterHandler;
20

    
21
import es.logex.callejero.modelo.*;
22
import es.logex.callejero.exceptions.*;
23
import es.logex.utils.*;
24

    
25
import org.gvsig.gpe.*;
26
import org.postgis.PGgeometry;
27
import org.postgis.Geometry;
28
import org.postgis.LinearRing;
29
import org.postgis.LineString;
30
import org.postgis.MultiLineString;
31
import org.postgis.MultiPoint;
32
import org.postgis.MultiPolygon;
33
import org.postgis.Polygon;
34
import org.postgis.Point;
35

    
36
import com.vividsolutions.jts.geom.*;
37
import com.vividsolutions.jts.io.*;
38
import org.w3c.dom.Document;
39
import org.tigris.frogs.commons.*;
40

    
41

    
42

    
43
/**
44
 * @author kike
45
 *
46
 */
47
public class GMLProducer implements IGMLProducer{
48

    
49
        /*private String filename = "FILETEMP";
50
        private GPEWriterHandler writerHandler = null;
51
        private GPEContentHandler contenHandler = null;
52
        private GPEErrorHandler errorHandler = null;
53
        private GPEParser parser = null;
54
        private File outputFile = null;*/
55
        
56
        private String outputFileName = "";
57
        private String schema = "";
58
        private GPEWriterHandler writer = null;
59
        private String writerName = "GML writer";
60
        private GPEErrorHandler errorHandler;
61
        
62
        Log log = LogFactory.getLog(this.getClass()); 
63
        
64
        public GMLProducer(){
65
                log.debug("Constructor donde se rellenan los valores del writer");
66
                
67
                GPEDefaults.setProperty(GPEDefaults.DEFAULT_FILE_NAME, outputFileName);
68
                GPEDefaults.setProperty(GPEDefaults.XSD_SCHEMA_FILE, schema);
69
                //GPEDefaults.setProperty(GPEDefaults.COORDINATES_SEPARATOR, GPEDefaults.DEFAULT_BLANC_SPACE);
70
                //GPEDefaults.setProperty(GPEDefaults.DECIMAL, )
71
                
72
                try{
73
                        //Register the writer
74
                        GPERegister.addGpeWriterHandler(writerName,"Writer de GML hasta la versi�n 2.1",
75
                                        org.gvsig.gpe.gml.writer.GPEGmlWriterHandlerImplementor.class);
76
                                
77
                        //Gets the writer
78
                        writer = GPERegister.createWriter(writerName);        
79
                        errorHandler = new CallejeroGPEErrorHandler();
80
                        writer.setErrorHandler(errorHandler);
81
                        
82
                        log.debug("Ok. El writer está creado");
83
                        
84
                } catch (Exception e){
85
                        log.error("Error inicializando el writer");
86
                        log.error(e.getMessage());
87
                }
88
        }
89
        
90
        /**
91
         * Genera un archivo gml con tantos featuresMembers como features de la capa .
92
         */
93
        public  String toGml(ILayer layer) {
94
        
95
                //si no tenemos esquema, que ponga el nombre de la capa.xsd
96
                if (schema=="") {
97
                        GPEDefaults.setProperty(GPEDefaults.XSD_SCHEMA_FILE, layer.getName() + ".xsd");
98
                }
99
                if (outputFileName == "") {
100
                        GPEDefaults.setProperty(GPEDefaults.DEFAULT_FILE_NAME, layer.getName());
101
                }
102
        
103
                writer.initialize();
104
                log.debug("Writer inicializado");
105
                
106
                writer.startLayer("1", layer.getName(), layer.getDescription(), layer.getExtent().getCrsBoundingBox(),null);
107
                log.debug("Capa inicializada");
108
                
109
                BoundingBox box = layer.getExtent();
110
                double xb[] = {box.getLowersBoundingBox()[0],box.getUppersBoundingBox()[0]} ;
111
                double yb[] = {box.getLowersBoundingBox()[1],box.getUppersBoundingBox()[1]} ;
112
                double[] emptyZ = new double[2];
113
                
114
                writer.startBbox("box" ,xb, yb, emptyZ, box.getCrsBoundingBox());
115
                writer.endBbox();
116
                log.debug("BoundedBy escrito");
117
                
118
                int i = 0;
119
                for (Feature f : layer.getListFeature()) {
120
                        i += 1;
121
                        writer.startFeature("f" + i, f.getName(),null);
122
                        log.debug("Start feature");
123
                        //todos sus atributos
124
                        for (DataElement de : f.getData()) {
125
                                writer.startElement(de.getName(), (Object)de.getValue(), null); 
126
                                writer.endElement();
127
                                //TODO: coger el type cuando se rellena la feature
128
                        }
129
                        log.debug("Escritos los dataElements de la feauture");
130
//                        la geometría
131
                        GeometryElement ge = f.getGeometryElement();
132
                        PGgeometry geom = f.getGeometryElement().getGeometry();
133
                        if (ge != null) {
134
                        
135
                                writer.startElement(ge.getName(), null , null);
136
                                
137
                                switch (geom.getGeoType()) {
138
                                        case Geometry.MULTIPOLYGON:
139
                                                log.debug("la geometría es Multipoligono");
140
                                                MultiPolygon multip = (MultiPolygon) geom.getGeometry(); 
141
                                                writer.startMultiPolygon(Integer.toString(i), box.getCrsBoundingBox());
142
                                                
143
                                                for (Polygon p : multip.getPolygons() ) {
144
                                                        ///TODO: No seguir si tiene más de un anillo.
145
                                                        //extraer en arrays las coordenadas
146
                                                        double[] x = new double[p.numPoints()];
147
                                                        double[] y = new double[p.numPoints()];
148
                                                        double[] z = new double[p.numPoints()];
149
                                                        
150
                                                        ConvertUtils.ConvertCoordinatesToXYZ(p, x, y, z);
151
                                                        
152
                                                        writer.startPolygon("p" + i, x, y, z, box.getCrsBoundingBox());
153
                                                        writer.endPolygon();
154
                                                
155
                                                }
156
                                                writer.endMultiPolygon();
157
                                                writer.endElement();
158
                                                writer.endFeature();
159
                                                log.debug("End Feature");
160
                                                break;
161
                                        
162
                                        case Geometry.MULTILINESTRING:
163
                                                MultiLineString multil = (MultiLineString) geom.getGeometry();
164
                                                writer.startMultiLineString(Integer.toString(i), box.getCrsBoundingBox());
165
                                                
166
                                                for (LineString ls : multil.getLines()) {
167
                                                        double[] x = new double[ls.numPoints()];
168
                                                        double[] y = new double[ls.numPoints()];
169
                                                        double[] z = new double[ls.numPoints()];
170
                                                        
171
                                                        ConvertUtils.ConvertCoordinatesToXYZ(ls, x, y, z);
172
                                                        
173
                                                        writer.startLineString("l" + i, x, y, z, box.getCrsBoundingBox());
174
                                                    writer.endLineString();
175
                                                }
176
                                                writer.endMultiLineString();
177
                                                writer.endElement();
178
                                                writer.endFeature();
179
                                                break;
180
                                
181
                                        case Geometry.POINT:
182
                                                Point p = (Point) geom.getGeometry();
183
                                                                                                
184
                                                writer.startPoint("l" + i, p.x, p.y, p.z, box.getCrsBoundingBox());
185
                                            writer.endPoint();
186
                        
187
                                                writer.endElement();
188
                                                writer.endFeature();
189
                                                break;
190
                                
191
                                        default:
192
                                                break;
193
                                }
194
                        }
195
        
196
                
197
                        if (errorHandler.getErrorsSize() > 0) {
198
                        for (int j = 0; j < errorHandler.getErrorsSize(); j++) {
199
                                log.error(errorHandler.getErrorAt(j));
200
                        }
201
                }
202
                
203
                if (errorHandler.getWarningsSize() > 0) {
204
                        for (int k = 0; k < errorHandler.getErrorsSize(); k++) {
205
                                log.warn(errorHandler.getErrorAt(k));
206
                        }
207
                }
208
                               
209
                }
210
        
211
                writer.endLayer();
212
                log.debug("End layer");
213
                writer.close();
214
                log.debug("Cerramos el writer (flush)");
215
                
216
                //return Xml.readXmlDocument(writer.getFileName(),false);
217
                return writer.getFileName();
218
                
219
        }
220
}