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

}
¿Fue útil?

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

http://svn.openstreetmap.Org / Aplicaciones / Visor / JMAPViewer / Lanzamientos / 2011-02-19 / JMAPViewer.zip

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.

simple y elegante.Todo lo que necesita es que algunos azulejos OSM almacenados localmente, lo que asumo que ya tiene.

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;

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top