raphael.js绘制中国地图 地图绘制方法


Posted in Javascript onFebruary 12, 2014

最近的数据统计项目中要用到中国地图,也就是在地图上动态的显示某个时间段某个省份地区的统计数据,我们不需要flash,仅仅依靠raphael.js以及SVG图像就可以完成地图的交互操作。在本文中,我给大家分享如何使用js来完成地图交互。

raphael.js绘制中国地图 地图绘制方法

先简单介绍下raphael.js,raphael.js是一个很小的javascript库,它可以在网页中实现绘制各种矢量图、各类图表、以及图像裁剪、旋转、运动动画等等功能。此外raphael.js还跨浏览器兼容,而且还兼容老掉牙的IE6啊。raphael.js的官网地址: http://raphaeljs.com/

准备工作

我们需要准备一张矢量地图,可以从网上找一张矢量地图,或者使用illustrator绘制一份矢量地图,然后导出为SVG格式的文件,这个文件可以在浏览器上打开,然后提取里面的path路径信息(M开头的坐标)。并将path路径信息,按照chinamapPath.js的格式准备好地图路径信息。

var china = []; function paintMap(R) { 
    var attr = { 
        "fill": "#97d6f5", 
        "stroke": "#eee", 
        "stroke-width": 1, 
        "stroke-linejoin": "round" 
    }; 
    china.aomen = { 
        name: "澳门", 
        path: R.path("M413.032,.........省略若干......... ,414.183z").attr(attr) 
    } 
    china.hk = { 
        //格式同上 
    }; 
}

以上是我们将准备好的地图路径信息封装到()函数中,并保存文件名为chinamapPath.js,供后面调用。

HTML

首先在head部分载入raphael.js库文件和chinamapPath.js路径信息文件。

 

<script type="text/javascript" src="raphael.js"></script> 
<script type="text/javascript" src="chinamapPath.js"></script>

然后在body中需要放置地图的位置放置div#map。
 

<div id="map"></div>

JAVASCRIPT

首先我们在页面中调用地图,方法如下:

window.onload = function () { 
    //绘制地图 
    var R = Raphael("map", 600, 500);//将地图载入到id为map的div中,并设置区域为600x500px大小。 
    paintMap(R); 
}

这个时候我们用浏览器打开会显示载入后的地图。接下来我们要给地图中的对应的省份区域加上省份名称,以及鼠标滑向每个省份区块时的变色动画效果。

window.onload = function () { 
    var R = Raphael("map", 600, 500); 
    //调用绘制地图方法 
    paintMap(R);     var textAttr = { 
        "fill": "#000", 
        "font-size": "12px", 
        "cursor": "pointer" 
    }; 
            
    for (var state in china) { 
        china[state]['path'].color = Raphael.getColor(0.9); 
        (function (st, state) { 
            //获取当前图形的中心坐标 
            var xx = st.getBBox().x + (st.getBBox().width / 2); 
            var yy = st.getBBox().y + (st.getBBox().height / 2); 
            //写入文字 
            china[state]['text'] = R.text(xx, yy, china[state]['name']).attr(textAttr); 
            st[0].onmouseover = function () {//鼠标滑向 
                st.animate({fill: st.color, stroke: "#eee"}, 500); 
                china[state]['text'].toFront(); 
                R.safari(); 
            }; 
            st[0].onmouseout = function () {//鼠标离开 
                st.animate({fill: "#97d6f5", stroke: "#eee"}, 500); 
                china[state]['text'].toFront(); 
                R.safari(); 
            }; 
         })(china[state]['path'], state); 
    } 
}

以上代码中运用了raphael提供的方法有:getColor,getBBox,animate,toFront等等,这些可以在raphael文档中找到使用说明,本文不在讲述。
此外由于地图尺寸原因,有些省份名称在地图中的显示位置不恰当,需要修正偏移量,这样看起来舒服点。

window.onload = function () { 
    var R = Raphael("map", 600, 500); 
    ... 
    for (var state in china) { 
        ... 
        (function (st, state) { 
            .... 
            switch (china[state]['name']) { 
                case "江苏": 
                    xx += 5; 
                    yy -= 10; 
                    break; 
                case "河北": 
                    xx -= 10; 
                    yy += 20; 
                    break; 
                case "天津": 
                    xx += 10; 
                    yy += 10; 
                    break; 
                case "上海": 
                    xx += 10; 
                    break; 
                case "广东": 
                    yy -= 10; 
                    break; 
                case "澳门": 
                    yy += 10; 
                    break; 
                case "香港": 
                    xx += 20; 
                    yy += 5; 
                    break; 
                case "甘肃": 
                    xx -= 40; 
                    yy -= 30; 
                    break; 
                case "陕西": 
                    xx += 5; 
                    yy += 10; 
                    break; 
                case "内蒙古": 
                    xx -= 15; 
                    yy += 65; 
                    break; 
                default: 
            } 
            ... 
      })(china[state]['path'], state); 
   } 
}
Javascript 相关文章推荐
用jQuery技术实现Tab页界面之二
Sep 21 Javascript
Javascript之旅 对象的原型链之由来
Aug 25 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
Oct 26 Javascript
javascript多物体运动实现方法分析
Jan 08 Javascript
webpack常用配置项配置文件介绍
Nov 07 Javascript
Node.js进阶之核心模块https入门
May 23 Javascript
JS实现判断图片是否加载完成的方法分析
Jul 31 Javascript
ES6模板字符串和标签模板的应用实例分析
Jun 25 Javascript
vue单文件组件无法获取$refs的问题
Jun 24 Javascript
JS简易计算器实例讲解
Jun 30 Javascript
基于js实现的图片拖拽排序源码实例
Nov 04 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
Dec 19 Vue.js
js post提交调用方法
Feb 12 #Javascript
JQuery中操作Css样式的方法
Feb 12 #Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
Feb 12 #Javascript
js判断设备是否为PC并调整图片大小
Feb 12 #Javascript
Jquery Uploadify上传带进度条的简单实例
Feb 12 #Javascript
js弹出div并显示遮罩层
Feb 12 #Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
Feb 12 #Javascript
You might like
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
通过修改referer下载文件的方法
2008/05/11 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
OpenCV实现人脸识别
2017/04/07 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
存储过程和sql语句的优缺点
2014/07/02 面试题
财务部出纳岗位职责
2013/12/22 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
师范生自荐信模板
2014/05/28 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
详解Python牛顿插值法
2021/05/11 Python