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; |