Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extPublish / src / com / iver / cit / gvsig / publish / servers / mapserver / MapServerPublishControler.java @ 7151

History | View | Annotate | Download (8.69 KB)

1
package com.iver.cit.gvsig.publish.servers.mapserver;
2

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

    
47
import org.gvsig.remoteservices.conf.mapserver.MapServer.CRS;
48
import org.gvsig.remoteservices.conf.mapserver.MapServer.ConfigFile;
49
import org.gvsig.remoteservices.conf.mapserver.MapServer.MapLayer;
50
import org.gvsig.remoteservices.conf.mapserver.MapServer.MetadataWeb;
51
import org.gvsig.remoteservices.conf.mapserver.MapServer.WebMap;
52
import org.gvsig.remoteservices.conf.mapserver.test.AddFieldToDBF;
53

    
54
import com.iver.cit.gvsig.fmap.drivers.RasterDriver;
55
import com.iver.cit.gvsig.fmap.drivers.raster.CmsRasterDriver;
56
import com.iver.cit.gvsig.fmap.layers.FLayer;
57
import com.iver.cit.gvsig.fmap.layers.FLayers;
58
import com.iver.cit.gvsig.fmap.layers.FLyrRaster;
59
import com.iver.cit.gvsig.publish.layers.LayerException;
60
import com.iver.cit.gvsig.publish.layers.LayerLoader;
61
import com.iver.cit.gvsig.publish.servers.GenericServer;
62
import com.iver.cit.gvsig.publish.servers.PublishControler;
63
import com.iver.utiles.StringUtilities;
64
import com.iver.utiles.swing.jcomboServer.ServerData;
65

    
66
/**
67
 * This class implements the mapserver publication. It has to 
68
 * retrieve the current layers from gvSIG and create the
69
 * map file 
70
 * 
71
 * @author jvhigon
72
 * 
73
 */
74
public class MapServerPublishControler extends PublishControler{
75
        
76
        /**
77
         * Constructor
78
         */
79
        public MapServerPublishControler() {
80
                super();
81
        }
82

    
83
        /*
84
         *  (non-Javadoc)
85
         * @see com.iver.cit.gvsig.publish.servers.PublishControler#publish(com.iver.utiles.swing.jcomboServer.ServerData)
86
         */
87
        public Object publish(ServerData serverData) {
88
                return publish(serverData.getServerAddress(),
89
                                serverData.getProperty(GenericServer.GENERIC_SERVER_PATH),
90
                                serverData.getProperty(MapServer.WMS_MAPFILE),
91
                                serverData.getProperty(MapServer.WMS_SYMBOLS),
92
                                serverData.getProperty(MapServer.WMS_FONTS),
93
                                serverData.getProperty(MapServer.WMS_IMAGEURL),
94
                                serverData.getProperty(MapServer.WMS_IMAGEPATH));
95
        }
96
        
97
        /**
98
         * 
99
         * @param url
100
         * @param path
101
         * @param mapFile
102
         * @param symbolsFile
103
         * @param fontsFile
104
         * @param ImageURL
105
         * @param imagePath
106
         * @throws LayerException 
107
         * @throws LayerException 
108
         */
109
        private ConfigFile publish(String onlineResource, String path, String mapFile,
110
                        String symbolsFile, String fontsFile, String ImageURL,
111
                        String imagePath) {
112
                                
113
                ConfigFile map = getConfigFile(path);                
114
                map.www = getWebMapVect(onlineResource,imagePath,ImageURL);
115

    
116
                for (int i = 0; i < getLayers().getLayersCount(); i++) {
117
                        FLayer lyr = getLayers().getLayer(i);
118
                        if (lyr.isVisible()){
119
                                try{
120
                                        if (lyr instanceof FLayers){
121
                                                ArrayList layers = publishGroupLayer(map,(FLayers)lyr);
122
                                                for (int j=0 ; j<layers.size() ; j++){
123
                                                        MapLayer mapLayer = (MapLayer)layers.get(j);
124
                                                        if (mapLayer != null){
125
                                                                map.layers.add(mapLayer);
126
                                                        }        
127
                                                }
128
                                        }else{
129
                                                MapLayer mapLayer = publishSimpleLayer(lyr);
130
                                                if (mapLayer != null){
131
                                                        map.layers.add(mapLayer);
132
                                                }
133
                                        }
134
                                }catch(LayerException e){                                        
135
                                        
136
                                }
137
                        }
138
                } 
139
                map.generate(mapFile);
140
                return map;
141
        }        
142
        
143
        private MapLayer publishSimpleLayer(FLayer layer) throws LayerException{
144
                return new MapServerLayerFactory().getMapLayer(layer);
145
        }
146
        
147
        private ArrayList publishGroupLayer(ConfigFile config,FLayers layers) throws LayerException{
148
                ArrayList mapLayers = new ArrayList();
149
                if (layers.getName().startsWith("[")){
150
                        if (layers.getName().startsWith("[" + LayerLoader.GROUP_LAYER_TIME)){
151
                                mapLayers.add(publishTimeLayer(config,layers));
152
                        }else if(layers.getName().startsWith("[" + LayerLoader.GROUP_LAYER_MOSAIC)){
153
                                
154
                        }else{
155
                                for (int i=0 ; i<layers.getLayersCount() ; i++){
156
                                        mapLayers.add(publishSimpleLayer(layers.getLayer(i)));
157
                                }
158
                        }
159
                }else{
160
                        for (int i=0 ; i<layers.getLayersCount() ; i++){
161
                                mapLayers.add(publishSimpleLayer(layers.getLayer(i)));
162
                        }
163
                }
164
                return mapLayers;
165
        }
166
        
167
        private MapLayer publishTimeLayer(ConfigFile config,FLayers layers) throws LayerException{
168
                MapLayer mapLayer = null;
169
                String indexDir = "C:/ms4w/mapserver/data/"; //"C:/ms4w/test/";
170
                String fileIndex = indexDir+"index.shp";
171
                
172
                String[] files = new String[layers.getLayersCount()];
173
                String[] times = new String[layers.getLayersCount()];
174
                String timeExtent = getTime(layers.getLayer(0).getName());
175
                mapLayer = publishSimpleLayer(layers.getLayer(0));
176
                files[0] = getRasterFile(layers.getLayer(0));
177
                times[0] = getTime(layers.getLayer(0).getName());
178
                for (int i = 1; i < layers.getLayersCount(); i++) {
179
                        timeExtent = timeExtent + "," + getTime(layers.getLayer(i).getName());
180
                        files[i] = getRasterFile(layers.getLayer(i));
181
                        times[i] = getTime(layers.getLayer(i).getName());
182
                }
183
                String sOptions = layers.getName().split("]")[0];
184
                String[] options = sOptions.split(",");
185
                mapLayer.name = layers.getName().split("]")[1];
186
                config.www.metadata.timeFormat = options[1];
187
                mapLayer.tileIndex = "index.shp";
188
                mapLayer.tileItem = "location";
189
                mapLayer.data = null;
190
                mapLayer.metadata.title = mapLayer.name;
191
                mapLayer.metadata.timeDefault = options[2];
192
                mapLayer.metadata.timeExtent = timeExtent;
193
                mapLayer.metadata.timeItem = "date";        
194
                generateIndex(fileIndex,files,times);
195
                return mapLayer;
196
        }
197
        
198
        private String getRasterFile(FLayer layer){
199
                RasterDriver driver = ((RasterDriver)((FLyrRaster)layer).getSource().getDriver());
200
                return driver.getFiles()[0].getName();
201
        }
202
        
203
        private void generateIndex(String fileIndex,String[] fNames, String[] times){
204
                String gdalPath = "C:\\Program Files\\FWTools0.9.8sid\\bin\\"; //"C:/Archivos de programa/FWTools1.0.5/bin/";
205
                String cmd = "\""+gdalPath+"gdaltindex\"";
206
                String params =  fileIndex;
207
                for (int i=0; i<fNames.length; i++)
208
                        params += " "+fNames[i];
209
                System.out.println("Generating index.shp ...");
210
                try {
211
                        deleteIndexFile(fileIndex);
212
                        System.out.println(cmd+" "+params);
213
                        Runtime.getRuntime().exec(cmd+" "+params);
214
                } catch (IOException e) {
215
                        // TODO Auto-generated catch block
216
                        e.printStackTrace();
217
                }
218
                try {
219
                        Thread.sleep(200);
220
                } catch (InterruptedException e) {
221
                        // TODO Auto-generated catch block
222
                        e.printStackTrace();
223
                }
224
                AddFieldToDBF dbfFile = new AddFieldToDBF();
225
                String dbfFileName = fileIndex.substring(0,fileIndex.length()-4)+".dbf";
226
                dbfFile.add(dbfFileName, "date", times);
227
                System.out.println("done.");
228
        }
229
        
230
        private void deleteIndexFile(String fileIndex) {
231
                File f = new File(fileIndex);
232
                if (f.exists()) {
233
                        String root = fileIndex.substring(0,fileIndex.length()-4);
234
                        String [] exts = {"shp", "dbf", "shx"};
235
                        for (int i=0; i<exts.length; i++) {
236
                                f = new File(root+"."+exts[i]);
237
                                f.delete();
238
                        }
239
                }
240
        }        
241
        
242
        private String getTime(String layerName){
243
                String time = layerName.split("]")[0];
244
                return StringUtilities.replace(time,"[","");
245
        }
246
        
247
        private ConfigFile getConfigFile(String path){
248
                ConfigFile map = new ConfigFile();
249
                map.mapName = "TEST_MAPSERVER";
250
                map.mapStatus = "ON";
251
                map.mapUnits = "METERS";
252
                map.mapShapePath = path;
253
                map.mapcrs = new CRS(getMapCtrl().getMapContext().getViewPort()
254
                                .getProjection().getAbrev(), true);
255
                map.setExtent(getMapCtrl().getMapContext().getViewPort().getExtent());
256
                return map;
257
        }
258
        
259
        private WebMap getWebMapVect(String onlineResource,
260
                        String imagePath,
261
                        String imageURL){
262
                WebMap webMap = new WebMap();
263
                webMap.imagepath = imagePath;
264
                webMap.imageurl = imageURL;
265
                webMap.metadata = new MetadataWeb();
266
                webMap.metadata.crs = new CRS(getMapCtrl().getMapContext().getViewPort()
267
                                .getProjection().getAbrev(), false);
268

    
269
                webMap.metadata.title = "Published Layers";
270
                webMap.metadata.onlineresource = onlineResource;
271
                return webMap;
272
        }
273
        
274
        
275
        
276
        
277
}
278