Project

General

Profile

« Previous | Next » 

Revision 2639

Added by harris about 19 years ago

Added an attribute to the metacat shapefile called area_coef which is a function
of the areal extent of the datapackage -- so a datapackage which was related to
a global collection would have a large extent, whereas a 3-foot squared plot
would have a small extent. Also fixed a bug related to the ID field that was
causing errors in ESRI apps.

View differences:

src/spatial/cpp/metacat_shapefile.cpp
1

  
2 1
/**
3 2
 *  '$RCSfile$'
4 3
 *  Copyright: 2000 Regents of the University of California and the
......
30 29
#include <stdlib.h>
31 30
#include <string.h>
32 31
#include <math.h>
33

  
34 32
#include "iostream.h"
35

  
36 33
#include <fstream>
37 34
#include <string>
38 35
#include <vector>
......
42 39

  
43 40
/************************************************************************
44 41
 * Method to write the points array to the shape file and the associated
45
 * dbf file using the shapelib-1.2.xx libraries
42
 * dbf file using the shapelib-1.2.ave_x libraries
46 43
 *
47 44
 * @param nSHPType -- the type of shapefile (eg. poly vs point )
48 45
 *
49 46
 * @param pszFilename -- the name of the shape file, sans the extension
50 47
 *
51
 * @param gridx -- this is the float value of the x-location (assuming points)
48
 * @param min_pntx -- this is the float value of the min x-location
49
 * @param max_pntx -- this is the float value of the max x-location
52 50
 *
53
 * @param gridy -- this is the float value of the y-location (assuming points)
51
 * @param min_pnty -- this is the float value of the min y-location
52
 * @param max_pnty -- this is the float value of the max y-location
54 53
 *
55
 * @param gridz -- this is the float value of the optional p-value
54
 * @param pointz -- this is the float value of the optional p-value
56 55
 * (assuming points)
57 56
 *
58 57
 * @param the number of lines in the coordinates arrays
59 58
 ************************************************************************/
60
static void WritePointsArray ( int nSHPType, const char * pszFilename,
61
  float gridx[40000] [100], float gridy[40000] [100],float gridz[40000] [100],
62
  vector<string> urlvec, vector<string> docidvec, int number_data_lines ) {
59
static void WritePointsArray ( int nSHPType,
60
  const char * pszFilename,
61
  float min_pntx[40000][100],
62
  float max_pntx[40000][100],
63
  float min_pnty[40000][100],
64
  float max_pnty[40000][100],
65
  float pointz[40000][100],
66
  vector<string> urlvec,
67
  vector<string> docidvec,
68
  int number_data_lines ) {
63 69

  
64 70
       SHPHandle hSHPHandle;
65 71
       SHPObject * psShape;
......
79 85
       }
80 86

  
81 87
       //add to the dbf file attributes for ID, pval(elevation), url
82
       if ( DBFAddField( hDBF, "ID", FTDouble, 10, 10 ) == -1 )
88
       if ( DBFAddField( hDBF, "ID", FTInteger, 10, 0 ) == -1 )
83 89
       {
84
         printf( "DBFAddField(%s,FTDouble,%d,0) failed.\n" );
90
         printf( "DBFAddField(%s,FTInteger,%d,0) failed.\n" );
85 91
       }
86
       if ( DBFAddField( hDBF, "pval", FTDouble, 10, 10 ) == -1 )
92
       if ( DBFAddField( hDBF, "area_coef", FTDouble, 10, 4 ) == -1 )
87 93
       {
88 94
         printf( "DBFAddField(%s,FTDouble,%d,0) failed.\n" );
89 95
       }
......
99 105

  
100 106
      //cout<<" DBF Record Count --> "<<iRecord<<endl;
101 107
      int id_field = DBFGetFieldIndex( hDBF, "ID" );
102
      int pval_field = DBFGetFieldIndex( hDBF, "pval" );
103 108
      int url_field = DBFGetFieldIndex( hDBF, "url" );
104 109
      int docid_field = DBFGetFieldIndex( hDBF, "docid" );
110
      int area_field = DBFGetFieldIndex( hDBF, "area_coef" );
105 111

  
106
      //cout << "id field -> " << id_field << endl;
107
      //cout << "pval field -> " << pval_field << endl;
108
      //cout << "url field -> " << url_field << endl;
109

  
110

  
111 112
      hSHPHandle = SHPCreate( pszFilename, nSHPType );
112 113

  
113 114
       ii = 0;
114 115
       for ( ii = 0; ii < number_data_lines; ii++ )
115 116
       {
116
         double xx = ( gridx[2] [ii] );
117
         double yy = ( gridy[2] [ii] );
118
         double zz = ( gridz[2] [ii] );
117
         double area_coef = sqrt( pow((max_pntx[2][ii]-min_pntx[2][ii]),2) + pow((max_pnty[2][ii]-min_pnty[2][ii]),2)  );
118
         double ave_x = ( (min_pntx[2][ii]+max_pntx[2][ii])/2 );
119
         double ave_y = ( (min_pnty[2][ii]+max_pnty[2][ii])/2 );
120
         double ave_z = ( pointz[2][ii] );
119 121

  
120
         //if (xx < 180 && xx > -180 && yy < 90 && yy >-90 ) {
122
         if (ave_x < 180 && ave_x > -180 && ave_y < 90 && ave_y >-90 ) {
121 123

  
122
         psShape = SHPCreateObject( SHPT_POINT, ii, 0, NULL, NULL, 1, &xx, &yy, &zz, NULL );
124
         psShape = SHPCreateObject( SHPT_POINT, ii, 0, NULL, NULL, 1, &ave_x, &ave_y, &ave_z, NULL );
123 125

  
124 126
         SHPWriteObject( hSHPHandle, -1, psShape );
125 127
         SHPDestroyObject( psShape );
126 128
         //do the update to the dbf file too
127 129
         iRecord = DBFGetRecordCount( hDBF );
128 130

  
129

  
130 131
        DBFWriteStringAttribute(hDBF, iRecord, url_field, urlvec[ii].c_str() );
131 132
        DBFWriteStringAttribute(hDBF, iRecord, docid_field, docidvec[ii].c_str() );
132
        DBFWriteDoubleAttribute(hDBF, iRecord, pval_field, 999 );
133
        DBFWriteDoubleAttribute(hDBF, iRecord, id_field, ii );
134
       //  }
133
        DBFWriteIntegerAttribute(hDBF, iRecord, id_field, int(ii) );
134
        DBFWriteDoubleAttribute(hDBF, iRecord, area_field, area_coef );
135
        }
135 136
       }
136 137
       //recompute the extents
137 138
       //SHPComputeExtents( psShape );
......
163 164
  std::cout<<"  ##           harris@nceas.ucsb.edu                 ##\n";
164 165
  std::cout<<"  ##           Copyright 1999-2003                   ##\n";
165 166
  std::cout<<"  ##><><><><><><><><><><><><><><><><><><><><><><><><>##\n";
166
  
167

  
167 168
  std::cout << std::endl;
168 169

  
169 170
}
......
180 181
  }
181 182

  
182 183
  //these arrays are for the input x, y, z data
183
  float gridx[1000] [100];
184
  float gridy[1000] [100];
185
  float gridz[1000] [100];
184
  float min_pntx[1000] [100];
185
  float min_pnty[1000] [100];
186
  float max_pntx[1000] [100];
187
  float max_pnty[1000] [100];
188

  
189
  float pointz[1000] [100];
186 190
  vector<string> docidvec;
187 191
  vector<string> urlvec;
188 192

  
......
192 196

  
193 197
  int cnt = 0;
194 198
  int number_lines = 0;
195
  char bufa[100];
196
  char buf[100];
197
  char buf1[100];
198
  char buf2[100];
199
  char buf_docid[100];
200
  char buf_xmin[100];
201
  char buf_xmax[100];
202
  char buf_ymin[100];
203
  char buf_ymax[100];
204
  char buf_url[100];
199 205

  
200 206
  SHPHandle hSHP;
201 207
  int nShapeType, nEntities, i, iPart;
......
208 214
    exit( 2 );
209 215
  }
210 216

  
211
  /* read the data into an array -- first the grid nodes */
217
  /* read the data into an array -- first the grid nodes
218
   *
219
   * the data should have the following columns (from left to right)
220
   *
221
   * nrs.239.1
222
   * -121.558333333333
223
   * -121.558333333333
224
   * 36.2083333333333
225
   * 36.2083333333333
226
   * http://metacat.nceas.ucsb.edu/knb/servlet/metacat?action=read&docid=nrs.239.1&qformat=knb
227
   */
212 228
  infile = fopen( argv[1], "r" );
213 229
  char const * out_shape = argv[2];
214 230
  while ( fgets( oneline, 199, infile ) ) {
215
    sscanf( oneline, "%s %s %s %s", bufa, buf, buf1, buf2 );
231
    sscanf( oneline, "%s %s %s %s %s %s %s", buf_docid, buf_xmin, buf_xmax, buf_ymin, buf_ymax, buf_url);
216 232

  
217 233
    /**** cout<<" docid -> " << bufa
218 234
      <<"\n cnt -> " << cnt
......
221 237
      <<"\n p -> " << buf2
222 238
      <<endl; *******/
223 239

  
224
    gridx[2] [cnt] = atof( buf );
225
    gridy[2] [cnt] = atof( buf1 );
226
    gridz[2] [cnt] = atof( buf2 );
227
    //char const * sLine = buf2;
228
    urlvec.push_back(buf2);
229
    docidvec.push_back(bufa);
240
    min_pntx[2] [cnt] = atof(buf_xmin);
241
    max_pntx[2] [cnt] = atof(buf_xmax);
242
    min_pnty[2] [cnt] = atof(buf_ymin);
243
    max_pnty[2] [cnt] = atof(buf_ymax);
244

  
245
    urlvec.push_back(buf_url);
246
    docidvec.push_back(buf_docid);
247

  
230 248
    cnt++;
231 249
    number_lines = cnt;
232 250
  }
233 251
  fclose( infile );
234 252

  
235 253
  cout<<"creating a new shape file, with "<< number_lines <<" records "<<endl;
236
  WritePointsArray( SHPT_POINT, out_shape, gridx, gridy, gridz,
237
                    urlvec, docidvec, number_lines );
254
  WritePointsArray( SHPT_POINT,
255
                    out_shape,
256
                    min_pntx,
257
                    max_pntx,
258
                    min_pnty,
259
                    max_pnty,
260
                    pointz,
261
                    urlvec,
262
                    docidvec,
263
                    number_lines );
238 264

  
239 265
#ifdef USE_DBMALLOC
240 266
  malloc_dump( 2 );
build.xml
1308 1308
     </java>
1309 1309
  </target>
1310 1310
  
1311
  <target name="spatial_option" depends="init" description=" -- compiles code for the spatial option">
1311
  <target name="spatial_option" depends="prepare" description=" -- compiles code for the spatial option">
1312 1312

  
1313 1313
    <echo message="Compiling the metatcat shapefile creator"/>
1314 1314
    <echo message="using the shapelib at: ${shapelib.dir}"/>
......
1317 1317
    </exec>
1318 1318
  
1319 1319
    <exec dir="." executable="g++" os="Linux, Unix" failonerror="true">
1320
     <arg line="build/metacat_shapefile.o ${shapelib.dir}/libshp.a -o bin/test.out" />
1320
     <arg line="build/metacat_shapefile.o ${shapelib.dir}/.libs/libshp.a -o bin/metacat_shapefile" />
1321 1321
    </exec>
1322 1322
  </target>
1323 1323

  

Also available in: Unified diff