Statistics
| Revision:

root / branches / v10 / extensions / extPublishMapserver / src / org / gvsig / publish / mapserver / model / wms / MapserverWMSLayer.java @ 21391

History | View | Annotate | Download (17 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004-2006 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *   Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Iba?ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *   +34 963862235
28
 *   gvsig@gva.es
29
 *   www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.publish.mapserver.model.wms;
42

    
43
import java.awt.Color;
44
import java.awt.geom.Rectangle2D;
45
import java.io.File;
46
import java.io.IOException;
47

    
48
import org.gvsig.publish.PublishLogger;
49
import org.gvsig.publish.infoproject.IDataSourceInfo;
50
import org.gvsig.publish.infoproject.ILayerInfo;
51
import org.gvsig.publish.infoproject.ISymbolInfo;
52
import org.gvsig.publish.infoproject.datasources.IDataBaseInfo;
53
import org.gvsig.publish.infoproject.legends.IIntervalLegendInfo;
54
import org.gvsig.publish.infoproject.legends.ISingleSymbolLegendInfo;
55
import org.gvsig.publish.infoproject.legends.IUniqueValuesLegendInfo;
56
import org.gvsig.publish.infoproject.symbols.IFillSymbolInfo;
57
import org.gvsig.publish.infoproject.symbols.ILineSymbolInfo;
58
import org.gvsig.publish.infoproject.symbols.IMarkerSymbolInfo;
59
import org.gvsig.publish.infoproject.symbols.ITextSymbolInfo;
60
import org.gvsig.publish.mapserver.conf.MapFile;
61
import org.gvsig.publish.mapserver.conf.MapFile.CRS;
62
import org.gvsig.publish.mapserver.conf.MapFile.ConfigFile;
63
import org.gvsig.publish.mapserver.conf.MapFile.Label;
64
import org.gvsig.publish.mapserver.conf.MapFile.Layer;
65
import org.gvsig.publish.mapserver.conf.MapFile.MapClass;
66
import org.gvsig.publish.mapserver.conf.MapFile.RGB;
67
import org.gvsig.publish.mapserver.conf.MapFile.StyleMap;
68
import org.gvsig.publish.mapserver.model.Mapserver;
69
import org.gvsig.publish.mapserver.model.MapserverLayer;
70
import org.gvsig.publish.mapserver.util.MapserverUtilities;
71
import org.gvsig.publish.ogcmetadata.IOGCLayerMetadata;
72
import org.gvsig.publish.ogcmetadata.OGCLayerMetadata;
73
import org.gvsig.publish.serversmodel.PublishException;
74
import org.gvsig.publish.serversmodel.RemoteResource;
75

    
76
import com.iver.utiles.FileUtils;
77
import com.iver.utiles.XMLEntity;
78
/**
79
 * This class represents a kind of remote resource, a Mapserver-WMS layer.   
80
 * 
81
 * @author jvhigon
82
 *
83
 */
84
public class MapserverWMSLayer extends RemoteResource implements IOGCLayerMetadata{
85
        public static final String REGISTER_TAG="mapserver_wms_layer";
86
        //Associations        
87
        private OGCLayerMetadata ogcmetadata = null;
88
        private MapserverLayer specificParams = null;
89
        private MapFile.Layer config = null;
90
        /**
91
         * Constructor
92
         * @param service
93
         */
94
        public MapserverWMSLayer(MapserverWMS service){
95
                super(service);                
96
                ogcmetadata = new OGCLayerMetadata();
97
                specificParams = new MapserverLayer();                        
98
        }
99

    
100
        public MapserverLayer getLayerMapserver() {
101
                return specificParams;
102
        }
103

    
104
        public void setLayerMapserver(MapserverLayer layerMapserver) {
105
                this.specificParams = layerMapserver;
106
        }
107

    
108
        private ConfigFile getMapfile(){
109
                MapserverWMS wms = (MapserverWMS)getService();
110
                Mapserver server = (Mapserver) wms.getServer();
111
                return server.getConfigFile();
112
        }
113

    
114

    
115
        /**
116
         * Initializes the remote resource name and title with the name and title of the layer
117
         */
118
        public void setLayerInfo(ILayerInfo layerInfo) {
119
                super.setLayerInfo(layerInfo);
120
                setName(getLayerInfo().getName());
121
                setTitle(getLayerInfo().getTitle());
122
        }
123
        
124
        private Mapserver getMapServer(){
125
                //Cast to Mapserver
126
                Mapserver mapserver = (Mapserver)getService().getServer();
127
                return mapserver;
128
        }
129
        /**
130
         * TODO: I must change the class Mapfile: change ShpLayer, PostgisLayer by MapLayer (not abstract)
131
         * with a object "data" which might be postgis, shapefile, ...
132
         *  
133
         */
134
        public void publish() throws PublishException{
135
                //only for no group layers
136
                //TODO: wms_group_abstract ...
137
                if (getLayerInfo().getDataSource() != null){
138
                        if (config == null){
139
                                config = new MapFile.Layer();
140
                                getMapfile().add(config);
141
                        }
142
                        generateLayerSection();
143
                }
144

    
145
                //publish all its childs                
146
                super.publish();
147
        }
148
        
149
        private void generateLayerSection() throws PublishException{                
150
                
151
                config.name = getName();
152
                config.status = "ON";
153
                config.debug = getMapServer().isDebug();
154
                config.type = MapserverUtilities.getTypeParameter(getLayerInfo().getDataSource());
155
                generateDataParameter();                
156
                config.connectiontype = MapserverUtilities.getConnectionTypeParameter(getLayerInfo().getDataSource());
157
                config.connection = MapserverUtilities.getConnectionParameter(getLayerInfo().getDataSource());                
158
                config.maxscale = new Double(getLayerInfo().getMaxscale()).toString();
159
                config.minscale = new Double(getLayerInfo().getMinscale()).toString();
160
                config.transparency = getLayerInfo().getOpacityPercent();
161
                config.dump = isQueryable();                
162
                
163
                //mosaic 
164
                generateMosaicSection();
165
                //labeling
166
                generateLabelingSection();
167
                //PROJECTION (I must query the layer to know the shape projection)
168
                //lyr.layercrs = new CRS(getLayerInfo().getEPSG(),true);
169
                config.layercrs = new CRS(getLayerInfo().getDataSource().getEPSG(),true);
170
                
171
                //CLASS
172
                generateClassSection();
173
                //METADATA
174
                generateMetadata(config);
175

    
176
        }
177
        /**
178
         * Generates the LAYER->DATA parameter 
179
         */
180
        private void generateDataParameter() {
181
                IDataSourceInfo ds = getLayerInfo().getDataSource();
182
                if (ds.getType() == IDataSourceInfo.POSTGIS_TYPE){
183
                        IDataBaseInfo db = (IDataBaseInfo)ds;
184
                        String table = db.getTableName();
185
                        config.data ="the_geom from "  + table + " using unique " + db.getGID() + " using srid=" + ds.getSRID(); 
186
                }else{
187
                        config.data = getService().getServer().getPublication().getServerSideFilePath(ds);
188
                }                                
189
        }
190

    
191
        private void generateMosaicSection() {
192
                if (getSpecificParams().isMosaic()){
193
                        config.type = "RASTER";
194
                        config.tileIndex = getService().getServer().getPublication().getServerSideFilePath(getLayerInfo().getDataSource());
195
                        config.data = null;
196
                        config.classList.clear();
197
                        config.tileItem="location";
198
                }
199
                
200
        }
201

    
202
        /**
203
         * TODO:
204
         * lyr.labelsizeitem = getLayerInfo().getLabeling().getLabelHeightField();
205
         * lyr.labelangleitem = getLayerInfo().getLabeling().getLabelRotationField();
206
         */
207
        private void generateLabelingSection(){
208
                if (getLayerInfo().getLabeling() != null){
209
                        config.labelitem = getLayerInfo().getLabeling().getLabelField();
210
                }                
211
        }
212
        private void generateClassSection() throws PublishException{
213
                //CLASS
214
                Object source = getLayerInfo().getLegend();                
215
                if(source instanceof ISingleSymbolLegendInfo){
216
                        ISingleSymbolLegendInfo legend = (ISingleSymbolLegendInfo)source;
217
                        generateSingleLegend(legend, config);                
218
                }
219
                if(source instanceof IUniqueValuesLegendInfo){
220
                        IUniqueValuesLegendInfo legend = (IUniqueValuesLegendInfo)source;
221
                        generateUniqueLegend(legend, config);                        
222
                }
223
                if(source instanceof IIntervalLegendInfo){
224
                        IIntervalLegendInfo legend = (IIntervalLegendInfo)source;
225
                        generateIntervalLegend(legend, config);                        
226
                }
227
        }
228

    
229
        private void generateSingleLegend(ISingleSymbolLegendInfo legend, Layer lyr) throws PublishException {
230
                ISymbolInfo isymbol =  legend.getSymbolInfo();                
231
                lyr.classList.clear();
232
                MapClass clase = new MapClass();                
233
                //put name
234
                clase.name = "default";
235
                //put the size units
236
                lyr.sizeunits = isymbol.getUnits();
237

    
238
                generateStyle(isymbol, clase);
239
                //put labeling if exists
240
                if ( getLayerInfo().getLabeling().getLabelField() != null){
241
                        generateSymbol(getLayerInfo().getLabeling().getSymbolInfo(), clase);
242
                }
243
                //add the class into the layer
244
                lyr.addClass(clase);                
245
        }
246

    
247

    
248
        /**
249
         * Generate an interval legend
250
         * @param legend
251
         * The legend
252
         * @param lyr
253
         * The layer
254
         * @throws PublishException 
255
         */
256
        private void generateIntervalLegend(IIntervalLegendInfo legend, Layer lyr) throws PublishException {
257
                //check if is labeled
258
                boolean islabeled = false;
259
                if ( getLayerInfo().getLabeling().getLabelField() != null){
260
                        islabeled = true;
261
                }
262
                
263
                String[] expressions = legend.getExpressions();
264
                for (int i=0 ; i<expressions.length ; i++){
265
                        ISymbolInfo isymbol = legend.getSymbolByExpression(expressions[i]);
266
                        MapClass clase = new MapClass();
267
                        //TODO: change in infoProject
268
                        clase.expression = "(" + expressions[i] + ")";
269
                        generateStyle(isymbol, clase);
270
                        if (islabeled){
271
                                generateSymbol(getLayerInfo().getLabeling().getSymbolInfo(), clase);
272
                        }
273
                        lyr.addClass(clase);
274
                }
275
        }
276

    
277
        private void generateUniqueLegend(IUniqueValuesLegendInfo legend, Layer lyr) throws PublishException {
278
                //check if is labeled
279
                boolean islabeled = false;
280
                if ( getLayerInfo().getLabeling().getLabelField() != null){
281
                        islabeled = true;
282
                }
283
                //put the CLASSITEM
284
                lyr.classitem = legend.getFilterItem();
285
                //create all CLASS
286
                String[] uniqueValues = legend.getUniqueValues();
287
                for (int i =0; i< uniqueValues.length;i++){
288
                        ISymbolInfo isymbol = legend.getSymbol(uniqueValues[i]);
289
                        //create a CLASS
290
                        MapClass clase = new MapClass();
291
                        clase.name = isymbol.getTitle();
292
                        //TODO: change in infoProject
293
                        clase.expression = "\"" +  uniqueValues[i] + "\"";
294
                        generateStyle(isymbol, clase);
295
                        if (islabeled){
296
                                generateSymbol(getLayerInfo().getLabeling().getSymbolInfo(), clase);
297
                        }
298
                        //add the class into the layer
299
                        lyr.addClass(clase);
300
                }
301
        }
302

    
303
        public void generateStyle(ISymbolInfo isymbol, MapClass clase) throws PublishException{                
304
                if (getLayerInfo().getDataSource().getDataType() == IDataSourceInfo.POINT_DATA){
305
                        //I can do a cast to Marker Symbol
306
                        IMarkerSymbolInfo pointSymbol = (IMarkerSymbolInfo)isymbol;
307
                        generateSymbol(pointSymbol, clase);
308
                }
309
                if (getLayerInfo().getDataSource().getDataType() == IDataSourceInfo.LINE_DATA){
310
                        //I can do a cast to Line Symbolizer
311
                        ILineSymbolInfo lineSymbol = (ILineSymbolInfo)isymbol;
312
                        generateSymbol(lineSymbol, clase);
313
                }        
314
                if (getLayerInfo().getDataSource().getDataType() == IDataSourceInfo.POLYGON_DATA){
315
                        //I can do a cast to Polygon Symbolizer
316
                        IFillSymbolInfo fillSymbol = (IFillSymbolInfo)isymbol;
317
                        generateSymbol(fillSymbol, clase);
318
                }
319

    
320
        }
321

    
322
        private void generateSymbol(ITextSymbolInfo textSymbol, MapClass clase){
323
                clase.etiqueta = new Label();
324
                //TODO: change by getColor()
325
                Color c = textSymbol.getFontColor();
326
                clase.etiqueta.color = new RGB(c.getRed(), c.getGreen(), c.getBlue());
327

    
328
                //clase.etiqueta.size = new Double(textSymbol.getFontSize()).intValue();
329
                //clase.etiqueta.type = "truetype";
330
        }
331

    
332
        private void generateSymbol(IMarkerSymbolInfo pointSymbol, MapClass clase) throws PublishException {
333
                clase.estilo = new StyleMap();                
334
                Color c = pointSymbol.getColor();
335
                clase.estilo.styleColor = new RGB(c.getRed(), c.getGreen(), c.getBlue());
336
                clase.estilo.size = pointSymbol.getSize();
337
                clase.symbol = pointSymbol.getWellKnowMarkerName();
338
                //if it's an image
339
                File icon = pointSymbol.getImageIconFile(); 
340
                if ( icon !=null){
341
                        clase.symbol = icon.getName();
342
                        Mapserver m = (Mapserver)getService().getServer();
343
                        String s = m.getMapfileFile().getParentFile().getAbsolutePath();
344
                        File dst = new File(s+ File.separator+ icon.getName());
345
                        
346
                        try {
347
                                FileUtils.copy(icon, dst);
348
                        } catch (IOException e) {                        
349
                                throw new PublishException("cannot_copy_icons");                        
350
                        }
351
                }
352
                
353
        }
354
        /**
355
         * In Mapserver is impossible to have a dashed outline 
356
         * @param fillSymbol
357
         * @param clase
358
         */
359
        private void generateSymbol(IFillSymbolInfo fillSymbol, MapClass clase) {
360
                clase.estilo = new StyleMap();
361
                //set outline                
362
                ILineSymbolInfo linesymbolizer = fillSymbol.getOutline();
363
                Color c = linesymbolizer.getColor();
364
                clase.estilo.styleColorOutline = new RGB(c.getRed(), c.getGreen(), c.getBlue());
365
                clase.estilo.width = new Double(linesymbolizer.getLineWitdth()).intValue();                
366
                //set fill
367
                c = fillSymbol.getColor();
368
                clase.estilo.styleColor = new RGB(c.getRed(), c.getGreen(), c.getBlue());                                
369
                //if it is a well known polygon
370
                clase.symbol = fillSymbol.getWellKnowFillName();
371
        }
372

    
373
        private void generateSymbol(ILineSymbolInfo lineSymbol, MapClass clase) {
374
                Color c = lineSymbol.getColor();                
375
                clase.estilo = new StyleMap();
376
                clase.estilo.width = new Double(lineSymbol.getLineWitdth()).intValue();
377
                clase.estilo.styleColor = new RGB(c.getRed(), c.getGreen(), c.getBlue());
378
                //if it is a well know line
379
                clase.symbol = lineSymbol.getWellKnowLineName();
380
        }
381

    
382
        /**
383
         * Generates the METADATA object
384
         * @param mapLayer
385
         */
386
        private void generateMetadata(Layer mapLayer){
387
                //add metadata
388
                mapLayer.metadata.wms_name = getName();
389
                mapLayer.metadata.wms_title =getTitle();
390
                mapLayer.metadata.wms_abstract = getAbstract();
391
                Rectangle2D aux = getLayerInfo().getDataSource().getNativeBBox();
392
                String bbox = aux.getMinX() + " " + aux.getMinY() + " " + aux.getMaxX() + " " + aux.getMaxY();
393
                mapLayer.metadata.wms_extent = bbox;
394
                mapLayer.metadata.gml_include_items = "all";         
395
                //adding layer_group
396
        
397
                if (getLayerInfo().getPathString().equals("/")==false){
398
                        String aux2 = getLayerInfo().getPathString();
399
                        mapLayer.metadata.wms_layer_group = aux2.substring(0,aux2.length()-1);
400
                }
401
        }
402
        
403
        /*
404
         * (non-Javadoc)
405
         * @see com.iver.utiles.IPersistance#getClassName()
406
         */
407
        public String getClassName() {        
408
                return "MapserverWMSLayer";
409
        }
410
        /*
411
         * (non-Javadoc)
412
         * @see org.gvsig.publish.serversmodel.RemoteResource#getXMLEntity()
413
         */
414
        public XMLEntity getXMLEntity() {
415
                XMLEntity xml=super.getXMLEntity();
416
                //put version and name
417
                xml.setName(getClassName());
418
                xml.putProperty("version", getVersion());
419
                //put associations
420
                XMLEntity child = new XMLEntity();
421
                child.setName("ogcmetadata");
422
                child.addChild(ogcmetadata.getXMLEntity());
423
                xml.addChild(child);
424
                child = new XMLEntity();
425
                child.setName("mapserverlayer");
426
                child.addChild(specificParams.getXMLEntity());
427
                xml.addChild(child);        
428
                return xml;
429
        }
430
        /*
431
         * (non-Javadoc)
432
         * @see org.gvsig.publish.serversmodel.RemoteResource#setXMLEntity(com.iver.utiles.XMLEntity)
433
         */
434
        public void setXMLEntity(XMLEntity xml) {
435
                //check version
436
                int version = xml.getIntProperty("version");
437
                if (version != getVersion()){
438
                        PublishLogger.getLog().error("ERROR: " + getClassName() + ": the version doesn't match!");                        
439
                        return;
440
                }
441
                super.setXMLEntity(xml);                                                
442
                //set associations
443
                XMLEntity child = xml.firstChild("name","ogcmetadata");
444
                ogcmetadata.setXMLEntity(child.getChild(0));                
445
                child = xml.firstChild("name","mapserverlayer");
446
                specificParams.setXMLEntity(child.getChild(0));
447
        }
448

    
449
        /*
450
         * (non-Javadoc)
451
         * @see org.gvsig.publish.serversmodel.RemoteResource#getId()
452
         */
453
        public String getId() {                
454
                return getLayerInfo().getName();
455
        }
456

    
457
        /*
458
         * (non-Javadoc)
459
         * @see org.gvsig.publish.IPublishPersistence#getVersion()
460
         */
461
        public int getVersion() {                
462
                return 1;
463
        }
464
        /*
465
         * (non-Javadoc)
466
         * @see org.gvsig.publish.ogcmetadata.IOGCWMSLayerMetadata#isQueryable()
467
         */
468
        public boolean isQueryable() {
469
                return ogcmetadata.isQueryable();
470
        }
471
        /*
472
         * (non-Javadoc)
473
         * @see org.gvsig.publish.ogcmetadata.IOGCWMSLayerMetadata#setQueryable(boolean)
474
         */
475
        public void setQueryable(boolean queryable) {
476
                ogcmetadata.setQueryable(queryable);                
477
        }
478
        /*
479
         * (non-Javadoc)
480
         * @see org.gvsig.publish.ogcmetadata.IOGCCommonMetadata#getAbstract()
481
         */
482
        public String getAbstract() {                
483
                return ogcmetadata.getAbstract();
484
        }
485
        /*
486
         * (non-Javadoc)
487
         * @see org.gvsig.publish.ogcmetadata.IOGCCommonMetadata#getName()
488
         */
489
        public String getName() {                
490
                return ogcmetadata.getName();
491
        }
492
        /*
493
         * (non-Javadoc)
494
         * @see org.gvsig.publish.ogcmetadata.IOGCCommonMetadata#setAbstract(java.lang.String)
495
         */
496
        public void setAbstract(String description) {
497
                ogcmetadata.setAbstract(description);                
498
        }
499
        /*
500
         * (non-Javadoc)
501
         * @see org.gvsig.publish.ogcmetadata.IOGCCommonMetadata#setName(java.lang.String)
502
         */
503
        public void setName(String name) {
504
                ogcmetadata.setName(name);                
505
        }
506
        /*
507
         * (non-Javadoc)
508
         * @see org.gvsig.publish.ogcmetadata.IOGCCommonMetadata#setTitle(java.lang.String)
509
         */
510
        public void setTitle(String title) {
511
                ogcmetadata.setTitle(title);                
512
        }
513
        /*
514
         * (non-Javadoc)
515
         * @see org.gvsig.publish.ogcmetadata.IOGCCommonMetadata#getTitle()
516
         */
517
        public String getTitle() {                
518
                return ogcmetadata.getTitle();
519
        }
520

    
521
        /*
522
         * (non-Javadoc)
523
         * @see org.gvsig.publish.serversmodel.RemoteResource#getRegisterTag()
524
         */
525
        public String getRegisterTag() {                
526
                return REGISTER_TAG;
527
        }
528
        /*
529
         * (non-Javadoc)
530
         * @see java.lang.Object#toString()
531
         */
532
        public String toString(){
533
                return getName();
534
        }
535

    
536
        /**
537
         * @return the specificParams
538
         */
539
        public MapserverLayer getSpecificParams() {
540
                return specificParams;
541
        }
542

    
543
        /**
544
         * @param specificParams the specificParams to set
545
         */
546
        public void setSpecificParams(MapserverLayer specificParams) {
547
                this.specificParams = specificParams;
548
        }
549
}