source: branches/prototype-v0/zoo-project/zoo-kernel/service_internal_ms.c @ 865

Last change on this file since 865 was 865, checked in by djay, 6 years ago

Use correct declaration of the zo_DS variable in libzoo_service.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 48.1 KB
RevLine 
[579]1/*
[379]2 * Author : Gérald FENOY
3 *
4 *  Copyright 2010-2011 Fondazione Edmund Mach. All rights reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
[586]25/**
26 * Cross platform definition of layerObj->class
27 */
[370]28#ifndef WIN32
29#define CLASS class
30#else
31#define CLASS _class
32#endif
[297]33#include "service_internal_ms.h"
[640]34#include "server_internal.h"
35#include "response_print.h"
[297]36
37/**
[586]38 * Get a list of configuration keys having a corresponding mandatory ows_*.
[297]39 * Map composed by a main.cfg maps name as key and the corresponding
40 * MapServer Mafile Metadata name to use
41 * see doc from here :
42 *  - http://mapserver.org/ogc/wms_server.html
43 *  - http://mapserver.org/ogc/wfs_server.html
44 *  - http://mapserver.org/ogc/wcs_server.html
[586]45 *
46 * @return a new map containing a table linking a name of a configuration key
47 * to a corresponding mandatory ows_* keyword (ie. "fees" => "ows_fees").
[297]48 */
49map* getCorrespondance(){
50  map* res=createMap("encoding","ows_encoding");
51  addToMap(res,"abstract","ows_abstract");
52  addToMap(res,"title","ows_title");
53  addToMap(res,"keywords","ows_keywordlist");
54  addToMap(res,"fees","ows_fees");
55  addToMap(res,"accessConstraints","ows_accessconstraints");
56  addToMap(res,"providerName","ows_attribution_title");
57  addToMap(res,"providerSite","ows_service_onlineresource");
58  addToMap(res,"individualName","ows_contactperson");
59  addToMap(res,"positionName","ows_contactposition");
60  addToMap(res,"providerName","ows_contactorganization");
61  addToMap(res,"role","ows_role");
62  addToMap(res,"addressType","ows_addresstype");
63  addToMap(res,"addressCity","ows_city");
64  addToMap(res,"addressDeliveryPoint","ows_address");
65  addToMap(res,"addressPostalCode","ows_postcode");
66  addToMap(res,"addressAdministrativeArea","ows_stateorprovince");
67  addToMap(res,"addressCountry","ows_country");
68  addToMap(res,"phoneVoice","ows_contactvoicetelephone");
69  addToMap(res,"phoneFacsimile","ows_contactfacsimiletelephone");
70  addToMap(res,"addressElectronicMailAddress","ows_contactelectronicmailaddress");
71  // Missing Madatory Informations
72  addToMap(res,"hoursOfService","ows_hoursofservice");
73  addToMap(res,"contactInstructions","ows_contactinstructions");
74  return res;
75}
76
[586]77/**
[860]78 * Return the current publish_id value
79 * @param elem and maps pointer on which the search occur
80 * @return the integer value of the publish_id field, if any, 0 otherwise
81 */ 
82int getPublishedId(maps* elem){
83  map* myIndex=getMap(elem->content,"published_id");
84  if(myIndex!=NULL){
85    return atoi(myIndex->value);
86  }
87  return 0;
88}
89/**
[586]90 * Add width and height keys to an output maps containing the maximum width
91 * and height for displaying the full data extent.
92 * Restriction to an image having a size of 640x480 (width * height)
93 *
94 * @param output
95 * @param minx the lower left x coordinate
96 * @param miny the lower left y coordinate
97 * @param maxx the upper right x coordinate
98 * @param maxy the upper right y coordinate
99 */
[297]100void setMapSize(maps* output,double minx,double miny,double maxx,double maxy){
[860]101  int imyIndex=getPublishedId(output);
[297]102  double maxWidth=640;
103  double maxHeight=480;
104  double deltaX=maxx-minx;
105  double deltaY=maxy-miny;
106  double qWidth;
107  qWidth=maxWidth/deltaX;
108  double qHeight;
109  qHeight=maxHeight/deltaY;
110#ifdef DEBUGMS
111  fprintf(stderr,"deltaX : %.15f \ndeltaY : %.15f\n",deltaX,deltaY);
112  fprintf(stderr,"qWidth : %.15f \nqHeight : %.15f\n",qWidth,qHeight);
113#endif
114
115  double width=deltaX*qWidth;
116  double height=height=deltaY*qWidth;
117  if(deltaX<deltaY){
118    width=deltaX*qHeight;
119    height=deltaY*qHeight;
120  }
121  if(height<0)
122    height=-height;
123  if(width<0)
124    width=-width;
125  char sWidth[1024];
126  char sHeight[1024];
127  sprintf(sWidth,"%.3f",width);
128  sprintf(sHeight,"%.3f",height);
129#ifdef DEBUGMS
130  fprintf(stderr,"sWidth : %.15f \nsHeight : %.15f\n",sWidth,sHeight);
131#endif
132  if(output!=NULL){
[860]133    setMapArray(output->content,"width",imyIndex,sWidth);
134    setMapArray(output->content,"height",imyIndex,sHeight);
[297]135  }
136}
137
[586]138/**
139 * Add a Reference key to an output containing the WMFS/WFS/WCS request for
140 * accessing service result
141 *
142 * @param m the conf maps containing the main.cfg settings
143 * @param tmpI the specific output maps to add the Reference key
144 */
[297]145void setReferenceUrl(maps* m,maps* tmpI){
[862]146  int imyIndex=getPublishedId(tmpI);
147  if(getMapArray(tmpI->content,"ref_wms_link",imyIndex)!=NULL)
148    return;
149  outputMapfile(m,tmpI);
[297]150  map *msUrl=getMapFromMaps(m,"main","mapserverAddress");
[607]151  if(msUrl==NULL){
152    errorException (m, _("Unable to find any mapserverAddress defined in the main.cfg file"),
153                    "InternalError", NULL);
154    exit(-1);
155  }
[860]156  if(getMapArray(tmpI->content,"ref_wms_link",imyIndex)!=NULL)
157    return;
[854]158  int finalProto=-1;
[297]159  map *msOgcVersion=getMapFromMaps(m,"main","msOgcVersion");
160  map *dataPath=getMapFromMaps(m,"main","dataPath");
[453]161  map *sid=getMapFromMaps(m,"lenv","usid");
[860]162  map* format=getMapArray(tmpI->content,"mimeType",imyIndex);
163  map* rformat=getMapArray(tmpI->content,"requestedMimeType",imyIndex);
164  map* width=getMapArray(tmpI->content,"width",imyIndex);
165  map* height=getMapArray(tmpI->content,"height",imyIndex);
166  map* protoMap=getMapArray(tmpI->content,"msOgc",imyIndex);
167  map* versionMap=getMapArray(tmpI->content,"msOgcVersion",imyIndex);
168  map* datatype=getMapArray(tmpI->content,"geodatatype",imyIndex);
[862]169  map* layerName=getMapArray(tmpI->content,"msLayer",imyIndex);
[854]170  char options[4][5][25]={
[297]171    {"WMS","1.3.0","GetMap","layers=%s","wms_extent"},
[862]172    {"WFS","1.0.0","GetFeature","typename=%s","wcs_extent"},
[854]173    {"WCS","2.0.0","GetCoverage","coverageid=%s","wcs_extent"},
[862]174    {"WCS","1.0.0","GetCoverage","coverage=%s","wcs_extent"}
[297]175  };
[862]176  map *nbElements=getMapArray(tmpI->content,"nb_features",imyIndex);
177  if(nbElements==NULL)
178    nbElements=getMapArray(tmpI->content,"nb_pixels",imyIndex);
179  if(datatype==NULL || strncmp(datatype->value,"other",5)==0 || (nbElements!=NULL && atoi(nbElements->value)==0)){
[860]180    map* minNb=getMap(tmpI->content,"minoccurs");
[862]181    map* useMs=getMap(tmpI->content,"useMapserver");
182    if((minNb==NULL || atoi(minNb->value)>=1) && useMs!=NULL && strncasecmp(useMs->value,"true",4)==0){
[860]183      setMapInMaps(m,"lenv","mapError","true");
184      setMapInMaps(m,"lenv","locator",tmpI->name);
[862]185      if(nbElements==NULL)
186        setMapInMaps(m,"lenv","message",_("The ZOO-Kernel was able to retrieve the data but could not read it as geographic data."));
187      else
188        setMapInMaps(m,"lenv","message",_("The ZOO-Kernel was able to retrieve the data but could not access any feature or pixel in te resulting file."));
[860]189      if(getMapFromMaps(m,"lenv","state")==NULL)
190        errorException (m, _("Unable to find any geographic data"), "WrongInputData", tmpI->name);
191    }
[854]192    return;
193  }
[297]194  int proto=0;
195  if(rformat==NULL){
[860]196    rformat=getMapArray(tmpI->content,"mimeType",imyIndex);
[297]197  }
198  if(strncasecmp(rformat->value,"text/xml",8)==0)
199    proto=1;
[839]200  if(strncasecmp(rformat->value,"image/tiff",10)==0 ||
201     strncasecmp(rformat->value,"image/geotiff",10)==0)
[297]202    proto=2;
[860]203  int hasFormat=-1;
[490]204  if(protoMap!=NULL){
[860]205    hasFormat=1;
206    if(strncasecmp(protoMap->value,"WMS",3)==0){
[297]207      proto=0;
[860]208      rformat=createMap("value","image/png");
209    }
[490]210    else{
[860]211      if(strncasecmp(protoMap->value,"WFS",3)==0){
[490]212        proto=1;
[860]213        rformat=createMap("value","text/xml");
214      }
215      else {
[490]216        proto=2;
[860]217        rformat=createMap("value","image/tiff");
218      }
[490]219    }
220  }
[297]221  char *protoVersion=options[proto][1];
222  if(proto==1){
223    if(msOgcVersion!=NULL)
224      protoVersion=msOgcVersion->value;
225    if(versionMap!=NULL)
226      protoVersion=versionMap->value;
227  }
228
[860]229
230  map* extent=getMapArray(tmpI->content,options[proto][4],imyIndex);
231  map* crs=getMapArray(tmpI->content,"crs",imyIndex);
[402]232  int hasCRS=1;
233  if(crs==NULL){
234    crs=getMapFromMaps(m,"main","crs");
235    if(crs==NULL){
236      crs=createMap("crs","epsg:4326");
237      hasCRS=0;
238    }
239  }
[297]240  char layers[128];
[862]241  if(layerName==NULL)
242    sprintf(layers,options[proto][3],tmpI->name);
243  else
244    sprintf(layers,options[proto][3],layerName->value);
245 
[860]246  if(format==NULL || width==NULL || height==NULL || extent==NULL){
247    char tmpStr[1024];
248    sprintf(tmpStr,_("Unable to create the mapfile for %s because of missing values."),tmpI->name);
249    errorException (m, tmpStr,
250                    "InternalError", NULL);
251    exit(-1);
252    return;
253  }
254
255  if(proto==0){
256    hasFormat=1;
257    rformat=createMap("mimeType","image/png");
258  }else{
259    if(proto==1){
260      rformat=createMap("mimeType","text/xml");
261      hasFormat=1;
262    }
263    else
264      if(proto==2){
265        rformat=createMap("mimeType","image/tiff");
266        hasFormat=1;
267        finalProto=1;
268      }
269  }
[850]270 
[860]271  char* webService_url=(char*)malloc((strlen(msUrl->value)+strlen(rformat->value)+strlen(tmpI->name)+strlen(width->value)+strlen(height->value)+strlen(extent->value)+256)*sizeof(char));
272
273
[357]274  if(proto>0){
[854]275    if(proto==2)
276      finalProto=1;
[851]277    sprintf(webService_url,
[860]278            "%s?map=%s/%s_%d_%s.map&request=%s&service=%s&version=%s&%s&format=%s&bbox=%s&crs=%s",
[851]279            msUrl->value,
280            dataPath->value,
281            tmpI->name,
[860]282            imyIndex,
[851]283            sid->value,
284            options[proto][2],
285            options[proto][0],
286            protoVersion,
287            layers,
288            rformat->value,
289            extent->value,
290            crs->value
291            );
292    if(datatype!=NULL && strncasecmp(datatype->value,"raster",6)==0){
[860]293      setMapArray(tmpI->content,"ref_wcs_link",imyIndex,webService_url);
[851]294    }
295    else{
[860]296      setMapArray(tmpI->content,"ref_wfs_link",imyIndex,webService_url);
[851]297    }
[850]298    proto=0;
[860]299    freeMap(&rformat);
300    free(rformat);
[850]301    rformat=createMap("mimeType","image/png");
[357]302  }
303  else{
[851]304    sprintf(webService_url,
[860]305            "%s?map=%s/%s_%d_%s.map&request=%s&service=%s&version=%s&%s&width=%s&height=%s&format=%s&bbox=%s&crs=%s",
[851]306            msUrl->value,
307            dataPath->value,
308            tmpI->name,
[860]309            imyIndex,
[851]310            sid->value,
311            options[proto][2],
312            options[proto][0],
313            protoVersion,
314            layers,
315            width->value,
316            height->value,
317            rformat->value,
318            extent->value,
319            crs->value
320            );
[860]321    setMapArray(tmpI->content,"ref_wms_link",imyIndex,webService_url);
[850]322    if(datatype!=NULL && strncasecmp(datatype->value,"raster",6)==0){
323      proto=2;
[860]324      freeMap(&rformat);
325      free(rformat);
[850]326      rformat=createMap("mimeType","image/tiff");
327    }
328    else{
329      proto=1;
[860]330      freeMap(&rformat);
331      free(rformat);
[850]332      rformat=createMap("mimeType","text/xml");
333    }
[357]334  }
[860]335  setMapArray(tmpI->content,"Reference",imyIndex,webService_url);
[854]336  memset(layers,0,128);
337  sprintf(layers,options[proto][3],tmpI->name);
[850]338  protoVersion=options[proto][1];
[860]339  extent=getMapArray(tmpI->content,options[proto][4],imyIndex);
[850]340  memset(webService_url,0,strlen(webService_url));
341  if(proto>0){
[854]342    if(proto==2)
343      finalProto=1;
[851]344    sprintf(webService_url,
[860]345            "%s?map=%s/%s_%d_%s.map&request=%s&service=%s&version=%s&%s&format=%s&bbox=%s&crs=%s",
[851]346            msUrl->value,
347            dataPath->value,
348            tmpI->name,
[860]349            imyIndex,
[851]350            sid->value,
351            options[proto][2],
352            options[proto][0],
353            protoVersion,
354            layers,
355            rformat->value,
356            extent->value,
357            crs->value
358            );
359    if(datatype!=NULL && strncasecmp(datatype->value,"raster",6)==0){
[860]360      setMapArray(tmpI->content,"ref_wcs_link",imyIndex,webService_url);
[851]361    }
362    else{
[860]363      setMapArray(tmpI->content,"ref_wfs_link",imyIndex,webService_url);
[851]364    }
365  }else{
366    sprintf(webService_url,
[860]367            "%s?map=%s/%s_%d_%s.map&request=%s&service=%s&version=%s&%s&width=%s&height=%s&format=%s&bbox=%s&crs=%s",
[851]368            msUrl->value,
369            dataPath->value,
370            tmpI->name,
[860]371            imyIndex,
[851]372            sid->value,
373            options[proto][2],
374            options[proto][0],
375            protoVersion,
376            layers,
377            width->value,
378            height->value,
379            rformat->value,
380            extent->value,
381            crs->value
382            );
[860]383    setMapArray(tmpI->content,"ref_wms_link",imyIndex,webService_url);
[850]384  }
[854]385  if(finalProto>0){
386    proto=3;
387    memset(layers,0,128);
388    sprintf(layers,options[proto][3],tmpI->name);
389    protoVersion=options[proto][1];
[860]390    extent=getMapArray(tmpI->content,options[proto][4],imyIndex);
[854]391    memset(webService_url,0,strlen(webService_url));
[860]392    freeMap(&rformat);
393    free(rformat);
394    rformat=createMap("value","image/tiff");
[854]395    sprintf(webService_url,
[860]396            "%s?map=%s/%s_%d_%s.map&request=%s&service=%s&version=%s&%s&format=%s&bbox=%s&crs=%s",
[854]397            msUrl->value,
398            dataPath->value,
399            tmpI->name,
[860]400            imyIndex,
[854]401            sid->value,
402            options[proto][2],
403            options[proto][0],
404            protoVersion,
405            layers,
406            rformat->value,
407            extent->value,
408            crs->value
409            );
[860]410    setMapArray(tmpI->content,"ref_wcs_preview_link",imyIndex,webService_url);
[854]411  }
[402]412  if(hasCRS==0){
413    freeMap(&crs);
414    free(crs);
415  }
[851]416  freeMap(&rformat);
417  free(rformat);
[492]418  free(webService_url);
[297]419}
420
421/**
[586]422 * Set projection for a layer in a MAPFILE using Authority Code and Name if
423 * available or fallback to proj4 definition if available or fallback to
424 * default EPSG:4326
425 *
426 * @param output the output maps
427 * @param m the opened mapObj
428 * @param myLayer the layerObj
429 * @param pszProjection a char* containing the SRS definition in WKT format
[297]430 */
431void setSrsInformations(maps* output,mapObj* m,layerObj* myLayer,
432                        char* pszProjection){
433  OGRSpatialReferenceH  hSRS;
434  map* msSrs=NULL;
[860]435  int imyIndex=getPublishedId(output);
[297]436  hSRS = OSRNewSpatialReference(NULL);
[451]437  if( pszProjection!=NULL && strlen(pszProjection)>1){
438    if(OSRImportFromWkt( hSRS, &pszProjection ) == CE_None ){
439      char *proj4Str=NULL;
440      if(OSRGetAuthorityName(hSRS,NULL)!=NULL && 
441         OSRGetAuthorityCode(hSRS,NULL)!=NULL){
442        char tmpSrs[20];
443        sprintf(tmpSrs,"%s:%s",
444                OSRGetAuthorityName(hSRS,NULL),OSRGetAuthorityCode(hSRS,NULL));
445        msLoadProjectionStringEPSG(&m->projection,tmpSrs);
446        msLoadProjectionStringEPSG(&myLayer->projection,tmpSrs);
447       
448        char tmpSrss[256];
[776]449        sprintf(tmpSrss,"EPSG:4326 EPSG:900913 EPSG:3857 %s",tmpSrs);
[451]450       
451        msInsertHashTable(&(m->web.metadata), "ows_srs", tmpSrss);
452        msInsertHashTable(&(myLayer->metadata), "ows_srs", tmpSrss);
453       
[297]454#ifdef DEBUGMS
[451]455        fprintf(stderr,"isGeo %b\n\n",OSRIsGeographic(hSRS)==TRUE);
[297]456#endif
[451]457        if(output!=NULL){
[297]458          if(OSRIsGeographic(hSRS)==TRUE)
[860]459            setMapArray(output->content,"crs_isGeographic",imyIndex,"true");
[297]460          else
[860]461            setMapArray(output->content,"crs_isGeographic",imyIndex,"false");
462          setMapArray(output->content,"crs",imyIndex,tmpSrs);
[297]463        }
464      }
465      else{
[451]466        OSRExportToProj4(hSRS,&proj4Str);
[475]467        if(proj4Str!=NULL && strlen(proj4Str)>0){
[451]468#ifdef DEBUGMS
469          fprintf(stderr,"PROJ (%s)\n",proj4Str);
470#endif
471          msLoadProjectionString(&(m->projection),proj4Str);
472          msLoadProjectionString(&(myLayer->projection),proj4Str);
473          if(output!=NULL){ 
474            if(OSRIsGeographic(hSRS)==TRUE)
[860]475              setMapArray(output->content,"crs_isGeographic",imyIndex,"true");
[451]476            else
[860]477              setMapArray(output->content,"crs_isGeographic",imyIndex,"false");
[451]478          }
[492]479          free(proj4Str);
[451]480        }
481        else{
482          msLoadProjectionStringEPSG(&m->projection,"EPSG:4326");
483          msLoadProjectionStringEPSG(&myLayer->projection,"EPSG:4326");
484          if(output!=NULL){
[860]485            setMapArray(output->content,"crs_isGeographic",imyIndex,"true");
[451]486          }
487        }
[297]488        if(output!=NULL){
[860]489          setMapArray(output->content,"crs",imyIndex,"EPSG:4326");
490          setMapArray(output->content,"real_extent",imyIndex,"true");
[297]491        }
[776]492        msInsertHashTable(&(m->web.metadata),"ows_srs", "EPSG:4326 EPSG:900913 EPSG:3857");
493        msInsertHashTable(&(myLayer->metadata),"ows_srs","EPSG:4326 EPSG:900913 EPSG:3857");
[297]494      }
495    }
496  }
497  else{
498    if(output!=NULL){
[860]499      msSrs=getMapArray(output->content,"msSrs",imyIndex);
[297]500    }
501    if(msSrs!=NULL){
502      msLoadProjectionStringEPSG(&m->projection,msSrs->value);
[330]503      msLoadProjectionStringEPSG(&myLayer->projection,msSrs->value);
[297]504      char tmpSrs[128];
[776]505      sprintf(tmpSrs,"%s EPSG:4326 EPSG:900913 EPSG:3857",msSrs->value);
[297]506      msInsertHashTable(&(m->web.metadata),"ows_srs",tmpSrs);
507      msInsertHashTable(&(myLayer->metadata),"ows_srs",tmpSrs);
508    }else{
509      msLoadProjectionStringEPSG(&m->projection,"EPSG:4326");
[330]510      msLoadProjectionStringEPSG(&myLayer->projection,"EPSG:4326");
[776]511      msInsertHashTable(&(m->web.metadata),"ows_srs","EPSG:4326 EPSG:900913 EPSG:3857");
512      msInsertHashTable(&(myLayer->metadata),"ows_srs","EPSG:4326 EPSG:900913 EPSG:3857");
[297]513    }
[362]514    if(output!=NULL){
[860]515      setMapArray(output->content,"crs",imyIndex,msSrs->value);
516      setMapArray(output->content,"crs_isGeographic",imyIndex,"true");
[362]517    }
[297]518  }
519
520  OSRDestroySpatialReference( hSRS );
521}
522
[586]523/**
524 * Set the MAPFILE extent, the the ows_extent for the layer, add wms_extent and
525 * wfs_extent to the output maps and call setMapSize.
526 *
527 * @param output the specific output
528 * @param m the mapObj
529 * @param myLayer the layerObj
530 * @param minX the lower left x coordinate
531 * @param minY the lower left y coordinate
532 * @param maxX the upper right x coordinate
533 * @param maxY the upper right y coordinate
534 * @see setMapSize
535 */
[297]536void setMsExtent(maps* output,mapObj* m,layerObj* myLayer,
537                 double minX,double minY,double maxX,double maxY){
[860]538  int imyIndex=getPublishedId(output);
[297]539  msMapSetExtent(m,minX,minY,maxX,maxY);
[862]540  m->maxsize=4096;
[297]541#ifdef DEBUGMS
542  fprintf(stderr,"Extent %.15f %.15f %.15f %.15f\n",minX,minY,maxX,maxY);
543#endif
544  char tmpExtent[1024];
545  sprintf(tmpExtent,"%.15f %.15f %.15f %.15f",minX,minY,maxX,maxY);
546#ifdef DEBUGMS
547  fprintf(stderr,"Extent %s\n",tmpExtent);
548#endif
549  msInsertHashTable(&(myLayer->metadata), "ows_extent", tmpExtent);
550 
551  if(output!=NULL){
[860]552    map* test=getMapArray(output->content,"real_extent",imyIndex);
553    pointObj min, max;
554    projectionObj tempSrs;
555    min.x = m->extent.minx;
556    min.y = m->extent.miny;
557    max.x = m->extent.maxx;
558    max.y = m->extent.maxy;
559    char tmpSrsStr[1024];
560    msInitProjection(&tempSrs);
561    msLoadProjectionStringEPSG(&tempSrs,"EPSG:4326");
562
563    msProjectPoint(&(myLayer->projection),&tempSrs,&min);
564    msProjectPoint(&myLayer->projection,&tempSrs,&max);
565 
[357]566    if(test!=NULL){
567      sprintf(tmpExtent,"%.3f,%.3f,%.3f,%.3f",min.y,min.x,max.y,max.x);
[860]568      map* isGeo=getMapArray(output->content,"crs_isGeographic",imyIndex);
[434]569#ifdef DEBUGMS
[360]570      fprintf(stderr,"isGeo = %s\n",isGeo->value);
[434]571#endif
[860]572      if(isGeo!=NULL && strcasecmp("true",isGeo->value)==0){
573        sprintf(tmpExtent,"%.3f,%.3f,%.3f,%.3f",min.y,min.x,max.y,max.x);
574        setMapArray(output->content,"wgs84_extent",imyIndex,tmpExtent);
[360]575        sprintf(tmpExtent,"%f,%f,%f,%f", minY,minX, maxY, maxX);
[860]576      }else{
577        sprintf(tmpExtent,"%.3f,%.3f,%.3f,%.3f",min.x,min.y,max.x,max.y);
578        setMapArray(output->content,"wgs84_extent",imyIndex,tmpExtent);
579      }
580      setMapArray(output->content,"wms_extent",imyIndex,tmpExtent);
[360]581      sprintf(tmpSrsStr,"%.3f,%.3f,%.3f,%.3f",min.x,min.y,max.x,max.y);
[860]582      setMapArray(output->content,"wcs_extent",imyIndex,tmpExtent);
[357]583    }else{
[860]584      sprintf(tmpExtent,"%.3f,%.3f,%.3f,%.3f",min.x,min.y,max.x,max.y);
585      setMapArray(output->content,"wgs84_extent",imyIndex,tmpExtent);
[357]586      sprintf(tmpExtent,"%f,%f,%f,%f",minX, minY, maxX, maxY);
[860]587      map* isGeo=getMapArray(output->content,"crs_isGeographic",imyIndex);
[402]588      if(isGeo!=NULL){
[434]589#ifdef DEBUGMS
[402]590        fprintf(stderr,"isGeo = %s\n",isGeo->value);
[434]591#endif
[402]592        if(isGeo!=NULL && strcasecmp("true",isGeo->value)==0)
593          sprintf(tmpExtent,"%f,%f,%f,%f", minY,minX, maxY, maxX);
594      }
[860]595      setMapArray(output->content,"wms_extent",imyIndex,tmpExtent); 
[357]596      sprintf(tmpExtent,"%.3f,%.3f,%.3f,%.3f",minX,minY,maxX,maxY);
[860]597      setMapArray(output->content,"wcs_extent",imyIndex,tmpExtent);
[357]598    }
[297]599  }
600
601  setMapSize(output,minX,minY,maxX,maxY);
602}
603
[586]604/**
605 * Try to open a vector output and define the corresponding layer in the MAPFILE
606 *
607 * @param conf the conf maps containing the main.cfg settings
608 * @param output the specific output maps
609 * @param m the mapObj
610 */
[297]611int tryOgr(maps* conf,maps* output,mapObj* m){
[860]612  int imyIndex=getPublishedId(output);
613  map* tmpMap=getMapArray(output->content,"storage",imyIndex);
[297]614  char *pszDataSource=tmpMap->value;
615
616  /**
617   * Try to open the DataSource using OGR
618   */
619  OGRRegisterAll();
620  /**
621   * Try to load the file as ZIP
[854]622   *
[364]623  OGRDataSourceH poDS1 = NULL;
[297]624  OGRSFDriverH *poDriver1 = NULL;
625  char *dsName=(char*)malloc((8+strlen(pszDataSource)+1)*sizeof(char));
[453]626  char *odsName=zStrdup(pszDataSource);
627  char *sdsName=zStrdup(pszDataSource);
[623]628  char *demo=".data";
[297]629  sdsName[strlen(sdsName)-(strlen(demo)-1)]='d';
630  sdsName[strlen(sdsName)-(strlen(demo)-2)]='i';
631  sdsName[strlen(sdsName)-(strlen(demo)-3)]='r';
632  sdsName[strlen(sdsName)-(strlen(demo)-4)]=0;
633
634  odsName[strlen(odsName)-(strlen(demo)-1)]='z';
635  odsName[strlen(odsName)-(strlen(demo)-2)]='i';
636  odsName[strlen(odsName)-(strlen(demo)-3)]='p';
637  odsName[strlen(odsName)-(strlen(demo)-4)]=0;
638  sprintf(dsName,"/vsizip/%s",odsName);
639
640#ifdef DEBUGMS
641  fprintf(stderr,"Try loading %s, %s, %s\n",dsName,odsName,dsName);
642#endif
643
644  FILE* file = fopen(pszDataSource, "rb");
645  FILE* fileZ = fopen(odsName, "wb");
[492]646  free(odsName);
[297]647  fseek(file, 0, SEEK_END);
648  unsigned long fileLen=ftell(file);
649  fseek(file, 0, SEEK_SET);
650  char *buffer=(char *)malloc(fileLen+1);
651  fread(buffer, fileLen, 1, file);
652  fwrite(buffer,fileLen, 1, fileZ);
653  fclose(file);
654  fclose(fileZ);
655  free(buffer);
[434]656#ifdef DEBUGMS
[297]657  fprintf(stderr,"Try loading %s",dsName);
[434]658#endif
[297]659  poDS1 = OGROpen( dsName, FALSE, poDriver1 );
660  if( poDS1 == NULL ){
661    fprintf(stderr,"Unable to access the DataSource as ZIP File\n");
662    setMapInMaps(conf,"lenv","message","Unable to open datasource in read only mode");
[854]663    fprintf(stderr,"Remove ZIP File!\n");
664    unlink(odsName);
[839]665    //OGR_DS_Destroy(poDS1);
[297]666  }else{
[434]667#ifdef DEBUGMS
[297]668    fprintf(stderr,"The DataSource is a  ZIP File\n");
[434]669#endif
[297]670    char** demo=VSIReadDir(dsName);
671    int i=0;
[453]672    zMkdir(sdsName
[364]673#ifndef WIN32
674                ,S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH
675#endif
676                );
[297]677    while(demo[i]!=NULL){
[434]678#ifdef DEBUGMS
[297]679      fprintf(stderr,"ZIP File content : %s\n",demo[i]);
[434]680#endif
[297]681      char *tmpDs=(char*)malloc((strlen(dsName)+strlen(demo[i])+2)*sizeof(char));
682      sprintf(tmpDs,"%s/%s",dsName,demo[i]);
683      fprintf(stderr,"read : %s\n",tmpDs);
684     
685      VSILFILE* vsif=VSIFOpenL(tmpDs,"rb");
[434]686#ifdef DEBUGMS
[297]687      fprintf(stderr,"open : %s\n",tmpDs);
[434]688#endif
[297]689      VSIFSeekL(vsif,0,SEEK_END);
[453]690      vsi_l_offset size=VSIFTellL(vsif);
[434]691#ifdef DEBUGMS
[297]692      fprintf(stderr,"size : %d\n",size);
[434]693#endif
[297]694      VSIFSeekL(vsif,0,SEEK_SET);
[453]695      char *vsifcontent=(char*) malloc(((int)size+1)*sizeof(char));
696      VSIFReadL(vsifcontent,1,(size_t)size,vsif);
[297]697      char *fpath=(char*) malloc((strlen(sdsName)+strlen(demo[1])+2)*sizeof(char));
698      sprintf(fpath,"%s/%s",sdsName,demo[i]);
[453]699      int f=zOpen(fpath,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
700      zWrite(f,vsifcontent,(int)size);
[297]701      close(f);
702      chmod(fpath,S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
703      char* tmpP=strstr(fpath,".shp");
704      if(tmpP==NULL)
705        tmpP=strstr(fpath,".SHP");
706      if(tmpP!=NULL){
[434]707#ifdef DEBUGMS
[297]708        fprintf(stderr,"*** DEBUG %s\n",strstr(tmpP,"."));
[434]709#endif
[297]710        if( strcmp(tmpP,".shp")==0 || strcmp(tmpP,".SHP")==0 ){
711          tmpMap=getMap(output->content,"storage");
712          free(tmpMap->value);
713          tmpMap->value=(char*) malloc((strlen(fpath)+1)*sizeof(char));
714          sprintf(tmpMap->value,"%s",fpath);
715          pszDataSource=tmpMap->value;
[434]716#ifdef DEBUGMS
[297]717          fprintf(stderr,"*** DEBUG %s\n",pszDataSource);
[434]718#endif
[297]719        }
720      }
721      VSIFCloseL(vsif);
722      i++;
723    }
[851]724    OGR_DS_Destroy(poDS1);
[854]725    }
[492]726  free(sdsName);
[854]727  free(dsName);*/
[850]728 
[364]729  OGRDataSourceH poDS = NULL;
[297]730  OGRSFDriverH *poDriver = NULL;
731  poDS = OGROpen( pszDataSource, FALSE, poDriver );
732  if( poDS == NULL ){
733#ifdef DEBUGMS
734    fprintf(stderr,"Unable to access the DataSource %s\n",pszDataSource);
735#endif
736    setMapInMaps(conf,"lenv","message","Unable to open datasource in read only mode");
737#ifdef DEBUGMS
738    fprintf(stderr,"Unable to access the DataSource, exit! \n"); 
739#endif
740    return -1;
741  }
742
[860]743  setMapArray(output->content,"geodatatype",imyIndex,"vector");
[297]744  int iLayer = 0;
745  for( iLayer=0; iLayer < OGR_DS_GetLayerCount(poDS); iLayer++ ){
[364]746    OGRLayerH poLayer = OGR_DS_GetLayer(poDS,iLayer);
[297]747
748    if( poLayer == NULL ){
749#ifdef DEBUGMS
750      fprintf(stderr,"Unable to access the DataSource Layer \n");
751#endif
752      setMapInMaps(conf,"lenv","message","Unable to open datasource in read only mode");
753      return -1;
754    }
755
756    /**
757     * Add a new layer set name, data
758     */
[862]759    layerObj* myLayer=NULL;
760    if(getMapArray(output->content,"msInclude",imyIndex)==NULL){
761      if(msGrowMapLayers(m)==NULL){
762        return -1;
763      }
764      if(initLayer((m->layers[m->numlayers]), m) == -1){
765        return -1;
766      }
767      myLayer=m->layers[m->numlayers];
768    }else{
769      myLayer=m->layers[m->numlayers-1];
[297]770    }
[862]771   
[434]772#ifdef DEBUGMS
[297]773    dumpMaps(output);
[434]774#endif
[453]775    myLayer->name = zStrdup(output->name);
[297]776    myLayer->tileitem=NULL;
[453]777    myLayer->data = zStrdup(OGR_L_GetName(poLayer));
778    myLayer->connection = zStrdup(pszDataSource);
[297]779    myLayer->index = m->numlayers;
780    myLayer->dump = MS_TRUE;
781    myLayer->status = MS_ON;
782    msConnectLayer(myLayer,MS_OGR,pszDataSource);
783
[860]784    addIntToMapArray(output->content,"nb_features",imyIndex,OGR_L_GetFeatureCount(poLayer,1));
[854]785
[297]786    /**
787     * Detect the Geometry Type or use Polygon
788     */
789    if(OGR_L_GetGeomType(poLayer) != wkbUnknown){
790      switch(OGR_L_GetGeomType(poLayer)){
791      case wkbPoint:
792      case wkbMultiPoint:
793      case wkbPoint25D:
794      case wkbMultiPoint25D:
795#ifdef DEBUGMS
796        fprintf(stderr,"POINT DataSource Layer \n");
797#endif
798        myLayer->type = MS_LAYER_POINT;
799        break;
800      case wkbLineString :
801      case wkbMultiLineString :
802      case wkbLineString25D:
803      case wkbMultiLineString25D:
804#ifdef DEBUGMS
805        fprintf(stderr,"LINE DataSource Layer \n");
806#endif
807        myLayer->type = MS_LAYER_LINE;
808        break;
809      case wkbPolygon:
810      case wkbMultiPolygon:
811      case wkbPolygon25D:
812      case wkbMultiPolygon25D:
813#ifdef DEBUGMS
814        fprintf(stderr,"POLYGON DataSource Layer \n");
815#endif
816        myLayer->type = MS_LAYER_POLYGON;
817        break;
818      default:
819        myLayer->type = MS_LAYER_POLYGON;
820        break;
821      }
822    }else
823      myLayer->type = MS_LAYER_POLYGON;
824
825    /**
826     * Detect spatial reference or use WGS84
827     */
828    OGRSpatialReferenceH srs=OGR_L_GetSpatialRef(poLayer);
829    if(srs!=NULL){
830      char *wkt=NULL;
831      OSRExportToWkt(srs,&wkt);
832      setSrsInformations(output,m,myLayer,wkt);
[492]833      free(wkt);
[297]834    }
835    else{
[860]836      setMapArray(output->content,"crs",imyIndex,"EPSG:4326");
837      setMapArray(output->content,"crs_isGeographic",imyIndex,"true");
[297]838      msLoadProjectionStringEPSG(&m->projection,"EPSG:4326");
[776]839      msInsertHashTable(&(m->web.metadata), "ows_srs", "EPSG:4326 EPSG:900913 EPSG:3857");
840      msInsertHashTable(&(myLayer->metadata), "ows_srs", "EPSG:4326 EPSG:900913 EPSG:3857");
[297]841    }
842
843    OGREnvelope oExt;
844    if (OGR_L_GetExtent(poLayer,&oExt, TRUE) == OGRERR_NONE){
845      setMsExtent(output,m,myLayer,oExt.MinX, oExt.MinY, oExt.MaxX, oExt.MaxY);
[839]846      char extent[1024];
847      memset(&extent,0,1024);
848      sprintf(extent,"%d,%d,%d,%d",oExt.MinX, oExt.MinY, oExt.MaxX, oExt.MaxY);
[860]849      setMapArray(output->content,"boundingbox",imyIndex,extent);
[297]850    }
851 
852    /**
853     * Detect the FID column or use the first attribute field as FID
854     */
[364]855    char *fid=(char*)OGR_L_GetFIDColumn(poLayer);
[297]856    if(strlen(fid)==0){
857      OGRFeatureDefnH def=OGR_L_GetLayerDefn(poLayer);
858      int fIndex=0;
859      for(fIndex=0;fIndex<OGR_FD_GetFieldCount(def);fIndex++){
860        OGRFieldDefnH fdef=OGR_FD_GetFieldDefn(def,fIndex);
[364]861        fid=(char*)OGR_Fld_GetNameRef(fdef);
[297]862        break;
863      }
864    }
865    msInsertHashTable(&(myLayer->metadata), "gml_featureid", fid);
866    msInsertHashTable(&(myLayer->metadata), "gml_include_items", "all");
867    msInsertHashTable(&(myLayer->metadata), "ows_name", output->name);
[860]868    map* tmpMap=getMapArray(output->content,"title",imyIndex);
[297]869    if(tmpMap!=NULL)
870      msInsertHashTable(&(myLayer->metadata), "ows_title", tmpMap->value);
871    else
872      msInsertHashTable(&(myLayer->metadata), "ows_title", "Default Title");
[862]873
874    if(getMapArray(output->content,"msInclude",imyIndex)==NULL){
875      if(msGrowLayerClasses(myLayer) == NULL)
876        return -1;
877      if(initClass((myLayer->CLASS[myLayer->numclasses])) == -1)
878        return -1;
879      if(msGrowClassStyles(myLayer->CLASS[myLayer->numclasses]) == NULL)
880        return -1;
881      if(initStyle(myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]) == -1)
882        return -1;
[297]883      /**
[862]884       * Apply msStyle else fallback to the default style
[297]885       */
[862]886      tmpMap=getMap(output->content,"msStyle");
887      if(tmpMap!=NULL)
888        msUpdateStyleFromString(myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles],tmpMap->value,0);
889      else{
890        /**
891         * Set style
892         */
893        myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->color.red=125;
894        myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->color.green=125;
895        myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->color.blue=255;
896        myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->outlinecolor.red=80;
897        myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->outlinecolor.green=80;
898        myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->outlinecolor.blue=80;
899       
900        /**
901         * Set specific style depending on type
902         */
903        if(myLayer->type == MS_LAYER_POLYGON)
904          myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->width=3;
905        if(myLayer->type == MS_LAYER_LINE){
906          myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->width=3;
907          myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->outlinewidth=1.5;
908        }
909        if(myLayer->type == MS_LAYER_POINT){
910          myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->symbol=1;
911          myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->size=15;
912        }
913       
[297]914      }
[862]915      myLayer->CLASS[myLayer->numclasses]->numstyles++;
916      myLayer->numclasses++;
[379]917   
[862]918      m->layerorder[m->numlayers] = m->numlayers;
919      m->numlayers++;
[297]920
[862]921    }
[297]922  }
[851]923  OGR_DS_Destroy(poDS);
[839]924  //OGRCleanupAll();
[297]925
926  return 1;
927}
928
[586]929/**
930 * Try to open a raster output and define the corresponding layer in the MAPFILE
931 *
932 * @param conf the conf maps containing the main.cfg settings
933 * @param output the specific output maps
934 * @param m the mapObj
935 */
[297]936int tryGdal(maps* conf,maps* output,mapObj* m){
[860]937  int imyIndex=getPublishedId(output);
938  map* tmpMap=getMapArray(output->content,"storage",imyIndex);
[297]939  char *pszFilename=tmpMap->value;
940  GDALDatasetH hDataset;
941  GDALRasterBandH hBand;
942  double adfGeoTransform[6];
943  int i, iBand;
944 
945  /**
946   * Try to open the DataSource using GDAL
947   */
948  GDALAllRegister();
[854]949  hDataset = GDALOpen( pszFilename, GA_Update );
[297]950  if( hDataset == NULL ){
951#ifdef DEBUGMS
[366]952    fprintf(stderr,"Unable to access the DataSource %s \n",pszFilename);
[297]953#endif
[860]954    setMapArray(output->content,"geodatatype",imyIndex,"other");
[297]955    setMapInMaps(conf,"lenv","message","gdalinfo failed - unable to open");
956    GDALDestroyDriverManager();
957    return -1;
958  }
959#ifdef DEBUGMS
[451]960  fprintf(stderr,"Accessing the DataSource %s %d\n",pszFilename,__LINE__);
[297]961#endif
962
[860]963  setMapArray(output->content,"geodatatype",imyIndex,"raster");
[297]964  /**
965   * Add a new layer set name, data
966   */
967  if(msGrowMapLayers(m)==NULL){
968    return -1;
969  }
970  if(initLayer((m->layers[m->numlayers]), m) == -1){
971    return -1;
972  }
[451]973  m->layers[m->numlayers]->index=m->numlayers;
[297]974
975  layerObj* myLayer=m->layers[m->numlayers];
[453]976  myLayer->name = zStrdup(output->name);
[297]977  myLayer->tileitem=NULL;
[453]978  myLayer->data = zStrdup(pszFilename);
[297]979  myLayer->index = m->numlayers;
980  myLayer->dump = MS_TRUE;
981  myLayer->status = MS_ON;
982  myLayer->type = MS_LAYER_RASTER;
983
984  char *title=output->name;
[860]985  tmpMap=getMapArray(output->content,"title",imyIndex);
[297]986  if(tmpMap!=NULL)
987    title=tmpMap->value;
988  char *abstract=output->name;
[860]989  tmpMap=getMapArray(output->content,"abstract",imyIndex);
[297]990  if(tmpMap!=NULL)
991    abstract=tmpMap->value;
[451]992
[297]993  msInsertHashTable(&(myLayer->metadata), "ows_label", title);
994  msInsertHashTable(&(myLayer->metadata), "ows_title", title);
995  msInsertHashTable(&(myLayer->metadata), "ows_abstract", abstract);
996  msInsertHashTable(&(myLayer->metadata), "ows_rangeset_name", output->name);
997  msInsertHashTable(&(myLayer->metadata), "ows_rangeset_label", title);
998
999  /**
1000   * Set Map Size to the raster size
1001   */
1002  m->width=GDALGetRasterXSize( hDataset );
1003  m->height=GDALGetRasterYSize( hDataset );
[862]1004  if(m->width>4096 || m->height>4096){
1005    if(m->width>m->height)
1006      m->maxsize=m->width;
1007    else 
1008      m->maxsize=m->height;
1009  }else
1010    m->maxsize=4096;
[860]1011  addIntToMapArray(output->content,"nb_pixels",imyIndex,GDALGetRasterXSize( hDataset )*GDALGetRasterYSize( hDataset ));
[862]1012  int pixel_type=GDALGetRasterDataType( hDataset );
1013  addIntToMapArray(output->content,"pixel_data_type",imyIndex,pixel_type);
1014
1015  int outputIndex=msGetOutputFormatIndex(m,"tiff");
1016  if(outputIndex>=0){
1017    m->outputformatlist[outputIndex]->imagemode=((pixel_type==GDT_Byte)?MS_IMAGEMODE_BYTE:((pixel_type==GDT_Int16 || pixel_type==GDT_UInt16)?MS_IMAGEMODE_INT16:((pixel_type!=GDT_Float32)?MS_IMAGEMODE_FLOAT32:MS_IMAGEMODE_BYTE)));
1018    outputIndex=msGetOutputFormatIndex(m,"geotiff");
1019    m->outputformatlist[outputIndex]->imagemode=((pixel_type==GDT_Byte)?MS_IMAGEMODE_BYTE:((pixel_type==GDT_Int16 || pixel_type==GDT_UInt16)?MS_IMAGEMODE_INT16:((pixel_type!=GDT_Float32)?MS_IMAGEMODE_FLOAT32:MS_IMAGEMODE_BYTE)));   
1020  }
1021  //
1022   
[297]1023  /**
1024   * Set projection using Authority Code and Name if available or fallback to
1025   * proj4 definition if available or fallback to default EPSG:4326
1026   */
[366]1027  const char *tRef=GDALGetProjectionRef( hDataset );
1028  if( tRef != NULL && strlen(tRef)>0 ){
[297]1029    char *pszProjection;
1030    pszProjection = (char *) GDALGetProjectionRef( hDataset );
[607]1031#ifdef DEBUGMS
[297]1032    fprintf(stderr,"Accessing the DataSource %s\n",GDALGetProjectionRef( hDataset ));
[607]1033#endif
[297]1034    setSrsInformations(output,m,myLayer,pszProjection);
[453]1035  }else{
[854]1036    fprintf(stderr,"NO SRS FOUND ! %s\n",GDALGetProjectionRef( hDataset ));
1037    CPLErr sp=GDALSetProjection( hDataset , "+init=epsg:4326" );
1038    if(sp!=CE_None){
1039      fprintf(stderr,"NO SRS FOUND ! %s\n",CPLGetLastErrorMsg());
1040    }
[453]1041  }
[297]1042
1043  /**
1044   * Set extent
1045   */
1046  if( GDALGetGeoTransform( hDataset, adfGeoTransform ) == CE_None ){
1047    if( adfGeoTransform[2] == 0.0 && adfGeoTransform[4] == 0.0 ){
1048
1049      double minX = adfGeoTransform[0]
1050        + adfGeoTransform[2] * GDALGetRasterYSize(hDataset);
1051      double minY = adfGeoTransform[3]
1052        + adfGeoTransform[5] * GDALGetRasterYSize(hDataset);
1053
1054      double maxX = adfGeoTransform[0]
1055        + adfGeoTransform[1] * GDALGetRasterXSize(hDataset);
1056      double maxY = adfGeoTransform[3]
1057        + adfGeoTransform[4] * GDALGetRasterXSize(hDataset);
1058
[839]1059      setMsExtent(output,m,myLayer,minX,minY,maxX,maxY);
1060      char extent[1024];
1061      memset(&extent,0,1024);
1062      sprintf(extent,"%d,%d,%d,%d",minX,minY,maxX,maxY);
[860]1063      setMapArray(output->content,"boundingbox",imyIndex,extent);
[297]1064    }
[854]1065  }else{
1066    int scale=1;
1067    if(m->width>2048){
[860]1068      addIntToMapArray(output->content,"width",imyIndex,2048);
[854]1069      scale=2048/m->width;
1070    }else
[860]1071      addIntToMapArray(output->content,"width",imyIndex,m->width);
1072    addIntToMapArray(output->content,"height",imyIndex,m->height*scale);
[297]1073  }
1074
1075  /**
1076   * Extract information about available bands to set the bandcount and the
1077   * processing directive
1078   */
[781]1079  char nBands[3];
[839]1080  memset(&nBands,0,3);
[297]1081  int nBandsI=GDALGetRasterCount( hDataset );
[839]1082  if(nBandsI<100){
1083    sprintf(nBands,"%d",GDALGetRasterCount( hDataset ));
1084    msInsertHashTable(&(myLayer->metadata), "ows_bandcount", nBands);
1085  }
[297]1086  if(nBandsI>=3)
[854]1087    if(nBandsI==4)
1088      msLayerAddProcessing(myLayer,"BANDS=1,2,3,4");
1089    else
1090      msLayerAddProcessing(myLayer,"BANDS=1,2,3");
[297]1091  else if(nBandsI>=2)
1092    msLayerAddProcessing(myLayer,"BANDS=1,2");
1093  else
1094    msLayerAddProcessing(myLayer,"BANDS=1");
[854]1095 
[297]1096
1097  /**
1098   * Name available Bands
1099   */
[781]1100  char lBands[7];
[297]1101  char *nameBands=NULL;
1102  for( iBand = 0; iBand < nBandsI; iBand++ ){
[854]1103    memset(&lBands,0,7);
[839]1104    sprintf(lBands,"Band%d",iBand+1);   
[297]1105    if(nameBands==NULL){
1106      nameBands=(char*)malloc((strlen(lBands)+1)*sizeof(char));
1107      sprintf(nameBands,"%s",lBands);
1108    }else{
[854]1109      /*if(iBand<4)*/{
[453]1110        char *tmpS=zStrdup(nameBands);
[839]1111        nameBands=(char*)realloc(nameBands,(strlen(tmpS)+strlen(lBands)+2)*sizeof(char));
[297]1112        sprintf(nameBands,"%s %s",tmpS,lBands);
1113        free(tmpS);
1114      }
1115    }
1116  }
[839]1117  if(nameBands!=NULL){
1118    msInsertHashTable(&(myLayer->metadata), "ows_bandnames", nameBands);
1119    free(nameBands);
1120  }
1121
[297]1122  /**
[781]1123   * Loops over metadata information to setup specific information
[297]1124   */
1125  for( iBand = 0; iBand < nBandsI; iBand++ ){
[854]1126    double      pdfMin, pdfMax, pdfMean, pdfStdDev;
[297]1127    hBand = GDALGetRasterBand( hDataset, iBand+1 );
1128
1129    CPLErrorReset();
[854]1130    GDALComputeRasterStatistics( hBand, TRUE, &pdfMin, &pdfMax, &pdfMean, &pdfStdDev, NULL,NULL);
[297]1131    char tmpN[21];
1132    sprintf(tmpN,"Band%d",iBand+1);
1133    if (CPLGetLastErrorType() == CE_None){
[854]1134      char tmpMm[100],tmpMp[100];
1135      sprintf(tmpMm,"%.3f %.3f",pdfMin,pdfMax);
1136      sprintf(tmpMp,"SCALE_%d=%.3f,%.3f",iBand+1,pdfMean-(2*pdfStdDev),pdfMean+(2*pdfStdDev));
[839]1137      char tmpI[31];     
[297]1138      sprintf(tmpI,"%s_interval",tmpN);
1139      msInsertHashTable(&(myLayer->metadata), tmpI, tmpMm);
[854]1140      if(pdfMax>255)
1141        msLayerAddProcessing(myLayer,tmpMp);
[300]1142      map* test=getMap(output->content,"msClassify");
1143      if(test!=NULL && strncasecmp(test->value,"true",4)==0){
1144        /**
1145         * Classify one band raster pixel value using regular interval
1146         */
1147        int _tmpColors[10][3]={
1148          {102,153,204},
1149          {51,102,153},
1150          {102,102,204},
1151          {51,204,0},
1152          {153,255,102},
1153          {204,255,102},
1154          {102,204,153},
1155          {255,69,64},
1156          {255,192,115},
1157          {255,201,115}
1158        };
1159         
1160        if(nBandsI==1){
[854]1161          double delta=pdfMax-pdfMin;
[300]1162          double interval=delta/10;
[854]1163          double cstep=pdfMin;
[300]1164          for(i=0;i<10;i++){
1165            /**
1166             * Create a new class
1167             */
1168            if(msGrowLayerClasses(myLayer) == NULL)
[364]1169              return -1;
[370]1170            if(initClass((myLayer->CLASS[myLayer->numclasses])) == -1)
[364]1171              return -1;
[370]1172            if(msGrowClassStyles(myLayer->CLASS[myLayer->numclasses]) == NULL)
[364]1173              return -1;
[370]1174            if(initStyle(myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]) == -1)
[364]1175              return -1;
[300]1176           
1177            /**
1178             * Set class name
1179             */
1180            char className[7];
1181            sprintf(className,"class%d",i);
[453]1182            myLayer->CLASS[myLayer->numclasses]->name=zStrdup(className);
[300]1183           
1184            /**
1185             * Set expression
1186             */
1187            char expression[1024];
1188            if(i+1<10)
1189              sprintf(expression,"([pixel]>=%.3f AND [pixel]<%.3f)",cstep,cstep+interval);
1190            else
1191              sprintf(expression,"([pixel]>=%.3f AND [pixel]<=%.3f)",cstep,cstep+interval);
[370]1192            msLoadExpressionString(&myLayer->CLASS[myLayer->numclasses]->expression,expression);
[300]1193           
1194            /**
1195             * Set color
1196             */
[370]1197            myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->color.red=_tmpColors[i][0];
1198            myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->color.green=_tmpColors[i][1];
1199            myLayer->CLASS[myLayer->numclasses]->styles[myLayer->CLASS[myLayer->numclasses]->numstyles]->color.blue=_tmpColors[i][2];
[300]1200            cstep+=interval;
[370]1201            myLayer->CLASS[myLayer->numclasses]->numstyles++;
[300]1202            myLayer->numclasses++;
1203           
1204          }
1205         
1206          char tmpMm[100];
[854]1207          sprintf(tmpMm,"%.3f %.3f",pdfMin,pdfMax);
[300]1208         
[297]1209        }
1210      }
[752]1211      else{
1212        if(nBandsI==1){
1213          myLayer->offsite.red=0;
1214          myLayer->offsite.green=0;
1215          myLayer->offsite.blue=0;
1216        }
1217      }
[297]1218    }
1219    if( strlen(GDALGetRasterUnitType(hBand)) > 0 ){
[839]1220      char tmpU[31];
[297]1221      sprintf(tmpU,"%s_band_uom",tmpN);
1222      msInsertHashTable(&(myLayer->metadata), tmpU, GDALGetRasterUnitType(hBand));
1223    }
1224
1225  }
[854]1226  msLayerAddProcessing(myLayer,"RESAMPLE=BILINEAR");
[297]1227
1228  m->layerorder[m->numlayers] = m->numlayers;
1229  m->numlayers++;
1230  GDALClose( hDataset );
1231  GDALDestroyDriverManager();
1232  CPLCleanupTLS();
1233  return 1;
1234}
1235
1236/**
1237 * Create a MapFile for WMS, WFS or WCS Service output
[586]1238 *
1239 * @param conf the conf maps containing the main.cfg settings
1240 * @param outputs a specific output maps
[297]1241 */
1242void outputMapfile(maps* conf,maps* outputs){
1243  /**
[586]1244   * First store the value on disk
[297]1245   */
[860]1246  int imyIndex=getPublishedId(outputs);
1247  map* mime=getMapArray(outputs->content,"mimeType",imyIndex);
[360]1248  char *ext="data";
1249  if(mime!=NULL)
1250    if(strncasecmp(mime->value,"application/json",16)==0)
1251      ext="json";
[458]1252
[860]1253  map* storage=getMapArray(outputs->content,"storage",imyIndex);
[854]1254  if(storage==NULL){
1255    map* tmpMap=getMapFromMaps(conf,"main","dataPath");
1256    map* sidMap=getMapFromMaps(conf,"lenv","usid");
1257    char *pszDataSource=(char*)malloc((strlen(tmpMap->value)+strlen(sidMap->value)+strlen(outputs->name)+17)*sizeof(char));
[860]1258    sprintf(pszDataSource,"%s/ZOO_DATA_%d_%s_%s.%s",tmpMap->value,imyIndex,outputs->name,sidMap->value,ext);
[854]1259    int f=zOpen(pszDataSource,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
[860]1260    map *gfile=getMapArray(outputs->content,"generated_file",imyIndex);
[854]1261    if(gfile!=NULL){
1262      readGeneratedFile(conf,outputs->content,gfile->value);       
1263    }
[860]1264    map* sizeMap=getMapArray(outputs->content,"size",imyIndex);
1265    map* vData=getMapArray(outputs->content,"value",imyIndex);
[854]1266    if(sizeMap!=NULL){
1267      zWrite(f,vData->value,atoi(sizeMap->value)*sizeof(char));
1268    }
1269    else{
1270      zWrite(f,vData->value,(strlen(vData->value)+1)*sizeof(char));
1271    }
1272    close(f);
[860]1273    setMapArray(outputs->content,"storage",imyIndex,pszDataSource);
[854]1274    free(pszDataSource);
[550]1275  }
[297]1276
1277  /*
1278   * Create an empty map, set name, default size and extent
1279   */
[862]1280  map* mapfileTemplate=getMapArray(outputs->content,"msInclude",imyIndex);
1281  mapObj *myMap=NULL;
1282  if(mapfileTemplate==NULL){
1283    myMap=msNewMapObj();
1284  }
1285  else{
1286    map* dataPath=getMapFromMaps(conf,"main","dataPath");
1287    map* sid=getMapFromMaps(conf,"lenv","sid");
1288    char *mapfileTemplatePath=(char*)malloc(((strlen(dataPath->value)+strlen(sid->value)+strlen(outputs->name)+10)*sizeof(char)));
1289    sprintf(mapfileTemplatePath,"%s/%s_%s.map",dataPath->value,outputs->name,sid->value);
1290    myMap=msLoadMap(mapfileTemplate->value,mapfileTemplatePath);
1291    if(myMap==NULL){
1292      setMapInMaps(conf,"lenv","message",_("Unable to open your template mapfile!"));
1293      return ;
1294    }
1295  }
[297]1296  free(myMap->name);
[453]1297  myMap->name=zStrdup("ZOO-Project_WXS_Server");
[297]1298  msMapSetSize(myMap,2048,2048);
1299  msMapSetExtent(myMap,-1,-1,1,1);
1300 
1301  /*
1302   * Set imagepath and imageurl using tmpPath and tmpUrl from main.cfg
1303   */
1304  map *tmp1=getMapFromMaps(conf,"main","tmpPath");
[453]1305  myMap->web.imagepath=zStrdup(tmp1->value);
[297]1306  tmp1=getMapFromMaps(conf,"main","tmpUrl");
[453]1307  myMap->web.imageurl=zStrdup(tmp1->value);
[297]1308 
1309  /*
1310   * Define supported output formats
1311   */
1312  outputFormatObj *o1=msCreateDefaultOutputFormat(NULL,"AGG/PNG","png");
1313  o1->imagemode=MS_IMAGEMODE_RGBA;
1314  o1->transparent=MS_TRUE;
1315  o1->inmapfile=MS_TRUE;
1316  msAppendOutputFormat(myMap,msCloneOutputFormat(o1));
1317  msFreeOutputFormat(o1);
1318
1319#ifdef USE_KML
1320  outputFormatObj *o2=msCreateDefaultOutputFormat(NULL,"KML","kml");
[822]1321  if(!o2){
1322    perror("Unable to initialize KML driver");
1323    fprintf(stderr,"Unable to initialize KML driver !\n");
1324  }else{
1325    o2->inmapfile=MS_TRUE; 
1326    msAppendOutputFormat(myMap,msCloneOutputFormat(o2));
1327    msFreeOutputFormat(o2);
1328  }
[297]1329#endif
1330
1331  outputFormatObj *o3=msCreateDefaultOutputFormat(NULL,"GDAL/GTiff","tiff");
1332  if(!o3)
1333    fprintf(stderr,"Unable to initialize GDAL driver !\n");
1334  else{
[862]1335    o3->imagemode=MS_IMAGEMODE_INT16;
[297]1336    o3->inmapfile=MS_TRUE; 
1337    msAppendOutputFormat(myMap,msCloneOutputFormat(o3));
1338    msFreeOutputFormat(o3);
1339  }
1340
1341  outputFormatObj *o4=msCreateDefaultOutputFormat(NULL,"GDAL/AAIGRID","grd");
1342  if(!o4)
1343    fprintf(stderr,"Unable to initialize GDAL driver !\n");
1344  else{
[862]1345    o4->imagemode=MS_IMAGEMODE_BYTE;
[297]1346    o4->inmapfile=MS_TRUE; 
1347    msAppendOutputFormat(myMap,msCloneOutputFormat(o4));
1348    msFreeOutputFormat(o4);
1349  }
1350
1351#ifdef USE_CAIRO
1352  outputFormatObj *o5=msCreateDefaultOutputFormat(NULL,"CAIRO/PNG","cairopng");
1353  if(!o5)
1354    fprintf(stderr,"Unable to initialize CAIRO driver !\n");
1355  else{
1356    o5->imagemode=MS_IMAGEMODE_RGBA;
1357    o5->transparent=MS_TRUE;
1358    o5->inmapfile=MS_TRUE;
1359    msAppendOutputFormat(myMap,msCloneOutputFormat(o5));
1360    msFreeOutputFormat(o5);
1361  }
1362#endif
1363
[862]1364 
[854]1365  outputFormatObj *o6=msCreateDefaultOutputFormat(NULL,"GDAL/GTiff","geotiff");
1366  if(!o6)
1367    fprintf(stderr,"Unable to initialize GDAL driver !\n");
1368  else{
1369    o6->imagemode=MS_IMAGEMODE_BYTE;
1370    o6->mimetype=strdup("image/geotiff");
1371    o6->inmapfile=MS_TRUE;
1372    msAppendOutputFormat(myMap,msCloneOutputFormat(o6));
1373    msFreeOutputFormat(o6);
1374  }
1375
[862]1376 
[297]1377  /*
1378   * Set default projection to EPSG:4326
1379   */
1380  msLoadProjectionStringEPSG(&myMap->projection,"EPSG:4326");
1381  myMap->transparent=1;
1382
[364]1383  /*
1384   * Set mapserver PROJ_LIB/GDAL_DATA or any other config parameter from
1385   * the main.cfg [mapserver] section if any
1386   */
1387  maps *tmp3=getMaps(conf,"mapserver");
1388  if(tmp3!=NULL){
1389    map* tmp4=tmp3->content;
1390    while(tmp4!=NULL){
1391      msSetConfigOption(myMap,tmp4->name,tmp4->value);
1392      tmp4=tmp4->next;
1393    }
1394  }
1395
[297]1396  /**
1397   * Set a ows_rootlayer_title, 
1398   */
1399  if (msInsertHashTable(&(myMap->web.metadata), "ows_rootlayer_name", "ZOO_Project_Layer") == NULL){
1400#ifdef DEBUGMS
1401    fprintf(stderr,"Unable to add metadata");
1402#endif
1403    return;
1404  }
1405  if (msInsertHashTable(&(myMap->web.metadata), "ows_rootlayer_title", "ZOO_Project_Layer") == NULL){
1406#ifdef DEBUGMS
1407    fprintf(stderr,"Unable to add metadata");
1408#endif
1409    return;
1410  }
1411
1412  /**
1413   * Enable all the WXS requests using ows_enable_request
1414   * see http://mapserver.org/trunk/development/rfc/ms-rfc-67.html
1415   */
1416  if (msInsertHashTable(&(myMap->web.metadata), "ows_enable_request", "*") == NULL){
1417#ifdef DEBUGMS
1418    fprintf(stderr,"Unable to add metadata");
1419#endif
1420    return;
1421  }
1422  msInsertHashTable(&(myMap->web.metadata), "ows_srs", "EPSG:4326");
1423
[865]1424  /**
1425   * Set metadata extracted from main.cfg file maps
1426   */
1427  maps* cursor=conf;
1428  map* correspondance=getCorrespondance();
1429  while(cursor!=NULL){
1430    if(strstr(cursor->name,"_help")==NULL){
1431      map* _cursor=cursor->content;
1432      map* vMap;
1433      while(_cursor!=NULL){
1434        if((vMap=getMap(correspondance,_cursor->name))!=NULL){
1435          if (msInsertHashTable(&(myMap->web.metadata), vMap->value, _cursor->value) == NULL){
1436#ifdef DEBUGMS
1437            fprintf(stderr,"Unable to add metadata");
1438#endif
1439            freeMap(&correspondance);
1440            free(correspondance);
1441            return;
1442          }
1443        }
1444        _cursor=_cursor->next;
1445      }
1446    }
1447    cursor=cursor->next;
1448  }
1449  freeMap(&correspondance);
1450  free(correspondance);
1451
1452
[297]1453  if(tryOgr(conf,outputs,myMap)<0)
1454    if(tryGdal(conf,outputs,myMap)<0)
[364]1455      return ;
[297]1456
1457  tmp1=getMapFromMaps(conf,"main","dataPath");
1458  char *tmpPath=(char*)malloc((13+strlen(tmp1->value))*sizeof(char));
1459  sprintf(tmpPath,"%s/symbols.sym",tmp1->value);
1460  msInitSymbolSet(&myMap->symbolset);
[453]1461  myMap->symbolset.filename=zStrdup(tmpPath);
[297]1462  free(tmpPath);
1463
[453]1464  map* sid=getMapFromMaps(conf,"lenv","usid");
[297]1465  char *mapPath=
[860]1466    (char*)malloc((14+strlen(sid->value)+strlen(outputs->name)+strlen(tmp1->value))*sizeof(char));
1467  sprintf(mapPath,"%s/%s_%d_%s.map",tmp1->value,outputs->name,imyIndex,sid->value);
[297]1468  msSaveMap(myMap,mapPath);
[862]1469  saveMapNames(conf,outputs,mapPath);
[492]1470  free(mapPath);
[862]1471  //free(myMap->symbolset.filename);
[854]1472  //msFreeSymbolSet(&myMap->symbolset);
1473  msFreeMap(myMap);
1474  //msFree(myMap);
[492]1475  msGDALCleanup();
[297]1476}
1477
[862]1478/**
1479 * Save the map fullpath in a text file (.maps)
1480 * @param conf the main configuration map pointer
1481 * @param output the current output for which a mapfile has been generated
1482 * @param mapfile the mapfile saved to store in the text file
1483 */
1484void saveMapNames(maps* conf,maps* output,char* mapfile){
1485  map* storage=getMap(output->content,"storage");
1486  char *tmp=zStrdup(storage->value);
1487  tmp[strlen(tmp)-strlen(strrchr(tmp,'.'))]=0;
1488  char* mapName=(char*)malloc((strlen(tmp)+6)*sizeof(char*));
1489  sprintf(mapName,"%s.maps",tmp);
1490  FILE* myMaps=fopen(mapName,"a");
1491  if(myMaps!=NULL){
1492    fprintf(myMaps,"%s\n",mapfile);
1493    fclose(myMaps);
1494  } 
1495}
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png