Angularjs+node+Mysql实现地图上的多点标注
注:本文适合对于node有一定基础的人,如果您是小白,请先用1个小时学习node。node文档https://nodejs.org/en/docs/
该片博文的源码地址:https://github.com/zhangxy1035/Gould
一、项目介绍
近几年,在大数据的驱动下,数据可视化变的越来越重要,其中现在比较火的就是地理位置可视化,在这篇文章中,将使用node作为服务器,angularjs作为前台显示,mysql作为数据库,实现地图上的多点标注。系统架构建设简单,可复用性高。
在这里node的性能就不给大家赘述,项目中的地图接口使用的是高德地图,首先需要成为高德的开发者具体网址为http://lbs.amap.com/,其中需要申请开发者的key,只有将这个可以添加到自己的网页中才能做接下来的操作,首先咱们先来看一下,最终的效果图是如何的。
二、项目展示

由于图中的点较多,所以选择放在了数据库中,当然读者也可以不通过架设数据库,将自己的数据放入缓存中进行加载显示。
按照正常习惯,我们首先来用node搭建后台,需要用到这几个模快,使用npm 命令行加载这些模块,body-parser, express,log4js,mysql(数据库模块)
三、项目搭建
该项目所用的编写工具是webStorm,项目结构入下图:

其中node_modules中包含着npm所加载的模块,service主要是用node所写的后台服务,web中包含的是前台的网页html,css,js等
首先来说一下数据库中的数据方便大家理解,在我的数据库中new_1这张表,只有3个字段。其中存储的字段是site_id,lng,lat。site_id表示的是点的信息,lng和lat表示的是经度和纬度。
starts.js代码如下,在该项目中,node start,该服务才会被启动
var express = require('express');
var app = express();
var path = require('path');
var bodyParser = require('body-parser');
var position = require('./position');
app.set('port', process.env.PORT || 9909);
app.use(bodyParser.urlencoded({ extended: false })) ;
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, '../web')));
app.use(express.static(path.join(__dirname, '../app')));
app.post('/getAllMarker',position.getAllMarker);
app.listen(app.get('port'),function(){
console.log('成功开启node,端口号:'+app.get('port'));
});
process.on('uncaughtException', function (err) {
console.log(err);
});
接下来介绍与数据库交互的文件position,在该文件中使用了mysql的包,具体操作复杂业务可参考:https://github.com/mysqljs/mysql
var sql = require('mysql');
var connection = sql.createConnection({
host:'localhost',
user:'root',
password:'zhang123',
database:'test'
});
connection.connect();
/**
* 获取所有标记点
* @param req
* @param res
*/
exports.getAllMarker = function(req,res) {
console.log('获取所有标记点服务器端');
console.log(req.body);
var con = connection.query("select * from new_1",function(err,result,fields){
if(err){
throw err;
}
console.log("rows",result[0].site_id);
var new_1 = [];
result.forEach(function (item) {
var new_1item = {
site_id: item.site_id,
lng: item.lng,
lat: item.lat
};
new_1.push(new_1item);
});
console.log("rowsss",new_1);
res.send({retCode:1,data:new_1});
})
};
现在开始介绍前台,前台页面,在这个页面中需要输入开发者从高德地图上获取到的key值。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<style type="text/css">
body,html,#container{
height: 100%;
margin: 0px
}
</style>
<title>打点</title> </head>
<body>
<!--<div id="container" tabindex="0" style=" width: 600px; height:400px">-->
<div id="container" tabindex="0">
</div>
<div class="controllerTopDiv" ng-app="PCMapInput" ng-controller="new1Ctrl">
</div>
<script src="lib/angualrjs.min.js"></script>
<script type="text/javascript" src="http://webapi.amap.com/maps?你的key"></script>
<script type="text/javascript" src="js/webController.js"></script>
<script type="text/javascript" src="js/webService.js"></script>
</body>
</html>
以及前台的所需要的js文件:controller.js
angular.module('PCMapInput',['PCFactory'])
.constant("CONFIG",{
host: "http://192.168.1.103:9909",//本机测试地址(可变)
version:'1.0.0'//版本
})
.controller('new1Ctrl',function($scope,Position) {
var map = new AMap.Map('container',{
resizeEnable: true,
zoom: 10,
center: [121.48,31.22]
});
AMap.plugin('AMap.ToolBar',function(){
var toolbar = new AMap.ToolBar();
map.addControl(toolbar)
})
Position.getAllMarker({},function(data){
var infoWindow = new AMap.InfoWindow({offset:new AMap.Pixel(0,-30)});
for(var i=0;i<data.data.length;i++ ){
var site_id = data.data[i].site_id;
var lng = data.data[i].lng;
var lat = data.data[i].lat;
var marker = new AMap.Marker({
position: [data.data[i].lng, data.data[i].lat],
map:map
});
marker.content='网点'+(site_id);
marker.on('click',markerClick);
marker.emit('click',{target:marker});
}
function markerClick(e){
infoWindow.setContent(e.target.content);
infoWindow.open(map, e.target.getPosition());
}
map.setFitView();
});
});
controller的服务;
angular.module('PCFactory',[])
.factory('Position',function($http,CONFIG){
var getAllMarker = function (query,success) {
$http.post(CONFIG.host + '/getAllMarker',query)
.success(function(data){
success(data);
});
};
return {
getAllMarker : getAllMarker
};
});
项目中所需要的lib文件亦在github上,包括angualrjs.min.js,angualrjs.min.css,bootstrap_4.0.0.css等。
四、运行项目
进入该项目中的service文件下,使用命令行node start,项目启动成功如图

然后访问网页,在此之前你需要ipconfig下,你的ip地址是多少,需要在controller文件中进行修改,修改一致后,访问网页。为ip:9909/test.html
至此,该项目完成,在该项目中,根据高德开发api我还增加了一些鼠标响应事件,大家快快去体验下吧。
Angularjs+node+Mysql实现地图上的多点标注的更多相关文章
- Angularjs+node+Mysql实现地图上特定点的定位以及附加信息展示
注:本博文为博主原创,转载请注明出处. 在上一篇博文中主要讲述了如何利用AngularJs+Node+MySql构建项目,并实现地图上的多点标注,今天在这篇文章中,我们将在上一个项目的基础上,实现特定 ...
- 【百度地图API】建立全国银行位置查询系统(三)——如何在地图上添加银行标注
原文:[百度地图API]建立全国银行位置查询系统(三)--如何在地图上添加银行标注 <摘要>你将在第三章中学会以下知识: 如何在地图上添加带银行logo的标注?(你也可以换成商场logo, ...
- 基于 Angularjs&Node.js 云编辑器架构设计及开发实践
基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...
- 如何在iOS地图上高效的显示大量数据
2016-01-13 / 23:02:13 刚才在微信上看到这篇由cocoachina翻译小组成员翻译的文章,觉得还是挺值得参考的,因此转载至此,原文请移步:http://robots.thought ...
- 百度地图API 添加自定义标注 多点标注
原文:百度地图API 添加自定义标注 多点标注 分四个文件 location.php map.css 图片 数据库 数据库配置自己改下 -------------------------------- ...
- AngularJS + Node.js + MongoDB开发
AngularJS + Node.js + MongoDB开发的基于位置的通讯录(by vczero) 一.闲扯 有一天班长说了,同学们希望我开发一个可以共享位置的通讯录,于是自己简单设计了下功能.包 ...
- [ios3-地图] 如何在iOS地图上高效的显示大量数据 [转]
[转至:http://blog.csdn.net/pjk1129/article/details/17358337] 原文:How To Efficiently Display Large Amoun ...
- node+mysql,实现基本的增删改查,附带跟踪记录和运行时间记录
Node + mysql 实现基础的增删改查,以及性能测试. 网上有很多这样的例子,我也是找来学习的. 感觉node对mysql的操作非常简单,也很实用,比如自带防止sql注入的功能,一开始还担心注入 ...
- node与mysql的相互使用————node+mysql
node与mysql的相互使用----node+mysql 为什么选node???因为我是个前端. 为什么选mysql???因为成熟,稳定,听说容易学. 一.mysql数据库: mysql下载和使用我 ...
随机推荐
- C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现
”摇一摇周边“是微信提供的一种新的基于位置的连接方式.用户通过“摇一摇”的“周边”页卡,可以与线下商户进行互动,获得商户提供的个性化的服务.微信4月份有一个赠送摇一摇设备的活动,我们有幸获得赠送资格, ...
- 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件
[源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...
- 同步辅助类CountDownLatch用法
CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则使当前线程处于等待状态,调用countDow ...
- 【centos7】添加开机启动服务/脚本
一.添加开机自启服务 在centos7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例): systemctl enable jenkins.service #设置jenkins服务为 ...
- React Native windows搭建记录
因为是window电脑上运行的,所以测试的是安卓 1: 安装jdk:jdk-8u45-windows-x64.exe 2: 配置JAVA的环境变量 在安卓的配置基础上添加一个变量ANDROID_HOM ...
- 【转】漫谈iOS程序的证书和签名机制
转自:漫谈iOS程序的证书和签名机制 接触iOS开发半年,曾经也被这个主题坑的摸不着头脑,也在淘宝上买过企业证书签名这些服务,有大神都做了一个全自动的发布打包(不过此大神现在不卖企业证书了),甚是羡慕 ...
- IT菜鸟的生存指南(三)流行还是经典
经常被刚入行的新人请教,想学一门开发语言,最好又简单工资又高又有发展前途.那门语言最好这个话题能在程序员群里吵一下午,所以我也就不掀起战争了. 个人建议如下: 工资高不高不在于学那门语言,而在于你的行 ...
- 改变Activity启动时的默认动画
why 在开发中我们可能需要改变这一行为,一般基于2种理由: 产品的spec这么要求的: 想自己控制这个行为,因为在Android设备上可能每个的这一默认行为都不一样,厂商可以很容易修改它,从而导致a ...
- [C#6] 1-using static
0. 目录 C#6 新增特性目录 1. 老版本的代码 1 using System; 2 3 namespace csharp6 4 { 5 internal class Program 6 { 7 ...
- Dapper.NET——轻量ORM
Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...