您好我在Java中使用此示例尝试加载OpenStreetMaps离线图块
例如我在C:/ OSM / 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);
}
}
答案 0 :(得分:2)
更好的替代方法是不需要修改JMapViewer并重新编译它就是提供自己的TileSource实现,如here所示。
抓住OfflineOsmTileSource,然后像博客帖子那样使用它。
简单而优雅。你需要的只是一些本地存储的osm磁贴,我假设你已经拥有它。
答案 1 :(得分:1)
据我所知,JMapViewer只能使用在线地图。
改变这种行为接缝是复杂的。您可以通过实现自己的org.openstreetmap.gui.jmapviewer.TileLoader
实例来实现此目的。实现只需要能够创建Runnable实例,将特定的tile加载到TileCache中,并通知已注册的TileLoaderListener已完成tile加载。
答案 2 :(得分:0)
我直接由源编译并更改
\有机\ 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;
}
答案 3 :(得分:0)
我不知道在这个线程发生时是否不支持这种方法,但是对于缓存离线瓦片它们提供了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);
}