如何在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
相关产品推荐
相关产品推荐

