You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:55:25