JMapViewer AGREGAR mosaicos para ver sin conexión
-
11-12-2019 - |
Pregunta
Hola, estoy usando este ejemplo en Java para intentar cargar mosaicos de OpenStreetMaps sin conexión.
por ejemplo tengo mis mosaicos en C:/OSM/tiles/
pero necesito saber cómo agregar esta información en la clase de mapa (JMapViewer) para cargar mosaicos localmente.
Muchas gracias por tu ayuda esta es mi fuente:
//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);
}
}
Solución 3
Rec compile por la fuente directamente y cambie
\ org \ openstreetmap \ gui \ jmapviewer \ ticeurces \ abstractosmtileurce.java
Aquí está el código fuente dentro de jmapviewer.zip/jmapviewer_src.jar Extrae el archivo JAR y copie la carpeta / ORG en la carpeta de código de código de correo
y cambia el siguiente
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; }
Otros consejos
Una alternativa mucho mejor que no requiere modificar JMAPViewer y la recompilación, es proporcionar su propia implementación de TiceOurce, como se muestra aquí .
Agarra el OfflineosMtileSource , y úsalo como la publicación del blog dice.
Hasta donde recuerdo, JMapViewer está diseñado para funcionar únicamente con mapas en línea.
Cambiar ese comportamiento parece complicado.Quizás puedas lograr esto implementando el tuyo propio. org.openstreetmap.gui.jmapviewer.TileLoader
instancia.La implementación solo tiene que poder crear instancias Runnable que carguen un mosaico específico en TileCache e informen al TileLoaderListener registrado que se completó la carga de un mosaico.
No tengo idea de si este enfoque no fue respaldado cuando sucedió este hilo, sino para el almacenamiento en caché de azulejos sin conexión, proporcionan osmfilecachetileloader;
es super fácil de usar.
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);
}