Posts Tagged ‘carto’

用ArcGIS计算测地线

你一定见过Facebook那张著名的友邻图:

图中两个地点之间的连线不是直线,而是测地线(Geodesic),或者说大圆路径、航线等等。其实就是球体上两点之间最短路径投影后的表示。用测地线做图需要有比较多的数据,这样可以表现的比较“繁忙”。而且地理上必须是大范围的,不然看上去还是直线,就缺少了曲线的美感。

在ArcGIS中,也有计算测地线的工具,XY To Line

它需要一张包含起始点地理坐标的表,就能输出两点之间的测地线了。使用起来很简单,当然真要自己算应该比较麻烦的。

下面举个不恰当的例子:美驻华使领馆与省会城市之间的距离关系

美国在华有7个使领馆:北京、沈阳、上海、武汉、成都、广州和香港,不考虑香港。

大陆有31个省会城市,能享受“休假式治疗”的起码得是地方大员,处级干部就不考虑了,当然也不包括港澳台。

数据来自国家基础地理信息中心。

使邻馆是点数据,省会城市也是点数据,那么只需计算点和点之间的距离关系就可以了。

具体步骤见代码:

简要说明下,首先为点数据添加坐标属性,之后计算两两之间的距离,然后为距离表连接起始点的坐标属性,最后根据距离表计算测地线。

结果如下(点击可看大图):

仅供参考。

全球哺乳动物分布图

上个礼拜,和帮隔壁学院某研究蝙蝠的博士做了个图——根据全球哺乳动物的活动范围(多边形),在1×1经纬网上,获取每个网格上活动(栖息?)的哺乳动物种类数目。

原始数据是这样的:

我处理(Dissolve)了下,有5398种哺乳动物,和维基上说的差不多。我关注的是活动范围,其中,活动范围最小的是Melomys rubicola(一种老鼠?)范围小到几乎可以忽略不计啊,在(143,-9)附近;最大的是Orcinus orca(虎鲸),基本上有水的地方都是它的地盘,这就叫四海为家吧。

先生成经纬网(ArcPy):

然后按Intersect进行SpatialJoin(本来想还是用ArcPy直接遍历每个几何进行overlaps、contains和within比较,无奈数据太大,要先进行几何的envelope比较,这个不涉及空间操作,但是写起来多稍微麻烦了点呢,而且为什么SearchCursor获取的几何不能保存在list中?不解)。

之后统计网格数目,再将统计表Join到网格数据中,完事。

SpatialJoin那步效率太差,反正我晚上回去开始跑,第二天早上来看是跑完的。后来看了下,最后有190多万个多边形。。。想想也是,光光经纬网格就有360×180了,平均下来每个网格上才3种哺乳动物吧。

最后的图:

没受过专业的制图训练,见谅了,虽然我们专业前面是有Cartography这种说法的,但现在还有人(老师)知道有制图这回事吗?

Scene里面拉伸下:

最后,上上个礼拜在3sNews上分享了下Geospatial Revolution的视频,还不算是无人问津。我觉得这种制图,就是EP4中介绍的地理空间技术在科研方面的应用之一。学GIS的可能觉得很简单,但对别的邻域是一种很强有力的工具,甚至是新颖的。

最最后,胡适先生曾说,多研究些问题,少谈些“主义”。在现在这种“云”里“雾”里的浮躁年代,多解决些问题,多拓展些行业,少吹点牛皮,少扯点概念,或许更好。

制作三维阶梯图的方法及模型

上周汤在课上讲了三维阶梯图的制作方法,非常受启发。虽然我以前看到过类似的图,但是一直不清楚是怎么制作的。汤的思路是这样的:阶梯图一般用来表示地形,所以处理的是栅格数据。先将栅格数据转成矢量点,即每个栅格用一个点来表示。但是要注意栅格大小,栅格太多要先重采样,否则生成的矢量点太多,效果会不好。然后通过矢量点来创建Voronoi图,因为是矢量点是规则排列的,所以创建好的Voronoi多边形其实都是相同的正方形。之后,将多边形与点的值关联起来。最后,在三维场景中,使用设置图层的“Extrusion”属性,把多边形“挤”出来。

陕西某地的地形表示

这个方法在实验课的PPT上有说,虽然我没去上实验课,但是我看了PPT后,觉得还是有些地方可以改进的:

  1. 多边形与点关联的那一步,PPT中使用的是“Attribute Join”。即先对点进行统计,再为多边形添加字段,然后通过“ID”进性关联,最后将点的统计值赋给多边形的新字段。在这里,属性关联不是最好的方法。因为每个点是包含于多边形内的,有很明显的位置关系,使用“Spatial Join”可以更方便的进性关联。
  2. 处理创建后Voronoi图范围时,PPT中是将创建Voronoi图中的环境变量“Extent”值,设为输入栅格的范围。由于“Extent”是一个矩形范围,如果处处理的栅格中,有值的部分是矩形,那这样可以满足要求。而如果处理的是非矩形的,例如一个省的边界,那这就不能满足要求了。这个问题解决起来也不麻烦,只需对多边形使用“Clip”操作就行。其中,“Clip Features”参数由输入栅格通过“Raster To Polygon”获得,这样就能很好地除掉无效区域。

我觉得这种方法比较有用,可以用来处理许多数据,所以我按我说的方法做了一个模型。流程图如下,应该比较清晰明了:

这个模型还有很多能改进的地方。比如,并不是每个数据都需要重采样的,所以“Resample Cell Size”应该是一个可选参数。我去试着做过,要将这个参数改为可选,相关的改动要很多,要制作选择结构的脚本以及使用“Merge Branch”工具等。另外,还应添加一个重采样方法的参数,而这个参数也应是可选参数,这就比较麻烦了。当然,还有一些没发现的不足。

另外,ModelBuilder这东西做简单顺序结构的模型还挺方便的,但如果模型稍微复杂点,多一些选择、循环结构,用它实现起来就比较困难了。对于复杂的模型,我觉得还是直接用ArcPy写为好,方便自如多了。那么既然ArcPy可以更快速的解决所有问题,那还有必要掌握ModelBuilder吗?这个问题我也没答案。不过,对于ModelBuilder的高级建模技术,我现在掌握的也不多,如果都会了,或许这些问题就简单了,慢慢学吧。

最后,如果你有兴趣,可以下载这个工具试试,ArcGIS9.3及以前版本的请无视:(

地址:http://goo.gl/XIfzd