利用Python自动化生成地质解释图件
Automatic drawing of geological interpretation map by Python
责任编辑: 王萌
收稿日期: 2020-05-27 修回日期: 2020-08-2 网络出版日期: 2021-02-20
基金资助: |
|
Received: 2020-05-27 Revised: 2020-08-2 Online: 2021-02-20
作者简介 About authors
张伟(1982-),男,高级工程师,2007年毕业于东华理工大学,主要从事物探方法与解释研究工作。Email:
专题地图是展示物探研究成果最为直观的表现形式之一,而一张成果图的定稿需经多次的修改完善。根据地质解释图的制图特点和要求,以电磁法中的断面解释图为例,利用Python语言中丰富的第三方库,设计编写了自动化制图程序。文中对不整合线(波浪线)的绘制、微短线删除、多边形化、颜色填充等主要环节进行较为详尽的阐述,并提供了关键代码。
关键词:
The thematic map is one of the most intuitionistic forms for presenting the research results in geophysical exploration. Nevertheless, a final result map needs to be revised and improved many times. According to the characteristics and requirements of geological interpretation map and with a section map of interpretation by electromagnetic method as an example, the authors designed and compiled an automatic drawing program by using Python language and its rich third-party libraries. In this paper, main links, such as drawing unconformity line (wave line), deleting micro-short line, polygonization and color filling are described in detail. Meanwhile, the key code are provided.
Keywords:
本文引用格式
张伟, 邱崇涛, 谢明宏, 赵丛.
ZHANG Wei, QIU Chong-Tao, XIE Ming-Hong, ZHAO Cong.
0 引言
在地质、物探工作中,自始至终都会应用不同形式的专题地图来直观地表现其研究成果[1]。为获取最佳的地质效果,技术人员需不断地对地质情况深入研究,反复斟酌,经多次易稿后才能获取最终满意的成果,而伴随其中的专题图件也在不断的修改中完善。
在物探工作中,地质推断解释图是反映物探成果的必备专题图件之一。总体而言,地质推断解释图中的图元要素并非十分复杂;但由于修改次数较多,又受到专业制图软件功能的限制,工作效率难以满足快节奏项目需求。以目前国内应用范围最广的国产软件MapGIS为例,虽有强大编辑功能,但凭手工绘图方式,其效率依然难有明显提升。如电法勘探中的反演电阻率断面的地质推断解释图,不整合线是一种常见的地质现象,图中使用波浪线表示,而在MapGIS软件中波浪线则由一个特殊线型呈现,实际坐标位置处于曲线的中轴线上;若直接成区,线与区间的分界面无法满足制图要求,仍需徒手绘制或借助于第三方软件生成,操作繁琐且费时费力。笔者针对该类项目制图特点和需求,利用Python语言及其强大的第三方库,设计了自动制图程序,主要功能包括波浪线(不整合界线)、自动剪断线、微短线识别与删除以及多边形化成区等功能,目的是提高工作效率,减少制图过程中不必要的错误发生。
1 Python语言简介
2 程序设计及实现
2.1 总体思路
一般情况下,当物探工程师在绘制好地质解释图后,交付给制图人员进行线编辑、颜色填充、图面整饰等工作。利用MapGIS的制图流程大体包括自动裁剪线、线转弧段、拓扑重建、修改地层(岩体)颜色、手工去除微短线等。笔者基于Python语言及其Shapely、NumPy、Scipy和Pandas等扩展库,参照上述MapGIS绘制流程,同时也补充了不整合线(波浪线)的绘制,达到了自动制图工作的目的。程序实现的基本流程见图1。
图1
2.2 程序的实现
2.2.1 不整合界线的绘制
图2
1) 曲线插值
曲线插值的目的是光滑曲线,使图面更为美观,同时又要避免曲线过度变形。在Scipy库中,scipy.interpolate.splprep是适合于多维曲线的B样条插值法,经多次试验,s(光滑系数)取0,k(曲线拟合度)取2较为合适。Python实现代码如下:
from scipy.interpolate import splprep, splev
tck, u = splprep([xr, yr], s=0, k=2)
u = np.arange(0, 1., 0.0002)
#获取XY坐标值
xySet = splev(u, tck)
2) 等路径提取节点坐标
在Matlab中提供了沿路径插值法(interpolate along the path),而Scipy并未提供类似的函数。在Shapely库中interpolate函数功能是沿线性几何体获得指定距离的坐标值,通过等距离迭代计算可获得类似效果。
#获得线的长度
myLine = LineString(xy0)
lineLen = myLine.length
# sizeUnit为单个正弦曲线的波长
segNum = int(lineLen/sizeUnit)+2
dataSet3=[]
for i in range(segNum):
#获取等路径的坐标值,存入数组中
ip = myLine.interpolate(i*sizeUnit, normalized=False)
dataSet3.append(list(ip.coords)[0])
3) 绘制波浪线
为了防止正弦(余弦)曲线变形,将预先生成的正弦曲线或余弦曲线,通过旋转、平移操作移至曲线的相应位置,旋转平移的代码如下:
#空间几何体的旋转、平移函数
def rotateMoving(xunit, ang, yunit, x0, y0):
x1 = xunit * np.cos(ang) + yunit * np.sin(ang) + x0
y1 = yunit * np.cos(ang) - xunit * np.sin(ang) + y0
return x1, y1
为尽量减少曲线误差,正弦曲线或余弦曲线的范围各为0~π/2,交替绘制。此时,需要考虑节点的矢量方向,确保正弦(余弦)曲线衔接连续。代码如下:
if i % 2 == 0: #偶数点
if x3[i] < x3[i + 1]:
#当后一点坐标值X大于前一点时,
xx1, yy1 = rotateMoving(xunit, ang, yunit0, x3[i], y3[i])
else:
xx1, yy1 = rotateMoving(xunit, ang, -1*yunit0, x3[i+1], y3[i+1])
#翻转数组
xx1 = np.flipud(xx1)
yy1 = np.flipud(yy1)
else:#奇数点
(余弦曲线与正弦曲线平移类似,略)
#存储节点位置
allXPoints.append(xx1a)
allYPoints.append(yy1a)
4) 节点抽稀
此时波浪线的节点十分致密,将会加大计算机运行负荷,尤其是长剖面,线节点过多会导致MapGIS无法正常运行。线节点的抽稀方法采用道格拉斯—普克算法(douglas-peucker algorithm),在Shapely中提供了此功能(simplify函数)。经试验对比,抽稀系数为0.01较为适合。代码如下:
xySet = linTem.simplify(0.01, preserve_topology=False)
2.2.2 自动剪断线与微短线识别
从数学上,一个多边形(ploygon)由同一平面上闭合曲线构成,填充后可形成区。因此,绘制图件时,为形成一个闭合多边形,构成多边形轮廓的曲线必须有“搭接”。此环节可使用shapely.opt库中的split函数,通过迭代计算,进行不同几何体间相互分割,实现要求:① 被分割几何体为单个线几何体(linestring);② 分割几何体为被分割体外的其他所有线几何体的集合(multilinestring),确保分割几何体必须一次性完成剪断任务。关键代码如下:
#导入shapely库
from shapely.ops import polygonize, split
#遍历所有曲线数组
for i in range (len(lineSets)):
#生成第i条线(被裁剪)
oneLine = LineString(lineSets [i])
#从线数组中删除第i条线
others = list(np.delete(lineSets, i))
#生成除第i条线外的线集合
otherLines = MultiLineString(others)
#裁剪线
resultCollect = split(oneLine, otherLines)
#获取线集合中线的数量
lineNum = len(resultCollect.geoms)
获得的线裁剪结果(result collect)为多线集合,此集合内几何体排列顺序与原始线坐标位置一致,从而为判定或删除(地层)线两端外延部分奠定了条件。结合断面图特点,主要判定方法包括:① 判定特殊线型,如红色的断裂线和闭合曲线(地质体、图框),此类线几何体将不进行任何删除处理;断裂线根据线属性(颜色)判定,闭合曲线可根据首尾点的坐标值确定。② 根据多线集合中几何体的数量(lineNum≥3)判定线几何体否已被裁剪,来决定是否删除第一个和最后一个几何体(线)。最后以MapGIS明码格式保存线参数(节点坐标值、颜色、宽度、线型等)。
2.2.3 折线成区和颜色填充
此过程相当于MapGIS中的线转弧段和拓扑成区。但MapGIS是随机填充颜色,而本程序是根据地层、岩体的注释点进行颜色填充。
1) 折线转多边形
此处的折线转多边形相当于MapGIS中的“线转弧段”,Shapely提供了polygonize函数,代码如下:
#折线的多边形化,outLinSets为折线数组
polygonSet = polygonize(outLinSets)
# 提取多边形的坐标值
pgSet = list(polygonSet)
2) 读取点文件
使用Pandas读取wat文件更为方便,主要获取注释点(X,Y)坐标值、字体颜色和标注。当然,也可以限制一些与颜色填充无关的注释点(非强制),如断裂编号,为后续地层符号识别去除一些干扰因素。
#使用pandas读取wat文件
df = pd.read_table(watFile, skiprows=2, sep=',', \
header=None, usecols=[0, 1, 4, 13], encoding='gbk')
df.columns = ['x', 'y', 'text', 'clr']
#去除红色断裂注释点(颜色为6)
df2 = df.loc[(df['clr'] != 6), ['x', 'y', 'text']]
3) 确定多边形内的注释点
通过对多边形和注释点双迭代运算,利用Shapely中within函数,判定某个几何体(注释点)是否存在另一个几何体(多边形)之内。若为“True”,则保存在一个数组中,使注释点与多边形相互对应,从而确定经多边形化(polygonize)后的区填充颜色值。主要代码如下:
#迭代多边形数组pgSet
for plg in pgSet:
pgInfoA = [ ]
#迭代注释点数组
for i, pnt in enumerate(noteXY):
#判定注释点是否在多边形内
isIn = Point(pnt).within(plg)
if isIn == True:
#保存在一个临时数组中
pgInfoA.append (noteText[i])
#与多边形对应的注释点数组
plgInfoSet.append (″.join(pgInfoA))
……
4) 生成区文件
表1 地层编码和颜色对应
Table 1
Stratum | geoCode | colorHex | colorGIS |
---|---|---|---|
第四系 | Q | #ffffdf | 127 |
上侏罗统满克头鄂博组 | J3mk | #8fffff | 320 |
下二叠统大石寨组 | P1d | #efcfc7 | 248 |
下二叠统大石寨组二段 | P1d2 | #ffaf87 | 159 |
下二叠统大石寨组一段 | P1d1 | #ffbfa3 | 158 |
角闪斜长花岗岩 | γ | #ff7f7f | 554 |
花岗斑岩 | γπ | #ff6666 | 556 |
空(白) | NaN | #ffffff | 264 |
3 实例
图3
图4为经程序处理后的绘制效果图,图面较为美观,基本上符合最终图件的要求。表示不整合地层界线的绿色折线变为顺滑的波浪线,严格地随波浪线位置填充颜色。除断裂线外,地层(岩体)界线的外“搭接”部分均已删除,此时,只要利用MapGIS程序的手工删除断裂线多余部分即可。
图4
图4
Python程序自动化生成的地质解释断面
Fig.4
Section of geologic interpretation by automatic drawing (Python)
4 结论
Python语言在GIS方面同样具有极为丰富的类库。对于二维几何体的分析与操作,Shapely库功能强大且全面,再以Numpy为基础使用Scipy解决相关的数学计算,以及Pandas的数据清洗功能,借助这些类库可轻松地处理空间数据,并能缩短项目开发周期。相比常规方法,该绘图程序主要有如下优点:
1) 自动生成波浪线(不整合界线),可以直接进行多边形(区)填充;
2) 通过线型和线形状的判定,自动删除微短线,减少了绘图工作环节;
3) 通过注释点位置与多边形的判定,识别区填充颜色。
总之,该程序脱离了商业软件平台,具有更好的扩展性,依照项目制图特点及规范要求,可高效、准确地绘制出物探专题图件,从而提高工作效率,使地质物探技术人员将更多的精力投入到资料的分析与地质解释之中,从而得到更为丰富可靠的地质成果。
参考文献
SciPy reference guide ( Release 1.4.1)
[EB/OL]. ,
针对剖面平面图的MapGIS应用与开发
[J]. ,常数据如何直接在MapGIS软件中绘制剖面平面图为例,重点讨论了剖面平面图在MapGIS软件中的再利用和绘制的方法,并开发了相应的补充辅助模块,说明了MapGIS软件在地球物理勘查中的应用与开发潜力。]]>
The application and development of MapGIS for profile map
[J].
/
〈 | 〉 |