source: subversion/applications/utils/import/and2osm/osm.c @ 4349

Last change on this file since 4349 was 4348, checked in by martinvoosterhout, 13 years ago

Cleanup some of the code and add some comments. Also use column 31 for some
debug info.

File size: 21.3 KB
Line 
1/******************************************************************************
2 * Copyright (c) 2007  Marc Kessels
3 * Copyright (c) 2007  Jeroen Dekkers <jeroen@dekkers.cx>
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 ******************************************************************************
23 */
24
25
26#include <stdlib.h>
27#include <stdio.h>
28#include <string.h>
29#include "osm.h"
30#include "ways.h"
31#include "segments.h"
32#include "nodes.h"
33#include "tags.h"
34
35
36#include "2AND.h"
37/*datatypes*/
38
39
40extern int postgres;
41extern int osmChange;
42
43
44/* File descriptor for .osm file. */
45FILE *fp=NULL;
46
47/* File descriptors for postgres sql files. */
48FILE *fp_n=NULL;
49FILE *fp_nt=NULL;
50FILE *fp_w=NULL;
51FILE *fp_wn=NULL;
52FILE *fp_wt=NULL;
53
54
55/*useful functions*/
56long incr (long i) {
57        if (postgres)
58                return i+1;
59        else
60                return i-1;
61}
62
63int openOutput()
64{
65        if (postgres)
66        {
67                fp_n=fopen("nodes.sql","w");
68                fp_nt=fopen("node_tags.sql","w");
69                fp_w=fopen("ways.sql","w");
70                fp_wn=fopen("way_nodes.sql","w");
71                fp_wt=fopen("way_tags.sql","w");
72                if ((fp_n==NULL) || (fp_nt==NULL) ||(fp_w==NULL) ||(fp_wn==NULL) ||(fp_wt==NULL))
73                {
74                        printf("error opening files, exiting...");
75                        return -1;
76                }
77
78                fprintf(fp_n, "BEGIN;\n");
79                fprintf(fp_n, "PREPARE nodes_insert (int, numeric, numeric) AS INSERT INTO nodes VALUES ($1, SetSRID(MakePoint($2, $3),4326));\n");
80                fprintf(fp_nt, "COPY node_tags (node_id, k, v) FROM stdin;\n");
81                fprintf(fp_w, "BEGIN;\n");
82                fprintf(fp_wn, "COPY way_nodes (way_id, seq, node_id) FROM stdin;\n");
83                fprintf(fp_wt, "COPY way_tags (way_id, k, v) FROM stdin;\n");
84        }
85        else
86        {
87                fp=fopen("AND2osm.osm","w");
88                if (fp==NULL)
89                {
90                        printf("error opening file, exiting...");
91                        return -1;
92                }
93                if( osmChange )
94                        fprintf(fp,"<osmChange version=\"0.3\" generator=\"2AND\">\n<create>\n");
95                else
96                        fprintf(fp,"<osm version=\"0.4\">\n");
97        }
98       
99        return 0;
100}
101
102
103void save(){
104        saveNodes();
105        saveSegments();
106        saveWays();
107}
108
109
110
111int closeOutput()
112{
113        if (postgres)
114        {
115                fprintf(fp_n, "COMMIT;\n");
116                fprintf(fp_nt, "\\.\n");
117                fprintf(fp_w, "COMMIT;\n");
118                fprintf(fp_wn, "\\.\n");
119                fprintf(fp_wt, "\\.\n");
120
121                fclose(fp_n);
122                fclose(fp_nt);
123                fclose(fp_w);
124                fclose(fp_wn);
125                fclose(fp_wt);
126        }
127        else 
128        {
129                if( osmChange )
130                        fprintf(fp,"</create>\n</osmChange>\n");
131                else
132                        fprintf(fp,"</osm>\n");
133                fclose(fp);
134        }
135        return 0;
136}
137
138
139
140struct tags * mkTagList(DBFHandle hDBF,long recordnr,int fileType,struct tags *p,struct nodes * from, struct nodes * to){
141        char name[100];
142        if (fileType==NODE)
143        {
144                //printf("in mkTagList\n");
145               
146                //all files except *r_r
147               
148                //Field 0: Type=Double, Title=`AREA', Width=20, Decimals=5
149                //Field 1: Type=Double, Title=`PERIMETER', Width=20, Decimals=5
150                //Field 2: Type=Integer, Title=`ONLY_', Width=11, Decimals=0
151                //Field 3: Type=Integer, Title=`ND_1', Width=11, Decimals=0
152                if (DBFReadIntegerAttribute( hDBF, recordnr, 3 )!=0)
153                {
154                        int ID = DBFReadIntegerAttribute( hDBF, recordnr, 3 );
155                        sprintf(name,"AND=%i",ID);
156                       
157                        if( from!=to)
158                        {
159//                              printf("\rAARRRGGGG:a nodeID can be attached to a way........(rec=%ld)\n",recordnr);
160                                /* Not actually an error, occurs whenever
161                                 * an object consists of multiple parts. In
162                                 * that case the first node and last node are
163                                 * in different parts and thus obviously
164                                 * different... */
165                                Err_ND_attached_to_way++;
166                        }
167                        if (from->ANDID==0)
168                                from->ANDID=ID;
169                        else if (from->ANDID!=ID && ID < 10000000)
170                        {       
171                                printf("\rone node shouldn't get more than one ANDID! patch needed!%li %i\n",from->ANDID,ID);
172                                Err_more_NDIDs_per_node++;
173                        }
174                        p=addtag(p,"external-ID",name,NULL);
175                }
176               
177                //Field 4: Type=Integer, Title=`ND_2', Width=2, Decimals=0
178                //Field 5: Type=Integer, Title=`ND_3', Width=2, Decimals=0
179                //Field 6: Type=Integer, Title=`ND_4', Width=3, Decimals=0
180                switch (DBFReadIntegerAttribute( hDBF, recordnr, 6 ))
181                {
182                        case 1: p=addtag(p,"highway","motorway_junction",NULL); break;//junction(exit)
183                        //case 2: p=addtag(p,"highway","motorway_junction",NULL); break;//intersection
184                        //case 3: p=addtag(p,"highway","motorway_junction",NULL); break;//Border node
185                        //case 4: p=addtag(p,"highway","motorway_junction",NULL); break;//Directional information
186                        //case 5: p=addtag(p,"highway","motorway_junction",NULL); break;//Toll Booth Info
187                        //case 9: p=addtag(p,"highway","motorway_junction",NULL); break;//Level dead end, location other than a type 3 or 10-27 where a level may terminate
188                        case 10: p=addtag(p,"place","city",NULL); break;//capital city
189                        case 11: p=addtag(p,"place","city",NULL);
190                                 p=addtag(p,"population","500000",NULL);break;//Large city > 500,000
191                        case 12: p=addtag(p,"place","city",NULL);
192                                 p=addtag(p,"population","100000",NULL);break;//Large city > 500,000
193                        case 13: p=addtag(p,"place","town",NULL);
194                                 p=addtag(p,"population","50000",NULL);break;//Large city > 500,000
195                        case 14: p=addtag(p,"place","town",NULL);
196                                 p=addtag(p,"population","10000",NULL);break;//Large city > 500,000
197                        case 15: p=addtag(p,"place","village",NULL);
198                                 p=addtag(p,"population","5000",NULL);break;//Large city > 500,000
199                        case 16: p=addtag(p,"place","village",NULL);
200                                 p=addtag(p,"population","1000",NULL);break;//Large city > 500,000
201                        case 17: p=addtag(p,"place","village",NULL);break;//Large city > 500,000
202                       
203                        case 30: p=addtag(p,"railway","station",NULL); break;
204                        case 36: p=addtag(p,"aminity","parking",NULL); break;
205                        case 40: p=addtag(p,"aeroway","aerodrome",NULL); break;
206                        case 41: p=addtag(p,"aeroway","aerodrome",NULL); break;
207                        case 42: p=addtag(p,"aeroway","aerodrome",NULL); break;
208                        case 43: p=addtag(p,"aeroway","aerodrome",NULL); break;
209                        case 44: p=addtag(p,"aeroway","helipad",NULL); break;
210                        //case 45: p=addtag(p,"aeroway","seaplane base",NULL); break;
211                        case 46: p=addtag(p,"aeroway","aerodrome",NULL); break;
212                        case 47: p=addtag(p,"aeroway","aerodrome",NULL); break;
213                        case 48: p=addtag(p,"aeroway","aerodrome",NULL); break;
214                        case 80: p=addtag(p,"amenity","parking",NULL); 
215                                 p=addtag(p,"amenity","fuel",NULL); break;
216                        case 81: p=addtag(p,"amenity","parking",NULL); break;
217                        case 82: p=addtag(p,"amenity","parking",NULL); 
218                                 p=addtag(p,"amenity","fuel",NULL); break;
219                        case 83: p=addtag(p,"amenity","parking",NULL); 
220                                 p=addtag(p,"amenity","restaurant",NULL); 
221                                 p=addtag(p,"amenity","fuel",NULL); break;
222                        case 84: p=addtag(p,"amenity","parking",NULL); 
223                                 p=addtag(p,"amenity","restaurant",NULL); 
224                                 p=addtag(p,"tourism","hotel",NULL); 
225                                 p=addtag(p,"amenity","fuel",NULL); break;       
226                        case 91: p=addtag(p,"natural","water",NULL);break;       
227                        case 92: p=addtag(p,"waterway","river",NULL); break;   
228                        case 94: p=addtag(p,"natural","water",NULL); break;     
229                        case 95: p=addtag(p,"place","city",NULL); break;
230                        case 96: p=addtag(p,"natural","wood",NULL); break;     
231                        case 97: p=addtag(p,"natural","water",NULL); break;     
232                        case 98: p=addtag(p,"place","city",NULL); break;
233                        case 99: p=addtag(p,"aeroway","aerodrome",NULL); break; 
234                        case 101: p=addtag(p,"leisure","park",NULL); break;     
235                        case 102: p=addtag(p,"leisure","park",NULL); break;     
236                        case 103: p=addtag(p,"boundary","town",NULL); break;   
237                        case 104: p=addtag(p,"landuse","cemetery",NULL); break; 
238                        case 105: p=addtag(p,"sport","golf",NULL); break;       
239                        case 106: p=addtag(p,"natural","beach",NULL); break;   
240                        case 107: p=addtag(p,"natural","marsh",NULL); break;   
241                        case 109: p=addtag(p,"landuse","industrial",NULL); break;       
242                }
243                //Field 7: Type=Integer, Title=`ND_5', Width=3, Decimals=0
244                //Field 8: Type=Integer, Title=`ND_6', Width=2, Decimals=0
245                //Field 9: Type=Integer, Title=`ND_7', Width=2, Decimals=0
246                //Field 10: Type=String, Title=`ND_8', Width=10, Decimals=0
247                if (!(DBFIsAttributeNULL( hDBF, recordnr, 10 )))
248                {
249                //printf("adding name\n");
250                        sprintf(name,"%s",DBFReadStringAttribute( hDBF, recordnr, 10 ));
251                        p=addtag(p,"postal_code",name,NULL); /*efficient gebruik maken van rv!*/
252                        //             
253                }
254                //Field 12: Type=String, Title=`ND_10', Width=10, Decimals=0
255                name[0]='\0';
256                if (!(DBFIsAttributeNULL( hDBF, recordnr, 12 )))//prefix name
257                {
258                        sprintf(name,"%s",DBFReadStringAttribute( hDBF, recordnr, 12 ));
259                }       
260                //Field 11: Type=String, Title=`ND_9', Width=199, Decimals=0
261                if (!(DBFIsAttributeNULL( hDBF, recordnr, 11 )))// name
262                {
263                        sprintf(name+strlen(name),"%s",DBFReadStringAttribute( hDBF, recordnr, 11 ));
264                }       
265                //Field 13: Type=String, Title=`ND_11', Width=20, Decimals=0
266                if (!(DBFIsAttributeNULL( hDBF, recordnr, 13 )))// postfix name
267                {
268                        sprintf(name+strlen(name),"%s",DBFReadStringAttribute( hDBF, recordnr, 13 ));
269                }       
270                if (strcmp(name,"")!=0) p=addtag(p,"name",name,NULL); 
271               
272                //Field 14: Type=String, Title=`ND_12', Width=2, Decimals=0
273                //Field 15: Type=String, Title=`ND_13', Width=10, Decimals=0
274                if (!(DBFIsAttributeNULL( hDBF, recordnr, 15 )))
275                {
276                //printf("adding name\n");
277                        sprintf(name,"%s",DBFReadStringAttribute( hDBF, recordnr, 15));
278                        p=addtag(p,"AND_ND_CODE",name,NULL); 
279                }
280               
281                //Field 16: Type=Integer, Title=`ND_14', Width=3, Decimals=0
282                //Field 17: Type=Integer, Title=`ND_15', Width=2, Decimals=0
283                //Field 18: Type=String, Title=`ND_16', Width=60, Decimals=0
284                //Field 19: Type=String, Title=`ND_17', Width=10, Decimals=0
285                //Field 20: Type=String, Title=`ND_18', Width=20, Decimals=0
286                //Field 21: Type=Integer, Title=`ND_19', Width=3, Decimals=0
287                //Field 22: Type=String, Title=`ND_20', Width=2, Decimals=0
288                //Field 23: Type=String, Title=`ND_21', Width=60, Decimals=0
289                //Field 24: Type=String, Title=`ND_22', Width=10, Decimals=0
290                //Field 25: Type=String, Title=`ND_23', Width=20, Decimals=0
291                //Field 26: Type=Integer, Title=`ND_24', Width=3, Decimals=0
292                //Field 27: Type=Integer, Title=`ND_25', Width=10, Decimals=0
293                if (DBFReadIntegerAttribute( hDBF, recordnr, 27 )>0)
294                {
295                //printf("adding name\n");
296                        sprintf(name,"%i",DBFReadIntegerAttribute( hDBF, recordnr, 6 ));
297                        p=addtag(p,"AND_ND_CODE",name,NULL); 
298                }
299               
300                //Field 28: Type=String, Title=`ND_26', Width=60, Decimals=0
301                //Field 29: Type=String, Title=`ND_27', Width=30, Decimals=0
302                //Field 30: Type=String, Title=`ND_28', Width=60, Decimals=0
303                //Field 31: Type=String, Title=`ND_29', Width=60, Decimals=0
304               
305                /* We've taken over attribute 31 for debugging purposes, just stuff it into the debug tag */
306                if (!(DBFIsAttributeNULL( hDBF, recordnr, 31 )))
307                {
308                //printf("adding name\n");
309                        sprintf(name,"%s",DBFReadStringAttribute( hDBF, recordnr, 31));
310                        p=addtag(p,"AND_DEBUG",name,NULL); 
311                }
312               
313        }
314        else
315        {
316               
317                /* The AND_NODE_IDs are inverted with respect to the shapefile */
318                int inverted = 0;
319               
320                //nosr_r
321                //r_r
322                //Field 0: Type=Integer, Title=`FNODE_', Width=11, Decimals=0
323                if (!(DBFIsAttributeNULL( hDBF, recordnr, 0)))
324                {
325                        int ID = DBFReadIntegerAttribute( hDBF, recordnr, 0 );
326                        sprintf(name,"%i",ID);
327                        p=addtag(p,"AND_FROM_NODE",name,NULL);
328                        if (from->ANDID != 0 && from->ANDID != ID && to->ANDID == 0 )
329                                to->ANDID = ID;
330                        if (to->ANDID == ID )
331                                inverted = 1;
332                        if ((from->ANDID!=ID) && (to->ANDID!=ID))
333                        {
334//                              printf("\rway referres to unattached ANDID! from=%li to=%li new_from=%i,name=%s, %f,%f \n",from->ANDID,to->ANDID,ID,DBFReadStringAttribute( hDBF, recordnr, 15 ),from->lat, from->lon);
335                                Err_fromID_without_ANDID++;
336                        }
337                }
338                       
339                       
340                //Field 1: Type=Integer, Title=`TNODE_', Width=11, Decimals=0
341                if (!(DBFIsAttributeNULL( hDBF, recordnr, 1)))
342                {
343                        int ID = DBFReadIntegerAttribute( hDBF, recordnr, 1 );
344                        sprintf(name,"%i",ID);
345                        p=addtag(p,"AND_TO_NODE",name,NULL);
346                        if (to->ANDID != 0 && to->ANDID != ID && from->ANDID == 0 )
347                                from->ANDID = ID;
348                        if (from->ANDID == ID )
349                                inverted = 1;
350                        if ((from->ANDID!=ID) && (to->ANDID!=ID))
351                        {
352                //              printf("\rway referres to unattached ANDID! %li %li %i,%s, %f,%f \n",from->ANDID,to->ANDID,DBFReadIntegerAttribute( hDBF, recordnr, 0 ),DBFReadStringAttribute( hDBF, recordnr, 15 ),from->lat, from->lon);
353                                Err_toID_without_ANDID++;
354                        }
355                }
356                if (inverted)
357                        p=addtag(p,"AND-inverted","yes",NULL);
358                       
359                //Field 2: Type=Integer, Title=`LPOLY_', Width=11, Decimals=0
360                //Field 3: Type=Integer, Title=`RPOLY_', Width=11, Decimals=0
361                //Field 4: Type=Double, Title=`LENGTH', Width=20, Decimals=5
362                //Field 5: Type=Integer, Title=`NLD6_', Width=11, Decimals=0
363                //Field 6: Type=Integer, Title=`RD_1', Width=11, Decimals=0
364                if (!(DBFIsAttributeNULL( hDBF, recordnr, 6)))
365                {
366                        sprintf(name,"AND=%i",DBFReadIntegerAttribute( hDBF, recordnr, 6 ));
367                        p=addtag(p,"external-ID",name,NULL);
368                }
369               
370                //Field 7: Type=Integer, Title=`RD_2', Width=8, Decimals=0
371                //Field 8: Type=Integer, Title=`RD_3', Width=5, Decimals=0
372                //Field 9: Type=Integer, Title=`RD_4', Width=2, Decimals=0
373                if (DBFReadIntegerAttribute( hDBF, recordnr, 9 )==1)
374                {
375                        if (from->ANDID==DBFReadIntegerAttribute( hDBF, recordnr, 0 ))
376                                p=addtag(p,"oneway","1",NULL);
377                        else
378                                p=addtag(p,"oneway","-1",NULL);
379                }       
380                else if (DBFReadIntegerAttribute( hDBF, recordnr, 9 )==2)
381                {
382                        if (from->ANDID==DBFReadIntegerAttribute( hDBF, recordnr, 0 ))
383                                p=addtag(p,"oneway","-1",NULL);
384                        else
385                                p=addtag(p,"oneway","1",NULL);
386                }
387                //Field 10: Type=Integer, Title=`RD_5', Width=3, Decimals=0
388                switch (DBFReadIntegerAttribute( hDBF, recordnr, 10 ))
389                {
390                        case 1: p=addtag(p,"highway","motorway",NULL); break;
391                        case 2: p=addtag(p,"highway","trunk",NULL); break;
392                        case 3: p=addtag(p,"highway","primary",NULL); break;
393                        case 4: p=addtag(p,"highway","secondary",NULL); break;
394                        case 5: p=addtag(p,"highway","tertiary",NULL); break;
395                        case 6:
396                        {
397                                if (DBFReadIntegerAttribute( hDBF, recordnr, 26 )==-1)
398                                {
399                                        p=addtag(p,"highway","pedestrian",NULL); 
400                                }
401                                else
402                                {
403                                        p=addtag(p,"highway","unclassified",NULL); 
404                                }
405                               
406                        }
407                        break; 
408                        case 7: p=addtag(p,"route","ferry;motorcars=yes;hgv=yes",NULL); break;
409                        case 9: p=addtag(p,"route","ferry;motorcars=no;foot=yes",NULL); break;
410                        case 30: p=addtag(p,"railway","rail",NULL); break;
411                        case 50: p=addtag(p,"highway","service",NULL); break;
412                        case 58: p=addtag(p,"highway","footway",NULL); break;
413                        case 59: p=addtag(p,"highway","virtual",NULL); break;
414                        default: printf("unkown road type %i\n",DBFReadIntegerAttribute( hDBF, recordnr, 10 )); break;
415       
416                }
417
418                //Field 11: Type=Integer, Title=`RD_6', Width=3, Decimals=0
419                //Field 12: Type=Integer, Title=`RD_7', Width=2, Decimals=0
420                if (DBFReadIntegerAttribute( hDBF, recordnr, 12 )==10)
421                        p=addtag(p,"railway","rail",NULL); 
422                       
423               
424               
425                //Field 13: Type=Integer, Title=`RD_8', Width=2, Decimals=0
426                //Field 14: Type=String, Title=`RD_9', Width=1, Decimals=0
427                //Field 15: Type=String, Title=`RD_10', Width=60, Decimals=0
428                if (!(DBFIsAttributeNULL( hDBF, recordnr, 15 )))
429                {
430                //printf("adding name\n");
431                        sprintf(name,"%s",DBFReadStringAttribute( hDBF, recordnr, 15 ));
432                        p=addtag(p,"name",name,NULL); /*efficient gebruik maken van rv!*/
433//              printf("added name %s\n",name);
434                }
435               
436                //Field 16: Type=String, Title=`RD_11', Width=12, Decimals=0
437                name[0]='\0';
438                if (!(DBFIsAttributeNULL( hDBF, recordnr, 16 )))//nat ref
439                {
440                        sprintf(name,"%s",DBFReadStringAttribute( hDBF, recordnr, 16 ));
441                }       
442                //Field 17: Type=String, Title=`RD_12', Width=12, Decimals=0
443                if (!(DBFIsAttributeNULL( hDBF, recordnr, 17 )))// nat ref2
444                {
445                        sprintf(name+strlen(name),";%s",DBFReadStringAttribute( hDBF, recordnr, 17 ));
446                }       
447                //Field 18: Type=String, Title=`RD_13', Width=12, Decimals=0
448                if (!(DBFIsAttributeNULL( hDBF, recordnr, 18 )))// nat ref3
449                {
450                        sprintf(name+strlen(name),";%s",DBFReadStringAttribute( hDBF, recordnr, 18 ));
451                }       
452                if (strcmp(name,"")!=0) p=addtag(p,"nat_ref",name,NULL); 
453               
454               
455               
456               
457               
458               
459               
460                //Field 19: Type=String, Title=`RD_14', Width=12, Decimals=0
461                name[0]='\0';
462                if (!(DBFIsAttributeNULL( hDBF, recordnr, 19 )))//int ref
463                {
464                        sprintf(name,"%s",DBFReadStringAttribute( hDBF, recordnr, 19 ));
465                }       
466                //Field 20: Type=String, Title=`RD_15', Width=12, Decimals=0
467                if (!(DBFIsAttributeNULL( hDBF, recordnr, 20 )))// int ref2
468                {
469                        sprintf(name+strlen(name),";%s",DBFReadStringAttribute( hDBF, recordnr, 20 ));
470                }       
471                //Field 21: Type=String, Title=`RD_16', Width=12, Decimals=0
472                if (!(DBFIsAttributeNULL( hDBF, recordnr, 21 )))// int ref3
473                {
474                        sprintf(name+strlen(name),";%s",DBFReadStringAttribute( hDBF, recordnr, 21 ));
475                }       
476                if (strcmp(name,"")!=0) p=addtag(p,"int_ref",name,NULL); 
477               
478               
479                //Field 22: Type=Integer, Title=`RD_17', Width=2, Decimals=0
480                if (DBFReadIntegerAttribute( hDBF, recordnr, 22 )==1)
481                {
482                        p=addtag(p,"tunnel","yes",NULL);
483                       
484                        if ((DBFReadIntegerAttribute( hDBF, recordnr, 25 )<1)||(DBFReadIntegerAttribute( hDBF, recordnr, 25 )>8))
485                        {
486                                p=addtag(p,"layer","-1",NULL); 
487                        }
488                }
489                else if(DBFReadIntegerAttribute( hDBF, recordnr, 22 )==2)
490                {
491                        p=addtag(p,"bridge","yes",NULL);
492                       
493                        if ((DBFReadIntegerAttribute( hDBF, recordnr, 25 )<1)||(DBFReadIntegerAttribute( hDBF, recordnr, 25 )>8))
494                        {
495                                p=addtag(p,"layer","1",NULL); 
496                        }
497                }
498                else if(DBFReadIntegerAttribute( hDBF, recordnr, 22 )!=0)
499                        printf("\nunkown tunnel code%i\n",(DBFReadIntegerAttribute( hDBF, recordnr, 22 ))); 
500                //Field 23: Type=Integer, Title=`RD_18', Width=2, Decimals=0
501                //Field 23: Type=Integer, Title=`RD_18', Width=2, Decimals=0
502                if (DBFReadIntegerAttribute( hDBF, recordnr, 23 )!=0)
503                        p=addtag(p,"toll","yes",NULL);
504
505                //Field 24: Type=Integer, Title=`RD_19', Width=5, Decimals=0
506                //Field 25: Type=Integer, Title=`RD_20', Width=2, Decimals=0
507                switch (DBFReadIntegerAttribute( hDBF, recordnr, 25 ))
508                {
509                        case 1: p=addtag(p,"layer","-4",NULL); break;
510                        case 2: p=addtag(p,"layer","-3",NULL); break;
511                        case 3: p=addtag(p,"layer","-2",NULL); break;
512                        case 4: p=addtag(p,"layer","-1",NULL); break;
513                        case 5: p=addtag(p,"layer","1",NULL); break;
514                        case 6: p=addtag(p,"layer","2",NULL); break;
515                        case 7: p=addtag(p,"layer","3",NULL); break;
516                        case 8: p=addtag(p,"layer","4",NULL); break;
517                }
518
519                //Field 26: Type=Integer, Title=`RD_21', Width=3, Decimals=0
520                switch (DBFReadIntegerAttribute( hDBF, recordnr, 26 ))
521                {
522                        case -1: 
523                        if (DBFReadIntegerAttribute( hDBF, recordnr, 10 )!=6)
524                        {
525                                p=addtag(p,"foot","yes",NULL); 
526                                p=addtag(p,"motorcar","no",NULL); 
527                                p=addtag(p,"motorcycle","no",NULL); 
528                                p=addtag(p,"hgv","no",NULL);
529                        }
530                        break;
531                               
532                        case 3: p=addtag(p,"maxweight","3.5",NULL); break;
533                        case 28: p=addtag(p,"maxweight","28",NULL); break;
534                        case 40: p=addtag(p,"maxweight","40",NULL); break;
535                }
536
537                //Field 27: Type=Integer, Title=`RD_22', Width=2, Decimals=0
538                if (DBFReadIntegerAttribute( hDBF, recordnr, 27 )>0)
539                        p=addtag(p,"toll","hgv",NULL); 
540                //Field 28: Type=String, Title=`RD_23', Width=60, Decimals=0
541                if (!(DBFIsAttributeNULL( hDBF, recordnr,28 )))
542                {
543                        //printf("\r%s           \n",DBFReadStringAttribute( hDBF, recordnr, 28 ));
544                        sprintf(name,"%s",DBFReadStringAttribute( hDBF, recordnr, 28 ));
545                        char *result = NULL;
546                        result = strtok( name, "@");
547                        while( result != NULL )
548                        {
549                                switch (*result)
550                                {
551                                        case 's'://slip road and stub link
552                                                if (*(name+1)=='l')
553                                                {
554                                                        if (DBFReadIntegerAttribute( hDBF, recordnr, 10 )==1)
555                                                                p=addtag(p,"highway","motorway_link",NULL);
556                                                        else
557                                                                p=addtag(p,"highway","trunk_link",NULL);
558                                                }
559                                                break;
560                                        case 'r': //roundabout
561                                                p=addtag(p,"junction","roundabout",NULL);
562                                                break;
563                                        case 'l': //lay-by and long haul
564                                                if (*(name+1)=='b')
565                                                {
566                                                        p=addtag(p,"highway","layby",NULL);
567                                                }
568                                                break;
569                                        case '4': //4-wheel drive
570                                                p=addtag(p,"grade","5",NULL);
571                                                break;
572                                        case 'u': //unsealed
573                                                p=addtag(p,"surface","unpaved",NULL);
574                                                break;
575                                        case 'f': //functional class
576                                                break;
577                                        case 'h': //house numbers
578                                                break;
579                                        default:
580                                                printf("\runkown RD_OTHER attribute\n");
581                                                break;
582                                }
583                               
584                                result = strtok( NULL, "@" );
585                        }
586   
587
588                }       
589                //Field 29: Type=Integer, Title=`RD_24', Width=3, Decimals=0
590                //Field 30: Type=Integer, Title=`RD_25', Width=11, Decimals=0
591                //Field 31: Type=Integer, Title=`RD_26', Width=11, Decimals=0
592        }
593         //printf("attr %i\n", DBFReadIntegerAttribute( hDBF, recordnr, 10 ));
594       
595         /*if (psShape->nSHPType!=SHPT_POINT)
596         {
597                 p=addtag(p,"source","AND",NULL);
598                 p=addtag(p,"source-ref","www.and.com",NULL);
599         }
600         if (psShape->nSHPType=SHPT_ARC)
601                 fprintf(fp,"   </way>\n",-1-i);
602         else if (psShape->nSHPType=SHPT_POLYGON)
603                 fprintf(fp,"    </area>\n",-1-i);
604               
605*/
606         return p; /*should be pointer to first item in tag-list*/
607 }
608 
Note: See TracBrowser for help on using the repository browser.