1 概述

公司移动门户原来是基于AngularJS指令封装的百度地图组件,用于签到、签退、定位等功能,在使用过程中发现百度地图频繁的弹出广告,所以打算重新引用其它地图组件,最后决定基于AngularJS指令来封装高德地图组件,本文主要与大家分享我的学习思路及开发具体过程。

注意:本文假定读者基本掌握html、css、js以及angularjs,了解百度、高德或者腾讯地图JS API的基本概念。

2 开发思路

由于之前没有开发过地图组件,所以在开发之前需要做好学习计划,预想下开发组件时可能会遇到的技术点与难题,之后有针对性的进行学习。首先学习高德地图api,把简单的基本功能实现出来,再做一个带按钮的,保证在本地可以运行,然后学习angularjs的指令,参考公司基于百度地图样例定位指令,基于angularjs封装高德地图组件,先基本显示出地图及标注,最后学习$watch监听功能的用法,当地图坐标发生改变,使用angularjs里$watch监听属性,在地图对经度、维度进行动态标记。下面是被分解后的学习步骤供大家参考。

3 具体步骤

3.1 高德地图JavaScriptAPI学习

1 运行下面的链接进入高德地图网站

http://id.amap.com/?ref=http%3A%2F%2Flbs.amap.com%2Fdev%2Fkey#/account/info

2 注册一个帐号,并创建一个key,如下图选择一个web端

3 点击下面的链接开始高德地图的入门学习

http://lbs.amap.com/api/javascript-api/example/map/asynchronous-loading-map/

从左侧菜单目录看出可以由深至浅的学习,中间有代码编辑区,右边可以直接看到结果,非常方便

3.2 在本地html页面显示地图样例

1 本地创建html文件,与相关的css文件,将下面的代码考贝到该文件内

创建css文件,下面是css代码

html, body {

margin: 0;

height: 100%;

width: 100%;

position: absolute;

}

#container {

position: absolute;

top: 0;

left: 0;

right: 0;

bottom: 0;

width: 100%;

height: 100%;

}

.button-group {

position: absolute;

bottom: 20px;

right: 20px;

font-size: 12px;

padding: 10px;

}

.button-group .button {

height: 28px;

line-height: 28px;

background-color: #0D9BF2;

color: #FFF;

border: 0;

outline: none;

padding-left: 5px;

padding-right: 5px;

border-radius: 3px;

margin-bottom: 4px;

cursor: pointer;

}

.button-group .inputtext {

height: 26px;

line-height: 26px;

border: 1px;

outline: none;

padding-left: 5px;

padding-right: 5px;

border-radius: 3px;

margin-bottom: 4px;

cursor: pointer;

}

#tip {

background-color: #fff;

padding-left: 10px;

padding-right: 10px;

position: absolute;

font-size: 12px;

right: 10px;

top: 20px;

border-radius: 3px;

border: 1px solid #ccc;

line-height: 30px;

}

.amap-info-content {

font-size: 12px;

}

#myPageTop {

position: absolute;

top: 5px;

right: 10px;

background: #fff none repeat scroll 0 0;

border: 1px solid #ccc;

margin: 10px auto;

padding:6px;

font-family: "Microsoft Yahei", "微软雅黑", "Pinghei";

font-size: 14px;

}

#myPageTop label {

margin: 0 20px 0 0;

color: #666666;

font-weight: normal;

}

#myPageTop input {

width: 170px;

}

#myPageTop .column2{

padding-left: 25px;

}

#container {

height: 50%;

position: initial;

}

创建html文件,将下面的代码拷贝到html文件中

注意:key的值填写你自己的

<link rel="stylesheet"      href="../org/css/gaodeMap.css" />

<script        src="http://webapi.amap.com/maps?v=1.3&key=837a9bdb426d81b6862135983d1d715c"></script>

<div id="container"></div>

<div style="height:100px; text-align: center; margin: 50px;">

</div>

<script type="text/javascript">

var map = new AMap.Map("container", {

resizeEnable : true,

zoom : 17

});

var cpoint=map.getCenter( );

var marker = new AMap.Marker({

map : map,

draggable: true,  //是否可拖动

bubble : true

})

</script>

下面是这两个文件的路径关系,为同级关系

2 双击gaodeMap.html文件,查看执行结果

3.3 为页面添加按钮设置地图标记

修改html文件的代码,将下面的代码拷贝到你的html文件中

<link rel="stylesheet"       href="../org/css/gaodeMap.css" />

<script src="http://webapi.amap.com/maps?v=1.3&key=837a9bdb426d81b6862135983d1d715c"></script>

<div id="container"></div>

<div style="height:100px; text-align: center; margin: 50px;">

<div id="tip"></div>

<input type="button"   onclick="setMarkerA()" value="设置markerA">

<input type="button"   onclick="setMarkerB()" value="设置markerB">

</div>

<script type="text/javascript">

var map = new AMap.Map("container", {

resizeEnable : true,

zoom : 17

});

var cpoint=map.getCenter( );

var marker = new AMap.Marker({

map : map,

draggable: true,  //是否可拖动

bubble : true

})

setMarkerA=function(){

var mapOptions={"lng":123.427476,"lat":41.797287};

map.setCenter([mapOptions.lng ,mapOptions.lat]);

marker.setPosition([mapOptions.lng ,mapOptions.lat]);

}

setMarkerB=function(){

var mapOptions={"lng":123.42405344705162,"lat":41.798870569210926};

map.setCenter([mapOptions.lng ,mapOptions.lat]);

marker.setPosition([mapOptions.lng ,mapOptions.lat]);

}

</script>

最终效果如下

3.4 学习AngularJS指令用法

1 在AngularJS菜鸟教程中学习关于directive的相关知识

点击下面的链接进入学习页面

http://www.runoob.com/try/try.php?filename=try_ng_directive_comment

 

2 了解AngularJS菜鸟教程中的directive的相关知识后上搜索引擎学习directive的相关知识,进一步了解directive的用法

3 可以参考下面代码,配合搜索引擎学习继续了解directive中的相关属性的知识:restrict,replace,template,link

.directive("appMap", function () {

return {

restrict: "E",

replace: true,

template: "<div id='allMap'></div>",

scope:{

'options': '='

},

link: function ($scope, element, attrs) {

var map = new BMap.Map("allMap");

$scope.$watch("options", function (newValue, oldValue) {

var allOverlay = map.getOverlays();

if (allOverlay && allOverlay.length > 0){

for (var i=0;i < allOverlay.length;i++){

map.removeOverlay(allOverlay[i]);

}

}

if ($scope.options && $scope.options.longitude && $scope.options.latitude){

var longitude = $scope.options.longitude;

var latitude = $scope.options.latitude;

var point = new BMap.Point(longitude,latitude);

map.centerAndZoom(point,17);

var mk = new BMap.Marker(point);

var label = new BMap.Label("我在这里",{offset:new BMap.Size(20,-10)});

label.setStyle({

"color":"green",

"fontSize":"14px",

"border":"1",

"textAlign":"center"

});

mk.setLabel(label);

map.addOverlay(mk);

};

},true);

}

};

})

3.5 封装AngularJS指令显示地图

参考公司网站的定义功能,用angularjs的方式将一个简单的地图显示出来,可以先不考虑$watch的用法

1.查看公司定位的方法在什么地方

2.创建一个html文件,将下面的代码考入,注意这里导入的css文件,与angular.min.js文件

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

<link rel="stylesheet"

href="../css/gaodeMap.css" />

<script src="http://webapi.amap.com/maps?v=1.3&key=837a9bdb426d81b6862135983d1d715c"></script>

<script src="../js/angular.min.js"></script>

</head>

<body>

<div ng-app="hd" ng-controller="ctrlA">

<gaode-map options="mapOptions" style="height:400px"></gaode-map>

</div>

<script>

var m = angular.module('hd', []);

m.directive('gaodeMap', [function () {

return {

restrict: 'E',

replace:true,

template: '<div id="container"></div>',

scope: {

options:'='

},

link: function ($scope, elem, attr) {

var map = new AMap.Map("container", {

resizeEnable : true,

zoom : 17

});

var marker = new AMap.Marker({

map : map,

bubble : true ,

content: '<div class="marker-route marker-marker-bus-from"></div>'  //自定义点标记覆盖物内容,

})

marker.setLabel({

offset: new AMap.Pixel(20, 0),

content: "我在这里"

});

$scope.$watch("options", function (newValue, oldValue) {

if ($scope.options && $scope.options.lng && $scope.options.lat){

map.setCenter([$scope.options.lng ,$scope.options.lat]);

marker.setPosition([$scope.options.lng ,$scope.options.lat]);

}

},true);

}

}

}]);

m.controller("ctrlA",function($scope){

});

</script>

</body>

</html>

3.导入相应的css文件与AngularJS文件

下面是css文件的代码

html, body {

margin: 0;

height: 100%;

width: 100%;

position: absolute;

}

#container {

position: absolute;

top: 0;

left: 0;

right: 0;

bottom: 0;

width: 100%;

height: 100%;

}

.button-group {

position: absolute;

bottom: 20px;

right: 20px;

font-size: 12px;

padding: 10px;

}

.button-group .button {

height: 28px;

line-height: 28px;

background-color: #0D9BF2;

color: #FFF;

border: 0;

outline: none;

padding-left: 5px;

padding-right: 5px;

border-radius: 3px;

margin-bottom: 4px;

cursor: pointer;

}

.button-group .inputtext {

height: 26px;

line-height: 26px;

border: 1px;

outline: none;

padding-left: 5px;

padding-right: 5px;

border-radius: 3px;

margin-bottom: 4px;

cursor: pointer;

}

#tip {

background-color: #fff;

padding-left: 10px;

padding-right: 10px;

position: absolute;

font-size: 12px;

right: 10px;

top: 20px;

border-radius: 3px;

border: 1px solid #ccc;

line-height: 30px;

}

.amap-info-content {

font-size: 12px;

}

#myPageTop {

position: absolute;

top: 5px;

right: 10px;

background: #fff none repeat scroll 0 0;

border: 1px solid #ccc;

margin: 10px auto;

padding:6px;

font-family: "Microsoft Yahei", "微软雅黑", "Pinghei";

font-size: 14px;

}

#myPageTop label {

margin: 0 20px 0 0;

color: #666666;

font-weight: normal;

}

#myPageTop input {

width: 170px;

}

#myPageTop .column2{

padding-left: 25px;

}

#container {

height: 1000px;

position: initial;

}

.amap-marker-label {

border: 0px;

color: #0bc00f;

background: rgba(255, 255, 255, 0);

}

.amap-marker .marker-route {

position: absolute;

width: 40px;

height: 44px;

color: #e90000;

background: url(http://webapi.amap.com/theme/v1.3/images/newpc/poi-1.png) no-repeat;

cursor: pointer;

}

.amap-marker .marker-marker-bus-from {

background-position: -334px -18px;

}

4.下面是导入的angularjs的库文件,拷贝出去放到自己的电脑里,放入相应目录

5.下面是我的路径供参考

6.用浏览器打开该文件查看,f12打开控制台切换到手机模式查看预览效果

3.6 扩展$watch监听动态显示位置

学习$watch的用法,监听坐标数据变化状态,添加一个按钮为地图设置marker标记,完善上面功能。

1.上网学习关于$watch的相关用法

2.继续参考公司的方法,完善上面的功能,为上面的功能添加按钮为地图设置坐标下面为修改后的代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

<link rel="stylesheet"

href="../css/gaodeMap.css" />

<script src="http://webapi.amap.com/maps?v=1.3&key=837a9bdb426d81b6862135983d1d715c"></script>

<script src="../js/angular.min.js"></script>

<script src="../js/jsjquery1.7.1.js"></script>

</head>

<body>

<div ng-app="hd" ng-controller="ctrlA">

<gaode-map options="mapOptions" style="height:400px"></gaode-map>

<input type="button"  ng-click="setMarkerA()" value="设置markerA">

<input type="button"  ng-click="setMarkerB()" value="设置markerB">

</div>

<script>

var m = angular.module('hd', []);

m.directive('gaodeMap', [function () {

return {

restrict: 'E',

replace:true,

template: '<div id="container"></div>',

scope: {

options:'='

},

link: function ($scope, elem, attr) {

var map = new AMap.Map("container", {

resizeEnable : true,

zoom : 17

});

var marker = new AMap.Marker({

map : map,

bubble : true ,

content: '<div class="marker-route marker-marker-bus-from"></div>'  //自定义点标记覆盖物内容,

})

marker.setLabel({

offset: new AMap.Pixel(20, 0),

content: "我在这里"

});

$scope.$watch("options", function (newValue, oldValue) {

if ($scope.options && $scope.options.lng && $scope.options.lat){

map.setCenter([$scope.options.lng ,$scope.options.lat]);

marker.setPosition([$scope.options.lng ,$scope.options.lat]);

}

},true);

}

}

}]);

m.controller("ctrlA",function($scope){

$scope.mapOptions={"lng":123.42678393582929,"lat":41.79739087943974};              $scope.setMarkerA=function(){

$scope.mapOptions={"lng":123.43223420561884,"lat":41.7987619126648};

}

$scope.setMarkerB=function(){

$scope.mapOptions={"lng":123.42405344705162,"lat":41.798870569210926};

}

});

</script>

</body>

</html>

3.下面为浏览器中执行后的效果

4 个人总结

学习任何新东西,甚至做任何事情之前,首先要明确目标,然后制定计划、分解计划、明确重点、攻克难点。计划要先总后分,先全局再局部,对粗分过的步骤再细分,把不明白的知识点重点标注,尽可能细化的分解,让过程可操作、易落地。

在学习研究过程中要做好笔记,把相关学习资料、参考文件存放在一个目录,过程文件需要备份。

遇到不能解决的难点一定要努力尝试思考过以后,再去询问,在询问之前要明确自己的问题、要能阐述清楚自己的问题,有时候明确问题怎么阐述之后,还没有去咨询别人,可能问题就自己解决了。只有思考过的东西、有了实践、有了交付物、有了笔记、能够简单明了阐述清楚,才能算是真正认知。

5 附件说明

下列附件为学习过程中整理的4个样例文件,由浅入深,逼近最终目标。4个文件都一样,解压至本地,浏览器运行gaodeMap.html文件即可

5.1 附件1,基础演示高德地图

附件说明:解压至本地,浏览器运行gaodeMap.html文件即可

运行效果:

5.2 附件2,支持标注动态设置

5.3 附件3,AngularJS指令封装地图

5.4 附件4,扩展监听指令动态显示位置

运行效果:

文档及附件下载地址:http://pan.baidu.com/s/1mi7F8yG

AngularJS指令封装高德地图组件的更多相关文章

  1. 基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中。

    react-amap 这是一个基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中. 文档实例预览: Github Web | Gitee Web 特性 ️ 自动加载高德地 ...

  2. 百度上传插件WebUploader,angularjs指令封装

    1.WebUploader特点 官网地址:http://fex.baidu.com/webuploader/ 1.1 分片.并发 分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上 ...

  3. VUE 高德地图选取地址组件开发

    高德地图文档地址 http://lbs.amap.com/api/lightmap/guide/picker/ 结合步骤: 1.通过iframe内嵌引入高德地图组件 key就选你自己申请的key &l ...

  4. 【教程】高德地图使用ECharts实现数据可视化

    关于百度地图结合ECharts实现数据可视化的资料已经很多了,毕竟是官方提供支持的,这里就不再赘述.今天我们来讲一下让高德地图与ECharts结合来实现数据可视化图表的展示. 一.ECharts 高德 ...

  5. VUE 2.0 引入高德地图,自行封装组件

    1. 高德地图官网 申请帐号, 申请相应(JavaScript API)的 Key 2. 在项目中引入, 这里和其他的引入不同的是 直接在 index.html, 不是在 main.js 引入, 博主 ...

  6. Vue组件篇——Vue3.0中使用高德地图

    VUE-CLI 3.0 中配置高德地图 在项目开发中,地图组件 1.首先,需要注册高德开放平台的账号,并在[应用管理]页面[创建新应用],为应用添加Key值 高德开放平台:https://lbs.am ...

  7. 【高德地图API】一句话搞定webmap(一)——轻地图组件

    原文:[高德地图API]一句话搞定webmap(一)——轻地图组件 摘要: 遥想当年,在APP中加入LBS元素相当困难:要刻苦学习java,要刻苦学习iOS开发,要刻苦学习javascript…… 而 ...

  8. angularJS之使用指令封装DOM操作

    angularJS之使用指令封装DOM操作 创建指令 指令也是一种服务,只是这种服务的定义有几个特殊要求: 必须使用模块的directive()方法注册服务 必须以对象工厂/factory()方法定义 ...

  9. vue-amap | 基于 Vue 2.x 与高德的地图组件

    vue-amap | 基于 Vue 2.x 与高德的地图组件 参考:https://elemefe.github.io/vue-amap/#/

随机推荐

  1. https传输过程嗅探

    C1->浏览器告知服务器自身的信息 length = 165 a5 16 03 01 00 A0 01 00 00 9C 03 03 5E 1C 37 CD 40 [ ^ 7 @] B6 4A ...

  2. Chrome firefox ie等浏览器空格(&nbsp;)兼容问题

    使用(&nbsp:)空格浏览器之间,显示的不一样,对不起等现象. 解决方案: 用半角空格&ensp:或者全角空格&emsp:就可以了,&ensp:相当于半格中文字符的宽 ...

  3. 初识jvm堆,栈参数

    堆的分配参数: -Xmx //设立最大堆 -Xms //最小堆,初始化堆大小 -Xmn  //设置新生代(eden+2*surviivor+old)大小   官方推荐:3/8Xmx------> ...

  4. syslog系统日志、事件日志分析、EventLog Analyzer

    syslog系统日志.事件日志分析.EventLog Analyzer Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机.服务器.网络设备.数据库以及 ...

  5. lower_case_table_names

    http://blog.csdn.net/jesseyoung/article/details/40617031 1 简介    在MySQL中,数据库对应数据目录中的目录.数据库中的每个表至少对应数 ...

  6. 扩展方法(深入理解c#)

    1. 静态类到扩展方法: 许多方法可能都适合转为扩展方法,只要具有以下特征: 1)你想为一个类型添加一些成员: 2)你不需要为类型的实例添加更多的数据: 3)你不能改变类型本身,因为是别人的代码 2. ...

  7. FASTDFS 安装与开发

    FASTDFS介绍 FastDFS开源地址:https://github.com/happyfish100 简介 FastDFS 是一个开源的高性能分布式文件系统(DFS). 它的主要功能包括:文件存 ...

  8. python中的分号

    很多编程语言是以分号作为一行代码的的结束标志,但是在Python中不是这样的,而是靠缩进来识别程序结构. Python中一行代码以分号结束,并不是必须的,准确来说是不被推荐的,因为加上分号就是画蛇添足 ...

  9. Vue上传文件:ElementUI中的upload实现

    一.上传文件实现 两种实现方式: 1.直接action <el-upload  .利用before-upload属性 此种方式有个弊端,就是action是必选的参数,那么action如果和pos ...

  10. linux下运算的几种方法

    1.expr 1.1 最简单的用法 yan@yan:~$ \* yan@yan:~$ 1.2 bash脚本对于expr yan@yan:~$ cat expr1.sh #!/bin/bash PATH ...