393 |
|
|
394 |
member_t *member = relation->member; |
member_t *member = relation->member; |
395 |
while(member) { |
while(member) { |
396 |
switch(member->type) { |
switch(member->object.type) { |
397 |
case ILLEGAL: |
case ILLEGAL: |
398 |
case NODE_ID: |
case NODE_ID: |
399 |
case WAY_ID: |
case WAY_ID: |
401 |
break; |
break; |
402 |
|
|
403 |
case NODE: |
case NODE: |
404 |
if(member->node) |
if(member->object.node) |
405 |
printf(" Member: Node, id = %lu, role = %s\n", |
printf(" Member: Node, id = %lu, role = %s\n", |
406 |
member->node->id, member->role); |
member->object.node->id, member->role); |
407 |
break; |
break; |
408 |
|
|
409 |
case WAY: |
case WAY: |
410 |
if(member->way) |
if(member->object.way) |
411 |
printf(" Member: Way, id = %lu, role = %s\n", |
printf(" Member: Way, id = %lu, role = %s\n", |
412 |
member->way->id, member->role); |
member->object.way->id, member->role); |
413 |
break; |
break; |
414 |
|
|
415 |
case RELATION: |
case RELATION: |
416 |
if(member->relation) |
if(member->object.relation) |
417 |
printf(" Member: Relation, id = %lu, role = %s\n", |
printf(" Member: Relation, id = %lu, role = %s\n", |
418 |
member->relation->id, member->role); |
member->object.relation->id, member->role); |
419 |
break; |
break; |
420 |
} |
} |
421 |
|
|
436 |
xmlDocPtr doc, xmlNode *a_node) { |
xmlDocPtr doc, xmlNode *a_node) { |
437 |
char *prop; |
char *prop; |
438 |
member_t *member = g_new0(member_t, 1); |
member_t *member = g_new0(member_t, 1); |
439 |
member->type = ILLEGAL; |
member->object.type = ILLEGAL; |
440 |
|
|
441 |
if((prop = (char*)xmlGetProp(a_node, (unsigned char*)"type"))) { |
if((prop = (char*)xmlGetProp(a_node, (unsigned char*)"type"))) { |
442 |
if(strcasecmp(prop, "way") == 0) member->type = WAY; |
if(strcasecmp(prop, "way") == 0) member->object.type = WAY; |
443 |
else if(strcasecmp(prop, "node") == 0) member->type = NODE; |
else if(strcasecmp(prop, "node") == 0) member->object.type = NODE; |
444 |
else if(strcasecmp(prop, "relation") == 0) member->type = RELATION; |
else if(strcasecmp(prop, "relation") == 0) member->object.type = RELATION; |
445 |
xmlFree(prop); |
xmlFree(prop); |
446 |
} |
} |
447 |
|
|
448 |
if((prop = (char*)xmlGetProp(a_node, (unsigned char*)"ref"))) { |
if((prop = (char*)xmlGetProp(a_node, (unsigned char*)"ref"))) { |
449 |
item_id_t id = strtoul(prop, NULL, 10); |
item_id_t id = strtoul(prop, NULL, 10); |
450 |
|
|
451 |
switch(member->type) { |
switch(member->object.type) { |
452 |
case ILLEGAL: |
case ILLEGAL: |
453 |
printf("Unable to store illegal type\n"); |
printf("Unable to store illegal type\n"); |
454 |
break; |
break; |
455 |
|
|
456 |
case WAY: |
case WAY: |
457 |
/* search matching way */ |
/* search matching way */ |
458 |
member->way = osm_get_way_by_id(osm, id); |
member->object.way = osm_get_way_by_id(osm, id); |
459 |
if(!member->way) { |
if(!member->object.way) { |
460 |
member->type = WAY_ID; |
member->object.type = WAY_ID; |
461 |
member->id = id; |
member->object.id = id; |
462 |
} |
} |
463 |
break; |
break; |
464 |
|
|
465 |
case NODE: |
case NODE: |
466 |
/* search matching node */ |
/* search matching node */ |
467 |
member->node = osm_get_node_by_id(osm, id); |
member->object.node = osm_get_node_by_id(osm, id); |
468 |
if(!member->node) { |
if(!member->object.node) { |
469 |
member->type = NODE_ID; |
member->object.type = NODE_ID; |
470 |
member->id = id; |
member->object.id = id; |
471 |
} |
} |
472 |
break; |
break; |
473 |
|
|
474 |
case RELATION: |
case RELATION: |
475 |
/* search matching relation */ |
/* search matching relation */ |
476 |
member->relation = osm_get_relation_by_id(osm, id); |
member->object.relation = osm_get_relation_by_id(osm, id); |
477 |
if(!member->relation) { |
if(!member->object.relation) { |
478 |
member->type = NODE_ID; |
member->object.type = NODE_ID; |
479 |
member->id = id; |
member->object.id = id; |
480 |
} |
} |
481 |
break; |
break; |
482 |
|
|
836 |
static member_t *process_member(xmlTextReaderPtr reader, osm_t *osm) { |
static member_t *process_member(xmlTextReaderPtr reader, osm_t *osm) { |
837 |
char *prop; |
char *prop; |
838 |
member_t *member = g_new0(member_t, 1); |
member_t *member = g_new0(member_t, 1); |
839 |
member->type = ILLEGAL; |
member->object.type = ILLEGAL; |
840 |
|
|
841 |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "type"))) { |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "type"))) { |
842 |
if(strcasecmp(prop, "way") == 0) member->type = WAY; |
if(strcasecmp(prop, "way") == 0) member->object.type = WAY; |
843 |
else if(strcasecmp(prop, "node") == 0) member->type = NODE; |
else if(strcasecmp(prop, "node") == 0) member->object.type = NODE; |
844 |
else if(strcasecmp(prop, "relation") == 0) member->type = RELATION; |
else if(strcasecmp(prop, "relation") == 0) member->object.type = RELATION; |
845 |
xmlFree(prop); |
xmlFree(prop); |
846 |
} |
} |
847 |
|
|
848 |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "ref"))) { |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "ref"))) { |
849 |
item_id_t id = strtoul(prop, NULL, 10); |
item_id_t id = strtoul(prop, NULL, 10); |
850 |
|
|
851 |
switch(member->type) { |
switch(member->object.type) { |
852 |
case ILLEGAL: |
case ILLEGAL: |
853 |
printf("Unable to store illegal type\n"); |
printf("Unable to store illegal type\n"); |
854 |
break; |
break; |
855 |
|
|
856 |
case WAY: |
case WAY: |
857 |
/* search matching way */ |
/* search matching way */ |
858 |
member->way = osm_get_way_by_id(osm, id); |
member->object.way = osm_get_way_by_id(osm, id); |
859 |
if(!member->way) { |
if(!member->object.way) { |
860 |
member->type = WAY_ID; |
member->object.type = WAY_ID; |
861 |
member->id = id; |
member->object.id = id; |
862 |
} |
} |
863 |
break; |
break; |
864 |
|
|
865 |
case NODE: |
case NODE: |
866 |
/* search matching node */ |
/* search matching node */ |
867 |
member->node = osm_get_node_by_id(osm, id); |
member->object.node = osm_get_node_by_id(osm, id); |
868 |
if(!member->node) { |
if(!member->object.node) { |
869 |
member->type = NODE_ID; |
member->object.type = NODE_ID; |
870 |
member->id = id; |
member->object.id = id; |
871 |
} |
} |
872 |
break; |
break; |
873 |
|
|
874 |
case RELATION: |
case RELATION: |
875 |
/* search matching relation */ |
/* search matching relation */ |
876 |
member->relation = osm_get_relation_by_id(osm, id); |
member->object.relation = osm_get_relation_by_id(osm, id); |
877 |
if(!member->relation) { |
if(!member->object.relation) { |
878 |
member->type = NODE_ID; |
member->object.type = NODE_ID; |
879 |
member->id = id; |
member->object.id = id; |
880 |
} |
} |
881 |
break; |
break; |
882 |
|
|
1249 |
xmlNodePtr m_node = xmlNewChild(rel_node,NULL,BAD_CAST "member", NULL); |
xmlNodePtr m_node = xmlNewChild(rel_node,NULL,BAD_CAST "member", NULL); |
1250 |
char *str = NULL; |
char *str = NULL; |
1251 |
|
|
1252 |
switch(member->type) { |
switch(member->object.type) { |
1253 |
case NODE: |
case NODE: |
1254 |
xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "node"); |
xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "node"); |
1255 |
str = g_strdup_printf("%ld", member->node->id); |
str = g_strdup_printf("%ld", member->object.node->id); |
1256 |
break; |
break; |
1257 |
|
|
1258 |
case WAY: |
case WAY: |
1259 |
xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "way"); |
xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "way"); |
1260 |
str = g_strdup_printf("%ld", member->way->id); |
str = g_strdup_printf("%ld", member->object.way->id); |
1261 |
break; |
break; |
1262 |
|
|
1263 |
case RELATION: |
case RELATION: |
1264 |
xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "relation"); |
xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "relation"); |
1265 |
str = g_strdup_printf("%ld", member->relation->id); |
str = g_strdup_printf("%ld", member->object.relation->id); |
1266 |
break; |
break; |
1267 |
|
|
1268 |
default: |
default: |
1609 |
|
|
1610 |
member_t *member = relation->member; |
member_t *member = relation->member; |
1611 |
while(member) { |
while(member) { |
1612 |
switch(member->type) { |
switch(member->object.type) { |
1613 |
case NODE: |
case NODE: |
1614 |
/* nodes are checked directly */ |
/* nodes are checked directly */ |
1615 |
if(member->node == node) |
if(member->object.node == node) |
1616 |
is_member = TRUE; |
is_member = TRUE; |
1617 |
break; |
break; |
1618 |
|
|
1619 |
case WAY: { |
case WAY: { |
1620 |
/* ways have to be checked for the nodes they consist of */ |
/* ways have to be checked for the nodes they consist of */ |
1621 |
node_chain_t *chain = member->way->node_chain; |
node_chain_t *chain = member->object.way->node_chain; |
1622 |
while(chain && !is_member) { |
while(chain && !is_member) { |
1623 |
if(chain->node == node) |
if(chain->node == node) |
1624 |
is_member = TRUE; |
is_member = TRUE; |
1656 |
|
|
1657 |
member_t *member = relation->member; |
member_t *member = relation->member; |
1658 |
while(member) { |
while(member) { |
1659 |
switch(member->type) { |
switch(member->object.type) { |
1660 |
case WAY: { |
case WAY: { |
1661 |
/* ways can be check directly */ |
/* ways can be check directly */ |
1662 |
if(member->way == way) |
if(member->object.way == way) |
1663 |
is_member = TRUE; |
is_member = TRUE; |
1664 |
} break; |
} break; |
1665 |
|
|
1726 |
while(relation) { |
while(relation) { |
1727 |
member_t **member = &relation->member; |
member_t **member = &relation->member; |
1728 |
while(*member) { |
while(*member) { |
1729 |
if(((*member)->type == NODE) && |
if(((*member)->object.type == NODE) && |
1730 |
((*member)->node == node)) { |
((*member)->object.node == node)) { |
1731 |
|
|
1732 |
printf(" from relation #%ld\n", relation->id); |
printf(" from relation #%ld\n", relation->id); |
1733 |
|
|
1751 |
while(relation) { |
while(relation) { |
1752 |
member_t **member = &relation->member; |
member_t **member = &relation->member; |
1753 |
while(*member) { |
while(*member) { |
1754 |
if(((*member)->type == WAY) && |
if(((*member)->object.type == WAY) && |
1755 |
((*member)->way == way)) { |
((*member)->object.way == way)) { |
1756 |
|
|
1757 |
printf(" from relation #%ld\n", relation->id); |
printf(" from relation #%ld\n", relation->id); |
1758 |
|
|
2005 |
// First find the member corresponding to our way: |
// First find the member corresponding to our way: |
2006 |
member_t *member = rel_chain->relation->member; |
member_t *member = rel_chain->relation->member; |
2007 |
for (; member != NULL; member = member->next) { |
for (; member != NULL; member = member->next) { |
2008 |
if (member->type == WAY) { |
if (member->object.type == WAY) { |
2009 |
if (member->way == way) |
if (member->object.way == way) |
2010 |
break; |
break; |
2011 |
} |
} |
2012 |
if (member->type == WAY_ID) { |
if (member->object.type == WAY_ID) { |
2013 |
if (member->id == way->id) |
if (member->object.id == way->id) |
2014 |
break; |
break; |
2015 |
} |
} |
2016 |
} |
} |
2106 |
} |
} |
2107 |
|
|
2108 |
/* return plain text of type */ |
/* return plain text of type */ |
2109 |
char *osm_type_string(type_t type) { |
char *osm_object_type_string(object_t *object) { |
2110 |
const struct { type_t type; char *name; } types[] = { |
const struct { type_t type; char *name; } types[] = { |
2111 |
{ ILLEGAL, "illegal" }, |
{ ILLEGAL, "illegal" }, |
2112 |
{ NODE, "node" }, |
{ NODE, "node" }, |
2120 |
|
|
2121 |
int i; |
int i; |
2122 |
for(i=0;types[i].name;i++) |
for(i=0;types[i].name;i++) |
2123 |
if(type == types[i].type) |
if(object->type == types[i].type) |
2124 |
return types[i].name; |
return types[i].name; |
2125 |
|
|
2126 |
return NULL; |
return NULL; |
2127 |
} |
} |
2128 |
|
|
2129 |
char *osm_object_string(type_t type, void *object) { |
char *osm_object_string(object_t *object) { |
2130 |
char *type_str = osm_type_string(type); |
char *type_str = osm_object_type_string(object); |
2131 |
|
|
2132 |
if(!object) |
if(!object) |
2133 |
return g_strdup_printf("%s #<invalid>", type_str); |
return g_strdup_printf("%s #<invalid>", type_str); |
2134 |
|
|
2135 |
switch(type) { |
switch(object->type) { |
2136 |
case ILLEGAL: |
case ILLEGAL: |
2137 |
return g_strdup_printf("%s #<unspec>", type_str); |
return g_strdup_printf("%s #<unspec>", type_str); |
2138 |
break; |
break; |
2139 |
case NODE: |
case NODE: |
2140 |
return g_strdup_printf("%s #%ld", type_str, ((node_t*)object)->id); |
return g_strdup_printf("%s #%ld", type_str, object->node->id); |
2141 |
break; |
break; |
2142 |
case WAY: |
case WAY: |
2143 |
return g_strdup_printf("%s #%ld", type_str, ((way_t*)object)->id); |
return g_strdup_printf("%s #%ld", type_str, object->way->id); |
2144 |
break; |
break; |
2145 |
case RELATION: |
case RELATION: |
2146 |
return g_strdup_printf("%s #%ld", type_str, ((relation_t*)object)->id); |
return g_strdup_printf("%s #%ld", type_str, object->relation->id); |
2147 |
break; |
break; |
2148 |
case NODE_ID: |
case NODE_ID: |
2149 |
case WAY_ID: |
case WAY_ID: |
2150 |
case RELATION_ID: |
case RELATION_ID: |
2151 |
return g_strdup_printf("%s #%ld", type_str, ((item_id_t)object)); |
return g_strdup_printf("%s #%ld", type_str, object->id); |
2152 |
break; |
break; |
2153 |
} |
} |
2154 |
return NULL; |
return NULL; |
2155 |
} |
} |
2156 |
|
|
2157 |
char *osm_id_string(type_t type, void *object) { |
char *osm_object_id_string(object_t *object) { |
2158 |
if(!object) return NULL; |
if(!object) return NULL; |
2159 |
|
|
2160 |
switch(type) { |
switch(object->type) { |
2161 |
case ILLEGAL: |
case ILLEGAL: |
2162 |
return NULL; |
return NULL; |
2163 |
break; |
break; |
2164 |
case NODE: |
case NODE: |
2165 |
return g_strdup_printf("#%ld", ((node_t*)object)->id); |
return g_strdup_printf("#%ld", object->node->id); |
2166 |
break; |
break; |
2167 |
case WAY: |
case WAY: |
2168 |
return g_strdup_printf("#%ld", ((way_t*)object)->id); |
return g_strdup_printf("#%ld", object->way->id); |
2169 |
break; |
break; |
2170 |
case RELATION: |
case RELATION: |
2171 |
return g_strdup_printf("#%ld", ((relation_t*)object)->id); |
return g_strdup_printf("#%ld", object->relation->id); |
2172 |
break; |
break; |
2173 |
case NODE_ID: |
case NODE_ID: |
2174 |
case WAY_ID: |
case WAY_ID: |
2175 |
case RELATION_ID: |
case RELATION_ID: |
2176 |
return g_strdup_printf("#%ld", ((item_id_t)object)); |
return g_strdup_printf("#%ld", object->id); |
2177 |
break; |
break; |
2178 |
} |
} |
2179 |
return NULL; |
return NULL; |
2180 |
} |
} |
2181 |
|
|
2182 |
tag_t *osm_object_get_tags(type_t type, void *object) { |
tag_t *osm_object_get_tags(object_t *object) { |
2183 |
if(!object) return NULL; |
if(!object) return NULL; |
2184 |
|
|
2185 |
switch(type) { |
switch(object->type) { |
2186 |
case ILLEGAL: |
case ILLEGAL: |
2187 |
return NULL; |
return NULL; |
2188 |
break; |
break; |
2189 |
case NODE: |
case NODE: |
2190 |
return ((node_t*)object)->tag; |
return object->node->tag; |
2191 |
break; |
break; |
2192 |
case WAY: |
case WAY: |
2193 |
return ((way_t*)object)->tag; |
return object->way->tag; |
2194 |
break; |
break; |
2195 |
case RELATION: |
case RELATION: |
2196 |
return ((relation_t*)object)->tag; |
return object->relation->tag; |
2197 |
break; |
break; |
2198 |
case NODE_ID: |
case NODE_ID: |
2199 |
case WAY_ID: |
case WAY_ID: |