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 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
Mar 21 Javascript
chrome下img加载对height()的影响示例探讨
May 26 Javascript
JavaScript支持的最大递归调用次数分析
Jun 24 Javascript
学习javascript面向对象 理解javascript原型和原型链
Jan 04 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
Feb 18 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
Jun 06 Javascript
Angularjs CURD 详解及实例代码
Sep 14 Javascript
浅析jQuery操作select控件的取值和设值
Dec 07 Javascript
js实现的在线调色板功能完整实例
Dec 21 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
Feb 27 Javascript
Vue2 使用 Echarts 创建图表实例代码
May 18 Javascript
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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
在php7中MongoDB实现模糊查询的方法详解
2017/05/03 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
jquery实现拖动效果
2016/08/10 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
python读取文本中的坐标方法
2018/10/14 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
如何一键升级Python所有包
2020/11/05 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
矫正人员思想汇报
2014/01/08 职场文书
情侣吵架检讨书
2014/02/05 职场文书
追悼会主持词
2014/03/20 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
九年级语文教学反思
2016/03/03 职场文书