2

こんにちは、Java でこのサンプルを使用して、OpenStreetMaps Offline タイルを読み込もうとしています。

たとえば、C:/OSM/tiles/ にタイルがあります。

しかし、この情報をマップ (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);
    }

}
4

4 に答える 4

2

JMapViewer の変更と再コンパイルを必要としない、はるかに優れた代替手段は、ここに示すように、独自の TileSource 実装を提供することです。

OfflineOsmTileSourceを取得し、ブログ投稿のように使用します。

シンプルでエレガント。必要なのは、ローカルに保存されている osm タイルだけです。これは既にお持ちだと思います。

于 2012-08-28T05:22:04.630 に答える
1

私が覚えている限り、JMapViewer はオンライン マップのみを使用して動作するように設計されています。

その動作を変更すると複雑になります。org.openstreetmap.gui.jmapviewer.TileLoader独自のインスタンスを実装することでこれを達成できるかもしれません。実装は、特定のタイルを TileCache にロードし、タイルのロードが完了したことを登録済みの TileLoaderListener に通知する Runnable インスタンスを作成できる必要があるだけです。

于 2012-05-18T18:27:34.400 に答える
0

ソースを直接コンパイルして変更

\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;
    }
于 2012-05-21T14:22:58.187 に答える