#include "geotrace.h" GdkPixmap *pixmap = NULL; GdkPixbuf *pixbuf = NULL; GList *map_strings,*map_properties; GtkRequisition *pix_size; char *curmap; // following vars for map properties calculations int falseeast,falsenorth,projection; float boundaries[4],alat,alon,blat,blon,radius,phione,phitwo,phinought,lambdanought; float phionerad,phitworad,phinoughtrad,lambdanoughtrad,nalber,calber,pnought; void set_map_from_file(char *map_file) { GdkPixbuf *tmp_pixbuf = NULL; char *tmpmap=NULL; tmpmap = malloc (strlen(maps_dir_path)+strlen(map_file)+1); strcpy (tmpmap,""); strcat (tmpmap,maps_dir_path); strcat (tmpmap,map_file); curmap = realloc (curmap,strlen(map_file)+1); strcpy (curmap,map_file); gtk_entry_set_text(GTK_ENTRY(map_combo_entry),curmap); pix_size = malloc (sizeof(GtkRequisition)); tmp_pixbuf = gdk_pixbuf_new_from_file(tmpmap); free (tmpmap); pix_size->width = gdk_pixbuf_get_width(tmp_pixbuf); pix_size->height = gdk_pixbuf_get_height(tmp_pixbuf); get_map_boundaries(curmap); gdk_pixbuf_render_pixmap_and_mask(tmp_pixbuf, &pixmap, NULL, 128); gdk_window_set_icon(drawing_area->window,NULL,pixmap,NULL); gtk_widget_set_usize(drawing_area,pix_size->width,pix_size->height); gtk_widget_hide(drawing_area); gtk_widget_show(drawing_area); } void expose_event() { gdk_draw_pixmap(drawing_area->window, drawing_area->style->fg_gc[GTK_WIDGET_STATE (drawing_area)], pixmap, 0,0,0,0,-1,-1); } void scan_maps_file () { FILE *map_props_file; char *tmpstr,*tmpstr2,*tmppath; map_strings = NULL; host_strings = NULL; tmpstr = malloc (512); tmppath = malloc (strlen(maps_dir_path)+strlen(MAP_FILE)+1); sprintf (tmppath,"%s%s",maps_dir_path,MAP_FILE); map_props_file = fopen(tmppath,"r"); while (!feof(map_props_file)) { fscanf(map_props_file,"%[^\n]\n",tmpstr); tmpstr2 = strtok(tmpstr,":"); tmpstr = strtok(NULL,":"); curmap = malloc (strlen(start_map)+1); strcpy(curmap,start_map); if (strcmp("MAPS",tmpstr2) == 0) { tmpstr2 = strtok (tmpstr,","); while (tmpstr2 != NULL) { map_strings = g_list_insert_sorted(map_strings,strdup(tmpstr2),(GCompareFunc)strcasecmp); tmpstr2 = strtok(NULL,","); } gtk_combo_set_popdown_strings(GTK_COMBO(map_combo),map_strings); } } fclose (map_props_file); free (tmpstr); free (tmppath); } void get_map_boundaries(char *map_name) { FILE *map_props_file; char *tmpstr,*tmpstr2,*tmpstr3,*proj,*tmppath; int gna; projection = LINEAR; tmpstr = malloc (512); tmppath = malloc (strlen(maps_dir_path)+strlen(MAP_FILE)+1); sprintf (tmppath,"%s%s",maps_dir_path,MAP_FILE); map_props_file = fopen(tmppath,"r"); tmpstr3 = malloc (strlen(map_name)+1); strcpy (tmpstr3,map_name); proj = malloc (6); fscanf(map_props_file,"%[^\n]",tmpstr); tmpstr2 = strtok(tmpstr,":"); tmpstr = strtok(NULL,":"); while (!feof(map_props_file)) { gna = fgetc (map_props_file); if (strcmp(tmpstr3,tmpstr2) == 0) { tmpstr2 = strtok(tmpstr,"="); tmpstr = strtok(NULL,"="); if (strcmp(tmpstr2,"BOUNDARY") == 0) { sscanf (tmpstr,"%f,%f,%f,%f",&boundaries[0],&boundaries[1],&boundaries[2],&boundaries[3]); } else if (strcmp(tmpstr2,"PROJECTION") == 0) { sscanf(tmpstr,"%[^,],%f,%f,%f,%f,%f,%d,%d", proj,&radius,&phione,&phitwo,&phinought, &lambdanought,&falseeast,&falsenorth); if (strcmp(proj,"ALBER") == 0) projection = ALBER; } } if (!feof(map_props_file)) { fscanf(map_props_file,"%[^\n]",tmpstr); tmpstr2 = strtok(tmpstr,":"); tmpstr = strtok(NULL,":"); } } fclose (map_props_file); compute_lat_lon_parameters(); free (tmpstr); free (proj); free (tmppath); } void compute_lat_lon_parameters() { if (projection == LINEAR) { blon = boundaries[0]; blat = boundaries[1]; alon = (boundaries[2] - boundaries[0]) / pix_size->width; alat = (boundaries[3] - boundaries[1]) / pix_size->height; } else if (projection == ALBER) { phionerad = (phione*M_PI)/180; phitworad = (phitwo*M_PI)/180; phinoughtrad = (phinought*M_PI)/180; lambdanoughtrad = (lambdanought*M_PI)/180; nalber = (sin(phionerad)+sin(phitworad))/2; calber = pow(cos(phionerad),2) + 2*nalber*sin(phionerad); pnought = radius*sqrt(calber-2*nalber*sin(phinoughtrad))/nalber; } } float get_lat (int x,int y) { float x2,y2,p,retval; if (projection == LINEAR) return (alat*y + blat); else if (projection == ALBER) { x2 = x-falseeast; y2 = falsenorth-y; p = sqrt(pow(x2,2) + pow(pnought-y2,2)); retval = asin((calber-pow(p*nalber/radius,2))/(2*nalber))*180/M_PI; return (retval); } else return 0; } float get_lon (int x,int y) { float x2,y2,theta,retval; if (projection == LINEAR) return (alon*x + blon); else if (projection == ALBER) { x2 = x-falseeast; y2 = falsenorth-y; theta = atan(x2 / (pnought-y2)); retval = (lambdanoughtrad+theta/nalber)*180/M_PI; return (retval); } else return 0; } char *point_to_lat_lon (int x,int y) { return format_lat_lon (get_lat(x,y),get_lon(x,y)); } char *format_lat_lon (float lat,float lon) { char *retval,north,west; retval = malloc (20); if (lon > 180) lon -= 360; if (lat < 0) north = 'S'; else north = 'N'; if (lon < 0) west = 'W'; else west = 'E'; sprintf (retval,"%5.2f%c, %5.2f%c",fabs(lat),north,fabs(lon),west); return retval; } int lat_lon_to_y (float lat,float lon) { if (projection == LINEAR) return (int)((lat-blat)/alat+0.5); else if (projection == ALBER) { return (lat_lon_to_x_y(lat,lon,0)); } else return (0); } int lat_lon_to_x (float lat,float lon) { if (projection == LINEAR) return (int)((lon-blon)/alon+0.5); else if (projection == ALBER) { return (lat_lon_to_x_y(lat,lon,1)); } else return (0); } // which: 0 for y, 1 for x int lat_lon_to_x_y (float lat,float lon,int which) { float phi2,lambda2,p,theta; int x,y; phi2 = lat*M_PI/180; lambda2 = lon*M_PI/180; p = radius*sqrt(calber-2*nalber*sin(phi2))/nalber; theta = nalber*(lambda2-lambdanoughtrad); x = falseeast+(int)(p*sin(theta)); y = falsenorth-(int)(pnought-p*cos(theta)); if (which) return (x); else return (y); }