source: subversion/applications/utils/import/and2osm/ways.c @ 4361

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

Add progress display for final output...

File size: 5.2 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include "ways.h"
4#include "segments.h"
5#include "tags.h"
6#include "osm.h"
7#include "rb.h"
8
9extern int postgres;
10
11
12/* File descriptor for .osm file. */
13extern FILE *fp;
14
15/* File descriptors for postgres sql files. */
16extern FILE *fp_n;
17extern FILE *fp_nt;
18extern FILE *fp_w;
19extern FILE *fp_wn;
20extern FILE *fp_wt;
21
22
23struct rb_table *way_table;
24
25
26
27
28void detachsegments(struct ways* p){
29        struct attachedSegments *temp;
30        temp=p->segments;
31        while (temp!=NULL)
32        {
33                temp->segment->ways=detachway(temp->segment->ways,p);
34                if(temp->segment->ways==NULL)
35                {
36                        //empty segment
37                        deleteSegment(temp->segment);
38                }
39                p->segments=temp->nextSegment;
40                free(temp);
41                temp=p->segments;
42        }
43       
44
45}
46
47
48
49
50
51
52
53struct attachedSegments * attachsegment(struct attachedSegments* p, struct segments *s){
54        //printf("%p\t%p\n",p,s);
55        if (p==NULL)
56        {
57                p = (struct attachedSegments *) calloc(1,sizeof(struct attachedSegments));
58                if (p==NULL)
59                {
60                        fprintf(stderr,"out of memory\n");
61                        exit(1);
62                }
63                p->nextSegment=NULL;
64                p->segment=s;
65        }
66        else
67        {
68                p->nextSegment=attachsegment(p->nextSegment,s);
69        }
70        return p;
71}
72
73
74
75
76void saveAttachedSegments(struct attachedSegments *p){
77        if (p!=NULL)
78        {
79                fprintf(fp,"            <seg id=\"%li\" />\n",p->segment->ID);
80//              printf("(%2.5f, %2.5f)-(%2.5f,%2.5f)\n",p->Segment->from->lon,p->Segment->from->lat,p->Segment->to->lon,p->Segment->to->lat);
81                saveAttachedSegments(p->nextSegment);
82        }
83}
84
85
86
87
88void saveWay(struct ways *p){
89
90        if (postgres)
91        {
92                struct tags *t;
93                struct attachedSegments *s;
94                int part = 0;
95
96                if (p->segments == NULL)
97                {
98                        printf("Way %li doesn't have segments, ignoring", p->wayID);
99                        return;
100                }
101
102                s = p->segments;
103                /* Note: Technically this conversion is wrong, it splits ways when they are non-contiguous */
104                for(;;) { 
105                        long seqid = 1;
106                        long wayID = p->wayID + part*10000000;
107                        fprintf(fp_w, "INSERT INTO ways VALUES (%li, GeomFromText('LINESTRING(", wayID);
108
109                        for (;;s = s->nextSegment)
110                        {
111                                fprintf(fp_w, "%1.6f %1.6f,", s->segment->from->lat, s->segment->from->lon);
112                                fprintf(fp_wn, "%li\t%li\t%li\n", wayID, seqid++, s->segment->from->ID);
113                                if (s->nextSegment == NULL || s->segment->to != s->nextSegment->segment->from )
114                                {
115                                        fprintf(fp_w, "%1.6f %1.6f)', 4326));\n", s->segment->to->lat, s->segment->to->lon);
116                                        fprintf(fp_wn, "%li\t%li\t%li\n", wayID, seqid++, s->segment->to->ID);
117                                        break;
118                                }
119                        }
120
121                        fprintf(fp_wt,"%li\t%s\t%d\n", wayID, "AND_part", part+1 );
122                        for (t = p->tag; t != NULL; t = t->nextTag)
123                                fprintf(fp_wt, "%li\t%s\t%s\n", wayID, t->key, t->value);
124                               
125                        if( s->nextSegment == NULL )
126                                break;
127                        s = s->nextSegment;
128                        part++;
129                }
130        }               
131        else
132        {
133                       
134                if (p->type==ROAD)
135                        fprintf(fp,"    <way id=\"%li\" >\n",p->wayID);
136                else if (p->type==AREA)
137                        fprintf(fp,"    <way id=\"%li\" >\n",p->wayID);
138                else fprintf(stderr,"unkown wayType in saveWay\n");
139                saveTags(p->tag,NULL);
140                saveAttachedSegments(p->segments);
141                if (p->type==ROAD)
142                        fprintf(fp,"    </way>\n");
143                else if (p->type==AREA)
144                        fprintf(fp,"    </way>\n");
145        }
146}
147
148void saveWays(){
149        int count = 0;
150        struct rb_traverser tr;
151        struct ways * p;
152        rb_t_init (&tr, way_table);
153        while ((p=(struct ways *) rb_t_next(&tr))!=NULL)
154        {
155                count++;
156                if( (count%1024) == 0 )
157                        fprintf(stderr, "\rExporting ways: %d ", count);
158                saveWay(p);
159        }
160        fprintf(stderr, "\rExported ways: %d ", count);
161}
162
163
164 
165 void addSegment2Way(struct ways * way,struct segments * segment){
166        way->segments=attachsegment(way->segments,segment);
167        segment->ways=attachway(segment->ways,way);
168        if (way->max_lon < segment->from->lon) way->max_lon=segment->from->lon;
169        if (way->max_lon < segment->to->lon) way->max_lon=segment->to->lon;
170        if (way->max_lat < segment->from->lat) way->max_lat=segment->from->lat;
171        if (way->max_lat < segment->to->lat) way->max_lat=segment->to->lat;
172        if (way->min_lon > segment->from->lon) way->min_lon=segment->from->lon;
173        if (way->min_lon > segment->to->lon) way->min_lon=segment->to->lon;
174        if (way->min_lat > segment->from->lat) way->min_lat=segment->from->lat;
175        if (way->min_lat > segment->to->lat) way->min_lat=segment->to->lat;
176
177       
178        //printf("node from %i to %i, (%f,%f)-(%f-%f)",segment->from->ID, segment->to->ID,segment->from->lon,segment->from->lat,segment->to->lon,segment->to->lat);
179        return;
180}
181
182
183struct ways *newWay(int wayType){
184        struct ways *storeway, **p;
185        static long wayID = 0;
186        storeway = (struct ways *) calloc(1,sizeof(struct ways));
187        if (storeway==NULL)
188        {
189                fprintf(stderr,"out of memory\n");
190                exit(1);
191        }
192        storeway->type=wayType;
193        wayID = incr(wayID);
194        storeway->wayID=wayID;
195        storeway->tag=NULL;
196        storeway->segments=NULL;
197        storeway->min_lat=999;
198        storeway->min_lon=999;
199        storeway->max_lat=-1;
200        storeway->max_lon=-1;
201        p=(struct ways **) rb_probe (way_table, storeway);
202        if (*p!=storeway)
203        {
204                //item was already in list
205                free(storeway);
206                printf("way with duplicate ID found, should not occur!!!\n");
207        }
208        return *p;
209}
210
211
212
213
214
215
216int compare_ways (const void *pa, const void *pb, void *param)
217{
218  const struct ways *a = pa;
219  const struct ways *b = pb;
220
221  return (a->wayID > b->wayID) - (a->wayID < b->wayID);
222
223}
224
225
226
227
228void init_ways()
229{
230        if (way_table==NULL)
231        {
232                way_table=rb_create (compare_ways, NULL,NULL);
233        }
234        else
235        {
236                printf("error: text_table is inited twice\n");
237                exit(1);
238        }
239        return;
240};
241
Note: See TracBrowser for help on using the repository browser.