如何使用JXMapViewer库加载离线OSM地图?Zip文件及实现疑问
JXMapViewer离线地图实现(Zip瓦片加载)
核心问题说明
你当前使用的syria-latest-free.shp.zip是SHP矢量格式文件,但JXMapViewer依赖的是栅格瓦片切片(Z/X/Y结构的图片文件),所以无法识别。必须使用符合瓦片层级结构的Zip压缩包。
所需Zip文件的要求
- 内部结构必须遵循OSM瓦片命名规则:
[缩放级别Z]/[瓦片X坐标]/[瓦片Y坐标].png(或jpg),比如7/38/95.png - Zip根目录直接包含各缩放级别的文件夹,不能嵌套额外的根文件夹(比如不能是
tiles/7/38/95.png) - 瓦片需对应你要显示的地理区域和缩放级别,可通过工具下载生成
具体实现步骤
1. 生成符合要求的瓦片Zip
使用Mobile Atlas Creator(MOBAC)这类工具:
- 选择OpenStreetMap作为瓦片源
- 框选目标区域,选择需要的缩放级别(比如1-10)
- 导出格式选择ZIP Archive,并设置目录结构为
Z/X/Y - 导出后得到的Zip就是JXMapViewer可识别的离线资源
2. 修正代码实现
以下是调整后的可运行代码,关键修改点已标注:
import org.jxmapviewer.JXMapViewer; import org.jxmapviewer.OSMTileFactoryInfo; import org.jxmapviewer.viewer.DefaultTileFactory; import org.jxmapviewer.viewer.GeoPosition; import org.jxmapviewer.viewer.TileFactory; import org.jxmapviewer.viewer.TileFactoryInfo; import org.jxmapviewer.input.PanMouseInputListener; import org.jxmapviewer.input.ZoomMouseWheelListenerCursor; import javax.swing.*; import java.awt.*; import java.awt.event.MouseInputListener; public class OfflineMapExample { public static void main(String[] args) { // 配置TileFactoryInfo:指向本地瓦片Zip,注意末尾的!表示Zip内部根目录 TileFactoryInfo info = new OSMTileFactoryInfo( "Offline OSM Tiles", "file:/C:/Users/HP/Documents/your-offline-tiles.zip!/", // 替换为你的瓦片Zip路径 "x", "y", "z" ); // 设置瓦片的缩放范围(需和下载的瓦片级别匹配) info.setMinimumZoomLevel(1); info.setMaximumZoomLevel(10); // OSM瓦片默认是256x256,保持一致 info.setTileSize(256); // 创建瓦片工厂并绑定到JXMapViewer TileFactory tileFactory = new DefaultTileFactory(info); final JXMapViewer mapViewer = new JXMapViewer(); mapViewer.setTileFactory(tileFactory); // 设置地图中心(需在你下载的瓦片区域内,否则显示空白) // 示例:叙利亚大马士革的坐标,替换为你下载的区域坐标 GeoPosition damascus = new GeoPosition(33.5138, 36.2765); mapViewer.setZoom(8); // 需在你下载的缩放级别范围内 mapViewer.setAddressLocation(damascus); // 添加交互控件 MouseInputListener mia = new PanMouseInputListener(mapViewer); mapViewer.addMouseListener(mia); mapViewer.addMouseMotionListener(mia); mapViewer.addMouseWheelListener(new ZoomMouseWheelListenerCursor(mapViewer)); // 显示窗口 final JFrame frame = new JFrame(); frame.setLayout(new BorderLayout()); frame.add(new JLabel("左键拖拽平移,滚轮缩放"), BorderLayout.NORTH); frame.add(mapViewer); frame.setSize(800, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("JXMapViewer 离线地图示例"); frame.setVisible(true); } }
3. 关键注意事项
- 确保Zip路径格式正确:本地文件用
file:/[绝对路径]/tiles.zip!/,如果是打包到Jar里则用jar:file:/path/to/your.jar!/tiles.zip!/ - 缩放级别必须和下载的瓦片级别一致,超出范围会显示空白
- 地图中心坐标必须在你下载的瓦片覆盖区域内
内容的提问来源于stack exchange,提问作者hani bani
相关产品推荐
相关产品推荐

