|
|
1.1 root 1: # include "stdio.h"
2: # include "cbt.h"
3: # include "ctype.h"
4: # include "assert.h"
5: # include "math.h"
6: # include "/usr/theo/PLOT/pplot.h"
7: # define SAME 0
8: # define torad 0.0174532925
9:
10: double dist(), atof();
11: double clat, clng;
12: double radius=50.0;
13: char countypat[100];
14: char *countyname = "/usr/spool/town/countymap";
15: char statepname[100];
16: char *statename = "/usr/spool/town/statemap";
17: double radlat, radlong;
18: int labx[500];
19: int laby[500];
20: int nlab=0;
21: int ctyflg=0;
22: int countyline=0, numnames=1000;
23:
24: # define abs(x) ( (t=(x))>= 0 ? t : -t )
25: main(argc,argv)
26: char *argv[];
27: {
28: char line[100], request[100], rka[100], rra[300];
29: char *s, *strchr();
30: long l1, l2;
31: char nline[100];
32: mbuf key, rkey, rrec;
33: bfile *townfile;
34: FILE *cntypat, *countyf, *namepat, *namef, *pointf=NULL;
35: FILE *statepat, *state, *patch, *fdata, *bigname, *bigpat;
36: double lat, lng;
37: int townfind, x, y, j, use, a1, a2;
38: townfile = bopen("/usr/spool/town/ustowns", 0);
39: argc--; argv++;
40: while (argc-- > 0)
41: {
42: if (argv[0][0]=='-')
43: switch(argv[0][1])
44: {
45: case 'f':
46: countyname = statename = argv[1];
47: argv++; argc--;
48: break;
49: case 'n':
50: numnames = atoi(argv[0]+2);
51: break;
52: case 'c':
53: countyline = atoi(argv[0]+2);
54: ctyflg = 1;
55: break;
56: }
57: argv++;
58: }
59: if (townfile==NULL)
60: {
61: fprintf(stderr, "No town list\n");
62: exit(1);
63: }
64: sprintf(countypat, "%s.pat", countyname);
65: sprintf(statepname, "%s.pat", statename);
66: cntypat = fopen(countypat, "r");
67: assert(cntypat!=NULL);
68: countyf = fopen(countyname, "r");
69: assert(countyf!=NULL);
70: namepat = fopen("/usr/spool/town/ftownpat", "r");
71: assert(namepat!=NULL);
72: namef = fopen("/usr/spool/town/ftown", "r");
73: assert(namef!=NULL);
74: bigpat = fopen("/usr/spool/town/bigpat", "r");
75: assert(bigpat!=NULL);
76: bigname = fopen("/usr/spool/town/big", "r");
77: assert(bigname!=NULL);
78: state = fopen(statename, "r");
79: assert(state!=NULL);
80: statepat = fopen(statepname, "r");
81: assert(statepat!=NULL);
82: rkey.mdata = rka; rrec.mdata = rra;
83: plopen("");
84: while (gets(request))
85: {
86: s = strchr(request, '\t');
87: if (s!=NULL)
88: {
89: *s++ = 0;
90: radius= atof(s);
91: s = strchr(s, ' ');
92: if (s!=NULL)
93: {
94: while (*s==' ')
95: s++;
96: if (*s)
97: pointf = fopen(s, "r");
98: }
99: }
100: if (strlen(request)==0)
101: continue;
102: lcase(request);
103: townfind=0;
104: if (ctyflg == 0) countyline = (radius<100.);
105: nlab=0;
106: key.mdata = request; key.mlen = strlen(request);
107: bseek(townfile, key);
108: while (bread(townfile, &rkey, &rrec)==NULL)
109: {
110: rkey.mdata[rkey.mlen]=0;
111: rrec.mdata[rrec.mlen]=0;
112: if (strncmp(rkey.mdata, request, key.mlen)!=SAME)
113: break;
114: sscanf(rra, "%lf%lf", &lat, &lng);
115: townfind++;
116: }
117: if (townfind==0)
118: {
119: fprintf(stderr, "Can't find that place\n");
120: continue;
121: }
122: if (townfind>1)
123: {
124: fprintf(stderr, "Ambiguous - specify state, please\n");
125: continue;
126: }
127: perase();
128: prange (-5000, 5000, -5000, 5000);
129: caps(rka);
130: clat = lat; clng=lng;
131: /* standard correction latitude = 40.0 N*/
132: clng = clng * cos(torad*40.0);
133: radlat = radius/dist(clat, clng, clat+1., clng);
134: radlong = radius*cos(torad*40.0)/dist(clat, clng, clat, clng+1.);
135: a1 = lat/4.; a2 = lng/4.;
136: use=0;
137: if (countyline)
138: {
139: patch = cntypat; fdata = countyf;
140: }
141: else
142: {
143: patch = statepat; fdata = state;
144: }
145: rewind(patch);
146: fgets(line, 100, patch);
147: while (fgets(nline, 100, patch))
148: {
149: x = atoi(line);
150: y = atoi(line+3);
151: if (okpat(x, y, lat, lng))
152: {
153: ctydraw( atol(line+6), atol(nline+6), fdata);
154: use++;
155: }
156: if (x==a1 && y==a2)
157: {l1 = atol(line+6); l2 = atol(nline+6);}
158: strcpy(line, nline);
159: }
160: if (use==0)
161: ctydraw (l1, l2, fdata);
162: lcase(rka);
163: if (radius > 200.)
164: {
165: patch = bigpat; fdata = bigname;
166: }
167: else
168: {
169: patch = namepat; fdata = namef;
170: }
171: if (patch!=NULL && numnames>0)
172: {
173: rewind(patch);
174: use=0;
175: fgets(line, 100, patch);
176: while (fgets(nline, 100, patch))
177: {
178: x = atoi(line);
179: y = atoi(line+3);
180: if (okpat(x,y, lat, lng))
181: {
182: ckcit (atol(line+6), atol(nline+6), fdata);
183: use++;
184: }
185: if (a1==x && a2==y)
186: {l1 = atol(line+6); l2 = atol(nline+6);}
187: strcpy(line, nline);
188: }
189: if (use==0)
190: {
191: ckcit( l1, l2, fdata);
192: }
193: }
194: if (pointf!=NULL)
195: {
196: pltpts(pointf);
197: fclose(pointf);
198: }
199: fflush(stdout);
200: }
201: exit(0);
202: }
203: okpat(ax, ay, lat, lng)
204: double lat, lng;
205: {
206: double d;
207: d = dist(ax*4., ay*4., lat, lng);
208: if (d<radius) return(1);
209: d = dist((ax+1)*4., ay*4., lat, lng);
210: if (d<radius) return(1);
211: d = dist(ax*4., (ay+1)*4., lat, lng);
212: if (d<radius) return(1);
213: d = dist((ax+1)*4., (ay+1)*4., lat, lng);
214: if (d<radius) return(1);
215: return(0);
216: }
217: ctydraw (pos1, pos2, ff)
218: FILE *ff;
219: long pos1, pos2;
220: {
221: float a[4];
222: int xa, ya, xb, yb;
223: register int t;
224: double alat, alng, blat, blng;
225: fseek (ff, pos1, 0);
226: while (fread (a, 4, sizeof(float), ff))
227: {
228: if (ftell(ff)>= pos2) break;
229: alat = a[0];
230: alng = a[1];
231: blat = a[2];
232: blng = a[3];
233:
234: xa = (clng - alng)*5000/radlong;
235: ya = (alat - clat)*5000/radlat;
236: xb = (clng - blng)*5000/radlong;
237: yb = (blat - clat)*5000/radlat;
238: if (abs(xa)<5000 && abs(xb)<5000 && abs(ya)<5000 && abs(yb)<5000)
239: {
240: pline(xa,ya,xb,yb);
241: continue;
242: }
243: if ((abs(xa)<5000 && abs(ya)<5000) || (abs(xb)<5000 && abs(yb)<5000) )
244: {
245: partial(&xa, &ya, &xb, &yb);
246: pline(xa, ya, xb, yb);
247: }
248: }
249: }
250: double
251: dist (aplat, aplon, bplat, bplon)
252: double aplon, aplat, bplon, bplat;
253: {
254: /* this code is from the picadad manual. I don't pretend
255: to understand it. */
256: double as, bs, ac, bc, p, cd, d, er;
257: double rad=0.0174532925;
258: er = aplon-bplon;
259: if (er<0) er= -er;
260: if (er<0.001)
261: {
262: d = aplat-bplat;
263: if (d<0) d= -d;
264: return(d*69.055);
265: }
266: as = sin(rad*aplat);
267: bs = sin(rad*bplat);
268: ac = cos(rad*aplat);
269: bc = cos(rad*bplat);
270: p = cos(er*rad);
271: cd = (as*bs+ac*bc*p);
272: return( acos(cd)*3956.56);
273: }
274: lcase (s)
275: char *s;
276: {
277: int c;
278: for( ; c= *s; s++)
279: if (isupper(c))
280: *s = tolower(c);
281: }
282: caps(s)
283: char *s;
284: {
285: int c;
286: if (islower(*s)) *s = toupper(*s);
287: for( s++; c= *s; s++)
288: {
289: if (islower(c) && (s[-1]==' ' || s[-1]=='-'))
290: if (strncmp(s, "of ", 3)!=SAME)
291: *s = toupper(c);
292: if (*s==',') break;
293: }
294: for(s++; c= *s; s++)
295: if (islower(c)) *s=toupper(c);
296: }
297: ckcit(pos1, pos2, countyf)
298: FILE *countyf;
299: long pos1, pos2;
300: {
301: char nam[50], *s;
302: int xa, yb, i, xthres, ythres, sz;
303: register int t;
304: double alat, alng;
305: float a[2];
306: fseek (countyf, pos1, 0);
307: while (fread(a, 2, sizeof(float), countyf))
308: {
309: if (ftell(countyf) >=pos2) break;
310: alat = a[0];
311: alng = a[1];
312: sz = getc(countyf);
313: s=nam;
314: while (i= getc(countyf))
315: {
316: if (i=='\n' || i==0) break;
317: *s++ = i;
318: }
319: *s=0;
320: switch (sz)
321: {
322: case '9': xthres=0; ythres=0; break;
323: case '8': xthres=500; ythres=150; break;
324: case '7': xthres=1000; ythres=300; break;
325: case '6': xthres=1500; ythres=400; break;
326: default : xthres=2000; ythres=400; break;
327: }
328: xa = (clng-alng)*5000/radlong;
329: yb = (alat-clat)*5000/radlat;
330: if (abs(xa)<5000 && abs(yb)<5000)
331: {
332: for(i=0; i<nlab; i++)
333: {
334: if (abs(xa-labx[i])<xthres && abs(yb-laby[i])<ythres)
335: break;
336: }
337: if (i<nlab) continue;
338: labx[nlab]=xa; laby[nlab]=yb;
339: nlab++;
340: assert(nlab<500);
341: ppoint(xa,yb);
342: caps(nam);
343: ptext(nam);
344: }
345: if (nlab>numnames) break;
346: }
347: }
348: pltpts(fi)
349: FILE *fi;
350: {
351: char ln[100], *s;
352: double alat, alng;
353: int x, y;
354: register int t;
355: while (fgets(ln, 100, fi))
356: {
357: trimnl(s=ln);
358: while (isspace(*s)) s++;
359: alat = atof(s);
360: while (*s && !isspace(*s))s++;
361: while (isspace(*s))s++;
362: alng = atof(s);
363: while (*s && !isspace(*s)) s++;
364: while (isspace(*s)) s++;
365: if (s==NULL || alat <0.0 || alng < 0.0)
366: continue;
367: alng = alng * cos(torad*40.0); /* crummy map projection */
368: x = (clng - alng)*5000/radlong;
369: y = (alat - clat)*5000/radlat;
370: if (abs(x)<5000 && abs(y)<5000)
371: {
372: pmove(x,y);
373: ptext(s);
374: }
375: }
376: }
377: partial (x0p, y0p, x1p, y1p)
378: int *x0p, *y0p, *x1p, *y1p;
379: { /* pick part of line within 5000 limit */
380: int ax, ay, bx, by, cx, cy;
381: double a, b; /* y= ax + b*/
382: register int t;
383: ax = *x0p; ay= *y0p; bx = *x1p; by = *y1p;
384: if (abs(ax)>5000 || abs(ay)>5000)
385: {
386: cx = ax; ax = bx; bx = cx;
387: cy = ay; ay = by; by = cy;
388: }
389: /* ax, ay is inside; bx, by is outside */
390: if (ax == bx) /* vertical line*/
391: {
392: if (by>5000) by=5000;
393: else
394: if (by< -5000) by= -5000;
395: }
396: else
397: if (ay == by) /* horizontal line */
398: {
399: if (bx>5000) bx=5000;
400: else
401: if (bx< -5000) bx= -5000;
402: }
403: else
404: {/* normal case, with slope */
405: a = ( (double) (by-ay) ) / (bx-ax);
406: b = ay - a*ax;
407: if (bx>5000)
408: {
409: bx=5000;
410: by = a*bx+b;
411: }
412: else
413: if (bx< -5000)
414: {
415: bx = -5000;
416: by = a*bx+b;
417: }
418: /* now bx is in range. what about by */
419: if (by> 5000)
420: {
421: by = 5000;
422: bx = (by -b)/a;
423: }
424: else
425: if (by< -5000)
426: {
427: by = -5000;
428: bx = (by - b) /a;
429: }
430: }
431: *x0p = ax;
432: *x1p = bx;
433: *y0p = ay;
434: *y1p = by;
435: }
436: trimnl(s)
437: char *s;
438: {
439: while (*s)s++;
440: if (*--s== '\n')*s=0;
441: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.