Contents of /trunk/src/osm.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 234 - (show annotations)
Mon Jul 20 20:15:10 2009 UTC (14 years, 9 months ago) by harbaum
File MIME type: text/plain
File size: 8776 byte(s)
Ignore created_by when copying tags
1 /*
2 * Copyright (C) 2008 Till Harbaum <till@harbaum.org>.
3 *
4 * This file is part of OSM2Go.
5 *
6 * OSM2Go is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * OSM2Go is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with OSM2Go. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #ifndef OSM_H
21 #define OSM_H
22
23 #include <math.h>
24
25 #define OSM_FLAG_DIRTY (1<<0)
26 #define OSM_FLAG_DELETED (1<<1)
27 #define OSM_FLAG_NEW (1<<2)
28 #define OSM_FLAG_HIDDEN (1<<3)
29
30 /* item_id_t needs to be signed as osm2go uses negative ids for items */
31 /* not yet registered with the main osm database */
32 #if 1
33 /* currently 31 bit is still sufficient since there are less than */
34 /* 2 billion nodes or changesets */
35 typedef gint32 item_id_t;
36 #define G_TYPE_ITEM_ID_T G_TYPE_INT
37 #define ITEM_ID_FORMAT "%" G_GINT32_FORMAT
38 #else
39 /* the future may require us to switch to 64 bits */
40 typedef gint64 item_id_t;
41 #define G_TYPE_ITEM_ID_T G_TYPE_INT64
42 #define ITEM_ID_FORMAT "%" G_GINT64_FORMAT
43 #endif
44
45 #define ID_ILLEGAL ((item_id_t)0)
46
47 /* icon stuff is required since nodes may held a icon reference */
48 struct icon_s;
49
50 typedef struct bounds_s {
51 pos_t ll_min, ll_max;
52 lpos_t min, max;
53 lpos_t center;
54 float scale;
55 } bounds_t;
56
57 typedef struct user_s {
58 char *name;
59 struct user_s *next;
60 } user_t;
61
62 typedef struct tag_s {
63 char *key, *value;
64 struct tag_s *next;
65 } tag_t;
66
67 typedef struct node_s {
68 item_id_t id;
69 item_id_t version;
70 pos_t pos;
71 lpos_t lpos;
72 user_t *user;
73 gboolean visible;
74 time_t time;
75 tag_t *tag;
76 int ways;
77 int flags;
78 float zoom_max;
79
80 /* icon */
81 GdkPixbuf *icon_buf;
82
83 /* a link to the visual representation on screen */
84 struct map_item_chain_s *map_item_chain;
85
86 struct node_s *next;
87 } node_t;
88
89 typedef struct node_chain {
90 node_t *node;
91 struct node_chain *next;
92 } node_chain_t;
93
94 #define OSM_DRAW_FLAG_AREA (1<<0)
95 #define OSM_DRAW_FLAG_BG (1<<1)
96
97 typedef struct way_s {
98 item_id_t id;
99 item_id_t version;
100 item_id_t changeset;
101 user_t *user;
102 gboolean visible;
103 time_t time;
104 tag_t *tag;
105 node_chain_t *node_chain;
106 int flags;
107
108 /* visual representation from elemstyle */
109 struct {
110 guint flags;
111 gulong color;
112 gint width;
113 float zoom_max;
114 gboolean dashed;
115 guint dash_length;
116
117 union {
118 struct {
119 gulong color;
120 gint width;
121 } bg;
122
123 struct {
124 gulong color;
125 } area;
126 };
127 } draw;
128
129 /* a link to the visual representation on screen */
130 struct map_item_chain_s *map_item_chain;
131
132 struct way_s *next;
133 } way_t;
134
135 typedef struct way_chain {
136 way_t *way;
137 struct way_chain *next;
138 } way_chain_t;
139
140 typedef struct relation_s {
141 item_id_t id;
142 item_id_t version;
143 item_id_t changeset;
144 user_t *user;
145 gboolean visible;
146 time_t time;
147 tag_t *tag;
148 struct member_s *member;
149 int flags;
150
151 struct relation_s *next;
152 } relation_t;
153
154 typedef struct relation_chain_s {
155 relation_t *relation;
156 struct relation_chain_s *next;
157 } relation_chain_t;
158
159 /* two of these hash tables are used, one for nodes and one for ways */
160 /* currently relations aren't used often enough to justify the use */
161 /* of a hash table */
162
163 /* the current hash table uses 16 bits. each table thus is */
164 /* 256 kbytes (2^16 * sizeof(void*)) in size */
165 #define ID2HASH(a) ((unsigned short)(a) ^ (unsigned short)((a)>>16))
166 typedef struct hash_item_s {
167 union {
168 node_t *node;
169 way_t *way;
170 relation_t *relation;
171 } data;
172
173 struct hash_item_s *next;
174 } hash_item_t;
175
176 typedef struct {
177 hash_item_t *hash[65536];
178 } hash_table_t;
179
180 typedef enum {
181 ILLEGAL=0, NODE, WAY, RELATION, NODE_ID, WAY_ID, RELATION_ID
182 } type_t;
183
184 typedef struct {
185 type_t type;
186 union {
187 node_t *node;
188 way_t *way;
189 relation_t *relation;
190 item_id_t id;
191 void *ptr;
192 };
193 } object_t;
194
195 typedef struct member_s {
196 object_t object;
197 char *role;
198 struct member_s *next;
199 } member_t;
200
201 typedef struct osm_s {
202 bounds_t *bounds; // original bounds as they appear in the file
203 user_t *user;
204
205 node_t *node;
206 hash_table_t *node_hash;
207
208 way_t *way;
209 hash_table_t *way_hash;
210
211 // hashing relations doesn't yet make much sense as relations are quite rare
212 relation_t *relation;
213
214 } osm_t;
215
216 #include <libxml/parser.h>
217 #include <libxml/tree.h>
218
219 osm_t *osm_parse(char *path, char *filename);
220 gboolean osm_sanity_check(GtkWidget *parent, osm_t *osm);
221 tag_t *osm_parse_osm_tag(osm_t *osm, xmlDocPtr doc, xmlNode *a_node);
222 node_chain_t *osm_parse_osm_way_nd(osm_t *osm, xmlDocPtr doc, xmlNode *a_node);
223 member_t *osm_parse_osm_relation_member(osm_t *osm, xmlDocPtr doc, xmlNode *a_node);
224 void osm_dump(osm_t *osm);
225 void osm_free(struct icon_s **icon, osm_t *osm);
226
227 char *osm_node_get_value(node_t *node, char *key);
228 gboolean osm_node_has_tag(node_t *node);
229
230 void osm_node_dump(node_t *node);
231
232 void osm_way_free(way_t *way);
233 void osm_way_dump(way_t *way);
234 char *osm_way_get_value(way_t *way, char *key);
235 gboolean osm_node_has_value(node_t *node, char *str);
236 gboolean osm_way_has_value(way_t *way, char *str);
237 void osm_way_append_node(way_t *way, node_t *node);
238
239 gboolean osm_node_in_way(way_t *way, node_t *node);
240
241 void osm_node_chain_free(node_chain_t *node_chain);
242 int osm_node_chain_length(node_chain_t *node_chain);
243 void osm_node_free(struct icon_s **icon, node_t *node);
244
245 void osm_members_free(member_t *member);
246 void osm_member_free(member_t *member);
247
248 void osm_tag_free(tag_t *tag);
249 void osm_tags_free(tag_t *tag);
250 char *osm_tag_get_by_key(tag_t *tag, char *key);
251 gboolean osm_is_creator_tag(tag_t *tag);
252 gboolean osm_tag_key_and_value_present(tag_t *haystack, tag_t *tag);
253 gboolean osm_tag_key_other_value_present(tag_t *haystack, tag_t *tag);
254
255 char *osm_generate_xml_changeset(osm_t *osm, char *comment);
256 char *osm_generate_xml_node(osm_t *osm, item_id_t changeset, node_t *node);
257 char *osm_generate_xml_way(osm_t *osm, item_id_t changeset, way_t *way);
258 char *osm_generate_xml_relation(osm_t *osm, item_id_t changeset,
259 relation_t *relation);
260
261 node_t *osm_get_node_by_id(osm_t *osm, item_id_t id);
262 way_t *osm_get_way_by_id(osm_t *osm, item_id_t id);
263 relation_t *osm_get_relation_by_id(osm_t *osm, item_id_t id);
264
265 guint osm_way_number_of_nodes(way_t *way);
266 relation_chain_t *osm_node_to_relation(osm_t *osm, node_t *node);
267 relation_chain_t *osm_way_to_relation(osm_t *osm, way_t *way);
268 relation_chain_t *osm_relation_to_relation(osm_t *osm, relation_t *relation);
269 relation_chain_t *osm_object_to_relation(osm_t *osm, object_t *object);
270 void osm_relation_chain_free(relation_chain_t *relation_chain);
271 way_chain_t *osm_node_to_way(osm_t *osm, node_t *node);
272
273 /* ----------- edit functions ----------- */
274 node_t *osm_node_new(osm_t *osm, gint x, gint y);
275 void osm_node_attach(osm_t *osm, node_t *node);
276 void osm_node_restore(osm_t *osm, node_t *node);
277 way_chain_t *osm_node_delete(osm_t *osm, struct icon_s **icon, node_t *node,
278 gboolean permanently, gboolean affect_ways);
279 void osm_way_delete(osm_t *osm, struct icon_s **icon, way_t *way,
280 gboolean permanently);
281
282 way_t *osm_way_new(void);
283 void osm_way_attach(osm_t *osm, way_t *way);
284
285 gboolean osm_position_within_bounds(osm_t *osm, gint x, gint y);
286 item_id_t osm_new_way_id(osm_t *osm);
287 gboolean osm_way_ends_with_node(way_t *way, node_t *node);
288
289 void osm_way_reverse(way_t *way);
290 guint osm_way_reverse_direction_sensitive_tags(way_t *way);
291 guint osm_way_reverse_direction_sensitive_roles(osm_t *osm, way_t *way);
292
293 void osm_node_remove_from_relation(osm_t *osm, node_t *node);
294 void osm_way_remove_from_relation(osm_t *osm, way_t *way);
295
296 node_t *osm_way_get_last_node(way_t *way);
297 node_t *osm_way_get_first_node(way_t *way);
298 void osm_way_rotate(way_t *way, gint offset);
299
300 tag_t *osm_tags_copy(tag_t *tag);
301
302 relation_t *osm_relation_new(void);
303 void osm_relation_free(relation_t *relation);
304 void osm_relation_attach(osm_t *osm, relation_t *relation);
305 void osm_relation_delete(osm_t *osm, relation_t *relation,
306 gboolean permanently);
307 gint osm_relation_members_num(relation_t *relation);
308
309 char *osm_object_type_string(object_t *object);
310 char *osm_object_id_string(object_t *object);
311 char *osm_object_string(object_t *object);
312 tag_t *osm_object_get_tags(object_t *object);
313 void osm_object_set_flags(object_t *map_item, int set, int clr);
314 char *osm_object_get_name(object_t *object);
315 char *osm_object_get_speaking_name(object_t *object);
316
317 #endif /* OSM_H */
318
319 // vim:et:ts=8:sw=2:sts=2:ai