diff --git a/pystac/catalog.py b/pystac/catalog.py index f1d7a8d5a..ce32c2df8 100644 --- a/pystac/catalog.py +++ b/pystac/catalog.py @@ -557,8 +557,11 @@ def generate_subcatalogs(self, template, defaults=None, parent_ids=None, **kwarg layout_template = LayoutTemplate(template, defaults=defaults) - items = list(self.get_items()) - for item in items: + keep_item_links = [] + item_links = [lk for lk in self.links if lk.rel == 'item'] + for link in item_links: + link.resolve_stac_object(root=self.get_root()) + item = link.target item_parts = layout_template.get_template_values(item) id_iter = reversed(parent_ids) if all(['{}'.format(id) == next(id_iter, None) @@ -566,6 +569,7 @@ def generate_subcatalogs(self, template, defaults=None, parent_ids=None, **kwarg # Skip items for which the sub-catalog structure already # matches the template. The list of parent IDs can include more # elements on the root side, so compare the reversed sequences. + keep_item_links.append(link) continue curr_parent = self for k, v in item_parts.items(): @@ -578,13 +582,17 @@ def generate_subcatalogs(self, template, defaults=None, parent_ids=None, **kwarg curr_parent.add_child(subcat) result.append(subcat) curr_parent = subcat - self.remove_item(item.id) + # resolve collection link so when added back points to correct location link = item.get_single_link('collection') if link is not None: link.resolve_stac_object() + curr_parent.add_item(item) + # keep only non-item links and item links that have not been moved elsewhere + self.links = [lk for lk in self.links if lk.rel != 'item'] + keep_item_links + return result def save(self, catalog_type=None):