Routino SVN Repository Browser

Check out the latest version of Routino: svn co http://routino.org/svn/trunk routino

ViewVC logotype

Annotation of /trunk/src/planetsplitter.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 109 - (hide annotations) (download) (as text)
Sat Feb 7 15:56:08 2009 UTC (16 years, 1 month ago) by amb
File MIME type: text/x-csrc
File size: 7109 byte(s)
Split the extended data types from the normal data types.

1 amb 2 /***************************************
2 amb 109 $Header: /home/amb/CVS/routino/src/planetsplitter.c,v 1.31 2009-02-07 15:56:07 amb Exp $
3 amb 2
4     OSM planet file splitter.
5     ******************/ /******************
6     Written by Andrew M. Bishop
7    
8 amb 4 This file Copyright 2008,2009 Andrew M. Bishop
9 amb 2 It may be distributed under the GNU Public License, version 2, or
10     any higher version. See section COPYING of the GNU Public license
11     for conditions under which this file may be redistributed.
12     ***************************************/
13    
14    
15     #include <stdio.h>
16     #include <stdlib.h>
17 amb 60 #include <string.h>
18 amb 2
19 amb 96 #include "types.h"
20 amb 109 #include "functions.h"
21     #include "nodesx.h"
22     #include "segmentsx.h"
23     #include "waysx.h"
24     #include "superx.h"
25 amb 82 #include "profiles.h"
26 amb 2
27    
28     int main(int argc,char** argv)
29     {
30 amb 97 NodesX *OSMNodes;
31     SegmentsX *OSMSegments,*SuperSegments=NULL;
32     WaysX *OSMWays;
33 amb 58 int iteration=0,quit=0;
34 amb 104 int help_profile=0,max_iterations=10;
35 amb 93 char *dirname=NULL,*prefix=NULL,*filename;
36 amb 82 Profile profile;
37 amb 75 int i;
38 amb 26
39 amb 82 /* Fill in the default profile. */
40 amb 31
41 amb 82 profile.transport=Transport_None; /* Not used by planetsplitter */
42 amb 75
43 amb 82 profile.allow=Allow_ALL;
44 amb 75
45 amb 82 for(i=1;i<Way_Unknown;i++)
46     profile.highways[i]=1;
47    
48     for(i=1;i<Way_Unknown;i++)
49     profile.speed[i]=0; /* Not used by planetsplitter */
50    
51     profile.oneway=1; /* Not used by planetsplitter */
52    
53     /* Parse the command line arguments */
54    
55 amb 60 while(--argc>=1)
56     {
57 amb 101 if(!strcmp(argv[argc],"--help"))
58 amb 75 goto usage;
59 amb 101 else if(!strcmp(argv[argc],"--help-profile"))
60 amb 82 help_profile=1;
61 amb 101 else if(!strncmp(argv[argc],"--dir=",6))
62     dirname=&argv[argc][6];
63     else if(!strncmp(argv[argc],"--prefix=",9))
64     prefix=&argv[argc][9];
65     else if(!strncmp(argv[argc],"--max-iterations=",17))
66     max_iterations=atoi(&argv[argc][17]);
67     else if(!strncmp(argv[argc],"--transport=",12))
68 amb 82 {
69 amb 101 profile.transport=TransportType(&argv[argc][12]);
70 amb 82 profile.allow=1<<(profile.transport-1);
71     }
72 amb 101 else if(!strncmp(argv[argc],"--not-highway=",14))
73 amb 75 {
74 amb 101 Highway highway=HighwayType(&argv[argc][14]);
75 amb 82 profile.highways[highway]=0;
76 amb 75 }
77 amb 60 else
78     {
79 amb 75 usage:
80    
81     fprintf(stderr,"Usage: planetsplitter\n"
82 amb 101 " [--help] [--help-profile]\n"
83     " [--dir=<name>] [--prefix=<name>]\n"
84     " [--max-iterations=<number>]\n"
85     " [--transport=<transport>]\n"
86     " [--not-highway=<highway> ...]\n"
87 amb 75 "\n"
88 amb 82 "<transport> defaults to all but can be set to:\n"
89 amb 75 "%s"
90     "\n"
91 amb 82 "<highway> can be selected from:\n"
92 amb 75 "%s",
93     TransportList(),HighwayList());
94    
95 amb 60 return(1);
96     }
97     }
98 amb 26
99 amb 82 if(help_profile)
100     {
101     PrintProfile(&profile);
102    
103     return(0);
104     }
105    
106 amb 89 /* Create new variables */
107 amb 82
108 amb 97 OSMNodes=NewNodeList();
109     OSMSegments=NewSegmentList();
110     OSMWays=NewWayList();
111 amb 26
112 amb 89 /* Parse the file */
113 amb 2
114 amb 89 printf("\nParsing OSM Data\n================\n\n"); fflush(stdout);
115 amb 2
116 amb 97 ParseXML(stdin,OSMNodes,OSMSegments,OSMWays,&profile);
117 amb 80
118 amb 89 printf("\nProcessing OSM Data\n===================\n\n"); fflush(stdout);
119 amb 8
120 amb 89 /* Sort the ways */
121 amb 80
122 amb 89 printf("Sorting Ways"); fflush(stdout);
123 amb 97 SortWayList(OSMWays);
124 amb 89 printf("\rSorted Ways \n"); fflush(stdout);
125 amb 87
126 amb 89 /* Sort the segments */
127 amb 87
128 amb 89 printf("Sorting Segments"); fflush(stdout);
129 amb 97 SortSegmentList(OSMSegments);
130 amb 89 printf("\rSorted Segments \n"); fflush(stdout);
131 amb 84
132 amb 89 /* Remove bad segments */
133 amb 84
134 amb 97 RemoveBadSegments(OSMSegments);
135 amb 87
136 amb 89 printf("Sorting Segments"); fflush(stdout);
137 amb 97 SortSegmentList(OSMSegments);
138 amb 89 printf("\rSorted Segments \n"); fflush(stdout);
139 amb 87
140 amb 89 /* Remove non-way nodes */
141 amb 41
142 amb 97 RemoveNonHighwayNodes(OSMNodes,OSMSegments);
143 amb 41
144 amb 89 printf("Sorting Nodes"); fflush(stdout);
145 amb 97 SortNodeList(OSMNodes);
146 amb 89 printf("\rSorted Nodes \n"); fflush(stdout);
147 amb 41
148 amb 89 /* Measure the segments */
149 amb 66
150 amb 97 MeasureSegments(OSMSegments,OSMNodes);
151 amb 66
152    
153 amb 58 /* Repeated iteration on Super-Nodes, Super-Segments and Super-Ways */
154    
155     do
156     {
157 amb 80 printf("\nProcessing Super-Data (iteration %d)\n===================================%s\n\n",iteration,iteration>10?"=":""); fflush(stdout);
158    
159 amb 90 if(iteration==0)
160     {
161     /* Select the super-nodes */
162 amb 58
163 amb 97 ChooseSuperNodes(OSMNodes,OSMSegments,OSMWays,iteration);
164 amb 58
165 amb 90 /* Select the super-segments */
166 amb 58
167 amb 97 SuperSegments=CreateSuperSegments(OSMNodes,OSMSegments,OSMWays,iteration);
168 amb 90 }
169     else
170     {
171 amb 97 SegmentsX *SuperSegments2;
172 amb 58
173 amb 90 /* Select the super-nodes */
174    
175 amb 97 ChooseSuperNodes(OSMNodes,SuperSegments,OSMWays,iteration);
176 amb 90
177     /* Select the super-segments */
178    
179 amb 97 SuperSegments2=CreateSuperSegments(OSMNodes,SuperSegments,OSMWays,iteration);
180 amb 90
181 amb 104 if(SuperSegments->number==SuperSegments2->number)
182     quit=1;
183    
184 amb 97 FreeSegmentList(SuperSegments);
185 amb 90
186 amb 97 SuperSegments=SuperSegments2;
187 amb 90 }
188    
189 amb 66 /* Sort the super-segments */
190 amb 58
191 amb 80 printf("Sorting Super-Segments"); fflush(stdout);
192 amb 97 SortSegmentList(SuperSegments);
193 amb 80 printf("\rSorted Super-Segments \n"); fflush(stdout);
194 amb 58
195 amb 89 iteration++;
196 amb 58
197 amb 89 if(iteration>max_iterations)
198     quit=1;
199     }
200     while(!quit);
201 amb 58
202 amb 104 printf("\n"); fflush(stdout);
203 amb 58
204 amb 104 /* Mark the super-nodes */
205 amb 66
206 amb 104 MarkSuperNodes(OSMNodes,iteration);
207 amb 66
208 amb 104 /* Merge the super-segments */
209    
210     MergeSuperSegments(OSMSegments,SuperSegments);
211    
212 amb 97 FreeSegmentList(SuperSegments);
213 amb 58
214 amb 90 /* Sort the segments */
215 amb 58
216 amb 90 printf("Sorting Segments"); fflush(stdout);
217 amb 97 SortSegmentList(OSMSegments);
218 amb 90 printf("\rSorted Segments \n"); fflush(stdout);
219    
220 amb 104 /* Rotate segments so that node1<node2 */
221 amb 90
222 amb 104 RotateSegments(OSMSegments,OSMNodes);
223 amb 90
224 amb 104 /* Sort the segments */
225    
226     printf("Sorting Segments"); fflush(stdout);
227     SortSegmentList(OSMSegments);
228     printf("\rSorted Segments \n"); fflush(stdout);
229    
230     /* Remove duplicated segments */
231    
232     DeduplicateSegments(OSMSegments,OSMNodes,OSMWays);
233    
234     /* Sort the segments */
235    
236     printf("Sorting Segments"); fflush(stdout);
237     SortSegmentList(OSMSegments);
238     printf("\rSorted Segments \n"); fflush(stdout);
239    
240     /* Fix the segment and node indexes */
241    
242     IndexNodes(OSMNodes,OSMSegments);
243    
244     IndexSegments(OSMSegments,OSMNodes);
245    
246 amb 89 /* Write out the nodes */
247 amb 58
248 amb 95 filename=(char*)malloc((dirname?strlen(dirname):0)+(prefix?strlen(prefix):0)+16);
249    
250 amb 89 printf("Saving Nodes"); fflush(stdout);
251 amb 93 sprintf(filename,"%s%s%s%snodes.mem",dirname?dirname:"",dirname?"/":"",prefix?prefix:"",prefix?"-":"");
252 amb 97 SaveNodeList(OSMNodes,filename);
253     printf("\rSaved Nodes: %d\n",OSMNodes->number); fflush(stdout);
254 amb 58
255 amb 89 /* Write out the segments */
256 amb 58
257 amb 89 printf("Saving Segments"); fflush(stdout);
258 amb 93 sprintf(filename,"%s%s%s%ssegments.mem",dirname?dirname:"",dirname?"/":"",prefix?prefix:"",prefix?"-":"");
259 amb 97 SaveSegmentList(OSMSegments,filename);
260     printf("\rSaved Segments: %d\n",OSMSegments->number); fflush(stdout);
261 amb 58
262 amb 89 /* Write out the ways */
263 amb 58
264 amb 89 printf("Saving Ways"); fflush(stdout);
265 amb 93 sprintf(filename,"%s%s%s%sways.mem",dirname?dirname:"",dirname?"/":"",prefix?prefix:"",prefix?"-":"");
266 amb 97 SaveWayList(OSMWays,filename);
267     printf("\rSaved Ways: %d\n",OSMWays->number); fflush(stdout);
268 amb 58
269 amb 2 return(0);
270     }

Properties

Name Value
cvs:description Planet file splitter.