GRASS Programmer's Manual
6.4.1(2011)
|
00001 00021 #include <stdlib.h> 00022 #include <string.h> 00023 #include <grass/gis.h> 00024 #include <grass/Vect.h> 00025 #include <grass/glocale.h> 00026 00027 static int lookup(const char *file, const char *key, char *value, size_t len); 00028 00029 00037 int Vect_print_header(struct Map_info *Map) 00038 { 00039 fprintf(stdout, "\nSelected information from dig header\n"); 00040 fprintf(stdout, " Organization: %s\n", Vect_get_organization(Map)); 00041 fprintf(stdout, " Map Name: %s\n", Vect_get_map_name(Map)); 00042 fprintf(stdout, " Source Date: %s\n", Vect_get_map_date(Map)); 00043 fprintf(stdout, " Orig. Scale: %d\n", Vect_get_scale(Map)); 00044 00045 return 0; 00046 } 00047 00048 00056 int Vect_read_header(struct Map_info *Map) 00057 { 00058 Vect__read_head(Map); 00059 return 0; 00060 } 00061 00062 00070 int Vect_write_header(struct Map_info *Map) 00071 { 00072 /* do some sanity checking here */ 00073 Vect__write_head(Map); 00074 return 0; 00075 } 00076 00077 00086 int Vect__write_head(struct Map_info *Map) 00087 { 00088 char buf[200]; 00089 FILE *head_fp; 00090 00091 sprintf(buf, "%s/%s", GRASS_VECT_DIRECTORY, Map->name); 00092 00093 head_fp = G_fopen_new(buf, GRASS_VECT_HEAD_ELEMENT); 00094 if (head_fp == NULL) { 00095 G_warning(_("Unable to open header file of vector <%s>"), 00096 Vect_get_full_name(Map)); 00097 return (GRASS_ERR); 00098 } 00099 00100 fprintf(head_fp, "ORGANIZATION: %s\n", Vect_get_organization(Map)); 00101 fprintf(head_fp, "DIGIT DATE: %s\n", Vect_get_date(Map)); 00102 fprintf(head_fp, "DIGIT NAME: %s\n", Vect_get_person(Map)); 00103 fprintf(head_fp, "MAP NAME: %s\n", Vect_get_map_name(Map)); 00104 fprintf(head_fp, "MAP DATE: %s\n", Vect_get_map_date(Map)); 00105 fprintf(head_fp, "MAP SCALE: %d\n", Vect_get_scale(Map)); 00106 fprintf(head_fp, "OTHER INFO: %s\n", Vect_get_comment(Map)); 00107 fprintf(head_fp, "ZONE: %d\n", Vect_get_zone(Map)); 00108 fprintf(head_fp, "MAP THRESH: %f\n", Vect_get_thresh(Map)); 00109 00110 fclose(head_fp); 00111 return (GRASS_OK); 00112 } 00113 00122 int Vect__read_head(struct Map_info *Map) 00123 { 00124 FILE *head_fp; 00125 char buff[2001]; 00126 char *ptr; 00127 00128 /* Reset / init */ 00129 Vect_set_organization(Map, ""); 00130 Vect_set_date(Map, ""); 00131 Vect_set_person(Map, ""); 00132 Vect_set_map_name(Map, ""); 00133 Vect_set_map_date(Map, ""); 00134 Vect_set_scale(Map, 1); 00135 Vect_set_comment(Map, ""); 00136 Vect_set_zone(Map, 0); 00137 Vect_set_thresh(Map, 0.); 00138 00139 G_debug(1, "Vect__read_head(): vector = %s@%s", Map->name, Map->mapset); 00140 sprintf(buff, "%s/%s", GRASS_VECT_DIRECTORY, Map->name); 00141 head_fp = G_fopen_old(buff, GRASS_VECT_HEAD_ELEMENT, Map->mapset); 00142 if (head_fp == NULL) { 00143 G_warning(_("Unable to open header file of vector <%s>"), 00144 Vect_get_full_name(Map)); 00145 return (GRASS_ERR); 00146 } 00147 00148 while (G_getl2(buff, 2000, head_fp)) { 00149 00150 if (!(ptr = G_index(buff, ':'))) { 00151 G_warning(_("Corrupted row in head: %s"), buff); 00152 continue; 00153 } 00154 00155 ptr++; /* Search for the start of text */ 00156 while (*ptr == ' ') 00157 ptr++; 00158 00159 if (strncmp(buff, "ORGANIZATION:", sizeof(char) * 12) == 0) 00160 Vect_set_organization(Map, ptr); 00161 else if (strncmp(buff, "DIGIT DATE:", sizeof(char) * 11) == 0) 00162 Vect_set_date(Map, ptr); 00163 else if (strncmp(buff, "DIGIT NAME:", sizeof(char) * 11) == 0) 00164 Vect_set_person(Map, ptr); 00165 else if (strncmp(buff, "MAP NAME:", sizeof(char) * 9) == 0) 00166 Vect_set_map_name(Map, ptr); 00167 else if (strncmp(buff, "MAP DATE:", sizeof(char) * 9) == 0) 00168 Vect_set_map_date(Map, ptr); 00169 else if (strncmp(buff, "MAP SCALE:", sizeof(char) * 10) == 0) 00170 Vect_set_scale(Map, atoi(ptr)); 00171 else if (strncmp(buff, "OTHER INFO:", sizeof(char) * 11) == 0) 00172 Vect_set_comment(Map, ptr); 00173 else if (strncmp(buff, "ZONE:", sizeof(char) * 5) == 0 || 00174 strncmp(buff, "UTM ZONE:", sizeof(char) * 9) == 0) 00175 Vect_set_zone(Map, atoi(ptr)); 00176 else if (strncmp(buff, "WEST EDGE:", sizeof(char) * 10) == 0) { 00177 } 00178 else if (strncmp(buff, "EAST EDGE:", sizeof(char) * 10) == 0) { 00179 } 00180 else if (strncmp(buff, "SOUTH EDGE:", sizeof(char) * 11) == 0) { 00181 } 00182 else if (strncmp(buff, "NORTH EDGE:", sizeof(char) * 11) == 0) { 00183 } 00184 else if (strncmp(buff, "MAP THRESH:", sizeof(char) * 11) == 0) 00185 Vect_set_thresh(Map, atof(ptr)); 00186 else 00187 G_warning(_("Unknown keyword %s in vector head"), buff); 00188 } 00189 00190 fclose(head_fp); 00191 return (GRASS_OK); 00192 } 00193 00201 const char *Vect_get_name(struct Map_info *Map) 00202 { 00203 return (Map->name); 00204 } 00205 00213 const char *Vect_get_mapset(struct Map_info *Map) 00214 { 00215 return (Map->mapset); 00216 } 00217 00225 const char *Vect_get_full_name(struct Map_info *Map) 00226 { 00227 char *ptr; 00228 00229 ptr = (char *)G_malloc(strlen(Map->name) + strlen(Map->mapset) + 2); 00230 sprintf(ptr, "%s@%s", Map->name, Map->mapset); 00231 return (ptr); 00232 } 00233 00242 int Vect_is_3d(struct Map_info *Map) 00243 { 00244 return (Map->head.with_z); 00245 } 00246 00255 int Vect_set_organization(struct Map_info *Map, const char *str) 00256 { 00257 G_free(Map->head.organization); 00258 Map->head.organization = G_store(str); 00259 00260 return 0; 00261 } 00262 00270 const char *Vect_get_organization(struct Map_info *Map) 00271 { 00272 return (Map->head.organization); 00273 } 00274 00286 int Vect_set_date(struct Map_info *Map, const char *str) 00287 { 00288 G_free(Map->head.date); 00289 Map->head.date = G_store(str); 00290 return (0); 00291 } 00292 00303 const char *Vect_get_date(struct Map_info *Map) 00304 { 00305 return (Map->head.date); 00306 } 00307 00316 int Vect_set_person(struct Map_info *Map, const char *str) 00317 { 00318 G_free(Map->head.your_name); 00319 Map->head.your_name = G_store(str); 00320 return (0); 00321 } 00322 00330 const char *Vect_get_person(struct Map_info *Map) 00331 { 00332 return (Map->head.your_name); 00333 } 00334 00343 int Vect_set_map_name(struct Map_info *Map, const char *str) 00344 { 00345 G_free(Map->head.map_name); 00346 Map->head.map_name = G_store(str); 00347 return (0); 00348 } 00349 00357 const char *Vect_get_map_name(struct Map_info *Map) 00358 { 00359 return (Map->head.map_name); 00360 } 00361 00370 int Vect_set_map_date(struct Map_info *Map, const char *str) 00371 { 00372 G_free(Map->head.source_date); 00373 Map->head.source_date = G_store(str); 00374 return (0); 00375 } 00376 00384 const char *Vect_get_map_date(struct Map_info *Map) 00385 { 00386 return (Map->head.source_date); 00387 } 00388 00397 int Vect_set_scale(struct Map_info *Map, int scale) 00398 { 00399 Map->head.orig_scale = scale; 00400 return (0); 00401 } 00402 00410 int Vect_get_scale(struct Map_info *Map) 00411 { 00412 return ((int)Map->head.orig_scale); 00413 } 00414 00423 int Vect_set_comment(struct Map_info *Map, const char *str) 00424 { 00425 G_free(Map->head.line_3); 00426 Map->head.line_3 = G_store(str); 00427 return (0); 00428 } 00429 00437 const char *Vect_get_comment(struct Map_info *Map) 00438 { 00439 return (Map->head.line_3); 00440 } 00441 00450 int Vect_set_zone(struct Map_info *Map, int zone) 00451 { 00452 Map->head.plani_zone = zone; 00453 return (0); 00454 } 00455 00456 00464 int Vect_get_zone(struct Map_info *Map) 00465 { 00466 return (Map->head.plani_zone); 00467 } 00468 00479 int Vect_get_proj(struct Map_info *Map) 00480 { 00481 return (Map->proj); 00482 } 00483 00484 00497 const char *Vect_get_proj_name(struct Map_info *Map) 00498 { 00499 char name[256]; 00500 int n; 00501 00502 switch (n = Vect_get_proj(Map)) { 00503 case PROJECTION_XY: 00504 case PROJECTION_UTM: 00505 case PROJECTION_LL: 00506 case PROJECTION_SP: 00507 return G__projection_name(n); 00508 } 00509 if (!lookup(PROJECTION_FILE, "name", name, sizeof(name))) 00510 strcpy(name, _("Unknown projection")); 00511 return G_store(name); 00512 } 00513 00522 int Vect_set_thresh(struct Map_info *Map, double thresh) 00523 { 00524 G_debug(1, "Vect_set_thresh(): thresh = %f", thresh); 00525 Map->head.digit_thresh = thresh; 00526 return (0); 00527 } 00528 00536 double Vect_get_thresh(struct Map_info *Map) 00537 { 00538 G_debug(1, "Vect_get_thresh(): thresh = %f", Map->head.digit_thresh); 00539 return (Map->head.digit_thresh); 00540 } 00541 00542 00543 /* from lib/gis/proj3.c */ 00544 static int lookup(const char *file, const char *key, char *value, size_t len) 00545 { 00546 char path[GPATH_MAX]; 00547 00548 G__file_name(path, "", file, "PERMANENT"); 00549 return G_lookup_key_value_from_file(path, key, value, (int)len) == 1; 00550 }