Фактически, проще всего генерировать кучу картинок с координатами наложения, затем накладывать их на слой (одну большую картинку), либо сразу одну большую, если иначе никак. Затем нарезаете их на кусочки — тайлы (tile). Все это делаете для каждого зума. Раскладываете в папочки в виде /{zoom}/{x}/{y}.png и создаете слой, с указанием как грузить эти самые тайлы. В общем-то, все.
Тулзы для нарезки есть в опенсорсе, тулзы для генерации тоже есть, но они специфические, ну и создание слоев описано в доке карт. Кстати, для гугла и openstreet механизмы те же самые, но апи немножко другое — т.е. создание слоя будет выглядеть чуть иначе, просто другой js.
Самое сложное, в общем, придумать как генерировать эти цельные картинки для каждого зума. Остальное дело техники.
upd: А, да. Часто бывает удобно генерировать тайлы сразу из кусочков, которые входят в этот тайл. Часто это бывает даже быстрее, чем создавать общий слой — выигрышь, как минимум, по памяти.
И еще есть нюанс при загрузке тайлов, на которых ничего нет. Либо отдавать 1px gif вместо них (например, через http://wiki.nginx.org/HttpEmptyGifModule), либо возвращать 204 код (return 204 в nginx) — нет контента. Первый вариант работает для всех АПИ карт, второй может криво работать в ие (хорошо бы уточнить).