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 相关文章推荐
Gird事件机制初级读本
Mar 10 Javascript
基于jquery的3d效果实现代码
Mar 23 Javascript
document.documentElement和document.body区别介绍
Sep 16 Javascript
javascript获得网页窗口实际大小的示例代码
Sep 21 Javascript
javascript验证只能输入数字和一个小数点示例
Oct 21 Javascript
javascript同步服务器时间和同步倒计时小技巧
Sep 24 Javascript
很酷的星级评分系统原生JS实现
Aug 25 Javascript
Vue代码分割懒加载的实现方法
Nov 23 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
webpack公共组件引用路径简化小技巧
Jun 15 Javascript
Vue点击切换Class变化,实现Active当前样式操作
Jul 17 Javascript
基于Vue+Webpack拆分路由文件实现管理
Nov 16 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
UserData用法总结 lanyu出品
2010/07/01 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
很酷的星级评分系统原生JS实现
2016/08/25 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
Python isinstance判断对象类型
2008/09/06 Python
Python类的专用方法实例分析
2015/01/09 Python
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
Python3网络爬虫中的requests高级用法详解
2019/06/18 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
计算机专业大学生的自我评价
2013/11/14 职场文书
贷款委托书
2014/08/01 职场文书
同学会邀请函模板
2015/01/30 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
Java中的Kotlin 内部类原理
2022/06/16 Java/Android