문제

안녕하세요, OpenStreetMaps 오프라인 타일을로드하기 위해 Java 에서이 샘플을 사용하고 있습니다.

예를 들어 C : / OSM / 타일 / 에 타일이 있습니다.

그러나이 정보를지도 (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);
    }

}
.

도움이 되었습니까?

해결책 3

나는 소스에 의해 직접 컴파일하고 을 변경합니다

\ org \ 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;
    }
.

다른 팁

jmapViewer를 수정하고 다시 컴파일 해야하는 훨씬 더 좋은 대안은 자신의 TiLesource 구현을 제공하는 것입니다. 여기 .

OfflineOSMTIleSource 블로그 게시물처럼 사용하십시오.

간단하고 우아합니다.당신이 필요로하는 것은 당신이 이미 가정하는 osm 타일입니다.

jmapviewer가 온라인 맵을 사용하여 만 사용할 수 있도록 설계된

해결 솔기를 복잡하게 변경합니다.자신의 org.openstreetmap.gui.jmapviewer.TileLoader 인스턴스를 구현 하여이 작업을 수행 할 수 있습니다.구현은 특정 타일을 TileCache에로드하고 타일로드가 완료되었음을 등록한 TileLoaderListener에게 알리는 Runnable 인스턴스 만 만들어야합니다.

이 스레드가 발생했을 때이 접근 방식이 다시 지원되지 않지만 오프라인 타일을 캐싱하는 경우 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);
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top