APP下载

Python脚本在shape文件中的运用

2019-01-23杨勤信杨德宏

软件 2018年12期
关键词:人民邮电出版社德宏等值

杨勤信,杨德宏



Python脚本在shape文件中的运用

杨勤信,杨德宏

(昆明理工大学,云南 昆明 650093)

对于shap文件,包含很多的地理信息,但是在实际工作学习中,并非所有信息都能被利用。利用python脚本语言,可以单独获取所需要的特定shapefile文件属性信息,点位坐标信息,并且转换为必要投影系统下的坐标。本文借助python脚本处理shapefile文件,利用某地区人口密度分布图,生成等值区域图,实现python与shapefile的实践结合,为更多地理空间信息开发提供参考。

Shapefile文件;python脚本;等值区域图;函数库

0 引言

目前使用最普遍的地理空间格式是Esri的Shapefile文件,1998年该文件格式被正式标准化,作为一种开放规范发布。Esri特意为ArcView开发这种文件格式。是一种低端GIS产品,但是可以实现其高端产品ArcInfo的一些基本操作。Shapefile由多个文件格式,少则3种,多则可达15种不同文件。例如:.shp、.shx和.dbf等有效文件。在一些Esri的软件中,这些数据作为一个整体,Shapefile文件对于GIS数据交换和GIS分析而言是一种基础数据格式[1-3]。

Python自诞生以来,人们使用较少。自从人工智能的兴起,使得python迅速挤进计算机语言前五,并且排名仍在以较大幅度上升。仅次于Java、c++、 c等几种热门语言。Python最大的特点就是免费开源跨平台,易上手且功能强大。其附带的核心语言包及众多模块代码,使得开发更加容易。对于Shapefile文件,主要使用python的PyShp库(也可以使用OGR库的python绑定,但此处为了尽量使用python代码的风格,选择安装PyShp库)[4-5]。

1 Shapefile文件编辑

对于Shapefile文件的编辑和其他相关操作,只需要关注.shp和.dbf文件即可,二者是Shapefile文件的核心文件。.shp文件包含几何图形,.dbf文件包含几何图形所必要的属性信息。Shapefile文件中,每一个图形信息都含有对应的属性列表。这些属性信息是没有特定编号或者标记的,如果从shapefile文件修改相关信息时,需保证与其相关的文件也做了相应修改。

1.1 shapefile文件访问及属性提取

在访问shapefile文件时,利用PyShp库,导入PyShp库:import shapefile

Python的PyShp库利用方法Reader(”Filed name”)打开shapefile文件。Filed name可以不使用扩展名,因为处理的数据至少包括.shp和.dbf等文件,否则会导致打开文件失败。当成功创建一个读取器对象后,通过.bbox方法就可以获取文件边框信息,.shapeType获取文件类型(1代表点,3代表线,5代表多边形等),.numRecords获取记录总数。dbf文件是一种简单的数据库,类似于电子表格,可以通过读取器对象(.fields)的字段属性查看该信息。运行结果如图1。

图1 属性表

该shape文件在ArcGIS中图形如图2。

图2 Shape文件

由图2知,该shape文件是一个点shapefile文件,python脚本解析出共有298个点。

1.2 shapefile文件几何图形处理

点shapefile文件中,每一条记录都包含一个点,读取每一个点的经纬度(纬度在经度之前)。采用.shape(num).points可获取到选定点的坐标信息,这里提取第200个点的坐标信息如图3。

图3 点坐标信息

此处的坐标信息是经纬度,可以使用python的utm库中的.from_latlon()方法将其转换为utm投影下的坐标值,并获得utm水平方向的编号和竖直方向的字母编号,如图4。

图4 utm坐标信息

2 shapefile文件利用python绘制某地区人口相对密度分布等值区域图

用来显示密度的地图称为等值区域图,用阴影的深浅度来表达密度,使得阅读更为容易,可以作为分析某区域内点密度的直接参考。本文用某区域人口密度图来解析出密度等值区域图。

因为处理图像,所以首先要利用python自带图像处理库-PIL(Python Imaging Library),PIL为了保证速度,采用的是C语言编写,专门针对python做了一些优化,正式被python调用。本文程序均由python3版本编写,所以使用PIL库的升级版本Pillow库。Pillow其他方法使用此处不做赘述。本案例由shapefile文件根据每单位面积的人口得出密度比率,然后由该比率配置相应的颜色,密度越大则颜色越深,密度越小,颜色越浅。整体开发思路如图5。

图5 示意图

在处理shapefile文件之前,需要将地理空间坐标系转换到屏幕坐标[6-7],此处定义一个函数srn():

def srn(bbox, w, h, x, y):

mix, miy, xx, xy = bbox

xd = xx - mix

yd = xy - miy

xr = w/xd

yr = h/yd

px = int(w - ((xx - x) * xr))

py = int((xy - y) * yr)

return (px, py)

打开shapefile文件并且初始化一个图像对象,利用PIL库的Draw方法填充不同的多边形:

Ip = shapefile.Reader("F:Projects论文实例population")

ight =500

idth=500

img = Image.new("RGB", (idth, ight), (255, 255, 255))

draw = ImageDraw.Draw(img)

绘制区域阴影和多边形:

pi = None

ai = None

for i, f in enumerate(Ip.fields):

if f[0] == "POPULAT11":

pi = i-1

elif f[0] == "AREASQKM":

ai = i-1

for sr in Ip.shapeRecords():

density = sr.record[pi]/sr.record[ai]

weight = min(math.sqrt(density/80.0), 1.0) * 50

R = int(200 - weight)

G = int(215 - weight)

B = int(235 - weight)

pixels = []

for x, y in sr.shape.points:

(px, py) = srn(Ip.bbox, idth, ight, x, y)

pixels.append((px, py))

draw.polygon(pixels, outline=(255, 255, 255), fill=(R, G, B))

将绘制完成的等值区域图保存为.png文件:img.save("Exportpopulation.png")。下图分别是shape­file文件和.png文件在ArcGIS软件中的效果图。

通过对比,很明显发现,图7的读取更加容易,范围界限也更加明显,这对于分析人口密度分布十分有用。

3 结束语

Shapefile文件是测绘工作者工作中经常处理的文件类型,而python脚本语言也作为ArcGIS软件的脚本语言十分方便快捷[8-9]。随着人工智能和大数据时代的炙热化发展,python凭借其简单又强大的特性,必将在编程语言中举足轻重。应用python开发一些测绘软件和处理一些数据文件,为实际工作提供良好的工作平台。

图6 人口密度图shape文件

图7 人口密度等值区域图

[1] 田庆, 陈美阳, 田慧云. ArcGIS地理信息系统详解(10. 1版)[M]. 北京: 希望电子出版社, 2014.

[2] PaulA. Zandbergen. 面向hrcGIS的Python脚本编程[M]. 北京: 人民邮电出版社, 2014.

[3] 邵保华, 田学志. 谈Python在ARCGIS地理处理中的应用[J]. 林业勘查设计, 2012(2): 70-72

[4] Wesley J. Chun. Python核心编程[M]. 第2版. . 北京: 人民邮电出版社, 2008

[5] Magnus Lie Hetland. Python基础教程[M]. 第2版. 北京: 人民邮电出版社, 2010.

[6] 郭仁忠. 空间分析[M]. 北京: 高等教育出版社, 2001.

[7] 刘南, 刘仁义. 地理信息系统[M]. 北京: 高等教育出版社. 2002.

[8] Mark Pilgrim. Diive Into Python 3[M]. 2nd ed. Berkeley: Apress, 2009.

[9] Alex Martelli, Anna Ravenscorft, David Ascher. Python Cookbook [M]. 北京: 人民邮电出版社, 2010.

Application of Python Script in Shape File

YANG Qin-xin, YANG De-hong

(Kunming University of Science and Technology, 650093)

Shap files contain a lot of geographic information, but not all information can be used in practical work and learning. Using Python scripting language, we can obtain the required attribute information of the specific ShapeFile, point coordinate information, and transform it into the coordinates of the necessary projection system. In this paper, Python script is used to process ShapeFile, and the population density distribution map of a region is used to generate an equivalent area map. The practice of Python and ShapeFile is combined to provide reference for the development of more geospatial information.

Shapefile; Python script; Equivalent area graph; Function library

TP312

A

10.3969/j.issn.1003-6970.2018.12.036

杨勤信(1993-),男,大学本科,主要研究方向为大地测量;杨德宏(1965-),男,研究生,主要研究方向为测量数据处理与质量控制研究。

杨勤信,杨德宏. Python脚本在shape文件中的运用[J]. 软件,2018,39(12):159-161

猜你喜欢

人民邮电出版社德宏等值
德宏 生态摄影“朝圣地”
三元互动下的德宏民族语言舆情探究
异步电动机等值负载研究
大滇西旅游一线6 有一个美丽的地方 德宏
共饮一江水葫芦丝独奏
电网单点等值下等效谐波参数计算
赵厚麟 :赞《通信世界》,常盛不衰;贺《通信世界》,惠及全球!
基于戴维南等值模型的静稳极限在线监视
汉语国俗语义在维吾尔语中的等值再现
Neighbor self-optim izing process design based on X2 in TD-LTE system