Java JXMapViewer(openstreetmap)两点之间的Drow方向

Java JXMapViewer(openstreetmap)两点之间的Drow方向,java,swing,openstreetmap,jxmapviewer,Java,Swing,Openstreetmap,Jxmapviewer,我有这样一个类,它在地图中的指定点或位置之间画一条线,它可以工作 ! import java.awt.BasicStroke; 导入java.awt.Color; 导入java.awt.Graphics2D; 导入java.awt.Rectangle; 导入java.awt.RenderingHints; 导入java.awt.geom.Point2D; 导入java.util.ArrayList; 导入java.util.List; 导入javax.swing.JFrame; 导入org.jx

我有这样一个类,它在地图中的指定点或位置之间画一条线,它可以工作 !

import java.awt.BasicStroke;
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.RenderingHints;
导入java.awt.geom.Point2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入org.jxmapviewer.JXMapKit;
导入org.jxmapviewer.JXMapKit.DefaultProviders;
导入org.jxmapviewer.jxmapviewer;
导入org.jxmapviewer.painter.painter;
导入org.jxmapviewer.viewer.geopposition;
公开课初学者{
公共静态void main(最终字符串[]args){
最终JFrame f=新JFrame();
f、 设置大小(500300);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终JXMapKit jXMapKit1=新的JXMapKit();
jXMapKit1.setDefaultProvider(DefaultProviders.OpenStreetMaps);
jXMapKit1.设置中心位置(新地理位置(5.41984100.33924));
jXMapKit1.setZoom(3);
最终列表区域=新的ArrayList();
添加(新地理位置(5.42031100.34389));
添加(新地理位置(5.41984100.33924));
添加(新地理位置(5.42300100.33456));
最终油漆工lineOverlay=新油漆工(){
@凌驾
公共虚空绘制(图形2D g、最终JXMapViewer贴图、最终int w、最终int h){
g=(Graphics2D)g.create();
//从视口转换为世界位图
最终矩形rect=jXMapKit1.getMainMap().getViewportBounds();
g、 平移(-rect.x,-rect.y);
//画画
g、 setColor(Color.RED);
g、 setRenderingHint(RenderingHits.KEY\u ANTIALIASING,RenderingHits.VALUE\u ANTIALIAS\u ON);
g、 设定行程(新基本行程(2));
int lastX=-1;
int lastY=-1;
用于(最终地理位置总成:区域){
//将geo转换为世界位图像素
final Point2D pt=jXMapKit1.getMainMap().getTileFactory().geotoixel(gp,jXMapKit1.getMainMap().getZoom());
如果(lastX!=-1&&lastY!=-1){
g、 拉丝(拉丝,拉丝,(内线)拉丝(),(内线)拉丝();
}
lastX=(int)pt.getX();
lastY=(int)pt.getY();
}
g、 处置();
}
};
jXMapKit1.getMainMap().setOverlayPaint(lineOverlay);
f、 setContentPane(jXMapKit1);
f、 setVisible(真);
}
}
但我想画一条可以开车的路线。不仅仅是一条横穿整座大楼的直线

当我在地图上选择两个点时,我需要看到一条建议的路径或要到达的路径,而不仅仅是一条线

我需要像这样的图像


有什么帮助吗?

您必须获取每个开放街道瓷砖的元信息,并使用深度优先搜索或搜索来查找最短路径。您可以用类或代码示例解释更多信息吗?或者使用其中一个。那么我如何修改代码呢?@AdeebMark我想我已经这样做了。选择一个联机路由器。然后使用他们的API获得两点之间的路由。解析返回的路线并为每个线段绘制一条线。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;

import org.jxmapviewer.JXMapKit;
import org.jxmapviewer.JXMapKit.DefaultProviders;
import org.jxmapviewer.JXMapViewer;
import org.jxmapviewer.painter.Painter;
import org.jxmapviewer.viewer.GeoPosition;

public class Starter {
    public static void main(final String[] args) {    
        final JFrame f = new JFrame();
        f.setSize(500, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JXMapKit jXMapKit1 = new JXMapKit();
        jXMapKit1.setDefaultProvider(DefaultProviders.OpenStreetMaps);
        jXMapKit1.setCenterPosition(new GeoPosition(5.41984, 100.33924));
        jXMapKit1.setZoom(3);

        final List<GeoPosition> region = new ArrayList<GeoPosition>();
        region.add(new GeoPosition(5.42031, 100.34389));
        region.add(new GeoPosition(5.41984, 100.33924));
        region.add(new GeoPosition(5.42300, 100.33456));

        final Painter<JXMapViewer> lineOverlay = new Painter<JXMapViewer>() {

            @Override
            public void paint(Graphics2D g, final JXMapViewer map, final int w, final int h) {
                g = (Graphics2D) g.create();
                // convert from viewport to world bitmap
                final Rectangle rect = jXMapKit1.getMainMap().getViewportBounds();
                g.translate(-rect.x, -rect.y);

                // do the drawing
                g.setColor(Color.RED);
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g.setStroke(new BasicStroke(2));

                int lastX = -1;
                int lastY = -1;
                for (final GeoPosition gp : region) {
                    // convert geo to world bitmap pixel
                    final Point2D pt = jXMapKit1.getMainMap().getTileFactory().geoToPixel(gp, jXMapKit1.getMainMap().getZoom());
                    if (lastX != -1 && lastY != -1) {
                        g.drawLine(lastX, lastY, (int) pt.getX(), (int) pt.getY());
                    }
                    lastX = (int) pt.getX();
                    lastY = (int) pt.getY();
                }

                g.dispose();

            }

        };

        jXMapKit1.getMainMap().setOverlayPainter(lineOverlay);

        f.setContentPane(jXMapKit1);
        f.setVisible(true);

    }
}