source: subversion/applications/utils/import/and2osm/nodes.c @ 4349

Last change on this file since 4349 was 4179, checked in by marc, 13 years ago

add binary tree to nodes, segments and ways

File size: 1.8 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        struct rb_traverser tr;
41        struct nodes * p;
42        rb_t_init (&tr, nodes_table);
43        while ((p=(struct nodes *) rb_t_next(&tr))!=NULL)
44        {
45                saveNode(p);
46        }
47}
48
49int compare_nodes (const void *pa, const void *pb, void *param){
50        const struct nodes * na=pa;
51        const struct nodes * nb=pb;
52        if (na->lat < nb->lat) return -1;
53        if (na->lat > nb->lat) return 1;
54        if (na->lon < nb->lon) return -1;
55        if (na->lon > nb->lon) return 1;
56        return 0;
57}
58
59struct nodes * addNode(double lat, double lon){
60        static long nodeID;
61        struct nodes  * storenode;
62        struct nodes ** p;
63        storenode = (struct nodes *) calloc(1,sizeof(struct nodes));
64        if (storenode==NULL)
65        {
66                fprintf(stderr,"out of memory\n");
67                exit(1);
68        }
69
70        nodeID = incr(nodeID);
71        storenode->ID=nodeID;
72        storenode->lat=lat;
73        storenode->lon=lon;
74        storenode->tag=NULL;
75        storenode->segments=NULL;
76        p=(struct nodes  **) rb_probe (nodes_table, storenode);
77        if (*p!=storenode)
78        {
79                //item was already in list
80                free(storenode);
81        }
82        return *p;
83}
84
85void init_nodes(){
86        if (nodes_table==NULL)
87        {
88                nodes_table=rb_create (compare_nodes, NULL,NULL);
89        }
90        else
91        {
92                printf("error: nodes_table is inited twice\n");
93                exit(1);
94        }
95        return;
96};
Note: See TracBrowser for help on using the repository browser.