高德地图多点线路规划

这篇博客介绍了如何在Android应用中使用高德地图实现多点线路规划,并且详细讲解了如何根据途经点到起点的距离进行排序。同时,作者还分享了自定义Marker的方法,包括InfoWindow和Marker的监听,以及如何在地图上绘制标记。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class MyMapActivity extends Activity implements AMap.OnInfoWindowClickListener ,RouteSearch.OnRouteSearchListener ,AMap.OnMarkerClickListener{
    private MapView map;
    private AMap aMap;
    private UiSettings uiSettings;
    private CameraUpdate mUpdate;
    private ArrayList<MapInfo> list,lists,jlist;  //途经点集合
    private ArrayList<LatLonPoint> list1;     
    private DriveRouteResult driveRouteResult;// 驾车模式查询结果
    private int drivingMode = RouteSearch.DrivingDefault;// 驾车默认模式
    private RouteSearch routeSearch;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_my_map);
        map = (MapView)findViewById(R.id.map);

        map.onCreate(savedInstanceState);

       //(模拟数据)得到途经点集合

        list=new ArrayList<>();
        list.add(new MapInfo("4", 39.8530620000, 116.3747240000, "鸿运水果烟酒超市", "详细地址详细地址5555"));
        list.add(new MapInfo("6", 39.8516080000, 116.3734790000, "世纪华联超市", "详细地址详细地址7777"));
        list.add(new MapInfo("10",39.844693, 116.369901, "鲜花婚庆水果", "详细地址详细地址1010"));
        list.add(new MapInfo("12",39.84237, 116.381086, "街角蛋糕", "详细地址详细地址66666"));
        list.add(new MapInfo("16",39.854152, 116.415689, "北京同仁堂第二中医院", "详细地址详细地址222"));

        list.add(new MapInfo("17",39.860975, 116.412025, "北京市益华食品厂", "详细地址详细地址3333"));

        initdata();//根据途经点到起点的距离进行排序

        init();  //初始化地图


       //得到途经点坐标

        list1=new ArrayList<>();
        for (int i=0;i<list.size();i++){
            list1.add(new LatLonPoint(list.get(i).getLat(),list.get(i).getLng()));

        }

      //InfoWindow  和 Marker 监听 以及线路规划监听

        aMap.setOnInfoWindowClickListener(this);
        aMap.setOnMarkerClickListener(this);

        routeSearch = new RouteSearch(this);

        routeSearch.setRouteSearchListener(this);

        final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(new LatLonPoint(39.854648,116.367852), new     LatLonPoint(39.833673,116.387424)); //设置起点和终点


        RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, drivingMode, list1, null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路
        routeSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询


    }

/**

* 根据途经点到起点的距离进行排序

*/

public  void  initdata(){

       jlist=new ArrayList<>();
        for (int i=0;i<list.size();i++){

            MapInfo mapInfo=new MapInfo();

            float[] results=new float[1];
            Location.distanceBetween(39.854648, 116.367852, list.get(i).getLat(), list.get(i).getLng(), results);

            mapInfo.setJuli(results[0]);

            mapInfo.setUid(list.get(i).getUid());
            jlist.add(mapInfo);
         

        }

        double temp;
        String str;
        for(int i = jlist.size() - 1; i >= 0; i --) {
            for (int j = 0; j < i; j+
### Java 实现高德地图多点位导航 为了实现Java程序中调用高德地图API完成多点位导航,需遵循一系列步骤来确保应用能够正确发送请求并处理返回的数据。这不仅涉及到了解如何构建HTTP请求以访问特定的服务端口,还需要掌握怎样解析JSON格式的响应内容。 #### 获取开发者密钥 在开始之前,务必先注册成为高德开放平台的一员,并申请获得属于自己的Web服务API Key。此Key用于身份验证,在每次向服务器发出查询时作为参数传递给目标URL[^1]。 #### 构建HTTP GET请求 对于途经路径规划而言,可以利用`path`字段指定个坐标对之间的连接方式;而具体每一个地的信息则由经纬度组成,中间通过竖线分隔开各个节的位置描述。下面给出了一段简单的代码片段展示如何创建这样的网络通信: ```java String key = "your_api_key"; // 替换成实际取得的应用秘钥 StringBuilder urlBuilder = new StringBuilder(); urlBuilder.append("https://restapi.amap.com/v3/direction/driving?"); urlBuilder.append(String.format("origin=%f,%f", startLongitude, startLatitude)); for (int i = 0; i < waypoints.size(); ++i){ Waypoint wp = waypoints.get(i); if (i == 0) { urlBuilder.append("&waypoints="); } else { urlBuilder.append("|"); } urlBuilder.append(String.format("%f,%f", wp.getLongitude(), wp.getLatitude())); } urlBuilder.append(String.format("&destination=%f,%f&key=%s", endLongitude, endLatitude, key)); // 发起GET请求... ``` 此处需要注意的是,当存在中途停留站(即WayPoints)的时候,它们之间应该用英文状态下的管道符(|)相连,并且整个字符串应当附加到基础地址后面形成完整的请求链接。 #### 解析API响应 一旦接收到从云端传回的消息体之后,下一步就是从中抽取有用的部分供后续逻辑运算之用了。通常情况下,该过程会借助第三方库如Gson或是Jackson来进行快速转换成易于操作的对象结构。假设现在有一个名为`RouteResponse`类用来映射预期的结果集,则可以通过如下所示的方式实例化对象: ```java Reader reader = new InputStreamReader(inputStreamFromServer,"UTF-8"); Gson gson = new Gson(); RouteResponse routeInfo = gson.fromJson(reader, RouteResponse.class); if ("1".equals(routeInfo.getStatus())){ List<Steps> stepsList = routeInfo.getRoutes().get(0).getPath().getSteps(); for (Steps step : stepsList){ System.out.println(step.getDescription()); } } else{ System.err.println("Error occurred:" + routeInfo.getInfo()); } ``` 上述例子展示了如果一切顺利的话将会打印出每一步骤的具体说明文字;反之则报告错误详情以便排查问题所在。 #### 完整示例代码 综合以上各部分内容,这里提供了一个较为完整的案例帮助理解整体流程: ```java public class AMapMultiPointNavigation { private static final String API_KEY = "your_api_key"; public static void main(String[] args)throws Exception { double originLng = 116.479582; double originLat = 39.997755; ArrayList<Waypoint> wps = new ArrayList<>(); wps.add(new Waypoint(116.479582, 39.997755)); // 添加途径 double destLng = 116.480122; double destLat = 39.997755; URL url = buildUrl(originLng, originLat, wps, destLng, destLat); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); BufferedReader br = null; try { InputStream is = conn.getInputStream(); br = new BufferedReader(new InputStreamReader(is)); StringBuffer response = new StringBuffer(); String line; while ((line = br.readLine()) != null) { response.append(line); } parseAndPrint(response.toString()); } finally { if(br!=null) br.close(); } } private static URL buildUrl(double oLon,double oLat,List<Waypoint> ws,double dLon,double dLat)throws MalformedURLException{ StringBuilder sb=new StringBuilder("https://restapi.amap.com/v3/direction/driving?"); sb.append(String.format(Locale.CHINA,"origin=%.6f,%.6f",oLon,oLat)); if(ws!=null&&!ws.isEmpty()){ boolean isFirst=true; for(Waypoint p:ws){ if(isFirst){ sb.append("&waypoints="); isFirst=false; }else{ sb.append('|'); } sb.append(String.format("%.6f,%.6f",p.longitude,p.latitude)); } } sb.append(String.format(Locale.CHINA,"&destination=%.6f,%.6f&key=%s",dLon,dLat,API_KEY)); return new URL(sb.toString()); } @Data // Lombok annotation to generate getters and setters. static class Waypoint{ Double longitude; Double latitude; public Waypoint(Double lng,Double lat){ this.longitude=lng; this.latitude=lat; } } private static void parseAndPrint(String jsonStr)throws JsonSyntaxException{ Gson gson =new Gson(); RouteResponse resp=gson.fromJson(jsonStr,RouteResponse.class); if(resp==null||!"1".equals(resp.getStatus())){ throw new RuntimeException("Failed to get valid result from server."); } Routes routes=resp.getRoutes().get(0); Path path=routes.getPath(); List<Steps>steps=path.getSteps(); for(int i=0;i<steps.size();++i){ Steps s=steps.get(i); System.out.printf("[%d]%n%s%n",i+1,s.getAction()); } } } @Data // Similar usage of lombok here as well. class RouteResponse{ private String status; private Info info; private List<Routes> routes; } @Data class Routes{ private Path path; } @Data class Path{ private List<Steps> steps; } @Data class Steps{ private String action; } ``` 这段代码实现了从起经过若干个中途停靠站到达终的过程模拟,并输出了推荐路线上的行动指令列表。当然这只是最简化版本的实际应用场景之一,更高级特性还需参照官方文档深入研究。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值