Annotation of /trunk/map_reader/srtm3/SRTM_SRC/read_srtm.c
Parent Directory
|
Revision Log
Revision 2 - (view) (download)
| 1 : | tuis | 2 | // vim: set tabstop=4 paste nocindent noautoindent ff=unix: |
| 2 : | |||
| 3 : | /* | ||
| 4 : | */ | ||
| 5 : | |||
| 6 : | |||
| 7 : | |||
| 8 : | #include "read_srtm.h" | ||
| 9 : | |||
| 10 : | |||
| 11 : | |||
| 12 : | |||
| 13 : | int main(int argc, char** argv) | ||
| 14 : | { | ||
| 15 : | int i, wsize, hsize, oclv; | ||
| 16 : | float lat, lng, rate; | ||
| 17 : | |||
| 18 : | sWord* hgt = NULL; | ||
| 19 : | sWord* map_height; | ||
| 20 : | |||
| 21 : | |||
| 22 : | oclv = SRTM_OCLEVEL; | ||
| 23 : | lat = lng = 0.0; | ||
| 24 : | rate = 1.0; | ||
| 25 : | wsize = 256; | ||
| 26 : | |||
| 27 : | for (i=1; i<argc; i++) { | ||
| 28 : | if (!strcmp(argv[i],"-lati")) {if (i!=argc-1) lat = atof(argv[i+1]);} | ||
| 29 : | if (!strcmp(argv[i],"-n")) {if (i!=argc-1) lat = atof(argv[i+1]);} | ||
| 30 : | if (!strcmp(argv[i],"-long")) {if (i!=argc-1) lng = atof(argv[i+1]);} | ||
| 31 : | if (!strcmp(argv[i],"-e")) {if (i!=argc-1) lng = atof(argv[i+1]);} | ||
| 32 : | if (!strcmp(argv[i],"-size")) {if (i!=argc-1) wsize = atoi(argv[i+1]);} | ||
| 33 : | if (!strcmp(argv[i],"-s")) {if (i!=argc-1) wsize = atoi(argv[i+1]);} | ||
| 34 : | if (!strcmp(argv[i],"-rate")) {if (i!=argc-1) rate = atof(argv[i+1]);} | ||
| 35 : | if (!strcmp(argv[i],"-r")) {if (i!=argc-1) rate = atof(argv[i+1]);} | ||
| 36 : | if (!strcmp(argv[i],"-oclv")) {if (i!=argc-1) oclv = atoi(argv[i+1]);} | ||
| 37 : | if (!strcmp(argv[i],"-o")) {if (i!=argc-1) oclv = atoi(argv[i+1]);} | ||
| 38 : | } | ||
| 39 : | if (wsize<=0.0) wsize = 256; | ||
| 40 : | hsize = (int)(wsize*rate) + 1; | ||
| 41 : | if (wsize>=SRTM_SIZE) wsize = SRTM_SIZE - 1; | ||
| 42 : | if (hsize>=SRTM_SIZE) hsize = SRTM_SIZE - 1; | ||
| 43 : | |||
| 44 : | map_height = (sWord*)malloc(wsize*hsize*sizeof(sWord)); | ||
| 45 : | if (map_height==NULL) { | ||
| 46 : | print_message("No more memory!! (%d)\n", wsize*hsize*sizeof(sWord)); | ||
| 47 : | exit(1); | ||
| 48 : | } | ||
| 49 : | for (i=0; i<wsize*hsize; i++) map_height[i] = 0; | ||
| 50 : | |||
| 51 : | |||
| 52 : | set_height(map_height, wsize, hsize, lat, lng); | ||
| 53 : | |||
| 54 : | int chk; | ||
| 55 : | do { | ||
| 56 : | map_height = median (map_height, wsize, hsize, &chk); | ||
| 57 : | //map_height = average(map_height, wsize, hsize, &chk); | ||
| 58 : | } while (chk==ON); | ||
| 59 : | |||
| 60 : | print_height(map_height, wsize, hsize, oclv); | ||
| 61 : | |||
| 62 : | return 0; | ||
| 63 : | } | ||
| 64 : | |||
| 65 : | |||
| 66 : | |||
| 67 : | sWord* median(sWord* map_height, int wsize, int hsize, int* chk) | ||
| 68 : | { | ||
| 69 : | int i, j, mapj, hh, nn; | ||
| 70 : | int median[9]; | ||
| 71 : | |||
| 72 : | if (chk!=NULL) *chk = OFF; | ||
| 73 : | |||
| 74 : | sWord* hgt = (sWord*)malloc(wsize*hsize*sizeof(sWord)); | ||
| 75 : | if (hgt==NULL) return map_height; | ||
| 76 : | |||
| 77 : | |||
| 78 : | for (j=0; j<hsize; j++) { | ||
| 79 : | mapj = j*wsize; | ||
| 80 : | for (i=0; i<wsize; i++) { | ||
| 81 : | if (map_height[mapj+i]==SRTM_NODATA) { | ||
| 82 : | hh = nn = 0; | ||
| 83 : | if (i!=0) { | ||
| 84 : | int gg = map_height[mapj+i-1]; | ||
| 85 : | if (gg!=SRTM_NODATA) { | ||
| 86 : | median[nn] = gg; | ||
| 87 : | nn++; | ||
| 88 : | } | ||
| 89 : | } | ||
| 90 : | if (i!=wsize-1) { | ||
| 91 : | int gg = map_height[mapj+i+1]; | ||
| 92 : | if (gg!=SRTM_NODATA) { | ||
| 93 : | median[nn] = gg; | ||
| 94 : | nn++; | ||
| 95 : | } | ||
| 96 : | } | ||
| 97 : | if (j!=0) { | ||
| 98 : | int gg = map_height[mapj-wsize+i]; | ||
| 99 : | if (gg!=SRTM_NODATA) { | ||
| 100 : | median[nn] = gg; | ||
| 101 : | nn++; | ||
| 102 : | } | ||
| 103 : | } | ||
| 104 : | if (j!=hsize-1) { | ||
| 105 : | int gg = map_height[mapj+wsize+i]; | ||
| 106 : | if (gg!=SRTM_NODATA) { | ||
| 107 : | median[nn] = gg; | ||
| 108 : | nn++; | ||
| 109 : | } | ||
| 110 : | } | ||
| 111 : | |||
| 112 : | if (i!=0 && j!=0) { | ||
| 113 : | int gg = map_height[mapj-wsize+i-1]; | ||
| 114 : | if (gg!=SRTM_NODATA) { | ||
| 115 : | median[nn] = gg; | ||
| 116 : | nn++; | ||
| 117 : | } | ||
| 118 : | } | ||
| 119 : | if (i!=0 && j!=hsize-1) { | ||
| 120 : | int gg = map_height[mapj+wsize+i-1]; | ||
| 121 : | if (gg!=SRTM_NODATA) { | ||
| 122 : | median[nn] = gg; | ||
| 123 : | nn++; | ||
| 124 : | } | ||
| 125 : | } | ||
| 126 : | if (i!=wsize-1 && j!=0) { | ||
| 127 : | int gg = map_height[mapj-wsize+i+1]; | ||
| 128 : | if (gg!=SRTM_NODATA) { | ||
| 129 : | median[nn] = gg; | ||
| 130 : | nn++; | ||
| 131 : | } | ||
| 132 : | } | ||
| 133 : | if (i!=wsize-1 && j!=hsize-1) { | ||
| 134 : | int gg = map_height[mapj+wsize+i+1]; | ||
| 135 : | if (gg!=SRTM_NODATA) { | ||
| 136 : | median[nn] = gg; | ||
| 137 : | nn++; | ||
| 138 : | } | ||
| 139 : | } | ||
| 140 : | |||
| 141 : | if (nn!=0) { | ||
| 142 : | int k, l; | ||
| 143 : | for (k=0; k<nn-1; k++) { | ||
| 144 : | for (l=k+1; l<nn; l++) { | ||
| 145 : | if (median[k]>median[l]) { | ||
| 146 : | int swp = median[k]; | ||
| 147 : | median[k] = median[l]; | ||
| 148 : | median[l] = swp; | ||
| 149 : | } | ||
| 150 : | } | ||
| 151 : | } | ||
| 152 : | hgt[mapj+i] = median[nn/2]; | ||
| 153 : | } | ||
| 154 : | else { | ||
| 155 : | hgt[mapj+i] = SRTM_NODATA; | ||
| 156 : | if (chk!=NULL) *chk = ON; | ||
| 157 : | } | ||
| 158 : | } | ||
| 159 : | else { | ||
| 160 : | hgt[mapj+i] = map_height[mapj+i]; | ||
| 161 : | } | ||
| 162 : | } | ||
| 163 : | } | ||
| 164 : | free(map_height); | ||
| 165 : | |||
| 166 : | return hgt; | ||
| 167 : | } | ||
| 168 : | |||
| 169 : | |||
| 170 : | |||
| 171 : | sWord* average(sWord* map_height, int wsize, int hsize, int* chk) | ||
| 172 : | { | ||
| 173 : | int i, j, mapj, hh, nn; | ||
| 174 : | |||
| 175 : | if (chk!=NULL) *chk = OFF; | ||
| 176 : | |||
| 177 : | sWord* hgt = (sWord*)malloc(wsize*hsize*sizeof(sWord)); | ||
| 178 : | if (hgt==NULL) return map_height; | ||
| 179 : | |||
| 180 : | for (j=0; j<hsize; j++) { | ||
| 181 : | mapj = j*wsize; | ||
| 182 : | for (i=0; i<wsize; i++) { | ||
| 183 : | if (map_height[mapj+i]==SRTM_NODATA) { | ||
| 184 : | hh = nn = 0; | ||
| 185 : | if (i!=0) { | ||
| 186 : | int gg = map_height[mapj+i-1]; | ||
| 187 : | if (gg!=SRTM_NODATA) { | ||
| 188 : | hh += 2*gg; | ||
| 189 : | nn += 2; | ||
| 190 : | } | ||
| 191 : | } | ||
| 192 : | if (i!=wsize-1) { | ||
| 193 : | int gg = map_height[mapj+i+1]; | ||
| 194 : | if (gg!=SRTM_NODATA) { | ||
| 195 : | hh += 2*gg; | ||
| 196 : | nn += 2; | ||
| 197 : | } | ||
| 198 : | } | ||
| 199 : | if (j!=0) { | ||
| 200 : | int gg = map_height[mapj-wsize+i]; | ||
| 201 : | if (gg!=SRTM_NODATA) { | ||
| 202 : | hh += 2*gg; | ||
| 203 : | nn += 2; | ||
| 204 : | } | ||
| 205 : | } | ||
| 206 : | if (j!=hsize-1) { | ||
| 207 : | int gg = map_height[mapj+wsize+i]; | ||
| 208 : | if (gg!=SRTM_NODATA) { | ||
| 209 : | hh += 2*gg; | ||
| 210 : | nn += 2; | ||
| 211 : | } | ||
| 212 : | } | ||
| 213 : | |||
| 214 : | if (i!=0 && j!=0) { | ||
| 215 : | int gg = map_height[mapj-wsize+i-1]; | ||
| 216 : | if (gg!=SRTM_NODATA) { | ||
| 217 : | hh += gg; | ||
| 218 : | nn++; | ||
| 219 : | } | ||
| 220 : | } | ||
| 221 : | if (i!=0 && j!=hsize-1) { | ||
| 222 : | int gg = map_height[mapj+wsize+i-1]; | ||
| 223 : | if (gg!=SRTM_NODATA) { | ||
| 224 : | hh += gg; | ||
| 225 : | nn++; | ||
| 226 : | } | ||
| 227 : | } | ||
| 228 : | if (i!=wsize-1 && j!=0) { | ||
| 229 : | int gg = map_height[mapj-wsize+i+1]; | ||
| 230 : | if (gg!=SRTM_NODATA) { | ||
| 231 : | hh += gg; | ||
| 232 : | nn++; | ||
| 233 : | } | ||
| 234 : | } | ||
| 235 : | if (i!=wsize-1 && j!=hsize-1) { | ||
| 236 : | int gg = map_height[mapj+wsize+i+1]; | ||
| 237 : | if (gg!=SRTM_NODATA) { | ||
| 238 : | hh += gg; | ||
| 239 : | nn++; | ||
| 240 : | } | ||
| 241 : | } | ||
| 242 : | |||
| 243 : | if (nn!=0) hgt[mapj+i] = (int)((float)hh/nn+0.5); | ||
| 244 : | else { | ||
| 245 : | hgt[mapj+i] = SRTM_NODATA; | ||
| 246 : | if (chk!=NULL) *chk = ON; | ||
| 247 : | } | ||
| 248 : | } | ||
| 249 : | else { | ||
| 250 : | hgt[mapj+i] = map_height[mapj+i]; | ||
| 251 : | } | ||
| 252 : | } | ||
| 253 : | } | ||
| 254 : | free(map_height); | ||
| 255 : | |||
| 256 : | return hgt; | ||
| 257 : | } | ||
| 258 : | |||
| 259 : | |||
| 260 : | |||
| 261 : | |||
| 262 : | void set_height(sWord* map_height, int wsize, int hsize, float lat, float lng) | ||
| 263 : | { | ||
| 264 : | int i, j; | ||
| 265 : | sWord* hgt; | ||
| 266 : | |||
| 267 : | int ndg = (int)lat; | ||
| 268 : | int edg = (int)lng; | ||
| 269 : | |||
| 270 : | lat = lat - ndg; | ||
| 271 : | lng = lng - edg; | ||
| 272 : | int sx = (int)(lng*(SRTM_SIZE-1) + 0.5); // 0 - 1200 | ||
| 273 : | int sy = (SRTM_SIZE-1) - (int)(lat*(SRTM_SIZE-1) + 0.5); // 0 - 1200 | ||
| 274 : | int ex = sx + wsize; | ||
| 275 : | int ey = sy + hsize; | ||
| 276 : | int mx = Min(ex, SRTM_SIZE-1); | ||
| 277 : | int my = Min(ey, SRTM_SIZE-1); | ||
| 278 : | |||
| 279 : | |||
| 280 : | hgt = read_hgt_file(ndg, edg); | ||
| 281 : | if (hgt!=NULL) { | ||
| 282 : | for (j=sy; j<my; j++) { | ||
| 283 : | int mapj = (j-sy)*wsize; | ||
| 284 : | int hgtj = j*SRTM_SIZE; | ||
| 285 : | for (i=sx; i<mx; i++) { | ||
| 286 : | map_height[mapj + i - sx] = hgt[hgtj + i]; | ||
| 287 : | } | ||
| 288 : | } | ||
| 289 : | free(hgt); | ||
| 290 : | } | ||
| 291 : | |||
| 292 : | if (ex>=SRTM_SIZE) { | ||
| 293 : | hgt = read_hgt_file(ndg, edg+1); | ||
| 294 : | if (hgt!=NULL) { | ||
| 295 : | for (j=sy; j<my; j++) { | ||
| 296 : | int mapj = (j-sy)*wsize; | ||
| 297 : | int hgtj = j*SRTM_SIZE; | ||
| 298 : | for (i=0; i<ex-SRTM_SIZE+1; i++) { | ||
| 299 : | map_height[mapj + i + mx - sx] = hgt[hgtj + i]; | ||
| 300 : | } | ||
| 301 : | } | ||
| 302 : | free(hgt); | ||
| 303 : | } | ||
| 304 : | } | ||
| 305 : | |||
| 306 : | if (ey>=SRTM_SIZE) { | ||
| 307 : | hgt = read_hgt_file(ndg-1, edg); | ||
| 308 : | if (hgt!=NULL) { | ||
| 309 : | for (j=0; j<ey-SRTM_SIZE+1; j++) { | ||
| 310 : | int mapj = (j+my-sy)*wsize; | ||
| 311 : | int hgtj = j*SRTM_SIZE; | ||
| 312 : | for (i=sx; i<mx; i++) { | ||
| 313 : | map_height[mapj + i - sx] = hgt[hgtj + i]; | ||
| 314 : | } | ||
| 315 : | } | ||
| 316 : | free(hgt); | ||
| 317 : | } | ||
| 318 : | } | ||
| 319 : | |||
| 320 : | if (ex>=SRTM_SIZE && ey>=SRTM_SIZE) { | ||
| 321 : | hgt = read_hgt_file(ndg-1, edg+1); | ||
| 322 : | if (hgt!=NULL) { | ||
| 323 : | for (j=0; j<ey-SRTM_SIZE+1; j++) { | ||
| 324 : | int mapj = (j+my-sy)*wsize; | ||
| 325 : | int hgtj = j*SRTM_SIZE; | ||
| 326 : | for (i=0; i<ex-SRTM_SIZE+1; i++) { | ||
| 327 : | map_height[mapj + i + mx - sx] = hgt[hgtj + i]; | ||
| 328 : | } | ||
| 329 : | } | ||
| 330 : | free(hgt); | ||
| 331 : | } | ||
| 332 : | } | ||
| 333 : | } | ||
| 334 : | |||
| 335 : | |||
| 336 : | |||
| 337 : | |||
| 338 : | |||
| 339 : | void print_height(sWord* map_height, int wsize, int hsize, int oclv) | ||
| 340 : | { | ||
| 341 : | int i, j; | ||
| 342 : | |||
| 343 : | for (j=0; j<hsize; j++) { | ||
| 344 : | int mapj = j*wsize; | ||
| 345 : | for (i=0; i<wsize; i++) { | ||
| 346 : | int height = map_height[mapj + i]; | ||
| 347 : | if (height<=0) height += oclv; | ||
| 348 : | printf("%06d ", height); | ||
| 349 : | } | ||
| 350 : | printf("\n"); | ||
| 351 : | } | ||
| 352 : | } | ||
| 353 : | |||
| 354 : | |||
| 355 : | |||
| 356 : | |||
| 357 : | |||
| 358 : | |||
| 359 : | |||
| 360 : | /** | ||
| 361 : | ËÌ°Þ nlat, Åì·Ð elng¤Î¥Ç¡¼¥¿¤òÆÉ¤ß½Ð¤¹¡¥ | ||
| 362 : | |||
| 363 : | */ | ||
| 364 : | sWord* read_hgt_file(int nlat, int elng) | ||
| 365 : | { | ||
| 366 : | int i; | ||
| 367 : | char fname[256]; | ||
| 368 : | |||
| 369 : | int dtsz = sizeof(sWord); | ||
| 370 : | |||
| 371 : | sWord* hgt = (sWord*)malloc(SRTM_SIZE_SQR*dtsz); | ||
| 372 : | if (hgt==NULL) return NULL; | ||
| 373 : | for (i=0; i<SRTM_SIZE_SQR; i++) hgt[i] = 0; | ||
| 374 : | |||
| 375 : | sprintf(fname, SRTM_FNAME_FORMAT, SRTM_DATA_DIR, nlat, elng); | ||
| 376 : | FILE* fp = fopen(fname, "rb"); | ||
| 377 : | if (fp==NULL) return hgt; | ||
| 378 : | fread((void*)hgt, SRTM_SIZE_SQR*dtsz, 1, fp); | ||
| 379 : | fclose(fp); | ||
| 380 : | |||
| 381 : | ntoh_ar(hgt, SRTM_SIZE_SQR*dtsz); | ||
| 382 : | return hgt; | ||
| 383 : | } | ||
| 384 : | |||
| 385 : |
| ViewVC Help | |
| Powered by ViewVC 1.0.0 |

