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 相关文章推荐
推荐20家国外的脚本下载网站
Apr 28 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
IE的事件传递-event.cancelBubble示例介绍
Jan 12 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
Sep 10 Javascript
简单介绍JavaScript的变量和数据类型
Jun 03 Javascript
深入学习jQuery Validate表单验证
Jan 18 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
Nov 10 jQuery
基于node.js实现微信支付退款功能
Dec 19 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
Sep 07 Javascript
layer弹出子iframe层父子页面传值的实现方法
Nov 22 Javascript
js对象属性名驼峰式转下划线的实例代码
Sep 17 Javascript
vue实现同时设置多个倒计时
May 20 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设置允许大文件上传示例代码
2014/03/10 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
php图片上传类 附调用方法
2016/05/15 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
python win32 简单操作方法
2017/05/25 Python
Python使用django搭建web开发环境
2017/06/09 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
写给女朋友的道歉信
2014/01/12 职场文书
领导视察欢迎词
2014/01/15 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
现场施工员岗位职责
2015/04/11 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers