A reusable software architecture for geographic information systems based on software product line engineering