source: trunk/zoo-services/gdal/profile/service.c @ 102

Last change on this file since 102 was 102, checked in by djay, 13 years ago

Update the Profile service to release memory after using it. Special thanks to Luiz Mota for pointing out those not-freed blocks.

  • Property svn:executable set to *
File size: 6.1 KB
Line 
1/* ****************************************************************************
2 * $Id$
3 *
4 * Project:  GdalExtractProfile
5 * Purpose:  Extract Profile from a Raster file for an Input Geometry (LINE)
6 * Author:   Gérald Fenoy, gerald.fenoy@geolabs.fr
7 *
8 * ****************************************************************************
9 * Copyright (c) 2010-2011, GeoLabs SARL
10 *
11 * Permission is hereby granted, free of charge, to any person obtaining a
12 * copy of this software and associated documentation files (the "Software"),
13 * to deal in the Software without restriction, including without limitation
14 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 * and/or sell copies of the Software, and to permit persons to whom the
16 * Software is furnished to do so, subject to the following conditions:
17 *
18 * The above copyright notice and this permission notice shall be included
19 * in all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 * DEALINGS IN THE SOFTWARE.
28 ****************************************************************************/
29
30#ifdef ZOO_SERVICE
31#include "service.h"
32#include "service_internal.h"
33#endif
34#include "gdal.h"
35#include "cpl_conv.h"
36#include "ogr_api.h"
37
38#ifdef ZOO_SERVICE
39extern "C" {
40#endif
41
42#ifdef ZOO_SERVICE
43int GdalExtractProfile(maps*& conf,maps*& inputs,maps*& outputs)
44#else
45int main(int argc,char** argv)
46#endif
47{
48  char *pszFilename;
49#ifdef ZOO_SERVICE
50  map* tmp=NULL;
51  map* tmp1=NULL;
52  tmp=getMapFromMaps(conf,"main","dataPath");
53  tmp1=getMapFromMaps(inputs,"RasterFile","value");
54  pszFilename=(char *)malloc((2+strlen(tmp->value)+strlen(tmp1->value))*sizeof(char));
55  sprintf(pszFilename,"%s/%s",tmp->value,tmp1->value);
56#else
57  pszFilename=argv[1];
58#endif
59  GDALDatasetH  hDataset; 
60  GDALAllRegister();
61  OGRRegisterAll();
62 
63  hDataset = GDALOpen( pszFilename, GA_ReadOnly );
64  free(pszFilename);
65  if( hDataset != NULL )
66    {
67      GDALDriverH   hDriver;
68      double        adfGeoTransform[6];
69
70      if( GDALGetGeoTransform( hDataset, adfGeoTransform ) == CE_None )
71        {
72
73
74        GDALRasterBandH hBand;
75        int             nBlockXSize, nBlockYSize;
76        int             bGotMin, bGotMax;
77        double          adfMinMax[2];
78       
79        hBand = GDALGetRasterBand( hDataset, 1 );
80
81        adfMinMax[0] = GDALGetRasterMinimum( hBand, &bGotMin );
82        adfMinMax[1] = GDALGetRasterMaximum( hBand, &bGotMax );
83        if( ! (bGotMin && bGotMax) )
84            GDALComputeRasterMinMax( hBand, TRUE, adfMinMax );
85
86#ifdef ZOO_SERVICE
87          tmp1=getMapFromMaps(inputs,"Geometry","value");
88          OGRGeometryH geometry=OGR_G_CreateGeometryFromJson(tmp1->value);
89#else
90          OGRGeometryH geometry=OGR_G_CreateGeometryFromJson(argv[2]);
91#endif
92          OGR_G_Segmentize(geometry, adfGeoTransform[1]);
93          int nbGeom=OGR_G_GetPointCount(geometry);
94          int k=0;
95          double ppx=0,ppy=0;
96          double value;
97          char *buffer=NULL;
98          int length=0;
99          buffer=(char*)malloc(37*sizeof(char));
100          sprintf(buffer,"{\"type\":\"LineString\",\"coordinates\":[");
101          length+=strlen(buffer);
102          for(k=0;k<nbGeom;k++){
103            //OGRGeometryH point;
104            double prx,pry,prz;
105            OGR_G_GetPoint(geometry,k,&prx,&pry,&prz);
106            float *pafScanline;
107            pafScanline = (float *) CPLMalloc(sizeof(float));
108            int px=(int)floor((prx-adfGeoTransform[0])/adfGeoTransform[1]);
109            int py=(int)floor((pry-adfGeoTransform[3])/adfGeoTransform[5]);
110            if(px!=ppx || py!=ppy){
111              if(GDALRasterIO( hBand, GF_Read, px, py, 1, 1, 
112                            pafScanline, 1, 1, GDT_Float32, 
113                               0, 0 ) != CE_None){
114                char *tmp;
115                tmp=(char*) malloc(300*sizeof(char));
116                sprintf(tmp,"GDALRasterIO failed for point (%d,%d)",px,py);
117                setMapInMaps(conf,"lenv","message",_ss(tmp));
118                CPLFree(pafScanline);
119                free(tmp);
120                return SERVICE_FAILED;
121              }
122              if(buffer!=NULL){
123                int len=strlen(buffer);
124                buffer=(char*)realloc(buffer,(len+50+1)*sizeof(char));
125              }
126              else
127                buffer=(char*)malloc((51)*sizeof(char));
128              char *tmpValue=(char *)malloc(50*sizeof(char));
129              sprintf(tmpValue,"[%.6f,%.6f,%.6f]%c",prx,pry,pafScanline[0],(k+1==nbGeom?' ':','));
130              strncpy(buffer+length,tmpValue,strlen(tmpValue));
131              length+=strlen(tmpValue);
132              buffer[length]=0;
133              value=pafScanline[0];
134              free(tmpValue);
135              //Usefull if we can export 3D JSON string at the end
136              //OGR_G_SetPoint(geometry,k,prx,pry,pafScanline[0]);           
137            }
138            else{
139              if(buffer!=NULL)
140                buffer=(char*)realloc(buffer,(strlen(buffer)+50+1)*sizeof(char));
141              else
142                buffer=(char*)malloc((51)*sizeof(char));
143              char *tmpValue=(char *)malloc(50*sizeof(char));
144              sprintf(tmpValue,"[%.6f,%.6f,%.6f]%c",prx,pry,value,(k+1==nbGeom?' ':','));
145              strncpy(buffer+length,tmpValue,strlen(tmpValue));
146              length+=strlen(tmpValue);
147              buffer[length]=0;
148              free(tmpValue);
149              value=value;
150            }
151            CPLFree(pafScanline);
152            ppx=px;
153            ppy=py;
154          }
155          buffer=(char*)realloc(buffer,(strlen(buffer)+3)*sizeof(char));
156          char *tmpValue=(char *)malloc(3*sizeof(char));
157          sprintf(tmpValue,"]}");
158          tmpValue[2]=0;
159          strncpy(buffer+length,tmpValue,strlen(tmpValue));
160          length+=strlen(tmpValue);
161          buffer[length]=0;
162#ifdef ZOO_SERVICE
163          setMapInMaps(outputs,"Profile","value",buffer);
164          setMapInMaps(outputs,"Profile","mimeType","text/plain");
165#else
166          fprintf(stderr,"%s\n",buffer);
167#endif
168          free(buffer);
169          free(tmpValue);
170          OGR_G_DestroyGeometry(geometry);
171        }
172    }
173  else{
174#ifdef ZOO_SERVICE
175    setMapInMaps(conf,"lenv","message",_ss("Unable to load your raster file !"));
176    return SERVICE_FAILED;
177#else
178    printf("Unable to load your raster file %s !\n",argv[1]);
179#endif
180  }
181  OGRCleanupAll();
182  GDALClose(hDataset);
183  GDALDestroyDriverManager();
184#ifdef ZOO_SERVICE
185  return SERVICE_SUCCEEDED;
186#endif
187}
188
189#ifdef ZOO_SERVICE
190}
191#endif
Note: See TracBrowser for help on using the repository browser.

Search

Context Navigation

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