Pergunta

Olá, estou usando este exemplo em Java para tentar carregar blocos do OpenStreetMaps Offline,

por exemplo, tenho meus blocos em C:/OSM/tiles/

mas preciso saber como adicionar essas informações na classe map (JMapViewer) para carregar os blocos localmente.

Muito obrigado pela sua ajuda, esta é minha fonte:

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

}
Foi útil?

Solução 3

Eu compilo pela fonte diretamente e mudo

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

Aqui está o código-fonte dentro de JMapViewer.zip/JMapViewer_src.jar, extraia o arquivo Jar e copie a pasta /org na pasta do código-fonte de correio

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

e mude o próximo

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

Outras dicas

Uma alternativa muito melhor que não requer modificação e recompilação do JMapViewer é fornecer sua própria implementação do TileSource, conforme mostrado aqui.

Pegue o Fonte offlineOsmTile, e use-o como diz a postagem do blog.

Simples e elegante.Tudo que você precisa é de alguns blocos osm armazenados localmente, que presumo que você já tenha.

Pelo que me lembro, o JMapViewer foi projetado para funcionar apenas com mapas online.

Mudar esse comportamento parece ser complicado.Talvez você consiga isso implementando seu próprio org.openstreetmap.gui.jmapviewer.TileLoader instância.A implementação só precisa ser capaz de criar instâncias Runnable que carreguem um bloco específico no TileCache e informem ao TileLoaderListener registrado que o carregamento do bloco foi concluído.

Não tenho ideia se essa abordagem não era suportada quando esse tópico aconteceu, mas para armazenar blocos off-line em cache eles fornecem OsmFileCacheTileLoader;

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

É 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top