【问题标题】:JMapViewer ADD tiles for offline viewJMapViewer 为离线视图添加瓦片
【发布时间】:2012-05-18 17:35:29
【问题描述】:

您好,我正在使用 Java 中的这个示例来尝试加载 OpenStreetMaps Offline 图块,

例如,我在 C:/OSM/tiles/ 上有我的图块

但我需要知道如何在地图 (JMapViewer) 类中添加此信息以在本地加载图块。

非常感谢您的帮助,这是我的来源:

//License: GPL. Copyright 2008 by Jan Peter Stotz

import org.openstreetmap.gui.jmapviewer.JMapViewer;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 *
 * Demonstrates the usage of {@link JMapViewer}
 *
 * @author Jan Peter Stotz
 *
 */
public class Demo extends JFrame {

    public Demo() {
        super("JMapViewer Demo");
        setSize(400, 400);
        final JMapViewer map = new JMapViewer();
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        JPanel panel = new JPanel();
        add(panel, BorderLayout.NORTH);
        final JCheckBox showMapMarker = new JCheckBox("Map markers visible");
        showMapMarker.setSelected(map.getMapMarkersVisible());
        showMapMarker.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                map.setMapMarkerVisible(showMapMarker.isSelected());
            }
        });
        panel.add(showMapMarker);
        final JCheckBox showTileGrid = new JCheckBox("Tile grid visible");
        showTileGrid.setSelected(map.isTileGridVisible());
        showTileGrid.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                map.setTileGridVisible(showTileGrid.isSelected());
            }
        });
        panel.add(showTileGrid);
        final JCheckBox showZoomControls = new JCheckBox("Show zoom controls");
        showZoomControls.setSelected(map.getZoomContolsVisible());
        showZoomControls.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                map.setZoomContolsVisible(showZoomControls.isSelected());
            }
        });
        panel.add(showZoomControls);
        add(map, BorderLayout.CENTER);

        //
//      map.addMapMarker(new MapMarkerDot(49.814284999, 8.642065999));
//      map.addMapMarker(new MapMarkerDot(49.91, 8.24));
//      map.addMapMarker(new MapMarkerDot(49.71, 8.64));
//      map.addMapMarker(new MapMarkerDot(48.71, -1));
//      map.addMapMarker(new MapMarkerDot(49.807, 8.644));

        map.setDisplayPositionByLatLon(-0.223056, -78.5126, 11);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Demo().setVisible(true);
    }

}

【问题讨论】:

    标签: java swing openstreetmap offline-mode


    【解决方案1】:

    不需要修改 JMapViewer 并重新编译它的更好的替代方法是提供您自己的 TileSource 实现,如 here 所示。

    获取OfflineOsmTileSource,并按照博文所述使用它。

    简单而优雅。您所需要的只是一些本地存储的 osm 切片,我假设您已经拥有了。

    【讨论】:

      【解决方案2】:

      据我所知,JMapViewer 旨在仅使用在线地图工作。

      改变这种行为似乎很复杂。也许您可以通过实现自己的org.openstreetmap.gui.jmapviewer.TileLoader 实例来实现这一点。该实现只需能够创建可将特定图块加载到 TileCache 中的 Runnable 实例,并通知已注册的 TileLoaderListener 已完成图块加载。

      【讨论】:

      • 我在调试器中做,现在我需要在源代码中做// Change JMapViewer.tileController.tileSource.baseUrl = "http://tile.openstreetmap.org" JMapViewer.tileSource.baseUrl = "http://tile.openstreetmap.org" //to JMapViewer.tileController.tileSource.baseUrl = "file:///C:/OSM/tiles" JMapViewer.tileSource.baseUrl = "file:///C:/OSM/tiles"
      • 我需要重新编译 JMapViewer.jar 更改此值
      【解决方案3】:

      我直接源码编译改

      \org\openstreetmap\gui\jmapviewer\tilesources\AbstractOsmTileSource.java

      这里是JMapViewer.zip/JMapViewer_src.jar里面的源代码解压Jar文件并复制到邮件源代码文件夹中的文件夹/org

      http://svn.openstreetmap.org/applications/viewer/jmapviewer/releases/2011-02-19/JMapViewer.zip

      然后改变下一个

       public AbstractOsmTileSource(String name, String base_url, String attr_img_url) {
              this.name = name;
           // this.baseUrl = base_url;
              this.baseUrl = "file:///C:/OSM/tiles";
              attrImgUrl = attr_img_url;
          }
      

      【讨论】:

        【解决方案4】:

        我不知道当这个线程发生时是否不支持这种方法,但是为了缓存离线切片,他们提供了 OsmFileCacheTileLoader;

        http://josm.openstreetmap.de/doc/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.html

        超级好用。

        this.mapViewer = new JMapViewer();
        OsmFileCacheTileLoader ofctl;
        try {
            File cacheDir = new File(System.getProperty("user.home"), "OpenStreetMapTileCache");
            logger.info("Home Directory = " + System.getProperty("user.home") + ", cacheDir=" + cacheDir);
            cacheDir.mkdirs();
            ofctl = new OsmFileCacheTileLoader(mapViewer, cacheDir);
            this.mapViewer.setTileLoader(ofctl);
        } catch (IOException ex) {
            Logger.getLogger(MapDisplayPanel.class.getName()).log(Level.SEVERE, "Exception creating OsmFileCacheTileLoader" + ex, ex);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-21
          • 2014-02-08
          相关资源
          最近更新 更多