1746 |
return rel_chain; |
return rel_chain; |
1747 |
} |
} |
1748 |
|
|
1749 |
|
/* return all relations a relation is in */ |
1750 |
|
relation_chain_t *osm_relation_to_relation(osm_t *osm, relation_t *rel) { |
1751 |
|
relation_chain_t *rel_chain = NULL, **cur_rel_chain = &rel_chain; |
1752 |
|
|
1753 |
|
relation_t *relation = osm->relation; |
1754 |
|
while(relation) { |
1755 |
|
gboolean is_member = FALSE; |
1756 |
|
|
1757 |
|
member_t *member = relation->member; |
1758 |
|
while(member) { |
1759 |
|
switch(member->object.type) { |
1760 |
|
case RELATION: { |
1761 |
|
/* relations can be check directly */ |
1762 |
|
if(member->object.relation == rel) |
1763 |
|
is_member = TRUE; |
1764 |
|
} break; |
1765 |
|
|
1766 |
|
default: |
1767 |
|
break; |
1768 |
|
} |
1769 |
|
member = member->next; |
1770 |
|
} |
1771 |
|
|
1772 |
|
/* way is a member of this relation, so move it to the member chain */ |
1773 |
|
if(is_member) { |
1774 |
|
*cur_rel_chain = g_new0(relation_chain_t, 1); |
1775 |
|
(*cur_rel_chain)->relation = relation; |
1776 |
|
cur_rel_chain = &((*cur_rel_chain)->next); |
1777 |
|
} |
1778 |
|
|
1779 |
|
relation = relation->next; |
1780 |
|
} |
1781 |
|
|
1782 |
|
return rel_chain; |
1783 |
|
} |
1784 |
|
|
1785 |
|
/* return all relations an object is in */ |
1786 |
|
relation_chain_t *osm_object_to_relation(osm_t *osm, object_t *object) { |
1787 |
|
relation_chain_t *rel_chain = NULL; |
1788 |
|
|
1789 |
|
switch(object->type) { |
1790 |
|
case NODE: |
1791 |
|
rel_chain = osm_node_to_relation(osm, object->node); |
1792 |
|
break; |
1793 |
|
|
1794 |
|
case WAY: |
1795 |
|
rel_chain = osm_way_to_relation(osm, object->way); |
1796 |
|
break; |
1797 |
|
|
1798 |
|
case RELATION: |
1799 |
|
rel_chain = osm_relation_to_relation(osm, object->relation); |
1800 |
|
break; |
1801 |
|
|
1802 |
|
default: |
1803 |
|
break; |
1804 |
|
} |
1805 |
|
|
1806 |
|
return rel_chain; |
1807 |
|
} |
1808 |
|
|
1809 |
|
void osm_relation_chain_free(relation_chain_t *rchain) { |
1810 |
|
while(rchain) { |
1811 |
|
relation_chain_t *next = rchain->next; |
1812 |
|
g_free(rchain); |
1813 |
|
rchain = next; |
1814 |
|
} |
1815 |
|
} |
1816 |
|
|
1817 |
/* return all ways a node is in */ |
/* return all ways a node is in */ |
1818 |
way_chain_t *osm_node_to_way(osm_t *osm, node_t *node) { |
way_chain_t *osm_node_to_way(osm_t *osm, node_t *node) { |
1819 |
way_chain_t *chain = NULL, **cur_chain = &chain; |
way_chain_t *chain = NULL, **cur_chain = &chain; |
2254 |
return NULL; |
return NULL; |
2255 |
} |
} |
2256 |
|
|
2257 |
|
char *osm_object_get_name(object_t *object) { |
2258 |
|
tag_t *tags = osm_object_get_tags(object); |
2259 |
|
|
2260 |
|
if(!tags) return NULL; |
2261 |
|
return osm_tag_get_by_key(tags, "name"); |
2262 |
|
} |
2263 |
|
|
2264 |
char *osm_object_string(object_t *object) { |
char *osm_object_string(object_t *object) { |
2265 |
char *type_str = osm_object_type_string(object); |
char *type_str = osm_object_type_string(object); |
2266 |
|
|
2267 |
if(!object) |
if(!object) |
2268 |
return g_strdup_printf("%s #<invalid>", type_str); |
return g_strdup_printf("%s #<invalid>", type_str); |
2269 |
|
|
2270 |
|
char *name = osm_object_get_name(object); |
2271 |
|
if(name) |
2272 |
|
return g_strdup_printf("%s \"%s\"", type_str, name); |
2273 |
|
|
2274 |
switch(object->type) { |
switch(object->type) { |
2275 |
case ILLEGAL: |
case ILLEGAL: |
2276 |
return g_strdup_printf("%s #<unspec>", type_str); |
return g_strdup_printf("%s #<unspec>", type_str); |