仿微信小程序,使用R画地图数据

图片 1map.gif

用PRADO画地图数据

首先,从这里下载中华夏族民共和国地形图的GIS数据,那是叁个压缩包,完全解压后含有八个文本(bou2_4p.dbf、bou2_4p.shp和bou2_4p.shx),将那四个公文解压到同多少个目录下。

图片 2

用Enclave绘制地图相比较不难。比方画一下全国限制的区域,能够用如下代码:

library(maptools)
mydat = readShapePoly("china-province-border-data.tar/china/bou2_4p.shp") #地图包位置,根据自己的角标位置设置
plot(mydat)

转换的图如下:

图片 3

只是,能够见到那样绘制的地形图的形态有些扁平。那是因为,在绘图的历程中,暗中认可把经度和纬度作为平时数据,均匀平等对待,绘制在笛Carl坐标系上产生的。其实,地球的球面图形怎么着映射到平面图上,在地经济学上是有一名目许多不一样的正规算法的。地图不应当画在平时的笛Carl坐标系上,而是要画在地军事学专门的学业的坐标系上。

也足以安装mapsmapdata那多少个包,然后输入上面的指令:

install.packages(mapdata)
install.packages("mapdata")
library(maps)
library(mapdata)
map("china")

扭转的图如下:

图片 4

其中map()函数还足以增进相当多参数,大概如下:

map(database = "world", regions = ".", exact = FALSE, boundary = TRUE,
  interior = TRUE, projection = "", parameters = NULL, orientation = NULL,
  fill = FALSE, col = 1, plot = TRUE, add = FALSE, namesonly = FALSE,
  xlim = NULL, ylim = NULL, wrap = FALSE, resolution = if (plot) 1 else 0,
  type = "l", bg = par("bg"), mar = c(4.1, 4.1, par("mar")[3], 0.1),
  myborder = 0.01, ...)

能够安装数据库、地区、正确度、边界等,在这里处就不一一详述,具体的用法能够?map。

樱花红陌上,水柳绿池边。又到了樱花开放的季节,简友们有未有出来赏花呀,哈哈。

给地图上色

在其实使用的进度中,我们一再会依靠自身的内需对地图中的有个别省份着以特定的颜料,那时就足以因而调节和测量试验plot命令中的fg参数来予以完结。

第一拜访昂科拉绘制地图的法规:

在绘制地图时,每二个省市自治区也许岛屿都以用叁个多头形来代表的。从前的GIS数据,其实正是提供了每三个行政区其大端形逐点的坐标,然后Rubicon软件通过逐条连接那一个坐标,就绘制出了三个多边形区域。在上边的数目中,一共包括了9二十三个多边形的消息,之所以有与此相类似多是因为部分省份有好多小的专门项目小岛。在此9二十四个多边形中,每一个都对应二个独一的ID,编号分别从1到925。

plot命令中的fg参数在本例中应当是四个尺寸为925的向量,其第i个轻重的取值就意味着了地图中第i个多边形的颜料。二个大约的品味是运作上面那几个命令看看效果:

plot(x,col=gray(924:0/924));

变化的图如下所示:

图片 5

于是自然就产生了三个主题素材:怎么着赢得某四个特定地区的ID,进而设置我们想要的水彩?事实上,在变量x中,就早就积存了大家想要的新闻。在Escort中输入“x[[2]]”或“x$att.data”,会赢得五个925行7列的数据框,那实际上是bou2_4p.dbf以此文件中积存的音信,在此之前的read.shape()函数即便读取的是bou2_4p.shp文件,但在暗中认可意况下会把dbf文件的音信也置于变量之中。对于那个数据框,其行名正是每二个区域的ID编号,第一列和第二列分别是面积和周长,最终一列是该区域所属的行政区名,另外的列应该也是局地号码性质的变量。于是,通过搜寻相应的行政区对应的行名,就足以对fg参数进行赋值了。上边是本身编的一个函数,用来变化所需的col向量:

getColor=function(mapdata,provname,provcol,othercol)
{
     f=function(x,y) ifelse(x %in% y,which(y==x),0);
     colIndex=sapply(mapdata@data$NAME,f,provname);
     col=c(othercol,provcol)[colIndex+1];
     return(col);
 }

其中mapdata是寄放地图数据的变量,在上头的例证中正是x,provname是亟需退换颜色的地带的称谓,provcol是对应于provname的象征颜色的向量(名称和数字均可),othercol是任什么地方方的颜料。举个例子如下:

provname=c("北京市","天津市","上海市","重庆市");
 provcol=c("red","green","yellow","purple");
 plot(x,col=getColor(x,provname,provcol,"white"));

更动的图数据如下:

图片 6

图片 7🌸

生成年人口数据布满图

利用类似的法门就能够依附自个儿的必要对两样的区域举行着色,下边再举一例。从国家总结局收获二〇〇六年国内外省段的人头数量,然后依照人数的有个别对各地份举办着色。程序如下:

provname=c("北京市","天津市","河北省","山西省","内蒙古自治区",
        "辽宁省","吉林省","黑龙江省","上海市","江苏省",
        "浙江省","安徽省","福建省","江西省","山东省",
        "河南省","湖北省","湖南省","广东省",
        "广西壮族自治区","海南省","重庆市","四川省","贵州省",
        "云南省","西藏自治区","陕西省","甘肃省","青海省",
        "宁夏回族自治区","新疆维吾尔自治区","台湾省",
        "香港特别行政区");
pop=c(1633,1115,6943,3393,2405,4298,2730,3824,1858,7625,
        5060,6118,3581,4368,9367,9360,5699,6355,9449,
        4768,845,2816,8127,3762,4514,284,3748,2617,
        552,610,2095,2296,693);
provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=0);
plot(x,col=getColor(x,provname,provcol,"white"),xlab="",ylab="");

变动的图如下:

图片 8

里头颜色越深的地点代表人口数更加多,反之为人口数越少。

年前仿做的三个有意思简单的德姆o,明日共享出去,一同交流学习。

画部分省级地区级图

在绘制地图的历程中,还会有二个比较可行的参数是recs,它是三个由多方形ID组成的向量,表示在地图中只画出这几个ID所代表的区域。利用这几个参数,就能够画出某一有个其余地图,举例下边包车型大巴例子是本国中部六省的地图:

getID=function(mapdata,provname)
{
    index=mapdata$att.data$NAME %in% provname;
    ids=rownames(mapdata$att.data[index,]);
    return(as.numeric(ids));
}
midchina=c("河南省","山西省","湖北省","安徽省","湖南省","江西省");
plot(x, col = getColor(x, midchina, rep("green", 6),
    "white"), border = "white", xlab = "", ylab = "")

变迁的图:

图片 9

项目根本由两部分组成:

用R画中华夏族民共和国地图并标记城市地点

画出的图上照旧能够用points()函数和text()函数加上点和文字,而maptools包中还提供了一个pointLabel()函数,用来消除文本标签的重叠难点。

par(mar=rep(0,4))
dat = read.csv(text = "城市,jd,wd
    北 京,116.4666667,39.9
    上 海,121.4833333,31.23333333
    天 津,117.1833333,39.15
    重 庆,106.5333333,29.53333333
    哈尔滨,126.6833333,45.75
    长 春,125.3166667,43.86666667
    沈 阳,123.4,41.83333333
    呼和浩特,111.8,40.81666667
    石家庄,114.4666667,38.03333333
    太 原,112.5666667,37.86666667
    济 南,117,36.63333333
    郑 州,113.7,34.8
    西 安,108.9,34.26666667
    兰 州,103.8166667,36.05
    银 川,106.2666667,38.33333333
    西 宁,101.75,36.63333333
    乌鲁木齐,87.6,43.8
    合 肥,117.3,31.85
    南 京,118.8333333,32.03333333
    杭 州,120.15,30.23333333
    长 沙,113,28.18333333
    南 昌,115.8666667,28.68333333
    武 汉,114.35,30.61666667
    成 都,104.0833333,30.65
    贵 阳,106.7,26.58333333
    福 州,119.3,26.08333333
    台 北,121.5166667,25.05
    广 州,113.25,23.13333333
    海 口,110.3333333,20.03333333
    南 宁,108.3333333,22.8
    昆 明,102.6833333,25
    拉 萨,91.16666667,29.66666667
    香 港,114.1666667,22.3
    澳门,113.5,22.2")
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))
axis(1, lwd = 0); axis(2, lwd = 0); axis(3, lwd = 0); axis(4, lwd = 0)

变迁的图:

图片 10

  • 二级联合浮动:尤为重要用作体现省份地区和选用数据;
  • 地图展现:要害绘制顾客选中的地带在地形图上的着色。

ggplot2绘制地图

以华夏地图为例,下载最新的ArcGIS矢量地图数据,这种地图数据包涵了点不清新闻,那是画地图的基本功数据。下载地址:

用以下代码举行地图绘制:

library(maptools)
library(ggplot2)
library(plyr)
#读取地图文件
china_map<-readShapePoly("C:/Users/feng/Desktop/chinaprovinceborderdata_tar_gz/china-province-border-data.tar/Lambert/省级行政区.shp")
#提取用于绘图的地图数据
x<-china_map@data
xs<-data.frame(x,id.1=seq(0:33)-1)
#将地图数据转换为数据框
china_map1<-fortify(china_map)
#添加一个id.1字段,用于和上面的xs(各省市数据)糅合,合并
china_map1$id.1<-china_map1$id
#去掉china_map1中的id字段,避免在糅合数据的时候,出现两个相同字段id和id.1,保证只用id.1来糅合
china_map2<-china_map1[,-7]
#糅合地图数据
china_mapdata<-join(china_map2, 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)

改造的图:

图片 11

本文重要介绍绘制地图方法,另外的能够看代码喽~

总结

使用福睿斯的地形图扩大包能够画出各个样式的地图,具体的变现形象及组成格局还有待进一步开采。

从Free SVGMaps官方网站获取SVG地图,这一个地图是能够透过第三库SVGKit直接显示的。

把地点生成的svg地图拖入PaintCode工具,调节对应的付出语言,就可以在代码区域调换对应的UIBezierPath路径。

发表评论

电子邮件地址不会被公开。 必填项已用*标注