Check out the latest version of Routino: svn co http://routino.org/svn/trunk routino
Annotation of /trunk/src/planetsplitter.c
Parent Directory
|
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)
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. |