I have already implemented your concept in my opencart project.
Notes:
1) by default in product adding dashboard page have a field to enter product location you fill product location there and follow my points
2) open catalog > model > category.php add this code
function getCategoryLoction($category_id) {
$sql = "select p.location,count(p.location) as locCount from " . DB_PREFIX . "product p inner join " . DB_PREFIX . "product_to_category p2c on(p.product_id=p2c.product_id) where p2c.category_id=$category_id group by p.location";
$query = $this->db->query($sql);
return $query->rows;
}
3) open catalog > controller>module > category.php add this code
/* location based search starts here */
$incomingCatId = ($this->data['category_id']!= '')?$this->data['category_id']:'0';
$locations = $this->model_catalog_category->getCategoryLoction($incomingCatId);
foreach($locations as $loc):
$this->data['locations'][] = array(
'location' => $loc['location'],
'count' => $loc['locCount'],
'href' => $this->url->link('product/category', 'path=' . $incomingCatId.'&loc='.$loc['location'].'')
);
endforeach;
/* location based search ends here */
4) open catalog > view >theme >default >template>module > category.tpl category add this code
<div class="l_nav_box">
<div class="l_nav_title">
<h6>Location</h6>
</div>
<ul class="cat_ul">
<?php if(!empty($locations)): ?>
<?php foreach ($locations as $loc) : ?>
<?php if($loc['location']!= ''): ?>
<li> <a href="<?php echo $loc['href']; ?>"><?php echo $loc['location']; ?> <span>(<?php echo $loc['count']; ?>)</span> </a> </li>
<?php endif; ?>
<?php endforeach; ?>
<?php else: ?>
No Locations mentioned
<?php endif; ?>
</ul>
</div>
5) important in admin side activate category module and save it choose