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