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中检测变量的类型的代码
Dec 28 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
Dec 01 Javascript
A标签触发onclick事件而不跳转的多种解决方法
Jun 27 Javascript
javascript将相对路径转绝对路径示例
Mar 14 Javascript
node.js中的fs.utimes方法使用说明
Dec 15 Javascript
jQuery图片加载显示loading效果
Nov 04 Javascript
windows下vue.js开发环境搭建教程
Mar 20 Javascript
vue-cli 如何打包上线的方法示例
May 08 Javascript
在vue中解决提示警告 for循环报错的方法
Sep 28 Javascript
layer.open的自适应及居中及子页面标题的修改方法
Sep 05 Javascript
vue prop属性传值与传引用示例
Nov 13 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 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 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
python的多重继承的理解
2017/08/06 Python
Python中类的初始化特殊方法
2017/12/01 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
opencv+python实现均值滤波
2020/02/19 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
房地产开发项目建议书
2014/05/16 职场文书
锦旗标语大全
2014/06/23 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
Python Socket编程详解
2021/04/25 Python
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers