这几天有师姐找到我让帮忙画上面的图。看着不是很难,关键在于画线,但搜索网上却没有相关制作方法。偶然在别人的问题上(http://zhihu.esrichina.com.cn/question/19205)看到了XY to lines 这个工具,顺带看到了径向流图的制作方法(见后文链接)。因而,便借鉴径向流图的画法完成了上图的制作。然后,我还发现用这种方法还可以制作很多类似的图,像什么领域图,城市间相互作用等等,只是相关指标需要提前运算,然后赋值给生成的每条曲线,接着进行分层设色符号化等操作。
这里主要记录一下核心步骤,以备忘。
这个图师姐只给了一个经济联系矩阵:
![](https://i-blog.csdnimg.cn/blog_migrate/8e2bb1b103ca51394426220124cf17f1.png)
所以,首先要准备底图数据。
然后利用点图层获取点的坐标数据,并导出,方法见:Arcgis中怎么获取点shape数据的坐标_百度经验 https://jingyan.baidu.com/article/d5c4b52bee0369da560dc509.html。
接着便是繁琐的利用坐标构建线段过程,构建线段主要用到的就是XY to lines 工具,其原理见:ArcGIS中制作流向图(Flow Map)_红黄蓝狗日的_新浪博客http://blog.sina.com.cn/s/blog_673c98be0101ggel.html
这一步里面最难的或者说最繁琐的,就是用excel制作线段的起始坐标的过程,长这样:
![](https://i-blog.csdnimg.cn/blog_migrate/08d5c40c776e4304308bbfa5958bec3f.png)
经过一顿操作之后,制成类似这样的:
然后用XY to lines 转成线段就行,注意转的时候要把最后一列的权重选进去,以便后期分层设色。
总的来说,这不是一个很便捷的方法,很多人制作这个图都是用代码实现的,后面附上的就是从大神同学那问来的方法,感兴趣的可以自己研究一下。代码里是根据斑块的几何中心(也可能是质心)来创建邻域曲线的,用的时候注意一下就好。此外,制作交通流量啥的很牛的transCAD,好像也能制作这个图,时间原因,有兴趣的可以继续研究。
最后,贴个很漂亮的径向流图。
参考:
ArcMap中如何制作径向流图 - CSDN博客 http://blog.csdn.net/arcgis_all/article/details/8216246
ArcGIS制作放射状流向地图(Radial Flow Map) - gisangela - 博客园 http://www.cnblogs.com/gisangela/p/3429276.html
地图慧-在线制作地图,数据地图,专题地图,用地图说话 http://c.dituhui.com/apps/flow
ArcGIS放射状流向地图 - 我也是个傻瓜 - 博客园 https://www.cnblogs.com/liweis/p/4297859.html
Creating radial flow maps with ArcGIS | ArcGIS Blog https://blogs.esri.com/esri/arcgis/2011/09/06/creating-radial-flow-maps-with-arcgis/
附上R生成邻域线段代码,结果需要在ArcGIS中打开:
#### 读取 shp 文件
library(rgdal)
CSJSHP <- readOGR("./d", "data") # shp
CSJSHP <- CSJSHP[order(as.numeric(CSJSHP$IDs)),] # 需要ID序列标识图斑
CSJSHP$IDs <- factor(CSJSHP$IDs)
IDs <- CSJSHP$IDs
coords <- coordinates(CSJSHP) #
#### 创建基于距离倒数的空间权重
library(spdep)
CSJ_nb <- dnearneigh(coords, d1 = 0, d2 = 150000, row.names = IDs)
dsts <- nbdists(CSJ_nb, coords)
idw <- lapply(dsts, function(x){1/(x/1000)})
spw <- nb2listw(CSJ_nb, glist = idw, style = "B")
spwmat <- listw2mat(spw)
outspw <- data.frame(spwmat)
write.csv(outspw, "outspw.csv")
write.sn2gwt(listw2sn(spw), "outspw2.GWT", useInd = TRUE)
####创建邻域曲线
CSJ_nb_lines <- listw2lines(spw,coords)
CSJ_nb_lines$j_ID <- NULL
CSJ_nb_lines$i_ID <- NULL
writeOGR(CSJ_nb_lines,".","CSJ_nb_lines4",driver="ESRI Shapefile")