首页 > 其他分享 >快速上手高德JS API——以可视化公交站点线路为例

快速上手高德JS API——以可视化公交站点线路为例

时间:2024-09-20 17:22:46浏览次数:10  
标签:function map 为例 color JS result 公交站点 var

前言

在利用高德地图进行开发时,我们经常需要使用不同的API来实现特定的功能。为了帮助开发者快速定位所需API并掌握正确的使用方法,本文将以可视化任意公交站点路线为例,分享相关经验。

根据需求粗略匹配参考示例

在开始写代码我都会思考一下该功能的实现逻辑是什么:

1、通过什么方式确定站点的位置?是传入定位信息还是用浏览点击来搜索附近站点

2、如何获取到站点和线路的有关信息?这里用到哪些方法,返回什么样的数据,如何处理

3、将最后得到的结果该怎么展现?设置哪些样式和交互?

在捋顺上面的需求后,我们可以先将公交 作为关键字在参考示例搜索,可以看到有公交站点查询和公交线路查询这两个结果,并且参考示例提供有完整运行的代码,我们可以试着改变里面的参数运行调试一下 image.png

深入了解使用规范

比如在公交站点搜索这个参考示例中,是通过传入字符串来搜索得到站点,那如果我想通过传入定位信息或者是点击地图获取到经纬度来搜索是否可行呢?这里我们需要进入参考手册-地图 JS API 2.0进行了解。建议使用英文来查询,能更方便找到相关内容。从这里我们可以看到参数说明,方法,成员函数等等这些,真的非常详细。 image.png 可以看到并不支持传入经纬度数组来查询。因此,我们可以改变思路,在参考手册输入search这里看看有没有其他方式获取。根据翻译,placesearch大概率可以获取到公交站点信息 image.png 为了验证一下,通过添加 console.log打印出来看看

var placeSearch = new AMap.PlaceSearch(placeSearchOptions);
    map.on('click', function(e) {
        // 移除原有marker
        map.remove(markers);
        markers = [];

        // 使用点击位置的坐标进行公交站点搜索
        placeSearch.searchNearBy('公交', e.lnglat, 500, function(status, result) {
            if (status === 'complete' && result.info === 'OK') {
                placeSearch_CallBack(result);
                console.log(result)
            } else {
                document.getElementById('tip').innerHTML = JSON.stringify(result);
            }
        });
    });

屏幕截图 2024-09-20 093523.png 证明确实可行

实现过程

首先依旧是准备好js开发key和jscode,创建好地图示例。这里值得注意的是,一定要添加上用到的插件,即plugin后面

<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=你的key&&plugin=AMap.LineSearch,AMap.PlaceSearch,AMap.InfoWindow">

通过刚才控制台打印的内容,我们需要清理出公交线路的名称。这里可以写一个函数来实现

placeSearch.searchNearBy('公交', e.lnglat, 500, function(status, result) {
            if (status === 'complete' && result.info === 'OK') {
                placeSearch_CallBack(result);
                function extractBusLines(result) {
                    if (result.poiList && result.poiList.pois.length > 0) {
                        // 获取第一个poi对象的address字段
                        var address = result.poiList.pois[0].address;                 
                        // 用分号分割address字符串并过滤掉包含'(停运)'的字符串
                        var busLines = address.split(';').filter(function(line) {
                            return !/(停运)/.test(line);
                        });                       
                        // 进一步清理线路数据,去除可能的空格
                        busLines = busLines.map(function(line) {
                            return line.trim();
                        });                                
                        return busLines; 
                    } else {
                        // 如果没有找到有效的pois数据,返回空数组
                        return [];
                    }
                }

再将列表的数据传入给线路查询,并绘制出来

busLines.forEach(function(busLineName) {
                            if(!linesearch){
                                linesearch = new AMap.LineSearch({
                                    city: "北京",
                                    pageSize: 1,
                                    extensions: 'all'
                                });
                            }
                            
                            linesearch.search(busLineName, function(status, result) {
                                if (status === 'complete' && result.info === 'OK') {
                                    lineSearch_Callback(result);
                                } else {
                                    alert('线路 ' + busLineName + ' 查询失败: ' + result);
                                }
                            });
                        });
                    } else {
                        document.getElementById('tip').innerHTML = JSON.stringify(result);
                    }
                });
            });
        function lineSearch_Callback(data) {
            var lineArr = data.lineInfo;
            var lineNum = lineArr.length;
            if (lineNum == 0) {
                alert('没有查询到相关线路');
            } else {
                for (var i = 0; i < lineNum; i++) {
                    var pathArr = lineArr[i].path;
                    var stops = lineArr[i].via_stops;
                    var startPot = stops[0].location;
                    var endPot = stops[stops.length - 1].location;
                    drawbusLine(startPot, endPot, pathArr);
                }
            }
        }
        
        function drawbusLine(startPot, endPot, BusArr) {
            new AMap.Marker({
                map: map,
                position: startPot,
                icon: "https://webapi.amap.com/theme/v1.3/markers/n/start.png",
                zIndex: 10,
                anchor: 'bottom-center',
            });
            new AMap.Marker({
                map: map,
                position: endPot,
                icon: "https://webapi.amap.com/theme/v1.3/markers/n/end.png",
                zIndex: 10,
                anchor: 'bottom-center',
            });
            var busPolyline = new AMap.Polyline({
                map: map,
                path: BusArr,
                strokeColor: "#09f",
                strokeOpacity: 0.8,
                isOutline: true,
                outlineColor: 'white',
                strokeWeight: 6
            });
            map.setFitView(busPolyline, false, [60,200,60,60],11);
        }

成果初步展示 屏幕截图 2024-09-14 185601.png 这里为了展示更加可观,还需要给不同线路设置不同颜色以便区分

	.line-info {
            overflow: auto;
            max-height: none;
            height: auto;
        }
        
        #infoPanel {
            position: absolute;
            top: 10px;
            left: 10px;
            z-index: 100;
            background-color: white;
            padding: 10px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
         .legend-item {
            display: flex;
            align-items: center;
            margin-bottom: 5px;
        }
        .legend-color {
            width: 20px;
            height: 20px;
            margin-right: 10px;
        }
        }
	<div id="container">
        <div id="infoPanel">
            <h4>线路信息</h4>
            <div id="lineName" class="line-info"></div>
        </div>
function generateRandomColor() {
    var hue = Math.floor(Math.random() * 360); // 生成0-359之间的随机数作为色调
    var saturation = 80; // 提高饱和度到80%
    var lightness = 50; // 设置亮度为50%,避免太暗或太亮
    var color = 'hsl(' + hue + ', ' + saturation + '%, ' + lightness + '%)';
    return color;
}
function drawbusLine(startPot, endPot, BusArr, color) {
   //省略代码
    var busPolyline = new AMap.Polyline({
        map: map,
        path: BusArr,
        strokeColor: color, // 使用传入的颜色
        strokeOpacity: 0.7,
        isOutline: true,
        outlineColor: 'white',
        strokeWeight: 6
    });
    map.setFitView(busPolyline, false, [60,200,60,60],11);
}

// 修改lineSearch_Callback函数,以生成随机颜色
function lineSearch_Callback(data) {
   //省略代码
    if (lineNum == 0) {
        alert('没有查询到相关线路');
    } else {
        for (var i = 0; i < lineNum; i++) {
           //省略代码
            var color = generateRandomColor(); // 生成随机颜色
            drawbusLine(startPot, endPot, pathArr, color); // 传递颜色
            var lineName = lineArr[i].name; 
            var legendColor = '<div class="legend-color" style="background-color:' + color + ';"></div>';
            setTimeout(function(ln) {
                    document.getElementById('lineName').innerHTML += ln + '<br>' + legendColor;
            }, 1000 * i, lineName);
        }              
    }  
}

最后成果展示(这里运用上了官方地图样式远山黛) image.png

总结

这里的可视化公交线路还是有许多不足之处的,比如当线路太多的话随机生成的颜色会过于接近和无法区分,需要进一步考虑展示的相关交互设计。当然,本篇文章最主要通过案例分享一下使用高德地图开发的经验和体会,希望能对大家有所帮助。

标签:function,map,为例,color,JS,result,公交站点,var
From: https://blog.51cto.com/u_16507376/12067128

相关文章

  • jsp大学生四六级在线测试平台u7026
    jsp大学生四六级在线测试平台本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着全球化和信息化的发展,英语已成为国际交流的重要工具。对于大学生而言,四六级考试不仅是衡量其......
  • jsp大学生素质拓展学分系统t474y
    jsp大学生素质拓展学分系统t474本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能学生,教师,活动申请,活动展示,学分排行,学分明细开题报告内容一、项目背景与意义在当今高等教育体系中,大学生素质拓......
  • jsp大学生收书系统j7k68
    jsp大学生收书系统j7k68本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能学生,收书站点,书籍分类,书籍信息,上门取书,二手书籍,捐赠中心,图书捐赠技术要求:   开发语言:JSP前端使用:HTML5,CSS,JSP......
  • js数组合并与对象合并的方法汇总
    ......
  • 基于nodejs+vue洗衣店管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快,人们对于便捷、高效的服务需求日益增长,洗衣服务作为日常生活中不可或缺的一部分,其管理方式的现代化与智能化显得尤为重要。传统洗衣......
  • 基于nodejs+vue洗衣店管理信息系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快,人们对于便捷、高效的生活服务需求日益增长,洗衣店作为日常生活中不可或缺的服务行业之一,其运营模式和管理效率直接影响着顾客体验与......
  • 基于nodejs+vue物物交换系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在数字化时代,随着电子商务的蓬勃发展,传统的货币交易模式已深入人心。然而,在追求可持续发展与资源循环利用的当下,物物交换作为一种古老而又新颖的经济形式,正......
  • 基于nodejs+vue物业管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着城市化进程的加速,物业管理作为现代社区治理的重要组成部分,其复杂性和重要性日益凸显。传统的人工管理模式已难以满足日益增长的管理需求,如业主信息维护......
  • 基于nodejs+vue物业管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着城市化进程的加速和房地产行业的蓬勃发展,物业管理作为现代社区管理的重要组成部分,其复杂性和重要性日益凸显。传统的手工管理模式已难以满足当前物业管......
  • 基于nodejs+vue物业管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着城市化进程的加速,住宅小区作为城市生活的基本单元,其管理效率和服务质量直接影响到居民的生活品质。传统物业管理模式依赖于人工操作,存在信息流通不畅、......