中国地图简单画法怎么画简单

区域地图绘制方法汇总
区域地图绘制方法汇总
前言 & &地理分布应该是可视化的重要方法,这一期我将从地理坐标的获取,运用maptools、ggplot包等常用R包绘制地区地图,颜色及标签的添加这几个方面简单总结下区域地图的绘制方法。一、地理坐标的获取 & &绘制地图,其实就是对每个区域都是用一个多边形来表示,通过提供了每个区域其多边形逐点的坐标,然后R软件通过依次连接这些坐标,就绘制出了一个多边形区域。因此,要想绘制出想要的地图,首先必须获取相应的地理坐标。一般可以从以下几个途径获取:国际权威地理网站下载通过网络抓取维基百科等其他网站得到地理坐标运用打包好的集成数据包1.1 &国际权威地理网址下载 & &GADM &http://gadm.org/&是世界行政区域(或行政区域界线)位置的空间数据库,可以用于地理信息系统和类似软件。这个数据库也提供了R语言数据格式。可以找到Download 选择中国,然后选择R数据格式,会有水平0-4从国家、省、市到县级地图坐标集下载。注意数据的读取有特定的语句readRDS:library(maptools)library(ggplot2)library(sp)# 读取地理信息数据china &- &readRDS('CHN_adm1.rds')class(china)## [1] 'SpatialPolygonsDataFrame'
## attr(,'package')
## [1] 'sp'plot(china)plot(china[1:10,]) & &需要学习的是读取的数据集是SpatialPolygonsDataFrame类型,属于sp包,并且是S4类型的data.frame。这部分的学习可以参考张丹老师的R的极客理想系列文章:R语言天气可视化应用。通过china@data,可以看到中国31个省的信息(为什么没有台湾,坑爹啊)。通过plot语句就可以画出中国的轮廓了。当然也可以画出前10个省的轮廓。1.2 通过网络抓取地理坐标 & &在网络上有相当多的绘制地图的方法,当然也有大侠们总结的地理坐标啦。比如说这是谢老大博客里的各城市的地理坐标:dat = read.csv(text = '城市,jd,wd
& &北 京,116..9
& &上 海,121..
& &天 津,117..15
& &重 庆,106..
& &哈尔滨,126..75
& &长 春,125..
& &沈 阳,123.4,41.
& &呼和浩特,111.8,40.
& &石家庄,114..
& &太 原,112..
& &济 南,117,36.
& &郑 州,113.7,34.8
& &西 安,108.9,34.
& &兰 州,103..05
& &银 川,106..
& &西 宁,101.75,36.
& &乌鲁木齐,87.6,43.8
& &合 肥,117.3,31.85
& &南 京,118..
& &杭 州,120.15,30.
& &长 沙,113,28.
& &南 昌,115..
& &武 汉,114.35,30.
& &成 都,104..65
& &贵 阳,106.7,26.
& &福 州,119.3,26.
& &台 北,121..05
& &广 州,113.25,23.
& &海 口,110..
& &南 宁,108..8
& &昆 明,102.
& &拉 萨,91..
& &香 港,114..3
& &澳门,113.5,22.2') & &当然,必须还得介绍个更全的,通过XML包抓取网络数据:
& &通过抓取HTML中table数据,我们得到全国各省市、区县的数据。这里我取了天津地区的地理坐标子集。library(XML)u &- 'http://blog.csdn.net/svrsimon/article/details/8255051'tables &- readHTMLTable(u,stringsAsFactors = FALSE)raw &- tables[[1]]zh_posi &- raw[-1, ]colnames(zh_posi) = c('province', 'city', 'county', 'lon', 'lat')zh_posi[, 4:5] = apply(zh_posi[, 4:5], 2, as.numeric)save(zh_posi, file = 'zh_posi.rda')tianjinlabel &- subset(zh_posi,province =='天津市')1.3 运用打包好的集成数据包 & &从学习中发现,大多分析从&http://cos.name/wp-content/uploads/2009/07/chinaprovinceborderdata_tar_gz.zip&下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf、bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下,并在R中设好相应的工作空间,然后安装maptools包,运行如下程序:library(maptools);china_map=readShapePoly('bou2_4p.shp');plot(china_map) & &运用plot语句,同样得到中国地理,这次有了我们的宝岛台湾了。这个数据包的数据类型同样是SpatialPolygonsDataFrame类型,里面包含了大量的地理信息,感兴趣的可以深入学习下它。二、绘制区域地图的方法2.1 运用maps包,mapdata包绘图 & &maps包包应该是比较古老的绘图包,可以直接绘制出世界地图和美国各州郡的详细地图数据,绘制中国地图就得用到mapdata包,当然这个包也比较老了(据说有四川没有重庆)。
& &这是谢老大'用R画中国地图并标注城市位置'的代码,我直接贴上啦!通过上文的dat城市坐标数据,可以在地图上添加城市位置的标注,pos是放置标注上下左右的位置,可以通过maptools包中的pointLabel()改良,这个后面会说到。library(maps)library(mapdata)map('china', col = 'darkgray', ylim = c(18, 54), panel.first = grid())points(dat$jd, dat$wd, pch = 19, col = rgb(0, 0, 0, 0.5))text(dat$jd, dat$wd, dat[, 1], cex = 0.9, col = rgb(0, 0, 0, 0.7), pos = c(2, 4, 4, 4, 3, 4, 2, 3, 4, 2, 4, 2, 2, 4, 3, 2, 1, 3, 1, 1, 2, 3, 2, 2, 1, 2, 4, 3, 1, 2, 2, 4, 4, 2))2.2 运用maptools包绘图 & &在上节地理坐标的获取中,我们运用的plot语句绘制的地图,就是运用maptools包绘制的。maptools包绘制地图可以参考统计之都的“用R软件绘制中国分省市地图”这篇非常优秀的博文来学习,里面包括颜色的填充及编写的函数,非常收益。在这里照猫画虎,绘制一个天津市区域地图试试。
& &首先通过readRDS语句获取中国各区县行政区域地理坐标,通过subset获取天津地区的坐标集,绘制出天津“海马”的轮廓,通过getColor2编制的函数给'宝坻区', '北辰区', '大港区' ,'蓟县'添加上颜色,并通过网络抓取的区县坐标给“海马”加上标签,运用pointLabel()函数可以自动调整标签位置,解决文本标签的重叠问题。CHN3 &- &readRDS('CHN_adm3.rds')tianjin &- subset(CHN3,CHN3@data$NAME_2=='Tianjin')plot(tianjin)getColor2=function(mapdata,name,col,othercol){
& &f=function(x,y) ifelse(x %in% y,which(y==x),0); & &colIndex=sapply(mapdata@data$NL_NAME_3,f,name); & & & &fg=c(othercol,col)[colIndex 1]; & & & &return(fg); & &}name=c('宝坻区', '北辰区', '大港区' ,'蓟县' );col=c('red','green','yellow','purple');plot(tianjin,col=getColor2(tianjin,name,col,'white'),xlab='',ylab='');points(tianjinlabel$lon, tianjinlabel$lat, pch = 19, col = rgb(0, 0, 0, 0.5));pointLabel(tianjinlabel$lon, tianjinlabel$lat, tianjinlabel$county, cex = 0.6, col = rgb(0,0, 0, 0.7))2.3 运用ggplot绘图 & &ggplot2作为R的图形系统,其最鲜明的特点在于其分层语法,即把图像元素一层层叠加在基础画布之上。事实上,一张主题地图就相当把地图作为画布,而把基于地理的信息表现在地图上。如果作为基础画布的地图和ggplot2的分层语法结合起来,那么就能更高效绘制主题地图。这部分的学习可参考豆瓣网:数据铺子&/182577/room/2177990/&相关博文。
& &ggplot方法利用地图坐标,首先需要把SpatialPolygonsDataFrame类型数据转换为数据框,并要求有 x 或long, y 或 lat, 及 region 或 id。可通过help(geom_map)查看。
& &通过fortify函数转换为数据框,运用ggplot() geom_类型绘制地图。下面分别是运用geom_ploygon()绘制不同省份色彩图及geom_map()绘制全国降雨量的区域地图。x&-china_map@dataxs&-data.frame(x,id=seq(0:924)-1)china_map1&-fortify(china_map)library(plyr)china_mapdata&-join(china_map1, xs, type = 'full') #合并两个数据框ggplot(china_mapdata, aes(x = long, y = lat, group = group,fill=NAME)) geom_polygon( ) geom_path(colour = 'grey40') scale_fill_manual(values=colours(),guide=FALSE)library(sp)CHN1 &- &readRDS('CHN_adm1.rds')china.map &- fortify(CHN1)ater &- c(1085,325,1473,3524,1079,2935,3989,2790,4147,358,2046,434,1652,2490,451,3362,1467,871,2145,182,1000,12278,448,377,182,1221,3135,152,4976,10000,5298)vals &- data.frame(id =unique(china.map$id),val=water)# 用ggplot命令绘图ggplot(vals, aes(map_id = id))
& &geom_map(aes(fill = val), map =china.map)
& &expand_limits(x = china.map$long, y = china.map$lat)
& &scale_fill_continuous(low = 'red2',high ='yellowgreen', guide = 'colorbar')
ylab('')参考资料:豆瓣网:数据铺子可视化系列文章/182577/room/2177990/统计之都:用R软件绘制中国分省市地图http://cos.name/2009/07/drawing-china-map-using-r/谢益辉的博客:用R画中国地图并标注城市位置,避免文本标签重叠:maptools中的pointLabel()http://yihui.name/cn/2008/10/china-map-and-city-locations-with-r/用ggplot2包来绘制地图&http://www./lang/chinese/1010统计之都:粉丝地图的可视化http://cos.name/2013/06/weibo-fans-map-visualization/统计之都:苏建冲,R时代,你要怎样画地图?http://cos.name/2013/01/drawing-map-in-r-era/Global Administrative Areas&http://gadm.org/country沈阳斌子博客,Android开发地图,中国各省市地区域经纬度表http://blog.csdn.net/sy_bz/article/details/8255051张丹老师的R的极客理想系列文章:R语言天气可视化应用http://blog.fens.me/r-app-china-weather/ggplot包、maptools包等说明文档要想获取分析代码,可查看原文,进入本人的GitHub查看下载,或通过本人邮箱与本人联系
发表评论:
TA的最新馆藏从零开始,用你最熟悉的工具,六步画出一目了然的数据地图
怎么在 Excel 上做数据地图?
钱粮胡同,经济学博士, 欧洲某行Portfolio Management
我在专栏()里写了一篇文章: 放在这里分享给大家。
这个方法的好处是:1)不累,快;2)不需要任何插件;3)弹性强,可以利用同样的方法,很快做出各种各样的热感地图。
我个人比较喜欢从零 DIY 热感地图,学会了整套流程和方法,以后遇到任何类似问题都好解决。正好有很多知友在我的一些回答中问过我,我的那些热感地图怎么做出来的(我的那些回答请参考这个答案末尾的各种热感图图例)。借这个机会,我毅然决定,专写一篇文章来说说我的数据地图是怎么画的。
很简单,按照我的方法,六步你就可以画出自己的热感地图,不需要 GIS 软件,各种地图都适用。
前提:你要有 Excel 这个软件啊(否则搞毛),还要能上网啊(能看到这回答说明正在上网吧?)
第一步:需要一张普通的地图图片
这个很简单,网上到处都有。中国的省级地图,地级市地图,甚至县级地图都可以找到。这里两个小要求:1)尽量找张干净的图,干净指的是地图的边界清晰;2)svg 格式的图(Scalable Vector Graphics)- 别慌,推荐你个下载 svg 格式地图模板的好去处:
在这个网站搜索China provinces,可以得到下面这些图(上百张),第一张图就很符合我们的要求:
第二步:打开下载的 svg 图。这里推荐个免费开源的软件:。用这个软件打开 svg 的地图,然后另存为 Enhanced Meta File(emf)格式的文件。
第三步:用 excel 导入 emf 的文件,然后 ungroup 这个地图变成 freeform 的图形,如下图。
这样我们就得到了 excel 里面的地图素材。
第四步:每个省现在对应的名字都没有,我们需要重新命名。简单的方法:鼠标点击选一个省,在左上角公式旁边的文本框里输入省的名字,如下图:
第五步:在 excel 里另建一个 worksheet,按照下图来设计数据版面:
渐变颜色可以自己选择,目前这个例子是从 0 到 5 六种类别(颜色),根据你的研究需要(比如各省人均收入水平你按照高低分了 10 类,那就 10 种),随便改多少种都可以,唯一注意的就是命名的区域要跟着变。再啰嗦一下:根据你自己的分类标准,筛选你的数据,将筛选后的分类结果(比如 6 种 0-5)对应到之前提到的类别中,这样也就对应好了颜色。
第六步:这些都做完了,在地图那页 worksheet 里面加个按钮,把下面这段 VBA 程序 copy 进去:
For i = 2 To 32 '这里是省的数量,2 代表的是后面连接的数据表起始位是第二行,可以根据你自己的设计更改
Range("actRegProvince").Value = Range("Data_Province!D" & i).Value '按顺序选取数据表中省份
ActiveSheet.Shapes(Range("actRegProvince").Value).Select '激活对应的省份地图
Selection.ShapeRange.Fill.ForeColor.RGB = Range(Range("actRegCodeProvince")).Interior.Color '将数据表中省份对应的颜色类别赋值给对应的省份地图
补充说明:Data_Province!D 中 Data_Province 是数据表(worksheet)的名字,D 指的是省份名字所在的列(见上面那张截图)。根据自己的需要可以改成你喜欢的名字或位置。
第七步:这步不算了啊!就是六步~
点击按钮,享受成果,不谢!
把刚才的地图换成紫色渐变色,效果如下:
我过去的研究里用过的一些样图(ps: 数据原因,有些图未包含台湾):
地级市级别方言地图,请参考:
地级市层面经济集群图,请参考:
神经网络算法分类中国地级市,请参考:
同样方法制作县级地图
如果制作过程中遇到问题,请留言。
客官,这篇文章有意思吗?raphael.js绘制中国地图 地图绘制方法
字体:[ ] 类型:转载 时间:
在本文中给大家分享如何使用raphael.js来完成地图交互,raphael.js是一个很小的javascript库,它可以在网页中实现绘制各种矢量图、各类图表、以及图像裁剪、旋转、运动动画等等功能,需要的朋友可以参考下
最近的数据统计项目中要用到中国地图,也就是在地图上动态的显示某个时间段某个省份地区的统计数据,我们不需要flash,仅仅依靠raphael.js以及SVG图像就可以完成地图的交互操作。在本文中,我给大家分享如何使用js来完成地图交互。
先简单介绍下raphael.js,raphael.js是一个很小的javascript库,它可以在网页中实现绘制各种矢量图、各类图表、以及图像裁剪、旋转、运动动画等等功能。此外raphael.js还跨浏览器兼容,而且还兼容老掉牙的IE6啊。raphael.js的官网地址: /
我们需要准备一张矢量地图,可以从网上找一张矢量地图,或者使用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,供后面调用。
首先在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; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "河北": &&&&&&&&&&&&&&&&&&& xx -= 10; &&&&&&&&&&&&&&&&&&& yy += 20; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "天津": &&&&&&&&&&&&&&&&&&& xx += 10; &&&&&&&&&&&&&&&&&&& yy += 10; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "上海": &&&&&&&&&&&&&&&&&&& xx += 10; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "广东": &&&&&&&&&&&&&&&&&&& yy -= 10; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "澳门": &&&&&&&&&&&&&&&&&&& yy += 10; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "香港": &&&&&&&&&&&&&&&&&&& xx += 20; &&&&&&&&&&&&&&&&&&& yy += 5; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "甘肃": &&&&&&&&&&&&&&&&&&& xx -= 40; &&&&&&&&&&&&&&&&&&& yy -= 30; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "陕西": &&&&&&&&&&&&&&&&&&& xx += 5; &&&&&&&&&&&&&&&&&&& yy += 10; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& case "内蒙古": &&&&&&&&&&&&&&&&&&& xx -= 15; &&&&&&&&&&&&&&&&&&& yy += 65; &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& default: &&&&&&&&&&& } &&&&&&&&&&& ... &&&&& })(china[state]['path'], state); && } }
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
中国地图轮廓的画法
下载积分:3800
内容提示:中国地图轮廓的画法,中国轮廓图画法,中国地图画法,中国地图简图画法,中国地图的画法,中国地图简易画法,中国地图轮廓,中国各省地图轮廓,中国地图空白轮廓图,中国地图轮廓简笔画
文档格式:PDF|
浏览次数:27|
上传日期: 11:05:15|
文档星级:
该用户还上传了这些文档
中国地图轮廓的画法
官方公共微信当前位置:&&&高清组图:记者揭秘地图如何绘制而成
高清组图:记者揭秘地图如何绘制而成
/weixingditu/8991060.html
日 10:19:07
摘要:陕西省测绘地理信息行业职业技能竞赛,选手认真查看调绘图上的信息。西部网讯(记者 敬泽昊 贺桐) “我们日常的工作,就是把飞机航拍的图,一点一点矫正成日常使用的地图,这是一个非常复杂的过程。”竞赛裁判陕西省第五工程测绘院副院长郭秋燕告诉记者。长达8个小时的制图比赛7月28日,第三届陕西省测绘地理信息行业职业技能竞赛暨全国竞赛陕西选拔赛在西安拉开帷幕。在4天的时间里,来自陕西测绘地理信息行业的22家单位的49支代...
陕西省测绘地理信息行业职业技能竞赛,选手认真查看调绘图上的信息。&&&&西部网讯(记者 敬泽昊 贺桐) “我们日常的工作,就是把飞机航拍的图,一点一点矫正成日常使用的地图,这是一个非常复杂的过程。”竞赛裁判陕西省第五工程测绘院副院长郭秋燕告诉记者。&&&&长达8个小时的制图比赛&&&&7月28日,第三届陕西省测绘地理信息行业职业技能竞赛暨全国竞赛陕西选拔赛在西安拉开帷幕。在4天的时间里,来自陕西测绘地理信息行业的22家单位的49支代表队,共计98名选手将分别参加地图制图与工程测量两个项目的比拼。&&&&在地图制图比赛现场,参赛的42名选手,紧张的操作着电脑,并时不时要对照一下旁边那张1平方公里,比例尺为1:2000的调绘图。比赛规定参赛选手要在8小时内完成制图工作,并建立一个地理信息数据库。据郭秋燕介绍,能按这个速度完成,在日常工作中已经相当不错了。&&&&照片多道工序后变为地图&&&&所谓调绘图,是指经过初步矫正的影像地图。在此次竞赛中担任地图制图组组长的省测绘产品质检站站长赵龙说,飞机在高空拍摄,会受到各种因素的影响,稍稍一点的偏差,反映到航拍片上就是极大的误差。所以要通过一点一点的比对,将一张张拍摄的照片“无缝拼接”起来,然后再简单标注出照片中各个要素的地理信息,形成初步的调绘图。&&&&比如楼房的层高,道路的名称,建筑的属性,等高线坐标尺……这些信息都需要详细的记录下来,为了节省时间,在比赛中这一环节已经被省去了。但即使这样,调绘图仍然更像是一张照片,对于一般人而言依旧不能当做地图使用。&&&&参赛选手们首先要把调绘图上直接显示的,以及“隐藏”在背后的各种地理信息数据,收录进数据库。然后再根据所绘地图的需要,选取不同的信息,逐一转化成地图语言。如果是水文图,河流水系的信息就要详细一些;如果是交通图,路网的信息就要突出一些……这些工作比拼的是慢工出细活了。虽然计算机,以及各种制图软件的普及,已经极大的提高了地图制图效率,但保证准确无误,还得靠人力。}

我要回帖

更多关于 画中国地图的技巧 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信