source: subversion/applications/utils/import/and2osm/nodes.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: 2.0 KB
Line 
1#include <stdlib.h>
2#include <string.h>
3#include <stdio.h>
4#include "rb.h"
5#include "osm.h"
6#include "tags.h"
7#include "nodes.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
23
24
25struct rb_table * nodes_table;
26
27
28void saveNode(struct nodes *p){
29        if (postgres)
30                fprintf(fp_n, "EXECUTE nodes_insert(%li, %1.6f, %1.6f);\n", p->ID, p->lat, p->lon);
31        else 
32                fprintf(fp,"    <node id=\"%li\" lat=\"%1.5f\" lon=\"%1.5f\" >\n",p->ID,p->lat,p->lon);
33       
34        saveTags(p->tag,p);
35        if (!postgres)
36                fprintf(fp,"            <tag k=\"source\" v=\"AND\" />\n        </node>\n");
37}
38
39void saveNodes(){
40        int count = 0;
41        struct rb_traverser tr;
42        struct nodes * p;
43        rb_t_init (&tr, nodes_table);
44        while ((p=(struct nodes *) rb_t_next(&tr))!=NULL)
45        {
46                count++;
47                if( (count%1024) == 0 )
48                        fprintf(stderr, "\rExporting nodes: %d ", count);
49                saveNode(p);
50        }
51        fprintf(stderr, "\rExported nodes: %d \n", count);
52}
53
54int compare_nodes (const void *pa, const void *pb, void *param){
55        const struct nodes * na=pa;
56        const struct nodes * nb=pb;
57        if (na->lat < nb->lat) return -1;
58        if (na->lat > nb->lat) return 1;
59        if (na->lon < nb->lon) return -1;
60        if (na->lon > nb->lon) return 1;
61        return 0;
62}
63
64struct nodes * addNode(double lat, double lon){
65        static long nodeID;
66        struct nodes  * storenode;
67        struct nodes ** p;
68        storenode = (struct nodes *) calloc(1,sizeof(struct nodes));
69        if (storenode==NULL)
70        {
71                fprintf(stderr,"out of memory\n");
72                exit(1);
73        }
74
75        nodeID = incr(nodeID);
76        storenode->ID=nodeID;
77        storenode->lat=lat;
78        storenode->lon=lon;
79        storenode->tag=NULL;
80        storenode->segments=NULL;
81        p=(struct nodes  **) rb_probe (nodes_table, storenode);
82        if (*p!=storenode)
83        {
84                //item was already in list
85                free(storenode);
86        }
87        return *p;
88}
89
90void init_nodes(){
91        if (nodes_table==NULL)
92        {
93                nodes_table=rb_create (compare_nodes, NULL,NULL);
94        }
95        else
96        {
97                printf("error: nodes_table is inited twice\n");
98                exit(1);
99        }
100        return;
101};
Note: See TracBrowser for help on using the repository browser.