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 相关文章推荐
ext for eclipse插件安装方法
Apr 27 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
Dec 12 Javascript
js和jquery中循环的退出和继续下一个循环
Sep 03 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
May 09 Javascript
jQuery根据表单name获取值的方法
May 24 Javascript
JS动态给对象添加属性和值的实现方法
Oct 21 Javascript
JS常用知识点整理
Jan 21 Javascript
node.js平台下的mysql数据库配置及连接
Mar 31 Javascript
3种vue组件的书写形式
Nov 29 Javascript
vue加载自定义的js文件方法
Mar 13 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
Apr 11 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 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 已经成熟
2006/12/04 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
详解Nodejs之npm&amp;package.json
2017/06/15 NodeJs
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
Python字符串中查找子串小技巧
2015/04/10 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
python reduce 函数使用详解
2017/12/05 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
django使用多个数据库的方法实例
2021/03/04 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
临床医学系毕业生推荐信
2013/11/09 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
优良学风班申请材料
2014/02/13 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
刑事和解协议书范本
2014/11/19 职场文书
劳模先进事迹材料
2014/12/24 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python