source: subversion/applications/utils/export/bzhack/bzhack.c @ 27278

Last change on this file since 27278 was 22521, checked in by dmarinus, 9 years ago

bug fixes no waytiles

File size: 8.0 KB
Line 
1#define __USE_LARGEFILE64
2#include <bzlib.h>
3#include "bzlib_private.h"
4#include <errno.h>
5#include <xmlparse.h>
6#include <math.h>
7#include "bzhack.h"
8#include "sys/stat.h"
9
10FILE *fnodetile, *fwaytile, *fbz2nodeindex, *fbz2wayindex, *fbz2changesetindex;
11
12static unsigned long long filepos = 0;
13
14void start_hndl(void *data, const char *el, const char **attr) {
15   int i;
16   static int id;
17   short int lon, lat;
18   static long long lastwaytileoffset = 0;
19   static int nodetiles = 0;
20   if (strcmp(el, "node") == 0) {
21      for (i = 0 ; ; i+=2 ) {
22         if (attr[i] == 0) break;
23         if (strcmp(attr[i], "id") == 0) {
24            id = atoi(attr[i+1]);
25         }
26         if (strcmp(attr[i], "lon") == 0) {
27            lon = (int)(floor((strtod(attr[i+1], NULL) + 180.0) / 360.0 * pow(2.0, 15))); // z = 15
28         }
29         if (strcmp(attr[i], "lat") == 0) {
30            double latd = strtod(attr[i+1], NULL);
31            lat = (int)(floor((1.0 - log( tan(latd * M_PI/180.0) + 1.0 / cos(latd * M_PI/180.0)) / M_PI) / 2.0 * pow(2.0, 15)));
32         }
33      }
34      if (filepos) {
35         fwrite(&id, sizeof(id), 1, fbz2nodeindex);
36         fwrite(&filepos, sizeof(filepos), 1, fbz2nodeindex);
37         filepos = 0;
38      }
39      fwrite(&id, sizeof(id), 1, fnodetile);
40      fwrite(&lat, sizeof(lat), 1, fnodetile);
41      fwrite(&lon, sizeof(lon), 1, fnodetile);
42      nodetiles++;
43   } else if (strcmp(el, "way") == 0) {
44      for (i = 0; ; i+=2) {
45         if (attr[i] == 0) break;
46         if (strcmp(attr[i], "id") == 0) {
47            id = atoi(attr[i+1]);
48         }
49      }
50      if (filepos) {
51         fwrite(&id, sizeof(id), 1, fbz2wayindex);
52         fwrite(&filepos, sizeof(filepos), 1, fbz2wayindex);
53         filepos = 0;
54      }
55      lastwaytileoffset = ftell(fwaytile);
56   } else if (strcmp(el, "nd") == 0) {
57      int ref = 0;
58      for (i = 0 ; ; i+=2 ) {
59         if (attr[i] == 0) break;
60         if (strcmp(attr[i], "ref") == 0) {
61            ref = atoi(attr[i+1]);
62         }
63      }
64
65      long long loindex = 0, hiindex = nodetiles;
66      while (1) {
67         long long index = (hiindex+loindex)/2;
68         fseek(fnodetile, index*(sizeof(int)+sizeof(short int)+sizeof(short int)), SEEK_SET);
69         int nid;
70         fread(&nid, sizeof(nid), 1, fnodetile);
71         if (nid == ref) {
72             fread(&lat, sizeof(lat), 1, fnodetile);
73             fread(&lon, sizeof(lon), 1, fnodetile);
74             break;
75         } else if (nid > ref) {
76             hiindex = index;
77         } else {
78             loindex = index;
79         }
80         if ((hiindex - loindex) == 1) {
81             printf("node %i from way %i not found at %lli - %lli = %i\n", ref, id, loindex, hiindex, nid);
82             lat = 0;
83             lon = 0;
84             break;
85         }
86      }
87      int found = 0;
88      fseek(fwaytile,lastwaytileoffset,SEEK_SET);
89      while (!feof(fwaytile)) {
90         int tid;
91         int tlat;
92         int tlon;
93         fread(&tid, sizeof(id), 1, fwaytile);
94         fread(&tlat, sizeof(lat), 1, fwaytile);
95         fread(&tlon, sizeof(lon), 1, fwaytile);
96         if (tlat == lat && tlon == lon) {
97             found = 1;
98             break;
99         }
100      }
101      if (!found) {
102          fwrite(&id, sizeof(id), 1, fwaytile);
103          fwrite(&lat, sizeof(id), 1, fwaytile);
104          fwrite(&lon, sizeof(id), 1, fwaytile);
105      }
106   } else if (strcmp(el, "changeset") == 0) {
107      if (filepos) {
108         int id = 0;
109         for (i = 0 ; ; i+=2 ) {
110            if (attr[i] == 0) break;
111            if (strcmp(attr[i], "id") == 0) {
112               id = atoi(attr[i+1]);
113            }
114         }
115         fwrite(&id, sizeof(id), 1, fbz2changesetindex);
116         fwrite(&filepos, sizeof(filepos), 1, fbz2changesetindex);
117         filepos = 0;
118      }
119   }
120}
121
122void end_hndl(void *data, const char *el) {
123   return;
124}
125
126int main() {
127    FILE *f;
128    char *buf;
129    char bufo[500000];
130    int ret;
131    int i;
132    int buf_size = 2000000;
133    int avail_in = buf_size;
134    int avail_out = sizeof(bufo);
135
136    buf = malloc(avail_in);
137
138    fnodetile = fopen("/media/esata/2000/nodetile", "w+");
139    fwaytile = fopen("/media/esata/2000/waytile", "w+");
140    fbz2nodeindex = fopen("/media/esata/2000/bz2nodeindex", "w");
141    fbz2wayindex = fopen("/media/esata/2000/bz2wayindex", "w");
142    fbz2changesetindex = fopen("/media/esata/2000/bz2changeset", "w");
143
144    XML_Parser parser;
145    bz_stream strm;
146
147    parser = XML_ParserCreate("UTF-8");
148    XML_SetElementHandler(parser, start_hndl, end_hndl);
149
150    // initialize strm
151    memset(&strm, 0, sizeof(strm));
152    strm.next_in = buf;
153
154    BZ2_bzDecompressInit(&strm, 0, 0);
155    f = fopen("/media/esata/2000/planet-100717.osm.bz2", "r");
156    if (!f) {
157        printf("Kan planet niet openen");
158        return 1;
159    }
160
161    // --- seek
162    #define OFFSET(N) N ## 0
163    //fseek(f, 16615273, SEEK_SET); // offset - 1
164    //fseek(f, 1191443766, SEEK_SET); // offset - 1
165    fseek(f, 0, SEEK_SET); // offset - 1
166    ret = fread(buf+sizeof(OFFSET(sync_block_))-2, 1, 1, f);
167    strm.avail_in = sizeof(OFFSET(sync_block_))-1;
168    strm.avail_out = avail_out;
169    strm.next_out = bufo;
170    buf[sizeof(OFFSET(sync_block_))-2] &= ((1 << OFFSET()) - 1);
171    buf[sizeof(OFFSET(sync_block_))-2] |= OFFSET(sync_block_)[sizeof(OFFSET(sync_block_))-2];
172
173    memcpy(buf, OFFSET(sync_block_), sizeof(OFFSET(sync_block_))-2);
174    ret = BZ2_bzDecompress(&strm);
175    printf("ret: %i, avail_out: %i\n", ret, strm.avail_out);
176    if (ret == BZ_STREAM_END) {
177       ret = BZ2_bzDecompressEnd(&strm);
178       ret = BZ2_bzDecompressInit(&strm, 0, 0);
179       strm.next_in = "B";
180       strm.avail_in = 1;
181       BZ2_bzDecompress(&strm);
182    } else {
183       while (strm.avail_out == avail_out) {
184          strm.avail_out = avail_out;
185          strm.next_out = bufo;
186          ret = BZ2_bzDecompress(&strm);
187          if (ret != BZ_OK) {
188             printf("failed\n");
189             return 1;
190          }
191       }
192    }
193   
194    //
195
196    // fill next_in
197    strm.avail_in = avail_in;
198    strm.next_in = buf;
199    ret = fread(strm.next_in, 1, avail_in, f);
200    printf("read ret: %i\n", ret);
201
202    for (i = 0; ; i++) {
203       // refill buf when avail_in is getting below watermark
204       if (avail_in < 1700000) {
205          memmove(buf, strm.next_in, avail_in);
206          ret = fread(buf + avail_in, 1, buf_size - avail_in, f);
207          strm.next_in = buf;
208          avail_in = buf_size;
209          strm.avail_in = avail_in;
210       }
211       // set bz2 filepos
212       filepos = ftello(f)-avail_in;
213
214       // output debug data
215       printf("pos: %li, block: %i, i: %i, off: %i\n", ftell(f)-avail_in, ((DState*)strm.state)->currBlockNo, i, ((DState*)strm.state)->bsLive);
216
217       // Decompress first block
218       strm.avail_out = 0;
219       strm.avail_in = avail_in;
220       ret = BZ2_bzDecompress(&strm);
221       if (ret != BZ_OK) {
222          ret = BZ2_bzDecompressEnd(&strm);
223          ret = BZ2_bzDecompressInit(&strm, 0, 0);
224          ret = BZ2_bzDecompress(&strm);
225       }
226       avail_in = strm.avail_in;
227       if (ret == BZ_STREAM_END) {
228          ret = BZ2_bzDecompressEnd(&strm);
229          printf("DecompressEnd ret: %i\n", ret);
230          ret = BZ2_bzDecompressInit(&strm, 0, 0);
231          printf("DecompressInit ret: %i\n", ret);
232       } else {
233          // Output first block
234          strm.avail_in = 0;
235          strm.avail_out = avail_out;
236          strm.next_out = bufo;
237          ret = BZ2_bzDecompress(&strm);
238          if (ret != BZ_OK) {
239             printf("Output first block ret: %i\n", ret);
240             return 1;
241          }
242          XML_Parse(parser, bufo, sizeof(bufo) - strm.avail_out, 0);
243
244          // Output until end of block
245          while (strm.avail_out == avail_out) {
246             strm.avail_out = avail_out;
247             strm.next_out = bufo;
248             ret = BZ2_bzDecompress(&strm);
249             if (ret != BZ_OK) {
250                printf("Oops! ret: %i\n", ret);
251                return 1;
252             }
253             XML_Parse(parser, bufo, sizeof(bufo) - strm.avail_out, 0);
254          }
255       }
256       if (feof(f)) break;
257    }
258    return 0;
259}
260
Note: See TracBrowser for help on using the repository browser.