You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GMapsFX/JavaFX中实现多个标记点间的路径规划?

在GMapsFX中绘制多个标记点间的路径

核心逻辑

GMapsFX通过DirectionsService和DirectionsRenderer实现路线绘制:

  • DirectionsService:向谷歌地图API请求路线数据
  • DirectionsRenderer:将获取到的路线数据渲染到地图上

实现步骤

1. 存储标记点坐标

先定义集合保存所有标记的经纬度,每次添加新标记时同步更新:

// 类成员变量,存储所有标记点坐标
private List<LatLong> markerPositions = new ArrayList<>();
private Map map;
private DirectionsService directionsService;
private DirectionsRenderer directionsRenderer;

2. 初始化地图与路线组件

修改你的mapInitialized方法,初始化路线服务和渲染器并绑定到地图:

@Override
public void mapInitialized() {
    MapOptions mapOptions = new MapOptions();
    mapOptions.mapType(MapTypeIdEnum.ROADMAP).zoom(16).keyboardShortcuts(false);
    map = mapView.createMap(mapOptions);

    // 初始化路线服务与渲染器
    directionsService = new DirectionsService();
    directionsRenderer = new DirectionsRenderer(true, map, mapView);

    // 添加第一个标记并记录坐标
    LatLong latLong = new LatLong(50.0650887,19.9245536);
    MarkerOptions markerOptions = new MarkerOptions();
    Marker marker = new Marker(markerOptions);
    marker.setPosition(latLong);
    map.addMarker(marker);
    markerPositions.add(latLong);

    map.setCenter(latLong);
}

3. 添加新标记的逻辑

后续添加标记时,同步将坐标存入集合:

// 示例:添加新标记的方法
public void addNewMarker(double lat, double lng) {
    LatLong newPos = new LatLong(lat, lng);
    MarkerOptions markerOptions = new MarkerOptions();
    Marker newMarker = new Marker(markerOptions);
    newMarker.setPosition(newPos);
    map.addMarker(newMarker);
    markerPositions.add(newPos);
}

4. 生成路径的方法

写一个触发路线生成的方法,可绑定到按钮点击或自动触发:

public void generateRoute() {
    if (markerPositions.size() < 2) {
        // 至少需要两个点才能生成路径
        return;
    }

    // 构建路线请求
    DirectionsRequest request = new DirectionsRequest();
    request.origin(markerPositions.get(0)) // 起点
           .destination(markerPositions.get(markerPositions.size() - 1)) // 终点
           .travelMode(TravelMode.DRIVING); // 可选模式:DRIVING/WALKING/BICYCLING/TRANSIT

    // 添加途经点(标记数超过2个时)
    if (markerPositions.size() > 2) {
        for (int i = 1; i < markerPositions.size() - 1; i++) {
            request.waypoint(new DirectionsWaypoint(markerPositions.get(i)));
        }
    }

    // 请求并渲染路线
    directionsService.route(request, (response, status) -> {
        if (status == DirectionsStatus.OK) {
            directionsRenderer.clearDirections(); // 清除旧路线
            directionsRenderer.setDirections(response); // 渲染新路线
            map.fitBounds(directionsRenderer.getBounds()); // 自动适配地图视野
        } else {
            System.out.println("路线生成失败:" + status);
        }
    });
}

5. 绑定按钮触发(可选)

如果需要点击按钮生成路径,可添加按钮并绑定事件:

Button generateBtn = new Button("生成路径");
generateBtn.setOnAction(e -> generateRoute());
// 将按钮添加到你的JavaFX布局中

内容的提问来源于stack exchange,提问作者Kacper Bielak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:52:42