Зависит от нужной детализации. Я делал локальную карту на GeoJSON тайлах(тайлы - порционная загрузка карты, GeoJSON - чтобы векторно отрисовывать). Отрисовка идет полностью на стороне клиента, если добавить gzip сжатие данных на сервере, то тайлы вообще мало весят. Сервер же работает с базой данных postgresql - координаты с типом данных polygon - за счет этого доступна логика пересечения полигонов - в запросе указываем полигон(bounding box) тайла, который легко рассчитывается по его x,y,z координатам. В базе несколько таблиц с группировкой по типам - дороги,жд пути,дома,леса,реки,озера. Скорость отдачи тайлов зависит лишь от производительности движка баз данных. Отдачу типов по увеличению можно регулировать на стороне сервера.
Для отображения использовал OpenLayers - нужно больше писать и думать(зато полностью кастомизируется отрисовка), а то Leaflet слишком простой. В принципе он тоже должен уметь работать с GeoJSON тайлами.
Локально нужно только если карта часть софта в закрытой корпоративной сети, где интернет ограничен - потому что в любом случае не будешь хранить карту в той детализации в которой она представленна в интернете.