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 相关文章推荐
javascript 火狐(firefox)不显示本地图片问题解决
Jul 05 Javascript
jquery cookie实现的简单换肤功能适合小网站
Aug 25 Javascript
使用jquery实现IE下按backspace相当于返回操作
Mar 18 Javascript
JavaScript函数获取事件源的小例子
May 14 Javascript
jQuery中bind()方法用法实例
Jan 19 Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 Javascript
JavaScript中字面量与函数的基本使用知识
Oct 20 Javascript
前端 Vue.js 和 MVVM 详细介绍
Dec 29 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 Javascript
Vue SPA 初次进入加载动画实现代码
Nov 14 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 jQuery
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 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
js单词形式的运算符
2014/05/06 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
2017/07/22 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
pygame实现简易飞机大战
2018/09/11 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
民间个人借款协议书
2014/09/30 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
领导干部作风建设总结
2014/10/23 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
监理中标通知书
2015/04/16 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
教师节表彰会主持词
2015/07/06 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
Python中的套接字编程是什么?
2021/06/21 Python
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android