Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMapViewer为脱机视图添加平铺_Java_Swing_Openstreetmap_Offline Mode - Fatal编程技术网

Java JMapViewer为脱机视图添加平铺

Java JMapViewer为脱机视图添加平铺,java,swing,openstreetmap,offline-mode,Java,Swing,Openstreetmap,Offline Mode,您好,我正在使用Java中的此示例尝试加载OpenStreetMaps脱机互动程序 例如,我在C:/OSM/tiles上有我的tiles/ 但我需要知道如何在map(JMapViewer)类中添加这些信息以在本地加载分幅 非常感谢您的帮助这是我的来源: //License: GPL. Copyright 2008 by Jan Peter Stotz import org.openstreetmap.gui.jmapviewer.JMapViewer; import javax.swing.

您好,我正在使用Java中的此示例尝试加载OpenStreetMaps脱机互动程序

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

但我需要知道如何在map(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);
    }

}

据我记忆所及,JMapViewer设计为仅使用在线地图工作


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

我直接由源代码编译并更改

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

下面是JMapViewer.zip/JMapViewer_src.jar中的源代码,提取jar文件并复制邮件源代码文件夹中的文件夹/org

然后换下一个

 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;
    }

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

抓起这个,像博客上说的那样使用它


朴素典雅。您所需要的只是一些本地存储的osm磁贴,我想您已经有了。

我不知道当这个线程发生时,这种方法是否不受支持,但对于缓存脱机磁贴,它们提供了OsmFileCacheTileLoader

它非常容易使用

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);
}

我在调试器中执行此操作,现在需要在源代码中执行此操作http://tile.openstreetmap.org“JMapViewer.tileSource.baseUrl=”http://tile.openstreetmap.org“//到JMapViewer.TileControl.tileSource.baseUrl=”file:///C:/OSM/tiles“JMapViewer.tileSource.baseUrl=”file:///C:/OSM/tiles"我需要重新编译JMapViewer.jar以更改此值